"""
This module contains methods used throughout the L{RibbonBar} library.
"""
import wx
import math
[docs]def RibbonInterpolateColour(start_colour, end_colour, position, start_position, end_position):
if position <= start_position:
return start_colour
if position >= end_position:
return end_colour
position -= start_position
end_position -= start_position
r = end_colour.Red() - start_colour.Red()
g = end_colour.Green() - start_colour.Green()
b = end_colour.Blue() - start_colour.Blue()
r = start_colour.Red() + (((r * position * 100) / end_position) / 100)
g = start_colour.Green() + (((g * position * 100) / end_position) / 100)
b = start_colour.Blue() + (((b * position * 100) / end_position) / 100)
return wx.Colour(r, g, b)
[docs]def RibbonShiftLuminance(colour, amount):
if amount <= 1.0:
return colour.Darker(colour.luminance * (1.0 - amount))
else:
return colour.Lighter((1.0 - colour.luminance) * (amount - 1.0))
[docs]def RibbonCanLabelBreakAtPosition(label, pos):
return label[pos] == ' '
[docs]def RibbonDrawParallelGradientLines(dc, nlines, line_origins, stepx, stepy, numsteps, offset_x,
offset_y, start_colour, end_colour):
rd = end_colour.Red() - start_colour.Red()
gd = end_colour.Green() - start_colour.Green()
bd = end_colour.Blue() - start_colour.Blue()
for step in xrange(numsteps):
r = start_colour.Red() + (((step*rd*100)/numsteps)/100)
g = start_colour.Green() + (((step*gd*100)/numsteps)/100)
b = start_colour.Blue() + (((step*bd*100)/numsteps)/100)
p = wx.Pen(wx.Colour(r, g, b))
dc.SetPen(p)
for n in xrange(nlines):
dc.DrawLine(offset_x + line_origins[n].x, offset_y + line_origins[n].y,
offset_x + line_origins[n].x + stepx, offset_y + line_origins[n].y + stepy)
offset_x += stepx
offset_y += stepy
[docs]def RibbonLoadPixmap(bits, fore):
xpm = wx.BitmapFromXPMData(bits).ConvertToImage()
xpm.Replace(255, 0, 255, fore.Red(), fore.Green(), fore.Blue())
return wx.BitmapFromImage(xpm)
[docs]class RibbonHSLColour(object):
[docs] def __init__(self, h=0.0, s=0.0, l=0.0):
if isinstance(h, wx.Colour):
red, green, blue = h.Red()/255.0, h.Green()/255.0, h.Blue()/255.0
Min = min(red, min(green, blue))
Max = max(red, max(green, blue))
luminance = 0.5 * (Max + Min)
if Min == Max:
# colour is a shade of grey
hue = 0.0
saturation = 0.0
else:
if luminance <= 0.5:
saturation = (Max - Min) / (Max + Min)
else:
saturation = (Max - Min) / (2.0 - (Max + Min))
if Max == red:
hue = 60.0 * (green - blue) / (Max - Min)
if hue < 0.0:
hue += 360.0
elif Max == green:
hue = 60.0 * (blue - red) / (Max - Min)
hue += 120.0
else: # Max == blue
hue = 60.0 * (red - green) / (Max - Min)
hue += 240.0
self.hue = hue
self.saturation = saturation
self.luminance = luminance
else:
self.hue = h
self.saturation = s
self.luminance = l
[docs] def ToRGB(self):
_hue = (self.hue - math.floor(self.hue / 360.0) * 360.0)
_saturation = self.saturation
_luminance = self.luminance
if _saturation > 1.0:
_saturation = 1.0
if _saturation < 0.0:
_saturation = 0.0
if _luminance > 1.0:
_luminance = 1.0
if _luminance < 0.0:
_luminance = 0.0
if _saturation == 0.0:
# colour is a shade of grey
red = blue = green = _luminance
else:
tmp2 = (_luminance < 0.5 and [_luminance*(1.0 + _saturation)] or [(_luminance+_saturation) - (_luminance*_saturation)])[0]
tmp1 = 2.0 * _luminance - tmp2
tmp3R = _hue + 120.0
if tmp3R > 360.0:
tmp3R -= 360.0
if tmp3R < 60.0:
red = tmp1 + (tmp2 - tmp1) * tmp3R / 60.0
elif tmp3R < 180.0:
red = tmp2
elif tmp3R < 240.0:
red = tmp1 + (tmp2 - tmp1) * (240.0 - tmp3R) / 60.0
else:
red = tmp1
tmp3G = _hue
if tmp3G > 360.0:
tmp3G -= 360.0
if tmp3G < 60.0:
green = tmp1 + (tmp2 - tmp1) * tmp3G / 60.0
elif tmp3G < 180.0:
green = tmp2
elif tmp3G < 240.0:
green = tmp1 + (tmp2 - tmp1) * (240.0 - tmp3G) / 60.0
else:
green = tmp1
tmp3B = _hue + 240.0
if tmp3B > 360.0:
tmp3B -= 360.0
if tmp3B < 60.0:
blue = tmp1 + (tmp2 - tmp1) * tmp3B / 60.0
elif tmp3B < 180.0:
blue = tmp2
elif tmp3B < 240.0:
blue = tmp1 + (tmp2 - tmp1) * (240.0 - tmp3B) / 60.0
else:
blue = tmp1
return wx.Colour(red * 255.0, green * 255.0, blue * 255.0)
[docs] def Darker(self, delta):
return self.Lighter(-delta)
[docs] def MakeDarker(self, delta):
self.luminance -= delta
return self
[docs] def Lighter(self, delta):
return RibbonHSLColour(self.hue, self.saturation, self.luminance + delta)
[docs] def Saturated(self, delta):
return RibbonHSLColour(self.hue, self.saturation + delta, self.luminance)
[docs] def Desaturated(self, delta):
return self.Saturated(-delta)
[docs] def ShiftHue(self, delta):
return RibbonHSLColour(self.hue + delta, self.saturation, self.luminance)
[docs]class RibbonPageTabInfo(object):
[docs] def __init__(self):
self.page = -1
self.active = False
self.hovererd = False
self.rect = wx.Rect()
self.ideal_width = 0
self.small_begin_need_separator_width = 0
self.small_must_have_separator_width = 0
self.minimum_width = 0