--- a/controls/LogViewer.py Thu Mar 14 17:51:30 2013 +0100
+++ b/controls/LogViewer.py Thu Mar 14 19:18:58 2013 +0100
@@ -24,6 +24,7 @@
from datetime import datetime
from time import time as gettime
@@ -86,9 +87,9 @@
elif posy > thumb_rect.y + thumb_rect.height:
self.Parent.ScrollToFirst()
+ self.Parent.ScrollMessagePanelByTimestamp(1) elif posy > height - width:
+ self.Parent.ScrollMessagePanelByTimestamp(-1) def OnLeftUp(self, event):
@@ -161,6 +162,7 @@
self.Date = datetime.fromtimestamp(tv_sec)
self.Seconds = self.Date.second + tv_nsec * 1e-9
self.Date = self.Date.replace(second=0)
+ self.Timestamp = tv_sec + tv_nsec * 1e-9 self.LevelBitmap = level_bitmap
@@ -200,8 +202,7 @@
CHANGE_TIMESTAMP_BUTTONS = [(_("1d"), DAY),
REVERSE_CHANGE_TIMESTAMP_BUTTONS = CHANGE_TIMESTAMP_BUTTONS[:]
REVERSE_CHANGE_TIMESTAMP_BUTTONS.reverse()
@@ -289,6 +290,7 @@
self.previous_log_count = [None]*LogLevelsCount
+ self.LogMessagesTimestamp = numpy.array([]) self.CurrentMessage = None
@@ -334,12 +336,24 @@
old_length = len(self.LogMessages)
for new_message in new_messages:
self.LogMessages.append(new_message)
+ self.LogMessagesTimestamp = numpy.append(self.LogMessagesTimestamp, [new_message.Timestamp]) if self.CurrentMessage is None or self.CurrentMessage == old_length - 1:
self.CurrentMessage = len(self.LogMessages) - 1
self.NewDataAvailable(None)
- def FilterLogMessage(self, message):
- return message.Level in self.CurrentFilter and message.Message.find(self.CurrentSearchValue) != -1
+ def FilterLogMessage(self, message, timestamp=None): + return (message.Level in self.CurrentFilter and + message.Message.find(self.CurrentSearchValue) != -1 and + (timestamp is None or message.Timestamp < timestamp)) + def GetMessageByTimestamp(self, timestamp): + if self.CurrentMessage is not None: + msgidx = numpy.argmin(abs(self.LogMessagesTimestamp - timestamp)) + message = self.LogMessages[msgidx] + if self.FilterLogMessage(message) and message.Timestamp > timestamp: + return self.GetPreviousMessage(msgidx, timestamp) def GetNextMessage(self, msgidx):
while msgidx < len(self.LogMessages) - 1:
@@ -349,11 +363,11 @@
- def GetPreviousMessage(self, msgidx):
+ def GetPreviousMessage(self, msgidx, timestamp=None): while 0 < msgidx < len(self.LogMessages):
message = self.LogMessages[msgidx - 1]
- if self.FilterLogMessage(message):
+ if self.FilterLogMessage(message, timestamp): return message, msgidx - 1
if len(self.LogMessages) > 0:
@@ -375,11 +389,12 @@
self.LogMessages.insert(0, message)
+ self.LogMessagesTimestamp = numpy.insert(self.LogMessagesTimestamp, [0], [message.Timestamp]) if self.CurrentMessage is not None:
- if self.FilterLogMessage(message):
+ if self.FilterLogMessage(message, timestamp): @@ -454,6 +469,16 @@
+ def ScrollMessagePanelByTimestamp(self, seconds): + if self.CurrentMessage is not None: + current_message = self.LogMessages[self.CurrentMessage] + message, msgidx = self.GetMessageByTimestamp(current_message.Timestamp + seconds) + if message is None or self.IsMessagePanelBottom(msgidx): + self.CurrentMessage = msgidx def ResetMessagePanel(self):
if len(self.LogMessages) > 0:
self.CurrentMessage = len(self.LogMessages) - 1
@@ -485,6 +510,7 @@
def GenerateOnDurationButton(self, duration):
def OnDurationButton(event):
+ self.ScrollMessagePanelByTimestamp(duration)