summaryrefslogtreecommitdiff
path: root/plugins/python/cglimpse/panel.py
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/python/cglimpse/panel.py')
-rw-r--r--plugins/python/cglimpse/panel.py130
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):