diff --git a/gui/crestFittings.py b/gui/crestFittings.py index 581df7839..a58ba2e5c 100644 --- a/gui/crestFittings.py +++ b/gui/crestFittings.py @@ -12,6 +12,7 @@ class CrestFittings(wx.Frame): self.SetBackgroundColour(wx.SystemSettings.GetColour(wx.SYS_COLOUR_BTNFACE)) + self.mainFrame = parent mainSizer = wx.BoxSizer(wx.VERTICAL) sCrest = service.Crest.getInstance() @@ -49,6 +50,7 @@ class CrestFittings(wx.Frame): mainSizer.Add(contentSizer, 1, wx.EXPAND, 5) self.fetchBtn.Bind(wx.EVT_BUTTON, self.fetchFittings) + self.importBtn.Bind(wx.EVT_BUTTON, self.importFitting) self.SetSizer(mainSizer) self.Layout() @@ -64,6 +66,13 @@ class CrestFittings(wx.Frame): fittings = sCrest.getFittings(self.getActiveCharacter()) self.fitTree.populateSkillTree(fittings) + def importFitting(self, event): + selection = self.fitView.fitSelection + data = self.fitTree.fittingsTreeCtrl.GetPyData(selection) + sFit = service.Fit.getInstance() + fits = sFit.importFitFromBuffer(data) + self.mainFrame._openAfterImport(fits) + class ExportToEve(wx.Frame): @@ -138,15 +147,15 @@ class FittingsTreeView(wx.Panel): self.Layout() - def populateSkillTree(self, json): - if json is None: + def populateSkillTree(self, data): + if data is None: return root = self.root tree = self.fittingsTreeCtrl tree.DeleteChildren(root) dict = {} - fits = json['items'] + fits = data['items'] for fit in fits: if fit['ship']['name'] not in dict: dict[fit['ship']['name']] = [] @@ -156,21 +165,25 @@ class FittingsTreeView(wx.Panel): shipID = tree.AppendItem(root, name) for fit in fits: fitId = tree.AppendItem(shipID, fit['name']) - tree.SetPyData(fitId, fit['items']) + print type(fit) + tree.SetPyData(fitId, json.dumps(fit)) tree.SortChildren(root) def displayFit(self, event): selection = self.fittingsTreeCtrl.GetSelection() - items = self.fittingsTreeCtrl.GetPyData(selection) + fit = json.loads(self.fittingsTreeCtrl.GetPyData(selection)) list = [] - for item in items: - cargo = Cargo(getItem(item['type']['id'])) - cargo.amount = item['quantity'] - list.append(cargo) - self.parent.fitView.populate(list) - self.parent.fitView.refresh(list) + for item in fit['items']: + try: + cargo = Cargo(getItem(item['type']['id'])) + cargo.amount = item['quantity'] + list.append(cargo) + except: + pass + self.parent.fitView.fitSelection = selection + self.parent.fitView.update(list) class FitView(d.Display): DEFAULT_COLS = ["Base Icon", @@ -178,6 +191,6 @@ class FitView(d.Display): def __init__(self, parent): d.Display.__init__(self, parent, style=wx.LC_SINGLE_SEL) - + self.fitSelection = None #self.Bind(wx.EVT_LEFT_DCLICK, self.removeItem) #self.Bind(wx.EVT_KEY_UP, self.kbEvent) diff --git a/gui/mainMenuBar.py b/gui/mainMenuBar.py index 069437c31..a54568ee7 100644 --- a/gui/mainMenuBar.py +++ b/gui/mainMenuBar.py @@ -25,6 +25,7 @@ import gui.graphFrame import gui.globalEvents as GE import service + class MainMenuBar(wx.MenuBar): def __init__(self): self.characterEditorId = wx.NewId() diff --git a/service/port.py b/service/port.py index 1cfbbf297..6951a3765 100644 --- a/service/port.py +++ b/service/port.py @@ -104,6 +104,10 @@ class Port(object): if re.match("<", firstLine): return "XML", cls.importXml(string, callback, encoding) + # If JSON-style start, parse os CREST/JSON + if firstLine[0] == '{': + return "JSON", (cls.importCrest(string),) + # If we've got source file name which is used to describe ship name # and first line contains something like [setup name], detect as eft config file if re.match("\[.*\]", firstLine) and path is not None: @@ -120,9 +124,45 @@ class Port(object): return "DNA", (cls.importDna(string),) @staticmethod - def importCrest(json): - pass + def importCrest(str): + fit = json.loads(str) + sMkt = service.Market.getInstance() + f = Fit() + f.name = fit['name'] + + try: + f.ship = Ship(sMkt.getItem(fit['ship']['id'])) + except: + return None + + items = fit['items'] + items.sort(key=lambda k: k['flag']) + for module in items: + try: + item = sMkt.getItem(module['type']['id'], eager="group.category") + if item.category.name == "Drone": + d = Drone(item) + d.amount = module['quantity'] + f.drones.append(d) + elif item.category.name == "Charge": + c = Cargo(item) + c.amount = module['quantity'] + f.cargo.append(c) + else: + try: + m = Module(item) + # When item can't be added to any slot (unknown item or just charge), ignore it + except ValueError: + continue + if m.isValidState(State.ACTIVE): + m.state = State.ACTIVE + + f.modules.append(m) + except: + continue + + return f @staticmethod def importDna(string):