Beispiel #1
0
    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)
Beispiel #2
0
    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)
Beispiel #3
0
    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)
Beispiel #4
0
    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()
Beispiel #5
0
    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")