diff --git a/eos b/eos index f964b3255..dfe939dad 160000 --- a/eos +++ b/eos @@ -1 +1 @@ -Subproject commit f964b32559a058871f241308cef365a9e7828c5e +Subproject commit dfe939dadf97ff98cf58ae6b00fff230563caafd diff --git a/gui/characterSelection.py b/gui/characterSelection.py index 2f17226b8..b30c10212 100644 --- a/gui/characterSelection.py +++ b/gui/characterSelection.py @@ -79,7 +79,7 @@ class CharacterSelection(wx.Panel): if not picked: charID = cChar.all0ID() self.selectChar(charID) - fitID = self.mainFrame.fitMultiSwitch.getActiveFit() + fitID = self.mainFrame.getActiveFit() cFit = service.Fit.getInstance() cFit.changeChar(fitID, charID) @@ -87,7 +87,7 @@ class CharacterSelection(wx.Panel): event.Skip() def charChanged(self, event): - fitID = self.mainFrame.fitMultiSwitch.getActiveFit() + fitID = self.mainFrame.getActiveFit() charID = self.getActiveCharacter() cFit = service.Fit.getInstance() diff --git a/miniframe.py b/gui/chromeTabs.py similarity index 88% rename from miniframe.py rename to gui/chromeTabs.py index 862cbee79..bc4fb2228 100755 --- a/miniframe.py +++ b/gui/chromeTabs.py @@ -1,1081 +1,1021 @@ -#!/usr/bin/env python - -# --------------------------------------------------------------------------------- # -# Pyfa's custom Notebook core python IMPLEMENTATION -# -# Darriele (homeworld using gmail point com) - 10/27/2010 -# Updated: 11/11/2010 -# -# --------------------------------------------------------------------------------- # - -import wx -import copy -import time - -class PFTabRenderer: - def __init__(self, size = (36,24), text = wx.EmptyString, img = None, inclination = 6 , closeButton = True, fontSize = 8): - - # tab left/right zones inclination - self.inclination = inclination - self.text = text - self.img = img - self.tabSize = size - self.closeButton = closeButton - self.fontSize = fontSize - self.selected = False - self.closeBtnHovering = False - self.tabBitmap = None - self.cbSize = 5 - self.position = (0, 0) # Not used internaly for rendering - helper for tab container - self.InitTab() - - def SetPosition(self, position): - self.position = position - - def GetPosition(self): - return self.position - - def GetSize(self): - return self.tabSize - - def SetSize(self, size): - otw,oth = self.tabSize - self.tabSize = size - w,h = self.tabSize - if h != oth: - self.InitTab(True) - else: - self.InitTab() - - def SetSelected(self, sel = True): - self.selected = sel - self.InitColors() - self._Render() - - def GetSelected(self): - return self.selected - - def IsSelected(self): - return self.selected - - def ShowCloseButtonHovering(self, hover = True): - if self.closeBtnHovering != hover: - self.closeBtnHovering = hover - self._Render() - - def GetCloseButtonHoverStatus(self): - return self.closeBtnHovering - - def GetTabRegion(self): - nregion = self.CopyRegion(self.tabRegion) - nregion.SubtractRegion(self.closeBtnRegion) if self.closeButton else self.tabRegion - return nregion - - def GetCloseButtonRegion(self): - return self.CopyRegion(self.closeBtnRegion) - - def GetMinSize(self): - ebmp = wx.EmptyBitmap(1,1) - mdc = wx.MemoryDC() - mdc.SelectObject(ebmp) - mdc.SetFont(self.font) - textSizeX, textSizeY = mdc.GetTextExtent(self.text) - totalSize = self.lrZoneWidth * 2 + textSizeX + self.cbSize*2 if self.closeButton else 0 - mdc.SelectObject(wx.NullBitmap) - return (totalSize, self.tabHeight) - - - def CopyRegion(self, region): - rect = region.GetBox() - - newRegion = wx.Region(rect.X, rect.Y, rect.Width, rect.Height) - newRegion.IntersectRegion(region) - - return newRegion - - def InitTab(self, skipLRzones = False): - self.tabWidth, self.tabHeight = self.tabSize - - # content width is tabWidth - (left+right) zones - - self.contentWidth = self.tabWidth - self.inclination * 6 - self.cbSize if self.closeButton else 0 - - self.leftZoneSpline = [] - self.rightZoneSpline = [] - - self.lrZoneWidth = self.inclination * 3 - if not skipLRzones: - self.CreateLRZoneSplines() - - self.leftRegion = self.CreateLeftRegion() - self.rightRegion = self.CreateRightRegion() - - self.contentRegion = wx.Region(0, 0, self.contentWidth, self.tabHeight) - self.tabRegion = None - self.closeBtnRegion = None - self.font = wx.Font(self.fontSize, wx.SWISS, wx.NORMAL, wx.NORMAL, False) - - self.InitTabRegions() - self.InitColors() - self._Render() - - def InitColors(self): - self.tabColor = wx.SystemSettings_GetColour(wx.SYS_COLOUR_WINDOW) - self.leftColor = self.CalculateColor(self.tabColor, 0x2F) - self.rightColor = self.CalculateColor(self.tabColor, 0x44) - self.gradientStartColor = self.CalculateColor(self.tabColor, 0x17 if self.selected else 0x20) - - def CalculateColor(self, color, delta): - bkR ,bkG , bkB = color - if bkR + bkG + bkB > 127*3: - scale = - delta - else: - scale = delta*2 - - r = bkR + scale - g = bkG + scale - b = bkB + scale - - r = min(max(r,0),255) - b = min(max(b,0),255) - g = min(max(g,0),255) - - return wx.Colour(r,g,b) - - def InitTabRegions(self): - self.tabRegion = wx.Region(0, 0, self.tabWidth, self.tabHeight) - self.tabRegion.IntersectRegion(self.leftRegion) - - self.contentRegion.Offset(self.lrZoneWidth, 0) - self.tabRegion.UnionRegion(self.contentRegion) - - self.rightRegion.Offset(self.tabWidth - self.lrZoneWidth, 0) - self.tabRegion.UnionRegion(self.rightRegion) - self.closeBtnRegion = wx.Region(self.tabWidth - self.lrZoneWidth - self.cbSize -2 , (self.tabHeight - self.cbSize) / 2 - 2, self.cbSize + 4, self.cbSize + 4) - cbtRegion = wx.Region(self.tabWidth - self.lrZoneWidth - self.cbSize ,0, self.cbSize, self.tabHeight) - self.tabRegion.UnionRegion(cbtRegion) - - def CreateLRZoneSplines(self): - height = self.tabHeight - inc = self.inclination - - self.leftZoneSpline = [wx.Point(0, height), wx.Point(inc * 2/3, height - inc/2), wx.Point(inc+inc/2, 2), - wx.Point(inc * 3, 0)] - self.rightZoneSpline = [wx.Point(0, 0), wx.Point(inc+inc/2,2),wx.Point(inc*2 +inc*2/3,height-inc/2), wx.Point(inc*3,height) ] - - def CreateLeftRegion(self): - - width = self.lrZoneWidth + 1 - height = self.tabHeight + 1 - inc = self.inclination - - mdc = wx.MemoryDC() - - mbmp = wx.EmptyBitmap(width,height,24) - mdc.SelectObject(mbmp) - - mdc.SetBackground( wx.Brush((123,123,123))) - mdc.Clear() - - mdc.SetPen( wx.Pen("#000000", width = 1 ) ) - mdc.DrawSpline(self.leftZoneSpline) - - mdc.SetBrush(wx.Brush(wx.Colour(255,255,0), wx.SOLID)) - ret = mdc.FloodFill(inc*2,height-inc, wx.Color(123,123,123), wx.FLOOD_SURFACE) - if not ret: - print "FloodFill failed" - - mdc.SelectObject(wx.NullBitmap) - -# mbmp.SetMaskColour( (123, 123, 123) ) - - region = wx.Region() - region.UnionBitmapColour(mbmp, wx.Colour(123,123,123)) - region.Offset(-1,0) - - return region - - def CreateRightRegion(self): - - width = self.lrZoneWidth + 1 - height = self.tabHeight - inc = self.inclination - - mdc = wx.MemoryDC() - - mbmp = wx.EmptyBitmap(width,height,24) - mdc.SelectObject(mbmp) - - mdc.SetBackground( wx.Brush((123,123,123), wx.SOLID)) - mdc.Clear() - - mdc.SetPen( wx.Pen("#000000", width = 1 ) ) - mdc.DrawSpline(self.rightZoneSpline) - - mdc.SetBrush(wx.Brush(wx.Colour(255,255,0))) - ret = mdc.FloodFill(inc,height-inc, wx.Color(123,123,123), wx.FLOOD_SURFACE) - if not ret: - print "FloodFill failed" - mdc.SelectObject(wx.NullBitmap) - - region = wx.Region() - region.UnionBitmapColour(mbmp, wx.Colour(123,123,123)) - - return region - - def OffsetPointList(self, list , x, y): - tlist = [] - for i in list: - tlist.append(wx.Point(i.x + x, i.y + y)) - - return tlist - - def Render(self): - return self.tabBitmap - - def _Render(self): - if self.tabBitmap: - del self.tabBitmap - - inc = self.lrZoneWidth - height = self.tabHeight - width = self.tabWidth - contentWidth = self.contentWidth + self.cbSize if self.closeButton else 0 - - rect = wx.Rect(0,0,self.tabWidth, self.tabHeight) - - canvas = wx.EmptyBitmap(rect.width, rect.height) - - mdc = wx.MemoryDC() - - mdc.SelectObject(canvas) - mdc.SetBackground(wx.Brush ((13,22,31))) - mdc.Clear() - mdc.DestroyClippingRegion() - mdc.SetClippingRegionAsRegion(self.tabRegion) - - r = copy.copy(rect) - r.top = r.left = 0 - r.height = height - - mdc.GradientFillLinear(r,self.gradientStartColor,self.tabColor,wx.SOUTH) - mdc.SetPen( wx.Pen(self.leftColor, width = 1 ) ) - - dpleft = self.OffsetPointList(self.leftZoneSpline, -1, 0) - dpright = self.OffsetPointList(self.rightZoneSpline, inc + contentWidth, 0) - - mdc.DrawSpline(dpleft) - mdc.SetPen( wx.Pen(self.rightColor, width = 1 ) ) - mdc.DrawSpline(dpright) - - lrect = wx.Rect() - lrect.left=inc - 1 - lrect.top=0 - lrect.width = contentWidth+1 - lrect.height = 1 - mdc.GradientFillLinear(lrect,self.leftColor,self.rightColor, wx.EAST) -# if not self.selected: -# mdc.DrawLine(0,height - 1,width,height - 1) - mdc.SetPen( wx.Pen(self.rightColor, width = 1 ) ) - if self.closeButton: - cbsize = self.cbSize - - cbx = width - self.lrZoneWidth-cbsize - cby = (height - cbsize)/2 - if self.closeBtnHovering: - mdc.SetPen( wx.Pen( wx.Colour(255,22,22), 0)) - mdc.SetBrush(wx.Brush(wx.Colour(255,22,22))) - mdc.DrawCircle(cbx + cbsize / 2 +1, cby + cbsize / 2 + 1, cbsize) - selColor = self.CalculateColor(wx.SystemSettings.GetColour(wx.SYS_COLOUR_WINDOWTEXT), 255) - mdc.SetPen( wx.Pen( selColor, 1)) - - mdc.DrawLine(cbx, cby, cbx + cbsize + 1 , cby + cbsize + 1 ) - mdc.DrawLine(cbx, cby + cbsize, cbx + cbsize + 1, cby - 1 ) - - mdc.SetClippingRegionAsRegion(self.contentRegion) - mdc.SetFont(self.font) - text = self.text - fnwidths = mdc.GetPartialTextExtents(text) - count = 0 - maxsize = self.contentWidth - self.cbSize if self.closeButton else 0 - for i in fnwidths: - if i <= maxsize: - count +=1 - else: - break - -# text = "%s%s" % (text[:count],"." if len(text)>count else "") - text = "%s" % text[:count] - - - tx,ty = mdc.GetTextExtent(text) - if self.selected: - mdc.SetTextForeground(wx.SystemSettings.GetColour(wx.SYS_COLOUR_WINDOWTEXT)) - else: - color = self.CalculateColor(wx.SystemSettings.GetColour(wx.SYS_COLOUR_WINDOWTEXT), 0x44) - mdc.SetTextForeground(color) - mdc.DrawText(text, inc, height / 2 - ty / 2) - - mdc.DestroyClippingRegion() - - mdc.SelectObject(wx.NullBitmap) - canvas.SetMaskColour((13,22,31)) -# if not self.selected: -# img = canvas.ConvertToImage() -# img = img.AdjustChannels(1, 1, 1, 0.8) -# canvas = wx.BitmapFromImage(img) - self.tabBitmap = canvas - -class PFAddRenderer: - def __init__(self, size = (24,12)): - self.width, self.height = size - self.addBitmap = None - self.spline = [] - self.inclination = 3 - self.region = None - self.InitRenderer() - - def GetSize(self): - return (self.width, self.height) - - def InitRenderer(self): - self.CreateSpline() - self.region = self.CreateRegion() - self._Render() - - def CreateSpline(self): - width = self.width - height = self.height - 1 - inc = self.inclination - - self.spline = [wx.Point(0, 0), wx.Point(inc*3/2, height),wx.Point(inc*2 + inc*2/3, height), wx.Point(width, height), wx.Point(width, height), - wx.Point(width - inc, inc), wx.Point(width - inc*2, 0), wx.Point(0, 0), wx.Point(0, 0)] - def CreateRegion(self): - width = self.width - height = self.height - inc = self.inclination - - mdc = wx.MemoryDC() - - mbmp = wx.EmptyBitmap(width,height) - mdc.SelectObject(mbmp) - - mdc.SetBackground( wx.Brush((255,255,255))) - mdc.Clear() - - mdc.SetPen( wx.Pen("#000000", width = 1 ) ) - mdc.DrawSpline(self.spline) - - mdc.SetBrush(wx.Brush((255,255,0))) - mdc.FloodFill(width/2,height/2, wx.Color(0,0,0), wx.FLOOD_BORDER) - - mdc.SelectObject(wx.NullBitmap) - - mbmp.SetMaskColour( (255, 255, 255) ) - - region = wx.RegionFromBitmap(mbmp) -# region.Offset(-1,0) - - return region - - def CalculateColor(self, color, delta): - bkR ,bkG , bkB = color - if bkR + bkG + bkB > 127*3: - scale = - delta - else: - scale = delta*2 - - r = bkR + scale - g = bkG + scale - b = bkB + scale - - r = min(max(r,0),255) - b = min(max(b,0),255) - g = min(max(g,0),255) - - return wx.Colour(r,b,g) - - def Render(self): - return self.addBitmap - - def _Render(self): - inc = self.inclination - rect = wx.Rect(0 ,0 ,self.width, self.height) - if self.addBitmap: - del self.addBitmap - - canvas = wx.EmptyBitmap(self.width, self.height) - - mdc = wx.MemoryDC() - mdc.SelectObject(canvas) - - mdc.SetBackground(wx.Brush ((13,22,31))) - mdc.Clear() - - mdc.DestroyClippingRegion() - mdc.SetClippingRegionAsRegion(self.region) -# mdc.GradientFillLinear(rect, (0x30,0x30,0x30), (0x6f,0x6f,0x6f), wx.SOUTH) - mdc.FloodFill(self.width/2,self.height/2, wx.Color(13,22,31), wx.FLOOD_BORDER) - mdc.DestroyClippingRegion() - mdc.SetPen( wx.Pen( wx.SystemSettings.GetColour(wx.SYS_COLOUR_WINDOWTEXT), 1)) - mdc.DrawSpline(self.spline) - mdc.SelectObject(wx.NullBitmap) - - canvas.SetMaskColour((13,22,31)) - - img = canvas.ConvertToImage() - if not img.HasAlpha(): - img.InitAlpha() - img = img.AdjustChannels(1, 1, 1, 0.6) - img = img.Blur(1) - bbmp = wx.BitmapFromImage(img) - - del mdc - del canvas - canvas = wx.EmptyBitmap(self.width, self.height) - - mdc = wx.MemoryDC() - mdc.SelectObject(canvas) - - mdc.SetBackground(wx.Brush ((255,255,255 , 0))) - mdc.Clear() - - mdc.DrawBitmap(bbmp,0,0,True) - - cx = self.width / 2 - 1 - cy = self.height / 2 - - mdc.SetPen( wx.Pen( wx.SystemSettings.GetColour(wx.SYS_COLOUR_WINDOWTEXT), 1)) - mdc.DrawLine(cx - inc + 1, cy, cx + inc + 1, cy) - mdc.DrawLine(cx - inc + 1, cy-1, cx + inc + 1, cy-1) - mdc.DrawLine(cx, cy - inc, cx, cy + inc ) - mdc.DrawLine(cx+1, cy - inc, cx+1, cy + inc ) - - self.wColor = wx.SystemSettings_GetColour(wx.SYS_COLOUR_WINDOW) - color = self.CalculateColor(self.wColor, 0x99) - mdc.SetPen( wx.Pen( color, 1)) - - mdc.DrawSpline(self.spline) - - mdc.SelectObject(wx.NullBitmap) - canvas.SetMaskColour((255,255,255)) - - img = canvas.ConvertToImage() - if not img.HasAlpha(): - img.InitAlpha() - img = img.AdjustChannels(1, 1, 1, 0.3) - - bbmp = wx.BitmapFromImage(img) - self.addBitmap = bbmp - - -class PFTabsContainer(wx.Window): - def __init__(self, parent, pos = (0,0), size = (100,27), id = wx.ID_ANY): - wx.Window.__init__(self, parent, id , pos, size , style = 0) - self.tabs = [] - width, height = size - self.width = width - self.height = height - 3 - self.containerHeight = height - self.startDrag = False - self.dragging = False - self.reserved = 48 - self.inclination = 6 - self.dragTrail = 3 - self.dragx = 0 - self.dragy = 0 - self.draggedTab = None - self.dragTrigger = self.dragTrail - - self.tabContainerWidth = width - self.reserved - self.tabMinWidth = width - self.tabShadow = None - - self.addButton = PFAddRenderer() - self.addBitmap = self.addButton.Render() - - self.Bind(wx.EVT_PAINT, self.OnPaint) - self.Bind(wx.EVT_ERASE_BACKGROUND, self.OnErase) - self.Bind(wx.EVT_LEFT_DOWN, self.OnLeftDown) - self.Bind(wx.EVT_LEFT_UP, self.OnLeftUp) - self.Bind(wx.EVT_MOTION, self.OnMotion) - self.Bind(wx.EVT_SIZE, self.OnSize) - self.tabShadow = PFTabRenderer((self.tabMinWidth, self.height + 1), inclination = self.inclination) - - def OnSize(self, event): - self.UpdateSize() - event.Skip() - - def UpdateSize(self): - width, dummy = self.GetSize() - if width != self.width: - self.width = width - self.tabContainerWidth = self.width - self.reserved - self.AdjustTabsSize() - - def OnLeftDown(self, event): - mposx,mposy = event.GetPosition() - if not self.startDrag: - tab = self.FindTabAtPos(mposx, mposy) - if tab: - self.CheckTabSelected(tab, mposx, mposy) - self.startDrag = True - tx,ty = tab.GetPosition() - self.dragx = mposx - tx - self.dragy = self.containerHeight - self.height - self.Refresh() - - self.draggedTab = tab - - def OnLeftUp(self, event): - mposx,mposy = event.GetPosition() - if self.startDrag and self.dragging: - self.dragging = False - self.startDrag = False - self.draggedTab = None - self.dragTrigger = self.dragTrail - self.UpdateTabsPosition() - self.Refresh() - if self.HasCapture(): - self.ReleaseMouse() - return - - if self.startDrag: - self.startDrag = False - self.dragTrigger = self.dragTrail - - if self.GetTabsCount() == 0: - return - selTab = self.GetSelectedTab() - - if self.CheckTabClose(selTab, mposx, mposy): - return - -# if self.CheckTabSelected(selTab, mposx, mposy): -# return - - for tab in self.tabs: - - if self.CheckTabClose(tab, mposx, mposy): - return - -# if self.CheckTabSelected(tab, mposx, mposy): -# return - - def GetSelectedTab(self): - for tab in self.tabs: - if tab.GetSelected(): - return tab - return None - - def GetSelected(self): - for tab in self.tabs: - if tab.GetSelected(): - return self.tabs.index(tab) - return None - - def CheckTabSelected(self,tab, mposx, mposy): - - oldSelTab = self.GetSelectedTab() - if oldSelTab == tab: - return True - - if self.TabHitTest(tab, mposx, mposy): - tab.SetSelected(True) - if tab != oldSelTab: - oldSelTab.SetSelected(False) - self.Refresh() - print "Selected: %s" %tab.text - - selTab = self.tabs.index(tab) - self.Parent.SetSelected(selTab) - - return True - return False - - def CheckTabClose(self, tab, mposx, mposy): - closeBtnReg = tab.GetCloseButtonRegion() - tabPosX, tabPosY = tab.GetPosition() - - closeBtnReg.Offset(tabPosX,tabPosY) - - if closeBtnReg.Contains(mposx, mposy): - print "Close tab: %s" % tab.text - index = self.GetTabIndex(tab) - self.DeleteTab(index) - return True - return False - - def CheckCloseButtons(self, mposx, mposy): - dirty = False - - for tab in self.tabs: - closeBtnReg = tab.GetCloseButtonRegion() - tabPos = tab.GetPosition() - tabPosX, tabPosY = tabPos - closeBtnReg.Offset(tabPosX,tabPosY) - if closeBtnReg.Contains(mposx,mposy): - if not tab.GetCloseButtonHoverStatus(): - tab.ShowCloseButtonHovering(True) - dirty = True - else: - if tab.GetCloseButtonHoverStatus(): - tab.ShowCloseButtonHovering(False) - dirty = True - if dirty: - self.Refresh() - - def FindTabAtPos(self, x, y): - if self.GetTabsCount() == 0: - return None - selTab = self.GetSelectedTab() - if self.TabHitTest(selTab, x, y): - return selTab - - for tab in self.tabs: - if self.TabHitTest(tab, x, y): - return tab - return None - - def TabHitTest(self, tab, x, y): - tabRegion = tab.GetTabRegion() - tabPos = tab.GetPosition() - tabPosX, tabPosY = tabPos - tabRegion.Offset(tabPosX, tabPosY) - if tabRegion.Contains(x, y): - return True - return False - - def GetTabAtLeft(self, tabIndex): - if tabIndex>0: - return self.tabs[tabIndex - 1] - else: - return None - - def GetTabAtRight(self, tabIndex): - if tabIndex < self.GetTabsCount() - 1: - return self.tabs[tabIndex + 1] - else: - return None - - def SwitchTabs(self, src, dest, draggedTab = None): - self.tabs[src], self.tabs[dest] = self.tabs[dest], self.tabs[src] - self.UpdateTabsPosition(draggedTab) - - self.Parent.SwitchPages(src,dest, True) - - self.Refresh() - - def GetTabIndex(self, tab): - return self.tabs.index(tab) - - def OnMotion(self, event): - mposx,mposy = event.GetPosition() - if self.startDrag: - if not self.dragging: - if self.dragTrigger < 0: - self.dragging = True - self.dragTrigger = self.dragTrail - self.CaptureMouse() - else: - self.dragTrigger -= 1 - if self.dragging: - dtx = mposx - self.dragx - w,h = self.draggedTab.GetSize() - - if dtx < 0: - dtx = 0 - if dtx + w > self.tabContainerWidth + self.inclination * 2: - dtx = self.tabContainerWidth - w + self.inclination * 2 - self.draggedTab.SetPosition( (dtx, self.dragy)) - - index = self.GetTabIndex(self.draggedTab) - - leftTab = self.GetTabAtLeft(index) - rightTab = self.GetTabAtRight(index) - - if leftTab: - lw,lh = leftTab.GetSize() - lx,ly = leftTab.GetPosition() - - if lx + lw / 2 - self.inclination * 2 > dtx: - self.SwitchTabs(index - 1 , index, self.draggedTab) - return - - if rightTab: - rw,rh = rightTab.GetSize() - rx,ry = rightTab.GetPosition() - - if rx + rw / 2 + self.inclination * 2 < dtx + w: - self.SwitchTabs(index + 1 , index, self.draggedTab) - return - self.UpdateTabsPosition(self.draggedTab) - self.Refresh() - return - return - self.CheckCloseButtons(mposx, mposy) - - event.Skip() - - def OnPaint(self, event): - rect = self.GetRect() - canvas = wx.EmptyBitmap(rect.width, rect.height,24) - mdc = wx.BufferedPaintDC(self) - mdc.SelectObject(canvas) - - selected = 0 - - mdc.SetBackground (wx.Brush(wx.SystemSettings_GetColour(wx.SYS_COLOUR_WINDOW))) -# mdc.SetBackground (wx.Brush((66,113,202))) - mdc.Clear() - - selected = None - selpos = 0 - selWidth = selHeight = 0 - selColor = self.CalculateColor(wx.SystemSettings_GetColour(wx.SYS_COLOUR_WINDOW), 0x34) - startColor = self.leftColor = self.CalculateColor(wx.SystemSettings_GetColour(wx.SYS_COLOUR_WINDOW), 0x2f) - tabsWidth = 0 - - - for tab in self.tabs: - tabsWidth += tab.tabWidth - self.inclination*2 - - pos = tabsWidth - - mdc.DrawBitmap(self.addBitmap, round(tabsWidth) + self.inclination*2, self.containerHeight - self.height/2 - self.addBitmap.GetHeight()/2, True) - - for i in xrange(len(self.tabs) - 1, -1, -1): - tab = self.tabs[i] - width = tab.tabWidth - self.inclination*2 - posx, posy = tab.GetPosition() - if not tab.IsSelected(): -# mdc.DrawBitmap(self.efxBmp, posx, posy - 1, True ) -# img = tab.Render().ConvertToImage() -# img = img.AdjustChannels(1, 1, 1, 0.8) -# bmp = wx.BitmapFromImage(img) - mdc.DrawBitmap(tab.Render(), posx, posy, True) - else: - selected = tab - if selected: - posx, posy = selected.GetPosition() -# mdc.DrawBitmap(self.efxBmp, posx, posy - 1, True) - bmp = selected.Render() -# if self.dragging: -# img = bmp.ConvertToImage() -# img = img.AdjustChannels(1.2, 1.2, 1.2, 0.7) -# bmp = wx.BitmapFromImage(img) - - mdc.DrawBitmap(bmp, posx, posy, True) - selpos = posx - selWidth,selHeight = selected.GetSize() - - if selWidth%2: - offset = 1 - else: - offset = 0 - r1 = wx.Rect(0,self.containerHeight-1,selpos,1) - r2 = wx.Rect(selpos + selWidth - offset, self.containerHeight -1, self.width - selpos - selWidth,1) - mdc.GradientFillLinear(r1, startColor, selColor, wx.EAST) - mdc.GradientFillLinear(r2, selColor, startColor, wx.EAST) - - def OnErase(self, event): - pass - - def UpdateTabFX(self): - w,h = self.tabShadow.GetSize() - if w != self.tabMinWidth: - self.tabShadow.SetSize((self.tabMinWidth, self.height + 1)) - fxBmp = self.tabShadow.Render() - - simg = fxBmp.ConvertToImage() -# if not simg.HasAlpha(): -# simg.InitAlpha() -# simg = simg.Blur(2) -# simg = simg.AdjustChannels(0.2,0.2,0.2,0.3) - - self.efxBmp = wx.BitmapFromImage(simg) - - def AddTab(self, title = wx.EmptyString, img = None): - self.ClearTabsSelected() - - tabRenderer = PFTabRenderer( (120,self.height), title, img, self.inclination) - tabRenderer.SetSelected(True) - - self.tabs.append( tabRenderer ) - self.AdjustTabsSize() - self.Refresh() - - def ClearTabsSelected(self): - for tab in self.tabs: - tab.SetSelected(False) - - def DeleteTab(self, tab): - tabRenderer = self.tabs[tab] - wasSelected = tabRenderer.GetSelected() - self.tabs.remove(tabRenderer) - - if tabRenderer: - del tabRenderer - - if wasSelected and self.GetTabsCount() > 0: - if tab > self.GetTabsCount() -1: - self.tabs[self.GetTabsCount() - 1].SetSelected(True) - else: - self.tabs[tab].SetSelected(True) - - self.Parent.DeletePage(tab, True) - - self.AdjustTabsSize() - self.Refresh() - - def GetTabsCount(self): - return len(self.tabs) - - def AdjustTabsSize(self): - - tabMinWidth = 9000000 # Really, it should be over 9000 - - for tab in self.tabs: - mw,mh = tab.GetMinSize() - if tabMinWidth > mw: - tabMinWidth = mw - - if self.GetTabsCount() >0: - if (self.GetTabsCount()) * (tabMinWidth - self.inclination * 2) > self.tabContainerWidth: - self.tabMinWidth = float(self.tabContainerWidth) / float(self.GetTabsCount()) + self.inclination * 2 - else: - self.tabMinWidth = tabMinWidth - if self.tabMinWidth <1: - self.tabMinWidth = 1 - for tab in self.tabs: - w,h = tab.GetSize() - if w != self.tabMinWidth: - tab.SetSize( (self.tabMinWidth, self.height) ) - - if self.GetTabsCount() > 0: - self.UpdateTabFX() - - self.UpdateTabsPosition() - - def UpdateTabsPosition(self, skipTab = None): - tabsWidth = 0 - for tab in self.tabs: - tabsWidth += tab.tabWidth - self.inclination*2 - - pos = tabsWidth - selected = None - for i in xrange(len(self.tabs) - 1, -1, -1): - tab = self.tabs[i] - width = tab.tabWidth - self.inclination*2 - pos -= width - if not tab.IsSelected(): - tab.SetPosition((pos, self.containerHeight - self.height)) - else: - selected = tab - selpos = pos - if selected is not skipTab: - selected.SetPosition((selpos, self.containerHeight - self.height)) - - - def CalculateColor(self, color, delta): - bkR ,bkG , bkB = color - if bkR + bkG + bkB > 127*3: - scale = - delta - else: - scale = delta*2 - - r = bkR + scale - g = bkG + scale - b = bkB + scale - - r = min(max(r,0),255) - g = min(max(g,0),255) - b = min(max(b,0),255) - - return wx.Colour(r,g,b) - -class PFNotebook(wx.Panel): - def __init__(self, parent): - wx.Panel.__init__(self, parent, wx.ID_ANY,size = (-1,-1)) - - self.pages = [] - self.activePage = None - - mainSizer = wx.BoxSizer( wx.VERTICAL ) - - tabsSizer = wx.BoxSizer( wx.VERTICAL ) - - self.tabsContainer = PFTabsContainer(self) - tabsSizer.Add( self.tabsContainer, 0, wx.EXPAND ) - - mainSizer.Add( tabsSizer, 0, wx.EXPAND, 5 ) - - contentSizer = wx.BoxSizer( wx.VERTICAL ) - self.pageContainer = wx.Panel(self) - contentSizer.Add( self.pageContainer, 1, wx.EXPAND, 5 ) - - mainSizer.Add( contentSizer, 1, wx.EXPAND, 5 ) - - self.SetSizer( mainSizer ) - self.Bind(wx.EVT_SIZE, self.OnSize) - self.Layout() -# for i in xrange(10): -# self.tabsContainer.AddTab("Pyfa TAB #%d Aw" % i) - - def AddPage(self, tabWnd, tabTitle = wx.EmptyString, tabImage = None): - if self.activePage: - self.activePage.Hide() - - tabWnd.Reparent(self.pageContainer) - self.pageContainer.Layout() - - self.pages.append(tabWnd) - self.tabsContainer.AddTab(tabTitle, tabImage) - - self.activePage = tabWnd - - def SetSelected(self, page): - oldsel = self.pages.index(self.activePage) - if oldsel != page: - self.activePage.Hide() - self.activePage = self.pages[page] - self.ShowActive() - - def DeletePage(self, n, internal = False): - page = self.pages[n] - - self.pages.remove(page) - page.Hide() - page.Destroy() - - if not internal: - self.tabsContainer.DeleteTab(n) - sel = self.tabsContainer.GetSelected() - if sel is not None: - self.activePage = self.pages[sel] - self.ShowActive() - - def SwitchPages(self, src, dest, internal = False): - self.pages[src], self.pages[dest] = self.pages[dest], self.pages[src] - - def ShowActive(self): - self.activePage.SetSize(self.pageContainer.GetSize()) - self.activePage.Show() - self.Layout() - def OnSize(self, event): - w,h= self.GetSize() - self.tabsContainer.SetSize((w, -1)) - self.tabsContainer.UpdateSize() - self.tabsContainer.Refresh() - self.Layout() - size = self.pageContainer.GetSize() - if self.activePage: - self.activePage.SetSize(size) - event.Skip() - -class MiniFrame(wx.Frame): - def __init__(self): - wx.Frame.__init__(self, None, -1, 'MEGA Frame', - size=(1000, 200)) - self.Bind(wx.EVT_CLOSE, self.OnCloseWindow) -# self.Bind(wx.EVT_SIZE, self.OnSize) - mainSizer = wx.BoxSizer(wx.VERTICAL) - self.nb = PFNotebook(self) - - self.nb.AddPage(TestPanel(self),"TEST 1") - self.nb.AddPage(TestPanel(self),"TEST 2") - self.nb.AddPage(TestPanel(self),"TEST 3") - self.nb.AddPage(TestPanel(self),"TEST 4") - self.nb.AddPage(TestPanel(self),"TEST 5") - self.nb.AddPage(TestPanel(self),"TEST 6") - - mainSizer.Add(self.nb,1,wx.EXPAND) - self.SetSizer(mainSizer) - self.Layout() - -# def OnSize(self, event): -# size = self.GetRect() -# self.tabContainer.SetSize((size.width, -1)) -# self.tabContainer.UpdateSize() -# self.tabContainer.Refresh() -# event.Skip() -# def OnLeftDown(self, event): -# event.Skip() -# -# def OnErase(self, event): -# pass - def OnCloseWindow(self, event): - self.Destroy() - - -# def OnPaint(self, event): -# rect = self.GetRect() -# canvas = wx.EmptyBitmap(rect.width, rect.height) -# mdc = wx.BufferedPaintDC(self) -# mdc.SelectObject(canvas) -# -# mdc.SetBackground (wx.Brush(wx.SystemSettings_GetColour(wx.SYS_COLOUR_WINDOW))) -# mdc.Clear() -# -# selected = None -# selpos = 0 -# tabsWidth = 0 -# offset = 10 -# -# for tab in self.tabs: -# tabsWidth += tab.tabWidth - tab.lrZoneWidth/2 -# -# pos = tabsWidth -# -# for i in xrange(len(self.tabs) - 1, -1, -1): -# tab = self.tabs[i] -# width = tab.tabWidth - tab.lrZoneWidth/2 -# pos -= width -# if not tab.IsSelected(): -# mdc.DrawBitmap(tab.Render(),pos+offset,10, True) -# tab.SetPosition((pos + offset, 10)) -# else: -# selected = tab -# selpos = pos + offset -# if selected: -# mdc.DrawBitmap(selected.Render(), selpos,10,True) -# selected.SetPosition((selpos, 10)) -# -# mdc.SetPen( wx.Pen("#D0D0D0", width = 1 ) ) -# mdc.DrawLine(10,34,10,100) -# mdc.DrawLine(10,100,tabsWidth + 18,100) -# mdc.DrawLine(tabsWidth+18,100,tabsWidth+18,33) - -class TestPanel ( wx.Panel ): - - def __init__( self, parent ): - wx.Panel.__init__ ( self, parent, id = wx.ID_ANY, pos = wx.DefaultPosition, size = wx.Size( -1,-1 ), style = wx.TAB_TRAVERSAL ) - - bSizer4 = wx.BoxSizer( wx.VERTICAL ) - - self.m_staticText3 = wx.StaticText( self, wx.ID_ANY, u"TESSSSSSSSSST %s" % time.time(), wx.DefaultPosition, wx.DefaultSize, wx.ALIGN_CENTRE ) - self.m_staticText3.Wrap( -1 ) - bSizer4.Add( self.m_staticText3, 1, wx.ALL|wx.EXPAND, 5 ) - - self.m_button1 = wx.Button( self, wx.ID_ANY, u"MyButton", wx.DefaultPosition, wx.DefaultSize, 0 ) - bSizer4.Add( self.m_button1, 0, wx.ALL, 5 ) - - self.m_textCtrl1 = wx.TextCtrl( self, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.DefaultSize, 0 ) - bSizer4.Add( self.m_textCtrl1, 0, wx.ALL, 5 ) - - self.m_staticline1 = wx.StaticLine( self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.LI_HORIZONTAL ) - bSizer4.Add( self.m_staticline1, 0, wx.EXPAND |wx.ALL, 5 ) - - self.m_gauge1 = wx.Gauge( self, wx.ID_ANY, 100, wx.DefaultPosition, wx.DefaultSize, wx.GA_HORIZONTAL ) - bSizer4.Add( self.m_gauge1, 0, wx.ALL, 5 ) - self.SetSizer( bSizer4 ) - self.Layout() - - def __del__( self ): - pass - - -if __name__ == '__main__': - app = wx.PySimpleApp() - MiniFrame().Show() - app.MainLoop() +# --------------------------------------------------------------------------------- # +# Pyfa's custom Notebook core python IMPLEMENTATION +# +# Darriele (homeworld using gmail point com) - 10/27/2010 +# Updated: 11/11/2010 +# +# --------------------------------------------------------------------------------- # + +import wx +import copy + +class PFNotebook(wx.Panel): + def __init__(self, parent): + wx.Panel.__init__(self, parent, wx.ID_ANY,size = (-1,-1)) + + self.pages = [] + self.activePage = None + + mainSizer = wx.BoxSizer( wx.VERTICAL ) + + tabsSizer = wx.BoxSizer( wx.VERTICAL ) + + self.tabsContainer = PFTabsContainer(self) + tabsSizer.Add( self.tabsContainer, 0, wx.EXPAND ) + + mainSizer.Add( tabsSizer, 0, wx.EXPAND, 5 ) + + contentSizer = wx.BoxSizer( wx.VERTICAL ) + self.pageContainer = wx.Panel(self) + contentSizer.Add( self.pageContainer, 1, wx.EXPAND, 5 ) + + mainSizer.Add( contentSizer, 1, wx.EXPAND, 5 ) + + self.SetSizer( mainSizer ) + self.Bind(wx.EVT_SIZE, self.OnSize) + self.Layout() +# for i in xrange(10): +# self.tabsContainer.AddTab("Pyfa TAB #%d Aw" % i) + + def GetPage(self, i): + return self.pages[i] + + def GetSelectedPage(self): + return self.activePage + + def GetPageIndex(self, page): + return self.pages.index(page) + + def GetSelection(self): + return self.GetPageIndex(self.activePage) + + def AddPage(self, tabWnd, tabTitle = wx.EmptyString, tabImage = None): + if self.activePage: + self.activePage.Hide() + + if tabWnd is not None: + tabWnd.Reparent(self.pageContainer) + + self.pageContainer.Layout() + + self.pages.append(tabWnd) + self.tabsContainer.AddTab(tabTitle, tabImage) + + self.activePage = tabWnd + + + def SetSelection(self, page): + oldsel = self.GetSelection() + if oldsel != page: + self.activePage.Hide() + self.activePage = self.pages[page] + self.ShowActive() + + def DeletePage(self, n, internal = False): + page = self.pages[n] + + self.pages.remove(page) + page.Hide() + page.Destroy() + + if not internal: + self.tabsContainer.DeleteTab(n, True) + + sel = self.tabsContainer.GetSelected() + if sel is not None: + self.activePage = self.pages[sel] + self.ShowActive() + else: + self.activePage = None + + + def SwitchPages(self, src, dest, internal = False): + self.pages[src], self.pages[dest] = self.pages[dest], self.pages[src] + + def ShowActive(self): + self.activePage.SetSize(self.pageContainer.GetSize()) + self.activePage.Show() + self.Layout() + + def IsActive(self, page): + return self.activePage == page + + def SetPageText(self, i, text, refresh=False): + tab = self.tabsContainer.tabs[i] + tab.text = text + tab._Render() + if refresh: + self.Refresh() + + def SetPageIcon(self, i, icon, refresh=False): + tab = self.tabsContainer.tabs[i] + tab.img = icon + tab._Render() + if refresh: + self.Refresh() + + def SetPageTextIcon(self, i, text=wx.EmptyString, icon=None): + self.SetPageText(i, text) + self.SetPageIcon(i, icon) + self.Refresh() + + def Refresh(self): + self.tabsContainer.Refresh() + + def OnSize(self, event): + w,h= self.GetSize() + self.tabsContainer.SetSize((w, -1)) + self.tabsContainer.UpdateSize() + self.tabsContainer.Refresh() + self.Layout() + size = self.pageContainer.GetSize() + if self.activePage: + self.activePage.SetSize(size) + event.Skip() + + + +class PFTabRenderer(object): + def __init__(self, size = (36,24), text = wx.EmptyString, img = None, inclination = 6 , closeButton = True, fontSize = 8): + + # tab left/right zones inclination + self.inclination = inclination + self.text = text + self.img = img + self.tabSize = size + self.closeButton = closeButton + self.fontSize = fontSize + self.selected = False + self.closeBtnHovering = False + self.tabBitmap = None + self.cbSize = 5 + self.position = (0, 0) # Not used internaly for rendering - helper for tab container + self.InitTab() + + def SetPosition(self, position): + self.position = position + + def GetPosition(self): + return self.position + + def GetSize(self): + return self.tabSize + + def SetSize(self, size): + otw,oth = self.tabSize + self.tabSize = size + w,h = self.tabSize + if h != oth: + self.InitTab(True) + else: + self.InitTab() + + def SetSelected(self, sel = True): + self.selected = sel + self.InitColors() + self._Render() + + def GetSelected(self): + return self.selected + + def IsSelected(self): + return self.selected + + def ShowCloseButtonHovering(self, hover = True): + if self.closeBtnHovering != hover: + self.closeBtnHovering = hover + self._Render() + + def GetCloseButtonHoverStatus(self): + return self.closeBtnHovering + + def GetTabRegion(self): + nregion = self.CopyRegion(self.tabRegion) + nregion.SubtractRegion(self.closeBtnRegion) if self.closeButton else self.tabRegion + return nregion + + def GetCloseButtonRegion(self): + return self.CopyRegion(self.closeBtnRegion) + + def GetMinSize(self): + ebmp = wx.EmptyBitmap(1,1) + mdc = wx.MemoryDC() + mdc.SelectObject(ebmp) + mdc.SetFont(self.font) + textSizeX, textSizeY = mdc.GetTextExtent(self.text) + totalSize = self.lrZoneWidth * 2 + textSizeX + self.cbSize*2 if self.closeButton else 0 + mdc.SelectObject(wx.NullBitmap) + return (totalSize, self.tabHeight) + + + def CopyRegion(self, region): + rect = region.GetBox() + + newRegion = wx.Region(rect.X, rect.Y, rect.Width, rect.Height) + newRegion.IntersectRegion(region) + + return newRegion + + def InitTab(self, skipLRzones = False): + self.tabWidth, self.tabHeight = self.tabSize + + # content width is tabWidth - (left+right) zones + + self.contentWidth = self.tabWidth - self.inclination * 6 - self.cbSize if self.closeButton else 0 + + self.leftZoneSpline = [] + self.rightZoneSpline = [] + + self.lrZoneWidth = self.inclination * 3 + if not skipLRzones: + self.CreateLRZoneSplines() + + self.leftRegion = self.CreateLeftRegion() + self.rightRegion = self.CreateRightRegion() + + self.contentRegion = wx.Region(0, 0, self.contentWidth, self.tabHeight) + self.tabRegion = None + self.closeBtnRegion = None + self.font = wx.Font(self.fontSize, wx.SWISS, wx.NORMAL, wx.NORMAL, False) + + self.InitTabRegions() + self.InitColors() + self._Render() + + def InitColors(self): + self.tabColor = wx.SystemSettings_GetColour(wx.SYS_COLOUR_WINDOW) + self.leftColor = self.CalculateColor(self.tabColor, 0x2F) + self.rightColor = self.CalculateColor(self.tabColor, 0x44) + self.gradientStartColor = self.CalculateColor(self.tabColor, 0x17 if self.selected else 0x20) + + def CalculateColor(self, color, delta): + bkR ,bkG , bkB = color + if bkR + bkG + bkB > 127*3: + scale = - delta + else: + scale = delta*2 + + r = bkR + scale + g = bkG + scale + b = bkB + scale + + r = min(max(r,0),255) + b = min(max(b,0),255) + g = min(max(g,0),255) + + return wx.Colour(r,g,b) + + def InitTabRegions(self): + self.tabRegion = wx.Region(0, 0, self.tabWidth, self.tabHeight) + self.tabRegion.IntersectRegion(self.leftRegion) + + self.contentRegion.Offset(self.lrZoneWidth, 0) + self.tabRegion.UnionRegion(self.contentRegion) + + self.rightRegion.Offset(self.tabWidth - self.lrZoneWidth, 0) + self.tabRegion.UnionRegion(self.rightRegion) + self.closeBtnRegion = wx.Region(self.tabWidth - self.lrZoneWidth - self.cbSize -2 , (self.tabHeight - self.cbSize) / 2 - 2, self.cbSize + 4, self.cbSize + 4) + cbtRegion = wx.Region(self.tabWidth - self.lrZoneWidth - self.cbSize ,0, self.cbSize, self.tabHeight) + self.tabRegion.UnionRegion(cbtRegion) + + def CreateLRZoneSplines(self): + height = self.tabHeight + inc = self.inclination + + self.leftZoneSpline = [wx.Point(0, height), wx.Point(inc * 2/3, height - inc/2), wx.Point(inc+inc/2, 2), + wx.Point(inc * 3, 0)] + self.rightZoneSpline = [wx.Point(0, 0), wx.Point(inc+inc/2,2),wx.Point(inc*2 +inc*2/3,height-inc/2), wx.Point(inc*3,height) ] + + def CreateLeftRegion(self): + + width = self.lrZoneWidth + 1 + height = self.tabHeight + 1 + inc = self.inclination + + mdc = wx.MemoryDC() + + mbmp = wx.EmptyBitmap(width,height,24) + mdc.SelectObject(mbmp) + + mdc.SetBackground( wx.Brush((123,123,123))) + mdc.Clear() + + mdc.SetPen( wx.Pen("#000000", width = 1 ) ) + mdc.DrawSpline(self.leftZoneSpline) + + mdc.SetBrush(wx.Brush(wx.Colour(255,255,0), wx.SOLID)) + ret = mdc.FloodFill(inc*2,height-inc, wx.Color(123,123,123), wx.FLOOD_SURFACE) + if not ret: + print "FloodFill failed" + + mdc.SelectObject(wx.NullBitmap) + +# mbmp.SetMaskColour( (123, 123, 123) ) + + region = wx.Region() + region.UnionBitmapColour(mbmp, wx.Colour(123,123,123)) + region.Offset(-1,0) + + return region + + def CreateRightRegion(self): + + width = self.lrZoneWidth + 1 + height = self.tabHeight + inc = self.inclination + + mdc = wx.MemoryDC() + + mbmp = wx.EmptyBitmap(width,height,24) + mdc.SelectObject(mbmp) + + mdc.SetBackground( wx.Brush((123,123,123), wx.SOLID)) + mdc.Clear() + + mdc.SetPen( wx.Pen("#000000", width = 1 ) ) + mdc.DrawSpline(self.rightZoneSpline) + + mdc.SetBrush(wx.Brush(wx.Colour(255,255,0))) + ret = mdc.FloodFill(inc,height-inc, wx.Color(123,123,123), wx.FLOOD_SURFACE) + if not ret: + print "FloodFill failed" + mdc.SelectObject(wx.NullBitmap) + + region = wx.Region() + region.UnionBitmapColour(mbmp, wx.Colour(123,123,123)) + + return region + + def OffsetPointList(self, list , x, y): + tlist = [] + for i in list: + tlist.append(wx.Point(i.x + x, i.y + y)) + + return tlist + + def Render(self): + return self.tabBitmap + + def _Render(self): + if self.tabBitmap: + del self.tabBitmap + + inc = self.lrZoneWidth + height = self.tabHeight + width = self.tabWidth + contentWidth = self.contentWidth + self.cbSize if self.closeButton else 0 + + rect = wx.Rect(0,0,self.tabWidth, self.tabHeight) + + canvas = wx.EmptyBitmap(rect.width, rect.height) + + mdc = wx.MemoryDC() + + mdc.SelectObject(canvas) + mdc.SetBackground(wx.Brush ((13,22,31))) + mdc.Clear() + mdc.DestroyClippingRegion() + mdc.SetClippingRegionAsRegion(self.tabRegion) + + r = copy.copy(rect) + r.top = r.left = 0 + r.height = height + + mdc.GradientFillLinear(r,self.gradientStartColor,self.tabColor,wx.SOUTH) + mdc.SetPen( wx.Pen(self.leftColor, width = 1 ) ) + + dpleft = self.OffsetPointList(self.leftZoneSpline, -1, 0) + dpright = self.OffsetPointList(self.rightZoneSpline, inc + contentWidth, 0) + + mdc.DrawSpline(dpleft) + mdc.SetPen( wx.Pen(self.rightColor, width = 1 ) ) + mdc.DrawSpline(dpright) + + lrect = wx.Rect() + lrect.left=inc - 1 + lrect.top=0 + lrect.width = contentWidth+1 + lrect.height = 1 + mdc.GradientFillLinear(lrect,self.leftColor,self.rightColor, wx.EAST) +# if not self.selected: +# mdc.DrawLine(0,height - 1,width,height - 1) + mdc.SetPen( wx.Pen(self.rightColor, width = 1 ) ) + if self.closeButton: + cbsize = self.cbSize + + cbx = width - self.lrZoneWidth-cbsize + cby = (height - cbsize)/2 + if self.closeBtnHovering: + mdc.SetPen( wx.Pen( wx.Colour(255,22,22), 0)) + mdc.SetBrush(wx.Brush(wx.Colour(255,22,22))) + mdc.DrawCircle(cbx + cbsize / 2 +1, cby + cbsize / 2 + 1, cbsize) + selColor = self.CalculateColor(wx.SystemSettings.GetColour(wx.SYS_COLOUR_WINDOWTEXT), 255) + mdc.SetPen( wx.Pen( selColor, 1)) + + mdc.DrawLine(cbx, cby, cbx + cbsize + 1 , cby + cbsize + 1 ) + mdc.DrawLine(cbx, cby + cbsize, cbx + cbsize + 1, cby - 1 ) + + mdc.SetClippingRegionAsRegion(self.contentRegion) + mdc.SetFont(self.font) + text = self.text + fnwidths = mdc.GetPartialTextExtents(text) + count = 0 + maxsize = self.contentWidth - self.cbSize if self.closeButton else 0 + for i in fnwidths: + if i <= maxsize: + count +=1 + else: + break + +# text = "%s%s" % (text[:count],"." if len(text)>count else "") + text = "%s" % text[:count] + + + tx,ty = mdc.GetTextExtent(text) + if self.selected: + mdc.SetTextForeground(wx.SystemSettings.GetColour(wx.SYS_COLOUR_WINDOWTEXT)) + else: + color = self.CalculateColor(wx.SystemSettings.GetColour(wx.SYS_COLOUR_WINDOWTEXT), 0x44) + mdc.SetTextForeground(color) + mdc.DrawText(text, inc, height / 2 - ty / 2) + + mdc.DestroyClippingRegion() + + mdc.SelectObject(wx.NullBitmap) + canvas.SetMaskColour((13,22,31)) +# if not self.selected: +# img = canvas.ConvertToImage() +# img = img.AdjustChannels(1, 1, 1, 0.8) +# canvas = wx.BitmapFromImage(img) + self.tabBitmap = canvas + +class PFAddRenderer: + def __init__(self, size = (24,12)): + self.width, self.height = size + self.addBitmap = None + self.spline = [] + self.inclination = 3 + self.region = None + self.InitRenderer() + + def GetSize(self): + return (self.width, self.height) + + def InitRenderer(self): + self.CreateSpline() + self.region = self.CreateRegion() + self._Render() + + def CreateSpline(self): + width = self.width + height = self.height - 1 + inc = self.inclination + + self.spline = [wx.Point(0, 0), wx.Point(inc*3/2, height),wx.Point(inc*2 + inc*2/3, height), wx.Point(width, height), wx.Point(width, height), + wx.Point(width - inc, inc), wx.Point(width - inc*2, 0), wx.Point(0, 0), wx.Point(0, 0)] + def CreateRegion(self): + width = self.width + height = self.height + inc = self.inclination + + mdc = wx.MemoryDC() + + mbmp = wx.EmptyBitmap(width,height) + mdc.SelectObject(mbmp) + + mdc.SetBackground( wx.Brush((255,255,255))) + mdc.Clear() + + mdc.SetPen( wx.Pen("#000000", width = 1 ) ) + mdc.DrawSpline(self.spline) + + mdc.SetBrush(wx.Brush((255,255,0))) + mdc.FloodFill(width/2,height/2, wx.Color(0,0,0), wx.FLOOD_BORDER) + + mdc.SelectObject(wx.NullBitmap) + + mbmp.SetMaskColour( (255, 255, 255) ) + + region = wx.RegionFromBitmap(mbmp) +# region.Offset(-1,0) + + return region + + def CalculateColor(self, color, delta): + bkR ,bkG , bkB = color + if bkR + bkG + bkB > 127*3: + scale = - delta + else: + scale = delta*2 + + r = bkR + scale + g = bkG + scale + b = bkB + scale + + r = min(max(r,0),255) + b = min(max(b,0),255) + g = min(max(g,0),255) + + return wx.Colour(r,b,g) + + def Render(self): + return self.addBitmap + + def _Render(self): + inc = self.inclination + rect = wx.Rect(0 ,0 ,self.width, self.height) + if self.addBitmap: + del self.addBitmap + + canvas = wx.EmptyBitmap(self.width, self.height) + + mdc = wx.MemoryDC() + mdc.SelectObject(canvas) + + mdc.SetBackground(wx.Brush ((13,22,31))) + mdc.Clear() + + mdc.DestroyClippingRegion() + mdc.SetClippingRegionAsRegion(self.region) +# mdc.GradientFillLinear(rect, (0x30,0x30,0x30), (0x6f,0x6f,0x6f), wx.SOUTH) + mdc.FloodFill(self.width/2,self.height/2, wx.Color(13,22,31), wx.FLOOD_BORDER) + mdc.DestroyClippingRegion() + mdc.SetPen( wx.Pen( wx.SystemSettings.GetColour(wx.SYS_COLOUR_WINDOWTEXT), 1)) + mdc.DrawSpline(self.spline) + mdc.SelectObject(wx.NullBitmap) + + canvas.SetMaskColour((13,22,31)) + + img = canvas.ConvertToImage() + if not img.HasAlpha(): + img.InitAlpha() + img = img.AdjustChannels(1, 1, 1, 0.6) + img = img.Blur(1) + bbmp = wx.BitmapFromImage(img) + + del mdc + del canvas + canvas = wx.EmptyBitmap(self.width, self.height) + + mdc = wx.MemoryDC() + mdc.SelectObject(canvas) + + mdc.SetBackground(wx.Brush ((255,255,255 , 0))) + mdc.Clear() + + mdc.DrawBitmap(bbmp,0,0,True) + + cx = self.width / 2 - 1 + cy = self.height / 2 + + mdc.SetPen( wx.Pen( wx.SystemSettings.GetColour(wx.SYS_COLOUR_WINDOWTEXT), 1)) + mdc.DrawLine(cx - inc + 1, cy, cx + inc + 1, cy) + mdc.DrawLine(cx - inc + 1, cy-1, cx + inc + 1, cy-1) + mdc.DrawLine(cx, cy - inc, cx, cy + inc ) + mdc.DrawLine(cx+1, cy - inc, cx+1, cy + inc ) + + self.wColor = wx.SystemSettings_GetColour(wx.SYS_COLOUR_WINDOW) + color = self.CalculateColor(self.wColor, 0x99) + mdc.SetPen( wx.Pen( color, 1)) + + mdc.DrawSpline(self.spline) + + mdc.SelectObject(wx.NullBitmap) + canvas.SetMaskColour((255,255,255)) + + img = canvas.ConvertToImage() + if not img.HasAlpha(): + img.InitAlpha() + img = img.AdjustChannels(1, 1, 1, 0.3) + + bbmp = wx.BitmapFromImage(img) + self.addBitmap = bbmp + + +class PFTabsContainer(wx.Window): + def __init__(self, parent, pos = (0,0), size = (100,27), id = wx.ID_ANY): + wx.Window.__init__(self, parent, id , pos, size , style = 0) + self.tabs = [] + width, height = size + self.width = width + self.height = height - 3 + self.containerHeight = height + self.startDrag = False + self.dragging = False + self.reserved = 48 + self.inclination = 6 + self.dragTrail = 3 + self.dragx = 0 + self.dragy = 0 + self.draggedTab = None + self.dragTrigger = self.dragTrail + + self.tabContainerWidth = width - self.reserved + self.tabMinWidth = width + self.tabShadow = None + + self.addButton = PFAddRenderer() + self.addBitmap = self.addButton.Render() + + self.Bind(wx.EVT_PAINT, self.OnPaint) + self.Bind(wx.EVT_ERASE_BACKGROUND, self.OnErase) + self.Bind(wx.EVT_LEFT_DOWN, self.OnLeftDown) + self.Bind(wx.EVT_LEFT_UP, self.OnLeftUp) + self.Bind(wx.EVT_MOTION, self.OnMotion) + self.Bind(wx.EVT_SIZE, self.OnSize) + self.tabShadow = PFTabRenderer((self.tabMinWidth, self.height + 1), inclination = self.inclination) + + def OnSize(self, event): + self.UpdateSize() + event.Skip() + + def UpdateSize(self): + width, dummy = self.GetSize() + if width != self.width: + self.width = width + self.tabContainerWidth = self.width - self.reserved + self.AdjustTabsSize() + + def OnLeftDown(self, event): + mposx,mposy = event.GetPosition() + if not self.startDrag: + tab = self.FindTabAtPos(mposx, mposy) + if tab: + self.CheckTabSelected(tab, mposx, mposy) + self.startDrag = True + tx,ty = tab.GetPosition() + self.dragx = mposx - tx + self.dragy = self.containerHeight - self.height + self.Refresh() + + self.draggedTab = tab + + def OnLeftUp(self, event): + mposx,mposy = event.GetPosition() + if self.startDrag and self.dragging: + self.dragging = False + self.startDrag = False + self.draggedTab = None + self.dragTrigger = self.dragTrail + self.UpdateTabsPosition() + self.Refresh() + if self.HasCapture(): + self.ReleaseMouse() + return + + if self.startDrag: + self.startDrag = False + self.dragTrigger = self.dragTrail + + if self.GetTabsCount() == 0: + return + selTab = self.GetSelectedTab() + + if self.CheckTabClose(selTab, mposx, mposy): + return + +# if self.CheckTabSelected(selTab, mposx, mposy): +# return + + for tab in self.tabs: + + if self.CheckTabClose(tab, mposx, mposy): + return + +# if self.CheckTabSelected(tab, mposx, mposy): +# return + + def GetSelectedTab(self): + for tab in self.tabs: + if tab.GetSelected(): + return tab + return None + + def GetSelected(self): + for tab in self.tabs: + if tab.GetSelected(): + return self.tabs.index(tab) + return None + + def CheckTabSelected(self,tab, mposx, mposy): + + oldSelTab = self.GetSelectedTab() + if oldSelTab == tab: + return True + + if self.TabHitTest(tab, mposx, mposy): + tab.SetSelected(True) + if tab != oldSelTab: + oldSelTab.SetSelected(False) + self.Refresh() + print "Selected: %s" %tab.text + + selTab = self.tabs.index(tab) + self.Parent.SetSelection(selTab) + + return True + return False + + def CheckTabClose(self, tab, mposx, mposy): + closeBtnReg = tab.GetCloseButtonRegion() + tabPosX, tabPosY = tab.GetPosition() + + closeBtnReg.Offset(tabPosX,tabPosY) + + if closeBtnReg.Contains(mposx, mposy): + print "Close tab: %s" % tab.text + index = self.GetTabIndex(tab) + self.DeleteTab(index) + return True + return False + + def CheckCloseButtons(self, mposx, mposy): + dirty = False + + for tab in self.tabs: + closeBtnReg = tab.GetCloseButtonRegion() + tabPos = tab.GetPosition() + tabPosX, tabPosY = tabPos + closeBtnReg.Offset(tabPosX,tabPosY) + if closeBtnReg.Contains(mposx,mposy): + if not tab.GetCloseButtonHoverStatus(): + tab.ShowCloseButtonHovering(True) + dirty = True + else: + if tab.GetCloseButtonHoverStatus(): + tab.ShowCloseButtonHovering(False) + dirty = True + if dirty: + self.Refresh() + + def FindTabAtPos(self, x, y): + if self.GetTabsCount() == 0: + return None + selTab = self.GetSelectedTab() + if self.TabHitTest(selTab, x, y): + return selTab + + for tab in self.tabs: + if self.TabHitTest(tab, x, y): + return tab + return None + + def TabHitTest(self, tab, x, y): + tabRegion = tab.GetTabRegion() + tabPos = tab.GetPosition() + tabPosX, tabPosY = tabPos + tabRegion.Offset(tabPosX, tabPosY) + if tabRegion.Contains(x, y): + return True + return False + + def GetTabAtLeft(self, tabIndex): + if tabIndex>0: + return self.tabs[tabIndex - 1] + else: + return None + + def GetTabAtRight(self, tabIndex): + if tabIndex < self.GetTabsCount() - 1: + return self.tabs[tabIndex + 1] + else: + return None + + def SwitchTabs(self, src, dest, draggedTab = None): + self.tabs[src], self.tabs[dest] = self.tabs[dest], self.tabs[src] + self.UpdateTabsPosition(draggedTab) + + self.Parent.SwitchPages(src,dest, True) + + self.Refresh() + + def GetTabIndex(self, tab): + return self.tabs.index(tab) + + def OnMotion(self, event): + mposx,mposy = event.GetPosition() + if self.startDrag: + if not self.dragging: + if self.dragTrigger < 0: + self.dragging = True + self.dragTrigger = self.dragTrail + self.CaptureMouse() + else: + self.dragTrigger -= 1 + if self.dragging: + dtx = mposx - self.dragx + w,h = self.draggedTab.GetSize() + + if dtx < 0: + dtx = 0 + if dtx + w > self.tabContainerWidth + self.inclination * 2: + dtx = self.tabContainerWidth - w + self.inclination * 2 + self.draggedTab.SetPosition( (dtx, self.dragy)) + + index = self.GetTabIndex(self.draggedTab) + + leftTab = self.GetTabAtLeft(index) + rightTab = self.GetTabAtRight(index) + + if leftTab: + lw,lh = leftTab.GetSize() + lx,ly = leftTab.GetPosition() + + if lx + lw / 2 - self.inclination * 2 > dtx: + self.SwitchTabs(index - 1 , index, self.draggedTab) + return + + if rightTab: + rw,rh = rightTab.GetSize() + rx,ry = rightTab.GetPosition() + + if rx + rw / 2 + self.inclination * 2 < dtx + w: + self.SwitchTabs(index + 1 , index, self.draggedTab) + return + self.UpdateTabsPosition(self.draggedTab) + self.Refresh() + return + return + self.CheckCloseButtons(mposx, mposy) + + event.Skip() + + def OnPaint(self, event): + rect = self.GetRect() + canvas = wx.EmptyBitmap(rect.width, rect.height,24) + mdc = wx.BufferedPaintDC(self) + mdc.SelectObject(canvas) + + selected = 0 + + mdc.SetBackground (wx.Brush(wx.SystemSettings_GetColour(wx.SYS_COLOUR_WINDOW))) +# mdc.SetBackground (wx.Brush((66,113,202))) + mdc.Clear() + + selected = None + selpos = 0 + selWidth = selHeight = 0 + selColor = self.CalculateColor(wx.SystemSettings_GetColour(wx.SYS_COLOUR_WINDOW), 0x34) + startColor = self.leftColor = self.CalculateColor(wx.SystemSettings_GetColour(wx.SYS_COLOUR_WINDOW), 0x2f) + tabsWidth = 0 + + + for tab in self.tabs: + tabsWidth += tab.tabWidth - self.inclination*2 + + pos = tabsWidth + + mdc.DrawBitmap(self.addBitmap, round(tabsWidth) + self.inclination*2, self.containerHeight - self.height/2 - self.addBitmap.GetHeight()/2, True) + + for i in xrange(len(self.tabs) - 1, -1, -1): + tab = self.tabs[i] + width = tab.tabWidth - self.inclination*2 + posx, posy = tab.GetPosition() + if not tab.IsSelected(): +# mdc.DrawBitmap(self.efxBmp, posx, posy - 1, True ) +# img = tab.Render().ConvertToImage() +# img = img.AdjustChannels(1, 1, 1, 0.8) +# bmp = wx.BitmapFromImage(img) + mdc.DrawBitmap(tab.Render(), posx, posy, True) + else: + selected = tab + if selected: + posx, posy = selected.GetPosition() +# mdc.DrawBitmap(self.efxBmp, posx, posy - 1, True) + bmp = selected.Render() +# if self.dragging: +# img = bmp.ConvertToImage() +# img = img.AdjustChannels(1.2, 1.2, 1.2, 0.7) +# bmp = wx.BitmapFromImage(img) + + mdc.DrawBitmap(bmp, posx, posy, True) + selpos = posx + selWidth,selHeight = selected.GetSize() + + if selWidth%2: + offset = 1 + else: + offset = 0 + r1 = wx.Rect(0,self.containerHeight-1,selpos,1) + r2 = wx.Rect(selpos + selWidth - offset, self.containerHeight -1, self.width - selpos - selWidth,1) + mdc.GradientFillLinear(r1, startColor, selColor, wx.EAST) + mdc.GradientFillLinear(r2, selColor, startColor, wx.EAST) + + def OnErase(self, event): + pass + + def UpdateTabFX(self): + w,h = self.tabShadow.GetSize() + if w != self.tabMinWidth: + self.tabShadow.SetSize((self.tabMinWidth, self.height + 1)) + fxBmp = self.tabShadow.Render() + + simg = fxBmp.ConvertToImage() +# if not simg.HasAlpha(): +# simg.InitAlpha() + +# simg = simg.Blur(2) +# simg = simg.AdjustChannels(0.2,0.2,0.2,0.3) + + self.efxBmp = wx.BitmapFromImage(simg) + + def AddTab(self, title = wx.EmptyString, img = None): + self.ClearTabsSelected() + + tabRenderer = PFTabRenderer( (120,self.height), title, img, self.inclination) + tabRenderer.SetSelected(True) + + self.tabs.append( tabRenderer ) + self.AdjustTabsSize() + self.Refresh() + + def ClearTabsSelected(self): + for tab in self.tabs: + tab.SetSelected(False) + + def DeleteTab(self, tab, internal=False): + tabRenderer = self.tabs[tab] + wasSelected = tabRenderer.GetSelected() + self.tabs.remove(tabRenderer) + + if tabRenderer: + del tabRenderer + + if wasSelected and self.GetTabsCount() > 0: + if tab > self.GetTabsCount() -1: + self.tabs[self.GetTabsCount() - 1].SetSelected(True) + else: + self.tabs[tab].SetSelected(True) + + if not internal: + self.Parent.DeletePage(tab, True) + + self.AdjustTabsSize() + self.Refresh() + + def GetTabsCount(self): + return len(self.tabs) + + def AdjustTabsSize(self): + + tabMinWidth = 9000000 # Really, it should be over 9000 + + for tab in self.tabs: + mw,mh = tab.GetMinSize() + if tabMinWidth > mw: + tabMinWidth = mw + + if self.GetTabsCount() >0: + if (self.GetTabsCount()) * (tabMinWidth - self.inclination * 2) > self.tabContainerWidth: + self.tabMinWidth = float(self.tabContainerWidth) / float(self.GetTabsCount()) + self.inclination * 2 + else: + self.tabMinWidth = tabMinWidth + if self.tabMinWidth <1: + self.tabMinWidth = 1 + for tab in self.tabs: + w,h = tab.GetSize() + if w != self.tabMinWidth: + tab.SetSize( (self.tabMinWidth, self.height) ) + + if self.GetTabsCount() > 0: + self.UpdateTabFX() + + self.UpdateTabsPosition() + + def UpdateTabsPosition(self, skipTab = None): + tabsWidth = 0 + for tab in self.tabs: + tabsWidth += tab.tabWidth - self.inclination*2 + + pos = tabsWidth + selected = None + for i in xrange(len(self.tabs) - 1, -1, -1): + tab = self.tabs[i] + width = tab.tabWidth - self.inclination*2 + pos -= width + if not tab.IsSelected(): + tab.SetPosition((pos, self.containerHeight - self.height)) + else: + selected = tab + selpos = pos + if selected is not skipTab: + selected.SetPosition((selpos, self.containerHeight - self.height)) + + + def CalculateColor(self, color, delta): + bkR ,bkG , bkB = color + if bkR + bkG + bkB > 127*3: + scale = - delta + else: + scale = delta*2 + + r = bkR + scale + g = bkG + scale + b = bkB + scale + + r = min(max(r,0),255) + g = min(max(g,0),255) + b = min(max(b,0),255) + + return wx.Colour(r,g,b) + diff --git a/gui/fittingView.py b/gui/fittingView.py index ee90c278f..4736a58f3 100644 --- a/gui/fittingView.py +++ b/gui/fittingView.py @@ -21,8 +21,11 @@ import wx import wx.lib.newevent import service import gui.mainFrame +import gui.marketBrowser +import bitmapLoader import gui.display as d from gui.contextMenu import ContextMenu +import gui.shipBrowser import sys from eos.types import Slot from gui.builtinViewColumns.state import State @@ -59,7 +62,13 @@ class FittingView(d.Display): def __init__(self, parent): d.Display.__init__(self, parent) self.Show(False) + self.parent = parent self.mainFrame.Bind(FIT_CHANGED, self.fitChanged) + self.mainFrame.Bind(gui.shipBrowser.EVT_FIT_SELECTED, self.fitSelected) + self.mainFrame.Bind(gui.shipBrowser.EVT_FIT_RENAMED, self.fitRenamed) + self.mainFrame.Bind(gui.shipBrowser.EVT_FIT_REMOVED, self.fitRemoved) + self.mainFrame.Bind(gui.marketBrowser.ITEM_SELECTED, self.appendItem) + self.Bind(wx.EVT_LEFT_DCLICK, self.removeItem) self.Bind(wx.EVT_LIST_BEGIN_DRAG, self.startDrag) if "__WXGTK__" in wx.PlatformInfo: @@ -73,6 +82,9 @@ class FittingView(d.Display): self.Bind(wx.EVT_LEFT_DOWN, self.click) self.Bind(wx.EVT_RIGHT_DOWN, self.click) + def getActiveFit(self): + return self.activeFitID + def startDrag(self, event): row = event.GetIndex() if row != -1: @@ -110,32 +122,53 @@ class FittingView(d.Display): event.Skip() - #Gets called from the fitMultiSwitch when it decides its time - def changeFit(self, fitID): - self.activeFitID = fitID - self.Show(fitID is not None) - self.slotsChanged() - wx.PostEvent(self.mainFrame, FitChanged(fitID=fitID)) + def fitRemoved(self, event): + fitID = event.fitID + if fitID == self.getActiveFit(): + self.parent.DeletePage(self.parent.GetPageIndex(self)) - def appendItem(self, itemID): - fitID = self.activeFitID - if fitID != None: - cFit = service.Fit.getInstance() - if cFit.isAmmo(itemID): - modules = [] - sel = self.GetFirstSelected() - while sel != -1: - modules.append(self.mods[self.GetItemData(sel)]) - sel = self.GetNextSelected(sel) + def fitRenamed(self, event): + fitID = event.fitID + if fitID == self.getActiveFit(): + self.updateTab() - cFit.setAmmo(fitID, itemID, modules) - wx.PostEvent(self.mainFrame, FitChanged(fitID=fitID)) - else: - populate = cFit.appendModule(fitID, itemID) - if populate: - self.slotsChanged() - if populate is not None: + def fitSelected(self, event): + if self.parent.IsActive(self): + fitID = event.fitID + self.activeFitID = fitID + self.Show(fitID is not None) + self.slotsChanged() + wx.PostEvent(self.mainFrame, FitChanged(fitID=fitID)) + self.updateTab() + + def updateTab(self): + cFit = service.Fit.getInstance() + fit = cFit.getFit(self.getActiveFit()) + bitmap = bitmapLoader.getBitmap("race_%s_small", "icons") + text = "%s: %s" % (fit.ship.item.name, fit.name) + self.parent.SetPageTextIcon(self.parent.GetSelection(), text, bitmap) + + def appendItem(self, event): + if self.parent.IsActive(self): + itemID = event.itemID + fitID = self.activeFitID + if fitID != None: + cFit = service.Fit.getInstance() + if cFit.isAmmo(itemID): + modules = [] + sel = self.GetFirstSelected() + while sel != -1: + modules.append(self.mods[self.GetItemData(sel)]) + sel = self.GetNextSelected(sel) + + cFit.setAmmo(fitID, itemID, modules) wx.PostEvent(self.mainFrame, FitChanged(fitID=fitID)) + else: + populate = cFit.appendModule(fitID, itemID) + if populate: + self.slotsChanged() + if populate is not None: + wx.PostEvent(self.mainFrame, FitChanged(fitID=fitID)) def removeItem(self, event): row, _ = self.HitTest(event.Position) diff --git a/gui/mainFrame.py b/gui/mainFrame.py index b6a2757d7..4cd381b68 100644 --- a/gui/mainFrame.py +++ b/gui/mainFrame.py @@ -79,7 +79,7 @@ class MainFrame(wx.Frame): faSizer = wx.BoxSizer(wx.VERTICAL) self.fitMultiSwitch = MultiSwitch(self.FitviewAdditionsPanel) - self.fitMultiSwitch.AddTab() + #self.fitMultiSwitch.AddTab() faSizer.Add(self.fitMultiSwitch,1,wx.EXPAND) self.additionsPane = AdditionsPane(self.FitviewAdditionsPanel) @@ -128,9 +128,9 @@ class MainFrame(wx.Frame): self.Show() def getActiveFit(self): - sel = self.fitMultiSwitch.GetSelection() - view = self.fitMultiSwitch.GetPage(sel).view - return view.activeFitID + p = self.fitMultiSwitch.GetSelectedPage() + m = getattr(p, "getActiveFit", None) + return m() if m is not None else None def getFittingView(self): sel = self.fitMultiSwitch.GetSelection() diff --git a/gui/multiSwitch.py b/gui/multiSwitch.py index 81463a21b..9824ca6f2 100644 --- a/gui/multiSwitch.py +++ b/gui/multiSwitch.py @@ -18,210 +18,10 @@ #=============================================================================== import wx -import bitmapLoader -import gui.mainFrame -import gui.fittingView as fv -import gui.marketBrowser as mb -import gui.shipBrowser as sb -import service +import gui.chromeTabs +import gui.fittingView -class MultiSwitch(wx.Notebook): +class MultiSwitch(gui.chromeTabs.PFNotebook): def __init__(self, parent): - wx.Notebook.__init__(self, parent, wx.ID_ANY) - self.fitPanes = [] - self.AddPage(wx.Panel(self), "+") - self.Bind(wx.EVT_NOTEBOOK_PAGE_CHANGING, self.checkAdd) - self.Bind(wx.EVT_MIDDLE_DOWN, self.checkRemove) - - self.mainFrame = gui.mainFrame.MainFrame.getInstance() - - self.Bind(wx.EVT_NOTEBOOK_PAGE_CHANGED, self.pageChanged) - self.Bind(wx.EVT_NAVIGATION_KEY, self.OnNavigate) - self.mainFrame.Bind(sb.EVT_FIT_RENAMED, self.processRename) - self.mainFrame.Bind(sb.EVT_FIT_SELECTED, self.changeFit) - self.mainFrame.Bind(sb.EVT_FIT_REMOVED, self.processRemove) - self.mainFrame.Bind(mb.ITEM_SELECTED, self.itemSelected) - - self.imageList = wx.ImageList(16, 16) - self.SetImageList(self.imageList) - - self.removal = False - self.countEvt = 1 - self.ignorePageChanged = False - - def OnNavigate(self, event): - self.ignorePageChanged = True - event.Skip() - - def getActiveFit(self): - return self.GetCurrentPage().view.activeFitID - - def AddTab(self, type="fit", frame=None, title=None): - if self.removal: - self.SetSelection(self.GetPageCount() - 2) - return False - - #Hide current selection - pos = self.GetPageCount() - 1 - - if type == "fit": - p = wx.Panel(self) - self.InsertPage(pos, p, "") - p.type = "fit" - sizer = wx.BoxSizer(wx.VERTICAL) - p.view = fv.FittingView(p) - - sizer.Add(p.view, 1, wx.EXPAND | wx.RESERVE_SPACE_EVEN_IF_HIDDEN) - - p.SetSizer(sizer) - p.Layout() - self.setTabTitle(pos, None) - else: - self.InsertPage(pos, frame, title) - frame.type=type - - self.SetSelection(pos) - wx.CallAfter(self.SetSelection, pos) - return pos - - def removeTab(self, i): - if self.GetPageCount() > 2: - -### FIXME - seems that we remove the wrong image from the list -# self.ImageList.Remove(self.GetPageImage(i)) -### - self.DeletePage(i) - else: - self.setTabTitle(i, None) - remIcon = self.GetPageImage(i) - self.SetPageImage(i, -1) - self.ImageList.Remove(remIcon) - page = self.GetPage(i) - if page.type == "fit": - page.view.changeFit(None) - - def checkRemove(self, event): - tab, _ = self.HitTest(event.Position) - if tab != -1 and tab != self.GetPageCount() - 1: - self.removal = True - self.removeTab(tab) - #Deleting a tab might have put us on the "+" tab, make sure we don't stay there - if self.GetSelection() == self.GetPageCount() - 1: - self.SetSelection(self.GetPageCount() - 2) - - self.removal = False - - def removeCurrentTab(self): - self.removal = True - self.removeTab(self.GetSelection()) - #Deleting a tab might have put us on the "+" tab, make sure we don't stay there - if self.GetSelection() == self.GetPageCount() - 1: - self.SetSelection(self.GetPageCount() - 2) - self.removal = False - - def checkAdd(self, event): - if event.Selection == self.GetPageCount() - 1: - if "__WXMSW__" not in wx.PlatformInfo: - self.countEvt = 1 - if not self.ignorePageChanged: - self.AddTab() - else: - self.ignorePageChanged = False - event.Veto() - - #Veto to prevent the + tab from being selected - event.Veto() - - def setTabTitle(self, tab, fitID): - page = self.GetPage(tab) - if page.type == "fit": - if fitID == None: - self.SetPageText(tab, "Empty Tab") - self.SetPageImage(tab, -1) - else: - cFit = service.Fit.getInstance() - fit = cFit.getFit(fitID) - self.SetPageText(tab, "%s: %s" % (fit.ship.item.name, fit.name)) - bitmap = bitmapLoader.getBitmap("race_%s_small" % fit.ship.item.race, "icons") - if bitmap: - self.SetPageImage(tab, self.imageList.Add(bitmap)) - - def pageChanged(self, event): - #On windows, we can't use the CHANGING event as its bugged, so we need to RECHECK here - if event.Selection == self.GetPageCount() - 1: - selection = self.AddTab() - else: - selection = event.Selection - if "__WXMSW__" in wx.PlatformInfo: - self.countEvt = 0 - - page = self.GetPage(selection) - - if self.countEvt == 0: - fitID = page.view.activeFitID - sFit = service.Fit.getInstance() - sFit.switchFit(fitID) - if hasattr(page, "type") and page.type == "fit": - wx.PostEvent(self.mainFrame, fv.FitChanged(fitID=fitID)) - else: - wx.PostEvent(self.mainFrame, fv.FitChanged(fitID=None)) - - self.countEvt -= 1 - if self.countEvt < 0: - if "__WXMSW__" not in wx.PlatformInfo: - self.countEvt = 0 - else: - self.countEvt = 1 - event.Skip() - - def changeFit(self, event): - selected = self.GetSelection() - page = self.GetPage(selected) - if page.type == "fit": - fitID = event.fitID - view = page.view - - #Notify service - sFit = service.Fit.getInstance() - sFit.switchFit(fitID) - - #Change title of current tab to new fit - self.setTabTitle(selected, fitID) - view.changeFit(fitID) - - event.Skip() - - def processRename(self, event): - fitID = event.fitID - # Loop through every tab and check if they're our culprit, if so, change tab name - for i in xrange(self.GetPageCount() - 1): - page = self.GetPage(i) - if page.type == "fit": - view = page.view - if view.activeFitID == fitID: - self.setTabTitle(i, fitID) - - event.Skip() - - def processRemove(self, event): - fitID = event.fitID - for i in xrange(self.GetPageCount() - 2, -1, -1): - page = self.GetPage(i) - if page.type == "fit": - view = page.view - if view.activeFitID == fitID: - self.removeTab(i) - - #Deleting a tab might have put us on the "+" tab, make sure we don't stay there - if self.GetSelection() == self.GetPageCount() - 1: - self.SetSelection(self.GetPageCount() - 2) - - event.Skip() - - def itemSelected(self, event): - selected = self.GetSelection() - page = self.GetPage(selected) - if page.type == "fit": - page.view.appendItem(event.itemID) - - event.Skip() + gui.chromeTabs.PFNotebook.__init__(self, parent) + self.AddPage(gui.fittingView.FittingView(self), "Empty Fit") diff --git a/gui/shipBrowser.py b/gui/shipBrowser.py index 141f397b2..5d8568861 100644 --- a/gui/shipBrowser.py +++ b/gui/shipBrowser.py @@ -2,7 +2,7 @@ import wx import copy from gui import bitmapLoader import gui.mainFrame -import gui.fittingView as fv +import gui.fittingView import service import time import os @@ -63,7 +63,7 @@ class ShipBrowser(wx.Panel): self.Bind(EVT_SB_STAGE3_SEL, self.stage3) self.Bind(EVT_SB_SEARCH_SEL, self.searchStage) - self.mainFrame.Bind(fv.FIT_CHANGED, self.RefreshList) + self.mainFrame.Bind(gui.fittingView.FIT_CHANGED, self.RefreshList) self.stage1(None) @@ -1594,12 +1594,11 @@ class FitItem(wx.Window): fitInst = service.fit.Fit.getInstance() draggedFit = fitInst.getFit(self.fitID) fitInst.project(activeFit,draggedFit) - wx.PostEvent(self.mainFrame, fv.FitChanged(fitID=activeFit)) + wx.PostEvent(self.mainFrame, gui.fittingView.FitChanged(fitID=activeFit)) if self.checkForGraphFrame(targetWnd, gfWnd): self.mainFrame.graphFrame.AppendFitToList(self.fitID) - event.Skip() return