Ver código fonte

fix behaviour of clear button and show error when no file name set

Daniel Sheffield 2 anos atrás
pai
commit
03eac40e17
1 arquivos alterados com 59 adições e 64 exclusões
  1. 59 64
      app/activities/RecipeEditor.py

+ 59 - 64
app/activities/RecipeEditor.py

@@ -191,43 +191,58 @@ class RecipeEditor(FocusWidget):
         self._components = _data
 
     def clear(self):
-        for ef in self.ingredients:
-            ef[0].set_edit_text('')
-            ef[1].set_edit_text('')
-            ef[2].set_edit_text('')
+        self.ingredients = []
+        self.add_ingredient()
         self.organic.set_state('mixed')
         self.instructions.set_edit_text('')
         self.fname.set_edit_text('')
+        self.notice.set_text('')
+        self.feeds.edit_text = ''
         return self.update()
 
+    def init_ingredients(self):
+        left_pane = [
+            LineBox(AttrMap(
+                AutoCompletePopUp(
+                    ingredient[0],
+                    self.apply_choice,
+                    lambda: self.activity_manager.show(self.update())
+                ), 'streak'), title=f'Product', title_align='left'
+            ) for idx, ingredient in enumerate(self.ingredients)
+        ]
+        middle_pane = [
+            LineBox(
+                ingredient[1], title=f'Quantity', title_align='left'
+            ) for idx, ingredient in enumerate(self.ingredients)
+        ]
+        right_pane = [
+            LineBox(AttrMap(
+                AutoCompletePopUp(
+                    ingredient[2],
+                    self.apply_choice,
+                    lambda: self.activity_manager.show(self.update())
+                ), 'streak'), title=f'Unit', title_align='left'
+            ) for idx, ingredient in enumerate(self.ingredients)
+        ]
+        gutter = [
+            *[ Divider() for _ in product(
+                range(3), self.ingredients[:-1]
+            )],
+            Divider(),
+            Divider(),
+            self.buttons['add'],
+        ]
+        return left_pane, middle_pane, right_pane, gutter
+
     def add_ingredient(self):
         self.ingredients.append(
             blank_ingredients_row(len(self.ingredients))
         )
-        l = LineBox(AttrMap(
-            AutoCompletePopUp(
-                self.ingredients[-1][0],
-                self.apply_choice,
-                lambda: self.activity_manager.show(self.update())
-            ), 'streak'), title=f'Product', title_align='left'
-        )
-        m = LineBox(
-            self.ingredients[-1][1], title=f'Quantity', title_align='left'
-        )
-        r = LineBox(AttrMap(
-            AutoCompletePopUp(
-                self.ingredients[-1][2],
-                self.apply_choice,
-                lambda: self.activity_manager.show(self.update())
-            ), 'streak'), title=f'Unit', title_align='left'
-        )
-        self.components['left_pane'].contents.append((l,('weight',1)))
-        self.components['middle_pane'][1].contents.append((m,('weight',1)))
-        self.components['right_pane'][1].contents.append((r,('weight',1)))
-        self.components['gutter'][1].contents = [
-            *[ (Divider(),('weight',1)) for _ in range(3) ],
-            *self.components['gutter'][1].contents,
-        ]
+        l, m, r, gutter = self.init_ingredients()
+        self.components['left_pane'].contents = list(map(lambda x: (x, ('weight',1)), l))
+        self.components['middle_pane'][1].contents = list(map(lambda x: (x, ('weight',1)), m))
+        self.components['right_pane'][1].contents = list(map(lambda x: (x, ('weight',1)), r))
+        self.components['gutter'][1].contents = list(map(lambda x: (x, ('weight',1)), gutter))
         for idx, widget in enumerate(self.ingredients):
             connect_signal(widget[0], 'postchange', lambda _,v: self.update())
             connect_signal(widget[0], 'apply', lambda w, name: self.autocomplete_callback(
@@ -255,7 +270,12 @@ class RecipeEditor(FocusWidget):
                 x[2].get_edit_text(),
             ) for x in self.ingredients
         ])))
