diff --git a/gui/droneView.py b/gui/droneView.py index d57af36da..3bf099d10 100644 --- a/gui/droneView.py +++ b/gui/droneView.py @@ -26,6 +26,19 @@ import gui.display as d from gui.builtinViewColumns.droneCheckbox import DroneCheckbox from gui.contextMenu import ContextMenu +class DroneViewDrop(wx.PyDropTarget): + def __init__(self, dropFn): + wx.PyDropTarget.__init__(self) + self.dropFn = dropFn + # this is really transferring an EvE itemID + self.dropData = wx.PyTextDataObject() + self.SetDataObject(self.dropData) + + def OnData(self, x, y, t): + if self.GetData(): + self.dropFn(x, y, int(self.dropData.GetText())) + return t + class DroneView(d.Display): DEFAULT_COLS = ["Drone Checkbox", "Drone Name/Amount", @@ -45,6 +58,32 @@ class DroneView(d.Display): else: self.Bind(wx.EVT_RIGHT_DOWN, self.scheduleMenu) + + self.Bind(wx.EVT_LIST_BEGIN_DRAG, self.startDrag) + self.SetDropTarget(DroneViewDrop(self.mergeDrones)) + + def startDrag(self, event): + row = event.GetIndex() + if row != -1: + data = wx.PyTextDataObject() + data.SetText(str(self.GetItemData(row))) + + dropSource = wx.DropSource(self) + dropSource.SetData(data) + res = dropSource.DoDragDrop() + + def mergeDrones(self, x, y, itemID): + srcRow = self.FindItemData(-1,itemID) + dstRow, _ = self.HitTest((x, y)) + if srcRow != -1 and dstRow != -1: + self._merge(srcRow, dstRow) + + def _merge(self, src, dst): + sFit = service.Fit.getInstance() + fitID = self.mainFrame.getActiveFit() + if sFit.mergeDrones(fitID, self.drones[src], self.drones[dst]): + wx.PostEvent(self.mainFrame, fv.FitChanged(fitID=fitID)) + DRONE_ORDER = ('Light Scout Drones', 'Medium Scout Drones', 'Heavy Attack Drones', 'Sentry Drones', 'Fighters', 'Fighter Bombers', 'Combat Utility Drones', diff --git a/gui/fittingView.py b/gui/fittingView.py index 9c8f08557..873e19470 100644 --- a/gui/fittingView.py +++ b/gui/fittingView.py @@ -29,6 +29,19 @@ from gui.builtinViewColumns.moduleState import ModuleState FitChanged, FIT_CHANGED = wx.lib.newevent.NewEvent() +class FittingViewDrop(wx.PyDropTarget): + def __init__(self, dropFn): + wx.PyDropTarget.__init__(self) + self.dropFn = dropFn + # this is really transferring an EvE itemID + self.dropData = wx.PyTextDataObject() + self.SetDataObject(self.dropData) + + def OnData(self, x, y, t): + if self.GetData(): + self.dropFn(x, y, int(self.dropData.GetText())) + return t + class FittingView(d.Display): DEFAULT_COLS = ["Module State", "Module Ammo Icon", @@ -42,19 +55,6 @@ class FittingView(d.Display): "Module Ammo", ] - class FittingViewDrop(wx.PyDropTarget): - def __init__(self, dropFn): - wx.PyDropTarget.__init__(self) - self.dropFn = dropFn - # this is really transferring an EvE itemID - self.dropData = wx.PyTextDataObject() - self.SetDataObject(self.dropData) - - def OnData(self, x, y, t): - if self.GetData(): - self.dropFn(x, y, int(self.dropData.GetText())) - return t - def __init__(self, parent): d.Display.__init__(self, parent) self.Show(False) @@ -66,7 +66,7 @@ class FittingView(d.Display): else: self.Bind(wx.EVT_RIGHT_DOWN, self.scheduleMenu) - self.SetDropTarget(self.FittingViewDrop(self.swapItems)) + self.SetDropTarget(FittingViewDrop(self.swapItems)) self.activeFitID = None self.Bind(wx.EVT_KEY_UP, self.kbEvent) self.Bind(wx.EVT_LEFT_DOWN, self.click) diff --git a/service/fit.py b/service/fit.py index 4464a6ac5..fcd45208e 100644 --- a/service/fit.py +++ b/service/fit.py @@ -304,6 +304,22 @@ class Fit(object): else: return False + def mergeDrones(self, fitID, d1, d2): + if fitID == None: + return False + + fit = eos.db.getFit(fitID) + if d1.item != d2.item: + return False + + fit.drones.remove(d1) + d2.amount += d1.amount + d2.amountActive += d1.amountActive if d1.amountActive > 0 else -d2.amountActive + eos.db.commit() + fit.clear() + fit.calculateModifiedAttributes() + return True + def splitDrones(self, fit, d, amount, l): total = d.amount active = d.amountActive > 0