def load_settings(self): '''This function loads project settings ''' self.config_parser = ConfigParser() DESIGNER_CONFIG = os.path.join(get_kivy_designer_dir(), DESIGNER_CONFIG_FILE_NAME) _dir = os.path.dirname(designer.__file__) _dir = os.path.split(_dir)[0] DEFAULT_CONFIG = os.path.join(_dir, DESIGNER_CONFIG_FILE_NAME) if not os.path.exists(DESIGNER_CONFIG): shutil.copyfile(DEFAULT_CONFIG, DESIGNER_CONFIG) self.config_parser.read(DESIGNER_CONFIG) self.config_parser.upgrade(DEFAULT_CONFIG) self.add_json_panel('Kivy Designer Settings', self.config_parser, os.path.join(_dir, 'designer', 'settings', 'designer_settings.json')) path = self.config_parser.getdefault( 'global', 'python_shell_path', '') if path == "": self.config_parser.set('global', 'python_shell_path', sys.executable) self.config_parser.write()
def load_settings(self): '''This function loads project settings ''' self.config_parser = ConfigParser() DESIGNER_CONFIG = os.path.join(get_kivy_designer_dir(), DESIGNER_CONFIG_FILE_NAME) _dir = os.path.dirname(designer.__file__) _dir = os.path.split(_dir)[0] DEFAULT_CONFIG = os.path.join(_dir, DESIGNER_CONFIG_FILE_NAME) if not os.path.exists(DESIGNER_CONFIG): shutil.copyfile(DEFAULT_CONFIG, DESIGNER_CONFIG) self.config_parser.read(DESIGNER_CONFIG) self.config_parser.upgrade(DEFAULT_CONFIG) self.add_json_panel( 'Kivy Designer Settings', self.config_parser, os.path.join(_dir, 'designer', 'settings', 'designer_settings.json')) path = self.config_parser.getdefault('global', 'python_shell_path', '') if path == "": self.config_parser.set('global', 'python_shell_path', sys.executable) self.config_parser.write()
def load_settings(self): '''This function loads project settings ''' self.config_parser = ConfigParser(name='DesignerSettings') DESIGNER_CONFIG = os.path.join(get_kivy_designer_dir(), DESIGNER_CONFIG_FILE_NAME) _dir = os.path.dirname(designer.__file__) _dir = os.path.split(_dir)[0] DEFAULT_CONFIG = os.path.join(_dir, DESIGNER_CONFIG_FILE_NAME) if not os.path.exists(DESIGNER_CONFIG): shutil.copyfile(DEFAULT_CONFIG, DESIGNER_CONFIG) self.config_parser.read(DESIGNER_CONFIG) self.config_parser.upgrade(DEFAULT_CONFIG) # creates a panel before insert it to update code input theme list panel = self.create_json_panel('Kivy Designer Settings', self.config_parser, os.path.join(_dir, 'designer', 'settings', 'designer_settings.json')) uid = panel.uid if self.interface is not None: self.interface.add_panel(panel, 'Kivy Designer Settings', uid) # loads available themes for child in panel.children: if child.id == 'code_input_theme_options': child.items = styles.get_all_styles() # tries to find python and buildozer path if it's not defined path = self.config_parser.getdefault( 'global', 'python_shell_path', '') if path.strip() == '': self.config_parser.set('global', 'python_shell_path', sys.executable) self.config_parser.write() buildozer_path = self.config_parser.getdefault('buildozer', 'buildozer_path', '') if buildozer_path.strip() == '': buildozer_path = find_executable('buildozer') if buildozer_path: self.config_parser.set('buildozer', 'buildozer_path', buildozer_path) self.config_parser.write() self.add_json_panel('Buildozer', self.config_parser, os.path.join(_dir, 'designer', 'settings', 'buildozer_settings.json')) self.add_json_panel('Hanga', self.config_parser, os.path.join(_dir, 'designer', 'settings', 'hanga_settings.json'))
def load_settings(self): '''This function loads project settings ''' self.config_parser = ConfigParser(name='DesignerSettings') DESIGNER_CONFIG = os.path.join(get_kivy_designer_dir(), DESIGNER_CONFIG_FILE_NAME) _dir = os.path.dirname(designer.__file__) _dir = os.path.split(_dir)[0] DEFAULT_CONFIG = os.path.join(_dir, DESIGNER_CONFIG_FILE_NAME) if not os.path.exists(DESIGNER_CONFIG): shutil.copyfile(DEFAULT_CONFIG, DESIGNER_CONFIG) self.config_parser.read(DESIGNER_CONFIG) self.config_parser.upgrade(DEFAULT_CONFIG) # creates a panel before insert it to update code input theme list panel = self.create_json_panel( 'Kivy Designer Settings', self.config_parser, os.path.join(_dir, 'designer', 'settings', 'designer_settings.json')) uid = panel.uid if self.interface is not None: self.interface.add_panel(panel, 'Kivy Designer Settings', uid) # loads available themes for child in panel.children: if child.id == 'code_input_theme_options': child.items = styles.get_all_styles() # tries to find python and buildozer path if it's not defined path = self.config_parser.getdefault('global', 'python_shell_path', '') if path.strip() == '': self.config_parser.set('global', 'python_shell_path', sys.executable) self.config_parser.write() buildozer_path = self.config_parser.getdefault('buildozer', 'buildozer_path', '') if buildozer_path.strip() == '': buildozer_path = find_executable('buildozer') if buildozer_path: self.config_parser.set('buildozer', 'buildozer_path', buildozer_path) self.config_parser.write() self.add_json_panel( 'Buildozer', self.config_parser, os.path.join(_dir, 'designer', 'settings', 'buildozer_settings.json')) self.add_json_panel( 'Hanga', self.config_parser, os.path.join(_dir, 'designer', 'settings', 'hanga_settings.json'))
def load_settings(self): """This function loads project settings """ self.config_parser = ConfigParser(name="DesignerSettings") DESIGNER_CONFIG = os.path.join(get_kivy_designer_dir(), DESIGNER_CONFIG_FILE_NAME) _dir = os.path.dirname(designer.__file__) _dir = os.path.split(_dir)[0] DEFAULT_CONFIG = os.path.join(_dir, DESIGNER_CONFIG_FILE_NAME) if not os.path.exists(DESIGNER_CONFIG): shutil.copyfile(DEFAULT_CONFIG, DESIGNER_CONFIG) self.config_parser.read(DESIGNER_CONFIG) self.config_parser.upgrade(DEFAULT_CONFIG) # creates a panel before insert it to update code input theme list panel = self.create_json_panel( "Kivy Designer Settings", self.config_parser, os.path.join(_dir, "designer", "settings", "designer_settings.json"), ) uid = panel.uid if self.interface is not None: self.interface.add_panel(panel, "Kivy Designer Settings", uid) # loads available themes for child in panel.children: if child.id == "code_input_theme_options": child.items = styles.get_all_styles() # tries to find python and buildozer path if it's not defined path = self.config_parser.getdefault("global", "python_shell_path", "") if path.strip() == "": self.config_parser.set("global", "python_shell_path", sys.executable) self.config_parser.write() buildozer_path = self.config_parser.getdefault("buildozer", "buildozer_path", "") if buildozer_path.strip() == "": buildozer_path = find_executable("buildozer") if buildozer_path: self.config_parser.set("buildozer", "buildozer_path", buildozer_path) self.config_parser.write() self.add_json_panel( "Buildozer", self.config_parser, os.path.join(_dir, "designer", "settings", "buildozer_settings.json") ) self.add_json_panel( "Hanga", self.config_parser, os.path.join(_dir, "designer", "settings", "hanga_settings.json") ) self.add_json_panel( "Keyboard Shortcuts", self.config_parser, os.path.join(_dir, "designer", "settings", "shortcuts.json") )
def store_files(self): '''To store the list of files on disk. ''' _string = '' for _file in self.list_files: _string += _file + '\n' recent_file_path = os.path.join(get_kivy_designer_dir(), RECENT_FILES_NAME) f = open(recent_file_path, 'w') f.write(_string) f.close()
def store_files(self): '''To store the list of files on disk. ''' _string = '' for _file in self.list_projects: _string += _file + '\n' recent_file_path = os.path.join(get_kivy_designer_dir(), RECENT_FILES_NAME) f = open(recent_file_path, 'w') f.write(_string) f.close()
def load_profiles(self): '''This function loads project settings ''' self.settings_changed = False self.PROFILES_PATH = os.path.join(get_kivy_designer_dir(), 'profiles') _dir = os.path.dirname(designer.__file__) _dir = os.path.split(_dir)[0] self.DEFAULT_PROFILES = os.path.join(_dir, 'profiles') if not os.path.exists(self.PROFILES_PATH): shutil.copytree(self.DEFAULT_PROFILES, self.PROFILES_PATH) self.update_panel()
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 _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 load_files(self): '''To load the list of files from disk ''' recent_file_path = os.path.join(get_kivy_designer_dir(), RECENT_FILES_NAME) if not os.path.exists(recent_file_path): return f = open(recent_file_path, 'r') _file = f.readline() while _file != '': file_path = _file.strip() if os.path.exists(file_path): self.list_files.append(file_path) _file = f.readline() f.close()
def load_files(self): '''To load the list of files from disk ''' recent_file_path = os.path.join(get_kivy_designer_dir(), RECENT_FILES_NAME) if not os.path.exists(recent_file_path): return f = open(recent_file_path, 'r') path = f.readline() while path != '': file_path = path.strip() if os.path.exists(file_path): self.list_projects.append(file_path) path = f.readline() f.close()
def load_settings(self): '''This function loads project settings ''' self.config_parser = ConfigParser() DESIGNER_CONFIG = os.path.join(get_kivy_designer_dir(), DESIGNER_CONFIG_FILE_NAME) if not os.path.exists(DESIGNER_CONFIG): shutil.copyfile(os.path.join(os.getcwd(), DESIGNER_CONFIG_FILE_NAME), DESIGNER_CONFIG) self.config_parser.read(DESIGNER_CONFIG) self.add_json_panel('Kivy Designer Settings', self.config_parser, './designer/settings/designer_settings.json') path = self.config_parser.getdefault( 'global', 'python_shell_path', '') if path == "": self.config_parser.set('global', 'python_shell_path', sys.executable) self.config_parser.write()
def load_settings(self): """This function loads project settings """ self.config_parser = ConfigParser() DESIGNER_CONFIG = os.path.join(get_kivy_designer_dir(), DESIGNER_CONFIG_FILE_NAME) _dir = os.path.dirname(designer.__file__) _dir = os.path.split(_dir)[0] if not os.path.exists(DESIGNER_CONFIG): shutil.copyfile(os.path.join(_dir, DESIGNER_CONFIG_FILE_NAME), DESIGNER_CONFIG) self.config_parser.read(DESIGNER_CONFIG) self.add_json_panel( "Kivy Designer Settings", self.config_parser, os.path.join(_dir, "designer", "settings", "designer_settings.json"), ) path = self.config_parser.getdefault("global", "python_shell_path", "") if path == "": self.config_parser.set("global", "python_shell_path", sys.executable) self.config_parser.write()
def create_kivy_designer_dir(self): '''To create the ~/.kivy-designer dir ''' if not os.path.exists(get_kivy_designer_dir()): os.mkdir(get_kivy_designer_dir())
def save_project(self, proj_dir=''): '''To save project to proj_dir. If proj_dir is not empty string then project is saved to a new directory other than its current directory and otherwise it is saved to the current directory. ''' # To stop ProjectWatcher from emitting event when project is saved self.proj_watcher.allow_event_dispatch = False proj_dir_changed = False if self.new_project: # Create dir and copy new_proj.kv and new_proj.py to new directory if not os.path.exists(proj_dir): os.mkdir(proj_dir) kivy_designer_dir = get_kivy_designer_dir() kivy_designer_new_proj_dir = os.path.join(kivy_designer_dir, "new_proj") for _file in os.listdir(kivy_designer_new_proj_dir): old_file = os.path.join(kivy_designer_new_proj_dir, _file) new_file = os.path.join(proj_dir, _file) if os.path.isdir(old_file): shutil.copytree(old_file, new_file) else: shutil.copy(old_file, new_file) self.file_list = self._get_file_list(proj_dir) new_kv_file = os.path.join(proj_dir, "main.kv") new_py_file = os.path.join(proj_dir, "main.py") self.proj_dir = proj_dir if self.root_rule: self.root_rule.kv_file = new_kv_file self.root_rule.py_file = new_py_file if self.class_rules: self.class_rules[0].py_file = new_py_file self.class_rules[0].kv_file = new_kv_file self.new_project = False else: if proj_dir != '' and proj_dir != self.proj_dir: proj_dir_changed = True # Remove previous project directories from sys.path for _dir in self._dir_list: try: sys.path.remove(_dir) except: pass # if proj_dir and self.proj_dir differs then user wants to save # an already opened project to somewhere else # Copy all the files if not os.path.exists(proj_dir): os.mkdir(proj_dir) for _file in os.listdir(self.proj_dir): old_file = os.path.join(self.proj_dir, _file) new_file = os.path.join(proj_dir, _file) if os.path.isdir(old_file): shutil.copytree(old_file, new_file) else: shutil.copy(old_file, new_file) self.file_list = self._get_file_list(proj_dir) # Change the path of all files in the class rules, # root rule and app relative_path = self._app_file[ self._app_file.find(self.proj_dir):] self._app_file = os.path.join(proj_dir, relative_path) f = open(self._app_file, 'r') s = f.read() f.close() self._import_module(s, self._app_file, _fromlist=[self._app_class]) for _rule in self.class_rules: relative_path = _rule.kv_file[ _rule.kv_file.find(self.proj_dir):] _rule.kv_file = os.path.join(proj_dir, relative_path) relative_path = _rule.file[_rule.file.find(self.proj_dir):] _rule.file = os.path.join(proj_dir, relative_path) f = open(_rule.file, 'r') s = f.read() f.close() self._import_module(s, _rule.file, _fromlist=[_rule.name]) relative_path = self.root_rule.kv_file[ self.root_rule.kv_file.find(self.proj_dir):] self.root_rule.kv_file = os.path.join(proj_dir, relative_path) relative_path = self.root_rule.file[ self.root_rule.file.find(self.proj_dir):] self.root_rule.file = os.path.join(proj_dir, relative_path) self.proj_dir = proj_dir # For custom widgets copy py and kv file to project directory for widget in self.custom_widgets: custom_kv = os.path.join(self.proj_dir, os.path.basename(widget.kv_file)) if not os.path.exists(custom_kv): shutil.copy(widget.kv_file, custom_kv) custom_py = os.path.join(self.proj_dir, os.path.basename(widget.py_file)) if not os.path.exists(custom_py): shutil.copy(widget.py_file, custom_py) # Saving all opened py files and also reimport them for _code_input in self.tab_pannel.list_py_code_inputs: path = os.path.join(self.proj_dir, _code_input.rel_file_path) f = open(path, 'w') f.write(_code_input.text) f.close() _from_list = [] for rule in self.class_rules: if rule.file == path: _from_list.append(rule.file) if not self.is_root_a_class_rule(): if self.root_rule.file == path: _from_list.append(self.root_rule.name) # Ignore all types that are not .py if path.endswith(".py"): self._import_module(_code_input.text, path, _fromlist=_from_list) # Save all class rules text = self.kv_code_input.text for _rule in self.class_rules: # Get the kv text from KVLangArea and write it to class rule's file f = open(_rule.kv_file, 'r') _file_str = f.read() f.close() old_str = self.get_class_str_from_text(_rule.name, _file_str) new_str = self.get_class_str_from_text(_rule.name, text) f = open(_rule.kv_file, 'w') _file_str = _file_str.replace(old_str, new_str) f.write(_file_str) f.close() # If root widget is not changed if self._root_rule.name == self.root_rule.name: # Save root widget's rule is_root_class = False for _rule in self.class_rules: if _rule.name == self.root_rule.name: is_root_class = True break if not is_root_class: f = open(self.root_rule.kv_file, 'r') _file_str = f.read() f.close() old_str = self.get_class_str_from_text(self.root_rule.name, _file_str, is_class=False) new_str = self.get_class_str_from_text(self.root_rule.name, text, is_class=False) f = open(self.root_rule.kv_file, 'w') _file_str = _file_str.replace(old_str, new_str) f.write(_file_str) f.close() else: # If root widget is changed # Root Widget changes, there can be these cases: root_name = self.root_rule.name f = open(self._app_file, 'r') file_str = f.read() f.close() self._root_rule = self.root_rule if self.is_root_a_class_rule() and self._app_file: # Root Widget's class rule is a custom class # and its rule is class rule. So, it already have been saved # the string of App's build() function will be changed to # return new root widget's class if self._app_class != 'runTouchApp': s = re.search(r'class\s+%s.+:' % self._app_class, file_str) if s: build_searchiter = None for searchiter in re.finditer( r'[ \ \t]+def\s+build\s*\(\s*self.+\s*:', file_str): if searchiter.start() > s.start(): build_searchiter = searchiter break if build_searchiter: indent = get_indentation(build_searchiter.group(0)) file_str = file_str[:build_searchiter.end()] +\ '\n' + get_indent_str(2 * indent) + "return " +\ root_name + "()\n" + \ file_str[build_searchiter.end():] else: file_str = file_str[:s.end()] + \ "\n def build(self):\n return " + \ root_name + '()\n' + file_str[s.end():] else: file_str = re.sub(r'runTouchApp\s*\(.+\)', 'runTouchApp(' + root_name + '())', file_str) f = open(self._app_file, 'w') f.write(file_str) f.close() else: # Root Widget's rule is not a custom class # and its rule is root rule # Its kv_file should be of App's class name # and App's build() function should be cleared if not self.root_rule.kv_file: s = self._app_class.replace('App', '').lower() root_file = None for _file in self.kv_file_list: if os.path.basename(_file).find(s) == 0: self.root_rule.kv_file = _file break f = open(self.root_rule.kv_file, 'r') _file_str = f.read() f.close() new_str = self.get_class_str_from_text(self.root_rule.name, text, False) f = open(self.root_rule.kv_file, 'a') f.write(new_str) f.close() if self._app_class != 'runTouchApp': s = re.search(r'class\s+%s.+:' % self._app_class, file_str) if s: build_searchiter = None for searchiter in re.finditer( r'[ \ \t]+def\s+build\s*\(\s*self.+\s*:', file_str): if searchiter.start() > s.start(): build_searchiter = searchiter break if build_searchiter: lines = file_str.splitlines() total_lines = len(lines) indent = get_indentation(build_searchiter.group(0)) _line = 0 _line_pos = -1 _line_pos = file_str.find('\n', _line_pos + 1) while _line_pos <= build_searchiter.start(): _line_pos = file_str.find('\n', _line_pos + 1) _line += 1 _line += 1 while _line < total_lines: if lines[_line].strip() != '' and\ get_indentation(lines[_line]) <= \ indent: break _line += 1 _line -= 1 end = get_line_start_pos(file_str, _line) start = build_searchiter.start() file_str = file_str.replace(file_str[start:end], ' pass') f = open(self._app_file, 'w') f.write(file_str) f.close() # Allow Project Watcher to emit events Clock.schedule_once(self._allow_proj_watcher_dispatch, 1)