def build(cls): #if exists(cls.pickle_fn()): # result = pickle.load(open(cls.pickle_fn(), "rb" ) ) tv = TreeView(hide_root=True) tv.size_hint = 1, None tv.bind(minimum_height=tv.setter('height')) data = Data() groups = data.get_groups() ingredients = data.get_ingredients() def already_created(node, text): if hasattr(node, 'text'): return node.text == text else: return False for group in groups: if len( list( filter( lambda seq: already_created(seq, group['group']), tv.iterate_all_nodes()))) == 0: node_group = tv.add_node(TreeViewLabel(text=group['group'])) node_group = list( filter(lambda seq: already_created(seq, group['group']), tv.iterate_all_nodes())) if len(node_group) > 0: if len( list( filter( lambda seq: already_created( seq, group['subgroup']), tv.iterate_all_nodes()))) == 0: node_subgroup = tv.add_node( TreeViewLabel(text=group['subgroup']), node_group[0]) for ingredient in ingredients: node_subgroup = list( filter( lambda seq: already_created(seq, ingredient['food_subgroup' ]), tv.iterate_all_nodes())) if len(node_subgroup) > 0: tv.add_node( IngredientListPopupItem( prop_id=ingredient['id'], name=ingredient['name'], name_scientific=ingredient['name_scientific'], description=ingredient['description']), node_subgroup[0]) else: print('error adding {0}', ingredient['name']) cls.tv = tv
class agacGorunumu(App): def build(self): duzen=BoxLayout(orientation='vertical') self.agac_koku = TreeView(hide_root=True, size_hint_y=0.8) kuruyemisler=[('Sert Kabuklular',('Ceviz', 'Fındık', 'Badem')), ('Meyve Kuruları',('Dut', 'Vişne', 'Kayısı', 'İncir'))] for ky in kuruyemisler: eb=self.agac_koku.add_node(TreeViewLabel(text=ky[0])) for k in ky[1]: self.agac_koku.add_node(TreeViewLabel(text=k),eb) duzen.add_widget(self.agac_koku) dgm=Button(text='Elemanları Yaz', size_hint_y=0.2) dgm.bind(on_press=self.elemanlari_yaz) duzen.add_widget(dgm) return duzen def elemanlari_yaz(self, *args): for eb in self.agac_koku.iterate_all_nodes(): print eb.level, eb.text if self.agac_koku.selected_node: print "Seçili Eleman", self.agac_koku.selected_node.text print self.agac_koku.get_node_at_pos((1,1))
class RowSelectorWidget(BoxLayout): def __init__(self, **kwargs): super(RowSelectorWidget, self).__init__(**kwargs) self.tree_view = TreeView(hide_root=True, indent_level=4) self.add_widget(self.tree_view) self.row_values = {} self.callback = self.null_callback def null_callback(self): pass def set_callback(self, callback_func): self.callback = callback_func def on_touch_down(self, touch): super(RowSelectorWidget, self).on_touch_down(touch) self.callback() def setDemoRows(self, numRows): self.clearRows() for i in range(numRows): self.addRow('Row ' + str(i)) def addRow(self, row_val): node = TreeViewLabel(text=str(row_val)) self.tree_view.add_node(node) self.row_values[node] = row_val def clearRows(self): self.row_values = {} self.remove_widget(self.tree_view) self.tree_view = TreeView(hide_root=True, indent_level=4) self.add_widget(self.tree_view) def setRows(self, row_list): self.clearRows() for r in row_list: self.addRow(r) def get_selected_row(self): sel_node = self.tree_view.selected_node if sel_node and sel_node in self.row_values.keys(): return self.row_values[sel_node] else: return None def remove_selected_row(self): sel_node = self.tree_view.selected_node if sel_node is not None: self.row_values[sel_node] = None del self.row_values[sel_node] self.tree_view.remove_node(sel_node) def get_height(self, expected_node_height=1.0): HEIGHT_FACTOR = 1.1575 height = 0 for node in self.tree_view.iterate_all_nodes(): height += dp(node.height * expected_node_height * HEIGHT_FACTOR) return height def get_num_Rows(self): return len(self.row_values)
class KivyPanelABM(GridLayout): def __init__(self, lista, nombreABM, **kwargs): # make sure we aren't overriding any important functionality super(KivyPanelABM, self).__init__(**kwargs) self.cols = 2 self.nombreABM = nombreABM self.lista = TreeView(hide_root=True, size_hint_x=0.9) self.add_widget(self.lista) self.panelbotoneraAcciones = GridLayout(cols=1, size_hint_x=0.1, size_hint_y=None, size=(0, 32)) # self.panelbotoneraAcciones.padding=[100,10,10,10] self.btnAdd = Button(background_normal="Add.png", size_hint=(None, None), size=(32, 32)) self.btnAdd.bind(on_press=self.btnEventAdd) self.btnEdit = Button(background_normal="Edit.png", size_hint=(None, None), size=(32, 32)) self.btnEdit.bind(on_press=self.btnEventEdit) self.btnDel = Button(background_normal="Delete.png", size_hint=(None, None), size=(32, 32)) self.btnDel.bind(on_press=self.btnEventDel) self.panelbotoneraAcciones.add_widget(self.btnAdd) self.panelbotoneraAcciones.add_widget(self.btnEdit) self.panelbotoneraAcciones.add_widget(self.btnDel) self.add_widget(self.panelbotoneraAcciones) for elemento in lista: self.lista.add_node(TreeViewLabel(text=elemento)) def getLista(self): list = [] print("arbol: " + str(self.lista)) for nodo in self.lista.iterate_all_nodes(node=None): list.append(nodo.text) return list[1:] def btnEventAdd(self, value): panel = GridLayout(cols=1) self.text = TextInput() panel.add_widget(self.text) # botonGuardar = Button(text="guardar")uardar) panel.add_widget(Button(text="guardar", on_press=self.guardar)) self.popup = Popup(title='Agregar ' + self.nombreABM, content=panel, size_hint=(1, 0.6)) self.popup.open() def guardar(self, value): self.lista.add_node(TreeViewLabel(text=self.text.text)) self.popup.dismiss() def __deleteItem__(self): if self.lista.selected_node: self.lista.remove_node(self.lista.selected_node) def btnEventDel(self, value): self.__deleteItem__() def btnEventEdit(self, value): panel = GridLayout(cols=1) self.text = TextInput(text=self.lista.get_selected_node().text) panel.add_widget(self.text) panel.add_widget(Button(text="guardar", on_press=self.modificar)) self.popup = Popup(title='Editar ' + self.nombreABM, content=panel, size_hint=(1, 0.6)) self.popup.open() def modificar(self, value): self.lista.get_selected_node().text = self.text.text # self.lista.add_node(TreeViewLabel(text=self.text.text)) self.popup.dismiss()
class JournalOverviewScreen(Screen): def __init__(self, **kwargs): super(JournalOverviewScreen, self).__init__(**kwargs) v_layout = BoxLayout(orientation='vertical', spacing=30) self.tree_view = TreeView(root_options=dict(text='Tree One'), hide_root=True, indent_level=4) self.tree_view.size_hint = (1, None) self.tree_view.bind(minimum_height=self.tree_view.setter('height')) scroll = ScrollView(pos=(0, 0)) scroll.add_widget(self.tree_view) v_layout.add_widget(scroll) change_journal_layout = BoxLayout(orientation='horizontal', spacing=5, size_hint_y=0.1) change_journal_layout.add_widget(Label(text='Journal file:')) self.journal_file_input = TextInput( text=App.get_running_app().journal_file) change_journal_layout.add_widget(self.journal_file_input) change_journal_layout.add_widget( Button(text='Set another', on_press=self.set_another_journal)) v_layout.add_widget(change_journal_layout) back_to_progress_button = Button(text='Back', size_hint_y=0.2) back_to_progress_button.on_press = self.goto_progress v_layout.add_widget(back_to_progress_button) self.add_widget(v_layout) def on_pre_enter(self): self.populate_tree_view() def on_leave(self): for node in self.tree_view.iterate_all_nodes(): self.tree_view.remove_node(node) def populate_tree_view(self): journal = App.get_running_app().journal journal_node = self.tree_view.add_node( TreeViewLabel(text='Journal', is_open=True)) for training in journal.trainings: training_node = self.tree_view.add_node( TreeViewLabel(text=training.description['date'] + ': Training'), journal_node) label_str = 'Start time: ' + \ str( training.description['start_time'] ) #training.description['start_time'].strftime('%H:%M:%S') self.tree_view.add_node(TreeViewLabel(text=label_str), training_node) label_str = 'End time: ' + \ str( training.description['end_time'] ) self.tree_view.add_node(TreeViewLabel(text=label_str), training_node) label_str = 'Duration: ' + \ str( training.description['duration'] ) self.tree_view.add_node(TreeViewLabel(text=label_str), training_node) label_str = 'Training program: ' + \ str( training.description['training_program'] ) self.tree_view.add_node(TreeViewLabel(text=label_str), training_node) label_str = 'Training index in program: ' + \ str( training.description['training_index_in_program'] ) self.tree_view.add_node(TreeViewLabel(text=label_str), training_node) for exercise in training.exercises: title_node_text = 'Exercise: ' + exercise.description['name'] if 'Metric' in exercise.description.get('type'): title_node_text = 'Metric: ' + exercise.description['name'] exc_node = self.tree_view.add_node( TreeViewLabel(text=title_node_text), training_node) for essential_field in exercise.essential_fields: label_str = essential_field + \ ': ' + str( exercise.description[essential_field] ) self.tree_view.add_node(TreeViewLabel(text=label_str), exc_node) if exercise.description['comment']: label_str = 'Comment: ' + \ str( exercise.description['comment'] ) self.tree_view.add_node(TreeViewLabel(text=label_str), exc_node) if training.description['comment']: label_str = 'Comment: ' + \ str( training.description['comment'] ) self.tree_view.add_node(TreeViewLabel(text=label_str), training_node) def goto_progress(self): self.parent.current = 'view_progress' def set_another_journal(self, *rest): app = App.get_running_app() journal_file = self.journal_file_input.text filename, file_extension = os.path.splitext(journal_file) if file_extension != '.json': self.show_not_json_popup() return if journal_file != app.journal_file: app.journal_file = journal_file if os.path.isfile(app.journal_file): app.journal = Journal.load_journal(app.journal_file) else: app.journal = Journal() app.write_config() for node in self.tree_view.iterate_all_nodes(): self.tree_view.remove_node(node) self.populate_tree_view() def show_not_json_popup(self): popup_content = BoxLayout(orientation='vertical') popup_content.add_widget( Label(text='The journal file is expected ' + 'to have a ".json" extension.\n' + 'Please, specify ' + 'another file.', haling='center')) close_btn = Button(text='Ok', size_hint_y=0.2) popup_content.add_widget(close_btn) popup = Popup(title='Error: journal file is not JSON', content=popup_content, size_hint=(None, None), size=(400, 400)) close_btn.bind(on_press=popup.dismiss) popup.open()