diff --git a/eos/db/saveddata/damagePattern.py b/eos/db/saveddata/damagePattern.py index b1417dd05..dd625c3e9 100644 --- a/eos/db/saveddata/damagePattern.py +++ b/eos/db/saveddata/damagePattern.py @@ -24,16 +24,20 @@ import datetime from eos.db import saveddata_meta from eos.saveddata.damagePattern import DamagePattern -damagePatterns_table = Table("damagePatterns", saveddata_meta, - Column("ID", Integer, primary_key=True), - Column("name", String), - Column("emAmount", Float), - Column("thermalAmount", Float), - Column("kineticAmount", Float), - Column("explosiveAmount", Float), - Column("ownerID", ForeignKey("users.ID"), nullable=True), - Column("created", DateTime, nullable=True, default=datetime.datetime.now), - Column("modified", DateTime, nullable=True, onupdate=datetime.datetime.now) - ) +damagePatterns_table = Table( + 'damagePatterns', + saveddata_meta, + Column('ID', Integer, primary_key=True), + Column('name', String), + Column('emAmount', Float), + Column('thermalAmount', Float), + Column('kineticAmount', Float), + Column('explosiveAmount', Float), + Column('ownerID', ForeignKey('users.ID'), nullable=True), + Column('created', DateTime, nullable=True, default=datetime.datetime.now), + Column('modified', DateTime, nullable=True, onupdate=datetime.datetime.now)) -mapper(DamagePattern, damagePatterns_table) +mapper( + DamagePattern, + damagePatterns_table, + properties={'rawName': damagePatterns_table.c.name}) diff --git a/eos/db/saveddata/loadDefaultDatabaseValues.py b/eos/db/saveddata/loadDefaultDatabaseValues.py index 5b88f72e1..189cc2f52 100644 --- a/eos/db/saveddata/loadDefaultDatabaseValues.py +++ b/eos/db/saveddata/loadDefaultDatabaseValues.py @@ -128,11 +128,11 @@ class DefaultDatabaseValues: ["[NPC][Other] Sansha Incursion", 1682, 1347, 3678, 3678]] for damageProfileRow in damageProfileList: - name, em, therm, kin, exp = damageProfileRow - damageProfile = eos.db.getDamagePattern(name) + rawName, em, therm, kin, exp = damageProfileRow + damageProfile = eos.db.getDamagePattern(rawName) if damageProfile is None: damageProfile = es_DamagePattern(em, therm, kin, exp) - damageProfile.name = name + damageProfile.rawName = rawName eos.db.add(damageProfile) else: damageProfile.emAmount = em @@ -196,7 +196,7 @@ class DefaultDatabaseValues: ["[NPC][Burner] Sentinel", 0.58, 0.45, 0.52, 0.66]] for targetProfileRow in targetProfileList: - name = targetProfileRow[0] + rawName = targetProfileRow[0] em = targetProfileRow[1] therm = targetProfileRow[2] kin = targetProfileRow[3] @@ -213,10 +213,10 @@ class DefaultDatabaseValues: radius = targetProfileRow[7] except: radius = None - targetProfile = eos.db.getTargetProfile(name) + targetProfile = eos.db.getTargetProfile(rawName) if targetProfile is None: targetProfile = es_TargetProfile(em, therm, kin, exp, maxVel, sigRad, radius) - targetProfile.name = name + targetProfile.rawName = rawName eos.db.add(targetProfile) else: targetProfile.emAmount = em diff --git a/eos/db/saveddata/queries.py b/eos/db/saveddata/queries.py index 0ff84b5a1..9a454cf3b 100644 --- a/eos/db/saveddata/queries.py +++ b/eos/db/saveddata/queries.py @@ -413,7 +413,7 @@ def getDamagePattern(lookfor, eager=None): eager = processEager(eager) with sd_lock: pattern = saveddata_session.query(DamagePattern).options(*eager).filter( - DamagePattern.name == lookfor).first() + DamagePattern.rawName == lookfor).first() else: raise TypeError("Need integer or string as argument") return pattern @@ -434,7 +434,7 @@ def getTargetProfile(lookfor, eager=None): eager = processEager(eager) with sd_lock: pattern = saveddata_session.query(TargetProfile).options(*eager).filter( - TargetProfile.name == lookfor).first() + TargetProfile.rawName == lookfor).first() else: raise TypeError("Need integer or string as argument") return pattern diff --git a/eos/db/saveddata/targetProfile.py b/eos/db/saveddata/targetProfile.py index b0fd9fc76..be6c72625 100644 --- a/eos/db/saveddata/targetProfile.py +++ b/eos/db/saveddata/targetProfile.py @@ -24,23 +24,28 @@ import datetime from eos.db import saveddata_meta from eos.saveddata.targetProfile import TargetProfile -targetProfiles_table = Table("targetResists", saveddata_meta, - Column("ID", Integer, primary_key=True), - Column("name", String), - Column("emAmount", Float), - Column("thermalAmount", Float), - Column("kineticAmount", Float), - Column("explosiveAmount", Float), - Column("maxVelocity", Float, nullable=True), - Column("signatureRadius", Float, nullable=True), - Column("radius", Float, nullable=True), - Column("ownerID", ForeignKey("users.ID"), nullable=True), - Column("created", DateTime, nullable=True, default=datetime.datetime.now), - Column("modified", DateTime, nullable=True, onupdate=datetime.datetime.now) - ) -mapper(TargetProfile, targetProfiles_table, - properties={ - "_maxVelocity": targetProfiles_table.c.maxVelocity, - "_signatureRadius": targetProfiles_table.c.signatureRadius, - "_radius": targetProfiles_table.c.radius}) +targetProfiles_table = Table( + 'targetResists', + saveddata_meta, + Column('ID', Integer, primary_key=True), + Column('name', String), + Column('emAmount', Float), + Column('thermalAmount', Float), + Column('kineticAmount', Float), + Column('explosiveAmount', Float), + Column('maxVelocity', Float, nullable=True), + Column('signatureRadius', Float, nullable=True), + Column('radius', Float, nullable=True), + Column('ownerID', ForeignKey('users.ID'), nullable=True), + Column('created', DateTime, nullable=True, default=datetime.datetime.now), + Column('modified', DateTime, nullable=True, onupdate=datetime.datetime.now)) + +mapper( + TargetProfile, + targetProfiles_table, + properties={ + 'rawName': targetProfiles_table.c.name, + '_maxVelocity': targetProfiles_table.c.maxVelocity, + '_signatureRadius': targetProfiles_table.c.signatureRadius, + '_radius': targetProfiles_table.c.radius}) diff --git a/eos/saveddata/damagePattern.py b/eos/saveddata/damagePattern.py index 20198c829..d113948f8 100644 --- a/eos/saveddata/damagePattern.py +++ b/eos/saveddata/damagePattern.py @@ -141,10 +141,10 @@ class DamagePattern: @classmethod def __generateBuiltins(cls): cls._builtins = OrderedDict() - for id, (name, em, therm, kin, explo) in BUILTINS.items(): + for id, (rawName, em, therm, kin, explo) in BUILTINS.items(): pattern = DamagePattern(emAmount=em, thermalAmount=therm, kineticAmount=kin, explosiveAmount=explo) pattern.ID = id - pattern.name = name + pattern.rawName = rawName pattern.builtin = True cls._builtins[id] = pattern @@ -213,7 +213,7 @@ class DamagePattern: lookup = {} current = eos.db.getDamagePatternList() for pattern in current: - lookup[pattern.name] = pattern + lookup[pattern.rawName] = pattern for line in lines: try: @@ -246,7 +246,7 @@ class DamagePattern: eos.db.save(pattern) else: pattern = DamagePattern(**fields) - pattern.name = name.strip() + pattern.rawName = name.strip() eos.db.save(pattern) patterns.append(pattern) @@ -262,11 +262,33 @@ class DamagePattern: out += "# Values are in following format:\n" out += "# DamageProfile = [name],[EM amount],[Thermal amount],[Kinetic amount],[Explosive amount]\n\n" for dp in patterns: - out += cls.EXPORT_FORMAT % (dp.name, dp.emAmount, dp.thermalAmount, dp.kineticAmount, dp.explosiveAmount) + out += cls.EXPORT_FORMAT % (dp.rawName, dp.emAmount, dp.thermalAmount, dp.kineticAmount, dp.explosiveAmount) return out.strip() + @property + def name(self): + return self.rawName + + @property + def shortName(self): + return self.__parseRawName()[1] + + @property + def hierarchy(self): + return self.__parseRawName()[0] + + def __parseRawName(self): + hierarchy = [] + remainingName = self.rawName.strip() if self.rawName else '' + while True: + start, end = remainingName.find('['), remainingName.find(']') + if start == -1 or end == -1: + return hierarchy, remainingName + hierarchy.append(remainingName[start + 1:end]) + remainingName = remainingName[end + 1:].strip() + def __deepcopy__(self, memo): p = DamagePattern(self.emAmount, self.thermalAmount, self.kineticAmount, self.explosiveAmount) - p.name = "%s copy" % self.name + p.rawName = "%s copy" % self.rawName return p diff --git a/eos/saveddata/targetProfile.py b/eos/saveddata/targetProfile.py index dc0391d4a..62cb2b546 100644 --- a/eos/saveddata/targetProfile.py +++ b/eos/saveddata/targetProfile.py @@ -114,11 +114,11 @@ class TargetProfile: def __generateBuiltins(cls): cls._builtins = OrderedDict() for id, data in BUILTINS.items(): - name = data[0] + rawName = data[0] data = data[1:] profile = TargetProfile(*data) profile.ID = id - profile.name = name + profile.rawName = rawName profile.builtin = True cls._builtins[id] = profile @@ -133,7 +133,7 @@ class TargetProfile: maxVelocity=0, signatureRadius=None, radius=0) - cls._idealTarget.name = 'Ideal Target' + cls._idealTarget.rawName = 'Ideal Target' cls._idealTarget.ID = 0 cls._idealTarget.builtin = True return cls._idealTarget @@ -177,7 +177,7 @@ class TargetProfile: lookup = {} current = eos.db.getTargetProfileList() for pattern in current: - lookup[pattern.name] = pattern + lookup[pattern.rawName] = pattern for line in lines: try: @@ -226,7 +226,7 @@ class TargetProfile: eos.db.save(pattern) else: pattern = TargetProfile(**fields) - pattern.name = name.strip() + pattern.rawName = name.strip() eos.db.save(pattern) patterns.append(pattern) @@ -243,7 +243,7 @@ class TargetProfile: out += "# TargetProfile = [name],[EM %],[Thermal %],[Kinetic %],[Explosive %],[Max velocity m/s],[Signature radius m],[Radius m]\n\n" for dp in patterns: out += cls.EXPORT_FORMAT % ( - dp.name, + dp.rawName, dp.emAmount * 100, dp.thermalAmount * 100, dp.kineticAmount * 100, @@ -255,9 +255,31 @@ class TargetProfile: return out.strip() + @property + def name(self): + return self.rawName + + @property + def shortName(self): + return self.__parseRawName()[1] + + @property + def hierarchy(self): + return self.__parseRawName()[0] + + def __parseRawName(self): + hierarchy = [] + remainingName = self.rawName.strip() if self.rawName else '' + while True: + start, end = remainingName.find('['), remainingName.find(']') + if start == -1 or end == -1: + return hierarchy, remainingName + hierarchy.append(remainingName[start + 1:end]) + remainingName = remainingName[end + 1:].strip() + def __deepcopy__(self, memo): p = TargetProfile( self.emAmount, self.thermalAmount, self.kineticAmount, self.explosiveAmount, self._maxVelocity, self._signatureRadius, self._radius) - p.name = "%s copy" % self.name + p.rawName = "%s copy" % self.rawName return p diff --git a/gui/builtinContextMenus/damagePatternChange.py b/gui/builtinContextMenus/damagePatternChange.py index 466258623..a326c6674 100644 --- a/gui/builtinContextMenus/damagePatternChange.py +++ b/gui/builtinContextMenus/damagePatternChange.py @@ -38,15 +38,10 @@ class ChangeDamagePattern(ContextMenuUnconditional): self.items = (OrderedDict(), OrderedDict()) for pattern in self.patterns: - remainingName = pattern.name.strip() container = self.items - while True: - start, end = remainingName.find('['), remainingName.find(']') - if start == -1 or end == -1: - container[0][remainingName] = pattern - break - container = container[1].setdefault(remainingName[start + 1:end], (OrderedDict(), OrderedDict())) - remainingName = remainingName[end + 1:].strip() + for categoryName in pattern.hierarchy: + container = container[1].setdefault(categoryName, (OrderedDict(), OrderedDict())) + container[0][pattern.shortName] = pattern return list(self.items[0].keys()) + list(self.items[1].keys()) diff --git a/gui/builtinContextMenus/targetProfile/adder.py b/gui/builtinContextMenus/targetProfile/adder.py index 30c982e5b..c789ca5df 100644 --- a/gui/builtinContextMenus/targetProfile/adder.py +++ b/gui/builtinContextMenus/targetProfile/adder.py @@ -62,6 +62,12 @@ class TargetProfileAdder(ContextMenuUnconditional): break container = container[1].setdefault(remainingName[start + 1:end], (OrderedDict(), OrderedDict())) remainingName = remainingName[end + 1:].strip() + items = (OrderedDict(), OrderedDict()) + for profile in profiles: + container = items + for categoryName in profile.hierarchy: + container = container[1].setdefault(categoryName, (OrderedDict(), OrderedDict())) + container[0][profile.shortName] = profile # Category as menu item - expands further msw = "wxMSW" in wx.PlatformInfo diff --git a/gui/builtinContextMenus/targetProfile/switcher.py b/gui/builtinContextMenus/targetProfile/switcher.py index 73fb7579c..76ac67318 100644 --- a/gui/builtinContextMenus/targetProfile/switcher.py +++ b/gui/builtinContextMenus/targetProfile/switcher.py @@ -65,15 +65,10 @@ class TargetProfileSwitcher(ContextMenuUnconditional): self.profileEventMap = {} items = (OrderedDict(), OrderedDict()) for profile in profiles: - remainingName = profile.name.strip() container = items - while True: - start, end = remainingName.find('['), remainingName.find(']') - if start == -1 or end == -1: - container[0][remainingName] = profile - break - container = container[1].setdefault(remainingName[start + 1:end], (OrderedDict(), OrderedDict())) - remainingName = remainingName[end + 1:].strip() + for categoryName in profile.hierarchy: + container = container[1].setdefault(categoryName, (OrderedDict(), OrderedDict())) + container[0][profile.shortName] = profile # Category as menu item - expands further msw = "wxMSW" in wx.PlatformInfo