From 7ec9d3f1224ff2e37716aff67381b92386f4bb87 Mon Sep 17 00:00:00 2001 From: DarkPhoenix Date: Thu, 1 Aug 2019 00:21:42 +0300 Subject: [PATCH] Make sure graphs properly react to target profile updates --- gui/builtinShipBrowser/events.py | 3 +- gui/builtinShipBrowser/fitItem.py | 3 +- gui/builtinViews/fittingView.py | 4 +-- gui/fitCommands/gui/fitRename.py | 6 ++-- gui/globalEvents.py | 2 ++ gui/graphFrame/frame.py | 44 ++++++++++++++++++++++--- gui/graphFrame/lists.py | 55 +++++++++++++++++-------------- gui/graphFrame/panel.py | 25 ++++++++++++-- gui/mainMenuBar.py | 3 +- gui/targetProfileEditor.py | 3 ++ 10 files changed, 104 insertions(+), 44 deletions(-) diff --git a/gui/builtinShipBrowser/events.py b/gui/builtinShipBrowser/events.py index 09506feee..a5cf1ecde 100644 --- a/gui/builtinShipBrowser/events.py +++ b/gui/builtinShipBrowser/events.py @@ -1,8 +1,7 @@ # noinspection PyPackageRequirements import wx.lib.newevent -FitRenamed, EVT_FIT_RENAMED = wx.lib.newevent.NewEvent() -FitSelected, EVT_FIT_SELECTED = wx.lib.newevent.NewEvent()\ +FitSelected, EVT_FIT_SELECTED = wx.lib.newevent.NewEvent() BoosterListUpdated, BOOSTER_LIST_UPDATED = wx.lib.newevent.NewEvent() diff --git a/gui/builtinShipBrowser/fitItem.py b/gui/builtinShipBrowser/fitItem.py index cc741c3c6..291d0bcac 100644 --- a/gui/builtinShipBrowser/fitItem.py +++ b/gui/builtinShipBrowser/fitItem.py @@ -15,7 +15,6 @@ import gui.utils.color as colorUtils import gui.utils.draw as drawUtils import gui.utils.fonts as fonts from gui.bitmap_loader import BitmapLoader -from gui.builtinShipBrowser.events import EVT_FIT_RENAMED from gui.builtinShipBrowser.pfBitmapFrame import PFBitmapFrame from service.fit import Fit from .events import BoosterListUpdated, FitSelected, ImportSelected, SearchSelected, Stage3Selected @@ -123,7 +122,7 @@ class FitItem(SFItem.SFBrowserItem): self.tcFitName.Bind(wx.EVT_KILL_FOCUS, self.editLostFocus) self.tcFitName.Bind(wx.EVT_KEY_DOWN, self.editCheckEsc) self.Bind(wx.EVT_MOUSE_CAPTURE_LOST, self.OnMouseCaptureLost) - self.mainFrame.Bind(EVT_FIT_RENAMED, self.OnFitRename) + self.mainFrame.Bind(GE.FIT_RENAMED, self.OnFitRename) self.animTimerId = wx.NewId() self.animTimer = wx.Timer(self, self.animTimerId) diff --git a/gui/builtinViews/fittingView.py b/gui/builtinViews/fittingView.py index efeb8211a..57434bd4b 100644 --- a/gui/builtinViews/fittingView.py +++ b/gui/builtinViews/fittingView.py @@ -34,7 +34,7 @@ from eos.saveddata.module import Module, Rack from eos.const import FittingSlot from gui.bitmap_loader import BitmapLoader from gui.builtinMarketBrowser.events import ITEM_SELECTED -from gui.builtinShipBrowser.events import EVT_FIT_RENAMED, EVT_FIT_SELECTED, FitSelected +from gui.builtinShipBrowser.events import EVT_FIT_SELECTED, FitSelected from gui.builtinViewColumns.state import State from gui.chrome_tabs import EVT_NOTEBOOK_PAGE_CHANGED from gui.contextMenu import ContextMenu @@ -147,7 +147,7 @@ class FittingView(d.Display): self.Show(False) self.parent = parent self.mainFrame.Bind(GE.FIT_CHANGED, self.fitChanged) - self.mainFrame.Bind(EVT_FIT_RENAMED, self.fitRenamed) + self.mainFrame.Bind(GE.FIT_RENAMED, self.fitRenamed) self.mainFrame.Bind(GE.FIT_REMOVED, self.fitRemoved) self.mainFrame.Bind(ITEM_SELECTED, self.appendItem) self.font = wx.SystemSettings.GetFont(wx.SYS_DEFAULT_GUI_FONT) diff --git a/gui/fitCommands/gui/fitRename.py b/gui/fitCommands/gui/fitRename.py index c3d0893f1..d1b3175e2 100644 --- a/gui/fitCommands/gui/fitRename.py +++ b/gui/fitCommands/gui/fitRename.py @@ -1,8 +1,8 @@ import wx import eos.db +import gui.globalEvents as GE import gui.mainFrame -from gui.builtinShipBrowser.events import FitRenamed from gui.fitCommands.calc.fitRename import CalcFitRenameCommand from gui.fitCommands.helpers import InternalCommandHistory @@ -19,11 +19,11 @@ class GuiRenameFitCommand(wx.Command): cmd = CalcFitRenameCommand(fitID=self.fitID, name=self.name) success = self.internalHistory.submit(cmd) eos.db.commit() - wx.PostEvent(gui.mainFrame.MainFrame.getInstance(), FitRenamed(fitID=self.fitID)) + wx.PostEvent(gui.mainFrame.MainFrame.getInstance(), GE.FitRenamed(fitID=self.fitID)) return success def Undo(self): success = self.internalHistory.undoAll() eos.db.commit() - wx.PostEvent(gui.mainFrame.MainFrame.getInstance(), FitRenamed(fitID=self.fitID)) + wx.PostEvent(gui.mainFrame.MainFrame.getInstance(), GE.FitRenamed(fitID=self.fitID)) return success diff --git a/gui/globalEvents.py b/gui/globalEvents.py index 97879a707..2bfef81a4 100644 --- a/gui/globalEvents.py +++ b/gui/globalEvents.py @@ -1,11 +1,13 @@ # noinspection PyPackageRequirements import wx.lib.newevent +FitRenamed, FIT_RENAMED = wx.lib.newevent.NewEvent() FitChanged, FIT_CHANGED = wx.lib.newevent.NewEvent() FitRemoved, FIT_REMOVED = wx.lib.newevent.NewEvent() CharListUpdated, CHAR_LIST_UPDATED = wx.lib.newevent.NewEvent() CharChanged, CHAR_CHANGED = wx.lib.newevent.NewEvent() GraphOptionChanged, GRAPH_OPTION_CHANGED = wx.lib.newevent.NewEvent() +TargetProfileRenamed, TARGET_PROFILE_RENAMED = wx.lib.newevent.NewEvent() TargetProfileChanged, TARGET_PROFILE_CHANGED = wx.lib.newevent.NewEvent() TargetProfileRemoved, TARGET_PROFILE_REMOVED = wx.lib.newevent.NewEvent() diff --git a/gui/graphFrame/frame.py b/gui/graphFrame/frame.py index 13fc04fdf..0d50c138f 100644 --- a/gui/graphFrame/frame.py +++ b/gui/graphFrame/frame.py @@ -33,7 +33,6 @@ from eos.saveddata.fit import Fit from eos.saveddata.targetProfile import TargetProfile from gui.bitmap_loader import BitmapLoader from gui.builtinGraphs.base import FitGraph -from gui.builtinShipBrowser.events import EVT_FIT_RENAMED from service.const import GraphCacheCleanupReason from service.settings import GraphSettings from .panel import GraphControlPanel @@ -124,9 +123,14 @@ class GraphFrame(wx.Frame): # Event bindings - local events self.Bind(wx.EVT_CLOSE, self.closeEvent) self.Bind(wx.EVT_CHAR_HOOK, self.kbEvent) + # Event bindings - external events + self.mainFrame.Bind(GE.FIT_RENAMED, self.OnFitRenamed) self.mainFrame.Bind(GE.FIT_CHANGED, self.OnFitChanged) - self.mainFrame.Bind(EVT_FIT_RENAMED, self.OnFitRenamed) + self.mainFrame.Bind(GE.FIT_REMOVED, self.OnFitRemoved) + self.mainFrame.Bind(GE.TARGET_PROFILE_RENAMED, self.OnProfileRenamed) + self.mainFrame.Bind(GE.TARGET_PROFILE_CHANGED, self.OnProfileChanged) + self.mainFrame.Bind(GE.TARGET_PROFILE_REMOVED, self.OnProfileRemoved) self.mainFrame.Bind(GE.GRAPH_OPTION_CHANGED, self.OnGraphOptionChanged) self.Layout() @@ -155,14 +159,41 @@ class GraphFrame(wx.Frame): return event.Skip() + # Fit events + def OnFitRenamed(self, event): + event.Skip() + self.ctrlPanel.OnFitRenamed(event) + self.draw() + def OnFitChanged(self, event): event.Skip() for fitID in event.fitIDs: self.clearCache(reason=GraphCacheCleanupReason.fitChanged, extraData=fitID) + self.ctrlPanel.OnFitChanged(event) self.draw() - def OnFitRenamed(self, event): + def OnFitRemoved(self, event): event.Skip() + self.clearCache(reason=GraphCacheCleanupReason.fitRemoved, extraData=event.fitID) + self.ctrlPanel.OnFitRemoved(event) + self.draw() + + # Target profile events + def OnProfileRenamed(self, event): + event.Skip() + self.ctrlPanel.OnProfileRenamed(event) + self.draw() + + def OnProfileChanged(self, event): + event.Skip() + self.clearCache(reason=GraphCacheCleanupReason.profileChanged, extraData=event.profileID) + self.ctrlPanel.OnProfileChanged(event) + self.draw() + + def OnProfileRemoved(self, event): + event.Skip() + self.clearCache(reason=GraphCacheCleanupReason.profileRemoved, extraData=event.profileID) + self.ctrlPanel.OnProfileRemoved(event) self.draw() def OnGraphOptionChanged(self, event): @@ -179,10 +210,13 @@ class GraphFrame(wx.Frame): event.Skip() def closeWindow(self): + self.mainFrame.Unbind(GE.FIT_RENAMED, handler=self.OnFitRenamed) self.mainFrame.Unbind(GE.FIT_CHANGED, handler=self.OnFitChanged) - self.mainFrame.Unbind(EVT_FIT_RENAMED, handler=self.OnFitRenamed) + self.mainFrame.Unbind(GE.FIT_REMOVED, handler=self.OnFitRemoved) + self.mainFrame.Unbind(GE.TARGET_PROFILE_RENAMED, handler=self.OnProfileRenamed) + self.mainFrame.Unbind(GE.TARGET_PROFILE_CHANGED, handler=self.OnProfileChanged) + self.mainFrame.Unbind(GE.TARGET_PROFILE_REMOVED, handler=self.OnProfileRemoved) self.mainFrame.Unbind(GE.GRAPH_OPTION_CHANGED, handler=self.OnGraphOptionChanged) - self.ctrlPanel.unbindExternalEvents() self.Destroy() def getView(self): diff --git a/gui/graphFrame/lists.py b/gui/graphFrame/lists.py index 8604907ee..3fc36f5b7 100644 --- a/gui/graphFrame/lists.py +++ b/gui/graphFrame/lists.py @@ -24,7 +24,6 @@ import wx import gui.display import gui.globalEvents as GE from eos.saveddata.targetProfile import TargetProfile -from gui.builtinShipBrowser.events import EVT_FIT_RENAMED from gui.contextMenu import ContextMenu from service.const import GraphCacheCleanupReason from service.fit import Fit @@ -49,10 +48,6 @@ class BaseList(gui.display.Display): self.Bind(wx.EVT_MOTION, self.OnMouseMove) self.Bind(wx.EVT_LEAVE_WINDOW, self.OnLeaveWindow) - self.graphFrame.mainFrame.Bind(GE.FIT_CHANGED, self.OnFitChanged) - self.graphFrame.mainFrame.Bind(EVT_FIT_RENAMED, self.OnFitRenamed) - self.graphFrame.mainFrame.Bind(GE.FIT_REMOVED, self.OnFitRemoved) - def refreshExtraColumns(self, extraColSpecs): baseColNames = set() for baseColName in self.DEFAULT_COLS: @@ -94,21 +89,6 @@ class BaseList(gui.display.Display): return self.removeListItems([item]) - def OnFitRenamed(self, event): - event.Skip() - self.updateView() - - def OnFitChanged(self, event): - event.Skip() - if set(event.fitIDs).union(f.ID for f in self.fits): - self.updateView() - - def OnFitRemoved(self, event): - event.Skip() - fit = next((f for f in self.fits if f.ID == event.fitID), None) - if fit is not None: - self.removeListItems([fit]) - def OnMouseMove(self, event): row, _, col = self.HitTestSubItem(event.Position) if row != self.hoveredRow or col != self.hoveredColumn: @@ -136,6 +116,21 @@ class BaseList(gui.display.Display): self.hoveredColumn = None event.Skip() + # Fit events + def OnFitRenamed(self, event): + if event.fitID in [f.ID for f in self.fits]: + self.updateView() + + def OnFitChanged(self, event): + if set(event.fitIDs).union(f.ID for f in self.fits): + self.updateView() + + def OnFitRemoved(self, event): + fit = next((f for f in self.fits if f.ID == event.fitID), None) + if fit is not None: + self.fits.remove(fit) + self.updateView() + @property def defaultTTText(self): raise NotImplementedError @@ -161,11 +156,6 @@ class BaseList(gui.display.Display): items.append(item) return items - def unbindExternalEvents(self): - self.graphFrame.mainFrame.Unbind(GE.FIT_CHANGED, handler=self.OnFitChanged) - self.graphFrame.mainFrame.Unbind(EVT_FIT_RENAMED, handler=self.OnFitRenamed) - self.graphFrame.mainFrame.Unbind(GE.FIT_REMOVED, handler=self.OnFitRemoved) - # Context menu handlers def addFit(self, fit): if fit is None: @@ -288,6 +278,21 @@ class TargetList(BaseList): self.graphFrame.clearCache(reason=GraphCacheCleanupReason.profileRemoved, extraData=profile.ID) self.graphFrame.draw() + # Target profile events + def OnProfileRenamed(self, event): + if event.profileID in [tp.ID for tp in self.profiles]: + self.updateView() + + def OnProfileChanged(self, event): + if event.profileID in [tp.ID for tp in self.profiles]: + self.updateView() + + def OnProfileRemoved(self, event): + profile = next((tp for tp in self.profiles if tp.ID == event.profileID), None) + if profile is not None: + self.profiles.remove(profile) + self.updateView() + @property def targets(self): return self.fits + self.profiles diff --git a/gui/graphFrame/panel.py b/gui/graphFrame/panel.py index 43402baa6..46c0576b3 100644 --- a/gui/graphFrame/panel.py +++ b/gui/graphFrame/panel.py @@ -320,9 +320,28 @@ class GraphControlPanel(wx.Panel): def targets(self): return self.targetList.targets - def unbindExternalEvents(self): - self.fitList.unbindExternalEvents() - self.targetList.unbindExternalEvents() + # Fit events + def OnFitRenamed(self, event): + self.fitList.OnFitRenamed(event) + self.targetList.OnFitRenamed(event) + + def OnFitChanged(self, event): + self.fitList.OnFitChanged(event) + self.targetList.OnFitChanged(event) + + def OnFitRemoved(self, event): + self.fitList.OnFitRemoved(event) + self.targetList.OnFitRemoved(event) + + # Target profile events + def OnProfileRenamed(self, event): + self.targetList.OnProfileRenamed(event) + + def OnProfileChanged(self, event): + self.targetList.OnProfileChanged(event) + + def OnProfileRemoved(self, event): + self.targetList.OnProfileRemoved(event) def formatLabel(self, axisDef): if axisDef.unit is None: diff --git a/gui/mainMenuBar.py b/gui/mainMenuBar.py index 625c6a740..c4cc8e09f 100644 --- a/gui/mainMenuBar.py +++ b/gui/mainMenuBar.py @@ -26,7 +26,6 @@ from service.fit import Fit import gui.graphFrame import gui.globalEvents as GE from gui.bitmap_loader import BitmapLoader -from gui.builtinShipBrowser.events import EVT_FIT_RENAMED from logbook import Logger @@ -173,7 +172,7 @@ class MainMenuBar(wx.MenuBar): helpMenu.Append(self.devToolsId, "Open &Dev Tools", "Dev Tools") self.mainFrame.Bind(GE.FIT_CHANGED, self.fitChanged) - self.mainFrame.Bind(EVT_FIT_RENAMED, self.fitRenamed) + self.mainFrame.Bind(GE.FIT_RENAMED, self.fitRenamed) def fitChanged(self, event): event.Skip() diff --git a/gui/targetProfileEditor.py b/gui/targetProfileEditor.py index d684fd2de..7820a4bae 100644 --- a/gui/targetProfileEditor.py +++ b/gui/targetProfileEditor.py @@ -83,6 +83,7 @@ class TargetProfileEntityEditor(EntityEditor): def __init__(self, parent): EntityEditor.__init__(self, parent, "Target Profile") self.SetEditorValidator(TargetProfileNameValidator) + self.mainFrame = gui.mainFrame.MainFrame.getInstance() def getEntitiesFromContext(self): sTR = TargetProfile.getInstance() @@ -96,6 +97,7 @@ class TargetProfileEntityEditor(EntityEditor): def DoRename(self, entity, name): sTR = TargetProfile.getInstance() sTR.renamePattern(entity, name) + wx.PostEvent(self.mainFrame, GE.TargetProfileChanged(profileID=entity.ID)) def DoCopy(self, entity, name): sTR = TargetProfile.getInstance() @@ -106,6 +108,7 @@ class TargetProfileEntityEditor(EntityEditor): def DoDelete(self, entity): sTR = TargetProfile.getInstance() sTR.deletePattern(entity) + wx.PostEvent(self.mainFrame, GE.TargetProfileRemoved(profileID=entity.ID)) class TargetProfileEditorDlg(wx.Dialog):