Skip to content

Commit

Permalink
Exclude wireless section of control panel if there's no wireless device.
Browse files Browse the repository at this point in the history
Remove distracting interface elements when they are not needed.
Keep a clear and simple interface for Sugar.

The NetworkManager dependency advances to version 0.9.9 in order to
list wireless devices when the radio is disabled.
  • Loading branch information
FGrose committed Feb 5, 2014
1 parent 6ff4d42 commit 102dd5f
Show file tree
Hide file tree
Showing 2 changed files with 110 additions and 80 deletions.
173 changes: 93 additions & 80 deletions extensions/cpsection/network/view.py
Expand Up @@ -41,10 +41,15 @@ def __init__(self, model, alerts):
self.restart_alerts = alerts
self._jabber_sid = 0
self._jabber_valid = True
self._radio_valid = True
self._jabber_change_handler = None
self._radio_change_handler = None
self._wireless_configuration_reset_handler = None

self._radio_valid = True
self.wireless_available = \
self._model.network.wireless_device_available()
if self.wireless_available:
self._radio_change_handler = None
self._wireless_configuration_reset_handler = None
self._radio_alert_box = Gtk.HBox(spacing=style.DEFAULT_SPACING)

self.set_border_width(style.DEFAULT_SPACING * 2)
self.set_spacing(style.DEFAULT_SPACING)
Expand All @@ -62,68 +67,73 @@ def __init__(self, model, alerts):
scrolled.add_with_viewport(workspace)
workspace.show()

separator_wireless = Gtk.HSeparator()
workspace.pack_start(separator_wireless, False, True, 0)
separator_wireless.show()

label_wireless = Gtk.Label(label=_('Wireless'))
label_wireless.set_alignment(0, 0)
workspace.pack_start(label_wireless, False, True, 0)
label_wireless.show()
box_wireless = Gtk.VBox()
box_wireless.set_border_width(style.DEFAULT_SPACING * 2)
box_wireless.set_spacing(style.DEFAULT_SPACING)

radio_info = Gtk.Label(label=_('The wireless radio may be turned'
' off to save battery life.'))
radio_info.set_alignment(0, 0)
radio_info.set_line_wrap(True)
radio_info.show()
box_wireless.pack_start(radio_info, False, True, 0)

box_radio = Gtk.HBox(spacing=style.DEFAULT_SPACING)
self._button = Gtk.CheckButton()
self._button.set_alignment(0, 0)
box_radio.pack_start(self._button, False, True, 0)
self._button.show()

label_radio = Gtk.Label(label=_('Radio'))
label_radio.set_alignment(0, 0.5)
box_radio.pack_start(label_radio, False, True, 0)
label_radio.show()

box_wireless.pack_start(box_radio, False, True, 0)
box_radio.show()

self._radio_alert = InlineAlert()
self._radio_alert_box.pack_start(self._radio_alert, False, True, 0)
box_radio.pack_end(self._radio_alert_box, False, True, 0)
self._radio_alert_box.show()
if 'radio' in self.restart_alerts:
self._radio_alert.props.msg = self.restart_msg
self._radio_alert.show()

wireless_info = Gtk.Label(label=_('Discard wireless connections if'
' you have trouble connecting to the network'))
wireless_info.set_alignment(0, 0)
wireless_info.set_line_wrap(True)
wireless_info.show()
box_wireless.pack_start(wireless_info, False, True, 0)

box_clear_wireless = Gtk.HBox(spacing=style.DEFAULT_SPACING)
self._clear_wireless_button = Gtk.Button()
self._clear_wireless_button.set_label(_(
'Discard wireless connections'))
box_clear_wireless.pack_start(
self._clear_wireless_button, False, True, 0)
if not self._model.have_wireless_networks():
self._clear_wireless_button.set_sensitive(False)
self._clear_wireless_button.show()
box_wireless.pack_start(box_clear_wireless, False, True, 0)
box_clear_wireless.show()

workspace.pack_start(box_wireless, False, True, 0)
box_wireless.show()
if self.wireless_available:
separator_wireless = Gtk.HSeparator()
workspace.pack_start(separator_wireless, False, True, 0)
separator_wireless.show()

label_wireless = Gtk.Label(label=_('Wireless'))
label_wireless.set_alignment(0, 0)
workspace.pack_start(label_wireless, False, True, 0)
label_wireless.show()
box_wireless = Gtk.VBox()
box_wireless.set_border_width(style.DEFAULT_SPACING * 2)
box_wireless.set_spacing(style.DEFAULT_SPACING)

radio_info = Gtk.Label(label=_('The wireless radio may be turned'
' off to save battery life.'))
radio_info.set_alignment(0, 0)
radio_info.set_line_wrap(True)
radio_info.show()
box_wireless.pack_start(radio_info, False, True, 0)

box_radio = Gtk.HBox(spacing=style.DEFAULT_SPACING)
self._button = Gtk.CheckButton()
self._button.set_alignment(0, 0)
box_radio.pack_start(self._button, False, True, 0)
self._button.show()

