From 804eb576d7ee0cb8c1ce4d42bb35efd3938e4bd4 Mon Sep 17 00:00:00 2001 From: Sven Augustin Date: Thu, 26 Nov 2020 23:10:47 +0100 Subject: [PATCH] added FilenameEntry widget (up/down key increase last number) --- slic/gui/fname.py | 80 +++++++++++++++++++++++++++++++++++++++++++++ slic/gui/widgets.py | 36 ++++++++++++++++++++ 2 files changed, 116 insertions(+) create mode 100644 slic/gui/fname.py diff --git a/slic/gui/fname.py b/slic/gui/fname.py new file mode 100644 index 00000000..fa9c7b30 --- /dev/null +++ b/slic/gui/fname.py @@ -0,0 +1,80 @@ + +def increase(s): + base, number = split_last_number(s) + if not number: + return base + number = increase_maintaining_width(number) + return base + number + + +def decrease(s): + base, number = split_last_number(s) + if not number: + return base + number = decrease_maintaining_width(number) + return base + number + + +def split_last_number(s): + rs = reverse_string(s) + + number, base = split_first_number(rs) + + number = reverse_string(number) + base = reverse_string(base) + + return base, number + + +def split_first_number(s): + i = count_digits(s) + number, base = split_at(s, i) + return number, base + + +def reverse_string(s): + return "".join(reversed(s)) + + +def count_digits(seq): + for i, char in enumerate(seq): + if not char.isdigit(): + break + return i + + +def split_at(seq, i): + return seq[:i], seq[i:] + + +def increase_maintaining_width(num): + length = len(num) + num = int(num) + 1 + num = str(num).zfill(length) + return num + + +def decrease_maintaining_width(num): + length = len(num) + num = int(num) - 1 + num = str(num).zfill(length) + return num + + + + + +if __name__ == "__main__": + v = extract_counter("t01est01") + print(v) + assert v == "t01est02" + + v = extract_counter("test_001") + print(v) + assert v == "test_002" + + v = "test" + assert v == extract_counter(v) + + + diff --git a/slic/gui/widgets.py b/slic/gui/widgets.py index cb84639d..c9cb9da7 100644 --- a/slic/gui/widgets.py +++ b/slic/gui/widgets.py @@ -2,9 +2,16 @@ import wx from slic.utils import arithmetic_eval +from .fname import increase, decrease + STRETCH = None +ADJUSTMENTS = { + wx.WXK_UP: increase, + wx.WXK_DOWN: decrease +} + def show_list(*args, **kwargs): dlg = ListDialog(*args, **kwargs) @@ -273,6 +280,35 @@ class MathEntry(wx.TextCtrl): +class FilenameEntry(wx.TextCtrl): + + def __init__(self, *args, **kwargs): + if "style" in kwargs: + kwargs["style"] |= wx.TE_RIGHT + else: + kwargs["style"] = wx.TE_RIGHT + + super().__init__(*args, **kwargs) + + self.Bind(wx.EVT_KEY_DOWN, self.on_key_press) + + + def on_key_press(self, event): + key = event.GetKeyCode() + if key in ADJUSTMENTS: + adjust = ADJUSTMENTS[key] + self._update_value(adjust) + else: + event.Skip() + + def _update_value(self, adjust): + val = self.GetValue() + val = adjust(val) + self.SetValue(val) + self.SetInsertionPointEnd() + + + class NotebookPanel(wx.Panel): #TODO: This needs work def __init__(self, *args, **kwargs):