Add some simple filtering

This commit is contained in:
René Stadler 2007-11-15 13:47:38 +02:00 committed by Stefan Sauer
parent 2f96b18869
commit 9d8f796931
2 changed files with 89 additions and 20 deletions

View file

@ -55,7 +55,7 @@ class LogModelBase (gtk.GenericTreeModel):
__metaclass__ = Common.GUI.MetaModel
columns = ("COL_LEVEL", str, # FIXME: Use Data.DebugLevel instances/ints!
columns = ("COL_LEVEL", object,
"COL_PID", int,
"COL_THREAD", gobject.TYPE_UINT64,
"COL_TIME", gobject.TYPE_UINT64,
@ -75,6 +75,16 @@ class LogModelBase (gtk.GenericTreeModel):
self.line_offsets = []
self.line_cache = {}
def ensure_cached (self, line_offset):
raise NotImplementedError ("derived classes must override this method")
def iter_rows_offset (self):
for offset in self.line_offsets:
self.ensure_cached (offset)
yield (self.line_cache[offset], offset,)
def on_get_flags (self):
flags = gtk.TREE_MODEL_LIST_ONLY | gtk.TREE_MODEL_ITERS_PERSIST
@ -88,10 +98,14 @@ class LogModelBase (gtk.GenericTreeModel):
def on_get_column_type (self, col_id):
return self.column_types[col_id]
def on_get_iter (self, path):
if not path:
return
if len (path) > 1:
# Flat model.
return None
line_index = path[0]
@ -101,13 +115,17 @@ class LogModelBase (gtk.GenericTreeModel):
return line_index
def on_get_path (self, line_index):
def on_get_path (self, rowref):
line_index = rowref
return (line_index,)
def on_get_value (self, line_index, col_id):
if line_index > len (self.line_offsets) - 1:
last_index = len (self.line_offsets) - 1
if line_index > last_index:
return None
line_offset = self.line_offsets[line_index]
@ -117,7 +135,9 @@ class LogModelBase (gtk.GenericTreeModel):
def on_iter_next (self, line_index):
if line_index >= len (self.line_offsets) - 1:
last_index = len (self.line_offsets) - 1
if line_index >= last_index:
return None
else:
return line_index + 1
@ -139,10 +159,12 @@ class LogModelBase (gtk.GenericTreeModel):
def on_iter_nth_child (self, parent, n):
if parent or n > len (self.line_offsets) - 1:
last_index = len (self.line_offsets) - 1
if parent or n > last_index:
return None
else:
return n ## self.line_offsets[n]
return n
def on_iter_parent (self, child):
@ -208,7 +230,7 @@ class LazyLogModel (LogModelBase):
match = self.__line_regex.match (line[ts_len:-len (os.linesep)])
if match is None:
# FIXME?
groups = [ts, 0, 0, "?", "", "", 0, "", "", line[ts_len:-len (os.linesep)]]
groups = [ts, 0, 0, Data.DebugLevelNone, "", "", 0, "", "", line[ts_len:-len (os.linesep)]]
else:
groups = [ts] + list (match.groups ())
@ -216,6 +238,10 @@ class LazyLogModel (LogModelBase):
# much run time speed it costs!
groups[1] = int (groups[1]) # pid
groups[2] = int (groups[2], 16) # thread pointer
try:
groups[3] = Data.DebugLevel (groups[3])
except ValueError:
groups[3] = Data.DebugLevelNone
groups[6] = int (groups[6]) # line
groups[8] = groups[8] or "" # object (optional)
@ -230,11 +256,36 @@ class FilteredLogModel (LogModelBase):
LogModelBase.__init__ (self)
self.parent_model = lazy_log_model
self.ensure_cached = lazy_log_model.ensure_cached
##self.ensure_cached = lazy_log_model.ensure_cached
self.line_cache = lazy_log_model.line_cache
self.line_offsets += lazy_log_model.line_offsets
def ensure_cached (self, line_offset):
return self.parent_model.ensure_cached (line_offset)
def add_filter (self, filter):
func = filter.filter_func
#enum = self.lazy_log_model.iter_rows_offset ()
enum = self.iter_rows_offset ()
self.line_offsets[:] = (offset for row, offset in enum
if func (row))
class Filter (object):
pass
class DebugLevelFilter (Filter):
def __init__ (self, debug_level):
col_id = LogModelBase.COL_LEVEL
def filter_func (row):
return row[col_id] < debug_level
self.filter_func = filter_func
# Sync with gst-inspector!
class Column (object):
@ -353,16 +404,14 @@ class LevelColumn (TextColumn):
def get_modify_func ():
def format_level (value):
if value is None:
# FIXME: Should never be None!
return ""
return value[0]
return value.name[0]
return format_level
def get_values_for_size (self):
values = ["LOG", "DEBUG", "INFO", "WARN", "ERROR"]
values = [Data.DebugLevelLog, Data.DebugLevelDebug, Data.DebugLevelInfo,
Data.DebugLevelWarning, Data.DebugLevelError]
return values
@ -749,7 +798,8 @@ class Window (object):
group = gtk.ActionGroup ("RowActions")
group.add_actions ([("edit-copy-line", gtk.STOCK_COPY, _("Copy line"), "<Ctrl>C"),
("edit-copy-message", gtk.STOCK_COPY, _("Copy message"))])
("edit-copy-message", gtk.STOCK_COPY, _("Copy message")),
("filter-out-higher-levels", None, _("Filter out higher debug levels"))])
self.actions.add_group (group)
self.actions.add_group (self.column_manager.action_group)
@ -775,7 +825,6 @@ class Window (object):
self.log_view = self.widgets.log_view
self.log_view.drag_dest_unset ()
self.log_view.props.fixed_height_mode = True
#self.log_view.props.model = self.log_model.filtered ()
self.log_view.connect ("button-press-event", self.handle_log_view_button_press_event)
@ -839,6 +888,7 @@ class Window (object):
for action_name in ("new-window", "open-file", "close-window",
"edit-copy-line", "edit-copy-message",
"filter-out-higher-levels",
"show-about",):
name = action_name.replace ("-", "_")
action = getattr (self.actions, name)
@ -869,7 +919,8 @@ class Window (object):
model, tree_iter = selection.get_selected ()
if tree_iter is None:
raise ValueError ("no line selected")
return self.log_model.get (tree_iter, *LazyLogModel.column_ids)
model = self.log_view.props.model
return model.get (tree_iter, *self.log_model.column_ids)
def close (self, *a, **kw):
@ -915,6 +966,21 @@ class Window (object):
col_id = self.log_model.COL_MESSAGE
self.clipboard.set_text (self.get_active_line ()[col_id])
def handle_filter_out_higher_levels_action_activate (self, action):
row = self.get_active_line ()
debug_level = row[self.log_model.COL_LEVEL]
try:
target_level = debug_level.higher_level ()
except ValueError:
return
self.log_filter.add_filter (DebugLevelFilter (target_level))
# FIXME:
self.log_view.props.model = gtk.TreeStore (str)
self.log_view.props.model = self.log_filter
def handle_show_about_action_activate (self, action):
from GstDebugViewer import version
@ -997,9 +1063,11 @@ class Window (object):
for sentinel in self.sentinels:
sentinel ()
self.log_filter = FilteredLogModel (self.log_model)
def idle_set ():
#self.log_view.props.model = self.log_model
self.log_view.props.model = FilteredLogModel (self.log_model)
##self.log_view.props.model = self.log_model
self.log_view.props.model = self.log_filter
return False
gobject.idle_add (idle_set)

View file

@ -26,6 +26,7 @@
<separator/>
<menuitem name="ViewContextMenuCopyMessage" action="edit-copy-message"/>
<menuitem name="ViewContextMenuCopyLine" action="edit-copy-line"/>
<menuitem name="ViewContextMenuFilterLevel" action="filter-out-higher-levels"/>
</menu>
<menu name="HelpMenu" action="HelpMenuAction">
<placeholder name="HelpMenuAdditions"/>