Daniel Sheffield 2 жил өмнө
parent
commit
d5a326a68c

+ 27 - 14
app/activities/RecipeEditor.py

@@ -206,7 +206,7 @@ class RecipeEditor(FocusWidget):
                 AutoCompletePopUp(
                     ingredient[0],
                     self.apply_choice,
-                    lambda: self.activity_manager.show(self.update())
+                    lambda: self.activity_manager.show(self.update(ingredient[0]))
                 ), 'streak'), title=f'Product', title_align='left'
             ) for idx, ingredient in enumerate(self.ingredients)
         ]
@@ -220,7 +220,7 @@ class RecipeEditor(FocusWidget):
                 AutoCompletePopUp(
                     ingredient[2],
                     self.apply_choice,
-                    lambda: self.activity_manager.show(self.update())
+                    lambda: self.activity_manager.show(self.update(ingredient[2]))
                 ), 'streak'), title=f'Unit', title_align='left'
             ) for idx, ingredient in enumerate(self.ingredients)
         ]
@@ -244,15 +244,15 @@ class RecipeEditor(FocusWidget):
         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], 'postchange', lambda w,_: self.update(w))
             connect_signal(widget[0], 'apply', lambda w, name: self.autocomplete_callback(
                 w, self.autocomplete_options(name, dict(map(
                     to_unnumbered_field,
                     filter(in_same_row(name), map(to_numbered_field, self.data.items())
                 ))))
             ))
-            connect_signal(widget[1], 'postchange', lambda _,v: self.update())
-            connect_signal(widget[2], 'postchange', lambda _,v: self.update())
+            connect_signal(widget[1], 'postchange', lambda w,_: self.update(w))
+            connect_signal(widget[2], 'postchange', lambda w,_: self.update(w))
             connect_signal(widget[2], 'apply', lambda w, name: self.autocomplete_callback(
                 w, self.autocomplete_options(name, dict(map(
                     to_unnumbered_field,
@@ -287,13 +287,15 @@ class RecipeEditor(FocusWidget):
             yaml.dump(yml, f)
 
 
-    def update(self):
+    def update(self, widget = None):
         data = self.data
         organic = None if data['organic'] == 'mixed' else data['organic']
         sort = 'ts'
         not_found = '='
-        price = list(map(Decimal,[0,0,0]))
-        for r in self.ingredients:
+        for r in filter(
+            lambda x: next(filter(lambda x: x is widget or widget is None, x), None),
+            self.ingredients
+        ):
             product, quantity, unit = map(lambda x: x.get_edit_text(), r)
 
             try:
@@ -321,10 +323,20 @@ class RecipeEditor(FocusWidget):
             _avg, _min, _max = list(
                 map(Decimal,df[['avg','min','max']].iloc[0])
             )
-            price[0] += _min*quantity
-            price[1] += _avg*quantity
-            price[2] += _max*quantity
-        self.price.set_text(f'Cost: {not_found}{price[1]:.2f}')
+            self.prices[r[0].get_edit_text()] = [
+                i*quantity for i in (_min, _avg, _max)
+            ]
+
+        for k in list(self.prices):
+            if k not in map(lambda x: x[0].get_edit_text(), self.ingredients):
+                del self.prices[k]
+
+        price = [
+            sum([self.prices[p][i] for p in self.prices]) for i in range(3)
+        ]
+        self.price.set_text(
+            f'Cost: {not_found}{", ".join([str(p) for p in price])}'
+        )
         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())))
@@ -354,6 +366,7 @@ class RecipeEditor(FocusWidget):
         recipe: dict,
     ):
         self.fname = Edit('', fname)
+        self.prices = dict()
         self.components = dict()
         self.buttons = {
           'clear': Button(('streak', 'Clear')),
@@ -386,13 +399,13 @@ class RecipeEditor(FocusWidget):
         self.query_manager = query_manager
         self.autocomplete_options = lambda name, data: self.query_manager.unique_suggestions(name.split('#', 1)[0], **data)
         self.autocomplete_callback = lambda widget, options: len(options) > 0 and widget._emit('open', options)
-        connect_signal(self.organic, 'postchange', lambda _,v: self.update())
+        connect_signal(self.organic, 'postchange', lambda *_: self.update())
 
         connect_signal(self.buttons['save'], 'click', lambda _: self.save())
         connect_signal(self.buttons['add'], 'click', lambda _: self.add_ingredient())
         connect_signal(self.buttons['clear'], 'click', lambda _: self.clear())
         connect_signal(self.buttons['exit'], 'click', lambda _: show_or_exit('esc'))
-        connect_signal(self.instructions, 'postchange', lambda _,v: self.update())
+        connect_signal(self.instructions, 'postchange', lambda w,_: self.update(w))
 
         header = Text(u'Recipe Editor', 'center')
         _copyright = Text(COPYRIGHT, 'center')