--- a/controls/CustomToolTip.py Mon Aug 21 20:17:19 2017 +0000
+++ b/controls/CustomToolTip.py Mon Aug 21 23:22:58 2017 +0300
@@ -26,45 +26,45 @@
from controls.CustomStyledTextCtrl import faces
-TOOLTIP_MAX_CHARACTERS = 30 # Maximum number of characters by line in ToolTip
-TOOLTIP_MAX_LINE = 5 # Maximum number of line in ToolTip
-TOOLTIP_WAIT_PERIOD = 0.5 # Wait period before displaying tooltip in second
+TOOLTIP_MAX_CHARACTERS = 30 # Maximum number of characters by line in ToolTip
+TOOLTIP_MAX_LINE = 5 # Maximum number of line in ToolTip
+TOOLTIP_WAIT_PERIOD = 0.5 # Wait period before displaying tooltip in second
-#-------------------------------------------------------------------------------
+# -------------------------------------------------------------------------------
# Custom ToolTip
-#-------------------------------------------------------------------------------
+# -------------------------------------------------------------------------------
-"""
-Class that implements a custom tool tip
-"""
class CustomToolTip(wx.PopupWindow):
-
+ """
+ Class that implements a custom tool tip
+ """
+
def __init__(self, parent, tip, restricted=True):
"""
Constructor
@param parent: Parent window
@param tip: Tip text (may be multiline)
- @param restricted: Tool tip must follow size restriction in line and
+ @param restricted: Tool tip must follow size restriction in line and
characters number defined (default True)
"""
wx.PopupWindow.__init__(self, parent)
-
+
self.Restricted = restricted
-
+
self.SetBackgroundStyle(wx.BG_STYLE_CUSTOM)
self.SetTip(tip)
-
+
# Initialize text font style
self.Font = wx.Font(
- faces["size"],
- wx.SWISS,
- wx.NORMAL,
- wx.NORMAL,
- faceName = faces["mono"])
-
+ faces["size"],
+ wx.SWISS,
+ wx.NORMAL,
+ wx.NORMAL,
+ faceName=faces["mono"])
+
self.Bind(wx.EVT_PAINT, self.OnPaint)
-
+
def SetFont(self, font):
"""
Set tool tip text font style
@@ -72,7 +72,7 @@
"""
self.Font = font
self.RefreshTip()
-
+
def SetTip(self, tip):
"""
Set tool tip text
@@ -87,8 +87,7 @@
new_line = words[0]
for word in words[1:]:
# Add word to line
- if len(new_line + " " + word) <= \
- TOOLTIP_MAX_CHARACTERS:
+ if len(new_line + " " + word) <= TOOLTIP_MAX_CHARACTERS:
new_line += " " + word
# Create new line
else:
@@ -97,24 +96,24 @@
self.Tip.append(new_line)
else:
self.Tip.append(line)
-
+
# Restrict number of lines
if len(self.Tip) > TOOLTIP_MAX_LINE:
self.Tip = self.Tip[:TOOLTIP_MAX_LINE]
-
+
# Add ... to the end of last line to indicate that tool tip
# text is too long
if len(self.Tip[-1]) < TOOLTIP_MAX_CHARACTERS - 3:
self.Tip[-1] += "..."
else:
- self.Tip[-1] = self.Tip[-1]\
- [:TOOLTIP_MAX_CHARACTERS - 3] + "..."
+ self.Tip[-1] = self.Tip[-1][:TOOLTIP_MAX_CHARACTERS - 3] + \
+ "..."
else:
self.Tip = tip.splitlines()
-
+
# Prevent to call wx method in non-wx threads
wx.CallAfter(self.RefreshTip)
-
+
def SetToolTipPosition(self, pos):
"""
Set tool tip position
@@ -122,32 +121,32 @@
"""
# Get screen size to prevent tool tip to go out of the screen
screen_width, screen_height = wx.GetDisplaySize()
-
+
# Calculate position of tool tip to stay in screen limits
tip_width, tip_height = self.GetToolTipSize()
self.SetPosition(wx.Point(
max(0, min(pos.x, screen_width - tip_width)),
max(0, min(pos.y, screen_height - tip_height))))
-
+
def GetToolTipSize(self):
"""
Get tool tip size according to tip text and restriction
@return: wx.Size(tool_tip_width, tool_tip_height)
"""
max_width = max_height = 0
-
+
# Create a memory DC for calculating text extent
dc = wx.MemoryDC()
dc.SetFont(self.Font)
-
+
# Compute max tip text size
for line in self.Tip:
w, h = dc.GetTextExtent(line)
max_width = max(max_width, w)
max_height += h
-
+
return wx.Size(max_width + 4, max_height + 4)
-
+
def RefreshTip(self):
"""
Refresh tip on screen
@@ -156,10 +155,10 @@
if self:
# Refresh tool tip size and position
self.SetClientSize(self.GetToolTipSize())
-
+
# Redraw tool tip
self.Refresh()
-
+
def OnPaint(self, event):
"""
Callback for Paint Event
@@ -168,26 +167,26 @@
# Get buffered paint DC for tool tip
dc = wx.AutoBufferedPaintDC(self)
dc.Clear()
-
+
# Set DC drawing style
dc.SetPen(wx.BLACK_PEN)
dc.SetBrush(wx.Brush(wx.Colour(255, 238, 170)))
dc.SetFont(self.Font)
-
+
# Draw Tool tip
dc.BeginDrawing()
tip_width, tip_height = self.GetToolTipSize()
-
+
# Draw background rectangle
dc.DrawRectangle(0, 0, tip_width, tip_height)
-
+
# Draw tool tip text
line_offset = 0
for line in self.Tip:
dc.DrawText(line, 2, line_offset + 2)
line_width, line_height = dc.GetTextExtent(line)
line_offset += line_height
-
+
dc.EndDrawing()
-
+
event.Skip()