diff -r 31e63e25b4cc -r 64beb9e9c749 controls/CustomToolTip.py --- 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()