~dobey/stopwatch/trunk

« back to all changes in this revision

Viewing changes to src/sw-taskview.c

  • Committer: Rodney Dawes
  • Date: 2009-03-27 22:55:10 UTC
  • Revision ID: dobey@gnome.org-20090327225510-hph5hfc2fyfo0446
        Cleaned up code import into bzr

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 *  Authors: Rodney Dawes <dobey@gnome.org>
 
3
 *
 
4
 *  Copyright 2008-2009 Rodney Dawes
 
5
 *
 
6
 */
 
7
 
 
8
#ifdef HAVE_CONFIG_H
 
9
#include "config.h"
 
10
#endif
 
11
 
 
12
#include "sw-taskview.h"
 
13
 
 
14
#include <glib/gi18n.h>
 
15
#include <gtk/gtkcelleditable.h>
 
16
#include <gtk/gtkcellrenderer.h>
 
17
#include <gtk/gtkcellrendererpixbuf.h>
 
18
#include <gtk/gtkcellrenderertext.h>
 
19
#include <gtk/gtkbutton.h>
 
20
#include <gtk/gtkhbox.h>
 
21
#include <gtk/gtklabel.h>
 
22
#include <gtk/gtkliststore.h>
 
23
#include <gtk/gtkscrolledwindow.h>
 
24
#include <gtk/gtkstock.h>
 
25
#include <gtk/gtktreeview.h>
 
26
#include <gtk/gtktreeviewcolumn.h>
 
27
#include <gtk/gtkvbox.h>
 
28
#include <string.h>
 
29
 
 
30
struct _SWTaskViewPrivate {
 
31
  GtkWidget * mainbox;
 
32
 
 
33
  GtkWidget * stopbtn;
 
34
  GtkWidget * timelbl;
 
35
 
 
36
  GtkWidget * treeview;
 
37
  GtkListStore * store;
 
38
 
 
39
  GHashTable * tasks;
 
40
};
 
41
 
 
42
enum {
 
43
  SW_ACTIVITY_COLUMN = 0,
 
44
  SW_TASKINFO_COLUMN,
 
45
  SW_STATUS_COLUMN,
 
46
  SW_TASKUID_COLUMN
 
47
};
 
48
 
 
49
/* GObject Methods */
 
50
static void sw_taskview_finalize (GObject * object);
 
51
 
 
52
/* GtkObject Methods */
 
53
static void sw_taskview_destroy (GtkObject * object);
 
54
 
 
55
G_DEFINE_TYPE (SWTaskView, sw_taskview, GTK_TYPE_EVENT_BOX)
 
56
 
 
57
static void sw_taskview_class_init (SWTaskViewClass * klass) {
 
58
  GObjectClass * o_class;
 
59
  GtkObjectClass * obj_class;
 
60
  GtkWidgetClass * wid_class;
 
61
 
 
62
  o_class = (GObjectClass *) klass;
 
63
  obj_class = (GtkObjectClass *) klass;
 
64
  wid_class = (GtkWidgetClass *) klass;
 
65
 
 
66
  /* GObject Methods */
 
67
  o_class->finalize = sw_taskview_finalize;
 
68
 
 
69
  /* GtkObject Methods */
 
70
  obj_class->destroy = sw_taskview_destroy;
 
71
}
 
72
 
 
73
static gboolean sw_taskview_ebox_expose (GtkWidget * widget,
 
74
                                         GdkEventExpose * event,
 
75
                                         SWTaskView * view) {
 
76
  gtk_paint_shadow (widget->style, widget->window, GTK_STATE_NORMAL,
 
77
                    GTK_SHADOW_OUT, &event->area, widget, "toolbar",
 
78
                    0, 0, widget->allocation.width, widget->allocation.height);
 
79
 
 
80
  gtk_container_propagate_expose (GTK_CONTAINER (widget),
 
81
                                  GTK_BIN (widget)->child,
 
82
                                  event);
 
83
 
 
84
  return TRUE;
 
85
}
 
86
 
 
87
static void sw_taskview_edit_started (GtkCellRenderer * cell,
 
88
                                      GtkCellEditable * editable,
 
89
                                      const gchar * path,
 
90
                                      SWTaskView * taskview) {
 
91
  SWTaskViewPrivate * priv;
 
92
  GtkTreeIter iter;
 
93
  unsigned int uid;
 
94
 
 
95
  priv = taskview->priv;
 
96
 
 
97
  gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (priv->store),
 
98
                                       &iter, path);
 
99
  gtk_tree_model_get (GTK_TREE_MODEL (priv->store), &iter,
 
100
                      SW_TASKUID_COLUMN, &uid, -1);
 
101
 
 
102
  if (uid != 0) {
 
103
  }
 
104
}
 
