controls/LogViewer.py
branchwxPython4
changeset 3303 0ffb41625592
parent 2737 38afed869ff6
child 3575 cbf99c4122bd
equal deleted inserted replaced
3302:c89fc366bebd 3303:0ffb41625592
    97         self.CaptureMouse()
    97         self.CaptureMouse()
    98         posx, posy = event.GetPosition()
    98         posx, posy = event.GetPosition()
    99         width, height = self.GetClientSize()
    99         width, height = self.GetClientSize()
   100         range_rect = self.GetRangeRect()
   100         range_rect = self.GetRangeRect()
   101         thumb_rect = self.GetThumbRect()
   101         thumb_rect = self.GetThumbRect()
   102         if range_rect.InsideXY(posx, posy):
   102         if range_rect.Contains(posx, posy):
   103             if thumb_rect.InsideXY(posx, posy):
   103             if thumb_rect.Contains(posx, posy):
   104                 self.ThumbScrollingStartPos = wx.Point(posx, posy)
   104                 self.ThumbScrollingStartPos = wx.Point(posx, posy)
   105             elif posy < thumb_rect.y:
   105             elif posy < thumb_rect.y:
   106                 self.Parent.ScrollToLast()
   106                 self.Parent.ScrollToLast()
   107             elif posy > thumb_rect.y + thumb_rect.height:
   107             elif posy > thumb_rect.y + thumb_rect.height:
   108                 self.Parent.ScrollToFirst()
   108                 self.Parent.ScrollToFirst()
   137         pass
   137         pass
   138 
   138 
   139     def OnPaint(self, event):
   139     def OnPaint(self, event):
   140         dc = wx.BufferedPaintDC(self)
   140         dc = wx.BufferedPaintDC(self)
   141         dc.Clear()
   141         dc.Clear()
   142         dc.BeginDrawing()
       
   143 
   142 
   144         gc = wx.GCDC(dc)
   143         gc = wx.GCDC(dc)
   145 
   144 
   146         width, height = self.GetClientSize()
   145         width, height = self.GetClientSize()
   147 
   146 
   177         gc.DrawPolygon(ArrowPoints(wx.BOTTOM, width, width, 0, height))
   176         gc.DrawPolygon(ArrowPoints(wx.BOTTOM, width, width, 0, height))
   178 
   177 
   179         gc.DrawRectangle(thumb_rect.x, thumb_rect.y,
   178         gc.DrawRectangle(thumb_rect.x, thumb_rect.y,
   180                          thumb_rect.width, thumb_rect.height)
   179                          thumb_rect.width, thumb_rect.height)
   181 
   180 
   182         dc.EndDrawing()
       
   183         event.Skip()
   181         event.Skip()
   184 
   182 
   185 
   183 
   186 BUTTON_SIZE = (70, 15)
   184 BUTTON_SIZE = (70, 15)
   187 
   185 
   205         self.Position = wx.Point(x, y)
   203         self.Position = wx.Point(x, y)
   206 
   204 
   207     def HitTest(self, x, y):
   205     def HitTest(self, x, y):
   208         rect = wx.Rect(self.Position.x, self.Position.y,
   206         rect = wx.Rect(self.Position.x, self.Position.y,
   209                        self.Size.width, self.Size.height)
   207                        self.Size.width, self.Size.height)
   210         if rect.InsideXY(x, y):
   208         if rect.Contains(x, y):
   211             return True
   209             return True
   212         return False
   210         return False
   213 
   211 
   214     def ProcessCallback(self):
   212     def ProcessCallback(self):
   215         if self.Callback is not None:
   213         if self.Callback is not None:
   301         main_sizer = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=5)
   299         main_sizer = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=5)
   302         main_sizer.AddGrowableCol(0)
   300         main_sizer.AddGrowableCol(0)
   303         main_sizer.AddGrowableRow(1)
   301         main_sizer.AddGrowableRow(1)
   304 
   302 
   305         filter_sizer = wx.BoxSizer(wx.HORIZONTAL)
   303         filter_sizer = wx.BoxSizer(wx.HORIZONTAL)
   306         main_sizer.AddSizer(filter_sizer, border=5, flag=wx.TOP | wx.LEFT | wx.RIGHT | wx.GROW)
   304         main_sizer.Add(filter_sizer, border=5, flag=wx.TOP | wx.LEFT | wx.RIGHT | wx.GROW)
   307 
   305 
   308         self.MessageFilter = wx.ComboBox(self, style=wx.CB_READONLY)
   306         self.MessageFilter = wx.ComboBox(self, style=wx.CB_READONLY)
   309         self.MessageFilter.Append(_("All"))
   307         self.MessageFilter.Append(_("All"))
   310         levels = LogLevels[:3]
   308         levels = LogLevels[:3]
   311         levels.reverse()
   309         levels.reverse()
   312         for level in levels:
   310         for level in levels:
   313             self.MessageFilter.Append(_(level))
   311             self.MessageFilter.Append(_(level))
   314         self.Bind(wx.EVT_COMBOBOX, self.OnMessageFilterChanged, self.MessageFilter)
   312         self.Bind(wx.EVT_COMBOBOX, self.OnMessageFilterChanged, self.MessageFilter)
   315         filter_sizer.AddWindow(self.MessageFilter, 1, border=5, flag=wx.RIGHT | wx.ALIGN_CENTER_VERTICAL)
   313         filter_sizer.Add(self.MessageFilter, 1, border=5, flag=wx.RIGHT | wx.ALIGN_CENTER_VERTICAL)
   316 
   314 
   317         self.SearchMessage = wx.SearchCtrl(self, style=wx.TE_PROCESS_ENTER)
   315         self.SearchMessage = wx.SearchCtrl(self, style=wx.TE_PROCESS_ENTER)
   318         self.SearchMessage.ShowSearchButton(True)
   316         self.SearchMessage.ShowSearchButton(True)
   319         self.SearchMessage.ShowCancelButton(True)
   317         self.SearchMessage.ShowCancelButton(True)
   320         self.Bind(wx.EVT_TEXT_ENTER, self.OnSearchMessageChanged, self.SearchMessage)
   318         self.Bind(wx.EVT_TEXT_ENTER, self.OnSearchMessageChanged, self.SearchMessage)
   321         self.Bind(wx.EVT_SEARCHCTRL_SEARCH_BTN,
   319         self.Bind(wx.EVT_SEARCHCTRL_SEARCH_BTN,
   322                   self.OnSearchMessageSearchButtonClick, self.SearchMessage)
   320                   self.OnSearchMessageSearchButtonClick, self.SearchMessage)
   323         self.Bind(wx.EVT_SEARCHCTRL_CANCEL_BTN,
   321         self.Bind(wx.EVT_SEARCHCTRL_CANCEL_BTN,
   324                   self.OnSearchMessageCancelButtonClick, self.SearchMessage)
   322                   self.OnSearchMessageCancelButtonClick, self.SearchMessage)
   325         filter_sizer.AddWindow(self.SearchMessage, 3, border=5, flag=wx.RIGHT | wx.ALIGN_CENTER_VERTICAL)
   323         filter_sizer.Add(self.SearchMessage, 3, border=5, flag=wx.RIGHT | wx.ALIGN_CENTER_VERTICAL)
   326 
   324 
   327         self.CleanButton = wx.lib.buttons.GenBitmapButton(self, bitmap=GetBitmap("Clean"),
   325         self.CleanButton = wx.lib.buttons.GenBitmapButton(self, bitmap=GetBitmap("Clean"),
   328                                                           size=wx.Size(28, 28), style=wx.NO_BORDER)
   326                                                           size=wx.Size(28, 28), style=wx.NO_BORDER)
   329         self.CleanButton.SetToolTipString(_("Clean log messages"))
   327         self.CleanButton.SetToolTip(_("Clean log messages"))
   330         self.Bind(wx.EVT_BUTTON, self.OnCleanButton, self.CleanButton)
   328         self.Bind(wx.EVT_BUTTON, self.OnCleanButton, self.CleanButton)
   331         filter_sizer.AddWindow(self.CleanButton)
   329         filter_sizer.Add(self.CleanButton)
   332 
   330 
   333         message_panel_sizer = wx.FlexGridSizer(cols=2, hgap=0, rows=1, vgap=0)
   331         message_panel_sizer = wx.FlexGridSizer(cols=2, hgap=0, rows=1, vgap=0)
   334         message_panel_sizer.AddGrowableCol(0)
   332         message_panel_sizer.AddGrowableCol(0)
   335         message_panel_sizer.AddGrowableRow(0)
   333         message_panel_sizer.AddGrowableRow(0)
   336         main_sizer.AddSizer(message_panel_sizer, border=5, flag=wx.LEFT | wx.RIGHT | wx.BOTTOM | wx.GROW)
   334         main_sizer.Add(message_panel_sizer, border=5, flag=wx.LEFT | wx.RIGHT | wx.BOTTOM | wx.GROW)
   337 
   335 
   338         self.MessagePanel = wx.Panel(self)
   336         self.MessagePanel = wx.Panel(self)
   339         if wx.Platform == '__WXMSW__':
   337         if wx.Platform == '__WXMSW__':
   340             self.Font = wx.Font(8, wx.SWISS, wx.NORMAL, wx.NORMAL, faceName='Courier New')
   338             self.Font = wx.Font(8, wx.SWISS, wx.NORMAL, wx.NORMAL, faceName='Courier New')
   341         else:
   339         else:
   347         self.MessagePanel.Bind(wx.EVT_LEAVE_WINDOW, self.OnMessagePanelLeaveWindow)
   345         self.MessagePanel.Bind(wx.EVT_LEAVE_WINDOW, self.OnMessagePanelLeaveWindow)
   348         self.MessagePanel.Bind(wx.EVT_MOUSEWHEEL, self.OnMessagePanelMouseWheel)
   346         self.MessagePanel.Bind(wx.EVT_MOUSEWHEEL, self.OnMessagePanelMouseWheel)
   349         self.MessagePanel.Bind(wx.EVT_ERASE_BACKGROUND, self.OnMessagePanelEraseBackground)
   347         self.MessagePanel.Bind(wx.EVT_ERASE_BACKGROUND, self.OnMessagePanelEraseBackground)
   350         self.MessagePanel.Bind(wx.EVT_PAINT, self.OnMessagePanelPaint)
   348         self.MessagePanel.Bind(wx.EVT_PAINT, self.OnMessagePanelPaint)
   351         self.MessagePanel.Bind(wx.EVT_SIZE, self.OnMessagePanelResize)
   349         self.MessagePanel.Bind(wx.EVT_SIZE, self.OnMessagePanelResize)
   352         message_panel_sizer.AddWindow(self.MessagePanel, flag=wx.GROW)
   350         message_panel_sizer.Add(self.MessagePanel, flag=wx.GROW)
   353 
   351 
   354         self.MessageScrollBar = LogScrollBar(self, wx.Size(16, -1))
   352         self.MessageScrollBar = LogScrollBar(self, wx.Size(16, -1))
   355         message_panel_sizer.AddWindow(self.MessageScrollBar, flag=wx.GROW)
   353         message_panel_sizer.Add(self.MessageScrollBar, flag=wx.GROW)
   356 
   354 
   357         self.SetSizer(main_sizer)
   355         self.SetSizer(main_sizer)
   358 
   356 
   359         self.LeftButtons = []
   357         self.LeftButtons = []
   360         for label, callback in [("+" + text, self.GenerateOnDurationButton(duration))
   358         for label, callback in [("+" + text, self.GenerateOnDurationButton(duration))
   532             self.RefreshView()
   530             self.RefreshView()
   533         DebugViewer.RefreshNewData(self, *args, **kwargs)
   531         DebugViewer.RefreshNewData(self, *args, **kwargs)
   534 
   532 
   535     def RefreshView(self):
   533     def RefreshView(self):
   536         width, height = self.MessagePanel.GetClientSize()
   534         width, height = self.MessagePanel.GetClientSize()
   537         bitmap = wx.EmptyBitmap(width, height)
   535         bitmap = wx.Bitmap(width, height)
   538         dc = wx.BufferedDC(wx.ClientDC(self.MessagePanel), bitmap)
   536         dc = wx.BufferedDC(wx.ClientDC(self.MessagePanel), bitmap)
   539         dc.Clear()
   537         dc.Clear()
   540         dc.BeginDrawing()
       
   541 
   538 
   542         if self.CurrentMessage is not None:
   539         if self.CurrentMessage is not None:
   543 
   540 
   544             dc.SetFont(self.Font)
   541             dc.SetFont(self.Font)
   545 
   542 
   556 
   553 
   557                 previous_message, message_idx = self.GetPreviousMessage(message_idx)
   554                 previous_message, message_idx = self.GetPreviousMessage(message_idx)
   558                 if previous_message is not None:
   555                 if previous_message is not None:
   559                     draw_date = message.Date != previous_message.Date
   556                     draw_date = message.Date != previous_message.Date
   560                 message = previous_message
   557                 message = previous_message
   561 
       
   562         dc.EndDrawing()
       
   563 
   558 
   564         self.MessageScrollBar.RefreshThumbPosition()
   559         self.MessageScrollBar.RefreshThumbPosition()
   565 
   560 
   566     def IsPLCLogEmpty(self):
   561     def IsPLCLogEmpty(self):
   567         empty = True
   562         empty = True