def prepare_scene(self): """ Called when doing the scene setup. """ self.scene_container = self.objects.main # Check for savespace... if os.path.exists("/etc/dpkg/dpkg.cfg.d/keeptalking"): self.objects.savespace_enable.set_active(True) # Create unlockbar self.unlockbar = UnlockBar( "org.semplicelinux.keeptalking2.change-locale") self.unlockbar.connect("locked", self.on_locked) self.unlockbar.connect("unlocked", self.on_unlocked) self.objects.main.pack_start(self.unlockbar, False, False, 0) self.Locale = Locale() self.default = None # Make the locale_view treeview working... locale_renderer = Gtk.CellRendererText() self.locale_column = Gtk.TreeViewColumn("Locale", locale_renderer, text=1) self.objects.locales.set_sort_column_id(1, Gtk.SortType.ASCENDING) self.objects.locale_view.append_column(self.locale_column) type_renderer = Gtk.CellRendererText() self.type_column = Gtk.TreeViewColumn("Type", type_renderer, text=2) self.objects.locale_view.append_column(self.type_column) # Populate the locale list GObject.idle_add(self.build_locale_list)
def prepare_scene(self): """ Fired when the module has just been loaded and we should setup things. """ self.scene_container = self.objects.main # g-signals self.signal_handlers = {"UserListChanged": self.build_user_list} # Create unlockbar self.unlockbar = UnlockBar("org.semplicelinux.usersd.manage") self.unlockbar.connect("locked", self.on_locked) self.unlockbar.connect("unlocked", self.on_unlocked) self.objects.main.pack_start(self.unlockbar, False, False, 0) # Bind the locked state to the sensitiveness of the use_scrolled ScrolledWindow self.unlockbar.bind_property( "lock", self.objects.user_scrolled, "sensitive", GObject.BindingFlags.SYNC_CREATE | GObject.BindingFlags.INVERT_BOOLEAN) # ListBox sort self.objects.user_list.set_sort_func(self.determine_row_sorting) # Delete user dialog self.objects.delete_user_dialog.bind_property( "visible", self.objects.main, "sensitive", GObject.BindingFlags.DEFAULT | GObject.BindingFlags.INVERT_BOOLEAN) self.objects.delete_user_dialog.add_buttons(_("_Cancel"), Gtk.ResponseType.CANCEL, _("_Delete user"), Gtk.ResponseType.OK) self.objects.delete_user_dialog.get_widget_for_response( Gtk.ResponseType.OK).get_style_context().add_class( "destructive-action") # Groups dialog self.objects.groups_dialog.bind_property( "visible", self.objects.main, "sensitive", GObject.BindingFlags.DEFAULT | GObject.BindingFlags.INVERT_BOOLEAN) self.objects.groups_dialog.add_buttons(_("_Close"), Gtk.ResponseType.CLOSE) self.group_enabled_toggle = Gtk.CellRendererToggle() self.objects.groups_treeview.append_column( Gtk.TreeViewColumn("Enabled", self.group_enabled_toggle, active=1)) self.group_enabled_toggle.connect("toggled", self.on_group_enabled_toggle_toggled) self.objects.groups_treeview.append_column( Gtk.TreeViewColumn("Group description", Gtk.CellRendererText(), text=2)) self.objects.groups_store.set_sort_column_id(0, Gtk.SortType.ASCENDING) self.objects.administrator.connect("notify::active", self.on_administrator_changed)
def prepare_scene(self): """ Called when doing the scene setup. """ self.scene_container = self.objects.main # Create unlockbar self.unlockbar = UnlockBar("org.freedesktop.locale1.set-keyboard") self.unlockbar.connect("locked", self.on_locked) self.unlockbar.connect("unlocked", self.on_unlocked) self.objects.main.pack_start(self.unlockbar, False, False, 0) self.Keyboard = Keyboard() self.building_list = False self.default = None self.default_variant = None self.default_model = None # Make the layout_view treeview working... layout_renderer = Gtk.CellRendererText() self.layout_column = Gtk.TreeViewColumn("Layout", layout_renderer, text=1) self.objects.layouts.set_sort_column_id(1, Gtk.SortType.ASCENDING) self.objects.layout_view.append_column(self.layout_column) # Do the same for the variant_view... variant_renderer = Gtk.CellRendererText() self.variant_column = Gtk.TreeViewColumn("Variant", variant_renderer, text=1) self.objects.variants.set_sort_column_id(1, Gtk.SortType.ASCENDING) self.objects.variant_view.append_column(self.variant_column) # And something similar for the model combobox... model_renderer = Gtk.CellRendererText() self.objects.model_combo.pack_start(model_renderer, True) self.objects.model_combo.add_attribute(model_renderer, "text", 1) self.objects.models.set_sort_column_id(1, Gtk.SortType.ASCENDING) # Populate the layout list GObject.idle_add(self.build_layout_list) # Populate the model list GObject.idle_add(self.build_model_list)
def prepare_scene(self): """ Fired when doing the scene setup. """ self.scene_container = self.objects.main # Connect to the handler self.handler = UpdateHandler() # Convenience variable that houses the "installing" state. # Used when checking whether to continue following the apt log, # without flooding the DBus bus. self._installing = False # Determines if we are following the log or not self.following_log = False # APT_LOG follower (FIXME: should move it elsewhere) self.follower = None # Determines if the log has been fully written to the buffer self.log_written = False # Set appropriate font size and weight for the "Distribution upgrades" label context = self.objects.distribution_upgrade_label.create_pango_context( ) desc = context.get_font_description() desc.set_weight(Pango.Weight.LIGHT) # Weight desc.set_size(Pango.SCALE * 13) # Size self.objects.distribution_upgrade_label.override_font(desc) # Do the same for the "Application updates" label self.objects.application_updates_label.override_font(desc) # ...and for the "The software is up-to-date" one self.objects.application_updates_status.override_font(desc) # ..and for the error_description desc.set_size(Pango.SCALE * 10) self.objects.error_description.override_font(desc) # ...and for the "Semplice is installing the updates" one desc.set_size(Pango.SCALE * 20) self.objects.install_label.override_font(desc) # Create unlockbar self.unlockbar = UnlockBar("org.semplicelinux.channels.manage") self.objects.summary.pack_start(self.unlockbar, False, False, 0) # Set-up channel combobox renderer = Gtk.CellRendererText() self.objects.selected_channel.pack_start(renderer, True) self.objects.selected_channel.add_attribute(renderer, "text", 1) self.objects.selected_channel.add_attribute(renderer, "sensitive", 2) # Create update list self.update_list = UpdateList() self.objects.application_updates_scroll.add(self.update_list) #self.objects.application_updates_content.pack_start(self.update_list, True, True, 5) #self.update_list.prepend(Gtk.Label("HAAA")) #print(len(self.update_list), self.update_list.props.empty, self.update_list.props.selection_mode) self.update_list.show_all() # Open AppStream database # FIXME pending AppStream API update. See #4 #Database.open() #for item in ["glade", "pokerth", "banshee", "gnome-software"]: # self.update_list.add_item(-1, item, "XX", "upgrade", True) # FIXME self.objects.distribution_upgrade.hide() # Connect to status-toggled self.update_list.connect("status-toggled", self.on_status_toggled) # Connect to lock failed: self.handler.connect("lock-failed", self.on_lock_failed) # Connect to generic failure: self.handler.connect("generic-failure", self.on_generic_failure) # Connect to update found: self.handler.connect("update-found", self.on_update_found) # Connect to package-status-changed self.handler.connect("package-status-changed", self.on_package_status_changed) # Connect to package-fetch signals self.handler.connect("package-fetch-started", self.on_package_fetch_started) self.handler.connect("package-fetch-failed", self.on_package_fetch_failed) self.handler.connect("package-fetch-finished", self.on_package_fetch_finished) # React when checking changes self.handler.connect("notify::checking", self.on_checking_changed) # React when refreshing self.handler.connect("notify::refreshing", self.on_refreshing_changed) # React when downloading self.handler.connect("notify::downloading", self.on_downloading_changed) # React when installing self.handler.connect("notify::installing", self.on_installing_changed) # React when we know the total size to download self.handler.connect("notify::update-required-download", self.on_update_required_download_changed) # Ensure that the updates_frame is not sensitive when the settings # are locked... self.unlockbar.bind_property("lock", self.objects.settings_frame, "sensitive", GObject.BindingFlags.INVERT_BOOLEAN) # Show the up-to-date container if the update list is empty self.update_list.bind_property( "empty", self.objects.application_updates_status, "visible", GObject.BindingFlags.DEFAULT | GObject.BindingFlags.SYNC_CREATE) self.handler.bind_property( "status-scene", self.objects.application_updates_status, "visible_child_name", GObject.BindingFlags.DEFAULT | GObject.BindingFlags.SYNC_CREATE) #self.handler.bind_property( # "cache-operation", # self.objects.application_updates_checking_container, # "visible", # GObject.BindingFlags.DEFAULT | GObject.BindingFlags.SYNC_CREATE #) #self.objects.application_updates_checking_container.bind_property( # "visible", # self.objects.software_uptodate_container, # "visible", # GObject.BindingFlags.INVERT_BOOLEAN | GObject.BindingFlags.SYNC_CREATE #) self.update_list.bind_property( "empty", self.objects.application_updates_scroll, "visible", GObject.BindingFlags.INVERT_BOOLEAN | GObject.BindingFlags.SYNC_CREATE) self.update_list.bind_property( "empty", self.objects.application_updates_actions, "visible", GObject.BindingFlags.INVERT_BOOLEAN | GObject.BindingFlags.SYNC_CREATE) # Show download indicators when the cache is refreshing self.handler.bind_property("cache-operation", self.objects.spinner, "active", GObject.BindingFlags.SYNC_CREATE) self.handler.bind_property("download-operation", self.objects.download_rate, "visible", GObject.BindingFlags.SYNC_CREATE) self.handler.bind_property("download-operation", self.objects.download_eta, "visible", GObject.BindingFlags.SYNC_CREATE) self.handler.bind_property("download-rate", self.objects.download_rate, "label", GObject.BindingFlags.DEFAULT) self.handler.bind_property("download-eta", self.objects.download_eta, "label", GObject.BindingFlags.DEFAULT) self.handler.bind_property("download-current-item", self.objects.download_rate, "tooltip_text", GObject.BindingFlags.DEFAULT) self.handler.bind_property( "cache-operation", self.objects.refresh_button, "sensitive", GObject.BindingFlags.INVERT_BOOLEAN | GObject.BindingFlags.SYNC_CREATE) self.handler.bind_property( "cache-operation", self.update_list, "sensitive", GObject.BindingFlags.INVERT_BOOLEAN | GObject.BindingFlags.SYNC_CREATE) self.handler.bind_property( "cache-operation", self.objects.application_updates_actions, "sensitive", GObject.BindingFlags.INVERT_BOOLEAN | GObject.BindingFlags.SYNC_CREATE) # Remove sensitiveness on checkbuttons when downloading self.handler.bind_property( "downloading", self.update_list.package_checkbox, "sensitive", GObject.BindingFlags.INVERT_BOOLEAN | GObject.BindingFlags.SYNC_CREATE) # Update labels in the action buttons accordingly to the current mode self.handler.bind_property("download-operation-label", self.objects.download_button, "label", GObject.BindingFlags.SYNC_CREATE) self.handler.bind_property("install-operation-label", self.objects.install_button, "label", GObject.BindingFlags.SYNC_CREATE) # Update sensitiveness of the install_button when downloading self.handler.bind_property( "downloading", self.objects.install_button, "sensitive", GObject.BindingFlags.INVERT_BOOLEAN | GObject.BindingFlags.SYNC_CREATE) # Update the installation_scene label self.handler.bind_property("install-scene-label", self.objects.install_label, "label", GObject.BindingFlags.SYNC_CREATE) # Show the log textview when "Show details" has been pressed self.objects.show_details_button.bind_property( "active", self.objects.details_scrolled, "visible", GObject.BindingFlags.SYNC_CREATE) # Switch into the installation mode if channels is already installing if self.handler.props.installing: self.on_installing_changed() else: # Check for updates if not self.handler.props.refreshing: self.handler.check() # Downloading? Enable the mode if self.handler.props.downloading: #self.on_downloading_changed() self.update_list.enable_downloading_mode()
def prepare_scene(self): """ Called when doing the scene setup. """ self.scene_container = self.objects.main # g-signals self.signal_handlers = { "BrightnessChanged": self.on_brightness_level_changed_external, } # Create unlockbar self.unlockbar = UnlockBar( "org.semplicelinux.vera.powermanager.modify-logind") self.objects.main.pack_start(self.unlockbar, False, False, 0) # Search for batteries for device in self.client.get_devices(): if device.props.is_present and device.props.power_supply and device.props.kind == Up.DeviceKind.BATTERY: # Found a power supply, and we'll show this in the UI. self.with_battery = device # We show only one battery, otherwise the UI will be a mess break # If there is a battery, bind properties to get live updates on the status if self.with_battery: # Show the battery frame self.objects.battery_frame.show() # Name self.objects.battery_name.set_text("%s %s" % (self.with_battery.props.vendor, self.with_battery.props.model)) # Percentage on charge_bar self.with_battery.bind_property( "percentage", self.objects.charge_bar, "value", GObject.BindingFlags.DEFAULT | GObject.BindingFlags.SYNC_CREATE) # Percentage on label # Currently python-gi doesn't support bind_property_full(), which is # a shame because it's fantastic. # So we are using a connection here. percentage_callback = lambda x, y: self.objects.battery_percentage.set_text( "%s%%" % int(self.with_battery.props.percentage)) self.with_battery.connect("notify::percentage", percentage_callback) percentage_callback(None, None) # Status on label # Unforunately, same as above. status_callback = lambda x, y: self.objects.battery_status.set_text( "%s, " % BATTERY_STATE[self.with_battery.props.state]) self.with_battery.connect("notify::state", status_callback) status_callback(None, None) # Check for lid switch if os.path.exists("/proc/acpi/button/lid"): # That's a pretty dirty check self.objects.lid_switch_container.show() # Create cells for the comboboxes for combo in (self.objects.power_button_action, self.objects.lid_switch_action): cellrenderer = Gtk.CellRendererText() combo.pack_start(cellrenderer, True) combo.add_attribute(cellrenderer, "text", 1) combo.connect("changed", self.on_combobox_changed) # Disable "Buttons" frame when locked self.unlockbar.bind_property( "lock", self.objects.buttons_frame, "sensitive", GObject.BindingFlags.DEFAULT | GObject.BindingFlags.SYNC_CREATE | GObject.BindingFlags.INVERT_BOOLEAN)
def prepare_scene(self): """ Called when doing the scene setup. """ self.scene_container = self.objects.main self.default = None self.TimeZone = TimeZone() self.hour_offset = 0 self.timezone12 = None # Create unlockbar self.unlockbar = UnlockBar("org.freedesktop.timedate1.set-time") self.unlockbar.connect("locked", self.on_locked) self.unlockbar.connect("unlocked", self.on_unlocked) self.objects.main_box.pack_start(self.unlockbar, False, False, 0) # Enter in the bus self.bus_cancellable = Gio.Cancellable() self.bus = Gio.bus_get_sync(Gio.BusType.SYSTEM, self.bus_cancellable) self.TimeDate = Gio.DBusProxy.new_sync(self.bus, 0, None, BUS_NAME, "/org/freedesktop/timedate1", BUS_NAME, self.bus_cancellable) self.TimeDateProperties = Gio.DBusProxy.new_sync( self.bus, 0, None, BUS_NAME, "/org/freedesktop/timedate1", "org.freedesktop.DBus.Properties", self.bus_cancellable ) # Really we should create a new proxy to get the properties?! #self.refresh_infos() # Set-up select timezone dialog self.objects.timezone_treeview.append_column( Gtk.TreeViewColumn("Timezone", Gtk.CellRendererText(), text=0)) self.objects.timezones.set_sort_column_id(0, Gtk.SortType.ASCENDING) # Create calendar popover self.calendar = Gtk.Calendar() self.calendar.connect("day-selected", self.on_day_selected) self.calendar_popover = Gtk.Popover.new(self.objects.calendar_button) self.calendar_popover.set_modal(True) self.calendar_popover.connect( "closed", lambda x: self.objects.calendar_button.set_active(False)) self.calendar_popover.add(self.calendar) # Set appropriate font size and weight context = self.objects.time.create_pango_context() desc = context.get_font_description() desc.set_weight(Pango.Weight.LIGHT) # Weight desc.set_size(Pango.SCALE * 80) # Size self.objects.time.override_font(desc) self.objects.hours.override_font(desc) self.objects.minutes.override_font(desc) self.objects.seconds.override_font(desc) self.objects.timezone12_edit.override_font(desc) # Set mask on the main eventbox self.objects.main.set_events(Gdk.EventMask.BUTTON_PRESS_MASK) # Styling self.objects.time_button.get_style_context().add_class("no-borders") self.objects.location_button.get_style_context().add_class( "no-borders") self.objects.calendar_button.get_style_context().add_class( "no-borders")