diff --git a/miniframe.py b/miniframe.py index 2745b799a..11c337fbe 100644 --- a/miniframe.py +++ b/miniframe.py @@ -53,6 +53,9 @@ class PFTabRenderer: 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 @@ -105,7 +108,7 @@ class PFTabRenderer: def InitColors(self): self.tabColor = wx.SystemSettings_GetColour(wx.SYS_COLOUR_WINDOW) self.leftColor = self.CalculateColor(self.tabColor, 0x1F) - self.rightColor = self.CalculateColor(self.tabColor, 0x20) + self.rightColor = self.CalculateColor(self.tabColor, 0x24) self.gradientStartColor = self.CalculateColor(self.tabColor, 0x17 if self.selected else 0x27) def CalculateColor(self, color, delta): @@ -120,11 +123,11 @@ class PFTabRenderer: b = bkB + scale if r > 255: r = 255 - if r < -1: r = 0 + if r < 0: r = 0 if g > 255: g = 255 - if g < -1: g = 0 + if g < 0: g = 0 if b > 255: b = 255 - if b < -1: b = 0 + if b < 0: b = 0 return wx.Colour(r,b,g) @@ -301,6 +304,7 @@ class PFTabRenderer: canvas.SetMaskColour((13,22,31)) self.tabBitmap = canvas + class PFAddRenderer: def __init__(self, size = (24,12)): self.width, self.height = size @@ -365,11 +369,11 @@ class PFAddRenderer: b = bkB + scale if r > 255: r = 255 - if r < -1: r = 0 + if r < 0: r = 0 if g > 255: g = 255 - if g < -1: g = 0 + if g < 0: g = 0 if b > 255: b = 255 - if b < -1: b = 0 + if b < 0: b = 0 return wx.Colour(r,b,g) @@ -451,17 +455,24 @@ class PFTabsContainer(wx.Window): wx.Window.__init__(self, parent, id , pos, size , style = 0) self.tabs = [] width, height = size + self.width = width self.height = height + self.reserved = 48 + self.inclination = 6 + 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_UP, self.OnLeftUp) self.Bind(wx.EVT_MOTION, self.OnMotion) + self.tabShadow = PFTabRenderer((self.tabMinWidth, self.height)) def OnLeftUp(self, event): @@ -496,19 +507,30 @@ class PFTabsContainer(wx.Window): count += 1 event.Skip() - def OnMotion(self, event): - mposx,mposy = event.GetPosition() + 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): - tab.ShowCloseButtonHovering(True) + if not tab.GetCloseButtonHoverStatus(): + tab.ShowCloseButtonHovering(True) + dirty = True else: - tab.ShowCloseButtonHovering(False) + if tab.GetCloseButtonHoverStatus(): + tab.ShowCloseButtonHovering(False) + dirty = True + if dirty: + self.Refresh() + + def OnMotion(self, event): + mposx,mposy = event.GetPosition() + + self.CheckCloseButtons(mposx, mposy) - self.Refresh() event.Skip() def OnPaint(self, event): @@ -525,8 +547,12 @@ class PFTabsContainer(wx.Window): selected = None selpos = 0 + selWidth = selHeight = 0 + selColor = self.CalculateColor(wx.SystemSettings_GetColour(wx.SYS_COLOUR_WINDOW), 0x24) + startColor = self.leftColor = self.CalculateColor(wx.SystemSettings_GetColour(wx.SYS_COLOUR_WINDOW), 0x12) tabsWidth = 0 + for tab in self.tabs: tabsWidth += tab.tabWidth - tab.lrZoneWidth/2 @@ -547,7 +573,15 @@ class PFTabsContainer(wx.Window): mdc.DrawBitmap(self.efxBmp, selpos, 0, True) mdc.DrawBitmap(selected.Render(), selpos, 0, True) selected.SetPosition((selpos, 0)) + selWidth,selHeight = selected.GetSize() +# mdc.SetPen( wx.Pen( selColor, 1)) +# mdc.DrawLine(0,self.height-1,selpos,self.height-1) +# mdc.DrawLine(selpos + selWidth,self.height-1,self.width,self.height-1) + r1 = wx.Rect(0,self.height-1,selpos,1) + r2 = wx.Rect(selpos + selWidth,self.height -1, self.width - selpos - selWidth,1) + mdc.GradientFillLinear(r1, startColor, selColor, wx.EAST) + mdc.GradientFillLinear(r2, selColor, startColor, wx.EAST) mdc.DrawBitmap(self.addBitmap, round(tabsWidth) + 6, self.height/2 - self.addBitmap.GetHeight()/2, True) def OnErase(self, event): @@ -557,6 +591,14 @@ class PFTabsContainer(wx.Window): w,h = self.tabShadow.GetSize() if w != self.tabMinWidth: self.tabShadow.SetSize((self.tabMinWidth, self.height)) + fxBmp = self.tabShadow.Render() + + simg = fxBmp.ConvertToImage() + simg.InitAlpha() + simg = simg.Blur(2) + simg = simg.AdjustChannels(1,1,1,0.3) + + self.efxBmp = wx.BitmapFromImage(simg) def AddTab(self, title = wx.EmptyString, img = None): self.ClearTabsSelected() @@ -579,9 +621,12 @@ class PFTabsContainer(wx.Window): 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.AdjustTabsSize() self.Refresh() @@ -589,12 +634,14 @@ class PFTabsContainer(wx.Window): return len(self.tabs) def AdjustTabsSize(self): - start = time.clock() + tabMinWidth = 9000000 # Really, it should be over 9000 + for tab in self.tabs: - tx,ty = tab.GetMinSize() - if tabMinWidth > tx: - tabMinWidth = tx + mw,mh = tab.GetMinSize() + if tabMinWidth > mw: + tabMinWidth = mw + if self.GetTabsCount() >0: if (self.GetTabsCount()) * (tabMinWidth - 9) > self.tabContainerWidth - self.reserved: self.tabMinWidth = float(self.tabContainerWidth - self.reserved) / float(self.GetTabsCount()) + 9 @@ -609,15 +656,26 @@ class PFTabsContainer(wx.Window): if self.GetTabsCount() > 0: self.UpdateTabFX() - fxBmp = self.tabShadow.Render() - simg = fxBmp.ConvertToImage() - simg.InitAlpha() - simg = simg.Blur(2) - simg = simg.AdjustChannels(1,1,1,0.3) + def CalculateColor(self, color, delta): + bkR ,bkG , bkB = color + if bkR + bkG + bkB > 127*3: + scale = - delta + else: + scale = delta*2 - self.efxBmp = wx.BitmapFromImage(simg) - print "Adjust for %d took " % self.GetTabsCount(), time.clock() - start + r = bkR + scale + g = bkG + scale + b = bkB + scale + + if r > 255: r = 255 + if r < 0: r = 0 + if g > 255: g = 255 + if g < 0: g = 0 + if b > 255: b = 255 + if b < 0: b = 0 + + return wx.Colour(r,b,g) class MiniFrame(wx.Frame): def __init__(self):