Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAjay Garg <ajay@activitycentral.com>2012-02-21 16:44:11 (GMT)
committer Anish Mangal <anish@activitycentral.com>2012-04-27 10:02:37 (GMT)
commit4d9385ec93e7adc1124b861e70d44533d6eb3fb4 (patch)
tree01641afba58b3d1017bd966af6ad14e5c841a408
parent1441e68e5818db835de2c7a4139fbcf972e19545 (diff)
au#704: Allow the configuration of NTP Servers from DateTime CP
Changelog: =v2 over v1= Making use of this hook-function in "DateTime" and "Network" CP views, to get rid of the "Save" button in the "NTP Servers Configuration" and "Hidden Networks" sections respectively.
-rw-r--r--extensions/cpsection/datetime/model.py47
-rw-r--r--extensions/cpsection/datetime/view.py175
-rw-r--r--extensions/cpsection/network/view.py15
-rw-r--r--src/jarabe/controlpanel/gui.py1
-rw-r--r--src/jarabe/controlpanel/sectionview.py4
5 files changed, 224 insertions, 18 deletions
diff --git a/extensions/cpsection/datetime/model.py b/extensions/cpsection/datetime/model.py
index 84e1259..486bd6f 100644
--- a/extensions/cpsection/datetime/model.py
+++ b/extensions/cpsection/datetime/model.py
@@ -21,10 +21,16 @@
#
import os
+import logging
+
from gettext import gettext as _
import gconf
_zone_tab = '/usr/share/zoneinfo/zone.tab'
+NTPDATE_PATH = '/etc/rc.d/init.d/ntpdate'
+NTP_SERVER_CONFIG_FILENAME = '/etc/ntp/step-tickers'
+
+_logger = logging.getLogger('ControlPanel - TimeZone')
def _initialize():
@@ -92,5 +98,46 @@ def set_timezone(timezone):
raise ValueError(_('Error timezone does not exist.'))
return 1
+
+def is_ntp_servers_config_feature_available():
+ return os.path.exists(NTPDATE_PATH)
+
+
+def get_ntp_servers():
+ servers = []
+
+ # If the file does not exist, return.
+ if not os.path.exists(NTP_SERVER_CONFIG_FILENAME):
+ return servers
+
+ f = open(NTP_SERVER_CONFIG_FILENAME, 'r')
+ for server in f.readlines():
+ servers.append(server.rstrip('\n'))
+ f.close()
+
+ return servers
+
+
+def set_ntp_servers(servers):
+
+ # First remove the old ssid-file, if it exists.
+ if os.path.exists(NTP_SERVER_CONFIG_FILENAME):
+ try:
+ os.remove(NTP_SERVER_CONFIG_FILENAME)
+ except:
+ _logger.exception('Error removing file.')
+ return
+
+ # Do nothing and return, if the values-list is empty
+ if len(servers) == 0:
+ return
+
+ # If we reach here, we have a non-empty ssid-values-list.
+ f = open(NTP_SERVER_CONFIG_FILENAME, 'w')
+ for server in servers:
+ if len(server) > 0:
+ f.write(server + '\n')
+ f.close()
+
# inilialize the docstrings for the timezone
_initialize()
diff --git a/extensions/cpsection/datetime/view.py b/extensions/cpsection/datetime/view.py
index 1cef78f..1a4dfe8 100644
--- a/extensions/cpsection/datetime/view.py
+++ b/extensions/cpsection/datetime/view.py
@@ -20,11 +20,131 @@ from gettext import gettext as _
from sugar.graphics import style
from sugar.graphics import iconentry
+from sugar.graphics.icon import Icon
from jarabe.controlpanel.sectionview import SectionView
from jarabe.controlpanel.inlinealert import InlineAlert
+class AddRemoveWidget(gtk.HBox):
+
+ def __init__(self, label, add_button_clicked_cb,
+ remove_button_clicked_cb, index):
+ gtk.Box.__init__(self)
+ self.set_homogeneous(False)
+ self.set_spacing(10)
+
+ self._index = index
+ self._add_button_added = False
+ self._remove_button_added = False
+
+ self._entry_box = gtk.Entry()
+ self._entry_box.set_text(label)
+ self._entry_box.set_width_chars(40)
+ self.pack_start(self._entry_box, expand=False)
+ self._entry_box.show()
+
+ add_icon = Icon(icon_name='list-add')
+ self._add_button = gtk.Button()
+ self._add_button.set_image(add_icon)
+ self._add_button.connect('clicked',
+ add_button_clicked_cb,
+ self)
+
+ remove_icon = Icon(icon_name='list-remove')
+ self._remove_button = gtk.Button()
+ self._remove_button.set_image(remove_icon)
+ self._remove_button.connect('clicked',
+ remove_button_clicked_cb,
+ self)
+
+ self.__add_add_button()
+ self.__add_remove_button()
+
+ def _get_index(self):
+ return self._index
+
+ def _set_index(self, value):
+ self._index = value
+
+ def _get_entry(self):
+ return self._entry_box.get_text()
+
+ def __add_add_button(self):
+ self.pack_start(self._add_button, expand=False)
+ self._add_button.show()
+ self._add_button_added = True
+
+ def _remove_remove_button_if_not_already(self):
+ if self._remove_button_added:
+ self.__remove_remove_button()
+
+ def __remove_remove_button(self):
+ self.remove(self._remove_button)
+ self._remove_button_added = False
+
+ def _add_remove_button_if_not_already(self):
+ if not self._remove_button_added:
+ self.__add_remove_button()
+
+ def __add_remove_button(self):
+ self.pack_start(self._remove_button, expand=False)
+ self._remove_button.show()
+ self._remove_button_added = True
+
+
+class MultiWidget(gtk.VBox):
+
+ def __init__(self):
+ gtk.VBox.__init__(self)
+
+ def _add_widget(self, label):
+ new_widget = AddRemoveWidget(label,
+ self.__add_button_clicked_cb,
+ self.__remove_button_clicked_cb,
+ len(self.get_children()))
+ self.add(new_widget)
+ new_widget.show()
+ self.show()
+ self._update_remove_button_statuses()
+
+ def __add_button_clicked_cb(self, add_button,
+ add_button_container):
+ self._add_widget('')
+ self._update_remove_button_statuses()
+
+ def __remove_button_clicked_cb(self, remove_button,
+ remove_button_container):
+ for child in self.get_children():
+ if child._get_index() > remove_button_container._get_index():
+ child._set_index(child._get_index() - 1)
+
+ self.remove(remove_button_container)
+ self._update_remove_button_statuses()
+
+ def _update_remove_button_statuses(self):
+ children = self.get_children()
+
+ # Now, if there is only one entry, remove-button
+ # should not be shown.
+ if len(children) == 1:
+ children[0]._remove_remove_button_if_not_already()
+
+ # Alternatively, if there are more than 1 entries,
+ # remove-button should be shown for all.
+ if len(children) > 1:
+ for child in children:
+ child._add_remove_button_if_not_already()
+
+
+ def _get_entries(self):
+ entries = []
+ for child in self.get_children():
+ entries.append(child._get_entry())
+
+ return entries
+
+
class TimeZone(SectionView):
def __init__(self, model, alerts):
SectionView.__init__(self)
@@ -64,7 +184,11 @@ class TimeZone(SectionView):
self._treeview.set_search_entry(self._entry)
self._treeview.set_search_equal_func(self._search)
self._treeview.set_search_column(0)
- self._scrolled_window.add(self._treeview)
+
+ self._timezone_box = gtk.VBox()
+ self._scrolled_window.add_with_viewport(self._timezone_box)
+ self._timezone_box.show_all()
+ self._timezone_box.add(self._treeview)
self._treeview.show()
self._timezone_column = gtk.TreeViewColumn(_('Timezone'))
@@ -74,11 +198,15 @@ class TimeZone(SectionView):
self._timezone_column.set_sort_column_id(0)
self._treeview.append_column(self._timezone_column)
- self.pack_start(self._scrolled_window)
- self._scrolled_window.show()
+ self._container = gtk.VBox()
+ self._container.set_homogeneous(False)
+ self._container.pack_start(self._scrolled_window)
+ self._container.set_spacing(style.DEFAULT_SPACING)
+ self._container.show_all()
+ self.pack_start(self._container, expand=True)
self._zone_alert_box = gtk.HBox(spacing=style.DEFAULT_SPACING)
- self.pack_start(self._zone_alert_box, False)
+ self._timezone_box.pack_start(self._zone_alert_box, False)
self._zone_alert = InlineAlert()
self._zone_alert_box.pack_start(self._zone_alert)
@@ -103,6 +231,42 @@ class TimeZone(SectionView):
self._cursor_change_handler = self._treeview.connect( \
'cursor-changed', self.__zone_changed_cd)
+ if self._model.is_ntp_servers_config_feature_available():
+ self.setup_ui_for_ntp_server_config()
+
+ def setup_ui_for_ntp_server_config(self):
+ self._ntp_scrolled_window = gtk.ScrolledWindow()
+ self._ntp_scrolled_window.set_policy(gtk.POLICY_NEVER,
+ gtk.POLICY_AUTOMATIC)
+ box_ntp_servers_config = gtk.VBox()
+ box_ntp_servers_config.set_spacing(style.DEFAULT_SPACING)
+
+ separator_ntp_servers_config= gtk.HSeparator()
+ self._container.pack_start(separator_ntp_servers_config,
+ expand=False)
+ separator_ntp_servers_config.show()
+
+ label_ntp_servers_config = gtk.Label(_('NTP Servers Configuration'))
+ label_ntp_servers_config.set_alignment(0, 0)
+ self._container.pack_start(label_ntp_servers_config,
+ expand=False)
+ label_ntp_servers_config.show()
+
+ self._widget_table = MultiWidget()
+ box_ntp_servers_config.pack_start(self._widget_table, expand=False)
+ box_ntp_servers_config.show_all()
+
+ self._ntp_scrolled_window.add_with_viewport(box_ntp_servers_config)
+ self._container.pack_start(self._ntp_scrolled_window)
+ self._ntp_scrolled_window.show_all()
+
+ ntp_servers = self._model.get_ntp_servers()
+ if len(ntp_servers) == 0:
+ self._widget_table._add_widget('')
+ else:
+ for server in ntp_servers:
+ self._widget_table._add_widget(server)
+
def undo(self):
self._treeview.disconnect(self._cursor_change_handler)
self._model.undo()
@@ -138,3 +302,6 @@ class TimeZone(SectionView):
self._zone_alert.props.msg = self.restart_msg
self._zone_alert.show()
return False
+
+ def perform_accept_actions(self):
+ self._model.set_ntp_servers(self._widget_table._get_entries())
diff --git a/extensions/cpsection/network/view.py b/extensions/cpsection/network/view.py
index 5bfe01c..de2fd81 100644
--- a/extensions/cpsection/network/view.py
+++ b/extensions/cpsection/network/view.py
@@ -744,18 +744,6 @@ class Network(SectionView):
box_hidden_network.pack_start(self._widget_table, expand=False)
self._widget_table.show()
- save_button = gtk.Button()
- save_button.set_alignment(0, 0)
- save_button.set_label('Save')
- save_button.connect('clicked', self.__save_button_clicked_cb)
- box_save_button = gtk.HBox()
- box_save_button.set_homogeneous(False)
- box_save_button.pack_start(save_button, expand=False)
- save_button.show()
-
- box_hidden_network.pack_start(box_save_button, expand=False)
- box_save_button.show()
-
workspace.pack_start(box_hidden_network, expand=False)
box_hidden_network.show()
@@ -1017,9 +1005,8 @@ class Network(SectionView):
if not self._model.have_networks():
self._clear_history_button.set_sensitive(False)
- def __save_button_clicked_cb(self, save_button):
+ def perform_accept_actions(self):
self._model.set_ssids(self._widget_table._get_entries())
- save_button.set_sensitive(False)
def __launch_button_clicked_cb(self, launch_button):
self._model.launch_nm_connection_editor()
diff --git a/src/jarabe/controlpanel/gui.py b/src/jarabe/controlpanel/gui.py
index 61520e0..0b70af6 100644
--- a/src/jarabe/controlpanel/gui.py
+++ b/src/jarabe/controlpanel/gui.py
@@ -291,6 +291,7 @@ class ControlPanel(gtk.Window):
self._show_main_view()
def __accept_clicked_cb(self, widget):
+ self._section_view.perform_accept_actions()
if self._section_view.needs_restart:
self._section_toolbar.accept_button.set_sensitive(False)
self._section_toolbar.cancel_button.set_sensitive(False)
diff --git a/src/jarabe/controlpanel/sectionview.py b/src/jarabe/controlpanel/sectionview.py
index 4b5751f..836adf4 100644
--- a/src/jarabe/controlpanel/sectionview.py
+++ b/src/jarabe/controlpanel/sectionview.py
@@ -52,3 +52,7 @@ class SectionView(gtk.VBox):
def undo(self):
"""Undo here the changes that have been made in this section."""
pass
+
+ def perform_accept_actions(self):
+ """Perform additional actions, when the "Ok" button is clicked."""
+ pass