105
 
 
106
static void sw_taskview_edit_finished (GtkCellRendererText * cell,
 
107
                                       const gchar * path,
 
108
                                       const gchar * text,
 
109
                                       SWTaskView * taskview) {
 
110
  SWTaskViewPrivate * priv;
 
111
  GtkTreeIter iter;
 
112
  gchar * realtext;
 
113
  unsigned int uid;
 
114
 
 
115
  priv = taskview->priv;
 
116
 
 
117
  gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (priv->store),
 
118
                                       &iter, path);
 
119
  gtk_tree_model_get (GTK_TREE_MODEL (priv->store), &iter,
 
120
                      SW_TASKUID_COLUMN, &uid, -1);
 
121
 
 
122
  if (uid == 0 && strcmp (text, _("Click here to add a new task...")) != 0) {
 
123
  } else {
 
124
  }
 
125
}
 
126
 
 
127
static int sw_taskview_sort (GtkTreeModel * model,
 
128
                             GtkTreeIter * a, GtkTreeIter * b,
 
129
                             SWTaskView * tv) {
 
130
  unsigned int uida, uidb;
 
131
  const char * stra, * strb;
 
132
 
 
133
  gtk_tree_model_get (model, a,
 
134
                      SW_TASKUID_COLUMN, &uida,
 
135
                      SW_TASKINFO_COLUMN, &stra,
 
136
                      -1);
 
137
  gtk_tree_model_get (model, b,
 
138
                      SW_TASKUID_COLUMN, &uidb,
 
139
                      SW_TASKINFO_COLUMN, &strb,
 
140
                      -1);
 
141
 
 
142
  if (uida == 0)
 
143
    return 1;
 
144
  if (uidb == 0)
 
145
    return -1;
 
146
 
 
147
  return g_utf8_collate (stra, strb);
 
148
}
 
149
 
 
150
static void sw_taskview_init (SWTaskView * taskview) {
 
151
  SWTaskViewPrivate * priv;
 
152
  GtkWidget * ebox;
 
153
  GtkWidget * hbox;
 
154
  GtkWidget * swin;
 
155
  GtkTreeViewColumn * column;
 
156
  GtkCellRenderer * renderer;
 
157
  GtkTreeIter iter;
 
158
 
 
159
  priv = g_new0 (SWTaskViewPrivate, 1);
 
160
  taskview->priv = priv;
 
161
 
 
162
  GTK_WIDGET_SET_FLAGS (GTK_WIDGET (taskview), GTK_NO_WINDOW);
 
163
 
 
164
  priv->mainbox = gtk_vbox_new (FALSE, 0);
 
165
  gtk_container_add (GTK_CONTAINER (taskview), priv->mainbox);
 
166
  gtk_widget_show (priv->mainbox);
 
167
 
 
168
  ebox = gtk_event_box_new ();
 
169
  gtk_box_pack_start (GTK_BOX (priv->mainbox), ebox, FALSE, FALSE, 0);
 
170
  gtk_widget_show (ebox);
 
171
 
 
172
  g_signal_connect (ebox, "expose_event",
 
173
                    G_CALLBACK (sw_taskview_ebox_expose), taskview);
 
174
 
 
175
  hbox = gtk_hbox_new (FALSE, 12);
 
176
  gtk_container_add (GTK_CONTAINER (ebox), hbox);
 
177
  gtk_widget_show (hbox);
 
178
 
 
179
  priv->stopbtn = gtk_button_new ();
 
180
  gtk_button_set_relief (GTK_BUTTON (priv->stopbtn), GTK_RELIEF_NONE);
 
181
  gtk_button_set_image (GTK_BUTTON (priv->stopbtn),
 
182
                        gtk_image_new_from_stock (GTK_STOCK_MEDIA_STOP,
 
183
                                                  GTK_ICON_SIZE_BUTTON));
 
184
  gtk_widget_set_sensitive (priv->stopbtn, FALSE);
 
185
  gtk_box_pack_start (GTK_BOX (hbox), priv->stopbtn, FALSE, FALSE, 0);
 
186
  gtk_widget_show (priv->stopbtn);
 
187
 
 
188
  priv->timelbl = gtk_label_new ("<span size=\"xx-large\">0</span>.<big>00</big>");
 
189
  gtk_misc_set_alignment (GTK_MISC (priv->timelbl), 1.0, 0.5);
 
190
  gtk_label_set_use_markup (GTK_LABEL (priv->timelbl), TRUE);
 
191
  gtk_box_pack_end (GTK_BOX (hbox), priv->timelbl, TRUE, TRUE, 6);
 
192
  gtk_widget_show (priv->timelbl);
 
193
 
 
194
  swin = gtk_scrolled_window_new (NULL, NULL);
 
195
  gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (swin),
 
196
                                  GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
 
197
  gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (swin),
 
198
                                       GTK_SHADOW_IN);
 
