From 3359d8cb88cd60af01c0e3677ec4c9b5e22bf420 Mon Sep 17 00:00:00 2001 From: DarkPhoenix Date: Fri, 14 Jun 2019 18:26:21 +0300 Subject: [PATCH] More code to control panel --- gui/graphFrame/frame.py | 78 +++-------------------------------------- gui/graphFrame/panel.py | 77 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 82 insertions(+), 73 deletions(-) diff --git a/gui/graphFrame/frame.py b/gui/graphFrame/frame.py index 621a8e55f..5040d17d4 100644 --- a/gui/graphFrame/frame.py +++ b/gui/graphFrame/frame.py @@ -31,6 +31,7 @@ import gui.mainFrame from gui.bitmap_loader import BitmapLoader from gui.builtinGraphs.base import Graph from service.fit import Fit +from .events import REFRESH_GRAPH from .panel import GraphControlPanel @@ -108,17 +109,11 @@ class GraphFrame(wx.Frame): self.ctrlPanel = GraphControlPanel(self, self) mainSizer.Add(self.ctrlPanel, 0, wx.EXPAND | wx.ALL, 0) - - - self.drawTimer = wx.Timer(self) - self.Bind(wx.EVT_TIMER, self.draw, self.drawTimer) - for view in Graph.views: view = view() self.graphSelection.Append(view.name, view) self.graphSelection.SetSelection(0) - self.fields = {} self.updateGraphWidgets() self.sl1 = wx.StaticLine(self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.LI_HORIZONTAL) mainSizer.Add(self.sl1, 0, wx.EXPAND) @@ -126,6 +121,7 @@ class GraphFrame(wx.Frame): self.ctrlPanel.fitList.fitList.Bind(wx.EVT_LEFT_DCLICK, self.OnLeftDClick) self.ctrlPanel.fitList.fitList.Bind(wx.EVT_CONTEXT_MENU, self.OnContextMenu) + self.Bind(REFRESH_GRAPH, self.OnRefreshGraph) self.ctrlPanel.showY0Cb.Bind(wx.EVT_CHECKBOX, self.OnNonDestructiveControlsUpdate) self.mainFrame.Bind(GE.FIT_CHANGED, self.OnFitChanged) self.mainFrame.Bind(GE.FIT_REMOVED, self.OnFitRemoved) @@ -211,7 +207,7 @@ class GraphFrame(wx.Frame): def getValues(self): values = {} - for fieldHandle, field in self.fields.items(): + for fieldHandle, field in self.ctrlPanel.fields.items(): values[fieldHandle] = field.GetValue() return values @@ -220,71 +216,14 @@ class GraphFrame(wx.Frame): event.Skip() self.draw() - def OnYTypeUpdate(self, event): - event.Skip() - obj = event.GetEventObject() - formatName = obj.GetLabel() - self.ctrlPanel.selectedY = self.ctrlPanel.selectedYRbMap[formatName] + def OnRefreshGraph(self, event): self.draw() def updateGraphWidgets(self): view = self.getView() - view.clearCache() - self.ctrlPanel.graphSubselSizer.Clear() - self.ctrlPanel.inputsSizer.Clear() - for child in self.ctrlPanel.Children: - if child not in (self.ctrlPanel.showY0Cb, self.ctrlPanel.fitList, self.ctrlPanel.targetList): - child.Destroy() - self.fields.clear() - - # Setup view options - self.ctrlPanel.selectedYRbMap.clear() - if len(view.yDefs) > 1: - i = 0 - for yAlias, yDef in view.yDefs.items(): - if i == 0: - rdo = wx.RadioButton(self.ctrlPanel, wx.ID_ANY, yDef.switchLabel, style=wx.RB_GROUP) - else: - rdo = wx.RadioButton(self.ctrlPanel, wx.ID_ANY, yDef.switchLabel) - rdo.Bind(wx.EVT_RADIOBUTTON, self.OnYTypeUpdate) - if i == (self.ctrlPanel.selectedY or 0): - rdo.SetValue(True) - self.ctrlPanel.graphSubselSizer.Add(rdo, 0, wx.ALL | wx.EXPAND, 0) - self.ctrlPanel.selectedYRbMap[yDef.switchLabel] = i - i += 1 - - # Setup inputs - for fieldHandle, fieldDef in (('x', view.xDef), *view.extraInputs.items()): - textBox = wx.TextCtrl(self.ctrlPanel, wx.ID_ANY, style=0) - self.fields[fieldHandle] = textBox - textBox.Bind(wx.EVT_TEXT, self.onFieldChanged) - self.ctrlPanel.inputsSizer.Add(textBox, 1, wx.EXPAND | wx.ALIGN_CENTER_VERTICAL | wx.ALL, 3) - if fieldDef.inputDefault is not None: - inputDefault = fieldDef.inputDefault - if not isinstance(inputDefault, str): - inputDefault = ('%f' % inputDefault).rstrip('0') - if inputDefault[-1:] == '.': - inputDefault += '0' - - textBox.ChangeValue(inputDefault) - - imgLabelSizer = wx.BoxSizer(wx.HORIZONTAL) - if fieldDef.inputIconID: - icon = BitmapLoader.getBitmap(fieldDef.inputIconID, 'icons') - if icon is not None: - static = wx.StaticBitmap(self.ctrlPanel) - static.SetBitmap(icon) - imgLabelSizer.Add(static, 0, wx.ALL | wx.ALIGN_CENTER_VERTICAL, 1) - - imgLabelSizer.Add(wx.StaticText(self.ctrlPanel, wx.ID_ANY, fieldDef.inputLabel), 0, - wx.LEFT | wx.RIGHT | wx.ALIGN_CENTER_VERTICAL, 3) - self.ctrlPanel.inputsSizer.Add(imgLabelSizer, 0, wx.ALIGN_CENTER_VERTICAL) - self.Layout() + self.ctrlPanel.updateControlsForView(view) self.draw() - def delayedDraw(self, event=None): - self.drawTimer.Stop() - self.drawTimer.Start(Fit.getInstance().serviceFittingOptions['marketSearchDelay'], True) def draw(self, event=None): global mpl_version @@ -292,8 +231,6 @@ class GraphFrame(wx.Frame): if event is not None: event.Skip() - self.drawTimer.Stop() - # todo: FIX THIS, see #1430. draw() is not being unbound properly when the window closes, this is an easy fix, # but not a proper solution if not self: @@ -382,11 +319,6 @@ class GraphFrame(wx.Frame): self.canvas.draw() self.Refresh() - def onFieldChanged(self, event): - view = self.getView() - view.clearCache() - self.delayedDraw() - def AppendFitToList(self, fitID): sFit = Fit.getInstance() fit = sFit.getFit(fitID) diff --git a/gui/graphFrame/panel.py b/gui/graphFrame/panel.py index 82d887cec..a37a380b7 100644 --- a/gui/graphFrame/panel.py +++ b/gui/graphFrame/panel.py @@ -21,7 +21,9 @@ # noinspection PyPackageRequirements import wx +from gui.bitmap_loader import BitmapLoader from service.fit import Fit +from .events import RefreshGraph from .lists import FitList, TargetList @@ -31,8 +33,11 @@ class GraphControlPanel(wx.Panel): super().__init__(parent) self.graphFrame = graphFrame + self.fields = {} self.selectedY = None self.selectedYRbMap = {} + self.drawTimer = wx.Timer(self) + self.Bind(wx.EVT_TIMER, self.redrawRequest, self.drawTimer) mainSizer = wx.BoxSizer(wx.VERTICAL) @@ -69,3 +74,75 @@ class GraphControlPanel(wx.Panel): def showY0(self): return self.showY0Cb.GetValue() + def updateControlsForView(self, view): + view.clearCache() + self.graphSubselSizer.Clear() + self.inputsSizer.Clear() + for child in self.Children: + if child not in (self.showY0Cb, self.fitList, self.targetList): + child.Destroy() + self.fields.clear() + + # Setup view options + self.selectedYRbMap.clear() + if len(view.yDefs) > 1: + i = 0 + for yAlias, yDef in view.yDefs.items(): + if i == 0: + rdo = wx.RadioButton(self, wx.ID_ANY, yDef.switchLabel, style=wx.RB_GROUP) + else: + rdo = wx.RadioButton(self, wx.ID_ANY, yDef.switchLabel) + rdo.Bind(wx.EVT_RADIOBUTTON, self.OnYTypeUpdate) + if i == (self.selectedY or 0): + rdo.SetValue(True) + self.graphSubselSizer.Add(rdo, 0, wx.ALL | wx.EXPAND, 0) + self.selectedYRbMap[yDef.switchLabel] = i + i += 1 + + # Setup inputs + for fieldHandle, fieldDef in (('x', view.xDef), *view.extraInputs.items()): + textBox = wx.TextCtrl(self, wx.ID_ANY, style=0) + self.fields[fieldHandle] = textBox + textBox.Bind(wx.EVT_TEXT, self.onFieldChanged) + self.inputsSizer.Add(textBox, 1, wx.EXPAND | wx.ALIGN_CENTER_VERTICAL | wx.ALL, 3) + if fieldDef.inputDefault is not None: + inputDefault = fieldDef.inputDefault + if not isinstance(inputDefault, str): + inputDefault = ('%f' % inputDefault).rstrip('0') + if inputDefault[-1:] == '.': + inputDefault += '0' + + textBox.ChangeValue(inputDefault) + + imgLabelSizer = wx.BoxSizer(wx.HORIZONTAL) + if fieldDef.inputIconID: + icon = BitmapLoader.getBitmap(fieldDef.inputIconID, 'icons') + if icon is not None: + static = wx.StaticBitmap(self) + static.SetBitmap(icon) + imgLabelSizer.Add(static, 0, wx.ALL | wx.ALIGN_CENTER_VERTICAL, 1) + + imgLabelSizer.Add(wx.StaticText(self, wx.ID_ANY, fieldDef.inputLabel), 0, + wx.LEFT | wx.RIGHT | wx.ALIGN_CENTER_VERTICAL, 3) + self.inputsSizer.Add(imgLabelSizer, 0, wx.ALIGN_CENTER_VERTICAL) + self.Layout() + + def OnYTypeUpdate(self, event): + event.Skip() + obj = event.GetEventObject() + formatName = obj.GetLabel() + self.selectedY = self.selectedYRbMap[formatName] + self.redrawRequest() + + def redrawRequest(self, event=None): + self.drawTimer.Stop() + wx.PostEvent(self.graphFrame, RefreshGraph()) + + def delayedDraw(self, event=None): + self.drawTimer.Stop() + self.drawTimer.Start(Fit.getInstance().serviceFittingOptions['marketSearchDelay'], True) + + def onFieldChanged(self, event): + view = self.graphFrame.getView() + view.clearCache() + self.delayedDraw()