|
@@ -191,43 +191,58 @@ class RecipeEditor(FocusWidget):
|
|
self._components = _data
|
|
self._components = _data
|
|
|
|
|
|
def clear(self):
|
|
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.organic.set_state('mixed')
|
|
self.instructions.set_edit_text('')
|
|
self.instructions.set_edit_text('')
|
|
self.fname.set_edit_text('')
|
|
self.fname.set_edit_text('')
|
|
|
|
+ self.notice.set_text('')
|
|
|
|
+ self.feeds.edit_text = ''
|
|
return self.update()
|
|
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):
|
|
def add_ingredient(self):
|
|
self.ingredients.append(
|
|
self.ingredients.append(
|
|
blank_ingredients_row(len(self.ingredients))
|
|
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):
|
|
for idx, widget in enumerate(self.ingredients):
|
|
connect_signal(widget[0], 'postchange', lambda _,v: self.update())
|
|
connect_signal(widget[0], 'postchange', lambda _,v: self.update())
|
|
connect_signal(widget[0], 'apply', lambda w, name: self.autocomplete_callback(
|
|
connect_signal(widget[0], 'apply', lambda w, name: self.autocomplete_callback(
|
|
@@ -255,7 +270,12 @@ class RecipeEditor(FocusWidget):
|
|
x[2].get_edit_text(),
|
|
x[2].get_edit_text(),
|
|
) for x in self.ingredients
|
|
) 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(
|
|
yml['instructions'] = literal_str('\n'.join(map(
|
|
lambda x: x.strip(),
|
|
lambda x: x.strip(),
|
|
self.instructions.get_text()[0].splitlines()
|
|
self.instructions.get_text()[0].splitlines()
|
|
@@ -308,6 +328,10 @@ class RecipeEditor(FocusWidget):
|
|
notice = ''
|
|
notice = ''
|
|
ingredients = list(filter(lambda x: x, map(lambda x: x[0].get_edit_text(), self.ingredients)))
|
|
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())))
|
|
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:
|
|
if not parsed_products:
|
|
self.notice.set_text('Failed to parse recipe instructions')
|
|
self.notice.set_text('Failed to parse recipe instructions')
|
|
return self
|
|
return self
|
|
@@ -317,7 +341,7 @@ class RecipeEditor(FocusWidget):
|
|
for ingredient in set(ingredients) - products:
|
|
for ingredient in set(ingredients) - products:
|
|
notice += f"Ingredient '{ingredient}' is not used\n";
|
|
notice += f"Ingredient '{ingredient}' is not used\n";
|
|
if len(set(ingredients)) != len(ingredients):
|
|
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')
|
|
self.notice.set_text(notice or 'None')
|
|
|
|
|
|
@@ -347,9 +371,9 @@ class RecipeEditor(FocusWidget):
|
|
|
|
|
|
self.organic = NoTabCheckBox(('bg', "Organic"), state='mixed')
|
|
self.organic = NoTabCheckBox(('bg', "Organic"), state='mixed')
|
|
self.instructions = Edit('', edit_text=recipe['instructions'] or u'', multiline=True, allow_tab=True)
|
|
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.price = Text(f"Cost: 0")
|
|
- self.notice = Text(f"")
|
|
|
|
|
|
+ self.notice = Text('')
|
|
|
|
|
|
bottom_pane = [
|
|
bottom_pane = [
|
|
self.organic,
|
|
self.organic,
|
|
@@ -379,37 +403,7 @@ class RecipeEditor(FocusWidget):
|
|
])
|
|
])
|
|
banner = AttrMap(banner, 'banner')
|
|
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 = {
|
|
self.components = {
|
|
@@ -457,6 +451,7 @@ class RecipeEditor(FocusWidget):
|
|
lambda x: next(w for n,w in chain(
|
|
lambda x: next(w for n,w in chain(
|
|
self.buttons.items(),
|
|
self.buttons.items(),
|
|
[
|
|
[
|
|
|
|
+ ('fname', self.fname),
|
|
('ingredients', self.ingredients[-1][0]),
|
|
('ingredients', self.ingredients[-1][0]),
|
|
('instructions', self.instructions),
|
|
('instructions', self.instructions),
|
|
('quantity', self.ingredients[-1][1]),
|
|
('quantity', self.ingredients[-1][1]),
|
|
@@ -468,7 +463,7 @@ class RecipeEditor(FocusWidget):
|
|
'instructions',
|
|
'instructions',
|
|
'ingredients', 'quantity', 'units', 'add',
|
|
'ingredients', 'quantity', 'units', 'add',
|
|
'organic',
|
|
'organic',
|
|
- 'clear', 'exit',
|
|
|
|
|
|
+ 'clear', 'fname', 'save', 'exit',
|
|
]
|
|
]
|
|
))
|
|
))
|
|
self.update()
|
|
self.update()
|