mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-03-05 03:11:16 +00:00
Fix selection of line after changing filter, add logging
This commit is contained in:
parent
d87731efcc
commit
8e6ad93d99
1 changed files with 83 additions and 19 deletions
|
@ -358,6 +358,8 @@ class FilteredLogModelBase (LogModelBase):
|
||||||
|
|
||||||
LogModelBase.__init__ (self)
|
LogModelBase.__init__ (self)
|
||||||
|
|
||||||
|
self.logger = logging.getLogger ("filter-model-base")
|
||||||
|
|
||||||
self.super_model = super_model
|
self.super_model = super_model
|
||||||
self.access_offset = super_model.access_offset
|
self.access_offset = super_model.access_offset
|
||||||
self.ensure_cached = super_model.ensure_cached
|
self.ensure_cached = super_model.ensure_cached
|
||||||
|
@ -373,17 +375,43 @@ class FilteredLogModelBase (LogModelBase):
|
||||||
|
|
||||||
def line_index_to_top (self, line_index):
|
def line_index_to_top (self, line_index):
|
||||||
|
|
||||||
model = self
|
_log_indices = [line_index]
|
||||||
|
|
||||||
super_index = line_index
|
super_index = line_index
|
||||||
while hasattr (model, "super_model") and model.super_model:
|
for model in self._iter_hierarchy ():
|
||||||
super_index = model.line_index_to_super (super_index)
|
super_index = model.line_index_to_super (super_index)
|
||||||
model = model.super_model
|
_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
|
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 super_model_changed (self):
|
def super_model_changed (self):
|
||||||
|
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
def _iter_hierarchy (self):
|
||||||
|
|
||||||
|
model = self
|
||||||
|
while hasattr (model, "super_model") and model.super_model:
|
||||||
|
yield model
|
||||||
|
model = model.super_model
|
||||||
|
|
||||||
class FilteredLogModelIdentity (FilteredLogModelBase):
|
class FilteredLogModelIdentity (FilteredLogModelBase):
|
||||||
|
|
||||||
def __init__ (self, super_model):
|
def __init__ (self, super_model):
|
||||||
|
@ -617,10 +645,15 @@ class RangeFilteredLogModel (FilteredLogModelBase):
|
||||||
|
|
||||||
FilteredLogModelBase.__init__ (self, super_model)
|
FilteredLogModelBase.__init__ (self, super_model)
|
||||||
|
|
||||||
|
self.logger = logging.getLogger ("range-filtered-model")
|
||||||
|
|
||||||
self.line_index_range = None
|
self.line_index_range = None
|
||||||
|
|
||||||
def set_range (self, start_index, last_index):
|
def set_range (self, start_index, last_index):
|
||||||
|
|
||||||
|
self.logger.debug ("setting range to first = %i, last = %i",
|
||||||
|
start_index, last_index)
|
||||||
|
|
||||||
self.line_index_range = (start_index, last_index,)
|
self.line_index_range = (start_index, last_index,)
|
||||||
self.line_offsets = SubRange (self.super_model.line_offsets,
|
self.line_offsets = SubRange (self.super_model.line_offsets,
|
||||||
start_index, last_index)
|
start_index, last_index)
|
||||||
|
@ -629,7 +662,12 @@ class RangeFilteredLogModel (FilteredLogModelBase):
|
||||||
|
|
||||||
def reset (self):
|
def reset (self):
|
||||||
|
|
||||||
self.set_range (0, len (self.super_model) - 1,)
|
self.logger.debug ("reset")
|
||||||
|
|
||||||
|
first_index = 0
|
||||||
|
last_index = len (self.super_model) - 1
|
||||||
|
|
||||||
|
self.set_range (first_index, last_index,)
|
||||||
|
|
||||||
def line_index_to_super (self, line_index):
|
def line_index_to_super (self, line_index):
|
||||||
|
|
||||||
|
@ -641,9 +679,6 @@ class RangeFilteredLogModel (FilteredLogModelBase):
|
||||||
|
|
||||||
start, end = self.line_index_range
|
start, end = self.line_index_range
|
||||||
|
|
||||||
if start == end:
|
|
||||||
raise IndexError ("not in range (empty)")
|
|
||||||
|
|
||||||
if li < start or li > end:
|
if li < start or li > end:
|
||||||
raise IndexError ("not in range")
|
raise IndexError ("not in range")
|
||||||
|
|
||||||
|
@ -1623,34 +1658,54 @@ class Window (object):
|
||||||
self.logger.debug ("requesting close from app")
|
self.logger.debug ("requesting close from app")
|
||||||
self.app.close_window (self)
|
self.app.close_window (self)
|
||||||
|
|
||||||
|
def push_view_state (self):
|
||||||
|
|
||||||
|
self.default_index = None
|
||||||
|
|
||||||
|
model = self.log_view.props.model
|
||||||
|
if model is None:
|
||||||
|
return
|
||||||
|
|
||||||
|
try:
|
||||||
|
line_index = self.get_active_line_index ()
|
||||||
|
except ValueError:
|
||||||
|
self.logger.debug ("no line selected")
|
||||||
|
selected_index = None
|
||||||
|
else:
|
||||||
|
self.logger.debug ("pushing selected line %i", line_index)
|
||||||
|
selected_index = model.line_index_to_top (line_index)
|
||||||
|
|
||||||
|
self.default_index = selected_index
|
||||||
|
|
||||||
def update_model (self, model = None):
|
def update_model (self, model = None):
|
||||||
|
|
||||||
if model is None:
|
if model is None:
|
||||||
model = self.log_view.props.model
|
model = self.log_view.props.model
|
||||||
selected_index = None
|
|
||||||
previous_model = self.log_view.props.model
|
previous_model = self.log_view.props.model
|
||||||
if previous_model:
|
|
||||||
try:
|
|
||||||
line_index = self.get_active_line_index ()
|
|
||||||
except ValueError:
|
|
||||||
selected_index = None
|
|
||||||
else:
|
|
||||||
selected_index = previous_model.line_index_to_super (line_index)
|
|
||||||
|
|
||||||
if previous_model == model:
|
if previous_model == model:
|
||||||
# Force update.
|
# Force update.
|
||||||
self.log_view.set_model (None)
|
self.log_view.set_model (None)
|
||||||
self.log_view.props.model = model
|
self.log_view.props.model = model
|
||||||
|
|
||||||
|
def pop_view_state (self):
|
||||||
|
|
||||||
|
selected_index = self.default_index
|
||||||
if selected_index is None:
|
if selected_index is None:
|
||||||
return
|
return
|
||||||
|
|
||||||
|
model = self.log_view.props.model
|
||||||
|
if model is None:
|
||||||
|
return
|
||||||
|
|
||||||
try:
|
try:
|
||||||
select_index = model.line_index_from_super (selected_index)
|
select_index = model.line_index_from_top (selected_index)
|
||||||
except IndexError:
|
except IndexError, exc:
|
||||||
# Filtered out.
|
self.logger.debug ("abs line index %i filtered out, not reselecting",
|
||||||
pass
|
selected_index)
|
||||||
else:
|
else:
|
||||||
|
assert select_index >= 0
|
||||||
sel = self.log_view.get_selection ()
|
sel = self.log_view.get_selection ()
|
||||||
path = (select_index,)
|
path = (select_index,)
|
||||||
sel.select_path (path)
|
sel.select_path (path)
|
||||||
|
@ -1731,10 +1786,12 @@ class Window (object):
|
||||||
last_index,
|
last_index,
|
||||||
first_index)
|
first_index)
|
||||||
|
|
||||||
|
self.push_view_state ()
|
||||||
self.log_range.set_range (first_index, last_index)
|
self.log_range.set_range (first_index, last_index)
|
||||||
if self.log_filter:
|
if self.log_filter:
|
||||||
self.log_filter.super_model_changed_range ()
|
self.log_filter.super_model_changed_range ()
|
||||||
self.update_model ()
|
self.update_model ()
|
||||||
|
self.pop_view_state ()
|
||||||
self.actions.show_hidden_lines.props.sensitive = True
|
self.actions.show_hidden_lines.props.sensitive = True
|
||||||
|
|
||||||
def handle_hide_before_line_action_activate (self, action):
|
def handle_hide_before_line_action_activate (self, action):
|
||||||
|
@ -1752,18 +1809,22 @@ class Window (object):
|
||||||
first_index,
|
first_index,
|
||||||
last_index)
|
last_index)
|
||||||
|
|
||||||
|
self.push_view_state ()
|
||||||
self.log_range.set_range (first_index, last_index)
|
self.log_range.set_range (first_index, last_index)
|
||||||
if self.log_filter:
|
if self.log_filter:
|
||||||
self.log_filter.super_model_changed_range ()
|
self.log_filter.super_model_changed_range ()
|
||||||
self.update_model ()
|
self.update_model ()
|
||||||
|
self.pop_view_state ()
|
||||||
self.actions.show_hidden_lines.props.sensitive = True
|
self.actions.show_hidden_lines.props.sensitive = True
|
||||||
|
|
||||||
def handle_show_hidden_lines_action_activate (self, action):
|
def handle_show_hidden_lines_action_activate (self, action):
|
||||||
|
|
||||||
self.logger.info ("restoring model filter to show all lines")
|
self.logger.info ("restoring model filter to show all lines")
|
||||||
|
self.push_view_state ()
|
||||||
self.log_range.reset ()
|
self.log_range.reset ()
|
||||||
self.log_filter = None
|
self.log_filter = None
|
||||||
self.update_model (self.log_range)
|
self.update_model (self.log_range)
|
||||||
|
self.pop_view_state ()
|
||||||
self.actions.show_hidden_lines.props.sensitive = False
|
self.actions.show_hidden_lines.props.sensitive = False
|
||||||
|
|
||||||
def handle_edit_copy_line_action_activate (self, action):
|
def handle_edit_copy_line_action_activate (self, action):
|
||||||
|
@ -1792,6 +1853,7 @@ class Window (object):
|
||||||
# FIXME: Unsetting the model to keep e.g. the dispatched timeline
|
# FIXME: Unsetting the model to keep e.g. the dispatched timeline
|
||||||
# sentinel from collecting data while we filter idly, which slows
|
# sentinel from collecting data while we filter idly, which slows
|
||||||
# things down for nothing.
|
# things down for nothing.
|
||||||
|
self.push_view_state ()
|
||||||
self.log_view.set_model (None)
|
self.log_view.set_model (None)
|
||||||
if self.log_filter is None:
|
if self.log_filter is None:
|
||||||
self.log_filter = FilteredLogModel (self.log_range)
|
self.log_filter = FilteredLogModel (self.log_range)
|
||||||
|
@ -1835,7 +1897,9 @@ class Window (object):
|
||||||
self.progress_dialog.destroy ()
|
self.progress_dialog.destroy ()
|
||||||
self.progress_dialog = None
|
self.progress_dialog = None
|
||||||
|
|
||||||
|
# No push_view_state here, did this in add_model_filter.
|
||||||
self.update_model (self.log_filter)
|
self.update_model (self.log_filter)
|
||||||
|
self.pop_view_state ()
|
||||||
|
|
||||||
self.actions.show_hidden_lines.props.sensitive = True
|
self.actions.show_hidden_lines.props.sensitive = True
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue