return fonts state = dict( gnome_fonts=get_gnome_fonts(), absolute_path=os.path.dirname(os.path.abspath(__file__)), conf_dir=os.path.join(config_home, 'cdraft'), data_dir=os.path.join(data_home, 'cdraft'), themes_dir=os.path.join(data_home, 'cdraft', 'themes'), # XXX: works only in linux global_themes_dir='/usr/share/cdraft/themes', ) if not os.path.isdir(state['global_themes_dir']): if platform == 'win32': state['global_themes_dir'] = '' else: # run without installation state['global_themes_dir'] = os.path.join(state['absolute_path'], '..', 'themes') # yes imports that are not quite obvious suck but we need to avoid # circular imports here from utils import FailsafeConfigParser config = FailsafeConfigParser() config_file = os.path.join(state['conf_dir'], 'cdraft.conf') if os.path.isfile(config_file): config.readfp(open(config_file, 'r')) for d in [state['conf_dir'], state['themes_dir']]: if not os.path.isdir(d): os.makedirs(d)
def __init__(self): gladefile = os.path.join(state['absolute_path'], "preferences.glade") builder = gtk.Builder() builder.add_from_file(gladefile) # Defining widgets needed self.window = builder.get_object("dialog-preferences") self.colorpreference = builder.get_object("colorbutton") self.textboxbgpreference = builder.get_object("textboxbgbutton") self.bgpreference = builder.get_object("bgbutton") self.borderpreference = builder.get_object("borderbutton") self.paddingpreference = builder.get_object("paddingtext") self.heightpreference = builder.get_object("heighttext") self.heightpreference.set_range(5, 95) self.widthpreference = builder.get_object("widthtext") self.widthpreference.set_range(5, 95) self.presetscombobox = builder.get_object("presetscombobox") self.showborderbutton = builder.get_object("showborder") self.showpathbutton = builder.get_object("showpath") self.autosave = builder.get_object("autosavetext") self.autosave_spinbutton = builder.get_object("autosavetime") self.linespacing_spinbutton = builder.get_object("linespacing") self.indent_check = builder.get_object("indent_check") if config.get('visual', 'indent') == '1': self.indent_check.set_active(True) self.save_custom_button = builder.get_object("save_custom_theme") self.custom_font_preference = builder.get_object("fontbutton1") if not config.get('visual', 'use_font_type') == 'custom': self.custom_font_preference.set_sensitive(False) self.font_radios = { 'document':builder.get_object("radio_document_font"), 'monospace':builder.get_object("radio_monospace_font"), 'custom':builder.get_object("radio_custom_font") } self.orientation_radios = { 'top':builder.get_object('orientation_top'), 'center':builder.get_object('orientation_center'), } for widget in self.font_radios.values(): if not widget.get_name() == 'radio_custom_font': widget.set_sensitive(bool(state['gnome_fonts'])) # Setting up config parser self.customfile = FailsafeConfigParser() self.customfile.read(os.path.join( state['themes_dir'], 'custom.theme') ) if not self.customfile.has_section('theme'): self.customfile.add_section('theme') # Getting preferences from conf file active_style = config.get("visual", "theme") self.autosave.set_active(config.getint('editor', 'autosave')) # Set up pyroom from conf file self.linespacing_spinbutton.set_value(int( config.get('visual', 'linespacing') )) self.autosave_spinbutton.set_value(float( config.get('editor', 'autosavetime'))) self.showborderbutton.set_active( config.getint('visual', 'showborder') ) self.showpathbutton.set_active( config.getint('visual', 'showpath') ) font_type = config.get('visual', 'use_font_type') self.font_radios[font_type].set_active(True) self.orientation_radios[ config.get('visual', 'alignment') ].set_active(True) self.toggleautosave(self.autosave) self.window.set_transient_for(state['gui'].window) self.stylesvalues = {'custom': 0} startingvalue = 1 state['gui'].theme = Theme(config.get('visual', 'theme')) # Add themes to combobox for i in get_themes_list(): self.stylesvalues['%s' % (i)] = startingvalue startingvalue += 1 current_loading_theme = Theme(i) theme_name = current_loading_theme['name'] self.presetscombobox.append_text(theme_name) if active_style == 'custom': self.save_custom_button.set_sensitive(True) self.presetscombobox.set_active(self.stylesvalues[active_style]) self.fill_pref_dialog() # Connecting interface's signals dic = { "on_MainWindow_destroy": self.QuitEvent, "on_button-ok_clicked": self.set_preferences, "on_close": self.kill_preferences } builder.connect_signals(dic) self.showborderbutton.connect('toggled', self.toggleborder) self.showpathbutton.connect('toggled', self.togglepath) self.autosave.connect('toggled', self.toggleautosave) self.autosave_spinbutton.connect('value-changed', self.toggleautosave) self.linespacing_spinbutton.connect( 'value-changed', self.changelinespacing ) self.indent_check.connect( 'toggled', self.toggle_indent ) self.presetscombobox.connect('changed', self.presetchanged) self.colorpreference.connect('color-set', self.customchanged) self.textboxbgpreference.connect('color-set', self.customchanged) self.bgpreference.connect('color-set', self.customchanged) self.borderpreference.connect('color-set', self.customchanged) self.paddingpreference.connect('value-changed', self.customchanged) self.heightpreference.connect('value-changed', self.customchanged) self.widthpreference.connect('value-changed', self.customchanged) self.save_custom_button.connect('clicked', self.save_custom_theme) for widget in self.font_radios.values(): widget.connect('toggled', self.change_font) for widget in self.orientation_radios.values(): widget.connect('toggled', self.change_orientation) self.custom_font_preference.connect('font-set', self.change_font)
return fonts state = dict( gnome_fonts = get_gnome_fonts(), absolute_path = os.path.dirname(os.path.abspath(__file__)), conf_dir = os.path.join(config_home, 'pyroom'), data_dir = os.path.join(data_home, 'pyroom'), themes_dir = os.path.join(data_home, 'pyroom', 'themes'), # XXX: works only in linux global_themes_dir = '/usr/share/pyroom/themes', ) if not os.path.isdir(state['global_themes_dir']): if platform == 'win32': state['global_themes_dir'] = '' else: # run without installation state['global_themes_dir'] = os.path.join( state['absolute_path'], '..', 'themes') # yes imports that are not quite obvious suck but we need to avoid # circular imports here from utils import FailsafeConfigParser config = FailsafeConfigParser() config_file = os.path.join(state['conf_dir'], 'pyroom.conf') if os.path.isfile(config_file): config.readfp(open(config_file, 'r')) for d in [state['conf_dir'], state['themes_dir']]: if not os.path.isdir(d): os.makedirs(d)
class Preferences(object): """our main preferences object, to be passed around where needed""" def __init__(self): gladefile = os.path.join(state['absolute_path'], "preferences.glade") builder = gtk.Builder() builder.add_from_file(gladefile) # Defining widgets needed self.window = builder.get_object("dialog-preferences") self.colorpreference = builder.get_object("colorbutton") self.textboxbgpreference = builder.get_object("textboxbgbutton") self.bgpreference = builder.get_object("bgbutton") self.borderpreference = builder.get_object("borderbutton") self.paddingpreference = builder.get_object("paddingtext") self.heightpreference = builder.get_object("heighttext") self.heightpreference.set_range(5, 95) self.widthpreference = builder.get_object("widthtext") self.widthpreference.set_range(5, 95) self.presetscombobox = builder.get_object("presetscombobox") self.showborderbutton = builder.get_object("showborder") self.showpathbutton = builder.get_object("showpath") self.autosave = builder.get_object("autosavetext") self.autosave_spinbutton = builder.get_object("autosavetime") self.linespacing_spinbutton = builder.get_object("linespacing") self.indent_check = builder.get_object("indent_check") if config.get('visual', 'indent') == '1': self.indent_check.set_active(True) self.save_custom_button = builder.get_object("save_custom_theme") self.custom_font_preference = builder.get_object("fontbutton1") if not config.get('visual', 'use_font_type') == 'custom': self.custom_font_preference.set_sensitive(False) self.font_radios = { 'document':builder.get_object("radio_document_font"), 'monospace':builder.get_object("radio_monospace_font"), 'custom':builder.get_object("radio_custom_font") } self.orientation_radios = { 'top':builder.get_object('orientation_top'), 'center':builder.get_object('orientation_center'), } for widget in self.font_radios.values(): if not widget.get_name() == 'radio_custom_font': widget.set_sensitive(bool(state['gnome_fonts'])) # Setting up config parser self.customfile = FailsafeConfigParser() self.customfile.read(os.path.join( state['themes_dir'], 'custom.theme') ) if not self.customfile.has_section('theme'): self.customfile.add_section('theme') # Getting preferences from conf file active_style = config.get("visual", "theme") self.autosave.set_active(config.getint('editor', 'autosave')) # Set up pyroom from conf file self.linespacing_spinbutton.set_value(int( config.get('visual', 'linespacing') )) self.autosave_spinbutton.set_value(float( config.get('editor', 'autosavetime'))) self.showborderbutton.set_active( config.getint('visual', 'showborder') ) self.showpathbutton.set_active( config.getint('visual', 'showpath') ) font_type = config.get('visual', 'use_font_type') self.font_radios[font_type].set_active(True) self.orientation_radios[ config.get('visual', 'alignment') ].set_active(True) self.toggleautosave(self.autosave) self.window.set_transient_for(state['gui'].window) self.stylesvalues = {'custom': 0} startingvalue = 1 state['gui'].theme = Theme(config.get('visual', 'theme')) # Add themes to combobox for i in get_themes_list(): self.stylesvalues['%s' % (i)] = startingvalue startingvalue += 1 current_loading_theme = Theme(i) theme_name = current_loading_theme['name'] self.presetscombobox.append_text(theme_name) if active_style == 'custom': self.save_custom_button.set_sensitive(True) self.presetscombobox.set_active(self.stylesvalues[active_style]) self.fill_pref_dialog() # Connecting interface's signals dic = { "on_MainWindow_destroy": self.QuitEvent, "on_button-ok_clicked": self.set_preferences, "on_close": self.kill_preferences } builder.connect_signals(dic) self.showborderbutton.connect('toggled', self.toggleborder) self.showpathbutton.connect('toggled', self.togglepath) self.autosave.connect('toggled', self.toggleautosave) self.autosave_spinbutton.connect('value-changed', self.toggleautosave) self.linespacing_spinbutton.connect( 'value-changed', self.changelinespacing ) self.indent_check.connect( 'toggled', self.toggle_indent ) self.presetscombobox.connect('changed', self.presetchanged) self.colorpreference.connect('color-set', self.customchanged) self.textboxbgpreference.connect('color-set', self.customchanged) self.bgpreference.connect('color-set', self.customchanged) self.borderpreference.connect('color-set', self.customchanged) self.paddingpreference.connect('value-changed', self.customchanged) self.heightpreference.connect('value-changed', self.customchanged) self.widthpreference.connect('value-changed', self.customchanged) self.save_custom_button.connect('clicked', self.save_custom_theme) for widget in self.font_radios.values(): widget.connect('toggled', self.change_font) for widget in self.orientation_radios.values(): widget.connect('toggled', self.change_orientation) self.custom_font_preference.connect('font-set', self.change_font) def change_orientation(self, widget): """change orientation of the main textbox""" orientation = widget.get_name().split('_')[1] config.set('visual', 'alignment', orientation) state['gui'].apply_theme() def change_font(self, widget): """apply changed fonts""" if widget.get_name() in ('fontbutton1', 'radio_custom_font'): self.custom_font_preference.set_sensitive(True) new_font = self.custom_font_preference.get_font_name() config.set('visual', 'use_font_type', 'custom') config.set('visual', 'custom_font', new_font) else: self.custom_font_preference.set_sensitive(False) font_type = widget.get_name().split('_')[1] config.set('visual', 'use_font_type', font_type) state['gui'].apply_theme() def get_custom_data(self): """reads custom themes""" custom_settings = dict( foreground = gtk.gdk.Color.to_string( self.colorpreference.get_color()), textboxbg = gtk.gdk.Color.to_string( self.textboxbgpreference.get_color()), background = gtk.gdk.Color.to_string( self.bgpreference.get_color()), border = gtk.gdk.Color.to_string( self.borderpreference.get_color()), padding = self.paddingpreference.get_value_as_int(), height = self.heightpreference.get_value() / 100.0, width = self.widthpreference.get_value() / 100.0, ) return custom_settings def save_custom_theme(self, widget, data=None): """write the current custom theme to disk""" chooser = gtk.FileChooserDialog('PyRoom', self.window, gtk.FILE_CHOOSER_ACTION_SAVE, buttons=(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_SAVE, gtk.RESPONSE_OK) ) chooser.set_default_response(gtk.RESPONSE_OK) chooser.set_current_folder(state['themes_dir']) filter_pattern = gtk.FileFilter() filter_pattern.add_pattern('*.theme') filter_pattern.set_name(_('Theme Files')) chooser.add_filter(filter_pattern) res = chooser.run() if res == gtk.RESPONSE_OK: theme_filename = chooser.get_filename() state['gui'].theme.save(theme_filename) theme_name = os.path.basename(theme_filename) theme_id = max(self.stylesvalues.values()) + 1 self.presetscombobox.append_text(theme_name) self.stylesvalues.update({theme_name: theme_id}) self.presetscombobox.set_active(theme_id) chooser.destroy() def set_preferences(self, widget, data=None): """save preferences""" autosavepref = int(self.autosave.get_active()) config.set("editor", "autosave", str(autosavepref)) autosave_time = self.autosave_spinbutton.get_value_as_int() config.set("editor", "autosavetime", str(autosave_time)) if self.presetscombobox.get_active_text().lower() == 'custom': custom_theme = open(os.path.join( state['themes_dir'], 'custom.theme'), "w" ) self.customfile.write(custom_theme) self.dlg.hide() try: config_file = open(os.path.join( state['conf_dir'], "pyroom.conf"), "w" ) config.write(config_file) except IOError: raise PyroomError(_("Could not save preferences file.")) def customchanged(self, widget): """triggered when custom themes are changed, reloads style""" self.presetscombobox.set_active(0) for key, value in self.get_custom_data().iteritems(): self.customfile.set('theme', key, str(value)) self.presetchanged(widget) def fill_pref_dialog(self): """load config into the dialog""" self.custom_font_preference.set_font_name( config.get('visual', 'custom_font') ) parse_color = lambda x: gtk.gdk.color_parse( state['gui'].theme[x] ) self.colorpreference.set_color(parse_color('foreground')) self.textboxbgpreference.set_color(parse_color('textboxbg')) self.bgpreference.set_color(parse_color('background')) self.borderpreference.set_color(parse_color('border')) self.paddingpreference.set_value(float( state['gui'].theme['padding']) ) self.widthpreference.set_value( float(state['gui'].theme['width']) * 100 ) self.heightpreference.set_value( float(state['gui'].theme['height']) * 100 ) def presetchanged(self, widget, mode=None): """some presets have changed, apply those""" active_theme_id = self.presetscombobox.get_active() for key, value in self.stylesvalues.iteritems(): if value == active_theme_id: active_theme = key if active_theme_id == 0: custom_theme = Theme('custom') custom_theme['name'] = 'custom' custom_theme.update(self.get_custom_data()) config.set("visual", "theme", str(active_theme)) state['gui'].theme = custom_theme self.save_custom_button.set_sensitive(True) else: new_theme = Theme(active_theme) state['gui'].theme = new_theme parse_color = lambda x: gtk.gdk.color_parse( state['gui'].theme[x] ) self.colorpreference.set_color(parse_color('foreground')) self.textboxbgpreference.set_color(parse_color('textboxbg')) self.bgpreference.set_color(parse_color('background')) self.borderpreference.set_color(parse_color('border')) self.paddingpreference.set_value(float( state['gui'].theme['padding']) ) self.widthpreference.set_value( float(state['gui'].theme['width']) * 100 ) self.heightpreference.set_value( float(state['gui'].theme['height']) * 100 ) config.set("visual", "theme", str(active_theme)) self.presetscombobox.set_active(active_theme_id) self.save_custom_button.set_sensitive(False) state['gui'].apply_theme() state['gui'].status.set_text(_('Style Changed to %s') % (active_theme)) def show(self): """display the preferences dialog""" self.dlg = self.window self.dlg.show() def toggle_indent(self, widget): """toggle textbox indent""" if config.get('visual', 'indent') == '1': config.set('visual', 'indent', '0') else: config.set('visual', 'indent', '1') state['gui'].apply_theme() def toggleborder(self, widget): """toggle border display""" borderstate = config.getint('visual', 'showborder') if borderstate: opposite = 0 else: opposite = 1 config.set('visual', 'showborder', str(opposite)) state['gui'].apply_theme() def togglepath(self, widget): """toggle full path display in statusbar""" pathstate = config.getint('visual', 'showpath') if pathstate: opposite = 0 else: opposite = 1 config.set('visual', 'showpath', str(opposite)) def changelinespacing(self, widget): """Change line spacing""" linespacing = self.linespacing_spinbutton.get_value() config.set("visual", "linespacing", str(int(linespacing))) state['gui'].apply_theme() def toggleautosave(self, widget): """enable or disable autosave""" if self.autosave.get_active(): self.autosave_spinbutton.set_sensitive(True) autosave_time = self.autosave_spinbutton.get_value_as_int() config.set('editor', 'autosave', '1') else: self.autosave_spinbutton.set_sensitive(False) autosave_time = 0 config.set('editor', 'autosave', '0') config.set('editor', 'autosavetime', str(autosave_time)) def QuitEvent(self, widget, data=None): """quit our app""" gtk.main_quit() return False def kill_preferences(self, widget, data=None): """hide the preferences window""" self.dlg.hide() return True