def on_response(self, w, resp, d=None): if not hasattr(self, 'food_srch_res_dlg'): import food_srch_res_dlg self.food_srch_res_dlg = \ food_srch_res_dlg.FoodSrchResDlg(self.app) self.food_srch_res_dlg.ui.dialog.connect('hide', self.on_hide) if resp == gtk.RESPONSE_HELP: help.open('') elif resp == gtk.RESPONSE_OK: page = self.ui.notebook.get_current_page() if page == 0: match_list = self.search_by_text() if not match_list: gnutr.Dialog('warn', 'No matching foods.') return else: match_list = self.search_by_nutrient() if not match_list: gnutr.Dialog('warn', 'No matching foods.') return self.food_srch_res_dlg.show(match_list, self.view) elif resp == gtk.RESPONSE_CANCEL or resp == gtk.RESPONSE_DELETE_EVENT: if hasattr(self, 'food_srch_res_dlg'): self.food_srch_res_dlg.ui.dialog.hide() self.ui.dialog.hide()
def startup(self): db_uname = config.get_value('Username') db_pword = config.get_value('Password') import database self.db = database.Database(db_uname, db_pword) success = self.db.change_user(db_uname, db_pword, 'gnutr_db') if success == 0: import gnutr import sys gnutr.Dialog( 'error', 'Failed to connect to the database.\n\n' + 'I suggest that you delete the file\n ' + '"~/.gnutrition/config" and run "gnutrition" again.') gtk.main_quit() sys.exit() import store self.store = store.Store() import person self.person = person.Person() self.person.setup() import base_win self.base_win = base_win.BaseWin(self) self.base_win.show()
def on_delete_released(self, w, d=None): (treemodel, iter) = self.ui.selection.get_selected() if not iter: gnutr.Dialog('warn', 'No ingredient is selected.', self.parent) else: self.ui.treemodel.remove(iter) self.num_ingr = self.num_ingr - 1
def search_by_nutrient(self): if self.ui.treemodel.iter_n_children(None) == 0: return None fg_desc = self.ui.nutr_fg_combo.get_active_text() norm_by = self.ui.norm_combo.get_active() num = self.ui.num_foods_entry.get_text() try: num_foods = int(num) except ValueError: gnutr.Dialog( 'warn', 'The number of foods to list is not\n' + 'specified or is not a number.') return None constr_list = [] iter = self.ui.treemodel.get_iter_root() ret = True while ret: nutr_desc = self.ui.treemodel.get_value(iter, 0) constr_val = self.ui.treemodel.get_value(iter, 1) constr_list.append((nutr_desc, constr_val)) ret = self.ui.treemodel.iter_next(iter) result_list = self.search_by_nutr_constr(fg_desc, norm_by, num_foods, constr_list) return result_list
def on_selection_changed( self, selection, d=None): (model, iter) = selection.get_selected() if iter: date_str = self.ui.date.entry.get_text() if not date_str: gnutr.Dialog( 'warn', 'You must select a date before\n' + 'you can select a time.', self.parent)
def update_version(version, message=None): """Present user with dialog notification of available newer version.""" import gnutr msg = 'Version {0:s} of gnutrition is available.\n'.format(version) msg += 'Please visit http://www.gnu.org/software/gnutrition to download.\n' if message: msg += '\n{0:s}'.format(message) gnutr.Dialog('notify', msg)
def get_recipe(self): r = gnutr.Recipe() (r.desc,r.num_serv,r.cat_desc,r.prep_desc) = self.grab_window() if not r.desc: gnutr.Dialog('error', 'No recipe name is defined.', self.parent) return None if not r.num_serv: gnutr.Dialog('error', """The number of servings is not defined, or is not a number.""", self.parent) return None r.cat_num = self.store.cat_desc2num[r.cat_desc] r.ingr_list = self.get_ingredient_list() return r
def ask_save(self, mesg): dlg = gnutr.Dialog('question', mesg, self.parent) reply = dlg.run() if reply == gtk.RESPONSE_YES: dlg.destroy() self.on_save_released(None) else: info('Not saving changes.') dlg.destroy()
def on_add_released( self, w, d=None): (model, iter) = self.ui.selection.get_selected() if not iter: gnutr.Dialog( 'warn', 'No time selected.', self.parent) return if not hasattr( self, 'plan_add_dlg'): import plan_add_dlg self.plan_add_dlg = plan_add_dlg.PlanAddDlg( self.app) self.plan_add_dlg.show()
def on_save_released( self, w, d=None): dlg = gnutr.Dialog( 'question', 'The old plan will be overwritten by the new one.\n' + 'Are you sure you want to do this?', self.parent) reply = dlg.run() if reply == gtk.RESPONSE_YES: self.save_plan() dlg.destroy() else: dlg.destroy()
def on_edit_released(self, w, d=None): (treemodel, iter) = self.ui.selection.get_selected() if not iter: gnutr.Dialog('warn', 'No ingredient is selected.', self.parent) else: ingr = treemodel.get_value(iter, 3) if not hasattr(self, 'food_edit_dlg'): import food_edit_dlg self.food_edit_dlg = food_edit_dlg.FoodEditDlg(self.app) self.food_edit_dlg.show(ingr, gnutr_consts.RECIPE)
def on_add_released(self, w, d=None): nutr_desc = self.ui.nutr_combo.get_active_text() constr_val = self.ui.constraint_spin.get_value() if self.in_store(nutr_desc): gnutr.Dialog('warn', 'The nutrient is already in the list.') return iter = self.ui.treemodel.append() self.ui.treemodel.set_value(iter, 0, nutr_desc) self.ui.treemodel.set_value(iter, 1, constr_val)
def on_nutr_released(self, w, d=None): if self.num_ingr == 0: gnutr.Dialog('warn', 'There are no ingredients.', self.parent) return num_serv = self.ui.num_serv_entry.get_text() try: num = int(num_serv) except ValueError: gnutr.Dialog( 'warn', """The number of servings in not specified + or is not a number.""", self.parent) return r = self.get_recipe() if not r: return if not hasattr(self, 'nutr_composition_dlg'): import nutr_composition_dlg self.nutr_composition_dlg = \ nutr_composition_dlg.NutrCompositionDlg() self.nutr_composition_dlg.show(recipe=r)
def on_compute_released(self, w, d=None): fd_desc = self.ui.food_entry.get_text() if not fd_desc: return fd_num = self.store.fd_desc2num[fd_desc] msre_desc = self.ui.msre_combo.get_active_text() try: amount = float(self.ui.amount_entry.get_text()) except ValueError: gnutr.Dialog('error', 'The amount must be a number.', self.parent) self.nutr_comp_dlg.compute_food(amount, msre_desc, fd_num)
def get_recipe(self): recipe = gnutr.Recipe() recipe.num_serv = self.ui.num_serv_entry.get_text() recipe.desc = self.ui.recipe_entry.get_text() recipe.cat_desc = self.ui.category_combo.get_active_text() start = self.ui.text_buffer.get_start_iter() end = self.ui.text_buffer.get_end_iter() recipe.prep_desc = self.ui.text_buffer.get_text(start, end, True) if not recipe.desc: gnutr.Dialog('error', 'No recipe name is defined.', self.parent) return None if not recipe.num_serv: gnutr.Dialog( 'error', """The number of servings is not defined, or is not a number.""", self.parent) return None recipe.cat_num = self.store.cat_desc2num[recipe.cat_desc] recipe.ingr_list = self.get_ingredient_list() return recipe
def on_response(self, w, r, d=None): if r == gtk.RESPONSE_HELP: help.open('') elif r == gtk.RESPONSE_OK: try: self.recipe.num_portions = \ float(self.ui.num_serv_entry.get_text()) except ValueError: gnutr.Dialog('error', 'The number of portions must be a number.') self.app.base_win.plan.replace_recipe(self.recipe) self.ui.dialog.hide() elif r == gtk.RESPONSE_CANCEL or r == gtk.RESPONSE_DELETE_EVENT: self.ui.dialog.hide()
def add_recipe( self, recipe): date = self.ui.date.entry.get_text() time = self.get_time_of_day() recipe_list = self.get_recipes_for_time( time, date) for r in recipe_list: if r.num == recipe.num: gnutr.Dialog( 'error', 'Cannot have the same recipe twice\n' + 'for the same day and time.') return person_num = self.person.get_person_num() self.db.query( "INSERT INTO recipe_plan_temp VALUES ( " + "'%d', '%s', '%s', '%f', '%d' )" %( person_num, date, time, recipe.num_portions, recipe.num)) self.update()
def on_clear_released(self, w, d=None): if self.num_ingr != 0: dlg = gnutr.Dialog( 'question', """You are about to clear the recipe. Do you wish to save it first?""", self.parent) reply = dlg.run() if reply == gtk.RESPONSE_OK: dlg.destroy() self.on_save_released(None) else: dlg.destroy() self.ui.recipe_entry.set_text('') self.ui.num_serv_entry.set_text('') self.ui.treemodel.clear() self.num_ingr = 0 self.ui.text_buffer.set_text('')
def add_food( self, food): date = self.ui.date.entry.get_text() time = self.get_time_of_day() food_list = self.get_foods_for_time( time, date) for f in food_list: if f.food_num == food.food_num: gnutr.Dialog( 'error', 'Cannot have the same food twice\n' + 'for the same day and time.', self.parent) return person_num = self.person.get_person_num() # Note: the temporary table is used self.db.query( "INSERT INTO food_plan_temp VALUES ( " + "'%d', '%s', '%s', '%f', '%d', '%d' )" %( person_num, date, time, food.amount, food.msre_num, food.food_num)) self.update()
def on_save_released(self, w, d=None): recipe = self.get_recipe() if not recipe: return recipe.num = self.check_recipe_exists(recipe.desc) if recipe.num: dlg = gnutr.Dialog( 'question', """A recipe with the same name exists in the database. Do you want to overwrite it?""", self.parent) reply = dlg.run() if reply == gtk.RESPONSE_YES: dlg.destroy() self.delete_recipe(recipe.desc) else: dlg.destroy() self.save_recipe(recipe)
def on_response( self, w, r, d=None): if r == gtk.RESPONSE_HELP: help.open( '') elif r == gtk.RESPONSE_OK: (model, iter) = self.ui.selection.get_selected() if not iter: return food_num = model.get_value( iter, 1) if not food_num in self.store.fd_num2desc: return ingr = gnutr.Ingredient() ingr.food_num = food_num ingr.food_desc = self.store.fd_num2desc[ ingr.food_num] if self.view_type != gnutr_consts.FOOD: try: ingr.amount = float( self.ui.amount_entry.get_text()) except ValueError: gnutr.Dialog( 'error', 'The amount must be a number.') if (self.view_type == gnutr_consts.PLAN or self.view_type == gnutr_consts.RECIPE): ingr.msre_desc = self.ui.combo.get_active_text() ingr.msre_num = self.store.msre_desc2num[ ingr.msre_desc] if self.view_type == gnutr_consts.PLAN: self.ui.dialog.hide() self.app.base_win.plan.add_food( ingr) self.ui.tree.clear() elif self.view_type == gnutr_consts.RECIPE: self.app.base_win.recipe.add_ingredient( ingr) else: self.app.base_win.food.update( ingr) if self.view_type != gnutr_consts.PLAN: self.ui.dialog.hide() self.ui.tree.clear() elif r == gtk.RESPONSE_CANCEL or r == gtk.RESPONSE_DELETE_EVENT: self.ui.dialog.hide() self.ui.tree.clear()
def on_response( self, w, r, d=None): if r == gtk.RESPONSE_CANCEL or r == gtk.RESPONSE_DELETE_EVENT: self.ui.dialog.hide() elif r == 1: #save goal_list = [] for nutr in self.ui.nutr_list: try: val = float( nutr.entry.get_text()) except: gnutr.Dialog( 'error', 'Save Failed: A nutrient goal entry\nis not a number.') return goal_list.append( ( nutr.num, val)) self.save_goal( goal_list) elif r == gtk.RESPONSE_HELP: help.open( '')
def on_response(self, w, response_id, d=None): if response_id == gtk.RESPONSE_HELP: help.open('') if response_id == gtk.RESPONSE_OK: try: self.ingr.amount = float(self.ui.amount_entry.get_text()) except ValueError: gnutr.Dialog('error', 'The amount must be a number.') self.ingr.msre_desc = self.ui.combo.get_active_text() if self.view == gnutr_consts.RECIPE: self.app.base_win.recipe.replace_ingredient(self.ingr) else: self.app.base_win.plan.replace_food(self.ingr) self.ui.dialog.hide() if response_id == gtk.RESPONSE_CANCEL: self.ui.dialog.hide_all()
def on_response(self, w, r, d=None): if r == gtk.RESPONSE_HELP: help.open('') elif r == gtk.RESPONSE_OK: result_list = self.get_search_match() if not result_list: gnutr.Dialog('warn', 'No recipe found.') return if not hasattr(self, 'recipe_srch_res_dlg'): import recipe_srch_res_dlg self.recipe_srch_res_dlg = \ recipe_srch_res_dlg.RecipeSrchResDlg(self.app) self.recipe_srch_res_dlg.ui.dialog.connect( 'hide', self.on_hide) self.recipe_srch_res_dlg.show(result_list, gnutr_consts.RECIPE) elif r == gtk.RESPONSE_CANCEL or r == gtk.RESPONSE_DELETE_EVENT: self.ui.dialog.hide()
def on_edit_released( self, w, d=None): (model, iter) = self.ui.selection.get_selected() if not iter: gnutr.Dialog( 'warn', 'You must select a recipe or food to edit.', self.parent) return data = model.get_value( iter, 4) if isinstance( data, gnutr.Ingredient): if not hasattr( self, 'food_edit_dlg'): import food_edit_dlg self.food_edit_dlg = food_edit_dlg.FoodEditDlg( self.app) self.food_edit_dlg.show( data, gnutr_consts.PLAN) elif isinstance( data, gnutr.Recipe): if not hasattr( self, 'recipe_edit_dlg'): import recipe_edit_dlg self.recipe_edit_dlg = recipe_edit_dlg.RecipeEditDlg( self.app) self.recipe_edit_dlg.show( data)
def add_food(self, food): date = self.ui.date.entry.get_text() time = self.get_time_of_day() food_list = self.get_foods_for_time(time, date) for f in food_list: if f.food_num == food.food_num: gnutr.Dialog( 'error', 'Cannot have the same food twice\n' + 'for the same day and time.', self.parent) return person_num = self.person.get_person_num() # Note: the temporary table is used #FIXME: One of fields is formated as it were number, but it's string. Causes ValueError self.db.query("INSERT INTO food_plan_temp VALUES (" + "{0:d}, '{1:s}', '{2:s}', {3:f}, '{4:s}', {5:d})".format( person_num, date, time, food.amount, food.msre_desc, food.food_num), caller='PlanWin.add_food') self.update()
def on_response(self, w, r, d=None): if r == gtk.RESPONSE_HELP: help.open('') elif r == 1: start_date = self.ui.start_date.entry.get_text() end_date = self.ui.end_date.entry.get_text() if self.start_later_than_end(start_date, end_date): gnutr.Dialog( 'error', 'The start date is later\n' + 'than the end date.') return avg = self.ui.avg_rad_button.get_active() result = self.compute(start_date, end_date, avg) if not hasattr(self, 'nutr_composition_dlg'): import nutr_composition_dlg self.nutr_composition_dlg = \ nutr_composition_dlg.NutrCompositionDlg() self.nutr_composition_dlg.show(nutr_list=result) elif r == gtk.RESPONSE_CANCEL or r == gtk.RESPONSE_DELETE_EVENT: self.ui.dialog.hide()
def on_delete_released( self, w, d=None): (model, iter) = self.ui.selection.get_selected() if not iter: gnutr.Dialog( 'warn', 'You must select a recipe or food to delete.', self.parent) return date = self.ui.date.entry.get_text() data = model.get_value( iter, 4) if data: if isinstance( data, gnutr.Ingredient): self.delete_from_plan_temp_db( date, food=data) elif isinstance( data, gnutr.Recipe): self.delete_from_plan_temp_db( date, recipe=data) else: return model.set_value( iter, 1, '') model.set_value( iter, 2, '') model.set_value( iter, 3, '') model.set_value( iter, 4, gobject.GObject()) else: return
def on_delete_released(self, w, d=None): modell, iter = self.ui.selection.get_selected() if not iter: gnutr.Dialog('warn', 'No nutrient is selected.') else: self.ui.treemodel.remove(iter)
def on_response(self, w, r, d=None): if r == gtk.RESPONSE_HELP: help.open('') elif r == gtk.RESPONSE_OK: recipe = gnutr.Recipe() model, iter = self.ui.selection.get_selected() if not iter: gnutr.Dialog('warn', 'A recipe must be selected from the list.') return recipe.desc = model.get_value(iter, 0) recipe.num = model.get_value(iter, 1) if not recipe.desc or not recipe.num: return # FIXME: this should be recipe_win.py and # plan_win.py if self.view == gnutr_consts.RECIPE: self.db.query( "SELECT no_serv, category_no FROM " + "recipe WHERE recipe_no = {0:d}".format(recipe.num)) recipe.num_serv, recipe.cat_num = self.db.get_row_result() recipe.cat_desc = self.store.cat_num2desc[recipe.cat_num] self.db.query("SELECT prep_desc FROM preparation WHERE " + "recipe_no = {0:d}".format(recipe.num)) recipe.prep_desc = self.db.get_single_result() self.db.query( "SELECT amount, Msre_Desc, NDB_No FROM " + "ingredient WHERE recipe_no = {0:d}".format(recipe.num)) ingr_list = self.db.get_result() recipe.ingr_list = [] for amount, msre_desc, food_num in ingr_list: ingr = gnutr.Ingredient() ingr.amount = amount ingr.food_num = food_num ingr.food_desc = self.store.fd_num2desc[food_num] ingr.msre_desc = msre_desc recipe.ingr_list.append(ingr) self.app.base_win.recipe.update(recipe) self.ui.dialog.hide() elif self.view == gnutr_consts.PLAN: try: recipe.num_portions = \ float(self.ui.num_serv_entry.get_text()) except ValueError: gnutr.Dialog('error', 'The number of portions must be specified.') return self.ui.dialog.hide() self.app.base_win.plan.add_recipe(recipe) elif r == 1: desc = self.ui.recipe_entry.get_text() if not desc or len(desc) == 0: return dlg = gnutr.Dialog( 'question', 'You are about to delete a recipe from the database.\n' + 'Are you sure you want to do this?') reply = dlg.run() if reply == gtk.RESPONSE_YES: self.app.base_win.recipe.delete_recipe(desc) model, iter = self.ui.selection.get_selected() if not iter: return model.remove(iter) self.ui.recipe_entry.set_text('') dlg.destroy() else: dlg.destroy() elif r == gtk.RESPONSE_CANCEL: self.ui.treemodel.clear() self.ui.dialog.hide()