From 30d2ab23ad017578813842009bc1da4fdbe018b1 Mon Sep 17 00:00:00 2001 From: blitzmann Date: Sun, 8 Feb 2015 16:14:52 -0500 Subject: [PATCH 1/4] Initial support for import stage in shipBrowser. Few bugs, see issue #93 --- gui/mainFrame.py | 37 +++++++++++++++++++---------------- gui/shipBrowser.py | 48 ++++++++++++++++++++++++++++++++++++++++++---- service/fit.py | 10 +++++++--- 3 files changed, 72 insertions(+), 23 deletions(-) diff --git a/gui/mainFrame.py b/gui/mainFrame.py index b50ed9867..b764c3502 100644 --- a/gui/mainFrame.py +++ b/gui/mainFrame.py @@ -42,7 +42,7 @@ from gui.additionsPane import AdditionsPane from gui.marketBrowser import MarketBrowser from gui.multiSwitch import MultiSwitch from gui.statsPane import StatsPane -from gui.shipBrowser import ShipBrowser, FitSelected +from gui.shipBrowser import ShipBrowser, FitSelected, ImportSelected, Stage3Selected from gui.characterEditor import CharacterEditor from gui.characterSelection import CharacterSelection from gui.patternEditor import DmgPatternEditorDlg @@ -540,8 +540,7 @@ class MainFrame(wx.Frame): except: pass else: - ids = tuple(fit.ID for fit in fits) - self._openAfterImport(len(fits), ids) + self._openAfterImport(fits) def exportToClipboard(self, event): CopySelectDict = {CopySelectDialog.copyFormatEft: self.clipboardEft, @@ -571,33 +570,39 @@ class MainFrame(wx.Frame): " "*100, # set some arbitrary spacing to create wifth in window parent=self, style = wx.PD_APP_MODAL | wx.PD_ELAPSED_TIME) self.progressDialog.message = None - sFit.importFitsThreaded(dlg.GetPaths(), self.importCallback) + sFit.importFitsThreaded(dlg.GetPaths(), self.fileImportCallback) self.progressDialog.ShowModal() dlg.Destroy() - def importCallback(self, info): + def fileImportCallback(self, info, fits=None): """ While importing fits from file, the logic calls back to this function to - update progress bar to show activity. If -1, closes dialog. If None, - simply Pulse()s progress. If there is a message to show new activity, - overwrites cached message and updates dialog + update progress bar to show activity. XML files can contain multiple + ships with multiple fits, whereas EFT cfg files contain many fits of + a single ship. When iterating through the files, we update the message + when we start a new file, and then Pulse the progress bar with every fit + that is processed. """ + if info == -1: + # Done processing self.progressDialog.Hide() + self._openAfterImport(fits) elif info != self.progressDialog.message and info is not None: + # New message, overwrite cached message and update self.progressDialog.message = info self.progressDialog.Pulse(info) else: + # Simply Pulse() if we don't have anything else to do self.progressDialog.Pulse() - # @todo: modify _openAfterImport - #self._openAfterImport(len(fits), IDs) - - def _openAfterImport(self, importCount, fitIDs): - if importCount == 1: - wx.PostEvent(self, FitSelected(fitID=fitIDs[0])) - - self.shipBrowser.RefreshContent() + def _openAfterImport(self, fits): + if len(fits) > 0: + if len(fits) == 1: + wx.PostEvent(self, FitSelected(fitID=fits[0].ID)) + wx.PostEvent(self.shipBrowser, Stage3Selected(shipID=fits[0].shipID, back=False)) + else: + wx.PostEvent(self.shipBrowser, ImportSelected(fits=fits, back=False)) def backupToXml(self, event): """ Back up all fits to EVE XML file """ diff --git a/gui/shipBrowser.py b/gui/shipBrowser.py index 41e5213fc..e1557520b 100644 --- a/gui/shipBrowser.py +++ b/gui/shipBrowser.py @@ -29,6 +29,7 @@ Stage1Selected, EVT_SB_STAGE1_SEL = wx.lib.newevent.NewEvent() Stage2Selected, EVT_SB_STAGE2_SEL = wx.lib.newevent.NewEvent() Stage3Selected, EVT_SB_STAGE3_SEL = wx.lib.newevent.NewEvent() SearchSelected, EVT_SB_SEARCH_SEL = wx.lib.newevent.NewEvent() +ImportSelected, EVT_SB_IMPORT_SEL = wx.lib.newevent.NewEvent() class PFWidgetsContainer(PFListPane): def __init__(self,parent): @@ -607,6 +608,7 @@ class ShipBrowser(wx.Panel): self.Bind(EVT_SB_STAGE1_SEL, self.stage1) self.Bind(EVT_SB_STAGE3_SEL, self.stage3) self.Bind(EVT_SB_SEARCH_SEL, self.searchStage) + self.Bind(EVT_SB_IMPORT_SEL, self.importStage) self.mainFrame.Bind(GE.FIT_CHANGED, self.RefreshList) @@ -867,11 +869,11 @@ class ShipBrowser(wx.Panel): self.navpanel.ShowSwitchEmptyGroupsButton(False) if not event.back: - if self._activeStage !=4: - if len(self.browseHist) >0: - self.browseHist.append( (self._activeStage, self.lastdata) ) + if self._activeStage != 4: + if len(self.browseHist) > 0: + self.browseHist.append((self._activeStage, self.lastdata)) else: - self.browseHist.append((1,0)) + self.browseHist.append((1, 0)) self._lastStage = self._activeStage self._activeStage = 4 @@ -902,6 +904,44 @@ class ShipBrowser(wx.Panel): self.raceselect.Show(False) self.Layout() + def importStage(self, event): + self.lpane.ShowLoading(False) + + self.navpanel.ShowNewFitButton(False) + self.navpanel.ShowSwitchEmptyGroupsButton(False) + + if not event.back: + if self._activeStage != 5: + if len(self.browseHist) > 0: + self.browseHist.append((self._activeStage, self.lastdata)) + else: + self.browseHist.append((1, 0)) + self._lastStage = self._activeStage + self._activeStage = 5 + + fits = event.fits + self.lpane.Freeze() + self.lpane.RemoveAllChildren() + + if fits: + for fit in fits: + self.lpane.AddWidget(FitItem( + self.lpane, + fit.ID, ( + fit.ship.item.name, + fit.name, + fit.booster, + fit.timestamp), + fit.ship.item.ID)) + self.lpane.RefreshList(doFocus=False) + self.lpane.Thaw() + + self.raceselect.RebuildRaces(self.RACE_ORDER) + + if self.showRacesFilterInStage2Only: + self.raceselect.Show(False) + self.Layout() + class PFStaticText(wx.Panel): def __init__(self, parent, label=wx.EmptyString): wx.Panel.__init__ (self, parent, id=wx.ID_ANY, pos=wx.DefaultPosition, size = parent.GetSize()) diff --git a/service/fit.py b/service/fit.py index 128a137b8..fac02bb5c 100644 --- a/service/fit.py +++ b/service/fit.py @@ -63,10 +63,10 @@ class FitImportThread(threading.Thread): def run(self): sFit = Fit.getInstance() - sFit.importFitFromFiles(self.paths, self.callback) + fits = sFit.importFitFromFiles(self.paths, self.callback) # Send done signal to GUI - wx.CallAfter(self.callback, -1) + wx.CallAfter(self.callback, -1, fits) class Fit(object): @@ -810,7 +810,11 @@ class Fit(object): eos.db.save(fit) IDs.append(fit.ID) if callback: # Pulse - wx.CallAfter(callback, "Saving fit\n%d/%d"%(i+1, numFits)) + wx.CallAfter( + callback, + "Processing complete, saving fits to database\n(%d/%d)" % + (i+1, numFits) + ) return fits From cbcd5ccca51bd099256d69974632ed15f3f8bdca Mon Sep 17 00:00:00 2001 From: blitzmann Date: Sun, 8 Feb 2015 20:29:54 -0500 Subject: [PATCH 2/4] Fixed bugs: * Importing 1 fit would open stage3 of that ship, but add incorrect history data. * Deleting fit from search stage caused blank stage most times, fixed this. --- gui/mainFrame.py | 5 +++-- gui/sfBrowserItem.py | 2 +- gui/shipBrowser.py | 24 ++++++++++-------------- 3 files changed, 14 insertions(+), 17 deletions(-) diff --git a/gui/mainFrame.py b/gui/mainFrame.py index b764c3502..4eb3433e8 100644 --- a/gui/mainFrame.py +++ b/gui/mainFrame.py @@ -599,8 +599,9 @@ class MainFrame(wx.Frame): def _openAfterImport(self, fits): if len(fits) > 0: if len(fits) == 1: - wx.PostEvent(self, FitSelected(fitID=fits[0].ID)) - wx.PostEvent(self.shipBrowser, Stage3Selected(shipID=fits[0].shipID, back=False)) + fit = fits[0] + wx.PostEvent(self, FitSelected(fitID=fit.ID)) + wx.PostEvent(self.shipBrowser, Stage3Selected(shipID=fit.shipID, back=0)) else: wx.PostEvent(self.shipBrowser, ImportSelected(fits=fits, back=False)) diff --git a/gui/sfBrowserItem.py b/gui/sfBrowserItem.py index 0a2da9090..4067707c3 100644 --- a/gui/sfBrowserItem.py +++ b/gui/sfBrowserItem.py @@ -413,4 +413,4 @@ class SFBrowserItem(wx.Window): self.bkBitmap.state = state self.bkBitmap.sFactor = sFactor self.bkBitmap.eFactor = eFactor - self.bkBitmap.mFactor = mFactor \ No newline at end of file + self.bkBitmap.mFactor = mFactor diff --git a/gui/shipBrowser.py b/gui/shipBrowser.py index e1557520b..bbf0a5761 100644 --- a/gui/shipBrowser.py +++ b/gui/shipBrowser.py @@ -324,7 +324,7 @@ class RaceSelector(wx.Window): event.Skip() class NavigationPanel(SFItem.SFBrowserItem): - def __init__(self,parent, size = (-1,24)): + def __init__(self,parent, size = (-1, 24)): SFItem.SFBrowserItem.__init__(self,parent,size = size) self.rewBmpH = bitmapLoader.getBitmap("frewind_small","icons") @@ -352,7 +352,7 @@ class NavigationPanel(SFItem.SFBrowserItem): self.padding = 4 self.lastSearch = "" - self.recentSearches = [] + self.recentSearches = [] # not used? self.inSearch = False self.fontSmall = wx.Font(fonts.SMALL, wx.SWISS, wx.NORMAL, wx.NORMAL) @@ -371,7 +371,6 @@ class NavigationPanel(SFItem.SFBrowserItem): self.Bind(wx.EVT_SIZE, self.OnResize) - def OnScheduleSearch(self, event): search = self.BrowserSearchBox.GetValue() # Make sure we do not count wildcard as search symbol @@ -384,6 +383,7 @@ class NavigationPanel(SFItem.SFBrowserItem): self.gotoStage(stage,data) else: if search: + self.lastSearch = search wx.PostEvent(self.shipBrowser,SearchSelected(text=search, back = False)) self.inSearch = True else: @@ -401,8 +401,6 @@ class NavigationPanel(SFItem.SFBrowserItem): self.OnBrowserSearchBoxLostFocus(None) def OnBrowserSearchBoxLostFocus(self, event): - self.lastSearch = self.BrowserSearchBox.GetValue() - self.BrowserSearchBox.ChangeValue("") self.BrowserSearchBox.Show(False) def OnBrowserSearchBoxEsc(self, event): @@ -411,7 +409,6 @@ class NavigationPanel(SFItem.SFBrowserItem): else: event.Skip() - def OnResize(self, event): self.Refresh() @@ -460,11 +457,11 @@ class NavigationPanel(SFItem.SFBrowserItem): def OnHistoryBack(self): if len(self.shipBrowser.browseHist) > 0: stage,data = self.shipBrowser.browseHist.pop() - self.gotoStage(stage,data) + self.gotoStage(stage, data) def AdjustChannels(self, bitmap): img = wx.ImageFromBitmap(bitmap) - img = img.AdjustChannels(1.05,1.05,1.05,1) + img = img.AdjustChannels(1.05, 1.05, 1.05, 1) return wx.BitmapFromImage(img) def UpdateElementsPos(self, mdc): @@ -811,12 +808,12 @@ class ShipBrowser(wx.Panel): self.lpane.ShowLoading(False) if event.back == 0: - self.browseHist.append( (2,self._stage2Data) ) + self.browseHist.append((self._activeStage, self.lastdata)) elif event.back == -1: - if len(self.navpanel.recentSearches)>0: + if self.navpanel.lastSearch != "": self.browseHist.append((4, self.navpanel.lastSearch)) elif event.back > 0: - self.browseHist.append( (2,event.back) ) + self.browseHist.append((2, event.back)) shipID = event.shipID self.lastdata = shipID @@ -1663,14 +1660,13 @@ class FitItem(SFItem.SFBrowserItem): sFit.deleteFit(self.fitID) if self.shipBrowser.GetActiveStage() == 4: - wx.PostEvent(self.shipBrowser,SearchSelected(text=self.shipBrowser.navpanel.lastSearch,back=True)) + wx.PostEvent(self.shipBrowser, SearchSelected(text=self.shipBrowser.navpanel.lastSearch, back=True)) else: - wx.PostEvent(self.shipBrowser,Stage3Selected(shipID=self.shipID, back=True)) + wx.PostEvent(self.shipBrowser, Stage3Selected(shipID=self.shipID, back=True)) wx.PostEvent(self.mainFrame, FitRemoved(fitID=self.fitID)) def MouseLeftUp(self, event): - if self.dragging and self.dragged: self.dragging = False self.dragged = False From 6d29fd6bc18839629d8bd8e9affd4eef1910b763 Mon Sep 17 00:00:00 2001 From: blitzmann Date: Sun, 8 Feb 2015 21:12:56 -0500 Subject: [PATCH 3/4] Simplified stage 3 history handling. Fixes: * Hitting back button after creating/copying new fit breaks stage * Importing more than 1 fit while on the search stage and hitting the back button breaks stage --- gui/shipBrowser.py | 41 ++++++++++++++++++++++------------------- 1 file changed, 22 insertions(+), 19 deletions(-) diff --git a/gui/shipBrowser.py b/gui/shipBrowser.py index bbf0a5761..4ef471018 100644 --- a/gui/shipBrowser.py +++ b/gui/shipBrowser.py @@ -446,7 +446,7 @@ class NavigationPanel(SFItem.SFBrowserItem): sFit = service.Fit.getInstance() fitID = sFit.newFit(shipID, "%s fit" %shipName) self.shipBrowser.fitIDMustEditName = fitID - wx.PostEvent(self.Parent,Stage3Selected(shipID=shipID, back = True)) + wx.PostEvent(self.Parent,Stage3Selected(shipID=shipID)) wx.PostEvent(self.mainFrame, FitSelected(fitID=fitID)) def OnHistoryReset(self): @@ -539,7 +539,7 @@ class NavigationPanel(SFItem.SFBrowserItem): elif stage == 2: wx.PostEvent(self.Parent, Stage2Selected(categoryID=data, back=True)) elif stage == 3: - wx.PostEvent(self.Parent, Stage3Selected(shipID=data, back=1)) + wx.PostEvent(self.Parent, Stage3Selected(shipID=data)) elif stage == 4: self.shipBrowser._activeStage = 4 wx.PostEvent(self.Parent, SearchSelected(text=data, back=True)) @@ -807,13 +807,15 @@ class ShipBrowser(wx.Panel): self.lpane.ShowLoading(False) - if event.back == 0: - self.browseHist.append((self._activeStage, self.lastdata)) - elif event.back == -1: - if self.navpanel.lastSearch != "": + # If back is False, do not append to history. This could be us calling + # the stage from previous history, creating / copying fit, etc. + # We also have to use conditional for search stage since it's last data + # is kept elsewhere + if getattr(event, "back", False): + if self._activeStage == 4 and self.navpanel.lastSearch != "": self.browseHist.append((4, self.navpanel.lastSearch)) - elif event.back > 0: - self.browseHist.append((2, event.back)) + else: + self.browseHist.append((self._activeStage, self.lastdata)) shipID = event.shipID self.lastdata = shipID @@ -907,14 +909,15 @@ class ShipBrowser(wx.Panel): self.navpanel.ShowNewFitButton(False) self.navpanel.ShowSwitchEmptyGroupsButton(False) - if not event.back: - if self._activeStage != 5: - if len(self.browseHist) > 0: - self.browseHist.append((self._activeStage, self.lastdata)) - else: - self.browseHist.append((1, 0)) - self._lastStage = self._activeStage - self._activeStage = 5 + + if self._activeStage == 4 and self.navpanel.lastSearch != "": + self.browseHist.append((4, self.navpanel.lastSearch)) + else: + self.browseHist.append((self._activeStage, self.lastdata)) + + + self._lastStage = self._activeStage + self._activeStage = 5 fits = event.fits self.lpane.Freeze() @@ -1201,7 +1204,7 @@ class ShipItem(SFItem.SFBrowserItem): else: shipName, fittings = self.shipFittingInfo if fittings > 0: - wx.PostEvent(self.shipBrowser,Stage3Selected(shipID=self.shipID, back = -1 if self.shipBrowser.GetActiveStage() == 4 else 0)) + wx.PostEvent(self.shipBrowser, Stage3Selected(shipID=self.shipID, back=True)) else: self.newBtnCB() @@ -1613,7 +1616,7 @@ class FitItem(SFItem.SFBrowserItem): sFit = service.Fit.getInstance() fitID = sFit.copyFit(self.fitID) self.shipBrowser.fitIDMustEditName = fitID - wx.PostEvent(self.shipBrowser,Stage3Selected(shipID=self.shipID, back=True)) + wx.PostEvent(self.shipBrowser,Stage3Selected(shipID=self.shipID)) wx.PostEvent(self.mainFrame, FitSelected(fitID=fitID)) def renameBtnCB(self): @@ -1662,7 +1665,7 @@ class FitItem(SFItem.SFBrowserItem): if self.shipBrowser.GetActiveStage() == 4: wx.PostEvent(self.shipBrowser, SearchSelected(text=self.shipBrowser.navpanel.lastSearch, back=True)) else: - wx.PostEvent(self.shipBrowser, Stage3Selected(shipID=self.shipID, back=True)) + wx.PostEvent(self.shipBrowser, Stage3Selected(shipID=self.shipID)) wx.PostEvent(self.mainFrame, FitRemoved(fitID=self.fitID)) From dc77ee93531ca861a3abc7767fcb8ac1fa52a3df Mon Sep 17 00:00:00 2001 From: blitzmann Date: Mon, 9 Feb 2015 00:07:22 -0500 Subject: [PATCH 4/4] Add import stage to goTo logic, and fixed a bug with search initiating a goTo to the last hx item --- gui/mainFrame.py | 4 ++-- gui/shipBrowser.py | 33 ++++++++++++++------------------- 2 files changed, 16 insertions(+), 21 deletions(-) diff --git a/gui/mainFrame.py b/gui/mainFrame.py index 4eb3433e8..634a22f01 100644 --- a/gui/mainFrame.py +++ b/gui/mainFrame.py @@ -601,9 +601,9 @@ class MainFrame(wx.Frame): if len(fits) == 1: fit = fits[0] wx.PostEvent(self, FitSelected(fitID=fit.ID)) - wx.PostEvent(self.shipBrowser, Stage3Selected(shipID=fit.shipID, back=0)) + wx.PostEvent(self.shipBrowser, Stage3Selected(shipID=fit.shipID, back=True)) else: - wx.PostEvent(self.shipBrowser, ImportSelected(fits=fits, back=False)) + wx.PostEvent(self.shipBrowser, ImportSelected(fits=fits, back=True)) def backupToXml(self, event): """ Back up all fits to EVE XML file """ diff --git a/gui/shipBrowser.py b/gui/shipBrowser.py index 4ef471018..a4f5b6eef 100644 --- a/gui/shipBrowser.py +++ b/gui/shipBrowser.py @@ -375,19 +375,10 @@ class NavigationPanel(SFItem.SFBrowserItem): search = self.BrowserSearchBox.GetValue() # Make sure we do not count wildcard as search symbol realsearch = search.replace("*", "") - if len(realsearch) < 3 and len(realsearch) >= 0: - if self.inSearch == True: - self.inSearch = False - if len(self.shipBrowser.browseHist) > 0: - stage,data = self.shipBrowser.browseHist.pop() - self.gotoStage(stage,data) - else: - if search: - self.lastSearch = search - wx.PostEvent(self.shipBrowser,SearchSelected(text=search, back = False)) - self.inSearch = True - else: - self.inSearch = False + if len(realsearch) >= 3: + self.lastSearch = search + wx.PostEvent(self.shipBrowser,SearchSelected(text=search, back = False)) + def ToggleSearchBox(self): if self.BrowserSearchBox.IsShown(): @@ -543,6 +534,8 @@ class NavigationPanel(SFItem.SFBrowserItem): elif stage == 4: self.shipBrowser._activeStage = 4 wx.PostEvent(self.Parent, SearchSelected(text=data, back=True)) + elif stage == 5: + wx.PostEvent(self.Parent, ImportSelected(fits=data)) else: wx.PostEvent(self.Parent, Stage1Selected()) @@ -909,17 +902,14 @@ class ShipBrowser(wx.Panel): self.navpanel.ShowNewFitButton(False) self.navpanel.ShowSwitchEmptyGroupsButton(False) - - if self._activeStage == 4 and self.navpanel.lastSearch != "": - self.browseHist.append((4, self.navpanel.lastSearch)) - else: + if getattr(event, "back", False): self.browseHist.append((self._activeStage, self.lastdata)) - self._lastStage = self._activeStage self._activeStage = 5 fits = event.fits + self.lastdata = fits self.lpane.Freeze() self.lpane.RemoveAllChildren() @@ -1659,10 +1649,15 @@ class FitItem(SFItem.SFBrowserItem): self.deleted = True sFit = service.Fit.getInstance() + fit = sFit.getFit(self.fitID) sFit.deleteFit(self.fitID) - if self.shipBrowser.GetActiveStage() == 4: + if self.shipBrowser.GetActiveStage() == 5: + if fit in self.shipBrowser.lastdata: # remove fit from import cache + self.shipBrowser.lastdata.remove(fit) + wx.PostEvent(self.shipBrowser, ImportSelected(fits=self.shipBrowser.lastdata)) + elif self.shipBrowser.GetActiveStage() == 4: wx.PostEvent(self.shipBrowser, SearchSelected(text=self.shipBrowser.navpanel.lastSearch, back=True)) else: wx.PostEvent(self.shipBrowser, Stage3Selected(shipID=self.shipID))