def _show_open_dialog(self, *args): '''To show FileBrowser to "Open" a project ''' if hasattr(self, '_popup'): self._popup.dismiss() self._fbrowser = FileBrowser(select_string='Open') def_path = os.getcwd() if not self.project_loader.new_project and \ self.project_loader.proj_dir: def_path = self.project_loader.proj_dir if self._fbrowser.ids.tabbed_browser.current_tab.text == 'List View': self._fbrowser.ids.list_view.path = def_path else: self._fbrowser.ids.icon_view.path = def_path self._fbrowser.bind(on_success=self._fbrowser_load, on_canceled=self._cancel_popup) self._popup = Popup(title="Open", content=self._fbrowser, size_hint=(0.9, 0.9), auto_dismiss=False) self._popup.open()
def przegladajDysk(self): user_path = expanduser('~') + sep + 'Documents' browser = FileBrowser(select_string='Select', favorites=[(user_path, 'Documents')]) browser.bind(on_success=self._fbrowser_success, on_canceled=self._fbrowser_canceled) return browser
def __init__(self, short_text='File Browser'): try: f = open('./Appdata/config.txt') lines = f.readlines() video_input_path = lines[0] video_input_path = video_input_path[:-1] video_input_path = os.path.abspath(video_input_path) video_output_path = lines[1] video_output_path = video_output_path[:-1] video_output_path = os.path.abspath(video_output_path) f.close() except: video_input_path = './Appdata/InputVideos/' video_output_path = './Appdata/output/' browser = FileBrowser(select_string='Select', cancel_state='down', favorites=[(video_input_path, "Input Folder"), (video_output_path, "Output Folder")]) browser.bind( on_success=self._fbrowser_success, on_canceled=self._fbrowser_canceled, ) self.popup = Popup(title=short_text, content=browser, size_hint=(0.7, 0.7), auto_dismiss=False, background_color=rgba('#2f323a'), separator_color=rgba('#DAA520'), title_color=rgba('#DAA520'))
def show_load(self): """ Display a pop up windows with the FileChooser for loading purpose """ self.hauteur = "1/3" self.nb = 2 if platform == 'win': user_path = dirname(expanduser('~')) + sep + 'Documents' else: user_path = expanduser('~') + sep + 'Documents' browser = FileBrowser(select_string='Sélectionner', path=self.memory_path, favorites=[(user_path, 'Documents')], filters=["*.txt"], dirselect=True) browser.bind(on_success=self._fbrowser_success, on_submit=self._fbrowser_submit, on_canceled=self.dismiss_load) self._popup = Popup(title='Ouvrir un fichier', content=browser, size_hint=(0.9, 0.9)) self._popup.open() if self.retour: return True
def action_btn_save_as_pressed(self, *args): '''Event Handler when ActionButton "Save As" is pressed. ''' if self.project_loader.root_rule: self._curr_proj_changed = False self._save_as_browser = FileBrowser(select_string='Save') def_path = os.getcwd() if not self.project_loader.new_project and \ self.project_loader.proj_dir: def_path = self.project_loader.proj_dir if self._save_as_browser.ids.tabbed_browser.current_tab.text == \ 'List View': self._save_as_browser.ids.list_view.path = def_path else: self._save_as_browser.ids.icon_view.path = def_path self._save_as_browser.bind(on_success=self._perform_save_as, on_canceled=self._cancel_popup) self._popup = Popup(title="Enter Folder Name", content=self._save_as_browser, size_hint=(0.9, 0.9), auto_dismiss=False) self._popup.open()
def build(self): user_path = dirname(expanduser('~')) + sep + 'Documents' browser = FileBrowser(select_string='Select', favorites=[(user_path, 'Documents')]) browser.bind(on_success=self._fbrowser_success, on_canceled=self._fbrowser_canceled) return browser
def przegladajDysk(self): user_path = expanduser('~') + sep + 'Documents' browser = FileBrowser(select_string='Select', favorites=[(user_path, 'Documents')]) browser.bind( on_success=self._fbrowser_success, on_canceled=self._fbrowser_canceled) return browser
def open_prof_file_btn_pressed(self, *args): self._fbrowser = FileBrowser(select_string='Open') self._fbrowser.bind(on_success=self._prof_file_load, on_canceled=self._cancel_popup) self._popup = Popup(title='Open File', content=self._fbrowser, size_hint=(0.9, 0.9), auto_dismiss=False) self._popup.open()
class PictureGallery(BoxLayout): def __init__(self, **kwargs): super(PictureGallery, self).__init__(**kwargs) self.menu = self.ids['_menu'] self.image_frame = self.ids['_image_frame'] self.image_name = self.ids['_image_name'] self.image_scatter = self.ids['_image_scatter'] self.file_browser = FileBrowser() self.file_browser.bind(on_success=self.addImageEvent, on_canceled=self.cancelFileBrowser) self.file_browser_popup = Popup(content=self.file_browser, size_hint=(.8, .8)) self.loadPictureMenu() def loadPictureMenu(self): '''Load Dir and Add Button to Menu''' last_dir = '' self.menu.clear_widgets() for dir in os.listdir(PICTURE_DIR): splitname = os.path.splitext(dir) if splitname[1].strip('.') not in PICTURE_EXT: continue button_temp = MenuButton(text=splitname[0]) button_temp.ext = splitname[1] button_temp.bind(on_release=self.loadPicture) self.menu.add_widget(button_temp) last_dir = dir self.image_name.text = os.path.splitext(last_dir)[0] self.image_frame.source = PICTURE_DIR + os.sep + last_dir def loadPicture(self, obj): dir = PICTURE_DIR + os.sep + obj.text + obj.ext self.image_name.text = obj.text self.image_frame.source = dir def showFileBrowser(self): self.file_browser_popup.open() def addImageEvent(self, obj): try: selection = obj.selection[0] except: return if os.path.splitext(selection)[1].strip('.') in PICTURE_EXT: print selection, PICTURE_DIR copy2(selection, PICTURE_DIR) self.file_browser_popup.dismiss() self.loadPictureMenu() def cancelFileBrowser(self, obj): self.file_browser_popup.dismiss() def setDefaultImageState(self): self.image_scatter.scale = 1.0 self.image_scatter.pos = (self.image_name.x, self.image_name.y + self.image_name.height)
def __init__(self, **kwargs): super(BrowseLayout, self).__init__(**kwargs) user_path = dirname(expanduser('~')) + sep + 'Documents' browser = FileBrowser(select_string='Select', favorites=[(user_path, 'Documents')]) browser.bind(on_success=self._fbrowser_success, on_canceled=self._fbrowser_canceled) self.add_widget(browser)
def explorer(self): if platform == 'win': user_path = dirname(expanduser('~')) + sep + 'Documents' else: user_path = expanduser('~') + sep + 'Documents' browser = FileBrowser(select_string='Select', favorites=[(user_path, 'Documents')]) browser.bind(on_success=self._fbrowser_success, on_canceled=self._fbrowser_canceled) return browser
def __init__(self, **kwargs): super(PictureGallery, self).__init__(**kwargs) self.menu = self.ids['_menu'] self.image_frame = self.ids['_image_frame'] self.image_name = self.ids['_image_name'] self.image_scatter = self.ids['_image_scatter'] self.file_browser = FileBrowser() self.file_browser.bind(on_success=self.addImageEvent, on_canceled=self.cancelFileBrowser) self.file_browser_popup = Popup(content=self.file_browser, size_hint=(.8, .8)) self.loadPictureMenu()
def open_stud_file_btn_pressed(self, *args): user_path = os.getcwd() #user_path = '~/ece5725_final_project/demo' #CHANGE USER PATH OF DOWNLOADS self._fbrowser = FileBrowser(select_string='Open', favorites=[ (user_path, 'Documents')]) self._fbrowser.bind(on_success=self._stud_file_load, on_canceled=self._cancel_popup) self._popup = Popup(title='Open File', content=self._fbrowser, size_hint=(0.9, 0.9), auto_dismiss=False) self._popup.open()
def action_btn_add_custom_widget_press(self, *args): '''Event Handler when ActionButton "Add Custom Widget" is pressed. ''' self._custom_browser = FileBrowser(select_string='Add') self._custom_browser.bind(on_success=self._custom_browser_load, on_canceled=self._cancel_popup) self._popup = Popup(title="Add Custom Widget", content=self._custom_browser, size_hint=(0.9, 0.9), auto_dismiss=False) self._popup.open()
def chooseFile(self): if sys.platform == 'win': user_path = dirname(expanduser('~')) + sep + 'Documents' else: user_path = expanduser('~') + sep + 'Documents' browser = FileBrowser(select_string='Select', favorites=[(user_path, 'Documents')]) self.popup = Popup(size_hint=(None, None), content=browser, auto_dismiss=False, size=(700, 500)) browser.bind(on_success=self.selectFile, on_canceled=self.popup.dismiss) self.popup.open()
def open_folder_btn_pressed(self, *args): '''To load File Browser for selected folder when 'Open Folder' is clicked ''' self._fbrowser = FileBrowser(select_string='Open Folder') self._fbrowser.ids.list_view.path = self.project.path self._fbrowser.bind(on_success=self._folder_load, on_canceled=self._cancel_popup) self._popup = Popup(title='Open Folder', content=self._fbrowser, size_hint=(0.9, 0.9), auto_dismiss=False) self._popup.open()
def __init__(self, **kwargs): ''' Creates a browser that uses the Kivy Garden FileBrowser add-on to allow the user to select a .png file to pixelate. ''' super(SelectFile, self).__init__(**kwargs) if platform == 'win': user_path = dirname(expanduser('~')) + sep + 'Documents' else: user_path = expanduser('~') + sep + 'Documents' self.browser = FileBrowser(select_string='Select', favorites=[(user_path, 'Documents')]) self.browser.bind(on_success=self._fbrowser_success, on_canceled=self._fbrowser_canceled)
def choose_file(filters, cb, dirselect=True): browser = FileBrowser(select_string='Select', filters=filters, path='/home/illia/images', dirselect=dirselect) browser.bind( on_success=lambda instance: file_chosen( instance.selection[0], filters, popup, cb, ), on_canceled=lambda _: popup.dismiss(), ) popup = Popup(title='Choose directory', content=browser) popup.open()
def action_btn_save_as_pressed(self, *args): '''Event Handler when ActionButton "Save As" is pressed. ''' if self.project_loader.root_rule: self._curr_proj_changed = False self._save_as_browser = FileBrowser(select_string='Save') def_path = os.getcwd() if not self.project_loader.new_project and self.project_loader.proj_dir: def_path = self.project_loader.proj_dir if self._save_as_browser.ids.tabbed_browser.current_tab.text == 'List View': self._save_as_browser.ids.list_view.path = def_path else: self._save_as_browser.ids.icon_view.path = def_path self._save_as_browser.bind(on_success=self._perform_save_as, on_canceled=self._cancel_popup) self._popup = Popup(title="Enter Folder Name", content = self._save_as_browser, size_hint=(0.9, 0.9), auto_dismiss=False) self._popup.open()
def open_file_btn_pressed(self, *args): """To load File Browser for selected file when 'Open File' is clicked """ self._fbrowser = FileBrowser(select_string="Open") self._fbrowser.bind(on_success=self._file_load, on_canceled=self._cancel_popup) self._popup = Popup(title="Open File", content=self._fbrowser, size_hint=(0.9, 0.9), auto_dismiss=False) self._popup.open()
def action_btn_add_custom_widget_press(self, *args): """Event Handler when ActionButton "Add Custom Widget" is pressed. """ self._custom_browser = FileBrowser(select_string="Add") self._custom_browser.bind(on_success=self._custom_browser_load, on_canceled=self._cancel_popup) self._popup = Popup( title="Add Custom Widget", content=self._custom_browser, size_hint=(0.9, 0.9), auto_dismiss=False ) self._popup.open()
def __init__(self, root, directory): super(DirectoryWidget, self).__init__() self.root = root self.directory = directory user_path = None docs_path = "" current_label = self.root.ids[directory].text if 'win' in sys.platform.lower(): docs_path = dirname(expanduser('~')) + sep + 'Documents' else: docs_path = expanduser('~') + sep + 'Documents' if current_label is not None and len(current_label) > 0: user_path = current_label if user_path is None: user_path = docs_path browser = FileBrowser(select_string='Select', path=user_path, favorites=[(docs_path, "Documents")]) browser.dirselect = True browser.bind(on_success=self._fbrowser_success, on_canceled=self._fbrowser_canceled) self.add_widget(browser) self.browser = browser
def open_folder_btn_pressed(self, *args): """To load File Browser for selected folder when 'Open Folder' is clicked """ self._fbrowser = FileBrowser(select_string="Open Folder") self._fbrowser.ids.list_view.path = self.project.path self._fbrowser.bind(on_success=self._folder_load, on_canceled=self._cancel_popup) self._popup = Popup(title="Open Folder", content=self._fbrowser, size_hint=(0.9, 0.9), auto_dismiss=False) self._popup.open()
def menu_basedatos(self, dbPath=''): # TODO: al hacer click en menu -> base de datos, se tiene que abrir popup de aviso, hacer logout y ponerte pantalla de login # TODO: simplificar llamadas de menu y que cargue menu en forma dinamica #pag_bd = PaginaBd() #conf_path = self.config.get('last_session', 'dbpath') #if not dbPath == conf_path and dbPath.startswith('/'): # conf_path = dbPath #if not conf_path: # conf_path = os.path.dirname(os.path.expanduser('~')) #pag_bd.ids['lvl_bd'].text = conf_path #pag_bd.ids['filechooser'].path = conf_path #self._switch_main_page('Base de datos', pag_bd) self._fbrowser = FileBrowser(select_string='Open') self._fbrowser.bind(on_success=self._file_load, on_canceled=self._cancel_popup) self._popup = Popup(title='Open File', content=self._fbrowser, size_hint=(0.9, 0.9), auto_dismiss=False) self._popup.open()
def onButtonPress2(self, button): user_path = dirname('Documents') layout = FileBrowser(select_string='select', favorites=[(user_path, 'Documents')]) layout.bind(on_success=self._fbroswer_success2, on_canceled=self._fbroswer_canceled) closeButton = Button(text="Return to Main") layout.add_widget(closeButton) #intsntiate the modal popup and display popup = Popup(title='Application', content=layout) #content = (Lablel(text='This is a demo popup'))) popup.open() #attach close button press with popup.dismiss action closeButton.bind(on_press=popup.dismiss)
class MenuFunctions: def menu_inicio(self): self._switch_main_page('MainPanel', MainPanel) def menu_basedatos(self, dbPath=''): # TODO: al hacer click en menu -> base de datos, se tiene que abrir popup de aviso, hacer logout y ponerte pantalla de login # TODO: simplificar llamadas de menu y que cargue menu en forma dinamica #pag_bd = PaginaBd() #conf_path = self.config.get('last_session', 'dbpath') #if not dbPath == conf_path and dbPath.startswith('/'): # conf_path = dbPath #if not conf_path: # conf_path = os.path.dirname(os.path.expanduser('~')) #pag_bd.ids['lvl_bd'].text = conf_path #pag_bd.ids['filechooser'].path = conf_path #self._switch_main_page('Base de datos', pag_bd) self._fbrowser = FileBrowser(select_string='Open') self._fbrowser.bind(on_success=self._file_load, on_canceled=self._cancel_popup) self._popup = Popup(title='Open File', content=self._fbrowser, size_hint=(0.9, 0.9), auto_dismiss=False) self._popup.open() def _cancel_popup(self, *args): '''To dismiss popup when cancel is pressed. ''' self._popup.dismiss() def _file_load(self, instance): '''To set the text of text_file, to the file selected. ''' self._popup.dismiss() if instance.selection: self.text_file.text = instance.selection[0] def menu_cuentas(self): self._switch_main_page('Cuentas', PaginaCuentas) def menu_monedas(self): self._switch_main_page('Monedas', PaginaMonedas) def menu_sincro(self): self._switch_main_page('Sincronizar', PaginaSincro) def menu_plugins(self): self._switch_main_page('Plugins', PaginaPlugins) def menu_opciones(self): self.open_settings() def menu_categorias(self): self._switch_main_page('Categorías', PaginaCategorias) def menu_usuarios(self): pass def menu_mantenimiento(self): # llenar las tablas vacias si se upgradeo de version app = App.get_running_app() populate_db(app.backend.db, True) def menu_presupuestos(self): pass def menu_reportes(self): pass def menu_ayuda(self): pass def menu_preguntas(self): pass def menu_acercade(self): pass
class Designer(FloatLayout): '''Designer is the Main Window class of Kivy Designer :data:`message` is a :class:`~kivy.properties.StringProperty` ''' designer_console = ObjectProperty(None) '''Instance of :class:`designer.designer_console.ConsoleDialog` ''' statusbar = ObjectProperty(None) '''Reference to the :class:`~designer.statusbar.StatusBar` instance. :data:`statusbar` is a :class:`~kivy.properties.ObjectProperty` ''' editcontview = ObjectProperty(None) '''Reference to the :class:`~designer.uix.EditContView` instance. :data:`v` is a :class:`~kivy.properties.ObjectProperty` ''' actionbar = ObjectProperty(None) '''Reference to the :class:`~kivy.actionbar.ActionBar` instance. ActionBar is used as a MenuBar to display bunch of menu items. :data:`actionbar` is a :class:`~kivy.properties.ObjectProperty` ''' undo_manager = ObjectProperty(UndoManager()) '''Reference to the :class:`~designer.UndoManager` instance. :data:`undo_manager` is a :class:`~kivy.properties.ObjectProperty` ''' project_watcher = ObjectProperty(None) '''Reference to the :class:`~designer.project_watcher.ProjectWatcher`. :data:`project_watcher` is a :class:`~kivy.properties.ObjectProperty` ''' project_loader = ObjectProperty(None) '''Reference to the :class:`~designer.project_loader.ProjectLoader`. :data:`project_loader` is a :class:`~kivy.properties.ObjectProperty` ''' proj_settings = ObjectProperty(None) '''Reference of :class:`~designer.project_settings.ProjectSettings`. :data:`proj_settings` is a :class:`~kivy.properties.ObjectProperty` ''' _curr_proj_changed = BooleanProperty(False) '''Specifies whether current project has been changed inside Kivy Designer :data:`_curr_proj_changed` is a :class:`~kivy.properties.BooleanProperty` ''' _proj_modified_outside = BooleanProperty(False) '''Specifies whether current project has been changed outside Kivy Designer :data:`_proj_modified_outside` is a :class:`~kivy.properties.BooleanProperty` ''' ui_creator = ObjectProperty(None) '''Reference to :class:`~designer.ui_creator.UICreator` instance. :data:`ui_creator` is a :class:`~kivy.properties.ObjectProperty` ''' designer_content = ObjectProperty(None) '''Reference to :class:`~designer.designer_content.DesignerContent` instance. :data:`designer_content` is a :class:`~kivy.properties.ObjectProperty` ''' proj_tree_view = ObjectProperty(None) '''Reference to Project Tree instance :data:`proj_tree_view` is a :class:`~kivy.properties.ObjectProperty` ''' designer_settings = ObjectProperty(None) '''Reference of :class:`~designer.designer_settings.DesignerSettings`. :data:`designer_settings` is a :class:`~kivy.properties.ObjectProperty` ''' start_page = ObjectProperty(None) '''Reference of :class:`~designer.start_page.DesignerStartPage`. :data:`start_page` is a :class:`~kivy.properties.ObjectProperty` ''' recent_files_cont_menu = ObjectProperty(None) '''The context sub menu, containing the recently opened/saved projects. Reference of :class:`~designer.uix.contextual.ContextSubMenu`. :data:`recent_files_cont_menu` is a :class:`~kivy.properties.ObjectProperty` ''' def __init__(self, **kwargs): super(Designer, self).__init__(**kwargs) self.project_watcher = ProjectWatcher(self.project_modified) self.project_loader = ProjectLoader(self.project_watcher) self.recent_manager = RecentManager() self.widget_to_paste = None self.designer_content = DesignerContent(size_hint=(1, None)) self.designer_settings = DesignerSettings() self.designer_settings.bind(on_config_change=self._config_change) self.designer_settings.load_settings() self.designer_settings.bind(on_close=self._cancel_popup) Clock.schedule_interval(self.project_loader.perform_auto_save, int(self.designer_settings.config_parser.getdefault( 'global', 'auto_save_time', 5))*60) def _config_change(self, *args): '''Event Handler for 'on_config_change' event of self.designer_settings. ''' Clock.unschedule(self.project_loader.perform_auto_save) Clock.schedule_interval(self.project_loader.perform_auto_save, int(self.designer_settings.config_parser.getdefault( 'global', 'auto_save_time', 5))*60) self.ui_creator.kv_code_input.reload_kv = \ bool(self.designer_settings.config_parser.getdefault( 'global', 'reload_kv', True)) self.recent_manager.max_recent_files = \ int(self.designer_settings.config_parser.getdefault( 'global', 'num_recent_files', 5)) def _add_designer_content(self): '''Add designer_content to Designer, when a project is loaded ''' for _child in self.children[:]: if _child == self.designer_content: return self.remove_widget(self.start_page) self.add_widget(self.designer_content, 1) self.ids['actn_btn_save'].disabled = False self.ids['actn_btn_save_as'].disabled = False self.ids['actn_chk_proj_tree'].disabled = False self.ids['actn_chk_prop_event'].disabled = False self.ids['actn_chk_widget_tree'].disabled = False self.ids['actn_chk_status_bar'].disabled = False self.ids['actn_chk_kv_lang_area'].disabled = False self.ids['actn_btn_add_file'].disabled = False self.ids['actn_btn_custom_widget'].disabled = False self.ids['actn_btn_proj_pref'].disabled = False self.ids['actn_btn_run_proj'].disabled = False def on_statusbar_height(self, *args): '''Callback for statusbar.height ''' self.designer_content.y = self.statusbar.height self.on_height(*args) def on_actionbar_height(self, *args): '''Callback for actionbar.height ''' self.on_height(*args) def on_height(self, *args): '''Callback for self.height ''' if self.actionbar and self.statusbar: self.designer_content.height = self.height - \ self.actionbar.height - self.statusbar.height self.designer_content.y = self.statusbar.height def project_modified(self, *args): '''Event Handler called when Project is modified outside Kivy Designer ''' #To dispatch modified event only once for all files/folders of proj_dir if self._proj_modified_outside: return self._confirm_dlg = ConfirmationDialog(message="Current Project has " "been modified\n" "outside the Kivy Designer.\n" "Do you want to reload project?") self._confirm_dlg.bind(on_ok=self._perform_reload, on_cancel=self._cancel_popup) self._popup = Popup(title='Kivy Designer', content=self._confirm_dlg, size_hint=(None, None),size=('200pt', '150pt'), auto_dismiss=False) self._popup.open() self._proj_modified_outside = True def _perform_reload(self, *args): '''Perform reload of project after it is modified ''' #Perform reload of project after it is modified self._popup.dismiss() self.project_watcher.allow_event_dispatch = False self._perform_open(self.project_loader.proj_dir) self.project_watcher.allow_event_dispatch = True self._proj_modified_outside = False def on_show_edit(self, *args): '''Event Handler of 'on_show_edit' event. This will show EditContView in ActionBar ''' if isinstance(self.actionbar.children[0], EditContView): return if self.editcontview == None: self.editcontview = EditContView( on_undo=self.action_btn_undo_pressed, on_redo=self.action_btn_redo_pressed, on_cut=self.action_btn_cut_pressed, on_copy=self.action_btn_copy_pressed, on_paste=self.action_btn_paste_pressed, on_delete=self.action_btn_delete_pressed, on_selectall=self.action_btn_select_all_pressed, on_next_screen=self._next_screen, on_prev_screen=self._prev_screen) self.actionbar.add_widget(self.editcontview) widget = self.ui_creator.propertyviewer.widget if isinstance(widget, Carousel) or\ isinstance(widget, ScreenManager) or\ isinstance(widget, TabbedPanel): self.editcontview.show_action_btn_screen(True) else: self.editcontview.show_action_btn_screen(False) if self.ui_creator.kv_code_input.clicked: self._edit_selected = 'KV' elif self.ui_creator.playground.clicked: self._edit_selected = 'Play' else: self._edit_selected = 'Py' self.ui_creator.playground.clicked = False self.ui_creator.kv_code_input.clicked = False def _prev_screen(self, *args): widget = self.ui_creator.propertyviewer.widget if isinstance(widget, Carousel): widget.load_previous() elif isinstance(widget, ScreenManager): widget.current = widget.previous() elif isinstance(widget, TabbedPanel): index = widget.tab_list.index(widget.current_tab) if len(widget.tab_list) <= index + 1: return widget.switch_to(widget.tab_list[index + 1]) def _next_screen(self, *args): widget = self.ui_creator.propertyviewer.widget if isinstance(widget, Carousel): widget.load_next() elif isinstance(widget, ScreenManager): widget.current = widget.next() elif isinstance(widget, TabbedPanel): index = widget.tab_list.index(widget.current_tab) if index == 0: return widget.switch_to(widget.tab_list[index - 1]) def on_touch_down(self, touch): '''Override of FloatLayout.on_touch_down. Used to determine where touch is down and to call self.actionbar.on_previous ''' if not isinstance(self.actionbar.children[0], EditContView) or\ self.actionbar.collide_point(*touch.pos): return super(FloatLayout, self).on_touch_down(touch) self.actionbar.on_previous(self) return super(FloatLayout, self).on_touch_down(touch) def action_btn_new_pressed(self, *args): '''Event Handler when ActionButton "New" is pressed. ''' if not self._curr_proj_changed: self._show_new_dialog() return self._confirm_dlg = ConfirmationDialog('All unsaved changes will be' ' lost.\n' 'Do you want to continue?') self._confirm_dlg.bind(on_ok=self._show_new_dialog, on_cancel=self._cancel_popup) self._popup = Popup(title='New', content = self._confirm_dlg, size_hint=(None,None),size=('200pt', '150pt'), auto_dismiss=False) self._popup.open() def _show_new_dialog(self, *args): if hasattr(self, '_popup'): self._popup.dismiss() self._new_dialog = NewProjectDialog() self._new_dialog.bind(on_select=self._perform_new, on_cancel=self._cancel_popup) self._popup = Popup(title='New Project', content = self._new_dialog, size_hint=(None,None),size=('650pt', '450pt'), auto_dismiss=False) self._popup.open() def _perform_new(self, *args): '''To load new project ''' if hasattr(self, '_popup'): self._popup.dismiss() self.cleanup() new_proj_dir = os.path.join(get_kivy_designer_dir(), NEW_PROJECT_DIR_NAME) if os.path.exists(new_proj_dir): shutil.rmtree(new_proj_dir) os.mkdir(new_proj_dir) template = self._new_dialog.adapter.selection[0].text kv_file = NEW_PROJECTS[template][0] py_file = NEW_PROJECTS[template][1] templates_dir = os.path.join(os.getcwd(), NEW_TEMPLATES_DIR) shutil.copy(os.path.join(templates_dir, py_file), os.path.join(new_proj_dir, "main.py")) shutil.copy(os.path.join(templates_dir, kv_file), os.path.join(new_proj_dir, "main.kv")) self.ui_creator.playground.sandbox.error_active = True with self.ui_creator.playground.sandbox: self.project_loader.load_new_project(os.path.join(new_proj_dir, "main.kv")) root_wigdet = self.project_loader.get_root_widget() self.ui_creator.playground.add_widget_to_parent(root_wigdet, None, from_undo=True) self.ui_creator.kv_code_input.text = self.project_loader.get_full_str() self.designer_content.update_tree_view(self.project_loader) self._add_designer_content() if self.project_loader.class_rules: for i, _rule in enumerate(self.project_loader.class_rules): widgets.append((_rule.name, 'custom')) self.designer_content.toolbox.add_custom() self.ui_creator.playground.sandbox.error_active = False def cleanup(self): '''To cleanup everything loaded by the current project before loading another project. ''' self.project_loader.cleanup() self.ui_creator.cleanup() self.undo_manager.cleanup() self.designer_content.toolbox.cleanup() for node in self.proj_tree_view.root.nodes[:]: self.proj_tree_view.remove_node(node) for widget in widgets[:]: if widget[1] == 'custom': widgets.remove(widget) self._curr_proj_changed = False self.ui_creator.kv_code_input.text = "" self.designer_content.tab_pannel.list_py_code_inputs = [] for th in self.designer_content.tab_pannel.tab_list[:-1]: self.designer_content.tab_pannel.remove_widget(th) def action_btn_open_pressed(self, *args): '''Event Handler when ActionButton "Open" is pressed. ''' if not self._curr_proj_changed: self._show_open_dialog() return self._confirm_dlg = ConfirmationDialog('All unsaved changes will be ' 'lost.\n' 'Do you want to continue?') self._confirm_dlg.bind(on_ok=self._show_open_dialog, on_cancel=self._cancel_popup) self._popup = Popup(title='Kivy Designer', content = self._confirm_dlg, size_hint=(None,None),size=('200pt', '150pt'), auto_dismiss=False) self._popup.open() def _show_open_dialog(self, *args): '''To show FileBrowser to "Open" a project ''' if hasattr(self, '_popup'): self._popup.dismiss() self._fbrowser = FileBrowser(select_string='Open') def_path = os.getcwd() if not self.project_loader.new_project and self.project_loader.proj_dir: def_path = self.project_loader.proj_dir if self._fbrowser.ids.tabbed_browser.current_tab.text == 'List View': self._fbrowser.ids.list_view.path = def_path else: self._fbrowser.ids.icon_view.path = def_path self._fbrowser.bind(on_success=self._fbrowser_load, on_canceled=self._cancel_popup) self._popup = Popup(title="Open", content = self._fbrowser, size_hint=(0.9, 0.9), auto_dismiss=False) self._popup.open() def _select_class_selected(self, *args): '''Event Handler for 'on_select' event of self._select_class ''' selection = self._select_class.listview.adapter.selection[0].text with self.ui_creator.playground.sandbox: root_widget = self.project_loader.set_root_widget(selection) self.ui_creator.playground.add_widget_to_parent(root_widget, None, from_undo=True) self.ui_creator.kv_code_input.text = self.project_loader.get_root_str() self._select_class_popup.dismiss() def _select_class_cancel(self, *args): '''Event Handler for 'on_cancel' event of self._select_class ''' self._select_class_popup.dismiss() def _fbrowser_load(self, instance): '''Event Handler for 'on_load' event of self._fbrowser ''' if instance.selection == []: return file_path = instance.selection[0] self._popup.dismiss() self._perform_open(file_path) def _perform_open(self, file_path): '''To open a project given by file_path ''' for widget in widgets[:]: if widget[1] == 'custom': widgets.remove(widget) self.cleanup() self.ui_creator.playground.sandbox.error_active = True root_widget = None with self.ui_creator.playground.sandbox: try: self.project_loader.load_project(file_path) if self.project_loader.class_rules: for i, _rule in enumerate(self.project_loader.class_rules): widgets.append((_rule.name, 'custom')) self.designer_content.toolbox.add_custom() #to test listview #root_wigdet = None root_wigdet = self.project_loader.get_root_widget() if not root_wigdet: #Show list box showing widgets self._select_class = SelectClass( self.project_loader.class_rules) self._select_class.bind(on_select=self._select_class_selected, on_cancel=self._select_class_cancel) self._select_class_popup = Popup(title="Select Root Widget", content = self._select_class, size_hint=(0.5, 0.5), auto_dismiss=False) self._select_class_popup.open() else: self.ui_creator.playground.add_widget_to_parent(root_wigdet, None, from_undo=True) self.ui_creator.kv_code_input.text = self.project_loader.get_full_str() self.recent_manager.add_file(file_path) #Record everything for later use self.project_loader.record() self.designer_content.update_tree_view(self.project_loader) self._add_designer_content() except Exception as e: self.statusbar.show_message('Cannot load Project: %s'%(str(e))) self.ui_creator.playground.sandbox.error_active = False def _cancel_popup(self, *args): '''EventHandler for all self._popup when self._popup.content emits 'on_cancel' or equivalent. ''' self._proj_modified_outside = False self._popup.dismiss() def action_btn_save_pressed(self, *args): '''Event Handler when ActionButton "Save" is pressed. ''' if self.project_loader.root_rule: try: if self.project_loader.new_project: self.action_btn_save_as_pressed() return else: self.project_loader.save_project() projdir = self.project_loader.proj_dir self.project_loader.cleanup(stop_watcher=False) self.ui_creator.playground.cleanup() self.project_loader.load_project(projdir) root_wigdet = self.project_loader.get_root_widget() self.ui_creator.playground.add_widget_to_parent(root_wigdet, None, from_undo=True, from_kv=True) self._curr_proj_changed = False self.statusbar.show_message('Project saved successfully') except: self.statusbar.show_message('Cannot save project') def action_btn_save_as_pressed(self, *args): '''Event Handler when ActionButton "Save As" is pressed. ''' if self.project_loader.root_rule: self._curr_proj_changed = False self._save_as_browser = FileBrowser(select_string='Save') def_path = os.getcwd() if not self.project_loader.new_project and self.project_loader.proj_dir: def_path = self.project_loader.proj_dir if self._save_as_browser.ids.tabbed_browser.current_tab.text == 'List View': self._save_as_browser.ids.list_view.path = def_path else: self._save_as_browser.ids.icon_view.path = def_path self._save_as_browser.bind(on_success=self._perform_save_as, on_canceled=self._cancel_popup) self._popup = Popup(title="Enter Folder Name", content = self._save_as_browser, size_hint=(0.9, 0.9), auto_dismiss=False) self._popup.open() def _perform_save_as(self, instance): '''Event handler for 'on_success' event of self._save_as_browser ''' if hasattr(self, '_popup'): self._popup.dismiss() proj_dir = '' if instance.ids.tabbed_browser.current_tab.text == 'List View': proj_dir = instance.ids.list_view.path else: proj_dir = instance.ids.icon_view.path proj_dir = os.path.join(proj_dir, instance.filename) #try: if True: self.project_loader.save_project(proj_dir) self.recent_manager.add_file(proj_dir) projdir = self.project_loader.proj_dir self.project_loader.cleanup() self.ui_creator.playground.cleanup() self.project_loader.load_project(projdir) root_wigdet = self.project_loader.get_root_widget() self.ui_creator.playground.add_widget_to_parent(root_wigdet, None, from_undo=True) self.statusbar.show_message('Project saved successfully') #except: # self.statusbar.show_message('Cannot save project') def action_btn_settings_pressed(self, *args): self.designer_settings.parent = None self._popup = Popup(title="Kivy Designer Settings", content = self.designer_settings, size_hint=(None, None), size=(600, 400), auto_dismiss=False) self._popup.open() def action_btn_recent_files_pressed(self, *args): '''Event Handler when ActionButton "Recent Files" is pressed. ''' pass def fill_recent_menu(self, *args): recent_menu = self.recent_files_cont_menu for _file in self.recent_manager.list_files: act_btn = DesignerActionButton(text=_file, shorten=True) recent_menu.add_widget(act_btn) act_btn.bind(on_release=self._recent_file_release) def _recent_file_release(self, instance, *args): '''Event Handler for 'on_select' event of self._recent_dlg. ''' self._perform_open(instance.text) def action_btn_quit_pressed(self, *args): '''Event Handler when ActionButton "Quit" is pressed. ''' App.get_running_app().stop() def action_btn_undo_pressed(self, *args): '''Event Handler when ActionButton "Undo" is pressed. ''' if self._edit_selected == 'Play': self.undo_manager.do_undo() elif self._edit_selected == 'KV': self.ui_creator.kv_code_input.do_undo() elif self._edit_selected == 'Py': for code_input in self.designer_content.tab_pannel.list_py_code_inputs: if code_input.clicked == True: code_input.clicked = False code_input.do_undo() def action_btn_redo_pressed(self, *args): '''Event Handler when ActionButton "Redo" is pressed. ''' if self._edit_selected == 'Play': self.undo_manager.do_redo() elif self._edit_selected == 'KV': self.ui_creator.kv_code_input.do_redo() elif self._edit_selected == 'Py': for code_input in self.designer_content.tab_pannel.list_py_code_inputs: if code_input.clicked == True: code_input.clicked = False code_input.do_redo() def action_btn_cut_pressed(self, *args): '''Event Handler when ActionButton "Cut" is pressed. ''' if self._edit_selected == 'Play': self.ui_creator.playground.do_cut() elif self._edit_selected == 'KV': self.ui_creator.kv_code_input.do_cut() elif self._edit_selected == 'Py': for code_input in self.designer_content.tab_pannel.list_py_code_inputs: if code_input.clicked == True: code_input.clicked = False code_input.do_cut() def action_btn_copy_pressed(self, *args): '''Event Handler when ActionButton "Copy" is pressed. ''' if self._edit_selected == 'Play': self.ui_creator.playground.do_copy() elif self._edit_selected == 'KV': self.ui_creator.kv_code_input.do_copy() elif self._edit_selected == 'Py': for code_input in self.designer_content.tab_pannel.list_py_code_inputs: if code_input.clicked == True: code_input.clicked = False code_input.do_copy() def action_btn_paste_pressed(self, *args): '''Event Handler when ActionButton "Paste" is pressed. ''' if self._edit_selected == 'Play': self.ui_creator.playground.do_paste() elif self._edit_selected == 'KV': self.ui_creator.kv_code_input.do_paste() elif self._edit_selected == 'Py': for code_input in self.designer_content.tab_pannel.list_py_code_inputs: if code_input.clicked == True: code_input.clicked = False code_input.do_paste() def action_btn_delete_pressed(self, *args): '''Event Handler when ActionButton "Delete" is pressed. ''' if self._edit_selected == 'Play': self.ui_creator.playground.do_delete() elif self._edit_selected == 'KV': self.ui_creator.kv_code_input.do_delete() elif self._edit_selected == 'Py': for code_input in self.designer_content.tab_pannel.list_py_code_inputs: if code_input.clicked == True: code_input.clicked = False code_input.do_delete() def action_btn_select_all_pressed(self, *args): '''Event Handler when ActionButton "Select All" is pressed. ''' if self._edit_selected == 'Play': self.ui_creator.playground.do_select_all() elif self._edit_selected == 'KV': self.ui_creator.kv_code_input.do_select_all() elif self._edit_selected == 'Py': for code_input in self.designer_content.tab_pannel.list_py_code_inputs: if code_input.clicked == True: code_input.clicked = False code_input.do_select_all() def action_btn_add_custom_widget_press(self, *args): '''Event Handler when ActionButton "Add Custom Widget" is pressed. ''' self._custom_browser = FileBrowser(select_string='Add') self._custom_browser.bind(on_success=self._custom_browser_load, on_canceled=self._cancel_popup) self._popup = Popup(title="Add Custom Widget", content = self._custom_browser, size_hint=(0.9, 0.9), auto_dismiss=False) self._popup.open() def _custom_browser_load(self, instance): '''Event Handler for 'on_success' event of self._custom_browser ''' file_path = instance.selection[0] self._popup.dismiss() self.ui_creator.playground.sandbox.error_active = True with self.ui_creator.playground.sandbox: try: self.project_loader.add_custom_widget(file_path) self.designer_content.toolbox.cleanup() for _rule in (self.project_loader.custom_widgets): widgets.append((_rule.name, 'custom')) self.designer_content.toolbox.add_custom() except ProjectLoaderException as e: self.statusbar.show_message('Cannot load widget. %s'%str(e)) self.ui_creator.playground.sandbox.error_active = False def action_chk_btn_toolbox_active(self, chk_btn): '''Event Handler when ActionCheckButton "Toolbox" is activated. ''' if chk_btn.checkbox.active: self._toolbox_parent.add_widget(self.designer_content.splitter_tree) self.designer_content.splitter_tree.width = self._toolbox_width else: self._toolbox_parent = self.designer_content.splitter_tree.parent self._toolbox_parent.remove_widget(self.designer_content.splitter_tree) self._toolbox_width = self.designer_content.splitter_tree.width self.designer_content.splitter_tree.width = 0 def action_chk_btn_property_viewer_active(self, chk_btn): '''Event Handler when ActionCheckButton "Property Viewer" is activated. ''' if chk_btn.checkbox.active: self._toggle_splitter_widget_tree() if self.ui_creator.splitter_widget_tree.parent is None: self._splitter_widget_tree_parent.add_widget(self.ui_creator.splitter_widget_tree) self.ui_creator.splitter_widget_tree.width = self._splitter_widget_tree_width add_tree = False if self.ui_creator.grid_widget_tree.parent is not None: add_tree = True self.ui_creator.splitter_property.size_hint_y = None self.ui_creator.splitter_property.height = 300 self._splitter_property_parent.clear_widgets() if add_tree: self._splitter_property_parent.add_widget(self.ui_creator.grid_widget_tree) self._splitter_property_parent.add_widget(self.ui_creator.splitter_property) else: self._splitter_property_parent = self.ui_creator.splitter_property.parent self._splitter_property_parent.remove_widget(self.ui_creator.splitter_property) self._toggle_splitter_widget_tree() def action_chk_btn_widget_tree_active(self, chk_btn): '''Event Handler when ActionCheckButton "Widget Tree" is activated. ''' if chk_btn.checkbox.active: self._toggle_splitter_widget_tree() add_prop = False if self.ui_creator.splitter_property.parent is not None: add_prop = True self._grid_widget_tree_parent.clear_widgets() self._grid_widget_tree_parent.add_widget(self.ui_creator.grid_widget_tree) if add_prop: self._grid_widget_tree_parent.add_widget(self.ui_creator.splitter_property) self.ui_creator.splitter_property.size_hint_y = None self.ui_creator.splitter_property.height = 300 else: self._grid_widget_tree_parent = self.ui_creator.grid_widget_tree.parent self._grid_widget_tree_parent.remove_widget(self.ui_creator.grid_widget_tree) self.ui_creator.splitter_property.size_hint_y = 1 self._toggle_splitter_widget_tree() def _toggle_splitter_widget_tree(self): '''To show/hide splitter_widget_tree ''' if self.ui_creator.splitter_widget_tree.parent is not None and\ self.ui_creator.splitter_property.parent is None and\ self.ui_creator.grid_widget_tree.parent is None: self._splitter_widget_tree_parent = self.ui_creator.splitter_widget_tree.parent self._splitter_widget_tree_parent.remove_widget(self.ui_creator.splitter_widget_tree) self._splitter_widget_tree_width = self.ui_creator.splitter_widget_tree.width self.ui_creator.splitter_widget_tree.width = 0 elif self.ui_creator.splitter_widget_tree.parent is None: self._splitter_widget_tree_parent.add_widget(self.ui_creator.splitter_widget_tree) self.ui_creator.splitter_widget_tree.width = self._splitter_widget_tree_width def action_chk_btn_status_bar_active(self, chk_btn): '''Event Handler when ActionCheckButton "StatusBar" is activated. ''' if chk_btn.checkbox.active: self._statusbar_parent.add_widget(self.statusbar) self.statusbar.height = self._statusbar_height else: self._statusbar_parent = self.statusbar.parent self._statusbar_height = self.statusbar.height self._statusbar_parent.remove_widget(self.statusbar) self.statusbar.height = 0 def action_chk_btn_kv_area_active(self, chk_btn): '''Event Handler when ActionCheckButton "KVLangArea" is activated. ''' if chk_btn.checkbox.active: self.ui_creator.splitter_kv_code_input.height = self._kv_area_height self._kv_area_parent.add_widget(self.ui_creator.splitter_kv_code_input) else: self._kv_area_parent = self.ui_creator.splitter_kv_code_input.parent self._kv_area_height = self.ui_creator.splitter_kv_code_input.height self.ui_creator.splitter_kv_code_input.height = 0 self._kv_area_parent.remove_widget(self.ui_creator.splitter_kv_code_input) def _error_adding_file(self, *args): '''Event Handler for 'on_error' event of self._add_file_dlg ''' self.statusbar.show_message('Error while adding file to project') self._popup.dismiss() def _added_file(self, *args): '''Event Handler for 'on_added' event of self._add_file_dlg ''' self.statusbar.show_message('File successfully added to project') self._popup.dismiss() if self._add_file_dlg.target_file[3:] == '.py': self.designer_content.add_file_to_tree_view( self._add_file_dlg.target_file) def action_btn_add_file_pressed(self, *args): '''Event Handler when ActionButton "Add File" is pressed. ''' self._add_file_dlg = AddFileDialog(self.project_loader) self._add_file_dlg.bind(on_added=self._added_file, on_error=self._error_adding_file, on_cancel=self._cancel_popup) self._popup = Popup(title="Add File", content = self._add_file_dlg, size_hint=(None, None), size=(400, 300), auto_dismiss=False) self._popup.open() def action_btn_project_pref_pressed(self, *args): '''Event Handler when ActionButton "Project Prefences" is pressed. ''' self.proj_settings = ProjectSettings(proj_loader=self.project_loader) self.proj_settings.load_proj_settings() self.proj_settings.bind(on_close=self._cancel_popup) self._popup = Popup(title="Project Preferences", content = self.proj_settings, size_hint=(None, None), size=(600, 400), auto_dismiss=False) self._popup.open() def action_btn_run_project_pressed(self, *args): '''Event Handler when ActionButton "Run" is pressed. ''' if self.project_loader.file_list == []: return args = '' envs = '' python_path = self.designer_settings.config_parser.getdefault( 'global', 'python_shell_path', '') if python_path == '': self.statusbar.show_message("Python Shell Path not specified," " please specify it before running" " project") return if self.proj_settings and self.proj_settings.config_parser: args = self.proj_settings.config_parser.getdefault('arguments', 'arg', '') envs = self.proj_settings.config_parser.getdefault('env variables', 'env', '') for env in envs.split(' '): self.ui_creator.kivy_console.environment[env[:env.find('=')]] = env[env.find('=')+1:] for _file in self.project_loader.file_list: if 'main.py' in os.path.basename(_file): self.ui_creator.kivy_console.stdin.write('%s %s %s'% (python_path, _file, args)) self.ui_creator.tab_pannel.switch_to( self.ui_creator.tab_pannel.tab_list[2]) return self.ui_creator.kivy_console.stdin.write('%s %s %s'% (python_path, self.project_loader._app_file, args)) self.ui_creator.tab_pannel.switch_to( self.ui_creator.tab_pannel.tab_list[2]) def on_sandbox_getting_exception(self, *args): '''Event Handler for :class:`~designer.uix.designer_sandbox.DesignerSandbox` on_getting_exception event. This function will add exception string in error_console. ''' s = traceback.format_list(traceback.extract_tb( self.ui_creator.playground.sandbox.tb)) s = '\n'.join(s) to_insert = "Exception:\n" + s + '\n' + \ "{!r}".format(self.ui_creator.playground.sandbox.exception) text = self.ui_creator.error_console.text + to_insert + '\n\n' self.ui_creator.error_console.text = text if self.ui_creator.playground.sandbox.error_active: self.ui_creator.tab_pannel.switch_to( self.ui_creator.tab_pannel.tab_list[0]) self.ui_creator.playground.sandbox.error_active = False
class AddFileDialog(BoxLayout): '''AddFileDialog is a dialog for adding files to current project. It emits 'on_added' event if file has been added successfully, 'on_error' if there has been some error in adding file and 'on_cancel' when user wishes to cancel the operation. ''' text_file = ObjectProperty() '''An instance to TextInput showing file path to be added. :data:`text_file` is a :class:`~kivy.properties.ObjectProperty` ''' text_folder = ObjectProperty() '''An instance to TextInput showing folder where file has to be added. :data:`text_folder` is a :class:`~kivy.properties.ObjectProperty` ''' lbl_error = ObjectProperty() '''An instance to Label to display errors. :data:`lbl_error` is a :class:`~kivy.properties.ObjectProperty` ''' __events__ = ('on_cancel', 'on_added', 'on_error') def __init__(self, project, **kwargs): super(AddFileDialog, self).__init__(**kwargs) self.project = project self._popup = None self._fbrowser = None def on_cancel(self): pass def on_added(self): pass def on_error(self): pass @ignore_proj_watcher def _perform_add_file(self): '''To copy file from its original path to new path ''' if self.text_file.text == '': self.lbl_error.text = "Select the File" return target_folder = self.text_folder.text folder = os.path.join(self.project.path, target_folder) if not os.path.exists(folder): os.mkdir(folder) if os.path.exists(os.path.join(folder, os.path.basename(self.text_file.text))): self.lbl_error.text = "There is a file with the same name!" return try: shutil.copy(self.text_file.text, os.path.join(folder, os.path.basename(self.text_file.text))) self.dispatch('on_added') except (OSError, IOError): self.dispatch('on_error') def _cancel_popup(self, *args): '''To dismiss popup when cancel is pressed. ''' self._popup.dismiss() def _file_load(self, instance): '''To set the text of text_file, to the file selected. ''' self._popup.dismiss() if instance.selection: self.text_file.text = instance.selection[0] def open_file_btn_pressed(self, *args): '''To load File Browser for selected file when 'Open File' is clicked ''' self._fbrowser = FileBrowser(select_string='Open') self._fbrowser.bind(on_success=self._file_load, on_canceled=self._cancel_popup) self._popup = Popup(title='Open File', content=self._fbrowser, size_hint=(0.9, 0.9), auto_dismiss=False) self._popup.open() def _folder_load(self, instance): '''To set the text of text_folder, to the folder selected. ''' if hasattr(self, '_popup'): self._popup.dismiss() if instance.ids.tabbed_browser.current_tab.text == 'List View': proj_dir = instance.ids.list_view.path else: proj_dir = instance.ids.icon_view.path proj_dir = os.path.join(proj_dir, instance.filename) target_dir = self.project.path if os.path.isdir(proj_dir): target_dir = os.path.relpath(proj_dir, self.project.path) elif os.path.isfile(proj_dir): proj_dir = os.path.dirname(proj_dir) target_dir = os.path.relpath(proj_dir, self.project.path) self.text_folder.text = target_dir def open_folder_btn_pressed(self, *args): '''To load File Browser for selected folder when 'Open Folder' is clicked ''' self._fbrowser = FileBrowser(select_string='Open Folder') self._fbrowser.ids.list_view.path = self.project.path self._fbrowser.bind(on_success=self._folder_load, on_canceled=self._cancel_popup) self._popup = Popup(title='Open Folder', content=self._fbrowser, size_hint=(0.9, 0.9), auto_dismiss=False) self._popup.open()
class AddFileDialog(BoxLayout): '''AddFileDialog is a dialog for adding files to current project. It emits 'on_added' event if file has been added successfully, 'on_error' if there has been some error in adding file and 'on_cancel' when user wishes to cancel the operation. ''' text_file = ObjectProperty() '''An instance to TextInput showing file path to be added. :data:`text_file` is a :class:`~kivy.properties.ObjectProperty` ''' text_folder = ObjectProperty() '''An instance to TextInput showing folder where file has to be added. :data:`text_folder` is a :class:`~kivy.properties.ObjectProperty` ''' always_check = ObjectProperty() '''An instance to :class:`~kivy.uix.checkbox.CheckBox`, which will determine whether same folder will be used for all files of same type or not. :data:`always_check` is a :class:`~kivy.properties.ObjectProperty` ''' lbl_error = ObjectProperty() '''An instance to Label to display errors. :data:`lbl_error` is a :class:`~kivy.properties.ObjectProperty` ''' __events__ = ('on_cancel', 'on_added', 'on_error') def __init__(self, project, **kwargs): super(AddFileDialog, self).__init__(**kwargs) self.project = project def on_cancel(self): pass def on_added(self): pass def on_error(self): pass @ignore_proj_watcher def _perform_add_file(self): '''To copy file from its original path to new path ''' if self.text_file.text == '': self.lbl_error.text = "Select the File" return target_folder = self.text_folder.text folder = os.path.join(self.project.path, target_folder) if not os.path.exists(folder): os.mkdir(folder) if os.path.exists(os.path.join(folder, os.path.basename(self.text_file.text))): self.lbl_error.text = "There is a file with the same name!" return try: shutil.copy(self.text_file.text, os.path.join(folder, os.path.basename(self.text_file.text))) self.dispatch('on_added') except (OSError, IOError): self.dispatch('on_error') def _cancel_popup(self, *args): '''To dismiss popup when cancel is pressed. ''' self._popup.dismiss() def _file_load(self, instance): '''To set the text of text_file, to the file selected. ''' self._popup.dismiss() if instance.selection != []: self.text_file.text = instance.selection[0] def open_file_btn_pressed(self, *args): '''To load File Browser for selected file when 'Open File' is clicked ''' self._fbrowser = FileBrowser(select_string='Open') self._fbrowser.bind(on_success=self._file_load, on_canceled=self._cancel_popup) self._popup = Popup(title='Open File', content=self._fbrowser, size_hint=(0.9, 0.9), auto_dismiss=False) self._popup.open() def _folder_load(self, instance): '''To set the text of text_folder, to the folder selected. ''' if hasattr(self, '_popup'): self._popup.dismiss() if instance.ids.tabbed_browser.current_tab.text == 'List View': proj_dir = instance.ids.list_view.path else: proj_dir = instance.ids.icon_view.path proj_dir = os.path.join(proj_dir, instance.filename) target_dir = self.project.path if os.path.isdir(proj_dir): target_dir = os.path.relpath(proj_dir, self.project.path) elif os.path.isfile(proj_dir): proj_dir = os.path.dirname(proj_dir) target_dir = os.path.relpath(proj_dir, self.project.path) self.text_folder.text = target_dir def open_folder_btn_pressed(self, *args): '''To load File Browser for selected folder when 'Open Folder' is clicked ''' self._fbrowser = FileBrowser(select_string='Open Folder') self._fbrowser.ids.list_view.path = self.project.path self._fbrowser.bind(on_success=self._folder_load, on_canceled=self._cancel_popup) self._popup = Popup(title='Open Folder', content=self._fbrowser, size_hint=(0.9, 0.9), auto_dismiss=False) self._popup.open()
def on_enter(self): user_path = '' browser = FileBrowser(select_string="Select", dirselect=True) browser.bind(on_success=self.storefilepath, on_canceled=self.canceled) self.add_widget(browser)
class AddFileDialog(BoxLayout): """AddFileDialog is a dialog for adding files to current project. It emits 'on_added' event if file has been added successfully, 'on_error' if there has been some error in adding file and 'on_cancel' when user wishes to cancel the operation. """ text_file = ObjectProperty() """An instance to TextInput showing file path to be added. :data:`text_file` is a :class:`~kivy.properties.ObjectProperty` """ text_folder = ObjectProperty() """An instance to TextInput showing folder where file has to be added. :data:`text_folder` is a :class:`~kivy.properties.ObjectProperty` """ always_check = ObjectProperty() """An instance to :class:`~kivy.uix.checkbox.CheckBox`, which will determine whether same folder will be used for all files of same type or not. :data:`always_check` is a :class:`~kivy.properties.ObjectProperty` """ lbl_error = ObjectProperty() """An instance to Label to display errors. :data:`lbl_error` is a :class:`~kivy.properties.ObjectProperty` """ __events__ = ("on_cancel", "on_added", "on_error") def __init__(self, project, **kwargs): super(AddFileDialog, self).__init__(**kwargs) self.project = project def on_cancel(self): pass def on_added(self): pass def on_error(self): pass @ignore_proj_watcher def _perform_add_file(self): """To copy file from its original path to new path """ if self.text_file.text == "": self.lbl_error.text = "Select the File" return target_folder = self.text_folder.text folder = os.path.join(self.project.path, target_folder) if not os.path.exists(folder): os.mkdir(folder) if os.path.exists(os.path.join(folder, os.path.basename(self.text_file.text))): self.lbl_error.text = "There is a file with the same name!" return try: shutil.copy(self.text_file.text, os.path.join(folder, os.path.basename(self.text_file.text))) self.dispatch("on_added") except (OSError, IOError): self.dispatch("on_error") def _cancel_popup(self, *args): """To dismiss popup when cancel is pressed. """ self._popup.dismiss() def _file_load(self, instance): """To set the text of text_file, to the file selected. """ self._popup.dismiss() if instance.selection != []: self.text_file.text = instance.selection[0] def open_file_btn_pressed(self, *args): """To load File Browser for selected file when 'Open File' is clicked """ self._fbrowser = FileBrowser(select_string="Open") self._fbrowser.bind(on_success=self._file_load, on_canceled=self._cancel_popup) self._popup = Popup(title="Open File", content=self._fbrowser, size_hint=(0.9, 0.9), auto_dismiss=False) self._popup.open() def _folder_load(self, instance): """To set the text of text_folder, to the folder selected. """ if hasattr(self, "_popup"): self._popup.dismiss() if instance.ids.tabbed_browser.current_tab.text == "List View": proj_dir = instance.ids.list_view.path else: proj_dir = instance.ids.icon_view.path proj_dir = os.path.join(proj_dir, instance.filename) target_dir = self.project.path if os.path.isdir(proj_dir): target_dir = os.path.relpath(proj_dir, self.project.path) elif os.path.isfile(proj_dir): proj_dir = os.path.dirname(proj_dir) target_dir = os.path.relpath(proj_dir, self.project.path) self.text_folder.text = target_dir def open_folder_btn_pressed(self, *args): """To load File Browser for selected folder when 'Open Folder' is clicked """ self._fbrowser = FileBrowser(select_string="Open Folder") self._fbrowser.ids.list_view.path = self.project.path self._fbrowser.bind(on_success=self._folder_load, on_canceled=self._cancel_popup) self._popup = Popup(title="Open Folder", content=self._fbrowser, size_hint=(0.9, 0.9), auto_dismiss=False) self._popup.open()
class AddFileDialog(BoxLayout): '''AddFileDialog is a dialog for adding files to current project. It emits 'on_added' event if file has been added successfully, 'on_error' if there has been some error in adding file and 'on_cancel' when user wishes to cancel the operation. ''' text_file = ObjectProperty() '''An instance to TextInput showing file path to be added. :data:`text_file` is a :class:`~kivy.properties.ObjectProperty` ''' text_folder = ObjectProperty() '''An instance to TextInput showing folder where file has to be added. :data:`text_folder` is a :class:`~kivy.properties.ObjectProperty` ''' always_check = ObjectProperty() '''An instance to :class:`~kivy.uix.checkbox.CheckBox`, which will determine whether same folder will be used for all files of same type or not. :data:`always_check` is a :class:`~kivy.properties.ObjectProperty` ''' lbl_error = ObjectProperty() '''An instance to Label to display errors. :data:`lbl_error` is a :class:`~kivy.properties.ObjectProperty` ''' __events__ = ('on_cancel', 'on_added', 'on_error') def __init__(self, proj_loader, **kwargs): super(AddFileDialog, self).__init__(**kwargs) self.proj_loader = proj_loader def on_cancel(self): pass def on_added(self): pass def on_error(self): pass def _perform_add_file(self): '''To copy file from its original path to new path ''' if self.text_file.text == '': self.lbl_error.text = "Select the File" return self.proj_loader.proj_watcher.stop() target_folder = "" if self.text_folder.text == "." \ else self.text_folder.text folder = os.path.join(self.proj_loader.proj_dir, target_folder) if not os.path.exists(folder): os.mkdir(folder) if os.path.exists(os.path.join(folder, os.path.basename(self.text_file.text))): self.lbl_error.text = "There is a file with the same name!" return try: shutil.copy(self.text_file.text, os.path.join(folder, os.path.basename(self.text_file.text))) if self.always_check.active: self.proj_loader.add_dir_for_file_type( self.text_file.text[self.text_file.text.rfind('.') + 1:], target_folder) self.proj_loader.proj_watcher.start_watching( self.proj_loader.proj_dir) self.dispatch('on_added') except (OSError, IOError): self.dispatch('on_error') def update_from_file(self, *args): '''To determine the folder associated with current file type. ''' curr_type = self.text_file.text curr_type = curr_type[curr_type.find('.') + 1:] if curr_type == '': return try: folder = self.proj_loader.dict_file_type_and_path[curr_type] self.text_folder.text = folder self.always_check.active = True except KeyError: pass def _cancel_popup(self, *args): '''To dismiss popup when cancel is pressed. ''' self._popup.dismiss() def _file_load(self, instance): '''To set the text of text_file, to the file selected. ''' self._popup.dismiss() if instance.selection != []: self.text_file.text = instance.selection[0] def open_file_btn_pressed(self, *args): '''To load File Browser for selected file when 'Open File' is clicked ''' self._fbrowser = FileBrowser(select_string='Open') self._fbrowser.bind(on_success=self._file_load, on_canceled=self._cancel_popup) self._popup = Popup(title='Open File', content=self._fbrowser, size_hint=(0.9, 0.9), auto_dismiss=False) self._popup.open() def _folder_load(self, instance): '''To set the text of text_folder, to the folder selected. ''' if hasattr(self, '_popup'): self._popup.dismiss() if instance.ids.tabbed_browser.current_tab.text == 'List View': proj_dir = instance.ids.list_view.path else: proj_dir = instance.ids.icon_view.path proj_dir = os.path.join(proj_dir, instance.filename) target_dir = self.proj_loader.proj_dir if os.path.isdir(proj_dir): target_dir = os.path.relpath(proj_dir, self.proj_loader.proj_dir) elif os.path.isfile(proj_dir): proj_dir = os.path.dirname(proj_dir) target_dir = os.path.relpath(proj_dir, self.proj_loader.proj_dir) self.text_folder.text = target_dir def open_folder_btn_pressed(self, *args): '''To load File Browser for selected folder when 'Open Folder' is clicked ''' self._fbrowser = FileBrowser(select_string='Open Folder') self._fbrowser.ids.list_view.path = self.proj_loader.proj_dir self._fbrowser.bind(on_success=self._folder_load, on_canceled=self._cancel_popup) self._popup = Popup(title='Open Folder', content=self._fbrowser, size_hint=(0.9, 0.9), auto_dismiss=False) self._popup.open()
def build_browser(self, **kwargs): kwargs.setdefault('select_string', self.get_select_string()) kwargs.setdefault('path', self.last_path) kwargs.setdefault('filters', self.get_filters()) return FileBrowser(**kwargs)
class AddFileDialog(BoxLayout): '''AddFileDialog is a dialog for adding files to current project. It emits 'on_added' event if file has been added successfully, 'on_error' if there has been some error in adding file and 'on_cancel' when user wishes to cancel the operation. ''' text_file = ObjectProperty() '''An instance to TextInput showing file path to be added. :data:`text_file` is a :class:`~kivy.properties.ObjectProperty` ''' text_folder = ObjectProperty() '''An instance to TextInput showing folder where file has to be added. :data:`text_folder` is a :class:`~kivy.properties.ObjectProperty` ''' always_check = ObjectProperty() '''An instance to :class:`~kivy.uix.checkbox.CheckBox`, which will determine whether same folder will be used for all files of same type or not. :data:`always_check` is a :class:`~kivy.properties.ObjectProperty` ''' __events__ = ('on_cancel', 'on_added', 'on_error') def __init__(self, proj_loader, **kwargs): super(AddFileDialog, self).__init__(**kwargs) self.proj_loader = proj_loader def on_cancel(self): pass def on_added(self): pass def on_error(self): pass def _perform_add_file(self): '''To copy file from its original path to new path ''' if self.text_file.text == '' or self.text_folder.text == '': return self.proj_loader.proj_watcher.stop() folder = os.path.join(self.proj_loader.proj_dir, self.text_folder.text) if not os.path.exists(folder): os.mkdir(folder) try: shutil.copy( self.text_file.text, os.path.join(folder, os.path.basename(self.text_file.text))) if self.always_check.active: self.proj_loader.add_dir_for_file_type( self.text_file.text[self.text_file.text.rfind('.') + 1:], self.text_folder.text) self.proj_loader.proj_watcher.start_watching( self.proj_loader.proj_dir) self.dispatch('on_added') except (OSError, IOError): self.dispatch('on_error') def update_from_file(self, *args): '''To determine the folder associated with current file type. ''' curr_type = self.text_file.text curr_type = curr_type[curr_type.find('.') + 1:] if curr_type == '': return try: folder = self.proj_loader.dict_file_type_and_path[curr_type] self.text_folder.text = folder self.always_check.active = True except KeyError: pass def _cancel_popup(self, *args): '''To dismiss popup when cancel is pressed. ''' self._popup.dismiss() def _file_load(self, instance): '''To set the text of text_file, to the file selected. ''' self._popup.dismiss() if instance.selection != []: self.text_file.text = instance.selection[0] def open_file_btn_pressed(self, *args): '''To load File Browser for selected file when 'Open File' is clicked ''' self._fbrowser = FileBrowser(select_string='Open') self._fbrowser.bind(on_success=self._file_load, on_canceled=self._cancel_popup) self._popup = Popup(title='Open File', content=self._fbrowser, size_hint=(0.9, 0.9), auto_dismiss=False) self._popup.open() def _folder_load(self, instance): '''To set the text of text_folder, to the folder selected. ''' if hasattr(self, '_popup'): self._popup.dismiss() proj_dir = '' if instance.ids.tabbed_browser.current_tab.text == 'List View': proj_dir = instance.ids.list_view.path else: proj_dir = instance.ids.icon_view.path proj_dir = os.path.join(proj_dir, instance.filename) if proj_dir.find(self.proj_loader.proj_dir) != -1: proj_dir = proj_dir.replace(self.proj_loader.proj_dir, '') if proj_dir[0] == '/': proj_dir = proj_dir[1:] self.text_folder.text = proj_dir def open_folder_btn_pressed(self, *args): '''To load File Browser for selected folder when 'Open Folder' is clicked ''' self._fbrowser = FileBrowser(select_string='Open') self._fbrowser.ids.list_view.path = self.proj_loader.proj_dir self._fbrowser.bind(on_success=self._folder_load, on_canceled=self._cancel_popup) self._popup = Popup(title='Open File', content=self._fbrowser, size_hint=(0.9, 0.9), auto_dismiss=False) self._popup.open()
def __init__(self, **kwargs): super(MainScreen, self).__init__(**kwargs) #Callback Methods def analyzeButtonCallback(instance): print('analyze button was pressed') self.current = 'Setup' def exitButtonCallback(instance): print('exit button was pressed') def browseInputButtonCallback(instance): print('browse button was pressed') self.current = 'input' def fbrowser_canceled(instance): print 'cancelled, Close self.' def fbrowser_success(instance): projectTextInput.text = str(instance.selection) self.current = 'Setup' self.transition = NoTransition() #Labels welcomeLabel = Label(text='Clone Detective', halign='center', font_size=72, pos=(5, -10)) #Buttons analyzeButton = Button(text='New Analysis', pos=(170, 100), font_size=14, size_hint=(.2, .1)) analyzeButton.bind(on_press=analyzeButtonCallback) exitButton = Button(text='Exit', pos=(450, 100), font_size=14, size_hint=(.2, .1)) exitButton.bind(on_press=exitButtonCallback) #Welcome screen layout = BoxLayout(orientation='vertical') layout2 = BoxLayout(orientation='horizontal') layout.add_widget(welcomeLabel) layout2.add_widget(analyzeButton) layout2.add_widget(exitButton) layout.add_widget(layout2) WelcomeScreen = Screen(name='Welcome') WelcomeScreen.add_widget(layout) #Setup screen layout3 = BoxLayout(orientation='vertical') browseInputLabel = Label(text='Input Project', halign='center', valign='middle', font_size=72, pos=(5, -10)) projectTextInput = TextInput(text="path to input project goes here") browseInputButton = Button(text='Browse', pos=(450, 100), font_size=14, size_hint=(.2, .1)) browseInputButton.bind(on_press=browseInputButtonCallback) layout4 = BoxLayout(orientation='horizontal') layout4.add_widget(browseInputLabel) layout4.add_widget(projectTextInput) layout4.add_widget(browseInputButton) layout3.add_widget(layout4) SetupScreen = Screen(name='Setup') SetupScreen.add_widget(layout3) #InputBrowserScreen if platform == 'win': user_path = dirname(expanduser('~')) + sep + 'Documents' else: user_path = expanduser('~') + sep + 'Documents' InputBrowserScreen = Screen(name='input') inputFileBrowser = FileBrowser(select_string='Select', favorites=[(user_path, 'Documents')]) inputFileBrowser.bind(on_success=fbrowser_success, on_canceled=fbrowser_canceled) InputBrowserScreen.add_widget(inputFileBrowser) #Status Screen StatusScreen = Screen(name='Analysis In Progress') #Report Screen ReportScreen = Screen(name='Report') #Add screens to the screen manager self.add_widget(WelcomeScreen) self.add_widget(SetupScreen) self.add_widget(InputBrowserScreen) self.add_widget(StatusScreen) self.add_widget(ReportScreen) #Set the initial screen self.current = 'Welcome'
class Designer(FloatLayout): '''Designer is the Main Window class of Kivy Designer :data:`message` is a :class:`~kivy.properties.StringProperty` ''' designer_console = ObjectProperty(None) '''Instance of :class:`designer.designer_console.ConsoleDialog` ''' statusbar = ObjectProperty(None) '''Reference to the :class:`~designer.statusbar.StatusBar` instance. :data:`statusbar` is a :class:`~kivy.properties.ObjectProperty` ''' editcontview = ObjectProperty(None) '''Reference to the :class:`~designer.uix.EditContView` instance. :data:`v` is a :class:`~kivy.properties.ObjectProperty` ''' actionbar = ObjectProperty(None) '''Reference to the :class:`~kivy.actionbar.ActionBar` instance. ActionBar is used as a MenuBar to display bunch of menu items. :data:`actionbar` is a :class:`~kivy.properties.ObjectProperty` ''' undo_manager = ObjectProperty(UndoManager()) '''Reference to the :class:`~designer.UndoManager` instance. :data:`undo_manager` is a :class:`~kivy.properties.ObjectProperty` ''' project_watcher = ObjectProperty(None) '''Reference to the :class:`~designer.project_watcher.ProjectWatcher`. :data:`project_watcher` is a :class:`~kivy.properties.ObjectProperty` ''' project_loader = ObjectProperty(None) '''Reference to the :class:`~designer.project_loader.ProjectLoader`. :data:`project_loader` is a :class:`~kivy.properties.ObjectProperty` ''' proj_settings = ObjectProperty(None) '''Reference of :class:`~designer.project_settings.ProjectSettings`. :data:`proj_settings` is a :class:`~kivy.properties.ObjectProperty` ''' _curr_proj_changed = BooleanProperty(False) '''Specifies whether current project has been changed inside Kivy Designer :data:`_curr_proj_changed` is a :class:`~kivy.properties.BooleanProperty` ''' _proj_modified_outside = BooleanProperty(False) '''Specifies whether current project has been changed outside Kivy Designer :data:`_proj_modified_outside` is a :class:`~kivy.properties.BooleanProperty` ''' ui_creator = ObjectProperty(None) '''Reference to :class:`~designer.ui_creator.UICreator` instance. :data:`ui_creator` is a :class:`~kivy.properties.ObjectProperty` ''' designer_content = ObjectProperty(None) '''Reference to :class:`~designer.designer_content.DesignerContent` instance. :data:`designer_content` is a :class:`~kivy.properties.ObjectProperty` ''' proj_tree_view = ObjectProperty(None) '''Reference to Project Tree instance :data:`proj_tree_view` is a :class:`~kivy.properties.ObjectProperty` ''' designer_settings = ObjectProperty(None) '''Reference of :class:`~designer.designer_settings.DesignerSettings`. :data:`designer_settings` is a :class:`~kivy.properties.ObjectProperty` ''' start_page = ObjectProperty(None) '''Reference of :class:`~designer.start_page.DesignerStartPage`. :data:`start_page` is a :class:`~kivy.properties.ObjectProperty` ''' recent_files_cont_menu = ObjectProperty(None) '''The context sub menu, containing the recently opened/saved projects. Reference of :class:`~designer.uix.contextual.ContextSubMenu`. :data:`recent_files_cont_menu` is a :class:`~kivy.properties.ObjectProperty` ''' def __init__(self, **kwargs): super(Designer, self).__init__(**kwargs) self.project_watcher = ProjectWatcher(self.project_modified) self.project_loader = ProjectLoader(self.project_watcher) self.recent_manager = RecentManager() self.widget_to_paste = None self.designer_content = DesignerContent(size_hint=(1, None)) self.designer_settings = DesignerSettings() self.designer_settings.bind(on_config_change=self._config_change) self.designer_settings.load_settings() self.designer_settings.bind(on_close=self._cancel_popup) Clock.schedule_interval( self.project_loader.perform_auto_save, int( self.designer_settings.config_parser.getdefault( 'global', 'auto_save_time', 5)) * 60) def show_help(self, *args): '''Event handler for 'on_help' event of self.start_page ''' self.help_dlg = HelpDialog() self._popup = Popup(title='Kivy Designer Help', content=self.help_dlg, size_hint=(0.95, 0.95), auto_dismiss=False) self._popup.open() self.help_dlg.bind(on_cancel=self._cancel_popup) self.help_dlg.rst.source = 'help.rst' def _config_change(self, *args): '''Event Handler for 'on_config_change' event of self.designer_settings. ''' Clock.unschedule(self.project_loader.perform_auto_save) Clock.schedule_interval( self.project_loader.perform_auto_save, int( self.designer_settings.config_parser.getdefault( 'global', 'auto_save_time', 5)) * 60) self.ui_creator.kv_code_input.reload_kv = \ bool(self.designer_settings.config_parser.getdefault( 'global', 'reload_kv', True)) self.recent_manager.max_recent_files = \ int(self.designer_settings.config_parser.getdefault( 'global', 'num_recent_files', 5)) def _add_designer_content(self): '''Add designer_content to Designer, when a project is loaded ''' for _child in self.children[:]: if _child == self.designer_content: return self.remove_widget(self.start_page) self.add_widget(self.designer_content, 1) self.ids['actn_btn_save'].disabled = False self.ids['actn_btn_save_as'].disabled = False self.ids['actn_chk_proj_tree'].disabled = False self.ids['actn_chk_prop_event'].disabled = False self.ids['actn_chk_widget_tree'].disabled = False self.ids['actn_chk_status_bar'].disabled = False self.ids['actn_chk_kv_lang_area'].disabled = False self.ids['actn_btn_add_file'].disabled = False self.ids['actn_btn_custom_widget'].disabled = False self.ids['actn_btn_proj_pref'].disabled = False self.ids['actn_btn_run_proj'].disabled = False def on_statusbar_height(self, *args): '''Callback for statusbar.height ''' self.designer_content.y = self.statusbar.height self.on_height(*args) def on_actionbar_height(self, *args): '''Callback for actionbar.height ''' self.on_height(*args) def on_height(self, *args): '''Callback for self.height ''' if self.actionbar and self.statusbar: self.designer_content.height = self.height - \ self.actionbar.height - self.statusbar.height self.designer_content.y = self.statusbar.height def project_modified(self, *args): '''Event Handler called when Project is modified outside Kivy Designer ''' #To dispatch modified event only once for all files/folders of proj_dir if self._proj_modified_outside: return self._confirm_dlg = ConfirmationDialog( message="Current Project has been modified\n" "outside the Kivy Designer.\nDo you want to reload project?") self._confirm_dlg.bind(on_ok=self._perform_reload, on_cancel=self._cancel_popup) self._popup = Popup(title='Kivy Designer', content=self._confirm_dlg, size_hint=(None, None), size=('200pt', '150pt'), auto_dismiss=False) self._popup.open() self._proj_modified_outside = True def _perform_reload(self, *args): '''Perform reload of project after it is modified ''' #Perform reload of project after it is modified self._popup.dismiss() self.project_watcher.allow_event_dispatch = False self._perform_open(self.project_loader.proj_dir) self.project_watcher.allow_event_dispatch = True self._proj_modified_outside = False def on_show_edit(self, *args): '''Event Handler of 'on_show_edit' event. This will show EditContView in ActionBar ''' if isinstance(self.actionbar.children[0], EditContView): return if self.editcontview is None: self.editcontview = EditContView( on_undo=self.action_btn_undo_pressed, on_redo=self.action_btn_redo_pressed, on_cut=self.action_btn_cut_pressed, on_copy=self.action_btn_copy_pressed, on_paste=self.action_btn_paste_pressed, on_delete=self.action_btn_delete_pressed, on_selectall=self.action_btn_select_all_pressed, on_next_screen=self._next_screen, on_prev_screen=self._prev_screen) self.actionbar.add_widget(self.editcontview) widget = self.ui_creator.propertyviewer.widget if isinstance(widget, Carousel) or\ isinstance(widget, ScreenManager) or\ isinstance(widget, TabbedPanel): self.editcontview.show_action_btn_screen(True) else: self.editcontview.show_action_btn_screen(False) if self.ui_creator.kv_code_input.clicked: self._edit_selected = 'KV' elif self.ui_creator.playground.clicked: self._edit_selected = 'Play' else: self._edit_selected = 'Py' self.ui_creator.playground.clicked = False self.ui_creator.kv_code_input.clicked = False def _prev_screen(self, *args): '''Event handler for 'on_prev_screen' for self.editcontview ''' widget = self.ui_creator.propertyviewer.widget if isinstance(widget, Carousel): widget.load_previous() elif isinstance(widget, ScreenManager): widget.current = widget.previous() elif isinstance(widget, TabbedPanel): index = widget.tab_list.index(widget.current_tab) if len(widget.tab_list) <= index + 1: return widget.switch_to(widget.tab_list[index + 1]) def _next_screen(self, *args): '''Event handler for 'on_next_screen' for self.editcontview ''' widget = self.ui_creator.propertyviewer.widget if isinstance(widget, Carousel): widget.load_next() elif isinstance(widget, ScreenManager): widget.current = widget.next() elif isinstance(widget, TabbedPanel): index = widget.tab_list.index(widget.current_tab) if index == 0: return widget.switch_to(widget.tab_list[index - 1]) def on_touch_down(self, touch): '''Override of FloatLayout.on_touch_down. Used to determine where touch is down and to call self.actionbar.on_previous ''' if not isinstance(self.actionbar.children[0], EditContView) or\ self.actionbar.collide_point(*touch.pos): return super(FloatLayout, self).on_touch_down(touch) self.actionbar.on_previous(self) return super(FloatLayout, self).on_touch_down(touch) def action_btn_new_pressed(self, *args): '''Event Handler when ActionButton "New" is pressed. ''' if not self._curr_proj_changed: self._show_new_dialog() return self._confirm_dlg = ConfirmationDialog('All unsaved changes will be' ' lost.\n' 'Do you want to continue?') self._confirm_dlg.bind(on_ok=self._show_new_dialog, on_cancel=self._cancel_popup) self._popup = Popup(title='New', content=self._confirm_dlg, size_hint=(None, None), size=('200pt', '150pt'), auto_dismiss=False) self._popup.open() def _show_new_dialog(self, *args): if hasattr(self, '_popup'): self._popup.dismiss() self._new_dialog = NewProjectDialog() self._new_dialog.bind(on_select=self._perform_new, on_cancel=self._cancel_popup) self._popup = Popup(title='New Project', content=self._new_dialog, size_hint=(None, None), size=('650pt', '450pt'), auto_dismiss=False) self._popup.open() def _perform_new(self, *args): '''To load new project ''' if hasattr(self, '_popup'): self._popup.dismiss() self.cleanup() new_proj_dir = os.path.join(get_kivy_designer_dir(), NEW_PROJECT_DIR_NAME) if os.path.exists(new_proj_dir): shutil.rmtree(new_proj_dir) os.mkdir(new_proj_dir) template = self._new_dialog.adapter.selection[0].text kv_file = NEW_PROJECTS[template][0] py_file = NEW_PROJECTS[template][1] _dir = os.path.dirname(designer.__file__) _dir = os.path.split(_dir)[0] templates_dir = os.path.join(_dir, NEW_TEMPLATES_DIR) shutil.copy(os.path.join(templates_dir, py_file), os.path.join(new_proj_dir, "main.py")) shutil.copy(os.path.join(templates_dir, kv_file), os.path.join(new_proj_dir, "main.kv")) self.ui_creator.playground.sandbox.error_active = True with self.ui_creator.playground.sandbox: self.project_loader.load_new_project( os.path.join(new_proj_dir, "main.kv")) root_wigdet = self.project_loader.get_root_widget() self.ui_creator.playground.add_widget_to_parent(root_wigdet, None, from_undo=True) self.ui_creator.kv_code_input.text = \ self.project_loader.get_full_str() self.designer_content.update_tree_view(self.project_loader) self._add_designer_content() if self.project_loader.class_rules: for i, _rule in enumerate(self.project_loader.class_rules): widgets.append((_rule.name, 'custom')) self.designer_content.toolbox.add_custom() self.ui_creator.playground.sandbox.error_active = False def cleanup(self): '''To cleanup everything loaded by the current project before loading another project. ''' self.project_loader.cleanup() self.ui_creator.cleanup() self.undo_manager.cleanup() self.designer_content.toolbox.cleanup() for node in self.proj_tree_view.root.nodes[:]: self.proj_tree_view.remove_node(node) for widget in widgets[:]: if widget[1] == 'custom': widgets.remove(widget) self._curr_proj_changed = False self.ui_creator.kv_code_input.text = "" self.designer_content.tab_pannel.list_py_code_inputs = [] for th in self.designer_content.tab_pannel.tab_list[:-1]: self.designer_content.tab_pannel.remove_widget(th) def action_btn_open_pressed(self, *args): '''Event Handler when ActionButton "Open" is pressed. ''' if not self._curr_proj_changed: self._show_open_dialog() return self._confirm_dlg = ConfirmationDialog('All unsaved changes will be ' 'lost.\n' 'Do you want to continue?') self._confirm_dlg.bind(on_ok=self._show_open_dialog, on_cancel=self._cancel_popup) self._popup = Popup(title='Kivy Designer', content=self._confirm_dlg, size_hint=(None, None), size=('200pt', '150pt'), auto_dismiss=False) self._popup.open() def _show_open_dialog(self, *args): '''To show FileBrowser to "Open" a project ''' if hasattr(self, '_popup'): self._popup.dismiss() self._fbrowser = FileBrowser(select_string='Open') def_path = os.getcwd() if not self.project_loader.new_project and \ self.project_loader.proj_dir: def_path = self.project_loader.proj_dir if self._fbrowser.ids.tabbed_browser.current_tab.text == 'List View': self._fbrowser.ids.list_view.path = def_path else: self._fbrowser.ids.icon_view.path = def_path self._fbrowser.bind(on_success=self._fbrowser_load, on_canceled=self._cancel_popup) self._popup = Popup(title="Open", content=self._fbrowser, size_hint=(0.9, 0.9), auto_dismiss=False) self._popup.open() def _select_class_selected(self, *args): '''Event Handler for 'on_select' event of self._select_class ''' selection = self._select_class.listview.adapter.selection[0].text with self.ui_creator.playground.sandbox: root_widget = self.project_loader.set_root_widget(selection) self.ui_creator.playground.add_widget_to_parent(root_widget, None, from_undo=True) self.ui_creator.kv_code_input.text = \ self.project_loader.get_root_str() self._select_class_popup.dismiss() def _select_class_cancel(self, *args): '''Event Handler for 'on_cancel' event of self._select_class ''' self._select_class_popup.dismiss() def _fbrowser_load(self, instance): '''Event Handler for 'on_load' event of self._fbrowser ''' if instance.selection == []: return file_path = instance.selection[0] self._popup.dismiss() self._perform_open(file_path) def _perform_open(self, file_path): '''To open a project given by file_path ''' for widget in widgets[:]: if widget[1] == 'custom': widgets.remove(widget) self.cleanup() self.ui_creator.playground.sandbox.error_active = True root_widget = None with self.ui_creator.playground.sandbox: try: self.project_loader.load_project(file_path) if self.project_loader.class_rules: for i, _rule in enumerate(self.project_loader.class_rules): widgets.append((_rule.name, 'custom')) self.designer_content.toolbox.add_custom() #to test listview #root_wigdet = None root_wigdet = self.project_loader.get_root_widget() if not root_wigdet: #Show list box showing widgets self._select_class = SelectClass( self.project_loader.class_rules) self._select_class.bind( on_select=self._select_class_selected, on_cancel=self._select_class_cancel) self._select_class_popup = Popup( title="Select Root Widget", content=self._select_class, size_hint=(0.5, 0.5), auto_dismiss=False) self._select_class_popup.open() else: self.ui_creator.playground.add_widget_to_parent( root_wigdet, None, from_undo=True) self.ui_creator.kv_code_input.text = \ self.project_loader.get_full_str() self.recent_manager.add_file(file_path) #Record everything for later use self.project_loader.record() self.designer_content.update_tree_view(self.project_loader) self._add_designer_content() except Exception as e: self.statusbar.show_message('Cannot load Project: %s' % (str(e))) self.ui_creator.playground.sandbox.error_active = False def _cancel_popup(self, *args): '''EventHandler for all self._popup when self._popup.content emits 'on_cancel' or equivalent. ''' self._proj_modified_outside = False self._popup.dismiss() def action_btn_save_pressed(self, *args): '''Event Handler when ActionButton "Save" is pressed. ''' if self.project_loader.root_rule: try: if self.project_loader.new_project: self.action_btn_save_as_pressed() return else: self.project_loader.save_project() projdir = self.project_loader.proj_dir self.project_loader.cleanup(stop_watcher=False) self.ui_creator.playground.cleanup() self.project_loader.load_project(projdir) root_wigdet = self.project_loader.get_root_widget() self.ui_creator.playground.add_widget_to_parent( root_wigdet, None, from_undo=True, from_kv=True) self._curr_proj_changed = False self.statusbar.show_message('Project saved successfully') except: self.statusbar.show_message('Cannot save project') def action_btn_save_as_pressed(self, *args): '''Event Handler when ActionButton "Save As" is pressed. ''' if self.project_loader.root_rule: self._curr_proj_changed = False self._save_as_browser = FileBrowser(select_string='Save') def_path = os.getcwd() if not self.project_loader.new_project and \ self.project_loader.proj_dir: def_path = self.project_loader.proj_dir if self._save_as_browser.ids.tabbed_browser.current_tab.text == \ 'List View': self._save_as_browser.ids.list_view.path = def_path else: self._save_as_browser.ids.icon_view.path = def_path self._save_as_browser.bind(on_success=self._perform_save_as, on_canceled=self._cancel_popup) self._popup = Popup(title="Enter Folder Name", content=self._save_as_browser, size_hint=(0.9, 0.9), auto_dismiss=False) self._popup.open() def _perform_save_as(self, instance): '''Event handler for 'on_success' event of self._save_as_browser ''' if hasattr(self, '_popup'): self._popup.dismiss() proj_dir = '' if instance.ids.tabbed_browser.current_tab.text == 'List View': proj_dir = instance.ids.list_view.path else: proj_dir = instance.ids.icon_view.path proj_dir = os.path.join(proj_dir, instance.filename) try: self.project_loader.save_project(proj_dir) self.recent_manager.add_file(proj_dir) projdir = self.project_loader.proj_dir self.project_loader.cleanup() self.ui_creator.playground.cleanup() self.project_loader.load_project(projdir) root_wigdet = self.project_loader.get_root_widget() self.ui_creator.playground.add_widget_to_parent(root_wigdet, None, from_undo=True) self.statusbar.show_message('Project saved successfully') except: self.statusbar.show_message('Cannot save project') def action_btn_settings_pressed(self, *args): '''Event handler for 'on_release' event of DesignerActionButton "Settings" ''' self.designer_settings.parent = None self._popup = Popup(title="Kivy Designer Settings", content=self.designer_settings, size_hint=(None, None), size=(600, 400), auto_dismiss=False) self._popup.open() def action_btn_recent_files_pressed(self, *args): '''Event Handler when ActionButton "Recent Files" is pressed. ''' pass def fill_recent_menu(self, *args): '''Fill self.recent_files_cont_menu with DesignerActionButton of all Recent Files ''' recent_menu = self.recent_files_cont_menu for _file in self.recent_manager.list_files: act_btn = DesignerActionButton(text=_file, shorten=True) recent_menu.add_widget(act_btn) act_btn.bind(on_release=self._recent_file_release) def _recent_file_release(self, instance, *args): '''Event Handler for 'on_select' event of self._recent_dlg. ''' self._perform_open(instance.text) def action_btn_quit_pressed(self, *args): '''Event Handler when ActionButton "Quit" is pressed. ''' App.get_running_app().stop() def action_btn_undo_pressed(self, *args): '''Event Handler when ActionButton "Undo" is pressed. ''' if self._edit_selected == 'Play': self.undo_manager.do_undo() elif self._edit_selected == 'KV': self.ui_creator.kv_code_input.do_undo() elif self._edit_selected == 'Py': list_py = self.designer_content.tab_pannel.list_py_code_inputs for code_input in list_py: if code_input.clicked is True: code_input.clicked = False code_input.do_undo() def action_btn_redo_pressed(self, *args): '''Event Handler when ActionButton "Redo" is pressed. ''' if self._edit_selected == 'Play': self.undo_manager.do_redo() elif self._edit_selected == 'KV': self.ui_creator.kv_code_input.do_redo() elif self._edit_selected == 'Py': list_py = self.designer_content.tab_pannel.list_py_code_inputs for code_input in list_py: if code_input.clicked is True: code_input.clicked = False code_input.do_redo() def action_btn_cut_pressed(self, *args): '''Event Handler when ActionButton "Cut" is pressed. ''' if self._edit_selected == 'Play': self.ui_creator.playground.do_cut() elif self._edit_selected == 'KV': self.ui_creator.kv_code_input.do_cut() elif self._edit_selected == 'Py': list_py = self.designer_content.tab_pannel.list_py_code_inputs for code_input in list_py: if code_input.clicked is True: code_input.clicked = False code_input.do_cut() def action_btn_copy_pressed(self, *args): '''Event Handler when ActionButton "Copy" is pressed. ''' if self._edit_selected == 'Play': self.ui_creator.playground.do_copy() elif self._edit_selected == 'KV': self.ui_creator.kv_code_input.do_copy() elif self._edit_selected == 'Py': list_py = self.designer_content.tab_pannel.list_py_code_inputs for code_input in list_py: if code_input.clicked is True: code_input.clicked = False code_input.do_copy() def action_btn_paste_pressed(self, *args): '''Event Handler when ActionButton "Paste" is pressed. ''' if self._edit_selected == 'Play': self.ui_creator.playground.do_paste() elif self._edit_selected == 'KV': self.ui_creator.kv_code_input.do_paste() elif self._edit_selected == 'Py': list_py = self.designer_content.tab_pannel.list_py_code_inputs for code_input in list_py: if code_input.clicked is True: code_input.clicked = False code_input.do_paste() def action_btn_delete_pressed(self, *args): '''Event Handler when ActionButton "Delete" is pressed. ''' if self._edit_selected == 'Play': self.ui_creator.playground.do_delete() elif self._edit_selected == 'KV': self.ui_creator.kv_code_input.do_delete() elif self._edit_selected == 'Py': list_py = self.designer_content.tab_pannel.list_py_code_inputs for code_input in list_py: if code_input.clicked is True: code_input.clicked = False code_input.do_delete() def action_btn_select_all_pressed(self, *args): '''Event Handler when ActionButton "Select All" is pressed. ''' if self._edit_selected == 'Play': self.ui_creator.playground.do_select_all() elif self._edit_selected == 'KV': self.ui_creator.kv_code_input.do_select_all() elif self._edit_selected == 'Py': list_py = self.designer_content.tab_pannel.list_py_code_inputs for code_input in list_py: if code_input.clicked is True: code_input.clicked = False code_input.do_select_all() def action_btn_add_custom_widget_press(self, *args): '''Event Handler when ActionButton "Add Custom Widget" is pressed. ''' self._custom_browser = FileBrowser(select_string='Add') self._custom_browser.bind(on_success=self._custom_browser_load, on_canceled=self._cancel_popup) self._popup = Popup(title="Add Custom Widget", content=self._custom_browser, size_hint=(0.9, 0.9), auto_dismiss=False) self._popup.open() def _custom_browser_load(self, instance): '''Event Handler for 'on_success' event of self._custom_browser ''' file_path = instance.selection[0] self._popup.dismiss() self.ui_creator.playground.sandbox.error_active = True with self.ui_creator.playground.sandbox: try: self.project_loader.add_custom_widget(file_path) self.designer_content.toolbox.cleanup() for _rule in (self.project_loader.custom_widgets): widgets.append((_rule.name, 'custom')) self.designer_content.toolbox.add_custom() except ProjectLoaderException as e: self.statusbar.show_message('Cannot load widget. %s' % str(e)) self.ui_creator.playground.sandbox.error_active = False def action_chk_btn_toolbox_active(self, chk_btn): '''Event Handler when ActionCheckButton "Toolbox" is activated. ''' if chk_btn.checkbox.active: self._toolbox_parent.add_widget( self.designer_content.splitter_tree) self.designer_content.splitter_tree.width = self._toolbox_width else: self._toolbox_parent = self.designer_content.splitter_tree.parent self._toolbox_parent.remove_widget( self.designer_content.splitter_tree) self._toolbox_width = self.designer_content.splitter_tree.width self.designer_content.splitter_tree.width = 0 def action_chk_btn_property_viewer_active(self, chk_btn): '''Event Handler when ActionCheckButton "Property Viewer" is activated. ''' if chk_btn.checkbox.active: self._toggle_splitter_widget_tree() if self.ui_creator.splitter_widget_tree.parent is None: self._splitter_widget_tree_parent.add_widget( self.ui_creator.splitter_widget_tree) self.ui_creator.splitter_widget_tree.width = \ self._splitter_widget_tree_width add_tree = False if self.ui_creator.grid_widget_tree.parent is not None: add_tree = True self.ui_creator.splitter_property.size_hint_y = None self.ui_creator.splitter_property.height = 300 self._splitter_property_parent.clear_widgets() if add_tree: self._splitter_property_parent.add_widget( self.ui_creator.grid_widget_tree) self._splitter_property_parent.add_widget( self.ui_creator.splitter_property) else: self._splitter_property_parent = \ self.ui_creator.splitter_property.parent self._splitter_property_parent.remove_widget( self.ui_creator.splitter_property) self._toggle_splitter_widget_tree() def action_chk_btn_widget_tree_active(self, chk_btn): '''Event Handler when ActionCheckButton "Widget Tree" is activated. ''' if chk_btn.checkbox.active: self._toggle_splitter_widget_tree() add_prop = False if self.ui_creator.splitter_property.parent is not None: add_prop = True self._grid_widget_tree_parent.clear_widgets() self._grid_widget_tree_parent.add_widget( self.ui_creator.grid_widget_tree) if add_prop: self._grid_widget_tree_parent.add_widget( self.ui_creator.splitter_property) self.ui_creator.splitter_property.size_hint_y = None self.ui_creator.splitter_property.height = 300 else: self._grid_widget_tree_parent = \ self.ui_creator.grid_widget_tree.parent self._grid_widget_tree_parent.remove_widget( self.ui_creator.grid_widget_tree) self.ui_creator.splitter_property.size_hint_y = 1 self._toggle_splitter_widget_tree() def _toggle_splitter_widget_tree(self): '''To show/hide splitter_widget_tree ''' if self.ui_creator.splitter_widget_tree.parent is not None and\ self.ui_creator.splitter_property.parent is None and\ self.ui_creator.grid_widget_tree.parent is None: self._splitter_widget_tree_parent = \ self.ui_creator.splitter_widget_tree.parent self._splitter_widget_tree_parent.remove_widget( self.ui_creator.splitter_widget_tree) self._splitter_widget_tree_width = \ self.ui_creator.splitter_widget_tree.width self.ui_creator.splitter_widget_tree.width = 0 elif self.ui_creator.splitter_widget_tree.parent is None: self._splitter_widget_tree_parent.add_widget( self.ui_creator.splitter_widget_tree) self.ui_creator.splitter_widget_tree.width = \ self._splitter_widget_tree_width def action_chk_btn_status_bar_active(self, chk_btn): '''Event Handler when ActionCheckButton "StatusBar" is activated. ''' if chk_btn.checkbox.active: self._statusbar_parent.add_widget(self.statusbar) self.statusbar.height = self._statusbar_height else: self._statusbar_parent = self.statusbar.parent self._statusbar_height = self.statusbar.height self._statusbar_parent.remove_widget(self.statusbar) self.statusbar.height = 0 def action_chk_btn_kv_area_active(self, chk_btn): '''Event Handler when ActionCheckButton "KVLangArea" is activated. ''' if chk_btn.checkbox.active: self.ui_creator.splitter_kv_code_input.height = \ self._kv_area_height self._kv_area_parent.add_widget( self.ui_creator.splitter_kv_code_input) else: self._kv_area_parent = \ self.ui_creator.splitter_kv_code_input.parent self._kv_area_height = \ self.ui_creator.splitter_kv_code_input.height self.ui_creator.splitter_kv_code_input.height = 0 self._kv_area_parent.remove_widget( self.ui_creator.splitter_kv_code_input) def _error_adding_file(self, *args): '''Event Handler for 'on_error' event of self._add_file_dlg ''' self.statusbar.show_message('Error while adding file to project') self._popup.dismiss() def _added_file(self, *args): '''Event Handler for 'on_added' event of self._add_file_dlg ''' self.statusbar.show_message('File successfully added to project') self._popup.dismiss() if self._add_file_dlg.target_file[3:] == '.py': self.designer_content.add_file_to_tree_view( self._add_file_dlg.target_file) def action_btn_add_file_pressed(self, *args): '''Event Handler when ActionButton "Add File" is pressed. ''' self._add_file_dlg = AddFileDialog(self.project_loader) self._add_file_dlg.bind(on_added=self._added_file, on_error=self._error_adding_file, on_cancel=self._cancel_popup) self._popup = Popup(title="Add File", content=self._add_file_dlg, size_hint=(None, None), size=(400, 300), auto_dismiss=False) self._popup.open() def action_btn_project_pref_pressed(self, *args): '''Event Handler when ActionButton "Project Prefences" is pressed. ''' self.proj_settings = ProjectSettings(proj_loader=self.project_loader) self.proj_settings.load_proj_settings() self.proj_settings.bind(on_close=self._cancel_popup) self._popup = Popup(title="Project Preferences", content=self.proj_settings, size_hint=(None, None), size=(600, 400), auto_dismiss=False) self._popup.open() def action_btn_run_project_pressed(self, *args): '''Event Handler when ActionButton "Run" is pressed. ''' if self.project_loader.file_list == []: return args = '' envs = '' python_path = self.designer_settings.config_parser.getdefault( 'global', 'python_shell_path', '') if python_path == '': self.statusbar.show_message("Python Shell Path not specified," " please specify it before running" " project") return if self.proj_settings and self.proj_settings.config_parser: args = self.proj_settings.config_parser.getdefault( 'arguments', 'arg', '') envs = self.proj_settings.config_parser.getdefault( 'env variables', 'env', '') for env in envs.split(' '): self.ui_creator.kivy_console.environment[ env[:env.find('=')]] = env[env.find('=') + 1:] for _file in self.project_loader.file_list: if 'main.py' in os.path.basename(_file): self.ui_creator.kivy_console.stdin.write( '%s %s %s' % (python_path, _file, args)) self.ui_creator.tab_pannel.switch_to( self.ui_creator.tab_pannel.tab_list[2]) return self.ui_creator.kivy_console.stdin.write( '%s %s %s' % (python_path, self.project_loader._app_file, args)) self.ui_creator.tab_pannel.switch_to( self.ui_creator.tab_pannel.tab_list[2]) def on_sandbox_getting_exception(self, *args): '''Event Handler for :class:`~designer.uix.designer_sandbox.DesignerSandbox` on_getting_exception event. This function will add exception string in error_console. ''' s = traceback.format_list( traceback.extract_tb(self.ui_creator.playground.sandbox.tb)) s = '\n'.join(s) to_insert = "Exception:\n" + s + '\n' + \ "{!r}".format(self.ui_creator.playground.sandbox.exception) text = self.ui_creator.error_console.text + to_insert + '\n\n' self.ui_creator.error_console.text = text if self.ui_creator.playground.sandbox.error_active: self.ui_creator.tab_pannel.switch_to( self.ui_creator.tab_pannel.tab_list[0]) self.ui_creator.playground.sandbox.error_active = False def action_btn_about_pressed(self, *args): '''Event handler for 'on_release' event of DesignerActionButton "About Kivy Designer" ''' self.about_dlg = AboutDialog() self._popup = Popup(title='About Kivy Designer', content=self.about_dlg, size_hint=(None, None), size=(600, 400), auto_dismiss=False) self._popup.open() self.about_dlg.bind(on_cancel=self._cancel_popup)
class SessionSettings(Screen): def __init__(self, screen_manager, game_inspector): super(SessionSettings, self).__init__(name='SessionSettings') self.pid_value = None self.game_inspector = game_inspector self.default_video_hotkey = 'shift+i' self.default_screenshot_hotkey = 'shift+o' self.default_fps_hotkey = 'shift+p' self.screen_manager = screen_manager self.layout = BoxLayout(orientation='horizontal') self.first_col = BoxLayout(orientation='vertical') self.second_col = BoxLayout(orientation='vertical') self.filebrowser = FileBrowser() self.filebrowser.bind(on_success=self.fbrowser_success, on_canceled=self.fbrowser_canceled) self.first_col.add_widget(self.filebrowser) self.pid = TextInput(hint_text='PID e.g.13876 (without game overlay)', size_hint=(1, 0.1)) self.pid.bind(text=self.on_pid) self.second_col.add_widget(self.pid) self.process_path = TextInput( hint_text= 'Path to Game e.g. D:\\Steam\\steamapps\\common\\Shadow of the Tomb Raider Trial\\SOTTR.exe (will enable game overlay)', size_hint=(1, 0.1)) self.process_path.bind(text=self.on_path) self.second_col.add_widget(self.process_path) self.process_name = TextInput( hint_text= 'Process Name to Monitor e.g. SOTTR.exe (will enable game overlay)', size_hint=(1, 0.1)) self.process_name.bind(text=self.on_process_name) self.second_col.add_widget(self.process_name) self.steam_app_id = TextInput( size_hint=(1, 0.1), hint_text= 'Optional: Steam App Id e.g 974630\nOnly for Steam Games and in case if you run it for the first time\nIt works only with Path to Game param\nhttps://steamdb.info/search/' ) self.second_col.add_widget(self.steam_app_id) self.video_hotkey = TextInput( hint_text='Optional: video recording hotkey, default is %s' % self.default_video_hotkey, size_hint=(1, 0.1)) self.second_col.add_widget(self.video_hotkey) self.screenshot_hotkey = TextInput( hint_text='Optional: screenshot hotkey, default is %s' % self.default_screenshot_hotkey, size_hint=(1, 0.1)) self.second_col.add_widget(self.screenshot_hotkey) self.fps_hotkey = TextInput( hint_text='Optional: fps recording hotkey, default is %s' % self.default_fps_hotkey, size_hint=(1, 0.1)) self.second_col.add_widget(self.fps_hotkey) self.start_button = Button(text='Run Session', font_size=20, size_hint=(1, 0.3)) self.start_button.background_normal = '' self.start_button.background_color = [0.3, .4, .3, .85] self.start_button.bind(on_press=self.run_pressed) self.second_col.add_widget(self.start_button) self.layout.add_widget(self.first_col) self.layout.add_widget(self.second_col) self.add_widget(self.layout) def fbrowser_canceled(self, instance): self.process_path.text = '' def fbrowser_success(self, instance): self.process_path.text = str(instance.selection[0]) def on_pid(self, instance, value): if value: self.process_path.text = '' self.process_name.text = '' self.steam_app_id.text = '' def on_path(self, instance, value): if value: self.pid.text = '' self.process_name.text = '' def on_process_name(self, instance, value): if value: self.pid.text = '' self.process_path.text = '' self.steam_app_id.text = '' def run_pressed(self, instance): try: screen_recorder.enable_log() fps_inspector.enable_fliprate_log() ready = True if self.pid.text: self.pid_value = int(self.pid.text) screen_recorder.init_resources(self.pid_value) self.game_inspector.config.pid = self.pid_value self.game_inspector.config.use_overlay = False elif self.process_path.text: game_overlay_sdk.injector.enable_monitor_logger() if self.steam_app_id.text: game_overlay_sdk.injector.run_process( self.process_path.text, '', int(self.steam_app_id.text)) else: game_overlay_sdk.injector.run_process( self.process_path.text, '', None) self.pid_value = game_overlay_sdk.injector.get_pid() screen_recorder.init_resources(self.pid_value) self.game_inspector.config.pid = self.pid_value self.game_inspector.config.use_overlay = True elif self.process_name.text: game_overlay_sdk.injector.enable_monitor_logger() game_overlay_sdk.injector.start_monitor(self.process_name.text) # wait for process creation Alert(title='Waiting for process with name %s' % self.process_name.text, text='now you need to start target process manually', condition=self.check_pid) else: Alert( title='Invalid input', text= 'nor PID nor Process Name nor Process Path were specified') ready = False if ready: self.register_callbacks() self.screen_manager.current = 'GameInspector' except Exception as e: Alert(title='Excpetion occured', text=str(e)) raise e def register_callbacks(self): if self.video_hotkey.text: video_hotkey = self.video_hotkey.text else: video_hotkey = self.default_video_hotkey if self.screenshot_hotkey.text: screenshot_hotkey = self.screenshot_hotkey.text else: screenshot_hotkey = self.default_screenshot_hotkey if self.fps_hotkey.text: fps_hotkey = self.fps_hotkey.text else: fps_hotkey = self.default_fps_hotkey keyboard.add_hotkey(video_hotkey, self.video_callback) keyboard.add_hotkey(screenshot_hotkey, self.screenshot_callback) keyboard.add_hotkey(fps_hotkey, self.fps_callback) def video_callback(self): self.game_inspector.config.start_video.trigger_action() def fps_callback(self): self.game_inspector.config.start_fps.trigger_action() def screenshot_callback(self): self.game_inspector.config.take_screen.trigger_action() def check_pid(self): try: self.pid_value = game_overlay_sdk.injector.get_pid() self.game_inspector.config.pid = self.pid_value self.game_inspector.config.use_overlay = True return True except game_overlay_sdk.injector.InjectionError as err: if err.exit_code != game_overlay_sdk.injector.CustomExitCodes.TARGET_PROCESS_IS_NOT_CREATED_ERROR.value: raise err else: return False
def __init__(self, screen_manager, game_inspector): super(SessionSettings, self).__init__(name='SessionSettings') self.pid_value = None self.game_inspector = game_inspector self.default_video_hotkey = 'shift+i' self.default_screenshot_hotkey = 'shift+o' self.default_fps_hotkey = 'shift+p' self.screen_manager = screen_manager self.layout = BoxLayout(orientation='horizontal') self.first_col = BoxLayout(orientation='vertical') self.second_col = BoxLayout(orientation='vertical') self.filebrowser = FileBrowser() self.filebrowser.bind(on_success=self.fbrowser_success, on_canceled=self.fbrowser_canceled) self.first_col.add_widget(self.filebrowser) self.pid = TextInput(hint_text='PID e.g.13876 (without game overlay)', size_hint=(1, 0.1)) self.pid.bind(text=self.on_pid) self.second_col.add_widget(self.pid) self.process_path = TextInput( hint_text= 'Path to Game e.g. D:\\Steam\\steamapps\\common\\Shadow of the Tomb Raider Trial\\SOTTR.exe (will enable game overlay)', size_hint=(1, 0.1)) self.process_path.bind(text=self.on_path) self.second_col.add_widget(self.process_path) self.process_name = TextInput( hint_text= 'Process Name to Monitor e.g. SOTTR.exe (will enable game overlay)', size_hint=(1, 0.1)) self.process_name.bind(text=self.on_process_name) self.second_col.add_widget(self.process_name) self.steam_app_id = TextInput( size_hint=(1, 0.1), hint_text= 'Optional: Steam App Id e.g 974630\nOnly for Steam Games and in case if you run it for the first time\nIt works only with Path to Game param\nhttps://steamdb.info/search/' ) self.second_col.add_widget(self.steam_app_id) self.video_hotkey = TextInput( hint_text='Optional: video recording hotkey, default is %s' % self.default_video_hotkey, size_hint=(1, 0.1)) self.second_col.add_widget(self.video_hotkey) self.screenshot_hotkey = TextInput( hint_text='Optional: screenshot hotkey, default is %s' % self.default_screenshot_hotkey, size_hint=(1, 0.1)) self.second_col.add_widget(self.screenshot_hotkey) self.fps_hotkey = TextInput( hint_text='Optional: fps recording hotkey, default is %s' % self.default_fps_hotkey, size_hint=(1, 0.1)) self.second_col.add_widget(self.fps_hotkey) self.start_button = Button(text='Run Session', font_size=20, size_hint=(1, 0.3)) self.start_button.background_normal = '' self.start_button.background_color = [0.3, .4, .3, .85] self.start_button.bind(on_press=self.run_pressed) self.second_col.add_widget(self.start_button) self.layout.add_widget(self.first_col) self.layout.add_widget(self.second_col) self.add_widget(self.layout)
def __init__(self, **kwargs): super(MainScreen, self).__init__(**kwargs) #Main Methods def RunAnalysis(): formatted = projectTextInput.text.split("[u'")[1] formatted = formatted.split("']")[0] pathForJArchitect = formatted print "\n\n" + "pathForJArchitect = "+ pathForJArchitect + "\n\n" formatted = formatted.split("\\") arrLength = len(formatted) #print formatted #print "\n\n" pathForMetrix = "..\\" + formatted[arrLength - 5] + "\\" + formatted[arrLength - 3] print "\n\n" + "pathForMetrix = "+ pathForMetrix + "\n\n" statusLabel.text = "Running Metrix++..." print "Running Metrix++..." L1 = get_metrix(pathForMetrix) statusLabel.text = "Running JArchitect..." print "Running JArchitect..." L2 = get_jarch_metrices(pathForJArchitect) statusLabel.text = "Parsing Data..." print "Parsing Data..." CombineAndExportData(L1, L2) statusLabel.text = "Analysis Complete!" print "Analysis Complete!" #Callback Methods def analyzeButtonCallback(instance): print('analyze button was pressed') self.current = 'Setup' def exitButtonCallback(instance): print('exit button was pressed') def browseInputButtonCallback(instance): print('browse button was pressed') self.current = 'inputscreen' def browseOutputButtonCallback(instance): self.current = 'outputscreen' def runButtonCallback(instance): self.current = 'status' RunAnalysis() def viewReportButtonCallback(instance): print "View Report Button Pressed" def fbrowser_canceled(instance): print 'cancelled, Close self.' def fbrowser_success(instance): projectTextInput.text = str(instance.selection) self.current = 'Setup' def outfbrowser_success(instance): outputPathTextInput.text = str(instance.selection) self.current = 'Setup' self.transition = NoTransition() #Labels welcomeLabel = Label(text='Clone Detective', halign='center', font_size=72, pos=(5, -10)) #Buttons analyzeButton = Button(text='New Analysis', pos=(170, 100), font_size=14, size_hint = (.2,.1)) analyzeButton.bind(on_press=analyzeButtonCallback) exitButton = Button(text='Exit', pos=(450, 100), font_size=14, size_hint = (.2,.1)) exitButton.bind(on_press=exitButtonCallback) #Welcome screen layout = BoxLayout(orientation='vertical') layout2 = BoxLayout(orientation='horizontal') layout.add_widget(welcomeLabel) layout2.add_widget(analyzeButton) layout2.add_widget(exitButton) layout.add_widget(layout2) WelcomeScreen = Screen(name='Welcome') WelcomeScreen.add_widget(layout) #Setup screen #Main Layout for the setup screen mainSetupLayout = BoxLayout(orientation='vertical') #Layout that contains the widgets for the input project browseInputLabel = Label(text='Input Project', halign='center', valign='middle', font_size=24)#, pos=(5, -10)) projectTextInput = TextInput(text="path to input project goes here") browseInputButton = Button(text='Browse', pos=(450, 100), font_size=14, size_hint = (.2,.1)) browseInputButton.bind(on_press=browseInputButtonCallback) inputlayout = BoxLayout(orientation='horizontal') inputlayout.add_widget(browseInputLabel) inputlayout.add_widget(projectTextInput) inputlayout.add_widget(browseInputButton) """#Layout that contains the widgets for the output project browseOutputLabel = Label(text='Output Folder', halign='center', valign='middle', font_size=24) outputPathTextInput = TextInput(text="path to where we will create the report .csv file") browseOutputButton = Button(text='Browse', pos=(450, 100), font_size=14, size_hint = (.2,.1)) browseOutputButton.bind(on_press=browseOutputButtonCallback) outputlayout = BoxLayout(orientation='horizontal') outputlayout.add_widget(browseOutputLabel) outputlayout.add_widget(outputPathTextInput) outputlayout.add_widget(browseOutputButton)""" #Last but not least....the run button! runButton = Button(text='RUN', pos=(450, 100), font_size=14) runButton.bind(on_press=runButtonCallback) mainSetupLayout.add_widget(inputlayout) #mainSetupLayout.add_widget(outputlayout) mainSetupLayout.add_widget(runButton) #Add the mainSetupLayout to the Setup Screen SetupScreen = Screen(name='Setup') SetupScreen.add_widget(mainSetupLayout) #InputBrowserScreen if platform=='win': user_path = dirname(expanduser('~')) + sep + 'Documents' else: user_path = expanduser('~') + sep + 'Documents' InputBrowserScreen = Screen(name='inputscreen') inputFileBrowser = FileBrowser(select_string='Select', favorites=[(user_path, 'Documents')]) inputFileBrowser.bind(on_success=fbrowser_success, on_canceled=fbrowser_canceled) InputBrowserScreen.add_widget(inputFileBrowser) OutputBrowserScreen = Screen(name='outputscreen') OutputFileBrowser = FileBrowser(select_string='Select', favorites=[(user_path, 'Documents')]) OutputFileBrowser.bind(on_success=outfbrowser_success, on_canceled=fbrowser_canceled) OutputBrowserScreen.add_widget(OutputFileBrowser) #Status Screen statusLabel = Label(text='Starting Analysis....', halign='center', font_size=72, pos=(5, -10)) reportButton = Button(text='View Report', pos=(170, 100), font_size=14) reportButton.bind(on_press=viewReportButtonCallback) statusMainLayout = BoxLayout(orientation='vertical') statusSubLayout = BoxLayout(orientation='horizontal') statusMainLayout.add_widget(statusLabel) statusMainLayout.add_widget(reportButton) StatusScreen = Screen(name='status') StatusScreen.add_widget(statusMainLayout) #Add screens to the screen manager self.add_widget(WelcomeScreen) self.add_widget(SetupScreen) self.add_widget(StatusScreen) self.add_widget(InputBrowserScreen) self.add_widget(OutputBrowserScreen) #Set the initial screen self.current = 'Welcome'
class HomeWidget(FloatLayout): def __init__(self, **kwargs): # make sure we aren't overriding any important functionality super(HomeWidget, self).__init__(**kwargs) with self.canvas: self.rect = Rectangle(pos=self.pos, size=self.size) self.bind(pos=self.update_rect) self.bind(size=self.update_rect) record_stud = Button( id="record_stud", size_hint=(0.3, 0.06), pos_hint={'center_x': .5, 'center_y': .6}, text="Record the student", background_normal='', background_color=[0, 0, 0, 1] ) self.add_widget(record_stud) self.add_widget(Button( size_hint=(0.4, 0.06), pos_hint={'center_x': .5, 'center_y': .8}, text="Piano Performance Tracking", background_normal='', background_color=[0, 0, 0, 1] )) record_prof = Button( id="record_prof", size_hint=(0.35, 0.06), pos_hint={'center_x': .5, 'center_y': .5}, text="Record the professional", background_normal='', background_color=[0, 0, 0, 1] ) self.add_widget(record_prof) upload_stud = Button( id="upload_stud", size_hint=(0.4, 0.06), pos_hint={'center_x': .5, 'center_y': .4}, text="Upload the student recording", background_normal='', background_color=[0, 0, 0, 1] ) self.add_widget(upload_stud) upload_prof = Button( id="upload_prof", size_hint=(0.4, 0.06), pos_hint={'center_x': .5, 'center_y': .3}, text="Upload the professional recording", background_normal='', background_color=[0, 0, 0, 1] ) self.add_widget(upload_prof) process = Button( id="process", size_hint=(0.1, 0.06), pos_hint={'center_x': .5, 'center_y': .2}, text="Process", background_normal='', background_color=[0.5, 0.5, 0.6, 0.7] ) self.add_widget(process) quit = Button( id="quit", size_hint=(0.1, 0.06), pos_hint={'center_x': .9, 'center_y': .05}, text="Quit", background_normal='', background_color=[0.5, 0.5, 0.6, 0.7] ) process.bind(on_release=self.process_callback) quit.bind(on_release=self.quit_callback) upload_stud.bind(on_release=self.open_stud_file_btn_pressed) upload_prof.bind(on_release=self.open_prof_file_btn_pressed) record_stud.bind(on_release=self.bash_record_stud) record_prof.bind(on_release=self.bash_record_prof) self.add_widget(quit) def process_callback(self, instance): if stud_file == "" or prof_file == "": print("Select both files.") print(stud_file) print(prof_file) else: self.add_widget( process.ProcessWidget( id="process", stud=stud_file, prof=prof_file, size_hint=(1, 1), pos_hint={'center_x': .5, 'center_y': .5}) ) def quit_callback(self, instance): for file in os.listdir(os.getcwd()): if file.endswith(".pyc"): os.remove(file) quit() def bash_record_stud(self, *args): global stud_file bash_record.record_stud() stud_file = 'stud.wav' def bash_record_prof(self, *args): global prof_file bash_record.record_prof() prof_file = 'prof.wav' def open_stud_file_btn_pressed(self, *args): user_path = os.getcwd() #user_path = '~/ece5725_final_project/demo' #CHANGE USER PATH OF DOWNLOADS self._fbrowser = FileBrowser(select_string='Open', favorites=[ (user_path, 'Documents')]) self._fbrowser.bind(on_success=self._stud_file_load, on_canceled=self._cancel_popup) self._popup = Popup(title='Open File', content=self._fbrowser, size_hint=(0.9, 0.9), auto_dismiss=False) self._popup.open() def open_prof_file_btn_pressed(self, *args): self._fbrowser = FileBrowser(select_string='Open') self._fbrowser.bind(on_success=self._prof_file_load, on_canceled=self._cancel_popup) self._popup = Popup(title='Open File', content=self._fbrowser, size_hint=(0.9, 0.9), auto_dismiss=False) self._popup.open() def _cancel_popup(self, instance): print('cancelled, Close self.') self._popup.dismiss() def _stud_file_load(self, instance): print("in stud file load") global stud_file stud_file = os.path.basename(instance.filename) print(stud_file) self._popup.dismiss() def _prof_file_load(self, instance): print("in prof file load") global prof_file prof_file = os.path.basename(instance.filename) print(prof_file) self._popup.dismiss() def update_rect(self, *kargs): self.rect.pos = self.pos self.rect.size = self.size