def __init__(self): self.builder = Gtk.Builder() self.builder.set_translation_domain('cinnamon') # let it translate! self.builder.add_from_file(config.currentPath + "/cinnamon-settings.ui") self.window = XApp.GtkWindow(window_position=Gtk.WindowPosition.CENTER, default_width=800, default_height=600) main_box = self.builder.get_object("main_box") self.window.add(main_box) self.top_bar = self.builder.get_object("top_bar") self.side_view = {} self.main_stack = self.builder.get_object("main_stack") self.main_stack.set_transition_type(Gtk.StackTransitionType.CROSSFADE) self.main_stack.set_transition_duration(150) self.header_stack = self.builder.get_object("header_stack") self.header_stack.set_transition_type( Gtk.StackTransitionType.CROSSFADE) self.header_stack.set_transition_duration(150) self.side_view_container = self.builder.get_object("category_box") self.side_view_sw = self.builder.get_object("side_view_sw") context = self.side_view_sw.get_style_context() context.add_class("cs-category-view") context.add_class("view") self.side_view_sw.show_all() self.content_box = self.builder.get_object("content_box") self.content_box_sw = self.builder.get_object("content_box_sw") self.content_box_sw.show_all() self.button_back = self.builder.get_object("button_back") self.button_back.set_tooltip_text(_("Back to all settings")) button_image = self.builder.get_object("image1") button_image.props.icon_size = Gtk.IconSize.MENU self.stack_switcher = self.builder.get_object("stack_switcher") self.search_entry = self.builder.get_object("search_box") self.search_entry.set_placeholder_text(_("Search")) self.search_entry.connect("changed", self.onSearchTextChanged) self.search_entry.connect("icon-press", self.onClearSearchBox) self.window.connect("destroy", self.quit) self.builder.connect_signals(self) self.unsortedSidePages = [] self.sidePages = [] self.settings = Gio.Settings.new("org.cinnamon") self.current_cat_widget = None self.current_sidepage = None self.c_manager = capi.CManager() self.content_box.c_manager = self.c_manager self.bar_heights = 0 for module in modules: try: mod = module.Module(self.content_box) if self.loadCheck(mod) and self.setParentRefs(mod): self.unsortedSidePages.append( (mod.sidePage, mod.name, mod.category)) except: print("Failed to load module %s" % module) traceback.print_exc() for item in CONTROL_CENTER_MODULES: ccmodule = SettingsWidgets.CCModule(item[0], item[1], item[2], item[3], item[4], self.content_box) if ccmodule.process(self.c_manager): self.unsortedSidePages.append( (ccmodule.sidePage, ccmodule.name, ccmodule.category)) for item in STANDALONE_MODULES: samodule = SettingsWidgets.SAModule(item[0], item[1], item[2], item[3], item[4], self.content_box) if samodule.process(): self.unsortedSidePages.append( (samodule.sidePage, samodule.name, samodule.category)) # sort the modules alphabetically according to the current locale localeStrKey = cmp_to_key(locale.strcoll) # Apply locale key to the field name of each side page. sidePagesKey = lambda m: localeStrKey(m[0].name) self.sidePages = sorted(self.unsortedSidePages, key=sidePagesKey) # create the backing stores for the side nav-view. sidePagesIters = {} self.store = {} self.storeFilter = {} for sidepage in self.sidePages: sp, sp_id, sp_cat = sidepage if sp_cat not in self.store: # Label Icon sidePage Category self.store[sidepage[2]] = Gtk.ListStore(str, str, object, str) for category in CATEGORIES: if category["id"] == sp_cat: category["show"] = True # Don't allow item names (and their translations) to be more than 30 chars long. It looks ugly and it creates huge gaps in the icon views name = sp.name if len(name) > 30: name = "%s..." % name[:30] sidePagesIters[sp_id] = (self.store[sp_cat].append( [name, sp.icon, sp, sp_cat]), sp_cat) self.min_label_length = 0 self.min_pix_length = 0 for key in self.store: char, pix = self.get_label_min_width(self.store[key]) self.min_label_length = max(char, self.min_label_length) self.min_pix_length = max(pix, self.min_pix_length) self.storeFilter[key] = self.store[key].filter_new() self.storeFilter[key].set_visible_func( self.filter_visible_function) self.min_label_length += 2 self.min_pix_length += 4 self.min_label_length = max(self.min_label_length, MIN_LABEL_WIDTH) self.min_pix_length = max(self.min_pix_length, MIN_PIX_WIDTH) self.min_label_length = min(self.min_label_length, MAX_LABEL_WIDTH) self.min_pix_length = min(self.min_pix_length, MAX_PIX_WIDTH) self.displayCategories() # set up larger components. self.window.set_title(_("System Settings")) self.button_back.connect('clicked', self.back_to_icon_view) self.calculate_bar_heights() self.tab = 0 # open 'manage' tab by default self.sort = 1 # sorted by 'score' by default # Select the first sidePage if len(sys.argv) > 1: arg1 = sys.argv[1] if arg1 in ARG_REWRITE.keys(): arg1 = ARG_REWRITE[arg1] if len(sys.argv) > 1 and arg1 in sidePagesIters: # Analyses arguments to know the tab to open # and the sort to apply if the tab is the 'more' one. # Examples: # cinnamon-settings.py applets --tab=more --sort=date # cinnamon-settings.py applets --tab=1 --sort=2 # cinnamon-settings.py applets --tab=more --sort=date # cinnamon-settings.py applets --tab=1 -s 2 # cinnamon-settings.py applets -t 1 -s installed # cinnamon-settings.py desklets -t 2 # Please note that useless or wrong arguments are ignored. opts = [] sorts_literal = { "name": 0, "score": 1, "date": 2, "installed": 3, "update": 4 } tabs_literal = {"default": 0} if arg1 in TABS.keys(): tabs_literal = TABS[arg1] try: if len(sys.argv) > 2: opts = getopt.getopt(sys.argv[2:], "t:s:", ["tab=", "sort="])[0] except getopt.GetoptError: pass for opt, arg in opts: if opt in ("-t", "--tab"): if arg.isdecimal(): self.tab = int(arg) elif arg in tabs_literal.keys(): self.tab = tabs_literal[arg] if opt in ("-s", "--sort"): if arg.isdecimal(): self.sort = int(arg) elif arg in sorts_literal.keys(): self.sort = sorts_literal[arg] # If we're launching a module directly, set the WM class so GWL # can consider it as a standalone app and give it its own # group. wm_class = "cinnamon-settings %s" % arg1 self.window.set_wmclass(wm_class, wm_class) self.button_back.hide() (iter, cat) = sidePagesIters[arg1] path = self.store[cat].get_path(iter) if path: self.go_to_sidepage(cat, path, user_action=False) self.window.show() if arg1 in ("mintlocale", "blueberry", "system-config-printer", "mintlocale-im", "nvidia-settings"): # These modules do not need to leave the System Settings window open, # when selected by command line argument. self.window.close() else: self.search_entry.grab_focus() self.window.show() else: self.search_entry.grab_focus() self.window.connect("key-press-event", self.on_keypress) self.window.connect("button-press-event", self.on_buttonpress) self.window.show()
def build_window(self): self.window = XApp.GtkWindow() self.window.set_default_size(800, 600) main_box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL) self.window.add(main_box) toolbar = Gtk.Toolbar() toolbar.get_style_context().add_class("primary-toolbar") main_box.add(toolbar) toolitem = Gtk.ToolItem() toolitem.set_expand(True) toolbar.add(toolitem) toolbutton_box = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL) toolitem.add(toolbutton_box) instance_button_box = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL) instance_button_box.get_style_context().add_class("linked") toolbutton_box.pack_start(instance_button_box, False, False, 0) self.prev_button = Gtk.Button.new_from_icon_name( 'go-previous-symbolic', Gtk.IconSize.BUTTON) self.prev_button.set_tooltip_text(_("Previous instance")) instance_button_box.add(self.prev_button) self.next_button = Gtk.Button.new_from_icon_name( 'go-next-symbolic', Gtk.IconSize.BUTTON) self.next_button.set_tooltip_text(_("Next instance")) instance_button_box.add(self.next_button) self.stack_switcher = Gtk.StackSwitcher() toolbutton_box.set_center_widget(self.stack_switcher) self.menu_button = Gtk.MenuButton() image = Gtk.Image.new_from_icon_name("open-menu-symbolic", Gtk.IconSize.BUTTON) self.menu_button.add(image) self.menu_button.set_tooltip_text(_("More options")) toolbutton_box.pack_end(self.menu_button, False, False, 0) menu = Gtk.Menu() menu.set_halign(Gtk.Align.END) restore_option = Gtk.MenuItem(label=_("Import from a file")) menu.append(restore_option) restore_option.connect("activate", self.restore) restore_option.show() backup_option = Gtk.MenuItem(label=_("Export to a file")) menu.append(backup_option) backup_option.connect("activate", self.backup) backup_option.show() reset_option = Gtk.MenuItem(label=_("Reset to defaults")) menu.append(reset_option) reset_option.connect("activate", self.reset) reset_option.show() separator = Gtk.SeparatorMenuItem() menu.append(separator) separator.show() reload_option = Gtk.MenuItem(label=_("Reload %s") % self.uuid) menu.append(reload_option) reload_option.connect("activate", self.reload_xlet) reload_option.show() self.menu_button.set_popup(menu) scw = Gtk.ScrolledWindow() scw.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC) main_box.pack_start(scw, True, True, 0) self.instance_stack = Gtk.Stack() scw.add(self.instance_stack) if "icon" in self.xlet_meta: self.window.set_icon_name(self.xlet_meta["icon"]) else: icon_path = os.path.join(self.xlet_dir, "icon.png") if os.path.exists(icon_path): self.window.set_icon_from_file(icon_path) self.window.set_title(translate(self.uuid, self.xlet_meta["name"])) self.window.connect("destroy", self.quit) self.prev_button.connect("clicked", self.previous_instance) self.next_button.connect("clicked", self.next_instance)
def __init__(self): ''' Create the UI ''' self.builder = Gtk.Builder() self.builder.add_from_file(config.currentPath + "/cinnamon-settings.ui") self.window = XApp.GtkWindow(window_position=Gtk.WindowPosition.CENTER, default_width=800, default_height=600) main_box = self.builder.get_object("main_box") self.window.add(main_box) self.top_bar = self.builder.get_object("top_bar") self.side_view = {} self.main_stack = self.builder.get_object("main_stack") self.main_stack.set_transition_type(Gtk.StackTransitionType.CROSSFADE) self.main_stack.set_transition_duration(150) self.header_stack = self.builder.get_object("header_stack") self.header_stack.set_transition_type( Gtk.StackTransitionType.CROSSFADE) self.header_stack.set_transition_duration(150) self.side_view_container = self.builder.get_object("category_box") self.side_view_sw = self.builder.get_object("side_view_sw") context = self.side_view_sw.get_style_context() context.add_class("cs-category-view") context.add_class("view") self.side_view_sw.show_all() self.content_box = self.builder.get_object("content_box") self.content_box_sw = self.builder.get_object("content_box_sw") self.content_box_sw.show_all() self.button_back = self.builder.get_object("button_back") self.button_back.set_tooltip_text(_("Back to all settings")) button_image = self.builder.get_object("image1") button_image.props.icon_size = Gtk.IconSize.MENU self.stack_switcher = self.builder.get_object("stack_switcher") n = self.button_back.get_preferred_width()[1] self.stack_switcher.set_margin_end(n) self.search_entry = self.builder.get_object("search_box") self.search_entry.set_placeholder_text(_("Search")) self.search_entry.connect("changed", self.onSearchTextChanged) self.search_entry.connect("icon-press", self.onClearSearchBox) self.window.connect("destroy", self.quit) self.builder.connect_signals(self) self.unsortedSidePages = [] self.sidePages = [] self.settings = Gio.Settings.new("org.cinnamon") self.current_cat_widget = None self.current_sidepage = None self.c_manager = capi.CManager() self.content_box.c_manager = self.c_manager self.bar_heights = 0 for module in modules: try: mod = module.Module(self.content_box) if self.loadCheck(mod) and self.setParentRefs(mod): self.unsortedSidePages.append( (mod.sidePage, mod.name, mod.category)) except Exception: print("Failed to load module %s" % module) traceback.print_exc() for item in CONTROL_CENTER_MODULES: ccmodule = SettingsWidgets.CCModule(item[0], item[1], item[2], item[3], item[4], self.content_box) if ccmodule.process(self.c_manager): self.unsortedSidePages.append( (ccmodule.sidePage, ccmodule.name, ccmodule.category)) for item in STANDALONE_MODULES: samodule = SettingsWidgets.SAModule(item[0], item[1], item[2], item[3], item[4], self.content_box) if samodule.process(): self.unsortedSidePages.append( (samodule.sidePage, samodule.name, samodule.category)) # sort the modules alphabetically according to the current locale localeStrKey = cmp_to_key(locale.strcoll) # Apply locale key to the field name of each side page. sidePagesKey = lambda m: localeStrKey(m[0].name) self.sidePages = sorted(self.unsortedSidePages, key=sidePagesKey) # create the backing stores for the side nav-view. sidePagesIters = {} self.store = {} self.storeFilter = {} for sidepage in self.sidePages: sp, sp_id, sp_cat = sidepage if sp_cat not in self.store: # Label Icon sidePage Category self.store[sidepage[2]] = Gtk.ListStore(str, str, object, str) for category in CATEGORIES: if category["id"] == sp_cat: category["show"] = True # Don't allow item names (and their translations) to be more than 30 chars long. It looks ugly and it creates huge gaps in the icon views name = sp.name if len(name) > 30: name = "%s..." % name[:30] sidePagesIters[sp_id] = (self.store[sp_cat].append( [name, sp.icon, sp, sp_cat]), sp_cat) self.min_label_length = 0 self.min_pix_length = 0 for key in self.store: char, pix = self.get_label_min_width(self.store[key]) self.min_label_length = max(char, self.min_label_length) self.min_pix_length = max(pix, self.min_pix_length) self.storeFilter[key] = self.store[key].filter_new() self.storeFilter[key].set_visible_func( self.filter_visible_function) self.min_label_length += 2 self.min_pix_length += 4 self.min_label_length = max(self.min_label_length, MIN_LABEL_WIDTH) self.min_pix_length = max(self.min_pix_length, MIN_PIX_WIDTH) self.min_label_length = min(self.min_label_length, MAX_LABEL_WIDTH) self.min_pix_length = min(self.min_pix_length, MAX_PIX_WIDTH) self.displayCategories() # set up larger components. self.window.set_title(_("System Settings")) self.button_back.connect('clicked', self.back_to_icon_view) self.calculate_bar_heights() # Select the first sidePage if len(sys.argv) > 1 and sys.argv[1] in sidePagesIters: # If we're launching a module directly, set the WM class so GWL # can consider it as a standalone app and give it its own # group. wm_class = "cinnamon-settings %s" % sys.argv[1] self.window.set_wmclass(wm_class, wm_class) self.button_back.hide() (_iter, cat) = sidePagesIters[sys.argv[1]] path = self.store[cat].get_path(_iter) if path: self.go_to_sidepage(cat, path, user_action=False) else: self.search_entry.grab_focus() else: self.search_entry.grab_focus() self.window.connect("key-press-event", self.on_keypress) self.window.connect("button-press-event", self.on_buttonpress) self.window.show()
def __init__(self): Gio.Application.__init__(self, application_id="org.cinnamon.Settings_%d" % os.getpid(), flags=Gio.ApplicationFlags.NON_UNIQUE | Gio.ApplicationFlags.HANDLES_OPEN) self.builder = Gtk.Builder() self.builder.set_translation_domain('cinnamon') # let it translate! self.builder.add_from_file(os.path.join(config.currentPath, "cinnamon-settings.ui")) self.window = XApp.GtkWindow(window_position=Gtk.WindowPosition.CENTER, default_width=800, default_height=600) main_box = self.builder.get_object("main_box") self.window.add(main_box) self.top_bar = self.builder.get_object("top_bar") self.side_view = {} self.main_stack = self.builder.get_object("main_stack") self.main_stack.set_transition_type(Gtk.StackTransitionType.CROSSFADE) self.main_stack.set_transition_duration(150) self.header_stack = self.builder.get_object("header_stack") self.header_stack.set_transition_type(Gtk.StackTransitionType.CROSSFADE) self.header_stack.set_transition_duration(150) self.side_view_container = self.builder.get_object("category_box") self.side_view_sw = self.builder.get_object("side_view_sw") context = self.side_view_sw.get_style_context() context.add_class("cs-category-view") context.add_class("view") self.side_view_sw.show_all() self.content_box = self.builder.get_object("content_box") self.content_box_sw = self.builder.get_object("content_box_sw") self.content_box_sw.show_all() self.button_back = self.builder.get_object("button_back") self.button_back.set_tooltip_text(_("Back to all settings")) button_image = self.builder.get_object("image1") button_image.props.icon_size = Gtk.IconSize.MENU self.stack_switcher = self.builder.get_object("stack_switcher") self.search_entry = self.builder.get_object("search_box") self.search_entry.set_placeholder_text(_("Search")) self.search_entry.connect("changed", self.onSearchTextChanged) self.search_entry.connect("icon-press", self.onClearSearchBox) self.window.connect("destroy", self._quit) self.builder.connect_signals(self) self.sidePages: typing.List[SidePageData] = [] self.settings = Gio.Settings.new("org.cinnamon") self.current_cat_widget = None self.current_sidepage = None self.c_manager = capi.CManager() self.content_box.c_manager = self.c_manager self.bar_heights = 0 self.tab = 0 # open 'manage' tab by default self.sort = 1 # sorted by 'score' by default self.store_by_cat: typing.Dict[str, Gtk.ListStore] = {} self.storeFilter = {} # load CCC and standalone modules, but not python modules yet self.load_ccc_modules() self.load_standalone_modules() # if a certain sidepage is given via arguments, try to load only it if len(sys.argv) > 1: if self.load_sidepage_as_standalone(): return self.init_settings_overview()