From d2c7c80b4ca8c82f389fe7c13a16f4efbf223bc8 Mon Sep 17 00:00:00 2001 From: DarkPhoenix Date: Wed, 26 Oct 2011 00:09:41 +0400 Subject: [PATCH 01/55] Update eos, staticdata and market service in chaos branch of pyfa --- eos | 2 +- service/market.py | 9 ++++++++- staticdata | 2 +- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/eos b/eos index eb491d7fb..17cb06be5 160000 --- a/eos +++ b/eos @@ -1 +1 @@ -Subproject commit eb491d7fb59327f940918c0ee65354485e903c2d +Subproject commit 17cb06be5fd0da5bcc852d247675f9d3c3069fe9 diff --git a/service/market.py b/service/market.py index b9d79e64f..0235b7d64 100644 --- a/service/market.py +++ b/service/market.py @@ -186,7 +186,14 @@ class Market(): "Reaper": True, # Noobship "TEST Damage Mod": False, # Marked as published by CCP for whatever reason "Ghost Heavy Missile": False, # Missile used by Sansha - "Nano Paint": False } # It will be used for ship paint job, no use as of today + "Nano Paint": False, # It will be used for ship paint job, no use as of today + "Deimos Old": False, + "Large Shield Transporter II - 5 players": False, + "TEST Damage Mod - 10 Players": False, + "TEST Damage Mod - 20 Players": False, + "TEST Damage Mod - 40 Players": False, + "TEST Damage Mod - 5 Players": False, + "Large Remote Armor Repair System II - 5 players": False } # List of groups which are forcibly published self.GROUPS_FORCEPUBLISHED = { diff --git a/staticdata b/staticdata index 6203f5129..7e1bdbf65 160000 --- a/staticdata +++ b/staticdata @@ -1 +1 @@ -Subproject commit 6203f512935717762b0e7770ffec5cb9f32f5107 +Subproject commit 7e1bdbf653dc79d79d85d1188fb3934a68ca3525 From f48f9952197749bb3932a90ddc45f166ea622e9b Mon Sep 17 00:00:00 2001 From: DarkPhoenix Date: Wed, 26 Oct 2011 00:11:12 +0400 Subject: [PATCH 02/55] Change expansion version to something more applicable --- config.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/config.py b/config.py index 59e0c9c29..2e58900e6 100644 --- a/config.py +++ b/config.py @@ -13,8 +13,8 @@ debug = False # Version data version = "1.0.6" tag = "git" -expansionName = "Incarna" -expansionVersion = "1.1.1" +expansionName = "Chaos" +expansionVersion = "0.0" # You can adjust these paths to your needs From 6fd990c386725ed858cab266c6ee2cc901277a5e Mon Sep 17 00:00:00 2001 From: DarkPhoenix Date: Wed, 2 Nov 2011 02:40:06 +0400 Subject: [PATCH 03/55] Update eos and staticdata in chaos branch --- eos | 2 +- staticdata | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/eos b/eos index 17cb06be5..af442e463 160000 --- a/eos +++ b/eos @@ -1 +1 @@ -Subproject commit 17cb06be5fd0da5bcc852d247675f9d3c3069fe9 +Subproject commit af442e463689737ba143e40087c241e4385cdcf3 diff --git a/staticdata b/staticdata index 7e1bdbf65..2e69c253f 160000 --- a/staticdata +++ b/staticdata @@ -1 +1 @@ -Subproject commit 7e1bdbf653dc79d79d85d1188fb3934a68ca3525 +Subproject commit 2e69c253f0c4fed384cc398ebf22341d41439bd4 From e4bd0cb8bd64aeadd331040739171ee0452bb266 Mon Sep 17 00:00:00 2001 From: DarkPhoenix Date: Wed, 2 Nov 2011 20:17:09 +0400 Subject: [PATCH 04/55] Use better regexps to strip font color tags, do not replace them with bold tags and strip URLs as well --- gui/itemStats.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/gui/itemStats.py b/gui/itemStats.py index 20e4eb26d..16d1ac581 100644 --- a/gui/itemStats.py +++ b/gui/itemStats.py @@ -200,9 +200,11 @@ class ItemDescription ( wx.Panel ): fgcolor = wx.SystemSettings_GetColour(wx.SYS_COLOUR_WINDOWTEXT) self.description = wx.html.HtmlWindow(self) - desc = item.description.replace("\r","
") - desc = re.sub("<( *)font( *)color( *)=(.*)>", "", desc) - desc = re.sub("<( *)/( *)font( *)>","", desc) + desc = item.description.replace("\r", "
") + # Strip font tags + desc = re.sub("<( *)font( *)color( *)=(.*?)>(?P.*?)<( *)/( *)font( *)>", "\g", desc) + # Strip URLs + desc = re.sub("<( *)a(.*?)>(?P.*?)<( *)/( *)a( *)>", "\g", desc) desc = "" + desc + "" self.description.SetPage(desc) From 9d62305aecf5c8d7f55ac309d5977ddcddda79cd Mon Sep 17 00:00:00 2001 From: DarkPhoenix Date: Fri, 4 Nov 2011 18:27:32 +0400 Subject: [PATCH 05/55] Change expansion name to sisi --- config.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config.py b/config.py index 2e58900e6..bb34d9eac 100644 --- a/config.py +++ b/config.py @@ -13,7 +13,7 @@ debug = False # Version data version = "1.0.6" tag = "git" -expansionName = "Chaos" +expansionName = "Singularity" expansionVersion = "0.0" # You can adjust these paths to your needs From 28dec1a0b16f3d72b512a0c4585f0e38c330b6e6 Mon Sep 17 00:00:00 2001 From: DarkPhoenix Date: Fri, 4 Nov 2011 18:27:49 +0400 Subject: [PATCH 06/55] Use singularity staticdata in singularity pyfa branch --- staticdata | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/staticdata b/staticdata index 2e69c253f..89711bf8b 160000 --- a/staticdata +++ b/staticdata @@ -1 +1 @@ -Subproject commit 2e69c253f0c4fed384cc398ebf22341d41439bd4 +Subproject commit 89711bf8bb9cc8ce31c3baeaba17a124731ce8aa From 061d0010d3ed431520447f2f56268b29afafee3d Mon Sep 17 00:00:00 2001 From: DarkPhoenix Date: Fri, 4 Nov 2011 18:32:41 +0400 Subject: [PATCH 07/55] Remove some overrides from service, as they're no longer published or in db at all --- service/market.py | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/service/market.py b/service/market.py index 0235b7d64..b9d79e64f 100644 --- a/service/market.py +++ b/service/market.py @@ -186,14 +186,7 @@ class Market(): "Reaper": True, # Noobship "TEST Damage Mod": False, # Marked as published by CCP for whatever reason "Ghost Heavy Missile": False, # Missile used by Sansha - "Nano Paint": False, # It will be used for ship paint job, no use as of today - "Deimos Old": False, - "Large Shield Transporter II - 5 players": False, - "TEST Damage Mod - 10 Players": False, - "TEST Damage Mod - 20 Players": False, - "TEST Damage Mod - 40 Players": False, - "TEST Damage Mod - 5 Players": False, - "Large Remote Armor Repair System II - 5 players": False } + "Nano Paint": False } # It will be used for ship paint job, no use as of today # List of groups which are forcibly published self.GROUPS_FORCEPUBLISHED = { From 4a17b6a8068ce138983642eaeb8aa8e73559b890 Mon Sep 17 00:00:00 2001 From: DarkPhoenix Date: Fri, 4 Nov 2011 19:59:56 +0400 Subject: [PATCH 08/55] Update eos in singularity pyfa --- eos | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/eos b/eos index af442e463..5ae29eb0f 160000 --- a/eos +++ b/eos @@ -1 +1 @@ -Subproject commit af442e463689737ba143e40087c241e4385cdcf3 +Subproject commit 5ae29eb0ff3474bf0d1e56e0bab44b5c0d9a5f4c From cd0136c59a7d847086e45e0a102b1c74fed76500 Mon Sep 17 00:00:00 2001 From: DarkPhoenix Date: Fri, 18 Nov 2011 19:44:58 +0400 Subject: [PATCH 09/55] Update data to latest singularity state in pyfa --- eos | 2 +- service/market.py | 2 ++ staticdata | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/eos b/eos index 5ae29eb0f..3870eeedf 160000 --- a/eos +++ b/eos @@ -1 +1 @@ -Subproject commit 5ae29eb0ff3474bf0d1e56e0bab44b5c0d9a5f4c +Subproject commit 3870eeedfe81891bcea313f05b67fac9f2cf13f3 diff --git a/service/market.py b/service/market.py index b9d79e64f..d7501c079 100644 --- a/service/market.py +++ b/service/market.py @@ -232,6 +232,8 @@ class Market(): "Civilian Standard Missile Launcher": 760, # Ship Equipment > Civilian Modules "Civilian Stasis Webifier": 760, # Ship Equipment > Civilian Modules "Civilian Warp Disruptor": 760, # Ship Equipment > Civilian Modules + "Hardwiring - Genolution Core Augmentation CA-1": 618, # Implants & Boosters > Implants > Attribute Enhancers > Implant Slot 1 + "Hardwiring - Genolution Core Augmentation CA-2": 621, # Implants & Boosters > Implants > Attribute Enhancers > Implant Slot 4 "Hardwiring - Inherent Implants 'Gentry' ZEX10": 1152, # Implants & Boosters > Implants > Skill Hardwiring > Implant Slot 6 > Armor Implants "Hardwiring - Inherent Implants 'Gentry' ZEX100": 1152, # Implants & Boosters > Implants > Skill Hardwiring > Implant Slot 6 > Armor Implants "Hardwiring - Inherent Implants 'Gentry' ZEX1000": 1152, # Implants & Boosters > Implants > Skill Hardwiring > Implant Slot 6 > Armor Implants diff --git a/staticdata b/staticdata index 89711bf8b..9155bbead 160000 --- a/staticdata +++ b/staticdata @@ -1 +1 @@ -Subproject commit 89711bf8bb9cc8ce31c3baeaba17a124731ce8aa +Subproject commit 9155bbead136b7c1ad2ee2cb9bae637d6d33f2fc From 029940edf323174a1ad7ab26d1c7970690387446 Mon Sep 17 00:00:00 2001 From: DarkPhoenix Date: Fri, 18 Nov 2011 21:17:36 +0400 Subject: [PATCH 10/55] Remove test damage mod from overrides It was un-published by ccp in recent singularity patch --- service/market.py | 1 - 1 file changed, 1 deletion(-) diff --git a/service/market.py b/service/market.py index d7501c079..011c35550 100644 --- a/service/market.py +++ b/service/market.py @@ -184,7 +184,6 @@ class Market(): "Impairor": True, # Noobship "Velator": True, # Noobship "Reaper": True, # Noobship - "TEST Damage Mod": False, # Marked as published by CCP for whatever reason "Ghost Heavy Missile": False, # Missile used by Sansha "Nano Paint": False } # It will be used for ship paint job, no use as of today From 8747be71ac8efde4b7952ebbab7d7f43bdd9a9f6 Mon Sep 17 00:00:00 2001 From: DarkPhoenix Date: Sat, 19 Nov 2011 18:13:13 +0400 Subject: [PATCH 11/55] Add WH support to pyfa --- eos | 2 +- gui/builtinContextMenus/__init__.py | 2 +- gui/builtinContextMenus/whProjector.py | 47 ++++++++++++++++++++++++++ gui/projectedView.py | 11 ++++-- service/fit.py | 4 +++ 5 files changed, 62 insertions(+), 4 deletions(-) create mode 100644 gui/builtinContextMenus/whProjector.py diff --git a/eos b/eos index 3870eeedf..e087b36c3 160000 --- a/eos +++ b/eos @@ -1 +1 @@ -Subproject commit 3870eeedfe81891bcea313f05b67fac9f2cf13f3 +Subproject commit e087b36c3f2a328c56486c5e8f902934586218c1 diff --git a/gui/builtinContextMenus/__init__.py b/gui/builtinContextMenus/__init__.py index 808202464..1497d7452 100644 --- a/gui/builtinContextMenus/__init__.py +++ b/gui/builtinContextMenus/__init__.py @@ -1,2 +1,2 @@ __all__ = ["moduleAmmoPicker", "itemStats", "damagePattern", "marketJump", "droneSplit", - "ammoPattern", "project", "factorReload"] + "ammoPattern", "project", "factorReload", "whProjector"] diff --git a/gui/builtinContextMenus/whProjector.py b/gui/builtinContextMenus/whProjector.py new file mode 100644 index 000000000..1ecf17de4 --- /dev/null +++ b/gui/builtinContextMenus/whProjector.py @@ -0,0 +1,47 @@ +from gui.contextMenu import ContextMenu +import gui.mainFrame +import gui.globalEvents as GE +import service +import wx + +class WhProjector(ContextMenu): + def __init__(self): + self.mainFrame = gui.mainFrame.MainFrame.getInstance() + + def display(self, srcContext, selection): + return srcContext in ("projectedDrone", "projectedModule", "projectedCharge", "projectedFit", "projectedNone") + + def getText(self, itmContext, selection): + return "System effects" + + def activate(self, fullContext, selection, i): + pass + + def getSubMenu(self, context, selection, menu, i): + self.idmap = {} + m = wx.Menu() + sMkt = service.Market.getInstance() + effdata = sMkt.getSystemWideEffects() + for swType in sorted(effdata): + item = wx.MenuItem(m, wx.ID_ANY, swType) + sub = wx.Menu() + sub.Bind(wx.EVT_MENU, self.handleSelection) + item.SetSubMenu(sub) + m.AppendItem(item) + for swData in sorted(effdata[swType], key=lambda tpl: tpl[2]): + wxid = wx.NewId() + swObj, swName, swClass = swData + self.idmap[wxid] = (swObj, swName) + subitem = wx.MenuItem(sub, wxid, swClass) + sub.AppendItem(subitem) + return m + + + def handleSelection(self, event): + swObj, swName = self.idmap[event.Id] + sFit = service.Fit.getInstance() + fitID = self.mainFrame.getActiveFit() + sFit.project(fitID, swObj) + wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=fitID)) + +WhProjector.register() diff --git a/gui/projectedView.py b/gui/projectedView.py index dc64fc423..d380a5a97 100644 --- a/gui/projectedView.py +++ b/gui/projectedView.py @@ -200,11 +200,18 @@ class ProjectedView(d.Display): else: context = (modFullContext,) else: - context = ("projectedFit",) - + context = (("projectedFit",),) menu = ContextMenu.getMenu((item,), *context) if menu is not None: self.PopupMenu(menu) + elif row == -1 and event.Button == 3: + fitID = self.mainFrame.getActiveFit() + if fitID is None: + return + context = (("projectedNone",),) + menu = ContextMenu.getMenu([], *context) + if menu is not None: + self.PopupMenu(menu) def remove(self, event): row, _ = self.HitTest(event.Position) diff --git a/service/fit.py b/service/fit.py index bc001651c..a49e33392 100644 --- a/service/fit.py +++ b/service/fit.py @@ -258,6 +258,10 @@ class Fit(object): fit.projectedDrones.append(drone) drone.amount += 1 + elif thing.group.name == "Effect Beacon": + module = eos.types.Module(thing) + module.state = State.ONLINE + fit.projectedModules.append(module) else: module = eos.types.Module(thing) module.state = State.ACTIVE From c2efe7832eceba1de575a8d5ffa4ff84779024a9 Mon Sep 17 00:00:00 2001 From: DarkPhoenix Date: Sat, 19 Nov 2011 19:19:37 +0400 Subject: [PATCH 12/55] Add proper incursion effects and do not show market group context menu on them --- gui/builtinContextMenus/marketJump.py | 10 +++++++--- gui/builtinContextMenus/whProjector.py | 2 +- service/market.py | 4 ++-- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/gui/builtinContextMenus/marketJump.py b/gui/builtinContextMenus/marketJump.py index c86e42c13..2a2e8c29c 100644 --- a/gui/builtinContextMenus/marketJump.py +++ b/gui/builtinContextMenus/marketJump.py @@ -8,9 +8,13 @@ class MarketJump(ContextMenu): self.mainFrame = gui.mainFrame.MainFrame.getInstance() def display(self, srcContext, selection): - return srcContext in ("marketItemMisc", "fittingModule", "fittingCharge", "droneItem", - "implantItem", "boosterItem", "projectedModule", "projectedDrone", "projectedCharge") \ - and (not selection[0].isEmpty if srcContext == "fittingModule" else True) + validContexts = ("marketItemMisc", "fittingModule", "fittingCharge", "droneItem", "implantItem", + "boosterItem", "projectedModule", "projectedDrone", "projectedCharge") + sMkt = service.Market.getInstance() + item = getattr(selection[0], "item", selection[0]) + doit = srcContext in validContexts and (not selection[0].isEmpty if srcContext == "fittingModule" else True) \ + and sMkt.getMarketGroupByItem(item) is not None + return doit def getText(self, itmContext, selection): return "{0} Market Group".format(itmContext if itmContext is not None else "Item") diff --git a/gui/builtinContextMenus/whProjector.py b/gui/builtinContextMenus/whProjector.py index 1ecf17de4..bf5696252 100644 --- a/gui/builtinContextMenus/whProjector.py +++ b/gui/builtinContextMenus/whProjector.py @@ -12,7 +12,7 @@ class WhProjector(ContextMenu): return srcContext in ("projectedDrone", "projectedModule", "projectedCharge", "projectedFit", "projectedNone") def getText(self, itmContext, selection): - return "System effects" + return "Add System Effects" def activate(self, fullContext, selection, i): pass diff --git a/service/market.py b/service/market.py index 011c35550..2e33a8dce 100644 --- a/service/market.py +++ b/service/market.py @@ -682,9 +682,9 @@ class Market(): "Pulsar Effect Beacon", "Red Giant Beacon", "Wolf Rayet Effect Beacon", - "Incursion Effect") + "Incursion ship attributes effects") # Stuff we don't want to see in names - garbages = ("Effect", "Beacon") + garbages = ("Effect", "Beacon", "ship attributes effects") # Get group with all the system-wide beacons grp = self.getGroup("Effect Beacon") beacons = self.getItemsByGroup(grp) From cbe11813372f73424f9d1ee5acbc32baf3d8b44f Mon Sep 17 00:00:00 2001 From: DarkPhoenix Date: Sat, 19 Nov 2011 19:32:07 +0400 Subject: [PATCH 13/55] Fix RMB on empty place of projected pane --- gui/builtinContextMenus/marketJump.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/gui/builtinContextMenus/marketJump.py b/gui/builtinContextMenus/marketJump.py index 2a2e8c29c..d999cf27f 100644 --- a/gui/builtinContextMenus/marketJump.py +++ b/gui/builtinContextMenus/marketJump.py @@ -11,6 +11,8 @@ class MarketJump(ContextMenu): validContexts = ("marketItemMisc", "fittingModule", "fittingCharge", "droneItem", "implantItem", "boosterItem", "projectedModule", "projectedDrone", "projectedCharge") sMkt = service.Market.getInstance() + if selection is None or len(selection) < 1: + return False item = getattr(selection[0], "item", selection[0]) doit = srcContext in validContexts and (not selection[0].isEmpty if srcContext == "fittingModule" else True) \ and sMkt.getMarketGroupByItem(item) is not None From 02af320c25539d7cda317d139e5d2e0fbeb7270a Mon Sep 17 00:00:00 2001 From: DarkPhoenix Date: Sat, 19 Nov 2011 19:45:46 +0400 Subject: [PATCH 14/55] Update eos in pyfa --- eos | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/eos b/eos index e087b36c3..7200ce899 160000 --- a/eos +++ b/eos @@ -1 +1 @@ -Subproject commit e087b36c3f2a328c56486c5e8f902934586218c1 +Subproject commit 7200ce899bafa2f89d7e51d7ed49865198ac32ee From b6128f7a6179fa924835a69e689e47a59110881b Mon Sep 17 00:00:00 2001 From: DarkPhoenix Date: Sat, 19 Nov 2011 20:29:53 +0400 Subject: [PATCH 15/55] Update eos in pyfa --- eos | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/eos b/eos index 7200ce899..ffc7b46b8 160000 --- a/eos +++ b/eos @@ -1 +1 @@ -Subproject commit 7200ce899bafa2f89d7e51d7ed49865198ac32ee +Subproject commit ffc7b46b83df63ba015911dfe19560d88d36a709 From 0ee607664a3fb66d6d787612521f79a0c500a193 Mon Sep 17 00:00:00 2001 From: DarkPhoenix Date: Sat, 19 Nov 2011 20:35:24 +0400 Subject: [PATCH 16/55] Disallow fit self-projection --- service/fit.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/service/fit.py b/service/fit.py index a49e33392..e187ca56c 100644 --- a/service/fit.py +++ b/service/fit.py @@ -245,6 +245,8 @@ class Fit(object): def project(self, fitID, thing): fit = eos.db.getFit(fitID) if isinstance(thing, eos.types.Fit): + if thing.ID == fitID: + return fit.projectedFits.append(thing) elif thing.category.name == "Drone": drone = None From 4ddfe0d49ce4ce6ccd2b39a667797891fcab8c84 Mon Sep 17 00:00:00 2001 From: DarkPhoenix Date: Sat, 19 Nov 2011 20:43:01 +0400 Subject: [PATCH 17/55] Update eos in pyfa --- eos | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/eos b/eos index ffc7b46b8..f9c2f27c7 160000 --- a/eos +++ b/eos @@ -1 +1 @@ -Subproject commit ffc7b46b83df63ba015911dfe19560d88d36a709 +Subproject commit f9c2f27c7986924bec684575e08a0fa897a4546f From 294e4eeb554feacadc50494825ff96121b2683c3 Mon Sep 17 00:00:00 2001 From: DarkPhoenix Date: Sun, 20 Nov 2011 23:09:33 +0400 Subject: [PATCH 18/55] Add check when adding drones in pyfa, and update eos --- eos | 2 +- service/fit.py | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/eos b/eos index f9c2f27c7..9f5b45ead 160000 --- a/eos +++ b/eos @@ -1 +1 @@ -Subproject commit f9c2f27c7986924bec684575e08a0fa897a4546f +Subproject commit 9f5b45eadab5997d94e5171d0d88fb73867b72bc diff --git a/service/fit.py b/service/fit.py index e187ca56c..c13664f05 100644 --- a/service/fit.py +++ b/service/fit.py @@ -371,8 +371,10 @@ class Fit(object): if drone is None: drone = eos.types.Drone(item) - fit.drones.append(drone) - + if drone.fits(fit) is True: + fit.drones.append(drone) + else: + return False drone.amount += 1 eos.db.commit() fit.clear() From 97f3ccb0f79c9528574d213320565d127739451f Mon Sep 17 00:00:00 2001 From: HomeWorld Date: Sat, 19 Nov 2011 22:46:44 +0200 Subject: [PATCH 19/55] Preliminary gang UI stuff --- gui/additionsPane.py | 4 + gui/gangView.py | 187 +++++++++++++++++++++++++++++++++++++++++++ gui/shipBrowser.py | 7 ++ 3 files changed, 198 insertions(+) create mode 100644 gui/gangView.py diff --git a/gui/additionsPane.py b/gui/additionsPane.py index d6f955446..64df7090d 100644 --- a/gui/additionsPane.py +++ b/gui/additionsPane.py @@ -24,6 +24,7 @@ from gui.droneView import DroneView from gui.implantView import ImplantView from gui.projectedView import ProjectedView from gui.pyfatogglepanel import TogglePanel +from gui.gangView import GangView from gui import bitmapLoader import gui.chromeTabs @@ -60,6 +61,9 @@ class AdditionsPane(TogglePanel): self.projectedPage = ProjectedView(self.notebook) self.notebook.AddPage(self.projectedPage, "Projected", tabImage = projectedImg, showClose = False) + + self.gangPage = GangView(self.notebook) + self.notebook.AddPage(self.gangPage, "Gang", showClose = False) self.notebook.SetSelection(0) diff --git a/gui/gangView.py b/gui/gangView.py new file mode 100644 index 000000000..493828803 --- /dev/null +++ b/gui/gangView.py @@ -0,0 +1,187 @@ +#=============================================================================== +# Copyright (C) 2010 Diego Duclos +# +# This file is part of pyfa. +# +# pyfa is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# pyfa is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with pyfa. If not, see . +#=============================================================================== +import wx +from wx.lib.scrolledpanel import ScrolledPanel + +import service +import gui.mainFrame +import gui.globalEvents as GE + +from gui import characterEditor as CharEditor + +class GangView ( ScrolledPanel ): + + def __init__( self, parent ): + ScrolledPanel.__init__ ( self, parent, id = wx.ID_ANY, pos = wx.DefaultPosition, size = wx.Size( 691,172 ), style = wx.TAB_TRAVERSAL ) + mainSizer = wx.BoxSizer( wx.VERTICAL ) + + self.mainFrame = gui.mainFrame.MainFrame.getInstance() + + self.draggedFitID = None + + self.FitDNDPopupMenu = wx.Menu() + + self.options = ["Fleet booster", "Wing booster", "Squad booster"] + + for option in self.options: + item = self.FitDNDPopupMenu.Append(-1, option) + self.Bind(wx.EVT_MENU, self.OnPopupItemSelected, item) + + contentFGSizer = wx.FlexGridSizer( 5, 3, 0, 0 ) + contentFGSizer.AddGrowableCol( 1 ) + contentFGSizer.SetFlexibleDirection( wx.BOTH ) + contentFGSizer.SetNonFlexibleGrowMode( wx.FLEX_GROWMODE_SPECIFIED ) + + 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 ) + + self.stFits = wx.StaticText( self, wx.ID_ANY, u"Fits", wx.DefaultPosition, wx.DefaultSize, 0 ) + self.stFits.Wrap( -1 ) + contentFGSizer.Add( self.stFits, 0, wx.ALIGN_CENTER_VERTICAL|wx.ALIGN_CENTER_HORIZONTAL, 5 ) + + self.stCharacters = wx.StaticText( self, wx.ID_ANY, u"Characters", wx.DefaultPosition, wx.DefaultSize, 0 ) + self.stCharacters.Wrap( -1 ) + contentFGSizer.Add( self.stCharacters, 0, wx.ALIGN_CENTER_VERTICAL|wx.ALIGN_CENTER_HORIZONTAL, 5 ) + + self.m_staticline2 = wx.StaticLine( self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.LI_HORIZONTAL ) + contentFGSizer.Add( self.m_staticline2, 0, wx.EXPAND, 5 ) + + self.m_staticline3 = wx.StaticLine( self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.LI_HORIZONTAL ) + contentFGSizer.Add( self.m_staticline3, 0, wx.EXPAND, 5 ) + + 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", wx.DefaultPosition, wx.DefaultSize, 0 ) + self.stFleet.Wrap( -1 ) + self.stFleet.SetFont( wx.Font( wx.NORMAL_FONT.GetPointSize(), 70, 90, 90, False, wx.EmptyString ) ) + + contentFGSizer.Add( self.stFleet, 0, wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL|wx.ALL, 5 ) + + self.stFleetFit = wx.StaticText( self, wx.ID_ANY, u"None", wx.DefaultPosition, wx.DefaultSize, 0 ) + self.stFleetFit.Wrap( -1 ) + self.stFleetFit.SetFont( wx.Font( wx.NORMAL_FONT.GetPointSize(), 70, 90, 90, False, wx.EmptyString ) ) + + contentFGSizer.Add( self.stFleetFit, 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.EXPAND|wx.ALL, 5 ) + + self.stWing = wx.StaticText( self, wx.ID_ANY, u"Wing", wx.DefaultPosition, wx.DefaultSize, 0 ) + self.stWing.Wrap( -1 ) + 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 ) + contentFGSizer.Add( self.stWingFit, 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.EXPAND, 5 ) + + self.stSquad = wx.StaticText( self, wx.ID_ANY, u"Squad", wx.DefaultPosition, wx.DefaultSize, 0 ) + self.stSquad.Wrap( -1 ) + 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 ) + contentFGSizer.Add( self.stSquadFit, 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.EXPAND|wx.ALL, 5 ) + + mainSizer.Add( contentFGSizer, 0, 0, 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.SetSizer( mainSizer ) + self.SetAutoLayout(1) + self.SetupScrolling() + + self.mainFrame.Bind(CharEditor.CHAR_LIST_UPDATED, self.RefreshCharacterList) + self.RefreshCharacterList() + + def RefreshCharacterList(self, event = None): + cChar = service.Character.getInstance() + charList = cChar.getCharacterList() + + for choice in self.chCharacters: + chCurrSelection = choice.GetSelection() + chCurrData = -1 + if chCurrSelection != -1: + chCurrData = choice.GetClientData(chCurrSelection) + chCurrSelString = choice.GetString(chCurrSelection) + choice.Clear() + currSelFound = False + for char in charList: + id,name,_ = char + choice.Append(name, id) + if chCurrData == id: + currSelFound = True + + if chCurrSelection == -1: + choice.SetSelection(1) + else: + if currSelFound: + choice.SetStringSelection(chCurrSelString) + else: + choice.SetSelection(1) + + def handleDrag(self, type, fitID): + #Those are drags coming from pyfa sources, NOT builtin wx drags + self.draggedFitID = None + if type == "fit": + activeFit = self.mainFrame.getActiveFit() + if activeFit: + self.draggedFitID = fitID + + pos = wx.GetMousePosition() + pos = self.ScreenToClient(pos) + + self.PopupMenu(self.FitDNDPopupMenu, pos) + +# sFit.project(activeFit,draggedFit) +# wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=activeFit)) + + def OnPopupItemSelected(self, event): + item = self.FitDNDPopupMenu.FindItemById(event.GetId()) + text = item.GetText() + booster = self.options.index(text) + if self.draggedFitID: + sFit = service.Fit.getInstance() + draggedFit = sFit.getFit(self.draggedFitID) + + self.stBoosters[booster].SetLabel(draggedFit.name) + self.Layout() + diff --git a/gui/shipBrowser.py b/gui/shipBrowser.py index 83ce2c84e..94763d5c6 100644 --- a/gui/shipBrowser.py +++ b/gui/shipBrowser.py @@ -1427,6 +1427,13 @@ class FitItem(SFItem.SFBrowserItem): self.selTimer = wx.Timer(self,self.selTimerID) self.selTimer.Start(100) + self.Bind(wx.EVT_RIGHT_UP, self.OnContextMenu) + + def OnContextMenu(self, event): + self.mainFrame.additionsPane.gangPage.handleDrag("fit", self.fitID) + + event.Skip() + def GetType(self): return 3 From 7990aa07e31315ac8218e90969bee73a96b8602d Mon Sep 17 00:00:00 2001 From: DarkPhoenix Date: Mon, 21 Nov 2011 21:11:22 +0400 Subject: [PATCH 20/55] Add service functions for The Stupid Fleet Boosting and update eos as we need it --- eos | 2 +- service/fit.py | 4 +++ service/fleet.py | 70 +++++++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 74 insertions(+), 2 deletions(-) diff --git a/eos b/eos index 9f5b45ead..40c99f0d1 160000 --- a/eos +++ b/eos @@ -1 +1 @@ -Subproject commit 9f5b45eadab5997d94e5171d0d88fb73867b72bc +Subproject commit 40c99f0d13751e0396ec58514a116ea7c460eef3 diff --git a/service/fit.py b/service/fit.py index c13664f05..401ffeb07 100644 --- a/service/fit.py +++ b/service/fit.py @@ -32,6 +32,7 @@ from eos.types import State, Slot from service.market import Market from service.damagePattern import DamagePattern from service.character import Character +from service.fleet import Fleet class FitBackupThread(threading.Thread): def __init__(self, path, callback): @@ -174,6 +175,9 @@ class Fit(object): return None fit = eos.db.getFit(fitID) + sFlt = Fleet.getInstance() + if sFlt.isInLinearFleet(fit) is False: + sFlt.removeAssociatedFleetData(fit) fit.calculateModifiedAttributes() fit.fill() eos.db.commit() diff --git a/service/fleet.py b/service/fleet.py index a4116d734..8f1beac2e 100644 --- a/service/fleet.py +++ b/service/fleet.py @@ -18,7 +18,7 @@ #=============================================================================== import eos.db -from eos.types import Fleet as Fleet_ +from eos.types import Fleet as Fleet_, Wing, Squad import copy class Fleet(object): @@ -69,3 +69,71 @@ class Fleet(object): def deleteFleetByID(self, ID): fleet = self.getFleetByID(ID) self.deleteFleet(fleet) + + def makeLinearFleet(self, fit): + f = Fleet_() + w = Wing() + f.wings.append(w) + s = Squad() + w.squads.append(s) + s.members.append(fit) + eos.db.save(f) + + def setLinearFleetCom(self, boostee, booster): + squadIDs = set(eos.db.getSquadsIDsWithFitID(boostee.ID)) + squad = eos.db.getSquad(squadIDs.pop()) + squad.wing.gang.leader = booster + squad.wing.gang.calculateModifiedAttributes() + + def setLinearWingCom(self, boostee, booster): + squadIDs = set(eos.db.getSquadsIDsWithFitID(boostee.ID)) + squad = eos.db.getSquad(squadIDs.pop()) + squad.wing.leader = booster + squad.wing.gang.calculateModifiedAttributes() + + def setLinearSquadCom(self, boostee, booster): + squadIDs = set(eos.db.getSquadsIDsWithFitID(boostee.ID)) + squad = eos.db.getSquad(squadIDs.pop()) + squad.leader = booster + squad.wing.gang.calculateModifiedAttributes() + + def isInLinearFleet(self, fit): + sqIDs = eos.db.getSquadsIDsWithFitID(fit.ID) + if len(sqIDs) != 1: + return False + s = eos.db.getSquad(sqIDs[0]) + if len(s.members) != 1: + return False + w = s.wing + if len(w.squads) != 1: + return False + f = w.gang + if len(f.wings) != 1: + return False + return True + + def removeAssociatedFleetData(self, fit): + squadIDs = set(eos.db.getSquadsIDsWithFitID(fit.ID)) + if len(squadIDs) == 0: + return + squads = list(eos.db.getSquad(sqID) for sqID in squadIDs) + wingIDs = set(squad.wing.ID for squad in squads) + fleetIDs = set(squad.wing.gang.ID for squad in squads) + for fleetID in fleetIDs: + fleet = eos.db.getFleet(fleetID) + for wing in fleet.wings: + wingIDs.add(wing.ID) + for wingID in wingIDs: + wing = eos.db.getWing(wingID) + for squad in wing.squads: + squadIDs.add(squad.ID) + for squadID in squadIDs: + squad = eos.db.getSquad(squadID) + eos.db.remove(squad) + for wingID in wingIDs: + wing = eos.db.getWing(wingID) + eos.db.remove(wing) + for fleetID in fleetIDs: + fleet = eos.db.getFleet(fleetID) + eos.db.remove(fleet) + return From 69ba6c779270a47502efc3624ecb459754dde697 Mon Sep 17 00:00:00 2001 From: DarkPhoenix Date: Mon, 21 Nov 2011 21:19:04 +0400 Subject: [PATCH 21/55] Remove fleet structure automatically, when last booster is removed --- service/fleet.py | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/service/fleet.py b/service/fleet.py index 8f1beac2e..120689f38 100644 --- a/service/fleet.py +++ b/service/fleet.py @@ -83,19 +83,28 @@ class Fleet(object): squadIDs = set(eos.db.getSquadsIDsWithFitID(boostee.ID)) squad = eos.db.getSquad(squadIDs.pop()) squad.wing.gang.leader = booster - squad.wing.gang.calculateModifiedAttributes() + if self.anyBoosters(squad): + squad.wing.gang.calculateModifiedAttributes() + else: + self.removeAssociatedFleetData(boostee) def setLinearWingCom(self, boostee, booster): squadIDs = set(eos.db.getSquadsIDsWithFitID(boostee.ID)) squad = eos.db.getSquad(squadIDs.pop()) squad.wing.leader = booster - squad.wing.gang.calculateModifiedAttributes() + if self.anyBoosters(squad): + squad.wing.gang.calculateModifiedAttributes() + else: + self.removeAssociatedFleetData(boostee) def setLinearSquadCom(self, boostee, booster): squadIDs = set(eos.db.getSquadsIDsWithFitID(boostee.ID)) squad = eos.db.getSquad(squadIDs.pop()) squad.leader = booster - squad.wing.gang.calculateModifiedAttributes() + if self.anyBoosters(squad): + squad.wing.gang.calculateModifiedAttributes() + else: + self.removeAssociatedFleetData(boostee) def isInLinearFleet(self, fit): sqIDs = eos.db.getSquadsIDsWithFitID(fit.ID) @@ -137,3 +146,10 @@ class Fleet(object): fleet = eos.db.getFleet(fleetID) eos.db.remove(fleet) return + + def anyBoosters(self, squad): + wing = squad.wing + fleet = wing.gang + if squad.leader is None and wing.leader is None and fleet.leader is None: + return False + return True From 5c039579bb74fe57e120061df3c8e2a5debdfd40 Mon Sep 17 00:00:00 2001 From: DarkPhoenix Date: Mon, 21 Nov 2011 21:22:20 +0400 Subject: [PATCH 22/55] Also create fleet automatically on booster assignments --- service/fleet.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/service/fleet.py b/service/fleet.py index 120689f38..f2b6d87aa 100644 --- a/service/fleet.py +++ b/service/fleet.py @@ -80,6 +80,9 @@ class Fleet(object): eos.db.save(f) def setLinearFleetCom(self, boostee, booster): + if self.isInLinearFleet(boostee) is False: + self.removeAssociatedFleetData(boostee) + self.makeLinearFleet(boostee) squadIDs = set(eos.db.getSquadsIDsWithFitID(boostee.ID)) squad = eos.db.getSquad(squadIDs.pop()) squad.wing.gang.leader = booster @@ -89,6 +92,9 @@ class Fleet(object): self.removeAssociatedFleetData(boostee) def setLinearWingCom(self, boostee, booster): + if self.isInLinearFleet(boostee) is False: + self.removeAssociatedFleetData(boostee) + self.makeLinearFleet(boostee) squadIDs = set(eos.db.getSquadsIDsWithFitID(boostee.ID)) squad = eos.db.getSquad(squadIDs.pop()) squad.wing.leader = booster @@ -98,6 +104,9 @@ class Fleet(object): self.removeAssociatedFleetData(boostee) def setLinearSquadCom(self, boostee, booster): + if self.isInLinearFleet(boostee) is False: + self.removeAssociatedFleetData(boostee) + self.makeLinearFleet(boostee) squadIDs = set(eos.db.getSquadsIDsWithFitID(boostee.ID)) squad = eos.db.getSquad(squadIDs.pop()) squad.leader = booster From e590b5b59df9ed79f9bfa57fc7cf18db4f592464 Mon Sep 17 00:00:00 2001 From: DarkPhoenix Date: Mon, 21 Nov 2011 21:26:29 +0400 Subject: [PATCH 23/55] Disallow self-boosting --- service/fleet.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/service/fleet.py b/service/fleet.py index f2b6d87aa..9d6c290f4 100644 --- a/service/fleet.py +++ b/service/fleet.py @@ -80,6 +80,8 @@ class Fleet(object): eos.db.save(f) def setLinearFleetCom(self, boostee, booster): + if boostee == booster: + return if self.isInLinearFleet(boostee) is False: self.removeAssociatedFleetData(boostee) self.makeLinearFleet(boostee) @@ -92,6 +94,8 @@ class Fleet(object): self.removeAssociatedFleetData(boostee) def setLinearWingCom(self, boostee, booster): + if boostee == booster: + return if self.isInLinearFleet(boostee) is False: self.removeAssociatedFleetData(boostee) self.makeLinearFleet(boostee) @@ -104,6 +108,8 @@ class Fleet(object): self.removeAssociatedFleetData(boostee) def setLinearSquadCom(self, boostee, booster): + if boostee == booster: + return if self.isInLinearFleet(boostee) is False: self.removeAssociatedFleetData(boostee) self.makeLinearFleet(boostee) From 4be9ae60e14dba4b3fa9e2398b3756b92c39ffe6 Mon Sep 17 00:00:00 2001 From: DarkPhoenix Date: Mon, 21 Nov 2011 21:39:58 +0400 Subject: [PATCH 24/55] Add all5-getters for pyfa --- service/character.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/service/character.py b/service/character.py index 1ba310746..20c06c26c 100644 --- a/service/character.py +++ b/service/character.py @@ -40,6 +40,14 @@ class Character(): def all0ID(self): return self.all0().ID + def all5(self): + all5 = eos.types.Character.getAll5() + eos.db.commit() + return all5 + + def all5ID(self): + return self.all5().ID + def getCharacterList(self): baseChars = [eos.types.Character.getAll0(), eos.types.Character.getAll5()] # Flush incase all0 & all5 weren't in the db yet From 670ccc90b9da9e3403fbf29bdfb1d1b466b630ce Mon Sep 17 00:00:00 2001 From: DarkPhoenix Date: Mon, 21 Nov 2011 21:40:43 +0400 Subject: [PATCH 25/55] Update eos in pyfa --- eos | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/eos b/eos index 40c99f0d1..031309407 160000 --- a/eos +++ b/eos @@ -1 +1 @@ -Subproject commit 40c99f0d13751e0396ec58514a116ea7c460eef3 +Subproject commit 031309407378f17f8fac4068c51128bee3fa3bec From 9075ae23fbab6ea776b3fa39e2d64f9fa98a96c4 Mon Sep 17 00:00:00 2001 From: DarkPhoenix Date: Tue, 22 Nov 2011 00:29:02 +0400 Subject: [PATCH 26/55] Add method to load fleet data of the fit --- service/fleet.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/service/fleet.py b/service/fleet.py index 9d6c290f4..243f1eab0 100644 --- a/service/fleet.py +++ b/service/fleet.py @@ -168,3 +168,12 @@ class Fleet(object): if squad.leader is None and wing.leader is None and fleet.leader is None: return False return True + + def loadLinearFleet(self, fit): + if self.isInLinearFleet(fit) is False: + return None + squadID = eos.db.getSquadsIDsWithFitID(fit.ID)[0] + s = eos.db.getSquad(squadID) + w = s.wing + f = w.gang + return (f.leader, w.leader, s.leader) From 421229983cccc86b359e9ee8191e1055af78e902 Mon Sep 17 00:00:00 2001 From: DarkPhoenix Date: Tue, 22 Nov 2011 00:55:48 +0400 Subject: [PATCH 27/55] Move context check for market group menu to earlier stage --- gui/builtinContextMenus/marketJump.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/gui/builtinContextMenus/marketJump.py b/gui/builtinContextMenus/marketJump.py index d999cf27f..57576813b 100644 --- a/gui/builtinContextMenus/marketJump.py +++ b/gui/builtinContextMenus/marketJump.py @@ -10,11 +10,13 @@ class MarketJump(ContextMenu): def display(self, srcContext, selection): validContexts = ("marketItemMisc", "fittingModule", "fittingCharge", "droneItem", "implantItem", "boosterItem", "projectedModule", "projectedDrone", "projectedCharge") + if not srcContext in validContexts: + return False sMkt = service.Market.getInstance() if selection is None or len(selection) < 1: return False item = getattr(selection[0], "item", selection[0]) - doit = srcContext in validContexts and (not selection[0].isEmpty if srcContext == "fittingModule" else True) \ + doit = not selection[0].isEmpty if srcContext == "fittingModule" else True \ and sMkt.getMarketGroupByItem(item) is not None return doit From 8066cb208c9cdc592b8c92ddc710d3b442775135 Mon Sep 17 00:00:00 2001 From: HomeWorld Date: Mon, 21 Nov 2011 23:17:07 +0200 Subject: [PATCH 28/55] Fleet GUI bindings to service --- gui/gangView.py | 29 +++++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/gui/gangView.py b/gui/gangView.py index 493828803..51392868b 100644 --- a/gui/gangView.py +++ b/gui/gangView.py @@ -25,6 +25,7 @@ import gui.globalEvents as GE from gui import characterEditor as CharEditor + class GangView ( ScrolledPanel ): def __init__( self, parent ): @@ -132,6 +133,28 @@ class GangView ( ScrolledPanel ): self.mainFrame.Bind(CharEditor.CHAR_LIST_UPDATED, self.RefreshCharacterList) self.RefreshCharacterList() + def AddCommander(self, fitID, type = None): + if type is None: + return + + activeFitID = self.mainFrame.getActiveFit() + if activeFitID: + sFit = service.Fit.getInstance() + + boostee = sFit.getFit(activeFitID) + booster = sFit.getFit(fitID) + + 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) + + wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=activeFitID)) + def RefreshCharacterList(self, event = None): cChar = service.Character.getInstance() charList = cChar.getCharacterList() @@ -182,6 +205,8 @@ class GangView ( ScrolledPanel ): sFit = service.Fit.getInstance() draggedFit = sFit.getFit(self.draggedFitID) - self.stBoosters[booster].SetLabel(draggedFit.name) - self.Layout() + self.stBoosters[booster].SetLabel(draggedFit.name) + self.Layout() + + self.AddCommander(draggedFit.ID, booster) From bb44b674d830ff958677d43f4641f44314934144 Mon Sep 17 00:00:00 2001 From: DarkPhoenix Date: Tue, 22 Nov 2011 01:22:55 +0400 Subject: [PATCH 29/55] Add method to recalculate fleet --- service/fleet.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/service/fleet.py b/service/fleet.py index 243f1eab0..f29ef5edb 100644 --- a/service/fleet.py +++ b/service/fleet.py @@ -104,6 +104,7 @@ class Fleet(object): squad.wing.leader = booster if self.anyBoosters(squad): squad.wing.gang.calculateModifiedAttributes() + boostee.calculateModifiedAttributes() else: self.removeAssociatedFleetData(boostee) @@ -177,3 +178,7 @@ class Fleet(object): w = s.wing f = w.gang return (f.leader, w.leader, s.leader) + + def recalcFleet(self, fit): + squadID = eos.db.getSquadsIDsWithFitID(fit.ID)[0] + eos.db.getSquad(squadID).wing.gang.calculateModifiedAttributes() From 38042fc69a55757fa4351aefa5847d0b296697a0 Mon Sep 17 00:00:00 2001 From: HomeWorld Date: Mon, 21 Nov 2011 23:58:58 +0200 Subject: [PATCH 30/55] Load and display fleet stuff when fit gets changed (loaded) --- gui/gangView.py | 46 +++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 43 insertions(+), 3 deletions(-) diff --git a/gui/gangView.py b/gui/gangView.py index 51392868b..a797825fa 100644 --- a/gui/gangView.py +++ b/gui/gangView.py @@ -21,6 +21,7 @@ from wx.lib.scrolledpanel import ScrolledPanel import service import gui.mainFrame +import gui.shipBrowser import gui.globalEvents as GE from gui import characterEditor as CharEditor @@ -131,8 +132,47 @@ class GangView ( ScrolledPanel ): self.SetupScrolling() self.mainFrame.Bind(CharEditor.CHAR_LIST_UPDATED, self.RefreshCharacterList) + self.mainFrame.Bind(GE.FIT_CHANGED, self.fitSelected) self.RefreshCharacterList() + def fitSelected(self, event): + cFit = service.Fit.getInstance() + fit = cFit.getFit(event.fitID) + fleetSrv = service.Fleet.getInstance() + + activeFitID = self.mainFrame.getActiveFit() + if activeFitID: + commanders = fleetSrv.loadLinearFleet(fit) + if commanders is None: + fleetCom, wingCom, squadCom = (None, None, None) + else: + fleetCom, wingCom, squadCom = commanders + + if fleetCom: + fleetComName = fleetCom.name + else: + fleetComName = "None" + + if wingCom: + wingComName = wingCom.name + else: + wingComName = "None" + + if squadCom: + squadComName = squadCom.name + else: + squadComName = "None" + + self.UpdateFleetFitsUI( fleetComName, wingComName, squadComName ) + + def UpdateFleetFitsUI(self, fleet, wing, squad): + self.stFleetFit.SetLabel(fleet) + self.stWingFit.SetLabel(wing) + self.stSquadFit.SetLabel(squad) + + self.Layout() + + def AddCommander(self, fitID, type = None): if type is None: return @@ -152,7 +192,7 @@ class GangView ( ScrolledPanel ): fleetSrv.setLinearWingCom(boostee, booster) elif type == 2: fleetSrv.setLinearSquadCom(boostee, booster) - + fleetSrv.recalcFleet(boostee) wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=activeFitID)) def RefreshCharacterList(self, event = None): @@ -205,8 +245,8 @@ class GangView ( ScrolledPanel ): sFit = service.Fit.getInstance() draggedFit = sFit.getFit(self.draggedFitID) - self.stBoosters[booster].SetLabel(draggedFit.name) - self.Layout() +# self.stBoosters[booster].SetLabel(draggedFit.name) +# self.Layout() self.AddCommander(draggedFit.ID, booster) From 1f62183f5a99e20171579edb9cff119c4648451b Mon Sep 17 00:00:00 2001 From: HomeWorld Date: Tue, 22 Nov 2011 00:12:33 +0200 Subject: [PATCH 31/55] Add booster remove support (dbclick on booster fit name) --- config.py | 2 +- gui/gangView.py | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/config.py b/config.py index bb34d9eac..b22774482 100644 --- a/config.py +++ b/config.py @@ -8,7 +8,7 @@ except ImportError: configforced = None # Turns on debug mode -debug = False +debug = True # Version data version = "1.0.6" diff --git a/gui/gangView.py b/gui/gangView.py index a797825fa..2f7b4696d 100644 --- a/gui/gangView.py +++ b/gui/gangView.py @@ -133,8 +133,42 @@ class GangView ( ScrolledPanel ): self.mainFrame.Bind(CharEditor.CHAR_LIST_UPDATED, self.RefreshCharacterList) self.mainFrame.Bind(GE.FIT_CHANGED, self.fitSelected) + + for stBooster in self.stBoosters: + stBooster.Bind(wx.EVT_LEFT_DCLICK, self.RemoveBooster) + self.RefreshCharacterList() + def RemoveBooster(self, event): + activeFitID = self.mainFrame.getActiveFit() + if not activeFitID: + return + + location = event.GetEventObject() + + 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) + booster = None + + 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) + + fleetSrv.recalcFleet(boostee) + wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=activeFitID)) + def fitSelected(self, event): cFit = service.Fit.getInstance() fit = cFit.getFit(event.fitID) From 76afb6286a56e01c6ea96ddaf2ed07a3e659df40 Mon Sep 17 00:00:00 2001 From: DarkPhoenix Date: Tue, 22 Nov 2011 02:14:05 +0400 Subject: [PATCH 32/55] Silently discard self-projection, instead of traceback on recalculation attempt --- service/fleet.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/service/fleet.py b/service/fleet.py index f29ef5edb..6f266c8a2 100644 --- a/service/fleet.py +++ b/service/fleet.py @@ -180,5 +180,6 @@ class Fleet(object): return (f.leader, w.leader, s.leader) def recalcFleet(self, fit): - squadID = eos.db.getSquadsIDsWithFitID(fit.ID)[0] - eos.db.getSquad(squadID).wing.gang.calculateModifiedAttributes() + squadIDs = eos.db.getSquadsIDsWithFitID(fit.ID) + if len(squadIDs) > 0: + eos.db.getSquad(squadIDs[0]).wing.gang.calculateModifiedAttributes() From d5e46b457da4fa5117b30a108d5025cd894db32a Mon Sep 17 00:00:00 2001 From: DarkPhoenix Date: Tue, 22 Nov 2011 02:57:15 +0400 Subject: [PATCH 33/55] Modify service to use custom fleet structure --- eos | 2 +- service/fleet.py | 13 ++++++++----- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/eos b/eos index 031309407..bb71a4d58 160000 --- a/eos +++ b/eos @@ -1 +1 @@ -Subproject commit 031309407378f17f8fac4068c51128bee3fa3bec +Subproject commit bb71a4d58951c2c94bdd65df3b8e3b188b7e0118 diff --git a/service/fleet.py b/service/fleet.py index 6f266c8a2..311aa8246 100644 --- a/service/fleet.py +++ b/service/fleet.py @@ -89,7 +89,7 @@ class Fleet(object): squad = eos.db.getSquad(squadIDs.pop()) squad.wing.gang.leader = booster if self.anyBoosters(squad): - squad.wing.gang.calculateModifiedAttributes() + squad.wing.gang.recalculateLinear() else: self.removeAssociatedFleetData(boostee) @@ -103,8 +103,7 @@ class Fleet(object): squad = eos.db.getSquad(squadIDs.pop()) squad.wing.leader = booster if self.anyBoosters(squad): - squad.wing.gang.calculateModifiedAttributes() - boostee.calculateModifiedAttributes() + squad.wing.gang.recalculateLinear() else: self.removeAssociatedFleetData(boostee) @@ -118,7 +117,7 @@ class Fleet(object): squad = eos.db.getSquad(squadIDs.pop()) squad.leader = booster if self.anyBoosters(squad): - squad.wing.gang.calculateModifiedAttributes() + squad.wing.gang.recalculateLinear() else: self.removeAssociatedFleetData(boostee) @@ -182,4 +181,8 @@ class Fleet(object): def recalcFleet(self, fit): squadIDs = eos.db.getSquadsIDsWithFitID(fit.ID) if len(squadIDs) > 0: - eos.db.getSquad(squadIDs[0]).wing.gang.calculateModifiedAttributes() + eos.db.getSquad(squadIDs[0]).wing.gang.recalculateLinear() + else: + fit.clear() + fit.calculateModifiedAttributes() + From 45795a3bcec615a565d70295126581dd1e22f04b Mon Sep 17 00:00:00 2001 From: DarkPhoenix Date: Tue, 22 Nov 2011 03:28:20 +0400 Subject: [PATCH 34/55] Use new fit recalculation method, which takes into consideration fleet stuff --- eos | 2 +- gui/gangView.py | 4 +-- service/fit.py | 80 +++++++++++++++++++----------------------------- service/fleet.py | 11 ++----- 4 files changed, 37 insertions(+), 60 deletions(-) diff --git a/eos b/eos index bb71a4d58..ff0ffa77f 160000 --- a/eos +++ b/eos @@ -1 +1 @@ -Subproject commit bb71a4d58951c2c94bdd65df3b8e3b188b7e0118 +Subproject commit ff0ffa77ff5159f7b0ad7a30b7a56a4ebe978049 diff --git a/gui/gangView.py b/gui/gangView.py index 2f7b4696d..adea6b0cc 100644 --- a/gui/gangView.py +++ b/gui/gangView.py @@ -166,7 +166,7 @@ class GangView ( ScrolledPanel ): elif type == 2: fleetSrv.setLinearSquadCom(boostee, booster) - fleetSrv.recalcFleet(boostee) + sFit.recalc(boostee) wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=activeFitID)) def fitSelected(self, event): @@ -226,7 +226,7 @@ class GangView ( ScrolledPanel ): fleetSrv.setLinearWingCom(boostee, booster) elif type == 2: fleetSrv.setLinearSquadCom(boostee, booster) - fleetSrv.recalcFleet(boostee) + sFit.recalc(boostee) wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=activeFitID)) def RefreshCharacterList(self, event = None): diff --git a/service/fit.py b/service/fit.py index 401ffeb07..fb9353107 100644 --- a/service/fit.py +++ b/service/fit.py @@ -119,7 +119,7 @@ class Fit(object): fit.damagePattern = self.pattern fit.character = self.character eos.db.save(fit) - fit.calculateModifiedAttributes() + self.recalc(fit) return fit.ID def renameFit(self, fitID, newName): @@ -152,8 +152,7 @@ class Fit(object): fit = eos.db.getFit(fitID) fit.factorReload = not fit.factorReload eos.db.commit() - fit.clear() - fit.calculateModifiedAttributes() + self.recalc(fit) def switchFit(self, fitID): if fitID is None: @@ -167,8 +166,7 @@ class Fit(object): fit.damagePattern = self.pattern eos.db.commit() - fit.clear() - fit.calculateModifiedAttributes() + self.recalc(fit) def getFit(self, fitID): if fitID is None: @@ -178,7 +176,7 @@ class Fit(object): sFlt = Fleet.getInstance() if sFlt.isInLinearFleet(fit) is False: sFlt.removeAssociatedFleetData(fit) - fit.calculateModifiedAttributes() + self.recalc(fit) fit.fill() eos.db.commit() return fit @@ -203,8 +201,7 @@ class Fit(object): fit.implants.freeSlot(implant) fit.implants.append(implant) - fit.clear() - fit.calculateModifiedAttributes() + self.recalc(fit) return True def removeImplant(self, fitID, position): @@ -214,8 +211,7 @@ class Fit(object): fit = eos.db.getFit(fitID) implant = fit.implants[position] fit.implants.remove(implant) - fit.clear() - fit.calculateModifiedAttributes() + self.recalc(fit) return True def addBooster(self, fitID, itemID): @@ -231,8 +227,7 @@ class Fit(object): fit.boosters.freeSlot(booster) fit.boosters.append(booster) - fit.clear() - fit.calculateModifiedAttributes() + self.recalc(fit) return True def removeBooster(self, fitID, position): @@ -242,8 +237,7 @@ class Fit(object): fit = eos.db.getFit(fitID) booster = fit.boosters[position] fit.boosters.remove(booster) - fit.clear() - fit.calculateModifiedAttributes() + self.recalc(fit) return True def project(self, fitID, thing): @@ -276,8 +270,7 @@ class Fit(object): fit.projectedModules.append(module) eos.db.commit() - fit.clear() - fit.calculateModifiedAttributes() + self.recalc(fit) def toggleProjected(self, fitID, thing, click): fit = eos.db.getFit(fitID) @@ -292,8 +285,7 @@ class Fit(object): thing.state = State.OFFLINE eos.db.commit() - fit.clear() - fit.calculateModifiedAttributes() + self.recalc(fit) def removeProjected(self, fitID, thing): fit = eos.db.getFit(fitID) @@ -305,8 +297,7 @@ class Fit(object): fit.projectedFits.remove(thing) eos.db.commit() - fit.clear() - fit.calculateModifiedAttributes() + self.recalc(fit) def appendModule(self, fitID, itemID): fit = eos.db.getFit(fitID) @@ -326,8 +317,7 @@ class Fit(object): if m.isValidState(State.ACTIVE): m.state = State.ACTIVE - fit.clear() - fit.calculateModifiedAttributes() + self.recalc(fit) self.checkStates(fit, m) fit.fill() eos.db.commit() @@ -343,8 +333,7 @@ class Fit(object): numSlots = len(fit.modules) fit.modules.toDummy(position) - fit.clear() - fit.calculateModifiedAttributes() + self.recalc(fit) self.checkStates(fit, None) fit.fill() eos.db.commit() @@ -381,8 +370,7 @@ class Fit(object): return False drone.amount += 1 eos.db.commit() - fit.clear() - fit.calculateModifiedAttributes() + self.recalc(fit) return True else: return False @@ -403,8 +391,7 @@ class Fit(object): d2.amount += d1.amount d2.amountActive += d1.amountActive if d1.amountActive > 0 else -d2.amountActive eos.db.commit() - fit.clear() - fit.calculateModifiedAttributes() + self.recalc(fit) return True def splitDrones(self, fit, d, amount, l): @@ -444,8 +431,7 @@ class Fit(object): del fit.drones[i] eos.db.commit() - fit.clear() - fit.calculateModifiedAttributes() + self.recalc(fit) return True def toggleDrone(self, fitID, i): @@ -457,8 +443,7 @@ class Fit(object): d.amountActive = d.amount eos.db.commit() - fit.clear() - fit.calculateModifiedAttributes() + self.recalc(fit) return True def toggleImplant(self, fitID, i): @@ -467,8 +452,7 @@ class Fit(object): implant.active = not implant.active eos.db.commit() - fit.clear() - fit.calculateModifiedAttributes() + self.recalc(fit) return True def toggleBooster(self, fitID, i): @@ -477,8 +461,7 @@ class Fit(object): booster.active = not booster.active eos.db.commit() - fit.clear() - fit.calculateModifiedAttributes() + self.recalc(fit) return True def changeChar(self, fitID, charID): @@ -490,8 +473,7 @@ class Fit(object): fit = eos.db.getFit(fitID) fit.character = self.character = eos.db.getCharacter(charID) - fit.clear() - fit.calculateModifiedAttributes() + self.recalc(fit) def isAmmo(self, itemID): return eos.db.getItem(itemID).category.name == "Charge" @@ -507,8 +489,7 @@ class Fit(object): if mod.isValidCharge(ammo): mod.charge = ammo - fit.clear() - fit.calculateModifiedAttributes() + self.recalc(fit) def getDamagePattern(self, fitID): if fitID is None: @@ -525,8 +506,7 @@ class Fit(object): fit.damagePattern = self.pattern = pattern eos.db.commit() - fit.clear() - fit.calculateModifiedAttributes() + self.recalc(fit) def setAsPattern(self, fitID, ammo): if fitID is None: @@ -543,8 +523,7 @@ class Fit(object): setattr(dp, "%sAmount" % attr, ammo.getAttribute("%sDamage" % attr)) fit.damagePattern = dp - fit.clear() - fit.calculateModifiedAttributes() + self.recalc(fit) def exportFit(self, fitID): fit = eos.db.getFit(fitID) @@ -627,14 +606,12 @@ class Fit(object): fit = eos.db.getFit(fitID) # As some items may affect state-limiting attributes of the ship, calculate new attributes first - fit.clear() - fit.calculateModifiedAttributes() + self.recalc(fit) # Then, check states of all modules and change where needed changed = self.checkStates(fit, base) # If any state was changed, recalulate attributes again if changed is True: - fit.clear() - fit.calculateModifiedAttributes() + self.recalc(fit) # Old state : New State localMap = {State.OVERHEATED: State.ACTIVE, @@ -665,3 +642,10 @@ class Fit(object): return state else: return currState + + def recalc(self, fit): + fit.clear() + if fit.fleet is not None: + fit.fleet.recalculateLinear() + else: + fit.calculateModifiedAttributes() diff --git a/service/fleet.py b/service/fleet.py index 311aa8246..b536c9316 100644 --- a/service/fleet.py +++ b/service/fleet.py @@ -77,6 +77,7 @@ class Fleet(object): s = Squad() w.squads.append(s) s.members.append(fit) + fit.fleet = f eos.db.save(f) def setLinearFleetCom(self, boostee, booster): @@ -160,6 +161,7 @@ class Fleet(object): for fleetID in fleetIDs: fleet = eos.db.getFleet(fleetID) eos.db.remove(fleet) + fit.fleet = None return def anyBoosters(self, squad): @@ -177,12 +179,3 @@ class Fleet(object): w = s.wing f = w.gang return (f.leader, w.leader, s.leader) - - def recalcFleet(self, fit): - squadIDs = eos.db.getSquadsIDsWithFitID(fit.ID) - if len(squadIDs) > 0: - eos.db.getSquad(squadIDs[0]).wing.gang.recalculateLinear() - else: - fit.clear() - fit.calculateModifiedAttributes() - From f916c7ccc9409f7d2dc27413bd6c559d7e31cc22 Mon Sep 17 00:00:00 2001 From: DarkPhoenix Date: Tue, 22 Nov 2011 17:24:55 +0400 Subject: [PATCH 35/55] Optimize fleet stuff --- eos | 2 +- service/fit.py | 25 ++++++++++++++----------- service/fleet.py | 20 ++++++++++---------- 3 files changed, 25 insertions(+), 22 deletions(-) diff --git a/eos b/eos index ff0ffa77f..6efa234c6 160000 --- a/eos +++ b/eos @@ -1 +1 @@ -Subproject commit ff0ffa77ff5159f7b0ad7a30b7a56a4ebe978049 +Subproject commit 6efa234c6680f399fd997c1db10a05aee59e0696 diff --git a/service/fit.py b/service/fit.py index fb9353107..69304f777 100644 --- a/service/fit.py +++ b/service/fit.py @@ -171,14 +171,20 @@ class Fit(object): def getFit(self, fitID): if fitID is None: return None - fit = eos.db.getFit(fitID) - sFlt = Fleet.getInstance() - if sFlt.isInLinearFleet(fit) is False: - sFlt.removeAssociatedFleetData(fit) - self.recalc(fit) - fit.fill() - eos.db.commit() + inited = getattr(fit, "inited", None) + if inited is None or inited is False: + sFlt = Fleet.getInstance() + f = sFlt.getLinearFleet(fit) + if f is None: + sFlt.removeAssociatedFleetData(fit) + fit.fleet = None + else: + fit.fleet = f + self.recalc(fit) + fit.fill() + eos.db.commit() + fit.inited = True return fit def searchFits(self, name): @@ -645,7 +651,4 @@ class Fit(object): def recalc(self, fit): fit.clear() - if fit.fleet is not None: - fit.fleet.recalculateLinear() - else: - fit.calculateModifiedAttributes() + fit.calculateModifiedAttributes() diff --git a/service/fleet.py b/service/fleet.py index b536c9316..7001aa5ea 100644 --- a/service/fleet.py +++ b/service/fleet.py @@ -83,7 +83,7 @@ class Fleet(object): def setLinearFleetCom(self, boostee, booster): if boostee == booster: return - if self.isInLinearFleet(boostee) is False: + if self.getLinearFleet(boostee) is None: self.removeAssociatedFleetData(boostee) self.makeLinearFleet(boostee) squadIDs = set(eos.db.getSquadsIDsWithFitID(boostee.ID)) @@ -97,7 +97,7 @@ class Fleet(object): def setLinearWingCom(self, boostee, booster): if boostee == booster: return - if self.isInLinearFleet(boostee) is False: + if self.getLinearFleet(boostee) is None: self.removeAssociatedFleetData(boostee) self.makeLinearFleet(boostee) squadIDs = set(eos.db.getSquadsIDsWithFitID(boostee.ID)) @@ -111,7 +111,7 @@ class Fleet(object): def setLinearSquadCom(self, boostee, booster): if boostee == booster: return - if self.isInLinearFleet(boostee) is False: + if self.getLinearFleet(boostee) is None: self.removeAssociatedFleetData(boostee) self.makeLinearFleet(boostee) squadIDs = set(eos.db.getSquadsIDsWithFitID(boostee.ID)) @@ -122,20 +122,20 @@ class Fleet(object): else: self.removeAssociatedFleetData(boostee) - def isInLinearFleet(self, fit): + def getLinearFleet(self, fit): sqIDs = eos.db.getSquadsIDsWithFitID(fit.ID) if len(sqIDs) != 1: - return False + return None s = eos.db.getSquad(sqIDs[0]) if len(s.members) != 1: - return False + return None w = s.wing if len(w.squads) != 1: - return False + return None f = w.gang if len(f.wings) != 1: - return False - return True + return None + return f def removeAssociatedFleetData(self, fit): squadIDs = set(eos.db.getSquadsIDsWithFitID(fit.ID)) @@ -172,7 +172,7 @@ class Fleet(object): return True def loadLinearFleet(self, fit): - if self.isInLinearFleet(fit) is False: + if self.getLinearFleet(fit) is None: return None squadID = eos.db.getSquadsIDsWithFitID(fit.ID)[0] s = eos.db.getSquad(squadID) From 63deb57d26f0efff3d5b1a5c5665162832c5421a Mon Sep 17 00:00:00 2001 From: DarkPhoenix Date: Tue, 22 Nov 2011 17:40:37 +0400 Subject: [PATCH 36/55] Force boosters recalculation in some cases --- eos | 2 +- gui/gangView.py | 4 ++-- service/fit.py | 8 ++++---- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/eos b/eos index 6efa234c6..c14478668 160000 --- a/eos +++ b/eos @@ -1 +1 @@ -Subproject commit 6efa234c6680f399fd997c1db10a05aee59e0696 +Subproject commit c144786682cb7245c903522df8ca86654dde28ac diff --git a/gui/gangView.py b/gui/gangView.py index adea6b0cc..fb7068435 100644 --- a/gui/gangView.py +++ b/gui/gangView.py @@ -166,7 +166,7 @@ class GangView ( ScrolledPanel ): elif type == 2: fleetSrv.setLinearSquadCom(boostee, booster) - sFit.recalc(boostee) + sFit.recalc(boostee, withBoosters=True) wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=activeFitID)) def fitSelected(self, event): @@ -226,7 +226,7 @@ class GangView ( ScrolledPanel ): fleetSrv.setLinearWingCom(boostee, booster) elif type == 2: fleetSrv.setLinearSquadCom(boostee, booster) - sFit.recalc(boostee) + sFit.recalc(boostee, withBoosters=True) wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=activeFitID)) def RefreshCharacterList(self, event = None): diff --git a/service/fit.py b/service/fit.py index 69304f777..4afee6439 100644 --- a/service/fit.py +++ b/service/fit.py @@ -166,7 +166,7 @@ class Fit(object): fit.damagePattern = self.pattern eos.db.commit() - self.recalc(fit) + self.recalc(fit, withBoosters=True) def getFit(self, fitID): if fitID is None: @@ -181,7 +181,7 @@ class Fit(object): fit.fleet = None else: fit.fleet = f - self.recalc(fit) + self.recalc(fit, withBoosters=True) fit.fill() eos.db.commit() fit.inited = True @@ -649,6 +649,6 @@ class Fit(object): else: return currState - def recalc(self, fit): + def recalc(self, fit, withBoosters=False): fit.clear() - fit.calculateModifiedAttributes() + fit.calculateModifiedAttributes(withBoosters=withBoosters) From 76b447e51765909485d467d0cb65301a4ef15c5e Mon Sep 17 00:00:00 2001 From: DarkPhoenix Date: Tue, 22 Nov 2011 20:25:31 +0400 Subject: [PATCH 37/55] Related to fleet service updates --- eos | 2 +- service/fit.py | 3 ++- service/fleet.py | 52 +++++++++++++++++++++++++++++++++++++++--------- 3 files changed, 46 insertions(+), 11 deletions(-) diff --git a/eos b/eos index c14478668..2b80b0321 160000 --- a/eos +++ b/eos @@ -1 +1 @@ -Subproject commit c144786682cb7245c903522df8ca86654dde28ac +Subproject commit 2b80b0321fa19fa2d042230689c51cfd84011899 diff --git a/service/fit.py b/service/fit.py index 4afee6439..1287d1379 100644 --- a/service/fit.py +++ b/service/fit.py @@ -78,6 +78,7 @@ class Fit(object): def __init__(self): self.pattern = DamagePattern.getInstance().getDamagePattern("Uniform") self.character = Character.getInstance().all0() + self.dirtyFitIDs = set() def getAllFits(self): fits = eos.db.getFitList() @@ -651,4 +652,4 @@ class Fit(object): def recalc(self, fit, withBoosters=False): fit.clear() - fit.calculateModifiedAttributes(withBoosters=withBoosters) + fit.calculateModifiedAttributes(withBoosters=withBoosters, dirtyStorage=self.dirtyFitIDs) diff --git a/service/fleet.py b/service/fleet.py index 7001aa5ea..eec2bcf92 100644 --- a/service/fleet.py +++ b/service/fleet.py @@ -88,11 +88,17 @@ class Fleet(object): self.makeLinearFleet(boostee) squadIDs = set(eos.db.getSquadsIDsWithFitID(boostee.ID)) squad = eos.db.getSquad(squadIDs.pop()) + if squad.wing.gang.leader is not None and booster is None: + try: + squad.wing.gang.leader.boostsFits.remove(boostee.ID) + except KeyError: + pass squad.wing.gang.leader = booster - if self.anyBoosters(squad): - squad.wing.gang.recalculateLinear() - else: + if self.anyBoosters(squad) is False: self.removeAssociatedFleetData(boostee) + from service.fit import Fit + sFit = Fit.getInstance() + sFit.recalc(boostee, withBoosters=True) def setLinearWingCom(self, boostee, booster): if boostee == booster: @@ -102,11 +108,17 @@ class Fleet(object): self.makeLinearFleet(boostee) squadIDs = set(eos.db.getSquadsIDsWithFitID(boostee.ID)) squad = eos.db.getSquad(squadIDs.pop()) + if squad.wing.leader is not None and booster is None: + try: + squad.wing.leader.boostsFits.remove(boostee.ID) + except KeyError: + pass squad.wing.leader = booster - if self.anyBoosters(squad): - squad.wing.gang.recalculateLinear() - else: + if self.anyBoosters(squad) is False: self.removeAssociatedFleetData(boostee) + from service.fit import Fit + sFit = Fit.getInstance() + sFit.recalc(boostee, withBoosters=True) def setLinearSquadCom(self, boostee, booster): if boostee == booster: @@ -116,11 +128,18 @@ class Fleet(object): self.makeLinearFleet(boostee) squadIDs = set(eos.db.getSquadsIDsWithFitID(boostee.ID)) squad = eos.db.getSquad(squadIDs.pop()) + if squad.leader is not None and booster is None: + try: + squad.leader.boostsFits.remove(boostee.ID) + except KeyError: + pass squad.leader = booster - if self.anyBoosters(squad): - squad.wing.gang.recalculateLinear() - else: + if self.anyBoosters(squad) is False: self.removeAssociatedFleetData(boostee) + from service.fit import Fit + sFit = Fit.getInstance() + sFit.recalc(boostee, withBoosters=True) + def getLinearFleet(self, fit): sqIDs = eos.db.getSquadsIDsWithFitID(fit.ID) @@ -154,12 +173,27 @@ class Fleet(object): squadIDs.add(squad.ID) for squadID in squadIDs: squad = eos.db.getSquad(squadID) + if squad.leader is not None: + try: + squad.leader.boostsFits.remove(fit.ID) + except KeyError: + pass eos.db.remove(squad) for wingID in wingIDs: wing = eos.db.getWing(wingID) + if wing.leader is not None: + try: + wing.leader.boostsFits.remove(fit.ID) + except KeyError: + pass eos.db.remove(wing) for fleetID in fleetIDs: fleet = eos.db.getFleet(fleetID) + if fleet.leader is not None: + try: + fleet.leader.boostsFits.remove(fit.ID) + except KeyError: + pass eos.db.remove(fleet) fit.fleet = None return From 60c9640d110cccf1c176794faa1936095b34c91e Mon Sep 17 00:00:00 2001 From: HomeWorld Date: Tue, 22 Nov 2011 18:48:26 +0200 Subject: [PATCH 38/55] Show ship name : fit name in gang view --- gui/gangView.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/gui/gangView.py b/gui/gangView.py index fb7068435..20560f1d4 100644 --- a/gui/gangView.py +++ b/gui/gangView.py @@ -183,17 +183,17 @@ class GangView ( ScrolledPanel ): fleetCom, wingCom, squadCom = commanders if fleetCom: - fleetComName = fleetCom.name + fleetComName = fleetCom.ship.item.name + ": " + fleetCom.name else: fleetComName = "None" if wingCom: - wingComName = wingCom.name + wingComName = wingCom.ship.item.name + ": " + wingCom.name else: wingComName = "None" if squadCom: - squadComName = squadCom.name + squadComName = squadCom.ship.item.name + ": " + squadCom.name else: squadComName = "None" From e0e93abcca1da8d51032989a4c75fd84cde12a4e Mon Sep 17 00:00:00 2001 From: DarkPhoenix Date: Tue, 22 Nov 2011 20:57:46 +0400 Subject: [PATCH 39/55] Additional check for dummy mods --- gui/itemStats.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/gui/itemStats.py b/gui/itemStats.py index 16d1ac581..5340165bf 100644 --- a/gui/itemStats.py +++ b/gui/itemStats.py @@ -571,6 +571,8 @@ class ItemAffectedBy (wx.Panel): for fit, afflictors in cont.getAfflictions(attrName).iteritems(): for afflictor, modifier, amount in afflictors: + if afflictor.item is None: + continue if afflictor.item.name not in things: things[afflictor.item.name] = [type(afflictor), set(), set()] From 7e0982b81b6639f382debb6f18a6b191b19e9a09 Mon Sep 17 00:00:00 2001 From: HomeWorld Date: Tue, 22 Nov 2011 19:19:20 +0200 Subject: [PATCH 40/55] More gang UI related stuff (don't ask) --- gui/gangView.py | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/gui/gangView.py b/gui/gangView.py index 20560f1d4..230dc1afd 100644 --- a/gui/gangView.py +++ b/gui/gangView.py @@ -175,6 +175,7 @@ class GangView ( ScrolledPanel ): fleetSrv = service.Fleet.getInstance() activeFitID = self.mainFrame.getActiveFit() + if activeFitID: commanders = fleetSrv.loadLinearFleet(fit) if commanders is None: @@ -184,26 +185,46 @@ class GangView ( ScrolledPanel ): if fleetCom: fleetComName = fleetCom.ship.item.name + ": " + fleetCom.name + fleetComCharName = fleetCom.character.name if fleetCom.character is not None else "All 0" else: fleetComName = "None" + fleetComCharName = "All 0" if wingCom: wingComName = wingCom.ship.item.name + ": " + wingCom.name + wingComCharName = wingCom.character.name if wingCom.character is not None else "All 0" else: wingComName = "None" + wingComCharName = "All 0" if squadCom: squadComName = squadCom.ship.item.name + ": " + squadCom.name + squadComCharName = squadCom.character.name if squadCom.character is not None else "All 0" else: squadComName = "None" + squadComCharName = "All 0" - self.UpdateFleetFitsUI( fleetComName, wingComName, squadComName ) + self.UpdateFleetFitsUI( fleetComName, wingComName, squadComName, fleetComCharName, wingComCharName, squadComCharName ) - def UpdateFleetFitsUI(self, fleet, wing, squad): + else: + fleetComName = "None" + fleetComCharName = "All 0" + wingComName = "None" + wingComCharName = "All 0" + squadComName = "None" + squadComCharName = "All 0" + + self.UpdateFleetFitsUI( fleetComName, wingComName, squadComName, fleetComCharName, wingComCharName, squadComCharName ) + + 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() From 9c0b39c91995454c88114077f2ed17f5eced316f Mon Sep 17 00:00:00 2001 From: DarkPhoenix Date: Tue, 22 Nov 2011 21:45:26 +0400 Subject: [PATCH 41/55] Update eos in pyfa --- eos | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/eos b/eos index 2b80b0321..939f98e6c 160000 --- a/eos +++ b/eos @@ -1 +1 @@ -Subproject commit 2b80b0321fa19fa2d042230689c51cfd84011899 +Subproject commit 939f98e6c28a82aba44658c88e36d449b9f748b4 From f9af29a335365580bf625556d13561bfb4468ec2 Mon Sep 17 00:00:00 2001 From: DarkPhoenix Date: Tue, 22 Nov 2011 21:52:14 +0400 Subject: [PATCH 42/55] Add getCharacter method --- service/character.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/service/character.py b/service/character.py index 20c06c26c..8bd63a6be 100644 --- a/service/character.py +++ b/service/character.py @@ -55,6 +55,10 @@ class Character(): sFit = service.Fit.getInstance() return map(lambda c: (c.ID, c.name, c == sFit.character), eos.db.getCharacterList()) + def getCharacter(self, charID): + char = eos.db.getCharacter(charID) + return char + def getSkillGroups(self): cat = eos.db.getCategory(16) groups = [] From f41ca614010cfaf30783bcb184b8e5aad71c63a6 Mon Sep 17 00:00:00 2001 From: HomeWorld Date: Tue, 22 Nov 2011 20:01:52 +0200 Subject: [PATCH 43/55] Added support for fleet char selection --- gui/gangView.py | 57 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) diff --git a/gui/gangView.py b/gui/gangView.py index 230dc1afd..f3e0a89c0 100644 --- a/gui/gangView.py +++ b/gui/gangView.py @@ -137,8 +137,65 @@ class GangView ( ScrolledPanel ): for stBooster in self.stBoosters: stBooster.Bind(wx.EVT_LEFT_DCLICK, self.RemoveBooster) + for chCharacter in self.chCharacters: + chCharacter.Bind(wx.EVT_CHOICE, self.CharChanged) self.RefreshCharacterList() + def CharChanged(self, event): + chBooster = event.GetEventObject() + type = -1 + if chBooster == self.chFleetChar: + type = 0 + if chBooster == self.chWingChar: + type = 1 + if chBooster == self.chSquadChar: + type = 2 + + if type == -1: + event.Skip() + return + + cFit = service.Fit.getInstance() + + fleetSrv = service.Fleet.getInstance() + + activeFitID = self.mainFrame.getActiveFit() + fit = cFit.getFit(activeFitID) + + cChar = service.Character.getInstance() + charList = cChar.getCharacterList() + + if activeFitID: + commanders = fleetSrv.loadLinearFleet(fit) + if commanders is None: + fleetCom, wingCom, squadCom = (None, None, None) + else: + fleetCom, wingCom, squadCom = commanders + + if fleetCom and type == 0: + charID = chBooster.GetClientData(chBooster.GetSelection()) + cFit.changeChar(fleetCom.ID, charID) + else: + chBooster.SetSelection(0) + + if wingCom and type == 1: + charID = chBooster.GetClientData(chBooster.GetSelection()) + cFit.changeChar(wingCom.ID, charID) + else: + chBooster.SetSelection(0) + + if squadCom and type == 1: + charID = chBooster.GetClientData(chBooster.GetSelection()) + cFit.changeChar(squadCom.ID, charID) + else: + chBooster.SetSelection(0) + + cFit.recalc(fit, withBoosters=True) + wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=activeFitID)) + + else: + chBooster.SetSelection(0) + def RemoveBooster(self, event): activeFitID = self.mainFrame.getActiveFit() if not activeFitID: From 6ae104525f9d603a4b858e807844cfcd6a985657 Mon Sep 17 00:00:00 2001 From: HomeWorld Date: Tue, 22 Nov 2011 20:14:19 +0200 Subject: [PATCH 44/55] Properly sync gang char stuff --- gui/gangView.py | 33 ++++++++++++++++++--------------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/gui/gangView.py b/gui/gangView.py index f3e0a89c0..4e99db2e7 100644 --- a/gui/gangView.py +++ b/gui/gangView.py @@ -172,23 +172,26 @@ class GangView ( ScrolledPanel ): else: fleetCom, wingCom, squadCom = commanders - if fleetCom and type == 0: - charID = chBooster.GetClientData(chBooster.GetSelection()) - cFit.changeChar(fleetCom.ID, charID) - else: - chBooster.SetSelection(0) + if type == 0: + if fleetCom: + charID = chBooster.GetClientData(chBooster.GetSelection()) + cFit.changeChar(fleetCom.ID, charID) + else: + chBooster.SetSelection(0) - if wingCom and type == 1: - charID = chBooster.GetClientData(chBooster.GetSelection()) - cFit.changeChar(wingCom.ID, charID) - else: - chBooster.SetSelection(0) + if type == 1: + if wingCom: + charID = chBooster.GetClientData(chBooster.GetSelection()) + cFit.changeChar(wingCom.ID, charID) + else: + chBooster.SetSelection(0) - if squadCom and type == 1: - charID = chBooster.GetClientData(chBooster.GetSelection()) - cFit.changeChar(squadCom.ID, charID) - else: - chBooster.SetSelection(0) + if type == 2: + if squadCom: + charID = chBooster.GetClientData(chBooster.GetSelection()) + cFit.changeChar(squadCom.ID, charID) + else: + chBooster.SetSelection(0) cFit.recalc(fit, withBoosters=True) wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=activeFitID)) From d4fc0dc311a4b50cddd357f772cb84d9f84c21d4 Mon Sep 17 00:00:00 2001 From: DarkPhoenix Date: Wed, 23 Nov 2011 02:46:37 +0400 Subject: [PATCH 45/55] Update eos in pyfa --- eos | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/eos b/eos index 939f98e6c..b421fe89e 160000 --- a/eos +++ b/eos @@ -1 +1 @@ -Subproject commit 939f98e6c28a82aba44658c88e36d449b9f748b4 +Subproject commit b421fe89ee923e6c53119c751be7c8571813b585 From 28eecf2593ef387c76b1492a521489fdb45c798c Mon Sep 17 00:00:00 2001 From: DarkPhoenix Date: Wed, 23 Nov 2011 03:59:13 +0400 Subject: [PATCH 46/55] When fit is removed, remove its fleet too --- service/fit.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/service/fit.py b/service/fit.py index 1287d1379..16dbe9668 100644 --- a/service/fit.py +++ b/service/fit.py @@ -130,6 +130,8 @@ class Fit(object): def deleteFit(self, fitID): fit = eos.db.getFit(fitID) + sFlt = Fleet.getInstance() + sFlt.removeAssociatedFleetData(fit) eos.db.remove(fit) def copyFit(self, fitID): From 3f0f6a66890286d192f0b5c58a4cb332a54dd05b Mon Sep 17 00:00:00 2001 From: HomeWorld Date: Wed, 23 Nov 2011 18:48:58 +0200 Subject: [PATCH 47/55] Some gang UI work + fit rename sync --- gui/gangView.py | 40 ++++++++++++++++++++++++++++++---------- 1 file changed, 30 insertions(+), 10 deletions(-) diff --git a/gui/gangView.py b/gui/gangView.py index 4e99db2e7..10125aa81 100644 --- a/gui/gangView.py +++ b/gui/gangView.py @@ -30,7 +30,7 @@ from gui import characterEditor as CharEditor class GangView ( ScrolledPanel ): def __init__( self, parent ): - ScrolledPanel.__init__ ( self, parent, id = wx.ID_ANY, pos = wx.DefaultPosition, size = wx.Size( 691,172 ), style = wx.TAB_TRAVERSAL ) + ScrolledPanel.__init__ ( self, parent, id = wx.ID_ANY, pos = wx.DefaultPosition, size = wx.Size( 100,20 ), style = wx.TAB_TRAVERSAL | wx.HSCROLL | wx.VSCROLL ) mainSizer = wx.BoxSizer( wx.VERTICAL ) self.mainFrame = gui.mainFrame.MainFrame.getInstance() @@ -56,10 +56,12 @@ class GangView ( ScrolledPanel ): 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 ) ) contentFGSizer.Add( self.stFits, 0, wx.ALIGN_CENTER_VERTICAL|wx.ALIGN_CENTER_HORIZONTAL, 5 ) self.stCharacters = wx.StaticText( self, wx.ID_ANY, u"Characters", wx.DefaultPosition, wx.DefaultSize, 0 ) self.stCharacters.Wrap( -1 ) + self.stCharacters.SetFont( wx.Font( wx.NORMAL_FONT.GetPointSize(), 70, 90, 92, False, wx.EmptyString ) ) contentFGSizer.Add( self.stCharacters, 0, wx.ALIGN_CENTER_VERTICAL|wx.ALIGN_CENTER_HORIZONTAL, 5 ) self.m_staticline2 = wx.StaticLine( self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.LI_HORIZONTAL ) @@ -71,9 +73,9 @@ 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", wx.DefaultPosition, wx.DefaultSize, 0 ) + self.stFleet = wx.StaticText( self, wx.ID_ANY, u"Fleet:", wx.DefaultPosition, wx.DefaultSize, 0 ) self.stFleet.Wrap( -1 ) - self.stFleet.SetFont( wx.Font( wx.NORMAL_FONT.GetPointSize(), 70, 90, 90, False, wx.EmptyString ) ) + self.stFleet.SetFont( wx.Font( wx.NORMAL_FONT.GetPointSize(), 70, 90, 92, False, wx.EmptyString ) ) contentFGSizer.Add( self.stFleet, 0, wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL|wx.ALL, 5 ) @@ -86,10 +88,12 @@ class GangView ( ScrolledPanel ): 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.EXPAND|wx.ALL, 5 ) - self.stWing = wx.StaticText( self, wx.ID_ANY, u"Wing", wx.DefaultPosition, wx.DefaultSize, 0 ) + contentFGSizer.Add( self.chFleetChar, 0, wx.ALL | wx.ALIGN_CENTER_VERTICAL, 5 ) + + self.stWing = wx.StaticText( self, wx.ID_ANY, u"Wing:", 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 ) @@ -99,10 +103,12 @@ class GangView ( ScrolledPanel ): 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.EXPAND, 5 ) - self.stSquad = wx.StaticText( self, wx.ID_ANY, u"Squad", wx.DefaultPosition, wx.DefaultSize, 0 ) + contentFGSizer.Add( self.chWingChar, 0, wx.ALL| wx.ALIGN_CENTER_VERTICAL, 5 ) + + self.stSquad = wx.StaticText( self, wx.ID_ANY, u"Squad:", 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 ) @@ -112,9 +118,10 @@ class GangView ( ScrolledPanel ): 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.EXPAND|wx.ALL, 5 ) - mainSizer.Add( contentFGSizer, 0, 0, 0 ) + contentFGSizer.Add( self.chSquadChar, 0, wx.ALL | wx.ALIGN_CENTER_VERTICAL, 5 ) + + mainSizer.Add( contentFGSizer, 1, wx.EXPAND, 0 ) self.stBoosters = [] self.stBoosters.append(self.stFleetFit) @@ -128,11 +135,12 @@ class GangView ( ScrolledPanel ): self.chCharacters.append(self.chSquadChar) self.SetSizer( mainSizer ) - self.SetAutoLayout(1) + self.SetAutoLayout(True) self.SetupScrolling() self.mainFrame.Bind(CharEditor.CHAR_LIST_UPDATED, self.RefreshCharacterList) self.mainFrame.Bind(GE.FIT_CHANGED, self.fitSelected) + self.mainFrame.Bind(gui.shipBrowser.EVT_FIT_RENAMED, self.fitRenamed) for stBooster in self.stBoosters: stBooster.Bind(wx.EVT_LEFT_DCLICK, self.RemoveBooster) @@ -229,6 +237,15 @@ class GangView ( ScrolledPanel ): sFit.recalc(boostee, withBoosters=True) wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=activeFitID)) + def fitRenamed(self, event): + fleetSrv = service.Fleet.getInstance() + activeFitID = self.mainFrame.getActiveFit() + + if activeFitID: + ev = event + ev.fitID = activeFitID + self.fitSelected(ev) + def fitSelected(self, event): cFit = service.Fit.getInstance() fit = cFit.getFit(event.fitID) @@ -285,7 +302,10 @@ class GangView ( ScrolledPanel ): self.chWingChar.SetStringSelection(wingChar) self.chSquadChar.SetStringSelection(squadChar) + self.Layout() + self.SendSizeEvent() + def AddCommander(self, fitID, type = None): From 163f9f6f783a85bfa7c3c5709339bb69723a3a93 Mon Sep 17 00:00:00 2001 From: HomeWorld Date: Wed, 23 Nov 2011 19:25:10 +0200 Subject: [PATCH 48/55] Small improvements in gang UI --- gui/additionsPane.py | 5 +++-- gui/gangView.py | 14 ++++++++++++++ 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/gui/additionsPane.py b/gui/additionsPane.py index 64df7090d..d7311b929 100644 --- a/gui/additionsPane.py +++ b/gui/additionsPane.py @@ -54,6 +54,7 @@ class AdditionsPane(TogglePanel): implantImg = bitmapLoader.getImage("implant_small", "icons") boosterImg = bitmapLoader.getImage("booster_small", "icons") projectedImg = bitmapLoader.getImage("projected_small", "icons") + gangImg = bitmapLoader.getImage("fleet_fc_small", "icons") self.notebook.AddPage(DroneView(self.notebook), "Drones", tabImage = droneImg, showClose = False) self.notebook.AddPage(ImplantView(self.notebook), "Implants", tabImage = implantImg, showClose = False) @@ -63,10 +64,10 @@ class AdditionsPane(TogglePanel): self.notebook.AddPage(self.projectedPage, "Projected", tabImage = projectedImg, showClose = False) self.gangPage = GangView(self.notebook) - self.notebook.AddPage(self.gangPage, "Gang", showClose = False) + self.notebook.AddPage(self.gangPage, "Gang", tabImage = gangImg, showClose = False) self.notebook.SetSelection(0) - PANES = ["Drones", "Implants", "Boosters"] + PANES = ["Drones", "Implants", "Boosters", "Projected", "Gang"] def select(self, name): self.notebook.SetSelection(self.PANES.index(name)) diff --git a/gui/gangView.py b/gui/gangView.py index 10125aa81..e0b4c69af 100644 --- a/gui/gangView.py +++ b/gui/gangView.py @@ -144,11 +144,24 @@ class GangView ( ScrolledPanel ): 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) for chCharacter in self.chCharacters: chCharacter.Bind(wx.EVT_CHOICE, self.CharChanged) self.RefreshCharacterList() + def OnEnterWindow(self, event): + obj = event.GetEventObject() + obj.SetCursor(wx.StockCursor(wx.CURSOR_HAND)) + event.Skip() + + def OnLeaveWindow(self, event): + obj = event.GetEventObject() + obj.SetCursor(wx.StockCursor(wx.CURSOR_DEFAULT)) + event.Skip() + + def CharChanged(self, event): chBooster = event.GetEventObject() type = -1 @@ -384,4 +397,5 @@ class GangView ( ScrolledPanel ): # self.Layout() self.AddCommander(draggedFit.ID, booster) + self.mainFrame.additionsPane.select("Gang") From 046ab118cb4c71dd00b1155a483317f085b76e9e Mon Sep 17 00:00:00 2001 From: HomeWorld Date: Wed, 23 Nov 2011 19:38:11 +0200 Subject: [PATCH 49/55] Enable/Disable gang tab depending if a fit is loaded or not --- gui/gangView.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/gui/gangView.py b/gui/gangView.py index e0b4c69af..07a27bc01 100644 --- a/gui/gangView.py +++ b/gui/gangView.py @@ -137,6 +137,7 @@ class GangView ( ScrolledPanel ): self.SetSizer( mainSizer ) self.SetAutoLayout(True) self.SetupScrolling() + self.Disable() self.mainFrame.Bind(CharEditor.CHAR_LIST_UPDATED, self.RefreshCharacterList) self.mainFrame.Bind(GE.FIT_CHANGED, self.fitSelected) @@ -295,6 +296,7 @@ class GangView ( ScrolledPanel ): squadComCharName = "All 0" self.UpdateFleetFitsUI( fleetComName, wingComName, squadComName, fleetComCharName, wingComCharName, squadComCharName ) + self.Enable() else: fleetComName = "None" @@ -305,6 +307,7 @@ class GangView ( ScrolledPanel ): squadComCharName = "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) From 4e31e59bafccffff158febd8d3a0203bde6ca0d7 Mon Sep 17 00:00:00 2001 From: HomeWorld Date: Wed, 23 Nov 2011 19:42:03 +0200 Subject: [PATCH 50/55] Use Fleet instead of Gang for tab name + booster --- gui/additionsPane.py | 4 ++-- gui/gangView.py | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/gui/additionsPane.py b/gui/additionsPane.py index d7311b929..fc38e76f3 100644 --- a/gui/additionsPane.py +++ b/gui/additionsPane.py @@ -64,10 +64,10 @@ class AdditionsPane(TogglePanel): self.notebook.AddPage(self.projectedPage, "Projected", tabImage = projectedImg, showClose = False) self.gangPage = GangView(self.notebook) - self.notebook.AddPage(self.gangPage, "Gang", tabImage = gangImg, showClose = False) + self.notebook.AddPage(self.gangPage, "Fleet", tabImage = gangImg, showClose = False) self.notebook.SetSelection(0) - PANES = ["Drones", "Implants", "Boosters", "Projected", "Gang"] + PANES = ["Drones", "Implants", "Boosters", "Projected", "Fleet"] def select(self, name): self.notebook.SetSelection(self.PANES.index(name)) diff --git a/gui/gangView.py b/gui/gangView.py index 07a27bc01..b8d26dc19 100644 --- a/gui/gangView.py +++ b/gui/gangView.py @@ -73,7 +73,7 @@ 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:", wx.DefaultPosition, wx.DefaultSize, 0 ) + 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 ) ) @@ -91,7 +91,7 @@ class GangView ( ScrolledPanel ): contentFGSizer.Add( self.chFleetChar, 0, wx.ALL | wx.ALIGN_CENTER_VERTICAL, 5 ) - self.stWing = wx.StaticText( self, wx.ID_ANY, u"Wing:", wx.DefaultPosition, wx.DefaultSize, 0 ) + 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 ) @@ -106,7 +106,7 @@ class GangView ( ScrolledPanel ): contentFGSizer.Add( self.chWingChar, 0, wx.ALL| wx.ALIGN_CENTER_VERTICAL, 5 ) - self.stSquad = wx.StaticText( self, wx.ID_ANY, u"Squad:", wx.DefaultPosition, wx.DefaultSize, 0 ) + 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 ) @@ -400,5 +400,5 @@ class GangView ( ScrolledPanel ): # self.Layout() self.AddCommander(draggedFit.ID, booster) - self.mainFrame.additionsPane.select("Gang") + self.mainFrame.additionsPane.select("Fleet") From e4db794117dc4ed063a7979c5bb20855c3949c27 Mon Sep 17 00:00:00 2001 From: HomeWorld Date: Wed, 23 Nov 2011 20:22:22 +0200 Subject: [PATCH 51/55] Do not allow creation of All 0 or All 5 named chars, it gets renamed to something else --- gui/characterEditor.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/gui/characterEditor.py b/gui/characterEditor.py index 3aff2874f..d8af0a122 100644 --- a/gui/characterEditor.py +++ b/gui/characterEditor.py @@ -223,6 +223,10 @@ class CharacterEditor(wx.Frame): def processRename(self, event): cChar = service.Character.getInstance() newName = self.characterRename.GetLineText(0) + + if newName == "All 0" or newName == "All 5": + newName = newName + " bases are belong to us" + charID = self.getActiveCharacter() cChar.rename(charID, newName) From 0e628f7154b753ddcbdd326bba3da5d79cc54f73 Mon Sep 17 00:00:00 2001 From: HomeWorld Date: Thu, 24 Nov 2011 15:23:31 +0200 Subject: [PATCH 52/55] Show a tooltip for fleet fit stuff to let know the user that double clicking increases his APM --- gui/gangView.py | 1 + 1 file changed, 1 insertion(+) diff --git a/gui/gangView.py b/gui/gangView.py index b8d26dc19..67e79ff5e 100644 --- a/gui/gangView.py +++ b/gui/gangView.py @@ -147,6 +147,7 @@ class GangView ( ScrolledPanel ): 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) From deb85977ca94cab63db615863cfb14134fd39933 Mon Sep 17 00:00:00 2001 From: HomeWorld Date: Fri, 25 Nov 2011 17:11:02 +0200 Subject: [PATCH 53/55] Small height increase for additions pane; fixe a font size problem in fleet pane --- gui/additionsPane.py | 2 +- gui/gangView.py | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/gui/additionsPane.py b/gui/additionsPane.py index fc38e76f3..a17357654 100644 --- a/gui/additionsPane.py +++ b/gui/additionsPane.py @@ -46,7 +46,7 @@ class AdditionsPane(TogglePanel): self.notebook = gui.chromeTabs.PFNotebook(pane, False) size = wx.Size() # This size lets you see 4 drones at a time - size.SetHeight(160) + size.SetHeight(180) self.notebook.SetMinSize(size) baseSizer.Add(self.notebook, 1, wx.EXPAND) diff --git a/gui/gangView.py b/gui/gangView.py index 67e79ff5e..8225d868a 100644 --- a/gui/gangView.py +++ b/gui/gangView.py @@ -81,8 +81,6 @@ class GangView ( ScrolledPanel ): self.stFleetFit = wx.StaticText( self, wx.ID_ANY, u"None", wx.DefaultPosition, wx.DefaultSize, 0 ) self.stFleetFit.Wrap( -1 ) - self.stFleetFit.SetFont( wx.Font( wx.NORMAL_FONT.GetPointSize(), 70, 90, 90, False, wx.EmptyString ) ) - contentFGSizer.Add( self.stFleetFit, 0, wx.ALIGN_CENTER_VERTICAL|wx.ALL, 5 ) chFleetCharChoices = [] From fd6631f6fec6358a5c9f04bdbc1ea637d0f0dc43 Mon Sep 17 00:00:00 2001 From: DarkPhoenix Date: Sat, 26 Nov 2011 13:45:23 +0400 Subject: [PATCH 54/55] Update pyfa's submodules --- eos | 2 +- staticdata | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/eos b/eos index b421fe89e..8c66bc714 160000 --- a/eos +++ b/eos @@ -1 +1 @@ -Subproject commit b421fe89ee923e6c53119c751be7c8571813b585 +Subproject commit 8c66bc7140f9047a36f7cb9363529c4135ce529b diff --git a/staticdata b/staticdata index 9155bbead..adf75c744 160000 --- a/staticdata +++ b/staticdata @@ -1 +1 @@ -Subproject commit 9155bbead136b7c1ad2ee2cb9bae637d6d33f2fc +Subproject commit adf75c744871c3e3390abe88249c06760985aae2 From 6774d3bd6fecf51248aef1b1c27cf8f1e89ecc3f Mon Sep 17 00:00:00 2001 From: DarkPhoenix Date: Sat, 26 Nov 2011 16:26:20 +0400 Subject: [PATCH 55/55] Disable debug mode --- config.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config.py b/config.py index b22774482..bb34d9eac 100644 --- a/config.py +++ b/config.py @@ -8,7 +8,7 @@ except ImportError: configforced = None # Turns on debug mode -debug = True +debug = False # Version data version = "1.0.6"