2
* alarm-actions.h -- Alarm actions
4
* Copyright (C) 2010 Johannes H. Jensen <joh@pseudoberries.com>
6
* This program is free software; you can redistribute it and/or
7
* modify it under the terms of the GNU General Public License
8
* as published by the Free Software Foundation; either version 2
9
* of the License, or (at your option) any later version.
11
* This program is distributed in the hope that it will be useful,
12
* but WITHOUT ANY WARRANTY; without even the implied warranty of
13
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
* GNU General Public License for more details.
16
* You should have received a copy of the GNU General Public License
17
* along with this program; if not, write to the Free Software
18
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
21
* Johannes H. Jensen <joh@pseudoberries.com>
24
#include "alarm-actions.h"
25
#include "alarm-applet.h"
26
#include "alarm-list-window.h"
28
#define GET_ACTION(name) GTK_ACTION (gtk_builder_get_object (builder, (name)))
31
* Initialize the various actions
34
alarm_applet_actions_init (AlarmApplet *applet)
36
GtkBuilder *builder = applet->ui;
38
// Actions on one alarm
39
applet->actions_alarm = gtk_action_group_new ("alarm");
41
applet->action_edit = GET_ACTION ("edit-action");
42
applet->action_delete = GET_ACTION ("delete-action");
43
applet->action_enabled = GTK_TOGGLE_ACTION (GET_ACTION ("enabled-action"));
44
applet->action_stop = GET_ACTION ("stop-action");
45
applet->action_snooze = GET_ACTION ("snooze-action");
47
gtk_action_group_add_action (applet->actions_alarm, applet->action_edit);
48
gtk_action_group_add_action (applet->actions_alarm, applet->action_delete);
49
gtk_action_group_add_action (applet->actions_alarm, GTK_ACTION (applet->action_enabled));
50
gtk_action_group_add_action (applet->actions_alarm, applet->action_stop);
51
gtk_action_group_add_action (applet->actions_alarm, applet->action_snooze);
56
applet->actions_global = gtk_action_group_new ("global");
58
applet->action_new = GET_ACTION ("new-action");
59
applet->action_stop_all = GET_ACTION ("stop-all-action");
60
applet->action_snooze_all = GET_ACTION ("snooze-all-action");
62
applet->action_toggle_list_win = GTK_TOGGLE_ACTION (GET_ACTION ("toggle-list-win-action"));
63
gtk_action_set_accel_group (GTK_ACTION (applet->action_toggle_list_win),
64
applet->list_window->accel_group);
66
applet->action_toggle_autostart = GTK_TOGGLE_ACTION (GET_ACTION ("autostart-action"));
68
gtk_action_group_add_action (applet->actions_global, applet->action_new);
69
gtk_action_group_add_action (applet->actions_global, applet->action_stop_all);
70
gtk_action_group_add_action (applet->actions_global, applet->action_snooze_all);
71
gtk_action_group_add_action_with_accel (applet->actions_global,
72
GTK_ACTION (applet->action_toggle_list_win), "Escape");
73
gtk_action_group_add_action (applet->actions_global, GTK_ACTION (applet->action_toggle_autostart));
75
gtk_action_connect_accelerator (GTK_ACTION (applet->action_toggle_list_win));
78
alarm_applet_actions_update_sensitive (applet);
83
// SINGLE ALARM ACTIONS:
90
alarm_action_edit (GtkAction *action, gpointer data)
92
AlarmApplet *applet = (AlarmApplet *)data;
93
AlarmListWindow *list_window = applet->list_window;
94
Alarm *a = alarm_list_window_get_selected_alarm (list_window);
101
g_debug ("AlarmAction: edit '%s'", a->message);
106
// Show settings dialog for alarm
107
alarm_settings_dialog_show (applet->settings_dialog, a);
111
* Delete alarm action
114
alarm_action_delete (GtkAction *action, gpointer data)
116
AlarmApplet *applet = (AlarmApplet *)data;
117
AlarmListWindow *list_window = applet->list_window;
118
AlarmSettingsDialog *sdialog = applet->settings_dialog;
120
Alarm *a = alarm_list_window_get_selected_alarm (list_window);
123
// No alarms selected
127
g_debug ("AlarmAction: delete '%s'", a->message);
132
// If there's a settings dialog open for this alarm, close it.
133
if (sdialog->alarm == a) {
134
alarm_settings_dialog_close (sdialog);
137
// Remove from applet list
138
alarm_applet_alarms_remove (applet, a);
142
* Enable alarm action
145
alarm_action_enabled (GtkToggleAction *action, gpointer data)
147
AlarmApplet *applet = (AlarmApplet *)data;
148
AlarmListWindow *list_window = applet->list_window;
149
Alarm *a = alarm_list_window_get_selected_alarm (list_window);
150
gboolean active = gtk_toggle_action_get_active(action);
152
if (!a || a->active == active) {
153
// No alarms selected or no change
157
g_debug ("AlarmAction: enabled(%d) '%s'", active, a->message);
159
alarm_set_enabled (a, active);
163
* Update enabled action state
166
alarm_action_update_enabled (AlarmApplet *applet)
168
Alarm *a = alarm_list_window_get_selected_alarm (applet->list_window);
169
gboolean active = gtk_toggle_action_get_active(applet->action_enabled);
171
if (!a || a->active == active) {
172
// No alarms selected or no change
176
gtk_toggle_action_set_active (applet->action_enabled, a->active);
183
alarm_action_stop (GtkAction *action, gpointer data)
185
AlarmApplet *applet = (AlarmApplet *)data;
186
AlarmListWindow *list_window = applet->list_window;
189
if ((a = alarm_list_window_get_selected_alarm (list_window))) {
190
g_debug ("AlarmAction: stop '%s'", a->message);
197
* Snooze alarm action
200
alarm_action_snooze (GtkAction *action, gpointer data)
202
AlarmApplet *applet = (AlarmApplet *)data;
203
AlarmListWindow *list_window = applet->list_window;
206
if ((a = alarm_list_window_get_selected_alarm (list_window))) {
207
g_debug ("AlarmAction: snooze '%s'", a->message);
209
alarm_applet_alarm_snooze (applet, a);
222
alarm_action_new (GtkAction *action, gpointer data)
224
AlarmApplet *applet = (AlarmApplet *)data;
225
AlarmListWindow *list_window = applet->list_window;
227
AlarmListEntry *entry;
229
GtkTreeSelection *selection;
231
g_debug ("AlarmAction: new");
233
// Create new alarm, will fall back to defaults.
234
alarm = alarm_new (ALARM_GCONF_DIR, -1);
236
// Set first sound / app in list
237
if (applet->sounds != NULL) {
238
entry = (AlarmListEntry *)applet->sounds->data;
239
g_object_set (alarm, "sound-file", entry->data, NULL);
242
if (applet->apps != NULL) {
243
entry = (AlarmListEntry *)applet->apps->data;
244
g_object_set (alarm, "command", entry->data, NULL);
247
// Add alarm to list of alarms
248
// This will indirectly add the alarm to the model
249
alarm_applet_alarms_add (applet, alarm);
251
// Select the new alarm in the list
252
if (alarm_list_window_find_alarm (GTK_TREE_MODEL (list_window->model), alarm, &iter)) {
253
selection = gtk_tree_view_get_selection (list_window->tree_view);
254
gtk_tree_selection_select_iter (selection, &iter);
257
// Show edit alarm dialog
258
alarm_settings_dialog_show (applet->settings_dialog, alarm);
262
* Stop all alarms action
265
alarm_action_stop_all (GtkAction *action, gpointer data)
267
AlarmApplet *applet = (AlarmApplet *)data;
269
g_debug ("AlarmAction: stop all");
271
alarm_applet_alarms_stop (applet);
275
* Snooze all alarms action
278
alarm_action_snooze_all (GtkAction *action, gpointer data)
280
AlarmApplet *applet = (AlarmApplet *)data;
282
g_debug ("AlarmAction: snooze all");
284
alarm_applet_alarms_snooze (applet);
288
* Toggle list window action
291
alarm_action_toggle_list_win (GtkAction *action, gpointer data)
293
AlarmApplet *applet = (AlarmApplet *)data;
294
AlarmListWindow *list_window = applet->list_window;
295
gboolean active = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action));
297
g_debug ("AlarmAction: toggle list window");
299
/* if (!a || a->active == active) {
300
// No alarms selected or no change
306
alarm_list_window_show (list_window);
308
alarm_list_window_hide (list_window);
316
alarm_action_quit (GtkAction *action, gpointer data)
318
// AlarmApplet *applet = (AlarmApplet *)data;
320
g_debug ("AlarmAction: Quit!");
322
// TODO: Free up resources - maybe use gtk_quit_add() & friends
327
* Toggle autostart action
330
alarm_action_toggle_autostart (GtkAction *action, gpointer data)
332
gboolean active = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action));
333
gboolean autostart_state = prefs_autostart_get_state();
334
//gboolean check_active = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (applet->pref_autostart_check));
336
g_debug ("AlarmAction: toggle autostart to %d", active);
338
if (active != autostart_state) {
339
g_debug ("AlarmAction: set autostart to %d!", active);
340
prefs_autostart_set_state (active);
352
* Update actions to a consistent state
355
alarm_applet_actions_update_sensitive (AlarmApplet *applet)
358
// Update single alarm actions:
361
// Determine whether there is a selected alarm
362
Alarm *a = alarm_list_window_get_selected_alarm (applet->list_window);
363
gboolean selected = (a != NULL);
365
g_object_set (applet->actions_alarm, "sensitive", selected, NULL);
367
g_object_set (applet->action_stop,
368
"sensitive", selected && a->triggered, NULL);
370
g_object_set (applet->action_snooze,
371
"sensitive", selected && a->triggered, NULL);
375
// Update global actions
378
// If there are alarms triggered, snooze_all and stop_all should be sensitive
379
g_object_set (applet->action_stop_all,
380
"sensitive", applet->n_triggered > 0, NULL);
382
g_object_set (applet->action_snooze_all,
383
"sensitive", applet->n_triggered > 0, NULL);