199
  gtk_box_pack_start (GTK_BOX (priv->mainbox), swin, TRUE, TRUE, 0);
 
200
  gtk_widget_show (swin);
 
201
 
 
202
  priv->treeview = gtk_tree_view_new ();
 
203
  gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (priv->treeview), FALSE);
 
204
  gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (priv->treeview), FALSE);
 
205
  gtk_container_add (GTK_CONTAINER (swin), priv->treeview);
 
206
  gtk_widget_show (priv->treeview);
 
207
 
 
208
  priv->store = gtk_list_store_new (4,
 
209
                                    GDK_TYPE_PIXBUF,
 
210
                                    G_TYPE_STRING,
 
211
                                    GDK_TYPE_PIXBUF,
 
212
                                    G_TYPE_UINT);
 
213
  gtk_tree_view_set_model (GTK_TREE_VIEW (priv->treeview),
 
214
                           GTK_TREE_MODEL (priv->store));
 
215
 
 
216
  gtk_tree_sortable_set_sort_func (GTK_TREE_SORTABLE (priv->store),
 
217
                                   SW_TASKINFO_COLUMN,
 
218
                                   (GtkTreeIterCompareFunc) sw_taskview_sort,
 
219
                                   taskview, NULL);
 
220
  gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (priv->store),
 
221
                                        SW_TASKINFO_COLUMN,
 
222
                                        GTK_SORT_ASCENDING);
 
223
 
 
224
  column = gtk_tree_view_column_new ();
 
225
  renderer = gtk_cell_renderer_pixbuf_new ();
 
226
  gtk_tree_view_column_pack_start (column, renderer, FALSE);
 
227
  gtk_tree_view_column_set_attributes (column, renderer,
 
228
                                       "pixbuf", SW_ACTIVITY_COLUMN,
 
229
                                       NULL);
 
230
 
 
231
  renderer = gtk_cell_renderer_text_new ();
 
232
  gtk_tree_view_column_pack_start (column, renderer, FALSE);
 
233
  gtk_cell_renderer_text_set_fixed_height_from_font (GTK_CELL_RENDERER_TEXT (renderer), 2);
 
234
  gtk_tree_view_column_set_attributes (column, renderer,
 
235
                                       "markup", SW_TASKINFO_COLUMN,
 
236
                                       NULL);
 
237
 
 
238
  g_object_set (renderer, "editable", TRUE, NULL);
 
239
 
 
240
  g_signal_connect (renderer, "editing_started",
 
241
                    G_CALLBACK (sw_taskview_edit_started), taskview);
 
242
  g_signal_connect (renderer, "edited",
 
243
                    G_CALLBACK (sw_taskview_edit_finished), taskview);
 
244
 
 
245
  renderer = gtk_cell_renderer_pixbuf_new ();
 
246
  gtk_tree_view_column_pack_end (column, renderer, FALSE);
 
247
  gtk_tree_view_column_set_attributes (column, renderer,
 
248
                                       "pixbuf", SW_STATUS_COLUMN,
 
249
                                       NULL);
 
250
  gtk_tree_view_append_column (GTK_TREE_VIEW (priv->treeview), column);
 
251
 
 
252
  gtk_list_store_append (priv->store, &iter);
 
253
  gtk_list_store_set (priv->store, &iter,
 
254
                      SW_TASKINFO_COLUMN, _("<i>Click here to add a new task...</i>"),
 
255
                      SW_TASKUID_COLUMN, 0,
 
256
                      -1);
 
257
 
 
258
  priv->tasks = g_hash_table_new_full (g_direct_hash, g_direct_equal,
 
259
                                       NULL, NULL);
 
260
}
 
261
 
 
262
static void sw_taskview_finalize (GObject * object) {
 
263
  SWTaskView * view;
 
264
  SWTaskViewPrivate * priv;
 
265
 
 
266
  view = SW_TASKVIEW (object);
 
267
  priv = view->priv;
 
268
 
 
269
  if (priv->tasks)
 
270
    g_hash_table_destroy (priv->tasks);
 
271
 
 
272
  g_free (priv);
 
273
 
 
274
  if (G_OBJECT_CLASS (sw_taskview_parent_class)->finalize)
 
275
    (* G_OBJECT_CLASS (sw_taskview_parent_class)->finalize) (object);
 
276
}
 
277
 
 
278
/* GtkObject Methods */
 
279
static void sw_taskview_destroy (GtkObject * object) {
 
280
  if (GTK_OBJECT_CLASS (sw_taskview_parent_class)->destroy)
 
281
    (* GTK_OBJECT_CLASS (sw_taskview_parent_class)->destroy) (object);
 
282
}
 
283
 
 
284
/* Creators */
 
285
GtkWidget * sw_taskview_new (void) {
 
286
  return GTK_WIDGET (g_object_new (SW_TYPE_TASKVIEW, NULL));
 
287
}