diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2020-12-31 11:42:08 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2020-12-31 12:39:08 (GMT) |
commit | 406a8a3c8eab4691ff32271ca906e93556d845dc (patch) | |
tree | 7bb5d771804c0a006ab8a1f474750a34e48cd018 /plugins/python/cglimpse/panel.py | |
parent | 8965133f188c817cbdf4fcf9d1f1b60462bbfe7d (diff) |
Completed the Python plugin displaying file entropy.
Diffstat (limited to 'plugins/python/cglimpse/panel.py')
-rw-r--r-- | plugins/python/cglimpse/panel.py | 130 |
1 files changed, 108 insertions, 22 deletions
diff --git a/plugins/python/cglimpse/panel.py b/plugins/python/cglimpse/panel.py index 2245e3a..a195b0d 100644 --- a/plugins/python/cglimpse/panel.py +++ b/plugins/python/cglimpse/panel.py @@ -2,6 +2,7 @@ import os from gi.repository import Gtk from pychrysalide import core +from pychrysalide.glibext import ConfigParam from pychrysalide.gtkext import BuiltNamedWidget from pychrysalide.gtkext import EasyGtk from pychrysalide.gui import PanelItem @@ -21,6 +22,18 @@ class CGlimpsePanel(PanelItem, UpdatablePanel): _working_group_id = core.setup_tiny_global_work_group() + @staticmethod + def setup_config(config): + """Register the configuration parameters for all the methods.""" + + param = ConfigParam('cglimpse.selected', ConfigParam.ConfigParamType.ULONG, 0) + config.add(param) + + ShannonEntropy.setup_config(config) + + ByteDistribution.setup_config(config) + + def __init__(self): """Initialize the GUI panel.""" @@ -35,10 +48,35 @@ class CGlimpsePanel(PanelItem, UpdatablePanel): self._builder.connect_signals(self) + self._start_changed_sid = -1 + self._end_changed_sid = -1 + self._content = None + self._start = 0 + self._end = 0 + + self._config = None + self._methods = {} + self._current = None + + + def attach_config(self, config): + """Attach a loaded configuration to the displayed panel.""" + + self._config = config + + self._methods['shannon'] = ShannonEntropy(self._builder, config, self._force_update) + self._methods['distrib'] = ByteDistribution(self._builder, config, self._force_update) + + param = config.search('cglimpse.selected') + selected = param.value combo = self._builder.get_object('method_sel') - self._on_method_changed(combo) + + if selected == combo.get_active(): + self._on_method_changed(combo) + else: + combo.set_active(selected) def _change_content(self, old, new): @@ -46,6 +84,23 @@ class CGlimpsePanel(PanelItem, UpdatablePanel): self._content = new.content if new else None + length = len(self._content.data) if self._content else 1 + + self._start = 0 + self._end = length + + scale = self._builder.get_object('start_pos') + scale.set_range(0, length - 1) + scale.set_value(0) + + self._start_changed_sid = scale.connect('value-changed', self._on_position_value_changed) + + scale = self._builder.get_object('end_pos') + scale.set_range(1, length) + scale.set_value(length) + + self._end_changed_sid = scale.connect('value-changed', self._on_position_value_changed) + combo = self._builder.get_object('method_sel') self._on_method_changed(combo) @@ -71,7 +126,7 @@ class CGlimpsePanel(PanelItem, UpdatablePanel): assert(uid == 0) - self._current.update(self._content.data) + self._current.update(self._content.data, [ self._start, self._end ]) area = self._builder.get_object('content') area.queue_draw() @@ -93,6 +148,28 @@ class CGlimpsePanel(PanelItem, UpdatablePanel): assert(uid == 0) + def _on_options_toggled(self, button): + """React on options display/hide order.""" + + lbl = self._builder.get_object('options_label') + + common = self._builder.get_object('common_options') + + if button.get_active(): + + button.get_parent().child_set_property(button, 'expand', False) + lbl.set_angle(0) + + common.show() + + else: + + button.get_parent().child_set_property(button, 'expand', True) + lbl.set_angle(90) + + common.hide() + + def _on_method_changed(self, combo): """React on method selection change.""" @@ -103,40 +180,49 @@ class CGlimpsePanel(PanelItem, UpdatablePanel): model = combo.get_model() key = model[tree_iter][1] - if key == 'shanon': - self._current = ShannonEntropy(self._builder) - - else: - assert(key == 'distrib') - self._current = ByteDistribution(self._builder) + assert(key in self._methods.keys()) + self._current = self._methods[key] self._current.switch() - if self._content: + stack = self._builder.get_object('specific_options') + stack.set_visible_child_name('%s_page' % key) - self.run_update(0) + param = self._config.search('cglimpse.selected') + param.value = combo.get_active() + self._force_update() - def _on_options_toggled(self, button): - """React on options display/hide order.""" - lbl = self._builder.get_object('options_label') + def _on_position_value_changed(self, scale): + """React when the data range value changes.""" - common = self._builder.get_object('common_options') + start_scale = self._builder.get_object('start_pos') + self._start = int(start_scale.get_value()) - if button.get_active(): + end_scale = self._builder.get_object('end_pos') + self._end = int(end_scale.get_value()) - button.get_parent().child_set_property(button, 'expand', False) - lbl.set_angle(0) + length = len(self._content.data) if self._content else 1 - common.show() + start_scale.disconnect(self._start_changed_sid) + end_scale.disconnect(self._end_changed_sid) - else: + start_scale.set_range(0, self._end - 1) + end_scale.set_range(self._start + 1, length) - button.get_parent().child_set_property(button, 'expand', True) - lbl.set_angle(90) + self._start_changed_sid = start_scale.connect('value-changed', self._on_position_value_changed) + self._end_changed_sid = end_scale.connect('value-changed', self._on_position_value_changed) - common.hide() + self._force_update() + + + def _force_update(self): + """Force the update of the rendering.""" + + if self._content: + + self.run_update(0) def _render_grid(self, widget, cr): |