def select_menu_modal(self): search = searchBar.searchBar(key='-MODAL-SEARCH-', api=self.model.get('MenuAPI'), length=20, searchbutton=False) layout = [ [search], [sg.Button('Open', key="-MODAL-OPEN-"), sg.Button('Add New', key="-MODAL-NEW-"), sg.Button('Cancel', key="-MODAL-CANCEL-")] ] window = sg.Window('Select Menu', layout, finalize=True, modal=True) new = False while True: event, values = window.read() if search.handle(event, values): continue if event in (sg.WIN_CLOSED, "-MODAL-CANCEL-"): break elif event == "-MODAL-NEW-": new = True break elif event == "-MODAL-OPEN-": menu = values[search.sbox_key] menu = self.model.get('MenuAPI').lookup(menu) self.model.set('activeMenu', value=menu) self.model.set('activeMenuDay', value=menu.getDay(0)) break window.close() if new: self.new_menu_modal()
def createRecipeTable(self): rowCount, colCount = self.recTableDim # Acquire data # note, the ingredients and directions are left off due to the number of columns # header = recipe.pretty_fields[:colCount] recs = self.model.get('RecipeAPI').recipes(first=0, count=rowCount) data = [] for rec in recs: recInfo = rec.guts() temp = [] for col in self.features: temp.append(recInfo[col]) data.append(temp) # allData = [self.header, *data] self.tableData = recs # self.master.tableData = recs self.recTable = sg.Table( data, headings=self.header, num_rows=rowCount, enable_events=True, col_widths=[24, 4, 4, 20, 9, 6], auto_size_columns=False, key=self.tableKey, tooltip= "This is a table of your recipes, search options are above, and clicking on a recipe will open it in the editor" ) # col = sg.Column(layout = tab, scrollable=True) # self.master.expands['xy'].append(self.recTable) self.search = searchBar.searchBar(key='RECIPE', api=self.model.get('RecipeAPI')) # tooltip="Enter the recipe title you are looking for") layout = [[ sg.T('Sort By'), sg.Combo(default_value='None', values=['None', 'Title', 'Category', 'Rating'], key='-TABLE-SORT-', tooltip="Choose which field to sort the next search by", disabled=True), sg.Button('Add New Recipe', key='-ADDNEW-', tooltip="Click here for a blank new recipe") ], [ self.search, ], [self.recTable]] # return sg.Column(layout=layout,expand_x=True,expand_y=True,justification='center') return layout
def add_recipe(self): search = searchBar.searchBar(key='-MODAL-SEARCH-', api=self.model.get('RecipeAPI'), length=40, searchbutton=False, getID=True) layout = [ [search], [sg.T('Add To: '), sg.T(self.model.get('activeMenuDay').date), sg.T('Menu: '), sg.T(self.model.get('activeMenu').getName())], [sg.T('Recipe Mulitiplier: '), sg.Combo(values=[f'{i}' for i in np.arange(.5,5,.5)], key='-MODAL-MULTBY-', default_value='1')], [sg.T('Under Section: '), sg.Combo(values=list(self.model.get('activeMenuDay').data.keys()), key='-MODAL-GROUP-', default_value='other')], [sg.Button('Add', key="-MODAL-ADD-"), sg.Button('Cancel', key="-MODAL-CANCEL-")] ] window = sg.Window('Select Menu', layout, finalize=True, modal=True) # load active recipe into search bar while True: event, values = window.read() if search.handle(event, values): continue if event in (sg.WIN_CLOSED, "-MODAL-CANCEL-"): break elif event == "-MODAL-ADD-": rec = self.model.get('RecipeAPI').lookup(recID=values[search.sbox_key]) date = self.model.get('activeMenuDay').date group = values['-MODAL-GROUP-'] mult = values['-MODAL-MULTBY-'] try: self.model.get('activeMenu').addRecipe(rec=rec*mult, date=date, group=group) except: logger.debug('Error occured during addRecipe function') sg.PopupError('An error has occured. Recipe not added.') break self.model.notifyOberservers('activeMenuDay') break window.close()
def recipeTable(self): """This is the table view, it displays the database, and allows searching the database""" rowCount, colCount = self.recTableDim # Acquire data # note, the ingredients and directions are left off due to the number of columns header = recipe.pretty_fields[:colCount] recs = self.db.recipes(first=0, count=rowCount) data = [] for rec in recs: recInfo = rec.guts() temp = [] for col in header: temp.append(recInfo[col]) data.append(temp) allData = [header, *data] # print(data) # Combine into one dataframe # pad allData with blank rows if there's not enough data # Content Window holds all the table elements tableFrame = tk.Frame(master=self) resizeSetup(tableFrame, rows=2, cols=1) search = searchBar(master=tableFrame, func=lambda query: self.searchdb(query)) search.grid(row=0, column=0, sticky=N + E + S + W) tableCallback = lambda fullData, **kwargs: self.fillFields(fullData) self.recTable = table(master=tableFrame, rows=rowCount + 1, cols=colCount, data=allData, innerWidget=tk.Button, header=True, style='alternating', buttonCallback=tableCallback, fullData=[header, *recs]) self.recTable.grid(row=1, column=0, sticky=N + E + S + W) return tableFrame
def layout_init(self): simpleFields = [field for field in recipe.pretty_fields] simpleFields.remove('Ingredients') simpleFields.remove('Directions') simpleInputs = [ self.labeledEntry('Title'), [ *self.labeledEntry('Prep Time', size=(5, 1)), *self.labeledEntry('Cook Time', size=(5, 1)), *self.labeledEntry('Yield', size=(10, 1)), *self.labeledEntry('Rating', size=(5, 1)) ], [ *self.labeledEntry('Category', size=(40, 1)), ], [ *self.labeledEntry('Source'), sg.Button('AutoFill', key="-AUTOFILL-", disabled=True) ] ] # self.master.recFields = {field: simpleInputs[field][1] for field in simpleFields} # data = [['BLANK']*3 for i in range(3)] data = [] self.ingTable = sg.Table(data, num_rows=5, headings=['Food', 'Company', 'Ingredients'], col_widths=[8, 20, 20], auto_size_columns=False, key=self.ingTableKey, enable_events=True) # self.master.expands['x'].append(self.ingTable) dir = sg.Multiline(key='-Directions-BOX-', size=(60, 10)) # self.master.expands['xy'].append(dir) # self.master.recFields['Directions'] = dir # ing = sg.Multiline(key='-Ingredients-BOX-', size=(60,10)) self.ing = sg.Table([], headings=['Name', 'ID', 'Amount', 'Units'], col_widths=[24, 8, 6, 10], num_rows=10, auto_size_columns=False, key=self.recIngKey, enable_events=True) # self.master.expands['xy'].append(ing) # self.master.recFields['Ingredients'] = ing # addbox = [sg.T('Amount'), sg.In(key='-AMOUNT-')] # self.master.expands['x'].append(addbox) self.search = searchBar.searchBar(key='INGREDIENT', api=self.model.get('RecipeAPI'), interactive=False) layout = [ [ sg.Button('New', key='-NEW-RECIPE-'), sg.Button('Delete Recipe', key='-DELETE-RECIPE-', disabled=True), sg.Button('View Recipe', key='-VIEW-RECIPE-', disabled=True), sg.Button('Save', key='-SAVE-RECIPE-', disabled=True) ], *simpleInputs, [sg.T('Directions')], [dir], [sg.T('Ingredients')], [self.search], [self.ingTable], # [*addbox, sg.Button('Add',key='-ADD-INGREDIENT-')], [self.ing] ] # col = sg.Column(layout=layout,expand_x=True,expand_y=True,justification='center') # self.master.expands['xy'].append(col) return layout
def ingFrame(self, master, rowCount=3, colCount=3): """This is a helper function for recView, it creates the ingredient adder section""" # content frame holder = tk.Frame(master=master) resizeSetup(holder, rows=3, cols=1) # search area # search = tk.Frame(master=holder) search = searchBar(master=holder) search.grid(row=0, column=0, sticky=N + E + W) # option selector options = tk.Frame(master=holder) resizeSetup(options, rows=6, cols=colCount + 2) options.grid(row=1, column=0, sticky=N + E + S + W) # Buttons (Right of option table) # Up/Down buttons to scroll through options up = tk.Button(master=options, text='More') up.grid(row=1, column=colCount + 1, sticky=N + E + S + W) down = tk.Button(master=options, text='Back') down.grid(row=2, column=colCount + 1, sticky=N + E + S + W) # amount field amount = tk.Entry(master=options) amount.grid(row=4, column=colCount + 1, sticky=N + E + S + W) # add button add = tk.Button(master=options, text='Add') add.grid(row=5, column=colCount + 1, sticky=N + E + S + W) blanks = [['[BLANK]'] * colCount for i in range(rowCount)] self.optionsTable = table(master=options, rows=rowCount, cols=colCount, data=blanks, innerWidget=tk.Button, buttonCallback=lambda row, col, **kw: self. activateRow(self.optionsTable, row, col)) self.optionsTable.grid(row=0, column=0, rowspan=6, columnspan=colCount, sticky=N + E + S + W) search.addFunc(func=lambda query, **kw: self.getIngResults( self.optionsTable, query, **kw)) up['command'] = lambda: search.search(newQuery=False, up=True) down['command'] = lambda: search.search(newQuery=False, up=False) # current ingredients current = tk.Frame(master=holder) resizeSetup(current, rows=1, cols=1) current.grid(row=2, column=0, sticky=N + E + S + W) currentText = tk.Text(master=current, height=10, width=60) currentText.grid(row=0, column=0, sticky=N + E + S + W) self.recFields['Ingredients'] = currentText add["command"] = lambda: self.addIng(amount, currentText) return holder