def __init__(self, **kwargs): super(GestureHistoryManager, self).__init__(**kwargs) self.gesturesettingsform = GestureSettingsForm() rr = self.gesturesettingsform.rrdetails rr.bind(on_reanalyze_selected=self.reanalyze_selected) self.infopopup = InformationPopup() self.recognizer = App.get_running_app().recognizer
class GestureDatabase(GridLayout): selected_count = NumericProperty(0) recognizer = ObjectProperty(None) export_popup = ObjectProperty(GestureExportPopup()) import_popup = ObjectProperty(GestureImportPopup()) info_popup = ObjectProperty(InformationPopup()) def __init__(self, **kwargs): super(GestureDatabase, self).__init__(**kwargs) self.redraw_all = Clock.create_trigger(self._redraw_gesture_list, 0) self.export_popup.ids.save_btn.bind(on_press=self.perform_export) self.import_popup.ids.filechooser.bind(on_submit=self.perform_import) def import_gdb(self): self.gdict = {} for gesture in self.recognizer.db: if gesture.name not in self.gdict: self.gdict[gesture.name] = [] self.gdict[gesture.name].append(gesture) self.selected_count = 0 self.ids.gesture_list.clear_widgets() for k in sorted(self.gdict, key=string_lower): gitem = GestureDatabaseItem(name=k, gesture_list=self.gdict[k]) gitem.bind(on_select=self.select_item) gitem.bind(on_deselect=self.deselect_item) self.ids.gesture_list.add_widget(gitem) def select_item(self, *l): self.selected_count += 1 def deselect_item(self, *l): self.selected_count -= 1 def mass_select(self, *l): if self.selected_count: for i in self.ids.gesture_list.children: if i.ids.select.state == 'down': i.ids.select.state = 'normal' i.draw_item() else: for i in self.ids.gesture_list.children: if i.ids.select.state == 'normal': i.ids.select.state = 'down' i.draw_item() def unload_gestures(self, *l): if not self.selected_count: self.recognizer.db = [] self.ids.gesture_list.clear_widgets() self.selected_count = 0 return for i in self.ids.gesture_list.children[:]: if i.ids.select.state == 'down': self.selected_count -= 1 for g in i.gesture_list: # if g in self.recognizer.db: # not needed, for testing self.recognizer.db.remove(g) self.ids.gesture_list.remove_widget(i) def perform_export(self, *l): path = self.export_popup.ids.filename.text if not path: self.export_popup.dismiss() self.info_popup.text = 'Missing filename' self.info_popup.open() return elif not string_lower(path).endswith('.kg'): path += '.kg' self.save_selection_to_file(path) self.export_popup.dismiss() self.info_popup.text = 'Gestures exported!' self.info_popup.open() def perform_import(self, filechooser, *l): count = len(self.recognizer.db) for f in filechooser.selection: self.recognizer.import_gesture(filename=f) self.import_gdb() self.info_popup.text = ("Imported %d gestures.\n" % (len(self.recognizer.db) - count)) self.import_popup.dismiss() self.info_popup.open() def save_selection_to_file(self, filename, *l): if not self.selected_count: self.recognizer.export_gesture(filename=filename) else: tmpgdb = Recognizer() for i in self.ids.gesture_list.children: if i.ids.select.state == 'down': for g in i.gesture_list: tmpgdb.db.append(g) tmpgdb.export_gesture(filename=filename) def _redraw_gesture_list(self, *l): for child in self.ids.gesture_list.children: child._draw_trigger()
class GestureHistoryManager(GridLayout): selected = ObjectProperty(None, allownone=True) def __init__(self, **kwargs): super(GestureHistoryManager, self).__init__(**kwargs) self.gesturesettingsform = GestureSettingsForm() rr = self.gesturesettingsform.rrdetails rr.bind(on_reanalyze_selected=self.reanalyze_selected) self.infopopup = InformationPopup() self.recognizer = App.get_running_app().recognizer def reanalyze_selected(self, *l): # recognize() can block the UI with max_gpf=100, show a message self.infopopup.text = 'Please wait, analyzing ..' self.infopopup.auto_dismiss = False self.infopopup.open() # Get a reference to the original GestureContainer object gesture_obj = self.selected._result_obj._gesture_obj # Reanalyze the candidate strokes using current database res = self.recognizer.recognize(gesture_obj.get_vectors(), max_gpf=100) # Tag the result with the gesture object (it didn't change) res._gesture_obj = gesture_obj # Tag the selected item with the updated ProgressTracker self.selected._result_obj = res res.bind(on_complete=self._reanalyze_complete) def _reanalyze_complete(self, *l): self.gesturesettingsform.load_visualizer(self.selected) self.infopopup.dismiss() def add_selected_to_database(self, *l): if self.selected is None: raise Exception('add_gesture_to_database before load_visualizer?') if self.gesturesettingsform.addsettings is None: raise Exception('add_gesture_to_database missing addsetings?') ids = self.gesturesettingsform.addsettings.ids name = ids.name.value.strip() if name == '': self.infopopup.auto_dismiss = True self.infopopup.text = 'You must specify a name for the gesture' self.infopopup.open() return permute = ids.permute.value sensitive = ids.orientation_sens.value strokelen = ids.stroke_sens.value angle_sim = ids.angle_sim.value cand = self.selected._result_obj._gesture_obj.get_vectors() if permute and len(cand) > MAX_PERMUTE_STROKES: t = "Can't heap permute %d-stroke gesture " % (len(cand)) self.infopopup.text = t self.infopopup.auto_dismiss = True self.infopopup.open() return self.recognizer.add_gesture(name, cand, use_strokelen=strokelen, orientation_sensitive=sensitive, angle_similarity=angle_sim, permute=permute) self.infopopup.text = 'Gesture added to database' self.infopopup.auto_dismiss = True self.infopopup.open() def clear_history(self, *l): if self.selected: self.visualizer_deselect() self.ids.history.clear_widgets() def visualizer_select(self, visualizer, *l): if self.selected is not None: self.selected.selected = False else: self.add_widget(self.gesturesettingsform) self.gesturesettingsform.load_visualizer(visualizer) self.selected = visualizer def visualizer_deselect(self, *l): self.selected = None self.remove_widget(self.gesturesettingsform) def add_recognizer_result(self, result, *l): '''The result object is a ProgressTracker with additional data; in main.py it is tagged with the original GestureContainer that was analyzed (._gesture_obj)''' # Create a GestureVisualizer that draws the gesture on canvas visualizer = GestureVisualizer(result._gesture_obj, size_hint=(None, None), size=(150, 150)) # Tag it with the result object so AddGestureForm.load_visualizer # has the results to build labels in the scrollview visualizer._result_obj = result visualizer.bind(on_select=self.visualizer_select) visualizer.bind(on_deselect=self.visualizer_deselect) # Add the visualizer to the list of gestures in 'history' screen self.ids.history.add_widget(visualizer) self._trigger_layout() self.ids.scrollview.update_from_scroll()
def __init__(self, **kwargs): super(GestureSettingsForm, self).__init__(**kwargs) self.infopopup = InformationPopup() self.rrdetails = RecognizerResultDetails() self.addsettings = None self.app = App.get_running_app()
class GestureHistoryManager(GridLayout): selected = ObjectProperty(None, allownone=True) def __init__(self, **kwargs): super(GestureHistoryManager, self).__init__(**kwargs) self.gesturesettingsform = GestureSettingsForm() rr = self.gesturesettingsform.rrdetails rr.bind(on_reanalyze_selected=self.reanalyze_selected) self.infopopup = InformationPopup() self.recognizer = App.get_running_app().recognizer def reanalyze_selected(self, *l): # recognize() can block the UI with max_gpf=100, show a message self.infopopup.text = 'Please wait, analyzing ..' self.infopopup.auto_dismiss = False self.infopopup.open() # Get a reference to the original GestureContainer object gesture_obj = self.selected._result_obj._gesture_obj # Reanalyze the candidate strokes using current database res = self.recognizer.recognize(gesture_obj.get_vectors(), max_gpf=100) # Tag the result with the gesture object (it didn't change) res._gesture_obj = gesture_obj # Tag the selected item with the updated ProgressTracker self.selected._result_obj = res res.bind(on_complete=self._reanalyze_complete) def _reanalyze_complete(self, *l): self.gesturesettingsform.load_visualizer(self.selected) self.infopopup.dismiss() def add_selected_to_database(self, *l): if self.selected is None: raise Exception('add_gesture_to_database before load_visualizer?') if self.gesturesettingsform.addsettings is None: raise Exception('add_gesture_to_database missing addsetings?') ids = self.gesturesettingsform.addsettings.ids name = ids.name.value.strip() if name == '': self.infopopup.auto_dismiss = True self.infopopup.text = 'You must specify a name for the gesture' self.infopopup.open() return permute = ids.permute.value sensitive = ids.orientation_sens.value strokelen = ids.stroke_sens.value angle_sim = ids.angle_sim.value cand = self.selected._result_obj._gesture_obj.get_vectors() if permute and len(cand) > MAX_PERMUTE_STROKES: t = "Can't heap permute %d-stroke gesture " % (len(cand)) self.infopopup.text = t self.infopopup.auto_dismiss = True self.infopopup.open() return self.recognizer.add_gesture( name, cand, use_strokelen=strokelen, orientation_sensitive=sensitive, angle_similarity=angle_sim, permute=permute) self.infopopup.text = 'Gesture added to database' self.infopopup.auto_dismiss = True self.infopopup.open() def clear_history(self, *l): if self.selected: self.visualizer_deselect() self.ids.history.clear_widgets() def visualizer_select(self, visualizer, *l): if self.selected is not None: self.selected.selected = False else: self.add_widget(self.gesturesettingsform) self.gesturesettingsform.load_visualizer(visualizer) self.selected = visualizer def visualizer_deselect(self, *l): self.selected = None self.remove_widget(self.gesturesettingsform) def add_recognizer_result(self, result, *l): '''The result object is a ProgressTracker with additional data; in main.py it is tagged with the original GestureContainer that was analyzed (._gesture_obj)''' # Create a GestureVisualizer that draws the gesture on canvas visualizer = GestureVisualizer(result._gesture_obj, size_hint=(None, None), size=(150, 150)) # Tag it with the result object so AddGestureForm.load_visualizer # has the results to build labels in the scrollview visualizer._result_obj = result visualizer.bind(on_select=self.visualizer_select) visualizer.bind(on_deselect=self.visualizer_deselect) # Add the visualizer to the list of gestures in 'history' screen self.ids.history.add_widget(visualizer) self._trigger_layout() self.ids.scrollview.update_from_scroll()