From aaadcb9b4541c331b5230dda1f81fe7c00d22407 Mon Sep 17 00:00:00 2001 From: blitzmann Date: Thu, 20 Feb 2014 00:57:12 -0500 Subject: [PATCH 01/18] Add "Flag as Booster" item to fitting menu --- gui/gangView.py | 5 ++++- gui/shipBrowser.py | 25 +++++++++++++++++++++++-- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/gui/gangView.py b/gui/gangView.py index 88080a56f..69846835f 100644 --- a/gui/gangView.py +++ b/gui/gangView.py @@ -43,7 +43,8 @@ class GangView ( ScrolledPanel ): for option in self.options: item = self.FitDNDPopupMenu.Append(-1, option) - self.Bind(wx.EVT_MENU, self.OnPopupItemSelected, item) + # We bind it to the mainFrame because it may be called from either this class or from FitItem via shipBrowser + self.mainFrame.Bind(wx.EVT_MENU, self.OnPopupItemSelected, item) contentFGSizer = wx.FlexGridSizer( 5, 3, 0, 0 ) contentFGSizer.AddGrowableCol( 1 ) @@ -372,6 +373,7 @@ class GangView ( ScrolledPanel ): choice.SetSelection(1) def handleDrag(self, type, fitID): + ''' Handle dragging of fit to fleet interface. This is also fired when right-clicking fit if there's an active one ''' #Those are drags coming from pyfa sources, NOT builtin wx drags self.draggedFitID = None if type == "fit": @@ -388,6 +390,7 @@ class GangView ( ScrolledPanel ): # wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=activeFit)) def OnPopupItemSelected(self, event): + ''' Fired when booster popup item is selected ''' item = self.FitDNDPopupMenu.FindItemById(event.GetId()) text = item.GetText() booster = self.options.index(text) diff --git a/gui/shipBrowser.py b/gui/shipBrowser.py index d51fac100..517576187 100644 --- a/gui/shipBrowser.py +++ b/gui/shipBrowser.py @@ -1341,12 +1341,26 @@ class FitItem(SFItem.SFBrowserItem): self.deleted = False + # @todo: replace all getActiveFit() in class with this variable and test + self.activeFit = self.mainFrame.getActiveFit() + if shipID: self.shipBmp = bitmapLoader.getBitmap(str(shipID),"ships") if not self.shipBmp: self.shipBmp = bitmapLoader.getBitmap("ship_no_image_big","icons") + self.fitMenu = wx.Menu() + item = self.fitMenu.Append(-1, "Flag As Booster Fit") + self.Bind(wx.EVT_MENU, self.OnPopupItemSelected, item) + + if self.activeFit: + # If there is an active fit, get menu for setting individual boosters + self.fitMenu.AppendSeparator() + boosterMenu = self.mainFrame.additionsPane.gangPage.FitDNDPopupMenu + self.fitMenu.AppendMenu(wx.ID_ANY, 'Set Booster', boosterMenu) + self.mainFrame.additionsPane.gangPage.draggedFitID = self.fitID + self.shipFittingInfo = shipFittingInfo self.shipName, self.fitName, self.timestamp = shipFittingInfo @@ -1424,15 +1438,22 @@ class FitItem(SFItem.SFBrowserItem): self.Bind(wx.EVT_RIGHT_UP, self.OnContextMenu) + def OnPopupItemSelected(self, event): + ''' Fires when fit menu item is selected ''' + print "Set booster flag in DB" + event.Skip() + def OnContextMenu(self, event): - self.mainFrame.additionsPane.gangPage.handleDrag("fit", self.fitID) + ''' Handles context menu for fit. Dragging is handled by MouseLeftUp() ''' + pos = wx.GetMousePosition() + pos = self.ScreenToClient(pos) + self.PopupMenu(self.fitMenu, pos) event.Skip() def GetType(self): return 3 - def OnTimer(self, event): if self.selTimerID == event.GetId(): From 3842913fe196f690b7cd018ac834561b3ccabeeb Mon Sep 17 00:00:00 2001 From: blitzmann Date: Thu, 20 Feb 2014 23:26:26 -0500 Subject: [PATCH 02/18] Added booster fit toggling in database, menu label toggling, and migration code --- eos/db/migration.py | 20 +++++++++++++++++++- eos/db/saveddata/fit.py | 5 +++-- gui/shipBrowser.py | 33 ++++++++++++++++++++++----------- service/fit.py | 8 +++++++- 4 files changed, 51 insertions(+), 15 deletions(-) diff --git a/eos/db/migration.py b/eos/db/migration.py index 9dafb52ac..e5ad2aaa2 100755 --- a/eos/db/migration.py +++ b/eos/db/migration.py @@ -3,7 +3,7 @@ import sqlalchemy def update(saveddata_engine): checkPriceFailures(saveddata_engine) checkApiDefaultChar(saveddata_engine) - + checkFitBooster(saveddata_engine) def checkPriceFailures(saveddata_engine): # Check if we have 'failed' column @@ -39,3 +39,21 @@ def checkApiDefaultChar(saveddata_engine): except sqlalchemy.exc.DatabaseError: saveddata_engine.execute("ALTER TABLE characters ADD COLUMN defaultChar INTEGER;") saveddata_engine.execute("ALTER TABLE characters ADD COLUMN chars VARCHAR;") + +def checkFitBooster(saveddata_engine): + try: + saveddata_engine.execute("SELECT * FROM fits LIMIT 1") + # If table doesn't exist, it means we're doing everything from scratch + # and sqlalchemy will process everything as needed + except sqlalchemy.exc.DatabaseError: + pass + # If not, we're running on top of existing DB + else: + # Check that we have columns + try: + saveddata_engine.execute("SELECT booster FROM fits LIMIT 1") + # If we don't, create them + # This is ugly as hell, but we can't use proper migrate packages as it + # will require us to rebuild skeletons, including mac + except sqlalchemy.exc.DatabaseError: + saveddata_engine.execute("ALTER TABLE fits ADD COLUMN booster BOOLEAN;") \ No newline at end of file diff --git a/eos/db/saveddata/fit.py b/eos/db/saveddata/fit.py index fdf9f07f0..451b7b98b 100755 --- a/eos/db/saveddata/fit.py +++ b/eos/db/saveddata/fit.py @@ -17,7 +17,7 @@ # along with eos. If not, see . #=============================================================================== -from sqlalchemy import Table, Column, Integer, ForeignKey, String +from sqlalchemy import Table, Column, Integer, ForeignKey, String, Boolean from sqlalchemy.orm import relation, mapper from sqlalchemy.sql import and_ @@ -36,7 +36,8 @@ fits_table = Table("fits", saveddata_meta, Column("name", String, nullable = False), Column("timestamp", Integer, nullable = False), Column("characterID", ForeignKey("characters.ID"), nullable = True), - Column("damagePatternID", ForeignKey("damagePatterns.ID"), nullable=True)) + Column("damagePatternID", ForeignKey("damagePatterns.ID"), nullable=True), + Column("booster", Boolean, nullable = False, index = True)) projectedFits_table = Table("projectedFits", saveddata_meta, Column("sourceID", ForeignKey("fits.ID"), primary_key = True), diff --git a/gui/shipBrowser.py b/gui/shipBrowser.py index 517576187..f202da5c0 100644 --- a/gui/shipBrowser.py +++ b/gui/shipBrowser.py @@ -806,8 +806,9 @@ class ShipBrowser(wx.Panel): self._stage3ShipName = shipName self._stage3Data = shipID - for ID, name, timestamp in fitList: - self.lpane.AddWidget(FitItem(self.lpane, ID, (shipName, name, timestamp),shipID)) + for ID, name, booster, timestamp in fitList: + print + self.lpane.AddWidget(FitItem(self.lpane, ID, (shipName, name, booster, timestamp),shipID)) self.lpane.RefreshList() self.lpane.Thaw() @@ -1314,7 +1315,7 @@ class PFBitmapFrame(wx.Frame): class FitItem(SFItem.SFBrowserItem): - def __init__(self, parent, fitID=None, shipFittingInfo=("Test", "cnc's avatar", 0 ), shipID = None, itemData=None, + def __init__(self, parent, fitID=None, shipFittingInfo=("Test", "cnc's avatar", 0, 0 ), shipID = None, itemData=None, id=wx.ID_ANY, pos=wx.DefaultPosition, size=(0, 40), style=0): @@ -1350,9 +1351,16 @@ class FitItem(SFItem.SFBrowserItem): if not self.shipBmp: self.shipBmp = bitmapLoader.getBitmap("ship_no_image_big","icons") - self.fitMenu = wx.Menu() - item = self.fitMenu.Append(-1, "Flag As Booster Fit") - self.Bind(wx.EVT_MENU, self.OnPopupItemSelected, item) + self.shipFittingInfo = shipFittingInfo + self.shipName, self.fitName, self.fitBooster, self.timestamp = shipFittingInfo + + # access these by index based on toggle for booster fit + self.toggleItemLabels = ["Set Booster Fit", "Remove Booster Fit"] + + self.fitMenu = wx.Menu() + self.toggleItem = self.fitMenu.Append(-1, self.toggleItemLabels[self.fitBooster]) + + self.Bind(wx.EVT_MENU, self.OnPopupItemSelected, self.toggleItem) if self.activeFit: # If there is an active fit, get menu for setting individual boosters @@ -1361,9 +1369,6 @@ class FitItem(SFItem.SFBrowserItem): self.fitMenu.AppendMenu(wx.ID_ANY, 'Set Booster', boosterMenu) self.mainFrame.additionsPane.gangPage.draggedFitID = self.fitID - self.shipFittingInfo = shipFittingInfo - self.shipName, self.fitName, self.timestamp = shipFittingInfo - self.copyBmp = bitmapLoader.getBitmap("fit_add_small", "icons") self.renameBmp = bitmapLoader.getBitmap("fit_rename_small", "icons") self.deleteBmp = bitmapLoader.getBitmap("fit_delete_small","icons") @@ -1440,7 +1445,13 @@ class FitItem(SFItem.SFBrowserItem): def OnPopupItemSelected(self, event): ''' Fires when fit menu item is selected ''' - print "Set booster flag in DB" + # currently only have one menu option (toggle booster) + sFit = service.Fit.getInstance() + sFit.toggleBoostFit(self.fitID) + self.fitBooster = not self.fitBooster + + self.toggleItem.SetItemLabel(self.toggleItemLabels[self.fitBooster]) + event.Skip() def OnContextMenu(self, event): @@ -1684,7 +1695,7 @@ class FitItem(SFItem.SFBrowserItem): mdc.DrawBitmap(self.shipBmp, self.shipBmpx, self.shipBmpy, 0) - shipName, fittings, timestamp = self.shipFittingInfo + shipName, fittings, booster, timestamp = self.shipFittingInfo mdc.SetFont(self.fontNormal) diff --git a/service/fit.py b/service/fit.py index fe4754eee..bf0b50c42 100644 --- a/service/fit.py +++ b/service/fit.py @@ -95,10 +95,11 @@ class Fit(object): return names def getFitsWithShip(self, id): + ''' Lists fits of shipID, used with shipBrowser ''' fits = eos.db.getFitsWithShip(id) names = [] for fit in fits: - names.append((fit.ID, fit.name, fit.timestamp)) + names.append((fit.ID, fit.name, fit.booster, fit.timestamp)) return names @@ -129,6 +130,11 @@ class Fit(object): self.recalc(fit) return fit.ID + def toggleBoostFit(self, fitID): + fit = eos.db.getFit(fitID) + fit.booster = not fit.booster + eos.db.commit() + def renameFit(self, fitID, newName): fit = eos.db.getFit(fitID) fit.name = newName From 7579f3c3e1eab0495b18c04617834f0b5f8e6592 Mon Sep 17 00:00:00 2001 From: blitzmann Date: Thu, 20 Feb 2014 23:56:50 -0500 Subject: [PATCH 03/18] Fixed cases where fit.booster column might contain null instead of bool --- eos/db/migration.py | 3 ++- gui/shipBrowser.py | 1 - service/fit.py | 2 ++ 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/eos/db/migration.py b/eos/db/migration.py index e5ad2aaa2..1da35e129 100755 --- a/eos/db/migration.py +++ b/eos/db/migration.py @@ -56,4 +56,5 @@ def checkFitBooster(saveddata_engine): # This is ugly as hell, but we can't use proper migrate packages as it # will require us to rebuild skeletons, including mac except sqlalchemy.exc.DatabaseError: - saveddata_engine.execute("ALTER TABLE fits ADD COLUMN booster BOOLEAN;") \ No newline at end of file + saveddata_engine.execute("ALTER TABLE fits ADD COLUMN booster BOOLEAN;") + saveddata_engine.execute("UPDATE fits SET booster = 0;") diff --git a/gui/shipBrowser.py b/gui/shipBrowser.py index f202da5c0..9cdfb5aa1 100644 --- a/gui/shipBrowser.py +++ b/gui/shipBrowser.py @@ -807,7 +807,6 @@ class ShipBrowser(wx.Panel): self._stage3Data = shipID for ID, name, booster, timestamp in fitList: - print self.lpane.AddWidget(FitItem(self.lpane, ID, (shipName, name, booster, timestamp),shipID)) self.lpane.RefreshList() diff --git a/service/fit.py b/service/fit.py index bf0b50c42..9b316f42d 100644 --- a/service/fit.py +++ b/service/fit.py @@ -79,6 +79,7 @@ class Fit(object): def __init__(self): self.pattern = DamagePattern.getInstance().getDamagePattern("Uniform") self.character = Character.getInstance().all5() + self.booster = False self.dirtyFitIDs = set() serviceFittingDefaultOptions = {"useGlobalCharacter": False, "useGlobalDamagePattern": False, "defaultCharacter": self.character.ID, "useGlobalForceReload": False} @@ -126,6 +127,7 @@ class Fit(object): fit.name = name if name is not None else "New %s" % fit.ship.item.name fit.damagePattern = self.pattern fit.character = self.character + fit.booster = self.booster eos.db.save(fit) self.recalc(fit) return fit.ID From 46662d2b7209d41decd023808a443b7d528d53e0 Mon Sep 17 00:00:00 2001 From: blitzmann Date: Fri, 21 Feb 2014 21:47:10 -0500 Subject: [PATCH 04/18] Added getFitsWithBooster query --- eos/db/__init__.py | 2 +- eos/db/saveddata/queries.py | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/eos/db/__init__.py b/eos/db/__init__.py index 113e3f09d..70f2d6e4a 100755 --- a/eos/db/__init__.py +++ b/eos/db/__init__.py @@ -66,7 +66,7 @@ from eos.db.saveddata.queries import getUser, getCharacter, getFit, getFitsWithS getCharacterList, getPrice, getDamagePatternList, getDamagePattern, \ getFitList, getFleetList, getFleet, save, remove, commit, add, \ getCharactersForUser, getMiscData, getSquadsIDsWithFitID, getWing, \ - getSquad + getSquad, getFitsWithBooster #If using in memory saveddata, you'll want to reflect it so the data structure is good. if config.saveddata_connectionstring == "sqlite:///:memory:": diff --git a/eos/db/saveddata/queries.py b/eos/db/saveddata/queries.py index 13a88a852..98d5e9183 100755 --- a/eos/db/saveddata/queries.py +++ b/eos/db/saveddata/queries.py @@ -248,6 +248,24 @@ def getFitsWithShip(shipID, ownerID=None, where=None, eager=None): raise TypeError("ShipID must be integer") return fits +def getFitsWithBooster(ownerID=None, where=None, eager=None): + """ + Get all the fits that are flagged as a boosting ship + If no user is passed, do this for all users. + """ + + if ownerID is not None and not isinstance(ownerID, int): + raise TypeError("OwnerID must be integer") + filter = Fit.booster == 1 + if ownerID is not None: + filter = and_(filter, Fit.ownerID == ownerID) + + filter = processWhere(filter, where) + eager = processEager(eager) + with sd_lock: + fits = saveddata_session.query(Fit).options(*eager).filter(filter).all() + return fits + def countFitsWithShip(shipID, ownerID=None, where=None, eager=None): """ Get all the fits using a certain ship. From 50ce4d37aa2e0396e630c68390c4cf45ce6cb6c3 Mon Sep 17 00:00:00 2001 From: blitzmann Date: Fri, 21 Feb 2014 21:50:18 -0500 Subject: [PATCH 05/18] GangView is not aware of changes to booster fits --- gui/gangView.py | 5 +++++ gui/shipBrowser.py | 4 +++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/gui/gangView.py b/gui/gangView.py index 69846835f..fa8f6c1cb 100644 --- a/gui/gangView.py +++ b/gui/gangView.py @@ -141,6 +141,7 @@ class GangView ( ScrolledPanel ): self.mainFrame.Bind(GE.CHAR_LIST_UPDATED, self.RefreshCharacterList) self.mainFrame.Bind(GE.FIT_CHANGED, self.fitSelected) self.mainFrame.Bind(gui.shipBrowser.EVT_FIT_RENAMED, self.fitRenamed) + self.mainFrame.Bind(gui.shipBrowser.BOOSTER_LIST_UPDATED, self.RefreshBoosterFits) for stBooster in self.stBoosters: stBooster.Bind(wx.EVT_LEFT_DCLICK, self.RemoveBooster) @@ -346,6 +347,10 @@ class GangView ( ScrolledPanel ): sFit.recalc(boostee, withBoosters=True) wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=activeFitID)) + def RefreshBoosterFits(self, event): + print "refresh booster lists" + pass + def RefreshCharacterList(self, event = None): cChar = service.Character.getInstance() charList = cChar.getCharacterList() diff --git a/gui/shipBrowser.py b/gui/shipBrowser.py index 9cdfb5aa1..b2bc6aa54 100644 --- a/gui/shipBrowser.py +++ b/gui/shipBrowser.py @@ -23,6 +23,8 @@ FitRenamed, EVT_FIT_RENAMED = wx.lib.newevent.NewEvent() FitSelected, EVT_FIT_SELECTED = wx.lib.newevent.NewEvent() FitRemoved, EVT_FIT_REMOVED = wx.lib.newevent.NewEvent() +BoosterListUpdated, BOOSTER_LIST_UPDATED = wx.lib.newevent.NewEvent() + 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() @@ -1450,7 +1452,7 @@ class FitItem(SFItem.SFBrowserItem): self.fitBooster = not self.fitBooster self.toggleItem.SetItemLabel(self.toggleItemLabels[self.fitBooster]) - + wx.PostEvent(self.mainFrame, BoosterListUpdated()) event.Skip() def OnContextMenu(self, event): From f2c1002d588b68605d36fe111586652e8b97ed13 Mon Sep 17 00:00:00 2001 From: blitzmann Date: Sat, 22 Feb 2014 00:52:29 -0500 Subject: [PATCH 06/18] Fixes bug with fit copy. `copy.deepcopy` was not copying the booster property of the fit for whatever reason - I blame my poor understanding of copy. --- eos/db/saveddata/fit.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/eos/db/saveddata/fit.py b/eos/db/saveddata/fit.py index 451b7b98b..25516b7b6 100755 --- a/eos/db/saveddata/fit.py +++ b/eos/db/saveddata/fit.py @@ -37,7 +37,7 @@ fits_table = Table("fits", saveddata_meta, Column("timestamp", Integer, nullable = False), Column("characterID", ForeignKey("characters.ID"), nullable = True), Column("damagePatternID", ForeignKey("damagePatterns.ID"), nullable=True), - Column("booster", Boolean, nullable = False, index = True)) + Column("booster", Boolean, nullable = False, index = True, default = 0)) projectedFits_table = Table("projectedFits", saveddata_meta, Column("sourceID", ForeignKey("fits.ID"), primary_key = True), From b910982994ed3a17d5bc90f6a90122e1f86bc969 Mon Sep 17 00:00:00 2001 From: blitzmann Date: Sat, 22 Feb 2014 01:14:33 -0500 Subject: [PATCH 07/18] Bug fix and more work --- eos/db/__init__.py | 2 +- eos/db/saveddata/queries.py | 2 +- gui/shipBrowser.py | 4 ++-- service/fit.py | 11 ++++++++++- 4 files changed, 14 insertions(+), 5 deletions(-) diff --git a/eos/db/__init__.py b/eos/db/__init__.py index 70f2d6e4a..09a092c81 100755 --- a/eos/db/__init__.py +++ b/eos/db/__init__.py @@ -66,7 +66,7 @@ from eos.db.saveddata.queries import getUser, getCharacter, getFit, getFitsWithS getCharacterList, getPrice, getDamagePatternList, getDamagePattern, \ getFitList, getFleetList, getFleet, save, remove, commit, add, \ getCharactersForUser, getMiscData, getSquadsIDsWithFitID, getWing, \ - getSquad, getFitsWithBooster + getSquad, getBoosterFits #If using in memory saveddata, you'll want to reflect it so the data structure is good. if config.saveddata_connectionstring == "sqlite:///:memory:": diff --git a/eos/db/saveddata/queries.py b/eos/db/saveddata/queries.py index 98d5e9183..01c2888ce 100755 --- a/eos/db/saveddata/queries.py +++ b/eos/db/saveddata/queries.py @@ -248,7 +248,7 @@ def getFitsWithShip(shipID, ownerID=None, where=None, eager=None): raise TypeError("ShipID must be integer") return fits -def getFitsWithBooster(ownerID=None, where=None, eager=None): +def getBoosterFits(ownerID=None, where=None, eager=None): """ Get all the fits that are flagged as a boosting ship If no user is passed, do this for all users. diff --git a/gui/shipBrowser.py b/gui/shipBrowser.py index b2bc6aa54..cdbb9efaf 100644 --- a/gui/shipBrowser.py +++ b/gui/shipBrowser.py @@ -845,8 +845,8 @@ class ShipBrowser(wx.Panel): for ship in ships: self.lpane.AddWidget(ShipItem(self.lpane, ship.ID, (ship.name, len(sFit.getFitsWithShip(ship.ID))), ship.race)) - for ID, name, shipID, shipName,timestamp in fitList: - self.lpane.AddWidget(FitItem(self.lpane, ID, (shipName, name,timestamp), shipID)) + for ID, name, shipID, shipName, booster, timestamp in fitList: + self.lpane.AddWidget(FitItem(self.lpane, ID, (shipName, name, booster, timestamp), shipID)) if len(ships) == 0 and len(fitList) == 0 : self.lpane.AddWidget(PFStaticText(self.lpane, label = "No matching results.")) self.lpane.RefreshList(doFocus = False) diff --git a/service/fit.py b/service/fit.py index 9b316f42d..037db3dae 100644 --- a/service/fit.py +++ b/service/fit.py @@ -104,6 +104,15 @@ class Fit(object): return names + def getBoosterFits(self): + ''' Lists fits flagged as booster ''' + fits = eos.db.getBoosterFits() + names = [] + for fit in fits: + names.append((fit.ID, fit.name)) + + return names + def countFitsWithShip(self, id): count = eos.db.countFitsWithShip(id) return count @@ -211,7 +220,7 @@ class Fit(object): results = eos.db.searchFits(name) fits = [] for fit in results: - fits.append((fit.ID, fit.name, fit.ship.item.ID, fit.ship.item.name, fit.timestamp)) + fits.append((fit.ID, fit.name, fit.ship.item.ID, fit.ship.item.name, fit.booster, fit.timestamp)) return fits def addImplant(self, fitID, itemID): From 354b732c2c603578643fd12779f423a21b398209 Mon Sep 17 00:00:00 2001 From: blitzmann Date: Sat, 22 Feb 2014 21:11:59 -0500 Subject: [PATCH 08/18] Fit choice works and is properly applied. Dragging and setting via context from ship browser does not. --- gui/gangView.py | 104 +++++++++++++++++++++++++++++++++++++++++++++--- service/fit.py | 2 +- 2 files changed, 99 insertions(+), 7 deletions(-) diff --git a/gui/gangView.py b/gui/gangView.py index fa8f6c1cb..1856c426d 100644 --- a/gui/gangView.py +++ b/gui/gangView.py @@ -54,6 +54,10 @@ class GangView ( ScrolledPanel ): self.oneonePlaceholder = wx.StaticText( self, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.DefaultSize, 0 ) self.oneonePlaceholder.Wrap( -1 ) contentFGSizer.Add( self.oneonePlaceholder, 0, wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL, 5 ) + + fleetFitsSizer = wx.BoxSizer( wx.VERTICAL ) + wingFitsSizer = wx.BoxSizer( wx.VERTICAL ) + squadFitsSizer = wx.BoxSizer( wx.VERTICAL ) self.stFits = wx.StaticText( self, wx.ID_ANY, u"Fits", wx.DefaultPosition, wx.DefaultSize, 0 ) self.stFits.Wrap( -1 ) @@ -82,7 +86,14 @@ class GangView ( ScrolledPanel ): self.stFleetFit = wx.StaticText( self, wx.ID_ANY, u"None", wx.DefaultPosition, wx.DefaultSize, 0 ) self.stFleetFit.Wrap( -1 ) - contentFGSizer.Add( self.stFleetFit, 0, wx.ALIGN_CENTER_VERTICAL|wx.ALL, 5 ) + self.stFleetFit.Hide() + + cFleetFitChoices = [] + self.cFleetFit = wx.Choice( self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, cFleetFitChoices, 0 ) + + fleetFitsSizer.Add( self.stFleetFit, 0, wx.ALIGN_CENTER_VERTICAL|wx.ALL, 5 ) + fleetFitsSizer.Add( self.cFleetFit, 0, wx.ALIGN_CENTER_VERTICAL|wx.ALL, 5 ) + contentFGSizer.Add( fleetFitsSizer, 0, wx.ALIGN_CENTER_VERTICAL|wx.ALL, 5 ) chFleetCharChoices = [] self.chFleetChar = wx.Choice( self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, chFleetCharChoices, 0 ) @@ -97,7 +108,14 @@ class GangView ( ScrolledPanel ): self.stWingFit = wx.StaticText( self, wx.ID_ANY, u"None", wx.DefaultPosition, wx.DefaultSize, 0 ) self.stWingFit.Wrap( -1 ) - contentFGSizer.Add( self.stWingFit, 0, wx.ALIGN_CENTER_VERTICAL|wx.ALL, 5 ) + self.stWingFit.Hide() + + cWingFitChoices = [] + self.cWingFit = wx.Choice( self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, cWingFitChoices, 0 ) + + wingFitsSizer.Add( self.stWingFit, 0, wx.ALIGN_CENTER_VERTICAL|wx.ALL, 5 ) + wingFitsSizer.Add( self.cWingFit, 0, wx.ALIGN_CENTER_VERTICAL|wx.ALL, 5 ) + contentFGSizer.Add( wingFitsSizer, 0, wx.ALIGN_CENTER_VERTICAL|wx.ALL, 5 ) chWingCharChoices = [] self.chWingChar = wx.Choice( self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, chWingCharChoices, 0 ) @@ -112,8 +130,16 @@ class GangView ( ScrolledPanel ): self.stSquadFit = wx.StaticText( self, wx.ID_ANY, u"None", wx.DefaultPosition, wx.DefaultSize, 0 ) self.stSquadFit.Wrap( -1 ) - contentFGSizer.Add( self.stSquadFit, 0, wx.ALIGN_CENTER_VERTICAL|wx.ALL, 5 ) + self.stSquadFit.Hide() + + cSquadFitChoices = [] + self.cSquadFit = wx.Choice( self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, cSquadFitChoices, 0 ) + squadFitsSizer.Add( self.stSquadFit, 0, wx.ALIGN_CENTER_VERTICAL|wx.ALL, 5 ) + squadFitsSizer.Add( self.cSquadFit, 0, wx.ALIGN_CENTER_VERTICAL|wx.ALL, 5 ) + contentFGSizer.Add( squadFitsSizer, 0, wx.ALIGN_CENTER_VERTICAL|wx.ALL, 5 ) + + chSquadCharChoices = [] self.chSquadChar = wx.Choice( self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, chSquadCharChoices, 0 ) self.chSquadChar.SetSelection( 0 ) @@ -133,6 +159,11 @@ class GangView ( ScrolledPanel ): self.chCharacters.append(self.chWingChar) self.chCharacters.append(self.chSquadChar) + self.chFits = [] + self.chFits.append(self.cFleetFit) + self.chFits.append(self.cWingFit) + self.chFits.append(self.cSquadFit) + self.SetSizer( mainSizer ) self.SetAutoLayout(True) self.SetupScrolling() @@ -151,8 +182,41 @@ class GangView ( ScrolledPanel ): for chCharacter in self.chCharacters: chCharacter.Bind(wx.EVT_CHOICE, self.CharChanged) + + for chFits in self.chFits: + chFits.Bind(wx.EVT_CHOICE, self.BoosterChanged) + + self.RefreshBoosterFits() self.RefreshCharacterList() + def BoosterChanged(self, event): + ''' Fired when booster choice is selected ''' + chFit = event.GetEventObject() + + type = -1 + if chFit == self.cFleetFit: + type = 0 + if chFit == self.cWingFit: + type = 1 + if chFit == self.cSquadFit: + type = 2 + + if type == -1: + event.Skip() + return + + id = chFit.GetClientData(chFit.GetSelection()) + + sFit = service.Fit.getInstance() + fit = sFit.getFit(id) + + chFit.Hide() + text = self.stBoosters[type] + text.Show() + self.AddCommander(fit.ID, type) + self.mainFrame.additionsPane.select("Fleet") + + def OnEnterWindow(self, event): obj = event.GetEventObject() obj.SetCursor(wx.StockCursor(wx.CURSOR_HAND)) @@ -249,6 +313,10 @@ class GangView ( ScrolledPanel ): elif type == 2: fleetSrv.setLinearSquadCom(boostee, booster) + location.Hide() + choice = self.chFits[type] + choice.Show() + sFit.recalc(boostee, withBoosters=True) wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=activeFitID)) @@ -347,9 +415,33 @@ class GangView ( ScrolledPanel ): sFit.recalc(boostee, withBoosters=True) wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=activeFitID)) - def RefreshBoosterFits(self, event): - print "refresh booster lists" - pass + def RefreshBoosterFits(self, event = None): + sFit = service.Fit.getInstance() + sMarket = service.Market.getInstance() + fitList = sFit.getBoosterFits() + + for choice in self.chFits: + chCurrSelection = choice.GetSelection() + chCurrData = -1 + if chCurrSelection != -1: + chCurrData = choice.GetClientData(chCurrSelection) + chCurrSelString = choice.GetString(chCurrSelection) + choice.Clear() + currSelFound = False + for fit in fitList: + id,name,type = fit + ship = sMarket.getItem(type) + choice.Append(str(id)+': '+ship.name+' - '+name, id) + if chCurrData == id: + currSelFound = True + + if chCurrSelection == -1: + choice.SetSelection(1) + else: + if currSelFound: + choice.SetStringSelection(chCurrSelString) + else: + choice.SetSelection(1) def RefreshCharacterList(self, event = None): cChar = service.Character.getInstance() diff --git a/service/fit.py b/service/fit.py index 037db3dae..546333897 100644 --- a/service/fit.py +++ b/service/fit.py @@ -109,7 +109,7 @@ class Fit(object): fits = eos.db.getBoosterFits() names = [] for fit in fits: - names.append((fit.ID, fit.name)) + names.append((fit.ID, fit.name, fit.shipID)) return names From c34215f9e3f29358388fe3c6fd62840d48e5eda1 Mon Sep 17 00:00:00 2001 From: blitzmann Date: Sun, 23 Feb 2014 22:18:58 -0500 Subject: [PATCH 09/18] Got rid of `UpdateFleetFitsUI` and baked it's functionality into `fitSelected`; now supports dragging/setting via right click. --- gui/gangView.py | 190 +++++++++++++++++++++--------------------------- 1 file changed, 84 insertions(+), 106 deletions(-) diff --git a/gui/gangView.py b/gui/gangView.py index 1856c426d..adedad911 100644 --- a/gui/gangView.py +++ b/gui/gangView.py @@ -54,7 +54,7 @@ class GangView ( ScrolledPanel ): self.oneonePlaceholder = wx.StaticText( self, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.DefaultSize, 0 ) self.oneonePlaceholder.Wrap( -1 ) contentFGSizer.Add( self.oneonePlaceholder, 0, wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL, 5 ) - + fleetFitsSizer = wx.BoxSizer( wx.VERTICAL ) wingFitsSizer = wx.BoxSizer( wx.VERTICAL ) squadFitsSizer = wx.BoxSizer( wx.VERTICAL ) @@ -87,7 +87,7 @@ class GangView ( ScrolledPanel ): self.stFleetFit = wx.StaticText( self, wx.ID_ANY, u"None", wx.DefaultPosition, wx.DefaultSize, 0 ) self.stFleetFit.Wrap( -1 ) self.stFleetFit.Hide() - + cFleetFitChoices = [] self.cFleetFit = wx.Choice( self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, cFleetFitChoices, 0 ) @@ -109,10 +109,10 @@ class GangView ( ScrolledPanel ): self.stWingFit = wx.StaticText( self, wx.ID_ANY, u"None", wx.DefaultPosition, wx.DefaultSize, 0 ) self.stWingFit.Wrap( -1 ) self.stWingFit.Hide() - + cWingFitChoices = [] self.cWingFit = wx.Choice( self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, cWingFitChoices, 0 ) - + wingFitsSizer.Add( self.stWingFit, 0, wx.ALIGN_CENTER_VERTICAL|wx.ALL, 5 ) wingFitsSizer.Add( self.cWingFit, 0, wx.ALIGN_CENTER_VERTICAL|wx.ALL, 5 ) contentFGSizer.Add( wingFitsSizer, 0, wx.ALIGN_CENTER_VERTICAL|wx.ALL, 5 ) @@ -131,7 +131,7 @@ class GangView ( ScrolledPanel ): self.stSquadFit = wx.StaticText( self, wx.ID_ANY, u"None", wx.DefaultPosition, wx.DefaultSize, 0 ) self.stSquadFit.Wrap( -1 ) self.stSquadFit.Hide() - + cSquadFitChoices = [] self.cSquadFit = wx.Choice( self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, cSquadFitChoices, 0 ) @@ -139,7 +139,7 @@ class GangView ( ScrolledPanel ): squadFitsSizer.Add( self.cSquadFit, 0, wx.ALIGN_CENTER_VERTICAL|wx.ALL, 5 ) contentFGSizer.Add( squadFitsSizer, 0, wx.ALIGN_CENTER_VERTICAL|wx.ALL, 5 ) - + chSquadCharChoices = [] self.chSquadChar = wx.Choice( self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, chSquadCharChoices, 0 ) self.chSquadChar.SetSelection( 0 ) @@ -163,7 +163,7 @@ class GangView ( ScrolledPanel ): self.chFits.append(self.cFleetFit) self.chFits.append(self.cWingFit) self.chFits.append(self.cSquadFit) - + self.SetSizer( mainSizer ) self.SetAutoLayout(True) self.SetupScrolling() @@ -184,39 +184,11 @@ class GangView ( ScrolledPanel ): chCharacter.Bind(wx.EVT_CHOICE, self.CharChanged) for chFits in self.chFits: - chFits.Bind(wx.EVT_CHOICE, self.BoosterChanged) + chFits.Bind(wx.EVT_CHOICE, self.OnFitChoiceSelected) self.RefreshBoosterFits() self.RefreshCharacterList() - def BoosterChanged(self, event): - ''' Fired when booster choice is selected ''' - chFit = event.GetEventObject() - - type = -1 - if chFit == self.cFleetFit: - type = 0 - if chFit == self.cWingFit: - type = 1 - if chFit == self.cSquadFit: - type = 2 - - if type == -1: - event.Skip() - return - - id = chFit.GetClientData(chFit.GetSelection()) - - sFit = service.Fit.getInstance() - fit = sFit.getFit(id) - - chFit.Hide() - text = self.stBoosters[type] - text.Show() - self.AddCommander(fit.ID, type) - self.mainFrame.additionsPane.select("Fleet") - - def OnEnterWindow(self, event): obj = event.GetEventObject() obj.SetCursor(wx.StockCursor(wx.CURSOR_HAND)) @@ -227,16 +199,14 @@ class GangView ( ScrolledPanel ): obj.SetCursor(wx.StockCursor(wx.CURSOR_DEFAULT)) event.Skip() - def CharChanged(self, event): + ''' Change booster character ''' chBooster = event.GetEventObject() + type = -1 - if chBooster == self.chFleetChar: - type = 0 - if chBooster == self.chWingChar: - type = 1 - if chBooster == self.chSquadChar: - type = 2 + if chBooster == self.chFleetChar: type = 0 + if chBooster == self.chWingChar: type = 1 + if chBooster == self.chSquadChar: type = 2 if type == -1: event.Skip() @@ -293,12 +263,9 @@ class GangView ( ScrolledPanel ): location = event.GetEventObject() - if location == self.stFleetFit: - type = 0 - if location == self.stWingFit: - type = 1 - if location == self.stSquadFit: - type = 2 + if location == self.stFleetFit: type = 0 + if location == self.stWingFit: type = 1 + if location == self.stSquadFit: type = 2 sFit = service.Fit.getInstance() boostee = sFit.getFit(activeFitID) @@ -306,17 +273,14 @@ class GangView ( ScrolledPanel ): fleetSrv = service.Fleet.getInstance() - if type == 0: - fleetSrv.setLinearFleetCom(boostee, booster) - elif type == 1: - fleetSrv.setLinearWingCom(boostee, booster) - elif type == 2: - fleetSrv.setLinearSquadCom(boostee, booster) + if type == 0: fleetSrv.setLinearFleetCom(boostee, booster) + if type == 1: fleetSrv.setLinearWingCom(boostee, booster) + if type == 2: fleetSrv.setLinearSquadCom(boostee, booster) location.Hide() choice = self.chFits[type] choice.Show() - + sFit.recalc(boostee, withBoosters=True) wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=activeFitID)) @@ -344,55 +308,53 @@ class GangView ( ScrolledPanel ): fleetCom, wingCom, squadCom = commanders if fleetCom: - fleetComName = fleetCom.ship.item.name + ": " + fleetCom.name - fleetComCharName = fleetCom.character.name if fleetCom.character is not None else "All 0" + self.stFleetFit.SetLabel(fleetCom.ship.item.name + ": " + fleetCom.name) + self.chFleetChar.SetStringSelection(fleetCom.character.name if fleetCom.character is not None else "All 0") + self.cFleetFit.Hide() + self.stFleetFit.Show() else: - fleetComName = "None" - fleetComCharName = "All 0" + self.stFleetFit.SetLabel("None") + self.chFleetChar.SetStringSelection("All 0") + self.stFleetFit.Hide() + self.cFleetFit.Show() if wingCom: - wingComName = wingCom.ship.item.name + ": " + wingCom.name - wingComCharName = wingCom.character.name if wingCom.character is not None else "All 0" + self.stWingFit.SetLabel(wingCom.ship.item.name + ": " + wingCom.name) + self.chWingChar.SetStringSelection(wingCom.character.name if wingCom.character is not None else "All 0") + self.cWingFit.Hide() + self.stWingFit.Show() else: - wingComName = "None" - wingComCharName = "All 0" + self.stWingFit.SetLabel("None") + self.chWingChar.SetStringSelection("All 0") + self.stWingFit.Hide() + self.cWingFit.Show() if squadCom: - squadComName = squadCom.ship.item.name + ": " + squadCom.name - squadComCharName = squadCom.character.name if squadCom.character is not None else "All 0" + self.stSquadFit.SetLabel(squadCom.ship.item.name + ": " + squadCom.name) + self.chSquadChar.SetStringSelection(squadCom.character.name if squadCom.character is not None else "All 0") + self.cSquadFit.Hide() + self.stSquadFit.Show() else: - squadComName = "None" - squadComCharName = "All 0" + self.stSquadFit.SetLabel("None") + self.chSquadChar.SetStringSelection("All 0") + self.stSquadFit.Hide() + self.cSquadFit.Show() - self.UpdateFleetFitsUI( fleetComName, wingComName, squadComName, fleetComCharName, wingComCharName, squadComCharName ) self.Enable() else: - fleetComName = "None" - fleetComCharName = "All 0" - wingComName = "None" - wingComCharName = "All 0" - squadComName = "None" - squadComCharName = "All 0" + self.stFleetFit.SetLabel("None") + self.chFleetChar.SetStringSelection("All 0") + self.stWingFit.SetLabel("None") + self.chWingChar.SetStringSelection("All 0") + self.stSquadFit.SetLabel("None") + self.chSquadChar.SetStringSelection("All 0") - self.UpdateFleetFitsUI( fleetComName, wingComName, squadComName, fleetComCharName, wingComCharName, squadComCharName ) self.Disable() - def UpdateFleetFitsUI(self, fleet, wing, squad, fleetChar, wingChar, squadChar): - self.stFleetFit.SetLabel(fleet) - self.stWingFit.SetLabel(wing) - self.stSquadFit.SetLabel(squad) - - self.chFleetChar.SetStringSelection(fleetChar) - self.chWingChar.SetStringSelection(wingChar) - self.chSquadChar.SetStringSelection(squadChar) - - self.Layout() self.SendSizeEvent() - - def AddCommander(self, fitID, type = None): if type is None: return @@ -406,20 +368,18 @@ class GangView ( ScrolledPanel ): fleetSrv = service.Fleet.getInstance() - if type == 0: - fleetSrv.setLinearFleetCom(boostee, booster) - elif type == 1: - fleetSrv.setLinearWingCom(boostee, booster) - elif type == 2: - fleetSrv.setLinearSquadCom(boostee, booster) + if type == 0: fleetSrv.setLinearFleetCom(boostee, booster) + if type == 1: fleetSrv.setLinearWingCom(boostee, booster) + if type == 2: fleetSrv.setLinearSquadCom(boostee, booster) + sFit.recalc(boostee, withBoosters=True) wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=activeFitID)) def RefreshBoosterFits(self, event = None): - sFit = service.Fit.getInstance() + sFit = service.Fit.getInstance() sMarket = service.Market.getInstance() fitList = sFit.getBoosterFits() - + for choice in self.chFits: chCurrSelection = choice.GetSelection() chCurrData = -1 @@ -483,21 +443,39 @@ class GangView ( ScrolledPanel ): self.PopupMenu(self.FitDNDPopupMenu, pos) -# sFit.project(activeFit,draggedFit) -# wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=activeFit)) def OnPopupItemSelected(self, event): - ''' Fired when booster popup item is selected ''' - item = self.FitDNDPopupMenu.FindItemById(event.GetId()) - text = item.GetText() - booster = self.options.index(text) + ''' Fired when booster popup item is selected ''' + + # Get menu selection ID via self.options + menuItem = self.FitDNDPopupMenu.FindItemById(event.GetId()) + type = self.options.index(menuItem.GetText()) + if self.draggedFitID: sFit = service.Fit.getInstance() draggedFit = sFit.getFit(self.draggedFitID) -# self.stBoosters[booster].SetLabel(draggedFit.name) -# self.Layout() - - self.AddCommander(draggedFit.ID, booster) + self.AddCommander(draggedFit.ID, type) self.mainFrame.additionsPane.select("Fleet") + def OnFitChoiceSelected(self, event): + ''' Fired when booster choice is selected ''' + sFit = service.Fit.getInstance() + + # set type via choice box used + chFit = event.GetEventObject() + + type = -1 + if chFit == self.cFleetFit: type = 0 + if chFit == self.cWingFit: type = 1 + if chFit == self.cSquadFit: type = 2 + + if type == -1: + event.Skip() + return + + id = chFit.GetClientData(chFit.GetSelection()) + fit = sFit.getFit(id) + + self.AddCommander(fit.ID, type) + self.mainFrame.additionsPane.select("Fleet") \ No newline at end of file From 65cc0bec1c4049ca901c47603a088b85fe85fb3f Mon Sep 17 00:00:00 2001 From: blitzmann Date: Sun, 23 Feb 2014 22:20:22 -0500 Subject: [PATCH 10/18] Fixed style issue that caused content to move when switching between choice and static text --- gui/gangView.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/gui/gangView.py b/gui/gangView.py index adedad911..5b3b7ddbf 100644 --- a/gui/gangView.py +++ b/gui/gangView.py @@ -92,7 +92,7 @@ class GangView ( ScrolledPanel ): self.cFleetFit = wx.Choice( self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, cFleetFitChoices, 0 ) fleetFitsSizer.Add( self.stFleetFit, 0, wx.ALIGN_CENTER_VERTICAL|wx.ALL, 5 ) - fleetFitsSizer.Add( self.cFleetFit, 0, wx.ALIGN_CENTER_VERTICAL|wx.ALL, 5 ) + fleetFitsSizer.Add( self.cFleetFit, 0, wx.ALIGN_CENTER_VERTICAL|wx.ALL, 1 ) contentFGSizer.Add( fleetFitsSizer, 0, wx.ALIGN_CENTER_VERTICAL|wx.ALL, 5 ) chFleetCharChoices = [] @@ -114,7 +114,7 @@ class GangView ( ScrolledPanel ): self.cWingFit = wx.Choice( self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, cWingFitChoices, 0 ) wingFitsSizer.Add( self.stWingFit, 0, wx.ALIGN_CENTER_VERTICAL|wx.ALL, 5 ) - wingFitsSizer.Add( self.cWingFit, 0, wx.ALIGN_CENTER_VERTICAL|wx.ALL, 5 ) + wingFitsSizer.Add( self.cWingFit, 0, wx.ALIGN_CENTER_VERTICAL|wx.ALL, 1 ) contentFGSizer.Add( wingFitsSizer, 0, wx.ALIGN_CENTER_VERTICAL|wx.ALL, 5 ) chWingCharChoices = [] @@ -136,7 +136,7 @@ class GangView ( ScrolledPanel ): self.cSquadFit = wx.Choice( self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, cSquadFitChoices, 0 ) squadFitsSizer.Add( self.stSquadFit, 0, wx.ALIGN_CENTER_VERTICAL|wx.ALL, 5 ) - squadFitsSizer.Add( self.cSquadFit, 0, wx.ALIGN_CENTER_VERTICAL|wx.ALL, 5 ) + squadFitsSizer.Add( self.cSquadFit, 0, wx.ALIGN_CENTER_VERTICAL|wx.ALL, 1 ) contentFGSizer.Add( squadFitsSizer, 0, wx.ALIGN_CENTER_VERTICAL|wx.ALL, 5 ) From d8dfafedfaef0f0fafa75f6de338e8168b77d391 Mon Sep 17 00:00:00 2001 From: blitzmann Date: Mon, 24 Feb 2014 00:55:25 -0500 Subject: [PATCH 11/18] Refactoring of code, along with general housekeeping. Also, character menu is now disabled with no fit selected. --- gui/gangView.py | 234 +++++++++++++++--------------------------------- 1 file changed, 74 insertions(+), 160 deletions(-) diff --git a/gui/gangView.py b/gui/gangView.py index 5b3b7ddbf..1a2e452bc 100644 --- a/gui/gangView.py +++ b/gui/gangView.py @@ -41,24 +41,30 @@ class GangView ( ScrolledPanel ): self.options = ["Fleet booster", "Wing booster", "Squad booster"] - for option in self.options: + self.fleet = {} + for id, option in enumerate(self.options): item = self.FitDNDPopupMenu.Append(-1, option) # We bind it to the mainFrame because it may be called from either this class or from FitItem via shipBrowser self.mainFrame.Bind(wx.EVT_MENU, self.OnPopupItemSelected, item) + # set content for each commander + self.fleet[id] = {} + self.fleet[id]['stLabel'] = wx.StaticText( self, wx.ID_ANY, self.options[id]+':', wx.DefaultPosition, wx.DefaultSize, 0 ) + self.fleet[id]['stText'] = wx.StaticText( self, wx.ID_ANY, 'None', wx.DefaultPosition, wx.DefaultSize, 0 ) + self.fleet[id]['chFit'] = wx.Choice( self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, [] ) + self.fleet[id]['chChar'] = wx.Choice( self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, [] ) + self.fleet[id]['fitSizer'] = wx.BoxSizer( wx.VERTICAL ) + contentFGSizer = wx.FlexGridSizer( 5, 3, 0, 0 ) contentFGSizer.AddGrowableCol( 1 ) contentFGSizer.SetFlexibleDirection( wx.BOTH ) contentFGSizer.SetNonFlexibleGrowMode( wx.FLEX_GROWMODE_SPECIFIED ) + ### Header self.oneonePlaceholder = wx.StaticText( self, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.DefaultSize, 0 ) self.oneonePlaceholder.Wrap( -1 ) contentFGSizer.Add( self.oneonePlaceholder, 0, wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL, 5 ) - fleetFitsSizer = wx.BoxSizer( wx.VERTICAL ) - wingFitsSizer = wx.BoxSizer( wx.VERTICAL ) - squadFitsSizer = wx.BoxSizer( wx.VERTICAL ) - self.stFits = wx.StaticText( self, wx.ID_ANY, u"Fits", wx.DefaultPosition, wx.DefaultSize, 0 ) self.stFits.Wrap( -1 ) self.stFits.SetFont( wx.Font( wx.NORMAL_FONT.GetPointSize(), 70, 90, 92, False, wx.EmptyString ) ) @@ -78,114 +84,41 @@ class GangView ( ScrolledPanel ): self.m_staticline4 = wx.StaticLine( self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.LI_HORIZONTAL ) contentFGSizer.Add( self.m_staticline4, 0, wx.EXPAND, 5 ) - self.stFleet = wx.StaticText( self, wx.ID_ANY, u"Fleet booster:", wx.DefaultPosition, wx.DefaultSize, 0 ) - self.stFleet.Wrap( -1 ) - self.stFleet.SetFont( wx.Font( wx.NORMAL_FONT.GetPointSize(), 70, 90, 92, False, wx.EmptyString ) ) + ### Content + for id in self.fleet: + # set various properties + self.fleet[id]['stLabel'].Wrap( -1 ) + self.fleet[id]['stLabel'].SetFont( wx.Font( wx.NORMAL_FONT.GetPointSize(), 70, 90, 92, False, wx.EmptyString ) ) + self.fleet[id]['stText'].Wrap( -1 ) - contentFGSizer.Add( self.stFleet, 0, wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL|wx.ALL, 5 ) + # bind text and choice events + self.fleet[id]['stText'].Bind(wx.EVT_LEFT_DCLICK, self.RemoveBooster) + self.fleet[id]['stText'].Bind(wx.EVT_ENTER_WINDOW, self.OnEnterWindow) + self.fleet[id]['stText'].Bind(wx.EVT_LEAVE_WINDOW, self.OnLeaveWindow) + self.fleet[id]['stText'].SetToolTip(wx.ToolTip("Double click to remove booster")) + self.fleet[id]['chChar'].Bind(wx.EVT_CHOICE, self.CharChanged) + self.fleet[id]['chFit'].Bind(wx.EVT_CHOICE, self.OnFitChoiceSelected) - self.stFleetFit = wx.StaticText( self, wx.ID_ANY, u"None", wx.DefaultPosition, wx.DefaultSize, 0 ) - self.stFleetFit.Wrap( -1 ) - self.stFleetFit.Hide() + # add fit text and choice to the fit sizer + self.fleet[id]['fitSizer'].Add( self.fleet[id]['stText'], 0, wx.ALIGN_CENTER_VERTICAL|wx.ALL, 5 ) + self.fleet[id]['fitSizer'].Add( self.fleet[id]['chFit'], 0, wx.ALIGN_CENTER_VERTICAL|wx.ALL, 1 ) - cFleetFitChoices = [] - self.cFleetFit = wx.Choice( self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, cFleetFitChoices, 0 ) - - fleetFitsSizer.Add( self.stFleetFit, 0, wx.ALIGN_CENTER_VERTICAL|wx.ALL, 5 ) - fleetFitsSizer.Add( self.cFleetFit, 0, wx.ALIGN_CENTER_VERTICAL|wx.ALL, 1 ) - contentFGSizer.Add( fleetFitsSizer, 0, wx.ALIGN_CENTER_VERTICAL|wx.ALL, 5 ) - - chFleetCharChoices = [] - self.chFleetChar = wx.Choice( self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, chFleetCharChoices, 0 ) - self.chFleetChar.SetSelection( 0 ) - - contentFGSizer.Add( self.chFleetChar, 0, wx.ALL | wx.ALIGN_CENTER_VERTICAL, 5 ) - - self.stWing = wx.StaticText( self, wx.ID_ANY, u"Wing booster:", wx.DefaultPosition, wx.DefaultSize, 0 ) - self.stWing.Wrap( -1 ) - self.stWing.SetFont( wx.Font( wx.NORMAL_FONT.GetPointSize(), 70, 90, 92, False, wx.EmptyString ) ) - contentFGSizer.Add( self.stWing, 0, wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL|wx.ALL, 5 ) - - self.stWingFit = wx.StaticText( self, wx.ID_ANY, u"None", wx.DefaultPosition, wx.DefaultSize, 0 ) - self.stWingFit.Wrap( -1 ) - self.stWingFit.Hide() - - cWingFitChoices = [] - self.cWingFit = wx.Choice( self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, cWingFitChoices, 0 ) - - wingFitsSizer.Add( self.stWingFit, 0, wx.ALIGN_CENTER_VERTICAL|wx.ALL, 5 ) - wingFitsSizer.Add( self.cWingFit, 0, wx.ALIGN_CENTER_VERTICAL|wx.ALL, 1 ) - contentFGSizer.Add( wingFitsSizer, 0, wx.ALIGN_CENTER_VERTICAL|wx.ALL, 5 ) - - chWingCharChoices = [] - self.chWingChar = wx.Choice( self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, chWingCharChoices, 0 ) - self.chWingChar.SetSelection( 0 ) - - contentFGSizer.Add( self.chWingChar, 0, wx.ALL| wx.ALIGN_CENTER_VERTICAL, 5 ) - - self.stSquad = wx.StaticText( self, wx.ID_ANY, u"Squad booster:", wx.DefaultPosition, wx.DefaultSize, 0 ) - self.stSquad.Wrap( -1 ) - self.stSquad.SetFont( wx.Font( wx.NORMAL_FONT.GetPointSize(), 70, 90, 92, False, wx.EmptyString ) ) - contentFGSizer.Add( self.stSquad, 0, wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL|wx.ALL, 5 ) - - self.stSquadFit = wx.StaticText( self, wx.ID_ANY, u"None", wx.DefaultPosition, wx.DefaultSize, 0 ) - self.stSquadFit.Wrap( -1 ) - self.stSquadFit.Hide() - - cSquadFitChoices = [] - self.cSquadFit = wx.Choice( self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, cSquadFitChoices, 0 ) - - squadFitsSizer.Add( self.stSquadFit, 0, wx.ALIGN_CENTER_VERTICAL|wx.ALL, 5 ) - squadFitsSizer.Add( self.cSquadFit, 0, wx.ALIGN_CENTER_VERTICAL|wx.ALL, 1 ) - contentFGSizer.Add( squadFitsSizer, 0, wx.ALIGN_CENTER_VERTICAL|wx.ALL, 5 ) - - - chSquadCharChoices = [] - self.chSquadChar = wx.Choice( self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, chSquadCharChoices, 0 ) - self.chSquadChar.SetSelection( 0 ) - - contentFGSizer.Add( self.chSquadChar, 0, wx.ALL | wx.ALIGN_CENTER_VERTICAL, 5 ) + # add everything to the content sizer + contentFGSizer.Add( self.fleet[id]['stLabel'], 0, wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL|wx.ALL, 5 ) + contentFGSizer.Add( self.fleet[id]['fitSizer'], 1, wx.ALIGN_CENTER_VERTICAL|wx.ALL, 5 ) + contentFGSizer.Add( self.fleet[id]['chChar'], 0, wx.ALIGN_CENTER_VERTICAL|wx.ALL, 5 ) mainSizer.Add( contentFGSizer, 1, wx.EXPAND, 0 ) - self.stBoosters = [] - self.stBoosters.append(self.stFleetFit) - self.stBoosters.append(self.stWingFit) - self.stBoosters.append(self.stSquadFit) - - - self.chCharacters = [] - self.chCharacters.append(self.chFleetChar) - self.chCharacters.append(self.chWingChar) - self.chCharacters.append(self.chSquadChar) - - self.chFits = [] - self.chFits.append(self.cFleetFit) - self.chFits.append(self.cWingFit) - self.chFits.append(self.cSquadFit) - self.SetSizer( mainSizer ) self.SetAutoLayout(True) self.SetupScrolling() - self.Disable() self.mainFrame.Bind(GE.CHAR_LIST_UPDATED, self.RefreshCharacterList) self.mainFrame.Bind(GE.FIT_CHANGED, self.fitSelected) self.mainFrame.Bind(gui.shipBrowser.EVT_FIT_RENAMED, self.fitRenamed) self.mainFrame.Bind(gui.shipBrowser.BOOSTER_LIST_UPDATED, self.RefreshBoosterFits) - for stBooster in self.stBoosters: - stBooster.Bind(wx.EVT_LEFT_DCLICK, self.RemoveBooster) - stBooster.Bind(wx.EVT_ENTER_WINDOW, self.OnEnterWindow) - stBooster.Bind(wx.EVT_LEAVE_WINDOW, self.OnLeaveWindow) - stBooster.SetToolTip(wx.ToolTip("Double click to remove booster")) - - for chCharacter in self.chCharacters: - chCharacter.Bind(wx.EVT_CHOICE, self.CharChanged) - - for chFits in self.chFits: - chFits.Bind(wx.EVT_CHOICE, self.OnFitChoiceSelected) - self.RefreshBoosterFits() self.RefreshCharacterList() @@ -204,9 +137,8 @@ class GangView ( ScrolledPanel ): chBooster = event.GetEventObject() type = -1 - if chBooster == self.chFleetChar: type = 0 - if chBooster == self.chWingChar: type = 1 - if chBooster == self.chSquadChar: type = 2 + for id in self.fleet: + if chBooster == self.fleet[id]['chChar']: type = id if type == -1: event.Skip() @@ -263,9 +195,8 @@ class GangView ( ScrolledPanel ): location = event.GetEventObject() - if location == self.stFleetFit: type = 0 - if location == self.stWingFit: type = 1 - if location == self.stSquadFit: type = 2 + for id in self.fleet: + if location == self.fleet[id]['stText']: type = id sFit = service.Fit.getInstance() boostee = sFit.getFit(activeFitID) @@ -277,8 +208,10 @@ class GangView ( ScrolledPanel ): if type == 1: fleetSrv.setLinearWingCom(boostee, booster) if type == 2: fleetSrv.setLinearSquadCom(boostee, booster) + # Hide stText and, default fit selection, and enable it location.Hide() - choice = self.chFits[type] + choice = self.fleet[type]['chFit'] + choice.SetSelection(0) choice.Show() sFit.recalc(boostee, withBoosters=True) @@ -294,68 +227,49 @@ class GangView ( ScrolledPanel ): self.fitSelected(ev) def fitSelected(self, event): + ''' Fires when active fit is selected and when booster is saved to fit. Update the UI to reflect changes ''' fleetSrv = service.Fleet.getInstance() activeFitID = self.mainFrame.getActiveFit() cFit = service.Fit.getInstance() fit = cFit.getFit(event.fitID or activeFitID) + commanders = (None, None, None) if activeFitID: commanders = fleetSrv.loadLinearFleet(fit) - if commanders is None: - fleetCom, wingCom, squadCom = (None, None, None) - else: - fleetCom, wingCom, squadCom = commanders - if fleetCom: - self.stFleetFit.SetLabel(fleetCom.ship.item.name + ": " + fleetCom.name) - self.chFleetChar.SetStringSelection(fleetCom.character.name if fleetCom.character is not None else "All 0") - self.cFleetFit.Hide() - self.stFleetFit.Show() - else: - self.stFleetFit.SetLabel("None") - self.chFleetChar.SetStringSelection("All 0") - self.stFleetFit.Hide() - self.cFleetFit.Show() + for id in self.fleet: + # try...except here as we're trying 2 different criteria and want to fall back on the same code + try: + commander = commanders[id] - if wingCom: - self.stWingFit.SetLabel(wingCom.ship.item.name + ": " + wingCom.name) - self.chWingChar.SetStringSelection(wingCom.character.name if wingCom.character is not None else "All 0") - self.cWingFit.Hide() - self.stWingFit.Show() - else: - self.stWingFit.SetLabel("None") - self.chWingChar.SetStringSelection("All 0") - self.stWingFit.Hide() - self.cWingFit.Show() + if not activeFitID or commander is None: + raise Exception() - if squadCom: - self.stSquadFit.SetLabel(squadCom.ship.item.name + ": " + squadCom.name) - self.chSquadChar.SetStringSelection(squadCom.character.name if squadCom.character is not None else "All 0") - self.cSquadFit.Hide() - self.stSquadFit.Show() - else: - self.stSquadFit.SetLabel("None") - self.chSquadChar.SetStringSelection("All 0") - self.stSquadFit.Hide() - self.cSquadFit.Show() + self.fleet[id]['stText'].SetLabel(commander.ship.item.name + ": " + commander.name) + self.fleet[id]['chChar'].SetStringSelection(commander.character.name if commander.character is not None else "All 0") + self.fleet[id]['chChar'].Enable() + self.fleet[id]['chFit'].Hide() + self.fleet[id]['stText'].Show() + except: + #set defaults, disable char selection, and enable fit selection + self.fleet[id]['stText'].SetLabel("None") + self.fleet[id]['chChar'].SetStringSelection("All 0") + self.fleet[id]['chChar'].Disable() + self.fleet[id]['chFit'].SetSelection(0) + self.fleet[id]['chFit'].Show() + self.fleet[id]['stText'].Hide() + if activeFitID: self.Enable() - else: - self.stFleetFit.SetLabel("None") - self.chFleetChar.SetStringSelection("All 0") - self.stWingFit.SetLabel("None") - self.chWingChar.SetStringSelection("All 0") - self.stSquadFit.SetLabel("None") - self.chSquadChar.SetStringSelection("All 0") - self.Disable() self.Layout() self.SendSizeEvent() def AddCommander(self, fitID, type = None): + ''' Adds booster to a fit, then recalculates active fit ''' if type is None: return @@ -380,7 +294,8 @@ class GangView ( ScrolledPanel ): sMarket = service.Market.getInstance() fitList = sFit.getBoosterFits() - for choice in self.chFits: + for id in self.fleet: + choice = self.fleet[id]['chFit'] chCurrSelection = choice.GetSelection() chCurrData = -1 if chCurrSelection != -1: @@ -388,26 +303,27 @@ class GangView ( ScrolledPanel ): chCurrSelString = choice.GetString(chCurrSelection) choice.Clear() currSelFound = False + choice.Append("None", -1) for fit in fitList: id,name,type = fit ship = sMarket.getItem(type) - choice.Append(str(id)+': '+ship.name+' - '+name, id) + choice.Append(ship.name+': '+name, id) if chCurrData == id: currSelFound = True if chCurrSelection == -1: - choice.SetSelection(1) + choice.SetSelection(0) else: if currSelFound: choice.SetStringSelection(chCurrSelString) else: - choice.SetSelection(1) + choice.SetSelection(0) def RefreshCharacterList(self, event = None): cChar = service.Character.getInstance() charList = cChar.getCharacterList() - - for choice in self.chCharacters: + for id in self.fleet: + choice = self.fleet[id]['chChar'] chCurrSelection = choice.GetSelection() chCurrData = -1 if chCurrSelection != -1: @@ -464,18 +380,16 @@ class GangView ( ScrolledPanel ): # set type via choice box used chFit = event.GetEventObject() - + fitID = chFit.GetClientData(chFit.GetSelection()) type = -1 - if chFit == self.cFleetFit: type = 0 - if chFit == self.cWingFit: type = 1 - if chFit == self.cSquadFit: type = 2 + for id in self.fleet: + if chFit == self.fleet[id]['chFit']: type = id - if type == -1: + if type == -1 or fitID == -1: event.Skip() return - id = chFit.GetClientData(chFit.GetSelection()) - fit = sFit.getFit(id) + fit = sFit.getFit(fitID) self.AddCommander(fit.ID, type) self.mainFrame.additionsPane.select("Fleet") \ No newline at end of file From c6ad328e99f442f1dfcf55ef3c6eb83459da0d8a Mon Sep 17 00:00:00 2001 From: blitzmann Date: Mon, 24 Feb 2014 00:56:04 -0500 Subject: [PATCH 12/18] Changed "Set Booster Fit" option to a boolean menu item with fancy checkbox. --- gui/shipBrowser.py | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/gui/shipBrowser.py b/gui/shipBrowser.py index cdbb9efaf..0dcc70a4e 100644 --- a/gui/shipBrowser.py +++ b/gui/shipBrowser.py @@ -1356,11 +1356,10 @@ class FitItem(SFItem.SFBrowserItem): self.shipName, self.fitName, self.fitBooster, self.timestamp = shipFittingInfo # access these by index based on toggle for booster fit - self.toggleItemLabels = ["Set Booster Fit", "Remove Booster Fit"] - - self.fitMenu = wx.Menu() - self.toggleItem = self.fitMenu.Append(-1, self.toggleItemLabels[self.fitBooster]) + self.fitMenu = wx.Menu() + self.toggleItem = self.fitMenu.Append(-1, "Booster Fit", kind=wx.ITEM_CHECK) + self.fitMenu.Check(self.toggleItem.GetId(), self.fitBooster) self.Bind(wx.EVT_MENU, self.OnPopupItemSelected, self.toggleItem) if self.activeFit: @@ -1451,10 +1450,10 @@ class FitItem(SFItem.SFBrowserItem): sFit.toggleBoostFit(self.fitID) self.fitBooster = not self.fitBooster - self.toggleItem.SetItemLabel(self.toggleItemLabels[self.fitBooster]) + self.fitMenu.Check(self.toggleItem.GetId(), self.fitBooster) wx.PostEvent(self.mainFrame, BoosterListUpdated()) event.Skip() - + def OnContextMenu(self, event): ''' Handles context menu for fit. Dragging is handled by MouseLeftUp() ''' pos = wx.GetMousePosition() From f7fdcfcd4e354ad98070d0d93f865f40e98fdb12 Mon Sep 17 00:00:00 2001 From: blitzmann Date: Mon, 24 Feb 2014 02:34:05 -0500 Subject: [PATCH 13/18] Added icon to show boosting fits. --- gui/sfBrowserItem.py | 12 ++++++++---- gui/shipBrowser.py | 12 +++++++----- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/gui/sfBrowserItem.py b/gui/sfBrowserItem.py index 0a2da9090..fd573dd85 100644 --- a/gui/sfBrowserItem.py +++ b/gui/sfBrowserItem.py @@ -14,7 +14,7 @@ BTN_DISABLED = 8 class PFBaseButton(object): - def __init__(self, normalBitmap = wx.NullBitmap,label = "", callback = None, hoverBitmap = None, disabledBitmap = None, show = True): + def __init__(self, normalBitmap = wx.NullBitmap,label = "", callback = None, hoverBitmap = None, disabledBitmap = None, show = True, iconOnly = False): self.normalBmp = normalBitmap self.dropShadowOpacity = 0.2 @@ -23,6 +23,7 @@ class PFBaseButton(object): self.disabledBmp = disabledBitmap self.label = label self.show = show + self.iconOnly = iconOnly self.callback = callback @@ -94,8 +95,8 @@ class PFToolbar(object): def SetPosition(self, pos): self.toolbarX, self.toolbarY = pos - def AddButton(self, btnBitmap, label = "", clickCallback = None, hoverBitmap = None, disabledBitmap = None, show = True): - btn = PFBaseButton(btnBitmap, label, clickCallback, hoverBitmap, disabledBitmap, show) + def AddButton(self, btnBitmap, label = "", clickCallback = None, hoverBitmap = None, disabledBitmap = None, show = True, iconOnly = False): + btn = PFBaseButton(btnBitmap, label, clickCallback, hoverBitmap, disabledBitmap, show, iconOnly) self.buttons.append(btn) return btn @@ -120,7 +121,8 @@ class PFToolbar(object): if not state & BTN_HOVER: button.SetState(state | BTN_HOVER) self.hoverLabel = button.GetLabel() - self.Parent.SetCursor(wx.StockCursor(wx.CURSOR_HAND)) + if not button.iconOnly: + self.Parent.SetCursor(wx.StockCursor(wx.CURSOR_HAND)) doRefresh = True else: if state & BTN_HOVER: @@ -138,6 +140,8 @@ class PFToolbar(object): mx,my = event.GetPosition() bx = self.toolbarX for button in self.buttons: + if button.iconOnly: + return if not button.IsVisible(): continue diff --git a/gui/shipBrowser.py b/gui/shipBrowser.py index 0dcc70a4e..5d4971ed0 100644 --- a/gui/shipBrowser.py +++ b/gui/shipBrowser.py @@ -1369,10 +1369,11 @@ class FitItem(SFItem.SFBrowserItem): self.fitMenu.AppendMenu(wx.ID_ANY, 'Set Booster', boosterMenu) self.mainFrame.additionsPane.gangPage.draggedFitID = self.fitID - self.copyBmp = bitmapLoader.getBitmap("fit_add_small", "icons") - self.renameBmp = bitmapLoader.getBitmap("fit_rename_small", "icons") - self.deleteBmp = bitmapLoader.getBitmap("fit_delete_small","icons") - self.acceptBmp = bitmapLoader.getBitmap("faccept_small", "icons") + self.boosterBmp = bitmapLoader.getBitmap("fleet_fc_small", "icons") + self.copyBmp = bitmapLoader.getBitmap("fit_add_small", "icons") + self.renameBmp = bitmapLoader.getBitmap("fit_rename_small", "icons") + self.deleteBmp = bitmapLoader.getBitmap("fit_delete_small","icons") + self.acceptBmp = bitmapLoader.getBitmap("faccept_small", "icons") self.shipEffBk = bitmapLoader.getBitmap("fshipbk_big","icons") @@ -1399,6 +1400,7 @@ class FitItem(SFItem.SFBrowserItem): self.SetDraggable() + self.boosterBtn = self.toolbar.AddButton(self.boosterBmp,"Booster", show=self.fitBooster, iconOnly=True) self.toolbar.AddButton(self.copyBmp,"Copy", self.copyBtnCB) self.renameBtn = self.toolbar.AddButton(self.renameBmp,"Rename", self.renameBtnCB) self.toolbar.AddButton(self.deleteBmp, "Delete", self.deleteBtnCB) @@ -1449,7 +1451,7 @@ class FitItem(SFItem.SFBrowserItem): sFit = service.Fit.getInstance() sFit.toggleBoostFit(self.fitID) self.fitBooster = not self.fitBooster - + self.boosterBtn.Show(self.fitBooster) self.fitMenu.Check(self.toggleItem.GetId(), self.fitBooster) wx.PostEvent(self.mainFrame, BoosterListUpdated()) event.Skip() From e877cef3a9ef0b1fa5f69fe5e42c3612589ad667 Mon Sep 17 00:00:00 2001 From: blitzmann Date: Mon, 24 Feb 2014 03:00:06 -0500 Subject: [PATCH 14/18] Revert "Added icon to show boosting fits." This reverts commit f7fdcfcd4e354ad98070d0d93f865f40e98fdb12. --- gui/sfBrowserItem.py | 12 ++++-------- gui/shipBrowser.py | 12 +++++------- 2 files changed, 9 insertions(+), 15 deletions(-) diff --git a/gui/sfBrowserItem.py b/gui/sfBrowserItem.py index fd573dd85..0a2da9090 100644 --- a/gui/sfBrowserItem.py +++ b/gui/sfBrowserItem.py @@ -14,7 +14,7 @@ BTN_DISABLED = 8 class PFBaseButton(object): - def __init__(self, normalBitmap = wx.NullBitmap,label = "", callback = None, hoverBitmap = None, disabledBitmap = None, show = True, iconOnly = False): + def __init__(self, normalBitmap = wx.NullBitmap,label = "", callback = None, hoverBitmap = None, disabledBitmap = None, show = True): self.normalBmp = normalBitmap self.dropShadowOpacity = 0.2 @@ -23,7 +23,6 @@ class PFBaseButton(object): self.disabledBmp = disabledBitmap self.label = label self.show = show - self.iconOnly = iconOnly self.callback = callback @@ -95,8 +94,8 @@ class PFToolbar(object): def SetPosition(self, pos): self.toolbarX, self.toolbarY = pos - def AddButton(self, btnBitmap, label = "", clickCallback = None, hoverBitmap = None, disabledBitmap = None, show = True, iconOnly = False): - btn = PFBaseButton(btnBitmap, label, clickCallback, hoverBitmap, disabledBitmap, show, iconOnly) + def AddButton(self, btnBitmap, label = "", clickCallback = None, hoverBitmap = None, disabledBitmap = None, show = True): + btn = PFBaseButton(btnBitmap, label, clickCallback, hoverBitmap, disabledBitmap, show) self.buttons.append(btn) return btn @@ -121,8 +120,7 @@ class PFToolbar(object): if not state & BTN_HOVER: button.SetState(state | BTN_HOVER) self.hoverLabel = button.GetLabel() - if not button.iconOnly: - self.Parent.SetCursor(wx.StockCursor(wx.CURSOR_HAND)) + self.Parent.SetCursor(wx.StockCursor(wx.CURSOR_HAND)) doRefresh = True else: if state & BTN_HOVER: @@ -140,8 +138,6 @@ class PFToolbar(object): mx,my = event.GetPosition() bx = self.toolbarX for button in self.buttons: - if button.iconOnly: - return if not button.IsVisible(): continue diff --git a/gui/shipBrowser.py b/gui/shipBrowser.py index 5d4971ed0..0dcc70a4e 100644 --- a/gui/shipBrowser.py +++ b/gui/shipBrowser.py @@ -1369,11 +1369,10 @@ class FitItem(SFItem.SFBrowserItem): self.fitMenu.AppendMenu(wx.ID_ANY, 'Set Booster', boosterMenu) self.mainFrame.additionsPane.gangPage.draggedFitID = self.fitID - self.boosterBmp = bitmapLoader.getBitmap("fleet_fc_small", "icons") - self.copyBmp = bitmapLoader.getBitmap("fit_add_small", "icons") - self.renameBmp = bitmapLoader.getBitmap("fit_rename_small", "icons") - self.deleteBmp = bitmapLoader.getBitmap("fit_delete_small","icons") - self.acceptBmp = bitmapLoader.getBitmap("faccept_small", "icons") + self.copyBmp = bitmapLoader.getBitmap("fit_add_small", "icons") + self.renameBmp = bitmapLoader.getBitmap("fit_rename_small", "icons") + self.deleteBmp = bitmapLoader.getBitmap("fit_delete_small","icons") + self.acceptBmp = bitmapLoader.getBitmap("faccept_small", "icons") self.shipEffBk = bitmapLoader.getBitmap("fshipbk_big","icons") @@ -1400,7 +1399,6 @@ class FitItem(SFItem.SFBrowserItem): self.SetDraggable() - self.boosterBtn = self.toolbar.AddButton(self.boosterBmp,"Booster", show=self.fitBooster, iconOnly=True) self.toolbar.AddButton(self.copyBmp,"Copy", self.copyBtnCB) self.renameBtn = self.toolbar.AddButton(self.renameBmp,"Rename", self.renameBtnCB) self.toolbar.AddButton(self.deleteBmp, "Delete", self.deleteBtnCB) @@ -1451,7 +1449,7 @@ class FitItem(SFItem.SFBrowserItem): sFit = service.Fit.getInstance() sFit.toggleBoostFit(self.fitID) self.fitBooster = not self.fitBooster - self.boosterBtn.Show(self.fitBooster) + self.fitMenu.Check(self.toggleItem.GetId(), self.fitBooster) wx.PostEvent(self.mainFrame, BoosterListUpdated()) event.Skip() From 5869fe6d97d9b75727919d2425e86088f0cdb3d7 Mon Sep 17 00:00:00 2001 From: blitzmann Date: Mon, 24 Feb 2014 03:02:14 -0500 Subject: [PATCH 15/18] Added booster icon This is technically a button, and acts like a button without a function. Must look into making it a proper icon and not a button. --- gui/shipBrowser.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/gui/shipBrowser.py b/gui/shipBrowser.py index 0dcc70a4e..4de320b29 100644 --- a/gui/shipBrowser.py +++ b/gui/shipBrowser.py @@ -1369,10 +1369,11 @@ class FitItem(SFItem.SFBrowserItem): self.fitMenu.AppendMenu(wx.ID_ANY, 'Set Booster', boosterMenu) self.mainFrame.additionsPane.gangPage.draggedFitID = self.fitID - self.copyBmp = bitmapLoader.getBitmap("fit_add_small", "icons") - self.renameBmp = bitmapLoader.getBitmap("fit_rename_small", "icons") - self.deleteBmp = bitmapLoader.getBitmap("fit_delete_small","icons") - self.acceptBmp = bitmapLoader.getBitmap("faccept_small", "icons") + self.boosterBmp = bitmapLoader.getBitmap("fleet_fc_small", "icons") + self.copyBmp = bitmapLoader.getBitmap("fit_add_small", "icons") + self.renameBmp = bitmapLoader.getBitmap("fit_rename_small", "icons") + self.deleteBmp = bitmapLoader.getBitmap("fit_delete_small","icons") + self.acceptBmp = bitmapLoader.getBitmap("faccept_small", "icons") self.shipEffBk = bitmapLoader.getBitmap("fshipbk_big","icons") @@ -1399,6 +1400,7 @@ class FitItem(SFItem.SFBrowserItem): self.SetDraggable() + self.boosterBtn = self.toolbar.AddButton(self.boosterBmp,"Booster", show=self.fitBooster) self.toolbar.AddButton(self.copyBmp,"Copy", self.copyBtnCB) self.renameBtn = self.toolbar.AddButton(self.renameBmp,"Rename", self.renameBtnCB) self.toolbar.AddButton(self.deleteBmp, "Delete", self.deleteBtnCB) @@ -1449,7 +1451,7 @@ class FitItem(SFItem.SFBrowserItem): sFit = service.Fit.getInstance() sFit.toggleBoostFit(self.fitID) self.fitBooster = not self.fitBooster - + self.boosterBtn.Show(self.fitBooster) self.fitMenu.Check(self.toggleItem.GetId(), self.fitBooster) wx.PostEvent(self.mainFrame, BoosterListUpdated()) event.Skip() From 5aa34caca6f5927130eb6dafd446bd747c51aae7 Mon Sep 17 00:00:00 2001 From: blitzmann Date: Wed, 26 Feb 2014 00:07:51 -0500 Subject: [PATCH 16/18] Help message in fleet window --- gui/gangView.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/gui/gangView.py b/gui/gangView.py index 1a2e452bc..84aadcc55 100644 --- a/gui/gangView.py +++ b/gui/gangView.py @@ -37,6 +37,11 @@ class GangView ( ScrolledPanel ): self.draggedFitID = None + help = '''Set fit as booster to display in dropdown, or drag fitting from\nship browser to this window, or right click fit and select booster role.''' + helpSizer = wx.BoxSizer( wx.HORIZONTAL ) + self.helpText = wx.StaticText( self, wx.ID_ANY, help, wx.DefaultPosition, wx.DefaultSize, wx.ALIGN_CENTRE ) + helpSizer.Add( self.helpText, 1, wx.ALL, 5 ) + self.FitDNDPopupMenu = wx.Menu() self.options = ["Fleet booster", "Wing booster", "Squad booster"] @@ -109,6 +114,7 @@ class GangView ( ScrolledPanel ): contentFGSizer.Add( self.fleet[id]['chChar'], 0, wx.ALIGN_CENTER_VERTICAL|wx.ALL, 5 ) mainSizer.Add( contentFGSizer, 1, wx.EXPAND, 0 ) + mainSizer.Add( helpSizer, 0, wx.EXPAND, 0 ) self.SetSizer( mainSizer ) self.SetAutoLayout(True) From 035e6cea41634dee803f9c1202f773bed0843b25 Mon Sep 17 00:00:00 2001 From: blitzmann Date: Wed, 26 Feb 2014 00:32:07 -0500 Subject: [PATCH 17/18] Fixes incorrect setting of `draggedFitID` when selecting booster from menu --- gui/gangView.py | 4 ++-- gui/shipBrowser.py | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/gui/gangView.py b/gui/gangView.py index 84aadcc55..589e25924 100644 --- a/gui/gangView.py +++ b/gui/gangView.py @@ -352,7 +352,7 @@ class GangView ( ScrolledPanel ): choice.SetSelection(1) def handleDrag(self, type, fitID): - ''' Handle dragging of fit to fleet interface. This is also fired when right-clicking fit if there's an active one ''' + ''' Handle dragging of fit to fleet interface ''' #Those are drags coming from pyfa sources, NOT builtin wx drags self.draggedFitID = None if type == "fit": @@ -368,7 +368,6 @@ class GangView ( ScrolledPanel ): def OnPopupItemSelected(self, event): ''' Fired when booster popup item is selected ''' - # Get menu selection ID via self.options menuItem = self.FitDNDPopupMenu.FindItemById(event.GetId()) type = self.options.index(menuItem.GetText()) @@ -387,6 +386,7 @@ class GangView ( ScrolledPanel ): # set type via choice box used chFit = event.GetEventObject() fitID = chFit.GetClientData(chFit.GetSelection()) + type = -1 for id in self.fleet: if chFit == self.fleet[id]['chFit']: type = id diff --git a/gui/shipBrowser.py b/gui/shipBrowser.py index 4de320b29..453607a69 100644 --- a/gui/shipBrowser.py +++ b/gui/shipBrowser.py @@ -1367,7 +1367,6 @@ class FitItem(SFItem.SFBrowserItem): self.fitMenu.AppendSeparator() boosterMenu = self.mainFrame.additionsPane.gangPage.FitDNDPopupMenu self.fitMenu.AppendMenu(wx.ID_ANY, 'Set Booster', boosterMenu) - self.mainFrame.additionsPane.gangPage.draggedFitID = self.fitID self.boosterBmp = bitmapLoader.getBitmap("fleet_fc_small", "icons") self.copyBmp = bitmapLoader.getBitmap("fit_add_small", "icons") @@ -1460,6 +1459,8 @@ class FitItem(SFItem.SFBrowserItem): ''' Handles context menu for fit. Dragging is handled by MouseLeftUp() ''' pos = wx.GetMousePosition() pos = self.ScreenToClient(pos) + # Even though we may not select a booster, automatically set this so that the fleet pane knows which fit we're applying + self.mainFrame.additionsPane.gangPage.draggedFitID = self.fitID self.PopupMenu(self.fitMenu, pos) event.Skip() From bf1df978864982461e274d9960161fd236805993 Mon Sep 17 00:00:00 2001 From: blitzmann Date: Mon, 3 Mar 2014 11:38:22 -0500 Subject: [PATCH 18/18] Expand fit choice to available space --- gui/gangView.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gui/gangView.py b/gui/gangView.py index 589e25924..41d7fd429 100644 --- a/gui/gangView.py +++ b/gui/gangView.py @@ -106,11 +106,11 @@ class GangView ( ScrolledPanel ): # add fit text and choice to the fit sizer self.fleet[id]['fitSizer'].Add( self.fleet[id]['stText'], 0, wx.ALIGN_CENTER_VERTICAL|wx.ALL, 5 ) - self.fleet[id]['fitSizer'].Add( self.fleet[id]['chFit'], 0, wx.ALIGN_CENTER_VERTICAL|wx.ALL, 1 ) + self.fleet[id]['fitSizer'].Add( self.fleet[id]['chFit'], 0, wx.ALIGN_CENTER_VERTICAL|wx.ALL|wx.EXPAND, 1 ) # add everything to the content sizer contentFGSizer.Add( self.fleet[id]['stLabel'], 0, wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL|wx.ALL, 5 ) - contentFGSizer.Add( self.fleet[id]['fitSizer'], 1, wx.ALIGN_CENTER_VERTICAL|wx.ALL, 5 ) + contentFGSizer.Add( self.fleet[id]['fitSizer'], 0, wx.ALIGN_CENTER_VERTICAL|wx.ALL|wx.EXPAND, 5 ) contentFGSizer.Add( self.fleet[id]['chChar'], 0, wx.ALIGN_CENTER_VERTICAL|wx.ALL, 5 ) mainSizer.Add( contentFGSizer, 1, wx.EXPAND, 0 )