Merge pull request #260 from blitzmann/importStage

Import stage, resolves #93
This commit is contained in:
Ryan Holmes
2015-02-09 22:25:01 -05:00
4 changed files with 102 additions and 58 deletions

View File

@@ -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,40 @@ 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:
fit = fits[0]
wx.PostEvent(self, FitSelected(fitID=fit.ID))
wx.PostEvent(self.shipBrowser, Stage3Selected(shipID=fit.shipID, back=True))
else:
wx.PostEvent(self.shipBrowser, ImportSelected(fits=fits, back=True))
def backupToXml(self, event):
""" Back up all fits to EVE XML file """

View File

@@ -413,4 +413,4 @@ class SFBrowserItem(wx.Window):
self.bkBitmap.state = state
self.bkBitmap.sFactor = sFactor
self.bkBitmap.eFactor = eFactor
self.bkBitmap.mFactor = mFactor
self.bkBitmap.mFactor = mFactor

View File

@@ -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):
@@ -323,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")
@@ -351,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)
@@ -370,23 +371,14 @@ 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
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:
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():
@@ -400,8 +392,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):
@@ -410,7 +400,6 @@ class NavigationPanel(SFItem.SFBrowserItem):
else:
event.Skip()
def OnResize(self, event):
self.Refresh()
@@ -448,7 +437,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):
@@ -459,11 +448,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):
@@ -541,10 +530,12 @@ 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))
elif stage == 5:
wx.PostEvent(self.Parent, ImportSelected(fits=data))
else:
wx.PostEvent(self.Parent, Stage1Selected())
@@ -607,6 +598,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)
@@ -808,13 +800,15 @@ class ShipBrowser(wx.Panel):
self.lpane.ShowLoading(False)
if event.back == 0:
self.browseHist.append( (2,self._stage2Data) )
elif event.back == -1:
if len(self.navpanel.recentSearches)>0:
# 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
@@ -867,11 +861,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 +896,42 @@ 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 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()
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())
@@ -1164,7 +1194,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()
@@ -1576,7 +1606,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):
@@ -1619,18 +1649,22 @@ 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:
wx.PostEvent(self.shipBrowser,SearchSelected(text=self.shipBrowser.navpanel.lastSearch,back=True))
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, back=True))
wx.PostEvent(self.shipBrowser, Stage3Selected(shipID=self.shipID))
wx.PostEvent(self.mainFrame, FitRemoved(fitID=self.fitID))
def MouseLeftUp(self, event):
if self.dragging and self.dragged:
self.dragging = False
self.dragged = False

View File

@@ -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