-        yml['feeds'] = int(self.feeds.get_text()[0].rsplit(':', 1)[1].strip())
+        serves = self.feeds.value()
+        if serves:
+            n, d = serves.as_integer_ratio()
+            yml['feeds'] = float(self.feeds.value()) if d != 1 else n
+        else:
+            yml['feeds'] = None
         yml['instructions'] = literal_str('\n'.join(map(
 			lambda x: x.strip(),
 			self.instructions.get_text()[0].splitlines()
@@ -308,6 +328,10 @@ class RecipeEditor(FocusWidget):
         notice = ''
         ingredients = list(filter(lambda x: x, map(lambda x: x[0].get_edit_text(), self.ingredients)))
         parsed_products = list(get_products_from_xhtml(markdown(self.instructions.get_edit_text())))
+        fname = self.fname.get_edit_text()
+        if not fname:
+            self.notice.set_text('No file name set')
+            return self
         if not parsed_products:
             self.notice.set_text('Failed to parse recipe instructions')
             return self
@@ -317,7 +341,7 @@ class RecipeEditor(FocusWidget):
         for ingredient in set(ingredients) - products:
             notice += f"Ingredient '{ingredient}' is not used\n";
         if len(set(ingredients)) != len(ingredients):
-            notice += f"Some ingredients listed more than onece\n"
+            notice += f"Some ingredients listed more than once\n"
 
         self.notice.set_text(notice or 'None')
 
@@ -347,9 +371,9 @@ class RecipeEditor(FocusWidget):
 
         self.organic = NoTabCheckBox(('bg', "Organic"), state='mixed')
         self.instructions = Edit('', edit_text=recipe['instructions'] or u'', multiline=True, allow_tab=True)
-        self.feeds = Text(f"Serves: {recipe['feeds'] or ''}")
+        self.feeds = FloatEdit(f'Serves: ', f"{recipe['feeds']}" or '')
         self.price = Text(f"Cost: 0")
-        self.notice = Text(f"")
+        self.notice = Text('')
 
         bottom_pane = [
             self.organic,
@@ -379,37 +403,7 @@ class RecipeEditor(FocusWidget):
         ])
         banner = AttrMap(banner, 'banner')
 
-        left_pane = [
-            LineBox(AttrMap(
-                AutoCompletePopUp(
-                    ingredient[0],
-                    self.apply_choice,
-                    lambda: self.activity_manager.show(self.update())
-                ), 'streak'), title=f'Product', title_align='left'
-            ) for idx, ingredient in enumerate(self.ingredients)
-        ]
-        middle_pane = [
-            LineBox(
-                ingredient[1], title=f'Quantity', title_align='left'
-            ) for idx, ingredient in enumerate(self.ingredients)
-        ]
-        right_pane = [
-            LineBox(AttrMap(
-                AutoCompletePopUp(
-                    ingredient[2],
-                    self.apply_choice,
-                    lambda: self.activity_manager.show(self.update())
-                ), 'streak'), title=f'Unit', title_align='left'
-            ) for idx, ingredient in enumerate(self.ingredients)
-        ]
-        gutter = [
-            *[ Divider() for _ in product(
-                range(3), self.ingredients[:-1]
-            )],
-            Divider(),
-            Divider(),
-            self.buttons['add'],
-        ]
+        left_pane, middle_pane, right_pane, gutter = self.init_ingredients()
 
 
         self.components = {
@@ -457,6 +451,7 @@ class RecipeEditor(FocusWidget):
             lambda x: next(w for n,w in chain(
                 self.buttons.items(),
                 [
+                    ('fname', self.fname),
                     ('ingredients', self.ingredients[-1][0]),
                     ('instructions', self.instructions),
                     ('quantity', self.ingredients[-1][1]),
@@ -468,7 +463,7 @@ class RecipeEditor(FocusWidget):
                 'instructions',
                 'ingredients', 'quantity', 'units', 'add',
                 'organic',
-                'clear', 'exit',
+                'clear', 'fname', 'save', 'exit',
             ]
         ))
         self.update()