diff -r d51af006fa6b -r 64d8f52bc8c8 controls/CustomToolTip.py --- a/controls/CustomToolTip.py Fri Aug 11 15:18:19 2017 +0300 +++ b/controls/CustomToolTip.py Mon Aug 14 19:13:01 2017 +0300 @@ -39,32 +39,32 @@ """ class CustomToolTip(wx.PopupWindow): - + 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, + 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 @@ -97,11 +97,11 @@ 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: @@ -111,10 +111,10 @@ [: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 +122,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 +156,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 +168,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()