summaryrefslogtreecommitdiff
path: root/GstDebugViewer
diff options
context:
space:
mode:
Diffstat (limited to 'GstDebugViewer')
-rw-r--r--GstDebugViewer/GUI/models.py240
-rw-r--r--GstDebugViewer/GUI/window.py33
2 files changed, 53 insertions, 220 deletions
diff --git a/GstDebugViewer/GUI/models.py b/GstDebugViewer/GUI/models.py
index 9d57b05..e760b2b 100644
--- a/GstDebugViewer/GUI/models.py
+++ b/GstDebugViewer/GUI/models.py
@@ -233,41 +233,6 @@ class FilteredLogModelBase (LogModelBase):
raise NotImplementedError ("index conversion not supported")
- def line_index_to_top (self, line_index):
-
- _log_indices = [line_index]
-
- super_index = line_index
- for model in self._iter_hierarchy ():
- super_index = model.line_index_to_super (super_index)
- _log_indices.append (super_index)
-
- _log_trans = " -> ".join ([str (x) for x in _log_indices])
- self.logger.debug ("translated index to top: %s", _log_trans)
-
- return super_index
-
- def line_index_from_top (self, super_index):
-
- _log_indices = [super_index]
-
- line_index = super_index
- for model in reversed (list (self._iter_hierarchy ())):
- line_index = model.line_index_from_super (line_index)
- _log_indices.append (line_index)
-
- _log_trans = " -> ".join ([str (x) for x in _log_indices])
- self.logger.debug ("translated index from top: %s", _log_trans)
-
- return line_index
-
- def _iter_hierarchy (self):
-
- model = self
- while hasattr (model, "super_model") and model.super_model:
- yield model
- model = model.super_model
-
class FilteredLogModel (FilteredLogModelBase):
def __init__ (self, super_model):
@@ -276,29 +241,16 @@ class FilteredLogModel (FilteredLogModelBase):
self.logger = logging.getLogger ("filtered-log-model")
- self.range_model = RangeFilteredLogModel (super_model)
-
self.filters = []
- self.super_index = []
- self.from_super_index = {}
self.reset ()
self.__active_process = None
self.__filter_progress = 0.
- def _iter_hierarchy (self):
-
- yield self
- yield self.range_model
-
def reset (self):
- range_model = self.range_model
- range_model.reset ()
- self.line_offsets = range_model.line_offsets
- self.line_levels = range_model.line_levels
-
- del self.super_index[:]
- self.from_super_index.clear ()
+ self.line_offsets = self.super_model.line_offsets
+ self.line_levels = self.super_model.line_levels
+ self.super_index = xrange (len (self.line_offsets))
del self.filters[:]
@@ -312,23 +264,14 @@ class FilteredLogModel (FilteredLogModelBase):
new_line_offsets = []
new_line_levels = []
new_super_index = []
- new_from_super_index = {}
level_id = self.COL_LEVEL
func = filter.filter_func
- if len (self.filters) == 1:
- # This is the first filter that gets applied.
- def enum ():
- i = 0
- for row, offset in self.iter_rows_offset ():
- yield (i, row, offset,)
- i += 1
- else:
- def enum ():
- i = 0
- for row, offset in self.iter_rows_offset ():
- line_index = self.super_index[i]
- yield (line_index, row, offset,)
- i += 1
+ def enum ():
+ i = 0
+ for row, offset in self.iter_rows_offset ():
+ line_index = self.super_index[i]
+ yield (line_index, row, offset,)
+ i += 1
self.logger.debug ("running filter")
progress = 0.
progress_full = float (len (self))
@@ -338,7 +281,6 @@ class FilteredLogModel (FilteredLogModelBase):
new_line_offsets.append (offset)
new_line_levels.append (row[level_id])
new_super_index.append (i)
- new_from_super_index[i] = len (new_super_index) - 1
y -= 1
if y == 0:
progress += float (YIELD_LIMIT)
@@ -348,7 +290,6 @@ class FilteredLogModel (FilteredLogModelBase):
self.line_offsets = new_line_offsets
self.line_levels = new_line_levels
self.super_index = new_super_index
- self.from_super_index = new_from_super_index
self.logger.debug ("filtering finished")
self.__filter_progress = 1.
@@ -395,112 +336,45 @@ class FilteredLogModel (FilteredLogModelBase):
def line_index_from_super (self, super_line_index):
- if len (self.filters) == 0:
- # Identity.
- return super_line_index
-
- try:
- return self.from_super_index[super_line_index]
- except KeyError:
- raise IndexError ("super index %i not handled" % (super_line_index,))
+ return bisect_left (self.super_index, super_line_index)
def line_index_to_super (self, line_index):
- if len (self.filters) == 0:
- # Identity.
- return line_index
-
return self.super_index[line_index]
- def __filtered_indices_in_range (self, start, stop):
-
- if start < 0:
- raise ValueError ("start cannot be negative (got %r)" % (start,))
-
- super_start = bisect_left (self.super_index, start)
- super_stop = bisect_left (self.super_index, stop)
+ def set_range (self, super_start, super_stop):
- return super_stop - super_start
+ old_super_start = self.line_index_to_super (0)
+ old_super_stop = self.line_index_to_super (len (self.super_index) - 1) + 1
- def set_range (self, start_index, stop_index):
+ self.logger.debug ("set range (%i, %i), current (%i, %i)",
+ super_start, super_stop, old_super_start, old_super_stop)
- range_model = self.range_model
- old_start, old_stop = range_model.line_index_range
- range_model.set_range (start_index, stop_index)
-
- if isinstance (self.line_offsets, SubRange):
- # FIXME: Can only take this shortcut when shrinking the range.
- self.line_offsets = range_model.line_offsets
- self.line_levels = range_model.line_levels
+ if len (self.filters) == 0:
+ # Identity.
+ self.super_index = xrange (super_start, super_stop)
+ self.line_offsets = SubRange (self.super_model.line_offsets,
+ super_start, super_stop)
+ self.line_levels = SubRange (self.super_model.line_levels,
+ super_start, super_stop)
return
- super_start, super_stop = range_model.line_index_range
-
- super_start_offset = super_start - old_start
- if super_start_offset < 0:
+ if super_start < old_super_start:
# TODO:
raise NotImplementedError ("Only handling further restriction of the range"
- " (start offset = %i)" % (super_start_offset,))
+ " (start offset = %i)" % (start_offset,))
- super_end_offset = super_stop - old_stop
- if super_end_offset > 0:
+ if super_stop > old_super_stop:
# TODO:
raise NotImplementedError ("Only handling further restriction of the range"
- " (end offset = %i)" % (super_end_offset,))
-
- if super_end_offset < 0:
- if not self.super_index:
- # Identity; there are no filters.
- end_offset = len (self.line_offsets) + super_end_offset
- else:
- n_filtered = self.__filtered_indices_in_range (super_stop - super_start,
- old_stop - super_start)
- end_offset = len (self.line_offsets) - n_filtered
- stop = len (self.line_offsets) # FIXME?
- assert end_offset < stop
-
- self.__remove_range (end_offset, stop)
-
- if super_start_offset > 0:
- if not self.super_index:
- # Identity; there are no filters.
- n_filtered = super_start_offset
- start_offset = n_filtered
- else:
- n_filtered = self.__filtered_indices_in_range (0, super_start_offset)
- start_offset = n_filtered
-
- if n_filtered > 0:
- self.__remove_range (0, start_offset)
-
- from_super = self.from_super_index
- for i in self.super_index:
- old_index = from_super[i]
- del from_super[i]
- from_super[i - super_start_offset] = old_index - start_offset
-
- for i in range (len (self.super_index)):
- self.super_index[i] -= super_start_offset
-
- def __remove_range (self, start, stop):
-
- if start < 0:
- raise ValueError ("start cannot be negative (got %r)" % (start,))
- if start == stop:
- return
- if stop > len (self.line_offsets):
- raise ValueError ("stop value out of range (got %r)" % (stop,))
- if start > stop:
- raise ValueError ("start cannot be greater than stop (got %r, %r)" % (start, stop,))
+ " (end offset = %i)" % (stop_offset,))
- self.logger.debug ("removing line range (%i, %i)",
- start, stop)
+ start = self.line_index_from_super (super_start)
+ stop = self.line_index_from_super (super_stop)
- del self.line_offsets[start:stop]
- del self.line_levels[start:stop]
- for super_index in self.super_index[start:stop]:
- del self.from_super_index[super_index]
- del self.super_index[start:stop]
+ self.super_index = SubRange (self.super_index, start, stop)
+ self.line_offsets = SubRange (self.line_offsets, start, stop)
+ self.line_levels = SubRange (self.line_levels, start, stop)
class SubRange (object):
@@ -511,6 +385,12 @@ class SubRange (object):
if start > stop:
raise ValueError ("need start <= stop (got %r, %r)" % (start, stop,))
+ if type (l) == type (self):
+ # Another SubRange, don't stack:
+ start += l.start
+ stop += l.start
+ l = l.l
+
self.l = l
self.start = start
self.stop = stop
@@ -529,51 +409,6 @@ class SubRange (object):
for i in xrange (self.start, self.stop):
yield l[i]
-class RangeFilteredLogModel (FilteredLogModelBase):
-
- def __init__ (self, super_model):
-
- FilteredLogModelBase.__init__ (self, super_model)
-
- self.logger = logging.getLogger ("range-filtered-model")
-
- self.line_index_range = None
-
- def set_range (self, start_index, stop_index):
-
- self.logger.debug ("setting range to start = %i, stop = %i",
- start_index, stop_index)
-
- self.line_index_range = (start_index, stop_index,)
- self.line_offsets = SubRange (self.super_model.line_offsets,
- start_index, stop_index)
- self.line_levels = SubRange (self.super_model.line_levels,
- start_index, stop_index)
-
- def reset (self):
-
- self.logger.debug ("reset")
-
- start_index = 0
- stop_index = len (self.super_model)
-
- self.set_range (start_index, stop_index,)
-
- def line_index_to_super (self, line_index):
-
- start_index = self.line_index_range[0]
-
- return line_index + start_index
-
- def line_index_from_super (self, li):
-
- start, stop = self.line_index_range
-
- if li < start or li >= stop:
- raise IndexError ("not in range")
-
- return li - start
-
class LineViewLogModel (FilteredLogModelBase):
def __init__ (self, super_model):
@@ -627,4 +462,3 @@ class LineViewLogModel (FilteredLogModelBase):
path = (line_index,)
self.row_deleted (path)
-
diff --git a/GstDebugViewer/GUI/window.py b/GstDebugViewer/GUI/window.py
index 75d79a1..4c7e201 100644
--- a/GstDebugViewer/GUI/window.py
+++ b/GstDebugViewer/GUI/window.py
@@ -41,8 +41,7 @@ from GstDebugViewer.GUI.filters import (CategoryFilter,
from GstDebugViewer.GUI.models import (FilteredLogModel,
LazyLogModel,
LineViewLogModel,
- LogModelBase,
- RangeFilteredLogModel)
+ LogModelBase)
def action (func):
@@ -119,8 +118,8 @@ class LineView (object):
line_index = path[0]
line_model = view.get_model ()
log_model = self.log_view.get_model ()
- top_index = line_model.line_index_to_top (line_index)
- log_index = log_model.line_index_from_top (top_index)
+ super_index = line_model.line_index_to_super (line_index)
+ log_index = log_model.line_index_from_super (super_index)
path = (log_index,)
self.log_view.scroll_to_cell (path, use_align = True, row_align = .5)
sel = self.log_view.get_selection ()
@@ -131,7 +130,7 @@ class LineView (object):
log_model = view.get_model ()
line_index = path[0]
- top_line_index = log_model.line_index_to_top (line_index)
+ super_index = log_model.line_index_to_super (line_index)
line_model = self.line_view.get_model ()
if line_model is None:
return
@@ -143,14 +142,14 @@ class LineView (object):
else:
position = 0
if len (line_model) > 1:
- other_index = line_model.line_index_to_top (position - 1)
+ other_index = line_model.line_index_to_super (position - 1)
else:
other_index = -1
- if other_index == top_line_index and position != 1:
+ if other_index == super_index and position != 1:
# Already have the line.
pass
else:
- line_model.insert_line (position, top_line_index)
+ line_model.insert_line (position, super_index)
self.clear_action.props.sensitive = True
def handle_log_view_selection_changed (self, selection):
@@ -165,7 +164,7 @@ class LineView (object):
return
path = model.get_path (tree_iter)
- line_index = model.line_index_to_top (path[0])
+ line_index = model.line_index_to_super (path[0])
if len (line_model) == 0:
line_model.insert_line (0, line_index)
@@ -409,7 +408,7 @@ class Window (object):
super_index = None
self.logger.debug ("no line selected")
else:
- super_index = model.line_index_to_top (line_index)
+ super_index = model.line_index_to_super (line_index)
self.logger.debug ("pushing selected line %i (abs %i)",
line_index, super_index)
@@ -419,7 +418,7 @@ class Window (object):
if vis_range is not None:
start_path, end_path = vis_range
start_index = start_path[0]
- self.default_start_index = model.line_index_to_top (start_index)
+ self.default_start_index = model.line_index_to_super (start_index)
def update_model (self, model = None):
@@ -445,7 +444,7 @@ class Window (object):
if selected_index is not None:
try:
- select_index = model.line_index_from_top (selected_index)
+ select_index = model.line_index_from_super (selected_index)
except IndexError as exc:
self.logger.debug ("abs line index %i filtered out, not reselecting",
selected_index)
@@ -467,7 +466,7 @@ class Window (object):
yield i
for current_index in traverse ():
try:
- target_index = model.line_index_from_top (current_index)
+ target_index = model.line_index_from_super (current_index)
except IndexError:
continue
else:
@@ -574,16 +573,16 @@ class Window (object):
return
if after:
- first_index = model.line_index_to_top (0)
- last_index = model.line_index_to_top (filtered_line_index)
+ first_index = model.line_index_to_super (0)
+ last_index = model.line_index_to_super (filtered_line_index)
self.logger.info ("hiding lines after %i (abs %i), first line is abs %i",
filtered_line_index,
last_index,
first_index)
else:
- first_index = model.line_index_to_top (filtered_line_index)
- last_index = model.line_index_to_top (len (model) - 1)
+ first_index = model.line_index_to_super (filtered_line_index)
+ last_index = model.line_index_to_super (len (model) - 1)
self.logger.info ("hiding lines before %i (abs %i), last line is abs %i",
filtered_line_index,