diff --git a/gui/boosterView.py b/gui/boosterView.py index 1e96af409..fbb4ace7b 100644 --- a/gui/boosterView.py +++ b/gui/boosterView.py @@ -32,6 +32,9 @@ class BoosterView(d.Display): def __init__(self, parent): d.Display.__init__(self, parent, style=wx.LC_SINGLE_SEL | wx.BORDER_NONE) + + self.lastFitId = None + self.mainFrame.Bind(GE.FIT_CHANGED, self.fitChanged) self.mainFrame.Bind(mb.ITEM_SELECTED, self.addItem) self.Bind(wx.EVT_LEFT_DCLICK, self.removeItem) @@ -42,10 +45,29 @@ class BoosterView(d.Display): self.Bind(wx.EVT_RIGHT_DOWN, self.scheduleMenu) def fitChanged(self, event): + + #Clear list and get out if current fitId is None + if event.fitID is None and self.lastFitId is not None: + self.DeleteAllItems() + self.lastFitId = None + event.Skip() + return + cFit = service.Fit.getInstance() fit = cFit.getFit(event.fitID) stuff = fit.boosters if fit is not None else None + + if event.fitID != self.lastFitId: + self.lastFitId = event.fitID + + item = self.GetNextItem(-1, wx.LIST_NEXT_ALL, wx.LIST_STATE_DONTCARE) + + if item != -1: + self.EnsureVisible(item) + + self.deselectItems() + self.populate(stuff) self.refresh(stuff) event.Skip() @@ -63,10 +85,12 @@ class BoosterView(d.Display): def removeItem(self, event): row, _ = self.HitTest(event.Position) if row != -1: - fitID = self.mainFrame.getActiveFit() - cFit = service.Fit.getInstance() - cFit.removeBooster(fitID, self.GetItemData(row)) - wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=fitID)) + col = self.getColumn(event.Position) + if col != self.getColIndex(State): + fitID = self.mainFrame.getActiveFit() + cFit = service.Fit.getInstance() + cFit.removeBooster(fitID, self.GetItemData(row)) + wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=fitID)) def click(self, event): event.Skip() diff --git a/gui/display.py b/gui/display.py index c9865289e..46c5e05b7 100644 --- a/gui/display.py +++ b/gui/display.py @@ -24,7 +24,6 @@ import gui.mainFrame from gui.viewColumn import ViewColumn from gui.cachingImageList import CachingImageList - class Display(wx.ListCtrl): def __init__(self, parent, size = wx.DefaultSize, style = 0): @@ -36,6 +35,9 @@ class Display(wx.ListCtrl): self.Bind(wx.EVT_LIST_COL_END_DRAG, self.resizeChecker) self.Bind(wx.EVT_LIST_COL_BEGIN_DRAG, self.resizeSkip) + if "wxMSW" in wx.PlatformInfo: + self.Bind(wx.EVT_ERASE_BACKGROUND, self.OnEraseBk) + self.mainFrame = gui.mainFrame.MainFrame.getInstance() i = 0 @@ -68,6 +70,42 @@ class Display(wx.ListCtrl): self.imageListBase = self.imageList.ImageCount + + def OnEraseBk(self,event): + if self.GetItemCount() >0: + width, height = self.GetClientSize() + dc = event.GetDC() + + dc.DestroyClippingRegion() + dc.SetClippingRegion(0, 0, width, height) + x,y,w,h = dc.GetClippingBox() + + topItem = self.GetTopItem() + bottomItem = topItem + self.GetCountPerPage() + + if bottomItem >= self.GetItemCount(): + bottomItem = self.GetItemCount() - 1 + + topRect = self.GetItemRect(topItem, wx.LIST_RECT_LABEL) + bottomRect = self.GetItemRect(bottomItem, wx.LIST_RECT_BOUNDS) + + + items_rect = wx.Rect(topRect.left, 0, bottomRect.right - topRect.left, bottomRect.bottom ) + + updateRegion = wx.Region(x,y,w,h) + updateRegion.SubtractRect(items_rect) + + dc.DestroyClippingRegion() + dc.SetClippingRegionAsRegion(updateRegion) + + dc.SetBackground(wx.Brush(self.GetBackgroundColour(), wx.SOLID)) + dc.Clear() + + dc.DestroyClippingRegion() + + else: + event.Skip() + def addColumn(self, i, col): self.activeColumns.append(col) info = wx.ListItem() @@ -114,23 +152,47 @@ class Display(wx.ListCtrl): self.SetColumnWidth(column,self.columnsMinWidth[column]) colItem.resized = True - def populate(self, stuff): - selection = [] + def getLastItem( self, state = wx.LIST_STATE_DONTCARE): + lastFound = -1 + while True: + index = self.GetNextItem( + lastFound, + wx.LIST_NEXT_ALL, + state, + ) + if index == -1: + break + else: + lastFound = index + return lastFound + def deselectItems(self): sel = self.GetFirstSelected() while sel != -1: - selection.append(sel) + self.SetItemState(sel, 0, wx.LIST_STATE_SELECTED | wx.LIST_STATE_FOCUSED) sel = self.GetNextSelected(sel) - self.DeleteAllItems() + def populate(self, stuff): if stuff is not None: - for id, st in enumerate(stuff): - index = self.InsertStringItem(sys.maxint, "") + listItemCount = self.GetItemCount() + stuffItemCount = len(stuff) + + if listItemCount < stuffItemCount: + for i in xrange(stuffItemCount - listItemCount): + index = self.InsertStringItem(sys.maxint, "") + + if listItemCount > stuffItemCount: + if listItemCount - stuffItemCount > 20 and stuffItemCount < 20: + self.DeleteAllItems() + for i in xrange(stuffItemCount): + index = self.InsertStringItem(sys.maxint, "") + else: + for i in xrange(listItemCount - stuffItemCount): + self.DeleteItem(self.getLastItem()) + self.Refresh() - for sel in selection: - self.Select(sel) def refresh(self, stuff): if stuff == None: @@ -170,7 +232,6 @@ class Display(wx.ListCtrl): self.SetItemData(item, id) - # self.Freeze() if 'wxMSW' in wx.PlatformInfo: for i,col in enumerate(self.activeColumns): diff --git a/gui/droneView.py b/gui/droneView.py index 602a9f5bf..581545769 100644 --- a/gui/droneView.py +++ b/gui/droneView.py @@ -50,6 +50,9 @@ class DroneView(d.Display): def __init__(self, parent): d.Display.__init__(self, parent, style=wx.LC_SINGLE_SEL | wx.BORDER_NONE) + + self.lastFitId = None + self.mainFrame.Bind(GE.FIT_CHANGED, self.fitChanged) self.mainFrame.Bind(mb.ITEM_SELECTED, self.addItem) self.Bind(wx.EVT_LEFT_DCLICK, self.removeItem) @@ -98,14 +101,34 @@ class DroneView(d.Display): drone.item.name) def fitChanged(self, event): + + #Clear list and get out if current fitId is None + if event.fitID is None and self.lastFitId is not None: + self.DeleteAllItems() + self.lastFitId = None + event.Skip() + return + cFit = service.Fit.getInstance() fit = cFit.getFit(event.fitID) self.original = fit.drones if fit is not None else None self.drones = stuff = fit.drones[:] if fit is not None else None + if stuff is not None: stuff.sort(key=self.droneKey) + + if event.fitID != self.lastFitId: + self.lastFitId = event.fitID + + item = self.GetNextItem(-1, wx.LIST_NEXT_ALL, wx.LIST_STATE_DONTCARE) + + if item != -1: + self.EnsureVisible(item) + + self.deselectItems() + self.update(stuff) event.Skip() diff --git a/gui/implantView.py b/gui/implantView.py index d0247c884..7fcbd8562 100644 --- a/gui/implantView.py +++ b/gui/implantView.py @@ -31,6 +31,9 @@ class ImplantView(d.Display): def __init__(self, parent): d.Display.__init__(self, parent, style=wx.LC_SINGLE_SEL | wx.BORDER_NONE) + + self.lastFitId = None + self.mainFrame.Bind(GE.FIT_CHANGED, self.fitChanged) self.mainFrame.Bind(mb.ITEM_SELECTED, self.addItem) self.Bind(wx.EVT_LEFT_DCLICK, self.removeItem) @@ -53,12 +56,30 @@ class ImplantView(d.Display): wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=fitID)) def fitChanged(self, event): + #Clear list and get out if current fitId is None + if event.fitID is None and self.lastFitId is not None: + self.DeleteAllItems() + self.lastFitId = None + event.Skip() + return + cFit = service.Fit.getInstance() fit = cFit.getFit(event.fitID) self.original = fit.implants if fit is not None else None self.implants = stuff = fit.implants if fit is not None else None if stuff is not None: stuff.sort(key=lambda implant: implant.slot) + + if event.fitID != self.lastFitId: + self.lastFitId = event.fitID + + item = self.GetNextItem(-1, wx.LIST_NEXT_ALL, wx.LIST_STATE_DONTCARE) + + if item != -1: + self.EnsureVisible(item) + + self.deselectItems() + self.populate(stuff) self.refresh(stuff) event.Skip() @@ -76,11 +97,13 @@ class ImplantView(d.Display): def removeItem(self, event): row, _ = self.HitTest(event.Position) if row != -1: - fitID = self.mainFrame.getActiveFit() - cFit = service.Fit.getInstance() - implant = self.implants[self.GetItemData(row)] - cFit.removeImplant(fitID, self.original.index(implant)) - wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=fitID)) + col = self.getColumn(event.Position) + if col != self.getColIndex(State): + fitID = self.mainFrame.getActiveFit() + cFit = service.Fit.getInstance() + implant = self.implants[self.GetItemData(row)] + cFit.removeImplant(fitID, self.original.index(implant)) + wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=fitID)) def click(self, event): event.Skip() diff --git a/gui/marketBrowser.py b/gui/marketBrowser.py index 0234f8911..06e3e301a 100644 --- a/gui/marketBrowser.py +++ b/gui/marketBrowser.py @@ -332,6 +332,7 @@ class ItemView(d.Display): return (item.metaGroup.parent.name, item.metaGroup.ID , item.name) def populate(self, stuff): + self.deselectItems() stuff.sort(key=self.itemSort) self.active = stuff d.Display.populate(self, stuff) diff --git a/gui/projectedView.py b/gui/projectedView.py index 630a9b8d4..28e2ad3c7 100644 --- a/gui/projectedView.py +++ b/gui/projectedView.py @@ -49,6 +49,9 @@ class ProjectedView(d.Display): def __init__(self, parent): d.Display.__init__(self, parent, style = wx.LC_SINGLE_SEL | wx.BORDER_NONE) + + self.lastFitId = None + self.mainFrame.Bind(GE.FIT_CHANGED, self.fitChanged) self.Bind(wx.EVT_LEFT_DOWN, self.click) self.Bind(wx.EVT_RIGHT_DOWN, self.click) @@ -108,6 +111,13 @@ class ProjectedView(d.Display): return fit.name def fitChanged(self, event): + #Clear list and get out if current fitId is None + if event.fitID is None and self.lastFitId is not None: + self.DeleteAllItems() + self.lastFitId = None + event.Skip() + return + cFit = service.Fit.getInstance() fit = cFit.getFit(event.fitID) stuff = [] @@ -124,6 +134,15 @@ class ProjectedView(d.Display): stuff.extend(self.drones) stuff.extend(self.fits) + if event.fitID != self.lastFitId: + self.lastFitId = event.fitID + + item = self.GetNextItem(-1, wx.LIST_NEXT_ALL, wx.LIST_STATE_DONTCARE) + + if item != -1: + self.EnsureVisible(item) + + self.deselectItems() self.update(stuff) def get(self, row):