Parcourir la source

fix advancing focus on TAB and SHIFT TAB

Daniel Sheffield il y a 3 ans
Parent
commit
897d1cd113
3 fichiers modifiés avec 60 ajouts et 84 suppressions
  1. 0 4
      grocery_transactions.py
  2. 10 51
      price_check.py
  3. 50 29
      widgets.py

+ 0 - 4
grocery_transactions.py

@@ -12,14 +12,10 @@ import urwid
 import pandas as pd
 from db_utils import QueryManager
 from widgets import (
-    NoTabCheckBox,
-    AutoCompleteEdit,
-    AutoCompleteFloatEdit,
     TransactionEditor,
     SuggestionPopup,
     GroceryTransactionEditor,
     ActivityManager,
-    _set_focus_path,
 )
 
 try:

+ 10 - 51
price_check.py

@@ -20,7 +20,7 @@ from widgets import (
     AutoCompleteFloatEdit,
     SuggestionPopup,
     ActivityManager,
-    #_set_focus_path,
+    FocusWidget,
 )
 from decimal import Decimal, InvalidOperation
 from collections import (
@@ -124,55 +124,7 @@ class GroceryPriceCheck(urwid.WidgetPlaceholder):
         self.activity_manager.show(self)
         self.activity_manager.show(price_check)
 
-class PriceCheck(urwid.WidgetPlaceholder):
-
-    def iter_focus_paths(self):
-        initial = [2,0,0,0]
-        container = self.original_widget.original_widget.original_widget
-        _set_focus_path(container, initial)
-        while True:
-            path = container.get_focus_path()
-            yield path
-            self.advance_focus()
-            path = container.get_focus_path()
-            if path == initial:
-                self.advance_focus()
-                break
-
-    def advance_focus(self, reverse=False):
-        container = self.original_widget.original_widget.original_widget
-
-        path = container.get_focus_path()
-        if reverse:
-            paths = [ i for i in self.iter_focus_paths() ]
-            zipped_paths = zip(paths, [
-                *paths[1:], paths[0]
-            ])
-            prev_path = map(lambda x: x[0], filter(
-                lambda x: x[1] == path,
-                zipped_paths
-            ))
-            _set_focus_path(container, next(prev_path))
-            return
-        
-        _iter = [ i for i in enumerate(path) ][::-1]
-
-        for idx, part in _iter:
-            p = [ i for i in path ]
-            if reverse:
-                p[idx] -= 1
-            else:
-                p[idx] += 1
-            
-            try:
-                _set_focus_path(container, p)
-                if path == [3]:
-                    self.advance_focus(reverse=reverse)
-                return
-            except IndexError:
-                path[idx] = 0
-        
-        container.set_focus_path([2,0,0,0])
+class PriceCheck(FocusWidget):
 
     def keypress(self, size, key):
         if isinstance(key, tuple):
@@ -275,7 +227,13 @@ class PriceCheck(urwid.WidgetPlaceholder):
     def __init__(self, query_manager, fields,
         top_pane, left_pane, right_pane, bottom_pane,
         autocomplete_cb):
-        super().__init__(urwid.SolidFill(u'/'))
+        super().__init__([2,0,1], [
+                [2,0,0,], [2,0,2], [2,2,0], [2,2,2],
+                [3,0,2,], [3,0,3,], [3,0,4,],
+                [3,1,3,],
+                [4,0,0,],
+            ]
+        )
         self.query_manager = query_manager
         self.top_pane = top_pane
         self.left_pane = left_pane
@@ -391,6 +349,7 @@ class PriceCheck(urwid.WidgetPlaceholder):
         widget = urwid.Filler(widget, 'top') 
         widget = urwid.AttrMap(widget, 'bg')
         self.original_widget = widget
+        widget.original_widget.original_widget.set_focus_path([3,0,0])
 
 cur.execute("BEGIN")
 

+ 50 - 29
widgets.py

@@ -124,19 +124,6 @@ class NoTabCheckBox(urwid.CheckBox):
         else:
             return super().keypress(size, key)
 
-def _set_focus_path(container, path):
-    try:
-        container.set_focus_path(path)
-        return
-    except IndexError:
-        pass
-        
-    if path[-1] == 0 and len(path) > 1:
-        _set_focus_path(container, path[:-1])
-        return
-    
-    raise IndexError
-
 class GroceryTransactionEditor(urwid.WidgetPlaceholder):
     def __init__(self, activity_manager, cur, log):
         super().__init__(urwid.SolidFill(u'/'))
@@ -201,25 +188,52 @@ class GroceryTransactionEditor(urwid.WidgetPlaceholder):
         self.log.write(statement)
         self.cur.execute(statement)
 
-class TransactionEditor(urwid.WidgetPlaceholder):
+class FocusWidget(urwid.WidgetPlaceholder):
+
+    def __init__(self, initial_focus, skip_focus):
+        super().__init__(urwid.SolidFill(u'/'))
+        self._initial_focus = tuple([ i for i in initial_focus ])
+        self._skip_focus = tuple([ i for i in skip_focus ])
+    
+    @property
+    def skip_focus(self):
+        return self._skip_focus
+    
+    @property
+    def initial_focus(self):
+        return list(self._initial_focus)
+    
+    @property
+    def container(self):
+        return self.original_widget.original_widget.original_widget
+    
+    def _set_focus_path(self, path):
+        try:
+            self.container.set_focus_path(path)
+            return
+        except IndexError:
+            pass
+        
+        if path[-1] == 0 and len(path) > 1:
+            self._set_focus_path(path[:-1])
+            return
+    
+        raise IndexError
 
     def iter_focus_paths(self):
-        initial = [2,0,0,0]
-        container = self.original_widget.original_widget.original_widget
-        _set_focus_path(container, initial)
+        self._set_focus_path(self.initial_focus)
         while True:
-            path = container.get_focus_path()
+            path = self.container.get_focus_path()
             yield path
             self.advance_focus()
-            path = container.get_focus_path()
-            if path == initial:
-                self.advance_focus()
+            path = self.container.get_focus_path()
+            if path == self.initial_focus:
                 break
 
     def advance_focus(self, reverse=False):
-        container = self.original_widget.original_widget.original_widget
 
-        path = container.get_focus_path()
+        path = self.container.get_focus_path()
+                
         if reverse:
             paths = [ i for i in self.iter_focus_paths() ]
             zipped_paths = zip(paths, [
@@ -229,7 +243,8 @@ class TransactionEditor(urwid.WidgetPlaceholder):
                 lambda x: x[1] == path,
                 zipped_paths
             ))
-            _set_focus_path(container, next(prev_path))
+            p = next(prev_path)
+            self._set_focus_path(p)
             return
         
         _iter = [ i for i in enumerate(path) ][::-1]
@@ -242,14 +257,16 @@ class TransactionEditor(urwid.WidgetPlaceholder):
                 p[idx] += 1
             
             try:
-                _set_focus_path(container, p)
-                if path == [3]:
+                self._set_focus_path(p)
+                if p in self.skip_focus:
                     self.advance_focus(reverse=reverse)
                 return
             except IndexError:
                 path[idx] = 0
-        
-        container.set_focus_path([2,0,0,0])
+            
+        self.container.set_focus_path(self.initial_focus)
+
+class TransactionEditor(FocusWidget):
 
     def keypress(self, size, key):
         if isinstance(key, tuple):
@@ -316,7 +333,11 @@ class TransactionEditor(urwid.WidgetPlaceholder):
     def __init__(self, query_manager, fields,
         layout, side_pane, bottom_pane,
         save_and_clear_cb, autocomplete_cb):
-        super().__init__(urwid.SolidFill(u'/'))
+        super().__init__([2,0,0,0], [
+            [4,],
+            [5,],
+            [7,],
+        ])
         self.organic_checkbox = NoTabCheckBox(
             u"Organic",
             on_state_change=self.apply_organic_state