summaryrefslogtreecommitdiff
path: root/timer-applet/src/timerapplet/ui/StartTimerDialog.py
diff options
context:
space:
mode:
authorStefano Karapetsas <[email protected]>2014-01-30 16:04:57 +0100
committerStefano Karapetsas <[email protected]>2014-01-30 16:04:57 +0100
commit8795f06d464700494234e589020e5e29854aeb8c (patch)
treef2525b646023e533f03d5c80240563b89ab5b152 /timer-applet/src/timerapplet/ui/StartTimerDialog.py
parentc8a85a6aa040c1d2505b957af4cfb4bd39466504 (diff)
parent064212a25bea1fcf8901cd0a1d55aae0899f627c (diff)
downloadmate-applets-8795f06d464700494234e589020e5e29854aeb8c.tar.bz2
mate-applets-8795f06d464700494234e589020e5e29854aeb8c.tar.xz
Merge branch 'dev-timer-applet'
Closes #45 https://github.com/mate-desktop/mate-applets/issues/45
Diffstat (limited to 'timer-applet/src/timerapplet/ui/StartTimerDialog.py')
-rw-r--r--timer-applet/src/timerapplet/ui/StartTimerDialog.py267
1 files changed, 0 insertions, 267 deletions
diff --git a/timer-applet/src/timerapplet/ui/StartTimerDialog.py b/timer-applet/src/timerapplet/ui/StartTimerDialog.py
deleted file mode 100644
index 3d0b4f49..00000000
--- a/timer-applet/src/timerapplet/ui/StartTimerDialog.py
+++ /dev/null
@@ -1,267 +0,0 @@
-# Copyright (C) 2008 Jimmy Do <[email protected]>
-# Copyright (C) 2010 Kenny Meyer <[email protected]>
-#
-# 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 gobject
-import gtk
-import gtk.glade as glade
-import gtk.gdk as gdk
-import pango
-
-from gettext import gettext as _
-from shlex import split as shell_tokenize
-from subprocess import check_call, CalledProcessError
-
-from DurationChooser import DurationChooser
-from ScrollableButtonList import ScrollableButtonList
-
-class StartTimerDialog(gobject.GObject):
- __gsignals__ = {'clicked-start':
- (gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, ()),
- 'clicked-cancel':
- (gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, ()),
- 'clicked-manage-presets':
- (gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, ()),
- 'clicked-save':
- (gobject.SIGNAL_RUN_LAST,
- gobject.TYPE_NONE,
- (gobject.TYPE_STRING,
- gobject.TYPE_INT,
- gobject.TYPE_INT,
- gobject.TYPE_INT,
- gobject.TYPE_STRING,
- gobject.TYPE_STRING,
- gobject.TYPE_BOOLEAN)),
- 'clicked-preset':
- (gobject.SIGNAL_RUN_LAST,
- gobject.TYPE_NONE,
- (gobject.TYPE_PYOBJECT,)),
- 'double-clicked-preset':
- (gobject.SIGNAL_RUN_LAST,
- gobject.TYPE_NONE,
- (gobject.TYPE_PYOBJECT,))}
-
- def __init__(self, glade_file_name, name_validator_func, presets_store, preset_display_func):
- gobject.GObject.__init__(self)
-
- self._valid_name_func = name_validator_func;
- self._presets_store = presets_store
- self._preset_display_func = preset_display_func
-
- self._presets_list = ScrollableButtonList()
- labels_size_group = gtk.SizeGroup(gtk.SIZE_GROUP_HORIZONTAL)
- self._duration_chooser = DurationChooser(labels_size_group)
-
- glade_widgets = glade.XML(glade_file_name, 'start_timer_dialog')
- self._dialog = glade_widgets.get_widget('start_timer_dialog')
- self._ok_button = glade_widgets.get_widget('ok_button')
- name_label = glade_widgets.get_widget('name_label')
- self._name_entry = glade_widgets.get_widget('name_entry')
- self._save_button = glade_widgets.get_widget('save_button')
- duration_chooser_container = glade_widgets.get_widget('duration_chooser_container')
- presets_chooser_container = glade_widgets.get_widget('presets_chooser_container')
- self._presets_section = glade_widgets.get_widget('presets_section')
- #: The TextEntry control for running a custom command
- self._command_entry = glade_widgets.get_widget('command_entry')
- #: The "Invalid Command" label
- self._invalid_cmd_label = glade_widgets.get_widget('invalid_command_label')
- #: The next timer combo box
- self._next_timer_combo = glade_widgets.get_widget('next_timer_combo_entry')
- self._next_timer_combo.set_model(self._presets_store)
- self._next_timer_combo.set_text_column(0) # The column to be shown
- #: The auto-start check button.
- self._auto_start_check = glade_widgets.get_widget('auto_start_check')
-
- labels_size_group.add_widget(name_label)
- self._dialog.set_default_response(gtk.RESPONSE_OK)
- duration_chooser_container.pack_start(self._duration_chooser)
- presets_chooser_container.pack_start(self._presets_list)
-
- self._dialog.connect('response', self._on_dialog_response)
- self._dialog.connect('delete-event', self._dialog.hide_on_delete)
- self._dialog.add_events(gdk.BUTTON_PRESS_MASK)
- self._duration_chooser.connect('duration-changed', self._on_duration_changed)
- self._name_entry.connect('changed', self._on_name_entry_changed)
- self._save_button.connect('clicked', self._on_save_button_clicked)
- # Check that executable is valid while inserting text
- self._command_entry.connect('changed', self._check_is_valid_command)
- self._next_timer_combo.child.connect("changed",
- self._on_next_timer_combo_entry_child_changed)
- glade_widgets.get_widget('manage_presets_button').connect('clicked',
- self._on_manage_presets_button_clicked)
- self._presets_store.connect('row-deleted',
- lambda model, row_path: self._update_presets_list())
- self._presets_store.connect('row-changed',
- lambda model, row_path, row_iter: self._update_presets_list())
-
- self._update_presets_list()
- self._duration_chooser.show()
- self._presets_list.show()
-
- def show(self):
- if not self._dialog.props.visible:
- self._duration_chooser.clear()
- self._duration_chooser.focus_hours()
- self._name_entry.set_text('')
- self._check_for_valid_start_timer_input()
- self._check_for_valid_save_preset_input()
- self._dialog.present()
-
- def hide(self):
- self._dialog.hide()
-
- def get_control_data(self):
- """Return name and duration in a tuple.
-
- The returned tuple is in this format:
-
- (name, hours, minutes, seconds, next_timer, auto_start)
-
- """
- return (self._name_entry.get_text().strip(),) + \
- self._duration_chooser.get_duration() + \
- (self._command_entry.get_text().strip(),
- self._next_timer_combo.child.get_text().strip(),
- self._auto_start_check.get_active())
-
- def set_name_and_duration(self, name, hours, minutes, seconds, *args):
- self._name_entry.set_text(name)
- self._command_entry.set_text(args[0])
- self._next_timer_combo.child.set_text(args[1])
- self._auto_start_check.set_active(args[2])
- self._duration_chooser.set_duration(hours, minutes, seconds)
-
- def _update_presets_list(self):
- self._check_for_valid_save_preset_input()
-
- if len(self._presets_store) == 0:
- self._presets_section.hide()
-
- # Make window shrink
- self._dialog.resize(1, 1)
- else:
- self._presets_section.show()
-
- for button in self._presets_list.get_buttons():
- button.destroy()
-
- row_iter = self._presets_store.get_iter_first()
- while row_iter is not None:
- name = self._preset_display_func(row_iter)
- label = gtk.Label(name)
- label.set_ellipsize(pango.ELLIPSIZE_END)
- button = gtk.Button()
- button.set_relief(gtk.RELIEF_NONE)
- button.add(label)
- self._presets_list.add_button(button)
-
- button.connect('clicked',
- self._on_preset_button_clicked,
- self._presets_store.get_path(row_iter))
- button.connect('button_press_event',
- self._on_preset_button_double_clicked,
- self._presets_store.get_path(row_iter))
-
- label.show()
- button.show()
-
- row_iter = self._presets_store.iter_next(row_iter)
-
- def _check_is_valid_command(self, widget, data=None):
- """
- Check that input in the command entry TextBox control is a valid
- executable.
- """
- try:
- data = widget.get_text()
- executable = shell_tokenize(data)[0]
- # Check if command in path, else raise CalledProcessError
- # The idea of using `which` to check if a command is in PATH
- # originated from the Python mailing list.
- check_call(['which', executable])
- self._invalid_cmd_label.set_label('')
- except (ValueError, IndexError, CalledProcessError):
- self._invalid_cmd_label.set_label(_("<b>Command not found.</b>"))
- if data is '':
- self._invalid_cmd_label.set_label('')
-
- def _non_zero_duration(self):
- (hours, minutes, seconds) = self._duration_chooser.get_duration()
- return (hours > 0 or minutes > 0 or seconds > 0)
-
- def _check_for_valid_save_preset_input(self):
- self._save_button.props.sensitive = (self._non_zero_duration() and
- self._valid_name_func(self._name_entry.get_text()))
- # TODO: Add validator for next_timer_combo
-
- def _check_for_valid_start_timer_input(self):
- self._ok_button.props.sensitive = self._non_zero_duration()
-
- def _on_preset_button_clicked(self, button, row_path):
- self.emit('clicked-preset', row_path)
-
- def _on_preset_button_double_clicked(self, button, event, row_path):
- """Emit the `double-clicked-preset' signal."""
- # Check that the double-click event shot off on the preset button
- if event.type == gdk._2BUTTON_PRESS:
- self.emit('double-clicked-preset', row_path)
-
- def _on_manage_presets_button_clicked(self, button):
- self.emit('clicked-manage-presets')
-
- def _on_duration_changed(self, data=None):
- self._check_for_valid_start_timer_input()
- self._check_for_valid_save_preset_input()
-
- def _on_name_entry_changed(self, entry):
- self._check_for_valid_save_preset_input()
-
- def _on_dialog_response(self, dialog, response_id):
- if response_id == gtk.RESPONSE_OK:
- self._duration_chooser.normalize_fields()
- self.emit('clicked-start')
- elif response_id == gtk.RESPONSE_CANCEL:
- self.emit('clicked-cancel')
- self._dialog.hide()
-
- def _on_save_button_clicked(self, button):
- self._duration_chooser.normalize_fields()
- (hours, minutes, seconds) = self._duration_chooser.get_duration()
- name = self._name_entry.get_text()
- command = self._command_entry.get_text()
- next_timer = self._next_timer_combo.child.get_text()
- auto_start = self._auto_start_check.get_active()
- self.emit('clicked-save', name, hours, minutes, seconds, command,
- next_timer, auto_start)
-
- def _on_next_timer_combo_entry_child_changed(self, widget, data=None):
- """Validate selection of the Next Timer ComboBoxEntry."""
- modelfilter = self._presets_store.filter_new()
- # Loop through all rows in ListStore
- # TODO: Using a generator may be more memory efficient in this case.
- for row in modelfilter:
- # Check that name of preset is the exact match of the the text in
- # the ComboBoxEntry
- if widget.get_text() == row[0]:
- # Yes, it matches! Make the auto-start checkbox sensitive
- # (activate it).
- self._auto_start_check.set_sensitive(True)
- break
- else:
- # If value of ComboBoxEntry is None then de-activate the
- # auto-start checkbox.
- self._auto_start_check.set_sensitive(False)
-