label_radio = Gtk.Label(label=_('Radio'))
label_radio.set_alignment(0, 0.5)
box_radio.pack_start(label_radio, False, True, 0)
label_radio.show()

box_wireless.pack_start(box_radio, False, True, 0)
box_radio.show()

self._radio_alert = InlineAlert()
self._radio_alert_box.pack_start(self._radio_alert, False, True, 0)
box_radio.pack_end(self._radio_alert_box, False, True, 0)
self._radio_alert_box.show()
if 'radio' in self.restart_alerts:
self._radio_alert.props.msg = self.restart_msg
self._radio_alert.show()

wireless_info = Gtk.Label(label=_('Discard wireless connections if'
' you have trouble connecting to the network.'))
wireless_info.set_alignment(0, 0)
wireless_info.set_line_wrap(True)
wireless_info.show()
box_wireless.pack_start(wireless_info, False, True, 0)

box_clear_wireless = Gtk.HBox(spacing=style.DEFAULT_SPACING)
self._clear_wireless_button = Gtk.Button()
self._clear_wireless_button.set_label(_(
'Discard wireless connections'))
box_clear_wireless.pack_start(self._clear_wireless_button, False,
True, 0)
import rpdb2; rpdb2.start_embedded_debugger("debug")
if self._model.have_wireless_networks():
self._clear_wireless_button.set_sensitive(False)
self._clear_wireless_button.show()
box_wireless.pack_start(box_clear_wireless, False, True, 0)
box_clear_wireless.show()

workspace.pack_start(box_wireless, False, True, 0)
box_wireless.show()
else:
# Delete radio code objects in memory for this invocation.
del self._model._options['radio']

separator_mesh = Gtk.HSeparator()
workspace.pack_start(separator_mesh, False, False, 0)
Expand Down Expand Up @@ -181,31 +191,34 @@ def __init__(self, model, alerts):

def setup(self):
self._entry.set_text(self._model.get_jabber())
try:
radio_state = self._model.get_radio()
except self._model.ReadError, detail:
self._radio_alert.props.msg = detail
self._radio_alert.show()
else:
self._button.set_active(radio_state)

if self.wireless_available:
try:
radio_state = self._model.get_radio()
except self._model.ReadError, detail:
self._radio_alert.props.msg = detail
self._radio_alert.show()
else:
self._button.set_active(radio_state)
self._radio_change_handler = self._button.connect(
'toggled', self.__radio_toggled_cb)
self._wireless_configuration_reset_handler = \
self._clear_wireless_button.connect(
'clicked', self.__wireless_configuration_reset_cb)
self._radio_valid = True

self._jabber_valid = True
self._radio_valid = True
self.needs_restart = False
self._radio_change_handler = self._button.connect(
'toggled', self.__radio_toggled_cb)
self._jabber_change_handler = self._entry.connect(
'changed', self.__jabber_changed_cb)
self._wireless_configuration_reset_handler = \
self._clear_wireless_button.connect(
'clicked', self.__wireless_configuration_reset_cb)

def undo(self):
self._button.disconnect(self._radio_change_handler)
if self.wireless_available:
self._button.disconnect(self._radio_change_handler)
self._radio_alert.hide()
self._entry.disconnect(self._jabber_change_handler)
self._model.undo()
self._jabber_alert.hide()
self._radio_alert.hide()

def _validate(self):
if self._jabber_valid and self._radio_valid:
Expand Down
17 changes: 17 additions & 0 deletions src/jarabe/model/network.py
Expand Up @@ -3,6 +3,7 @@
# Copyright (C) 2009-2010 One Laptop per Child
# Copyright (C) 2009 Paraguay Educa, Martin Abente
# Copyright (C) 2010 Plan Ceibal, Daniel Castelo
# Copyright (C) 2014 Sugar Labs, Frederick Grose
#
# 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
Expand Down Expand Up @@ -1032,6 +1033,22 @@ def find_gsm_connection():
return find_connection_by_id(GSM_CONNECTION_ID)


def wireless_device_available():
"""
Check for the presence of a registered wireless adapter.
"""
bus = dbus.SystemBus()
netmgr_obj = bus.get_object(NM_SERVICE, NM_PATH)
netmgr = dbus.Interface(netmgr_obj, NM_IFACE)
devices = netmgr.GetDevices()
for device in devices:
dev_proxy = bus.get_object(NM_IFACE, device)
prop_iface = dbus.Interface(dev_proxy, dbus.PROPERTIES_IFACE)
device_type = prop_iface.Get(NM_DEVICE_IFACE, 'DeviceType')
if device_type == NM_DEVICE_TYPE_WIFI:
return True


def disconnect_access_points(ap_paths):
"""
Disconnect all devices connected to any of the given access points.
Expand Down

0 comments on commit 102dd5f

Please sign in to comment.