# page_project.py - Handler for the project settings page # # (c) Copyright 2010 Michael Towers (larch42 at googlemail dot com) # # This file is part of the larch project. # # larch is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # larch is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with larch; if not, write to the Free Software Foundation, Inc., # 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # #---------------------------------------------------------------------------- # 2010.07.13 import os class ProjectSettings: def __init__(self): ui.widgetlist(fss('fetch_layout', 'page_project.uim')) ui.connectlist( (':choose_profile_combo*changed', self.switch_profile), (':profile_rename*clicked', self.rename_profile), (':profile_browse*clicked', self.browse_profile), (':profile_delete*clicked', self.delete_profile), (':profile_save*clicked', self.save_profile), (':installation_path_change*clicked', self.new_build_path), (':choose_project_combo*changed', self.switch_project), (':new_project*clicked', self.get_new_project_name), (':project_delete*clicked', self.delete_project), ) def setup(self): # Initialize project combobox self.projects = fss('get_projects') self.project_name = fss('get_project') try: pix = self.projects.index(self.project_name) except: self.switch_project(0) return ui.command(':choose_project_combo.set', self.projects, pix) # Initialize profile combobox self.profiles = fss('get_profiles') self.profile_name = fss('get_profile') try: pfix = self.profiles.index(self.profile_name) except: self.switch_profile(0) pfix = 0 ui.command(':choose_profile_combo.set', self.profiles, pfix) # Initialize installation_dir display self.set_build_dir(fss('get_installation_dir')) def enter(self): """This is called when the page is entered/selected/shown. It performs initializations which depend on the state. """ docviewer.gohome('gui_project_settings.html') def data(self, key): return ui.command('project_page_data.get', key) def set_build_dir(self, path): self.build_dir = path ui.command(':installation_path_show.text', self.build_dir) ui.enable_installation_page(self.build_dir != '/') def switch_profile(self, index): """This has no effect on the display! It is assumed that the display is already updated, or will be updated later, and that the index is valid, so that the operation cannot fail. """ self.profile_name = self.profiles[index] fss('set_profile', self.profile_name) def browse_profile(self): source = ui.fileDialog(self.data('file_ps'), dirsonly=True, bookmarks=fss('get_profile_bookmarks'), startdir=fss('getitem', 'profile_browse_dir')) if source: fss('setitem', 'profile_browse_dir', os.path.dirname(source)) if os.path.basename(source) in self.profiles: if not ui.command('confirmDialog', self.data('prompt_pr')): return if fss('get_new_profile', source): self.setup() else: run_error(self.data('msg_npd') % source) def rename_profile(self): if fss('can_rename_profile'): ok, new = ui.command('textLineDialog', self.data('prompt_pn'), None, self.profile_name) if ok: new = new.strip() if new in self.profiles: ui.command('warningDialog', self.data('prompt_pe') % new) else: fss('rename_profile', new) self.setup() else: ui.command('infoDialog', self.data('msg_pu')) def save_profile(self): bookmarks = fss('get_profile_bookmarks') startdir = fss('getitem', 'profile_browse_dir') path = ui.fileDialog(self.data('file_sp'), create=True, file=self.profile_name, bookmarks=bookmarks, startdir=startdir if startdir else bookmarks[0][0]) if path: fss('setitem', 'profile_browse_dir', os.path.dirname(path)) ok = fss('save_profile', path, False) if ok == False: if ui.command('confirmDialog', self.data('prompt_dr')): # Force overwrite fss('save_profile', path, True) elif ok == None: run_error(self.data('msg_piu')) else: self.setup() def delete_profile(self): plist = fss('list_free_profiles') if plist: ok, item = ui.command('listDialog', self.data('prompt_dp'), self.data('delprof'), plist) if ok: if fss('delete_profile', item): self.setup() else: ui.command('infoDialog', self.data('msg_dpff') % item) else: ui.command('infoDialog', self.data('msg_npf')) def new_build_path(self): # Is anything more necessary? Do I need to test or create the path? # I don't think so, the installation code does that. # If the path is "/", the installation page should be inhibited, # but that is handled by 'setup'. ok, path = ui.command('textLineDialog', self.data('prompt_ip'), None, self.build_dir) if ok: path = fss('set_installation_dir', path) if path: self.set_build_dir(path) def switch_project(self, index): fss('set_project', self.projects[index]) self.setup() def get_new_project_name(self): ok, name = ui.command('textLineDialog', self.data('prompt_np'), None, self.project_name) if ok: if name in self.projects: run_error(self.data('msg_pe') % name) else: fss('set_project', name) self.setup() def delete_project(self): """Pop up a list of eligible project names, the selected one will be deleted. """ plist = fss('list_free_projects') if plist: ok, item = ui.command('listDialog', self.data('prompt_pd'), self.data('delproj'), plist) if ok: fss('delete_project', item) self.setup() else: ui.command('infoDialog', self.data('msg_np'))