67 def GetRangeRect(self): |
67 def GetRangeRect(self): |
68 width, height = self.GetClientSize() |
68 width, height = self.GetClientSize() |
69 return wx.Rect(0, width, width, height - 2 * width) |
69 return wx.Rect(0, width, width, height - 2 * width) |
70 |
70 |
71 def GetThumbRect(self): |
71 def GetThumbRect(self): |
72 width, height = self.GetClientSize() |
72 width, _height = self.GetClientSize() |
73 range_rect = self.GetRangeRect() |
73 range_rect = self.GetRangeRect() |
74 thumb_size = range_rect.height * THUMB_SIZE_RATIO |
74 thumb_size = range_rect.height * THUMB_SIZE_RATIO |
75 thumb_range = range_rect.height - thumb_size |
75 thumb_range = range_rect.height - thumb_size |
76 thumb_center_position = (thumb_size + (self.ThumbPosition + 1) * thumb_range) / 2. |
76 thumb_center_position = (thumb_size + (self.ThumbPosition + 1) * thumb_range) / 2. |
77 thumb_start = int(thumb_center_position - thumb_size / 2.) |
77 thumb_start = int(thumb_center_position - thumb_size / 2.) |
116 self.ReleaseMouse() |
116 self.ReleaseMouse() |
117 event.Skip() |
117 event.Skip() |
118 |
118 |
119 def OnMotion(self, event): |
119 def OnMotion(self, event): |
120 if event.Dragging() and self.ThumbScrollingStartPos is not None: |
120 if event.Dragging() and self.ThumbScrollingStartPos is not None: |
121 posx, posy = event.GetPosition() |
121 _posx, posy = event.GetPosition() |
122 range_rect = self.GetRangeRect() |
122 range_rect = self.GetRangeRect() |
123 thumb_size = range_rect.height * THUMB_SIZE_RATIO |
123 thumb_size = range_rect.height * THUMB_SIZE_RATIO |
124 thumb_range = range_rect.height - thumb_size |
124 thumb_range = range_rect.height - thumb_size |
125 self.RefreshThumbPosition( |
125 self.RefreshThumbPosition( |
126 max(-1., min((posy - self.ThumbScrollingStartPos.y) * 2. / thumb_range, 1.))) |
126 max(-1., min((posy - self.ThumbScrollingStartPos.y) * 2. / thumb_range, 1.))) |
267 |
267 |
268 bw, bh = self.LevelBitmap.GetWidth(), self.LevelBitmap.GetHeight() |
268 bw, bh = self.LevelBitmap.GetWidth(), self.LevelBitmap.GetHeight() |
269 dc.DrawBitmap(self.LevelBitmap, 10 + sw, offset + (MESSAGE_INFO_SIZE - bh) / 2) |
269 dc.DrawBitmap(self.LevelBitmap, 10 + sw, offset + (MESSAGE_INFO_SIZE - bh) / 2) |
270 |
270 |
271 text = self.Message.replace("\n", " ") |
271 text = self.Message.replace("\n", " ") |
272 mw, mh = dc.GetTextExtent(text) |
272 _mw, mh = dc.GetTextExtent(text) |
273 dc.DrawText(text, 15 + sw + bw, offset + (MESSAGE_INFO_SIZE - mh) / 2) |
273 dc.DrawText(text, 15 + sw + bw, offset + (MESSAGE_INFO_SIZE - mh) / 2) |
274 |
274 |
275 def GetHeight(self, draw_date): |
275 def GetHeight(self, draw_date): |
276 if draw_date: |
276 if draw_date: |
277 return DATE_INFO_SIZE + MESSAGE_INFO_SIZE |
277 return DATE_INFO_SIZE + MESSAGE_INFO_SIZE |
403 |
403 |
404 def GetLogMessageFromSource(self, msgidx, level): |
404 def GetLogMessageFromSource(self, msgidx, level): |
405 if self.LogSource is not None: |
405 if self.LogSource is not None: |
406 answer = self.LogSource.GetLogMessage(level, msgidx) |
406 answer = self.LogSource.GetLogMessage(level, msgidx) |
407 if answer is not None: |
407 if answer is not None: |
408 msg, tick, tv_sec, tv_nsec = answer |
408 msg, _tick, tv_sec, tv_nsec = answer |
409 return LogMessage(tv_sec, tv_nsec, level, self.LevelIcons[level], msg) |
409 return LogMessage(tv_sec, tv_nsec, level, self.LevelIcons[level], msg) |
410 return None |
410 return None |
411 |
411 |
412 def ResetLogCounters(self): |
412 def ResetLogCounters(self): |
413 self.previous_log_count = [None]*LogLevelsCount |
413 self.previous_log_count = [None]*LogLevelsCount |
484 if self.FilterLogMessage(message, timestamp): |
484 if self.FilterLogMessage(message, timestamp): |
485 return message, msgidx - 1 |
485 return message, msgidx - 1 |
486 msgidx -= 1 |
486 msgidx -= 1 |
487 if len(self.LogMessages) > 0: |
487 if len(self.LogMessages) > 0: |
488 message = self.LogMessages[0] |
488 message = self.LogMessages[0] |
489 for idx, msg in self.OldestMessages: |
489 for _idx, msg in self.OldestMessages: |
490 if msg is not None and msg > message: |
490 if msg is not None and msg > message: |
491 message = msg |
491 message = msg |
492 while message is not None: |
492 while message is not None: |
493 level = message.Level |
493 level = message.Level |
494 oldest_msgidx, oldest_message = self.OldestMessages[level] |
494 oldest_msgidx, _oldest_message = self.OldestMessages[level] |
495 if oldest_msgidx > 0: |
495 if oldest_msgidx > 0: |
496 message = self.GetLogMessageFromSource(oldest_msgidx - 1, level) |
496 message = self.GetLogMessageFromSource(oldest_msgidx - 1, level) |
497 if message is not None: |
497 if message is not None: |
498 self.OldestMessages[level] = (oldest_msgidx - 1, message) |
498 self.OldestMessages[level] = (oldest_msgidx - 1, message) |
499 else: |
499 else: |
516 [message_idx], |
516 [message_idx], |
517 [message.Timestamp]) |
517 [message.Timestamp]) |
518 self.CurrentMessage = self.LogMessages.index(current_message) |
518 self.CurrentMessage = self.LogMessages.index(current_message) |
519 if message_idx == 0 and self.FilterLogMessage(message, timestamp): |
519 if message_idx == 0 and self.FilterLogMessage(message, timestamp): |
520 return message, 0 |
520 return message, 0 |
521 for idx, msg in self.OldestMessages: |
521 for _idx, msg in self.OldestMessages: |
522 if msg is not None and (message is None or msg > message): |
522 if msg is not None and (message is None or msg > message): |
523 message = msg |
523 message = msg |
524 return None, None |
524 return None, None |
525 |
525 |
526 def RefreshNewData(self, *args, **kwargs): |
526 def RefreshNewData(self, *args, **kwargs): |
577 |
577 |
578 def IsMessagePanelBottom(self, message_idx=None): |
578 def IsMessagePanelBottom(self, message_idx=None): |
579 if message_idx is None: |
579 if message_idx is None: |
580 message_idx = self.CurrentMessage |
580 message_idx = self.CurrentMessage |
581 if message_idx is not None: |
581 if message_idx is not None: |
582 width, height = self.MessagePanel.GetClientSize() |
582 _width, height = self.MessagePanel.GetClientSize() |
583 offset = 5 |
583 offset = 5 |
584 message = self.LogMessages[message_idx] |
584 message = self.LogMessages[message_idx] |
585 draw_date = True |
585 draw_date = True |
586 while message is not None and offset < height: |
586 while message is not None and offset < height: |
587 offset += message.GetHeight(draw_date) |
587 offset += message.GetHeight(draw_date) |
607 scroll += 1 |
607 scroll += 1 |
608 self.RefreshView() |
608 self.RefreshView() |
609 |
609 |
610 def ScrollMessagePanelByPage(self, page): |
610 def ScrollMessagePanelByPage(self, page): |
611 if self.CurrentMessage is not None: |
611 if self.CurrentMessage is not None: |
612 width, height = self.MessagePanel.GetClientSize() |
612 _width, height = self.MessagePanel.GetClientSize() |
613 message_per_page = max(1, (height - DATE_INFO_SIZE) / MESSAGE_INFO_SIZE - 1) |
613 message_per_page = max(1, (height - DATE_INFO_SIZE) / MESSAGE_INFO_SIZE - 1) |
614 self.ScrollMessagePanel(page * message_per_page) |
614 self.ScrollMessagePanel(page * message_per_page) |
615 |
615 |
616 def ScrollMessagePanelByTimestamp(self, seconds): |
616 def ScrollMessagePanelByTimestamp(self, seconds): |
617 if self.CurrentMessage is not None: |
617 if self.CurrentMessage is not None: |
671 self.ParentWindow.SetCopyBuffer(message.GetFullText()) |
671 self.ParentWindow.SetCopyBuffer(message.GetFullText()) |
672 return CopyMessageToClipboardFunction |
672 return CopyMessageToClipboardFunction |
673 |
673 |
674 def GetMessageByScreenPos(self, posx, posy): |
674 def GetMessageByScreenPos(self, posx, posy): |
675 if self.CurrentMessage is not None: |
675 if self.CurrentMessage is not None: |
676 width, height = self.MessagePanel.GetClientSize() |
676 _width, height = self.MessagePanel.GetClientSize() |
677 message_idx = self.CurrentMessage |
677 message_idx = self.CurrentMessage |
678 message = self.LogMessages[message_idx] |
678 message = self.LogMessages[message_idx] |
679 draw_date = True |
679 draw_date = True |
680 offset = 5 |
680 offset = 5 |
681 |
681 |
764 def OnMessagePanelPaint(self, event): |
764 def OnMessagePanelPaint(self, event): |
765 self.RefreshView() |
765 self.RefreshView() |
766 event.Skip() |
766 event.Skip() |
767 |
767 |
768 def OnMessagePanelResize(self, event): |
768 def OnMessagePanelResize(self, event): |
769 width, height = self.MessagePanel.GetClientSize() |
769 width, _height = self.MessagePanel.GetClientSize() |
770 offset = 2 |
770 offset = 2 |
771 for button in self.LeftButtons: |
771 for button in self.LeftButtons: |
772 button.SetPosition(offset, 2) |
772 button.SetPosition(offset, 2) |
773 w, h = button.GetSize() |
773 w, _h = button.GetSize() |
774 offset += w + 2 |
774 offset += w + 2 |
775 offset = width - 2 |
775 offset = width - 2 |
776 for button in self.RightButtons: |
776 for button in self.RightButtons: |
777 w, h = button.GetSize() |
777 w, _h = button.GetSize() |
778 button.SetPosition(offset - w, 2) |
778 button.SetPosition(offset - w, 2) |
779 offset -= w + 2 |
779 offset -= w + 2 |
780 if self.IsMessagePanelBottom(): |
780 if self.IsMessagePanelBottom(): |
781 self.ScrollToFirst() |
781 self.ScrollToFirst() |
782 else: |
782 else: |