From 07bea68b0e55b67011b3c883e2b19cd9b2182505 Mon Sep 17 00:00:00 2001 From: Chris Ball Date: Tue, 08 Jul 2008 23:39:55 +0000 Subject: #7434 Add power section to the control panel --- diff --git a/data/icons/Makefile.am b/data/icons/Makefile.am index 625e78b..8209ca3 100644 --- a/data/icons/Makefile.am +++ b/data/icons/Makefile.am @@ -6,6 +6,7 @@ sugar_DATA = \ module-date_and_time.svg \ module-frame.svg \ module-language.svg \ - module-network.svg + module-network.svg \ + module-power.svg EXTRA_DIST = $(sugar_DATA) diff --git a/data/icons/module-power.svg b/data/icons/module-power.svg new file mode 100644 index 0000000..4db57ea --- /dev/null +++ b/data/icons/module-power.svg @@ -0,0 +1,13 @@ + + +]> + + + + + + + + + \ No newline at end of file diff --git a/po/POTFILES.in b/po/POTFILES.in index ce883b2..fac60a9 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -20,12 +20,14 @@ src/controlpanel/model/datetime.py src/controlpanel/model/frame.py src/controlpanel/model/language.py src/controlpanel/model/network.py +src/controlpanel/model/power.py src/controlpanel/view/aboutme.py src/controlpanel/view/aboutxo.py src/controlpanel/view/datetime.py src/controlpanel/view/frame.py src/controlpanel/view/language.py src/controlpanel/view/network.py +src/controlpanel/view/power.py src/view/devices/network/mesh.py src/view/frame/activitiestray.py src/view/home/favoritesview.py diff --git a/src/controlpanel/model/Makefile.am b/src/controlpanel/model/Makefile.am index 0e7a80d..20c27a9 100644 --- a/src/controlpanel/model/Makefile.am +++ b/src/controlpanel/model/Makefile.am @@ -6,8 +6,5 @@ sugar_PYTHON = \ datetime.py \ frame.py \ language.py \ - network.py - - - - + network.py \ + power.py diff --git a/src/controlpanel/model/power.py b/src/controlpanel/model/power.py new file mode 100644 index 0000000..bcf84f3 --- /dev/null +++ b/src/controlpanel/model/power.py @@ -0,0 +1,91 @@ +# Copyright (C) 2008 One Laptop Per Child +# +# This program 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. +# +# This program 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 this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# + +from gettext import gettext as _ + +from sugar import profile +import dbus + +OHM_SERVICE_NAME = 'org.freedesktop.ohm' +OHM_SERVICE_PATH = '/org/freedesktop/ohm/Keystore' +OHM_SERVICE_IFACE = 'org.freedesktop.ohm.Keystore' + +KEYWORDS = ['automatic', 'extreme', 'power', 'suspend', 'battery'] + +class ReadError(Exception): + def __init__(self, value): + self.value = value + def __str__(self): + return repr(self.value) + +def get_automatic_pm(): + pro = profile.get_profile() + ret = pro.automatic_pm + return ret + +def print_automatic_pm(): + print ('off', 'on')[get_automatic_pm()] + +def set_automatic_pm(enabled): + """Automatic suspends on/off.""" + + bus = dbus.SystemBus() + proxy = bus.get_object(OHM_SERVICE_NAME, OHM_SERVICE_PATH) + keystore = dbus.Interface(proxy, OHM_SERVICE_IFACE) + + if enabled == 'on' or enabled == 1: + keystore.SetKey("suspend.automatic_pm", 1) + enabled = True + elif enabled == 'off' or enabled == 0: + keystore.SetKey("suspend.automatic_pm", 0) + enabled = False + else: + raise ValueError(_("Error in automatic pm argument, use on/off.")) + + pro = profile.get_profile() + pro.automatic_pm = enabled + pro.save() + return 0 + +def get_extreme_pm(): + pro = profile.get_profile() + ret = pro.extreme_pm + return ret + +def print_extreme_pm(): + print ('off', 'on')[get_extreme_pm()] + +def set_extreme_pm(enabled): + """Extreme power management on/off.""" + + bus = dbus.SystemBus() + proxy = bus.get_object(OHM_SERVICE_NAME, OHM_SERVICE_PATH) + keystore = dbus.Interface(proxy, OHM_SERVICE_IFACE) + + if enabled == 'on' or enabled == 1: + keystore.SetKey("suspend.extreme_pm", 1) + enabled = True + elif enabled == 'off' or enabled == 0: + keystore.SetKey("suspend.extreme_pm", 0) + enabled = False + else: + raise ValueError(_("Error in extreme pm argument, use on/off.")) + + pro = profile.get_profile() + pro.extreme_pm = enabled + pro.save() + return 0 diff --git a/src/controlpanel/view/Makefile.am b/src/controlpanel/view/Makefile.am index 0fd9445..a4d2a53 100644 --- a/src/controlpanel/view/Makefile.am +++ b/src/controlpanel/view/Makefile.am @@ -6,7 +6,8 @@ sugar_PYTHON = \ datetime.py \ frame.py \ language.py \ - network.py + network.py \ + power.py diff --git a/src/controlpanel/view/power.py b/src/controlpanel/view/power.py new file mode 100644 index 0000000..38d2b24 --- /dev/null +++ b/src/controlpanel/view/power.py @@ -0,0 +1,182 @@ +# Copyright (C) 2008, OLPC +# +# This program 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. +# +# This program 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 this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +import gtk +from gettext import gettext as _ + +from sugar.graphics import style + +from controlpanel.sectionview import SectionView +from controlpanel.inlinealert import InlineAlert + +CLASS = 'Power' +ICON = 'module-power' +TITLE = _('Power') + +class Power(SectionView): + def __init__(self, model, alerts): + SectionView.__init__(self) + + self._model = model + self.restart_alerts = alerts + self._automatic_pm_valid = True + self._extreme_pm_valid = True + self._extreme_pm_change_handler = None + self._automatic_pm_change_handler = None + + self.set_border_width(style.DEFAULT_SPACING * 2) + self.set_spacing(style.DEFAULT_SPACING) + group = gtk.SizeGroup(gtk.SIZE_GROUP_HORIZONTAL) + + self._automatic_pm_alert_box = gtk.HBox(spacing=style.DEFAULT_SPACING) + self._extreme_pm_alert_box = gtk.HBox(spacing=style.DEFAULT_SPACING) + + separator_pm = gtk.HSeparator() + self.pack_start(separator_pm, expand=False) + separator_pm.show() + + label_pm = gtk.Label(_('Power management')) + label_pm.set_alignment(0, 0) + self.pack_start(label_pm, expand=False) + label_pm.show() + box_pm = gtk.VBox() + box_pm.set_border_width(style.DEFAULT_SPACING * 2) + box_pm.set_spacing(style.DEFAULT_SPACING) + + box_automatic_pm = gtk.HBox(spacing=style.DEFAULT_SPACING) + label_automatic_pm = gtk.Label( + _('Automatic power management (increases battery life)')) + label_automatic_pm.set_alignment(0, 0.5) + self._automatic_button = gtk.CheckButton() + self._automatic_button.set_alignment(0, 0) + box_automatic_pm.pack_start(self._automatic_button, expand=False) + box_automatic_pm.pack_start(label_automatic_pm, expand=False) + self._automatic_button.show() + label_automatic_pm.show() + group.add_widget(label_automatic_pm) + box_pm.pack_start(box_automatic_pm, expand=False) + box_automatic_pm.show() + + self._automatic_pm_alert = InlineAlert() + label_automatic_pm_error = gtk.Label() + group.add_widget(label_automatic_pm_error) + self._automatic_pm_alert_box.pack_start(label_automatic_pm_error, + expand=False) + label_automatic_pm_error.show() + self._automatic_pm_alert_box.pack_start(self._automatic_pm_alert, + expand=False) + box_pm.pack_end(self._automatic_pm_alert_box, expand=False) + self._automatic_pm_alert_box.show() + if 'automatic_pm' in self.restart_alerts: + self._automatic_pm_alert.props.msg = self.restart_msg + self._automatic_pm_alert.show() + + box_extreme_pm = gtk.HBox(spacing=style.DEFAULT_SPACING) + label_extreme_pm = gtk.Label( + _('Extreme power management (disables wireless radio, increases battery life)')) + label_extreme_pm.set_alignment(0, 0.5) + self._extreme_button = gtk.CheckButton() + self._extreme_button.set_alignment(0, 0) + box_extreme_pm.pack_start(self._extreme_button, expand=False) + self._extreme_button.show() + box_extreme_pm.pack_start(label_extreme_pm, expand=False) + group.add_widget(label_extreme_pm) + label_extreme_pm.show() + box_pm.pack_start(box_extreme_pm, expand=False) + box_extreme_pm.show() + + self._extreme_pm_alert = InlineAlert() + label_extreme_pm_error = gtk.Label() + group.add_widget(label_extreme_pm_error) + self._extreme_pm_alert_box.pack_start(label_extreme_pm_error, + expand=False) + label_extreme_pm_error.show() + self._extreme_pm_alert_box.pack_start(self._extreme_pm_alert, + expand=False) + box_pm.pack_end(self._extreme_pm_alert_box, expand=False) + self._extreme_pm_alert_box.show() + if 'extreme_pm' in self.restart_alerts: + self._extreme_pm_alert.props.msg = self.restart_msg + self._extreme_pm_alert.show() + + self.pack_start(box_pm, expand=False) + box_pm.show() + + self.setup() + + def setup(self): + try: + automatic_state = self._model.get_automatic_pm() + extreme_state = self._model.get_extreme_pm() + + except Exception, detail: + self._automatic_pm_alert.props.msg = detail + self._automatic_pm_alert.show() + + self._extreme_pm_alert.props.msg = detail + self._extreme_pm_alert.show() + else: + self._automatic_button.set_active(automatic_state) + self._extreme_button.set_active(extreme_state) + + self._extreme_pm_valid = True + self._automatic_pm_valid = True + self.needs_restart = False + self._automatic_pm_change_handler = self._automatic_button.connect( \ + 'toggled', self.__automatic_pm_toggled_cb) + self._extreme_pm_change_handler = self._extreme_button.connect( \ + 'toggled', self.__extreme_pm_toggled_cb) + + def undo(self): + self._automatic_button.disconnect(self._automatic_pm_change_handler) + self._extreme_button.disconnect(self._extreme_pm_change_handler) + self._model.undo() + self._extreme_pm_alert.hide() + self._automatic_pm_alert.hide() + + def __automatic_pm_toggled_cb(self, widget, data=None): + state = widget.get_active() + try: + self._model.set_automatic_pm(state) + except Exception, detail: + print detail + self._automatic_pm_alert.props.msg = detail + else: + self._automatic_pm_valid = True + + if self._automatic_pm_valid and self._extreme_pm_valid: + self.props.is_valid = True + else: + self.props.is_valid = False + + return False + + def __extreme_pm_toggled_cb(self, widget, data=None): + state = widget.get_active() + try: + self._model.set_extreme_pm(state) + except Exception, detail: + print detail + self._extreme_pm_alert.props.msg = detail + else: + self._extreme_pm_valid = True + + if self._extreme_pm_valid and self._extreme_pm_valid: + self.props.is_valid = True + else: + self.props.is_valid = False + + return False -- cgit v0.9.1