openall_time_applet 0.0.4 → 0.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/Gemfile CHANGED
@@ -7,6 +7,7 @@ gem "gtk2"
7
7
  gem "sqlite3"
8
8
  gem "gettext"
9
9
  gem "json"
10
+ gem "rmagick"
10
11
 
11
12
  # Add dependencies to develop your gem here.
12
13
  # Include everything needed to run rake, tests, features, etc.
data/Gemfile.lock CHANGED
@@ -33,6 +33,7 @@ GEM
33
33
  rcov (0.9.11)
34
34
  rdoc (3.12)
35
35
  json (~> 1.4)
36
+ rmagick (2.13.1)
36
37
  rspec (2.8.0)
37
38
  rspec-core (~> 2.8.0)
38
39
  rspec-expectations (~> 2.8.0)
@@ -55,5 +56,6 @@ DEPENDENCIES
55
56
  knjrbfw
56
57
  rcov
57
58
  rdoc (~> 3.12)
59
+ rmagick
58
60
  rspec (~> 2.8.0)
59
61
  sqlite3
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.4
1
+ 0.0.5
@@ -0,0 +1,13 @@
1
+ class Openall_time_applet::Translations
2
+ def translations
3
+ return [
4
+ _("Monday"),
5
+ _("Thuesday"),
6
+ _("Wednesday"),
7
+ _("Thursday"),
8
+ _("Friday"),
9
+ _("Saturday"),
10
+ _("Sunday")
11
+ ]
12
+ end
13
+ end
@@ -8,246 +8,478 @@
8
8
  <property name="window_position">center</property>
9
9
  <property name="default_width">400</property>
10
10
  <child>
11
- <object class="GtkVBox" id="vbox1">
11
+ <object class="GtkNotebook" id="notebook1">
12
12
  <property name="visible">True</property>
13
- <property name="can_focus">False</property>
13
+ <property name="can_focus">True</property>
14
14
  <child>
15
- <object class="GtkFrame" id="frame1">
15
+ <object class="GtkVBox" id="vbox1">
16
16
  <property name="visible">True</property>
17
17
  <property name="can_focus">False</property>
18
- <property name="label_xalign">0</property>
19
- <property name="shadow_type">none</property>
20
18
  <child>
21
- <object class="GtkAlignment" id="alignment1">
19
+ <object class="GtkVBox" id="vbox2">
22
20
  <property name="visible">True</property>
23
21
  <property name="can_focus">False</property>
24
- <property name="left_padding">12</property>
25
22
  <child>
26
- <object class="GtkVBox" id="vbox2">
23
+ <object class="GtkTable" id="table1">
27
24
  <property name="visible">True</property>
28
25
  <property name="can_focus">False</property>
26
+ <property name="n_rows">5</property>
27
+ <property name="n_columns">2</property>
28
+ <property name="column_spacing">3</property>
29
+ <property name="row_spacing">3</property>
29
30
  <child>
30
- <object class="GtkTable" id="table1">
31
+ <object class="GtkLabel" id="label4">
31
32
  <property name="visible">True</property>
32
33
  <property name="can_focus">False</property>
33
- <property name="n_rows">5</property>
34
- <property name="n_columns">2</property>
35
- <property name="column_spacing">3</property>
36
- <property name="row_spacing">3</property>
37
- <child>
38
- <object class="GtkLabel" id="label3">
39
- <property name="visible">True</property>
40
- <property name="can_focus">False</property>
41
- <property name="xalign">0</property>
42
- <property name="label" translatable="yes">Host</property>
43
- </object>
44
- <packing>
45
- <property name="x_options">GTK_FILL</property>
46
- </packing>
47
- </child>
48
- <child>
49
- <object class="GtkLabel" id="label4">
50
- <property name="visible">True</property>
51
- <property name="can_focus">False</property>
52
- <property name="xalign">0</property>
53
- <property name="label" translatable="yes">Username</property>
54
- </object>
55
- <packing>
56
- <property name="top_attach">3</property>
57
- <property name="bottom_attach">4</property>
58
- <property name="x_options">GTK_FILL</property>
59
- <property name="y_options">GTK_FILL</property>
60
- </packing>
61
- </child>
62
- <child>
63
- <object class="GtkEntry" id="txtHost">
64
- <property name="visible">True</property>
65
- <property name="can_focus">True</property>
66
- <property name="invisible_char">•</property>
67
- <property name="primary_icon_activatable">False</property>
68
- <property name="secondary_icon_activatable">False</property>
69
- <property name="primary_icon_sensitive">True</property>
70
- <property name="secondary_icon_sensitive">True</property>
71
- </object>
72
- <packing>
73
- <property name="left_attach">1</property>
74
- <property name="right_attach">2</property>
75
- </packing>
76
- </child>
77
- <child>
78
- <object class="GtkEntry" id="txtUsername">
79
- <property name="visible">True</property>
80
- <property name="can_focus">True</property>
81
- <property name="invisible_char">•</property>
82
- <property name="primary_icon_activatable">False</property>
83
- <property name="secondary_icon_activatable">False</property>
84
- <property name="primary_icon_sensitive">True</property>
85
- <property name="secondary_icon_sensitive">True</property>
86
- </object>
87
- <packing>
88
- <property name="left_attach">1</property>
89
- <property name="right_attach">2</property>
90
- <property name="top_attach">3</property>
91
- <property name="bottom_attach">4</property>
92
- </packing>
93
- </child>
94
- <child>
95
- <object class="GtkLabel" id="label5">
96
- <property name="visible">True</property>
97
- <property name="can_focus">False</property>
98
- <property name="xalign">0</property>
99
- <property name="label" translatable="yes">Password</property>
100
- </object>
101
- <packing>
102
- <property name="top_attach">4</property>
103
- <property name="bottom_attach">5</property>
104
- <property name="x_options">GTK_FILL</property>
105
- </packing>
106
- </child>
107
- <child>
108
- <object class="GtkEntry" id="txtPassword">
109
- <property name="visible">True</property>
110
- <property name="can_focus">True</property>
111
- <property name="visibility">False</property>
112
- <property name="invisible_char">•</property>
113
- <property name="primary_icon_activatable">False</property>
114
- <property name="secondary_icon_activatable">False</property>
115
- <property name="primary_icon_sensitive">True</property>
116
- <property name="secondary_icon_sensitive">True</property>
117
- </object>
118
- <packing>
119
- <property name="left_attach">1</property>
120
- <property name="right_attach">2</property>
121
- <property name="top_attach">4</property>
122
- <property name="bottom_attach">5</property>
123
- </packing>
124
- </child>
125
- <child>
126
- <object class="GtkLabel" id="label6">
127
- <property name="visible">True</property>
128
- <property name="can_focus">False</property>
129
- <property name="xalign">0</property>
130
- <property name="label" translatable="yes">Port</property>
131
- </object>
132
- <packing>
133
- <property name="top_attach">1</property>
134
- <property name="bottom_attach">2</property>
135
- <property name="x_options">GTK_FILL</property>
136
- <property name="y_options">GTK_FILL</property>
137
- </packing>
138
- </child>
139
- <child>
140
- <object class="GtkEntry" id="txtPort">
141
- <property name="visible">True</property>
142
- <property name="can_focus">True</property>
143
- <property name="invisible_char">•</property>
144
- <property name="primary_icon_activatable">False</property>
145
- <property name="secondary_icon_activatable">False</property>
146
- <property name="primary_icon_sensitive">True</property>
147
- <property name="secondary_icon_sensitive">True</property>
148
- </object>
149
- <packing>
150
- <property name="left_attach">1</property>
151
- <property name="right_attach">2</property>
152
- <property name="top_attach">1</property>
153
- <property name="bottom_attach">2</property>
154
- </packing>
155
- </child>
156
- <child>
157
- <object class="GtkCheckButton" id="cbSSL">
158
- <property name="label" translatable="yes">SSL</property>
159
- <property name="visible">True</property>
160
- <property name="can_focus">True</property>
161
- <property name="receives_default">False</property>
162
- <property name="use_action_appearance">False</property>
163
- <property name="draw_indicator">True</property>
164
- </object>
165
- <packing>
166
- <property name="right_attach">2</property>
167
- <property name="top_attach">2</property>
168
- <property name="bottom_attach">3</property>
169
- </packing>
170
- </child>
34
+ <property name="xalign">0</property>
35
+ <property name="label" translatable="yes">Host</property>
171
36
  </object>
172
37
  <packing>
173
- <property name="expand">True</property>
174
- <property name="fill">True</property>
175
- <property name="position">0</property>
38
+ <property name="x_options">GTK_FILL</property>
39
+ </packing>
40
+ </child>
41
+ <child>
42
+ <object class="GtkLabel" id="label5">
43
+ <property name="visible">True</property>
44
+ <property name="can_focus">False</property>
45
+ <property name="xalign">0</property>
46
+ <property name="label" translatable="yes">Username</property>
47
+ </object>
48
+ <packing>
49
+ <property name="top_attach">3</property>
50
+ <property name="bottom_attach">4</property>
51
+ <property name="x_options">GTK_FILL</property>
52
+ <property name="y_options">GTK_FILL</property>
53
+ </packing>
54
+ </child>
55
+ <child>
56
+ <object class="GtkEntry" id="txtHost">
57
+ <property name="visible">True</property>
58
+ <property name="can_focus">True</property>
59
+ <property name="invisible_char">•</property>
60
+ <property name="invisible_char_set">True</property>
61
+ <property name="primary_icon_activatable">False</property>
62
+ <property name="secondary_icon_activatable">False</property>
63
+ <property name="primary_icon_sensitive">True</property>
64
+ <property name="secondary_icon_sensitive">True</property>
65
+ </object>
66
+ <packing>
67
+ <property name="left_attach">1</property>
68
+ <property name="right_attach">2</property>
69
+ </packing>
70
+ </child>
71
+ <child>
72
+ <object class="GtkEntry" id="txtUsername">
73
+ <property name="visible">True</property>
74
+ <property name="can_focus">True</property>
75
+ <property name="invisible_char">•</property>
76
+ <property name="invisible_char_set">True</property>
77
+ <property name="primary_icon_activatable">False</property>
78
+ <property name="secondary_icon_activatable">False</property>
79
+ <property name="primary_icon_sensitive">True</property>
80
+ <property name="secondary_icon_sensitive">True</property>
81
+ </object>
82
+ <packing>
83
+ <property name="left_attach">1</property>
84
+ <property name="right_attach">2</property>
85
+ <property name="top_attach">3</property>
86
+ <property name="bottom_attach">4</property>
87
+ </packing>
88
+ </child>
89
+ <child>
90
+ <object class="GtkLabel" id="label6">
91
+ <property name="visible">True</property>
92
+ <property name="can_focus">False</property>
93
+ <property name="xalign">0</property>
94
+ <property name="label" translatable="yes">Password</property>
95
+ </object>
96
+ <packing>
97
+ <property name="top_attach">4</property>
98
+ <property name="bottom_attach">5</property>
99
+ <property name="x_options">GTK_FILL</property>
100
+ </packing>
101
+ </child>
102
+ <child>
103
+ <object class="GtkEntry" id="txtPassword">
104
+ <property name="visible">True</property>
105
+ <property name="can_focus">True</property>
106
+ <property name="visibility">False</property>
107
+ <property name="invisible_char">•</property>
108
+ <property name="invisible_char_set">True</property>
109
+ <property name="primary_icon_activatable">False</property>
110
+ <property name="secondary_icon_activatable">False</property>
111
+ <property name="primary_icon_sensitive">True</property>
112
+ <property name="secondary_icon_sensitive">True</property>
113
+ </object>
114
+ <packing>
115
+ <property name="left_attach">1</property>
116
+ <property name="right_attach">2</property>
117
+ <property name="top_attach">4</property>
118
+ <property name="bottom_attach">5</property>
119
+ </packing>
120
+ </child>
121
+ <child>
122
+ <object class="GtkLabel" id="label7">
123
+ <property name="visible">True</property>
124
+ <property name="can_focus">False</property>
125
+ <property name="xalign">0</property>
126
+ <property name="label" translatable="yes">Port</property>
127
+ </object>
128
+ <packing>
129
+ <property name="top_attach">1</property>
130
+ <property name="bottom_attach">2</property>
131
+ <property name="x_options">GTK_FILL</property>
132
+ <property name="y_options">GTK_FILL</property>
133
+ </packing>
134
+ </child>
135
+ <child>
136
+ <object class="GtkEntry" id="txtPort">
137
+ <property name="visible">True</property>
138
+ <property name="can_focus">True</property>
139
+ <property name="invisible_char">•</property>
140
+ <property name="invisible_char_set">True</property>
141
+ <property name="primary_icon_activatable">False</property>
142
+ <property name="secondary_icon_activatable">False</property>
143
+ <property name="primary_icon_sensitive">True</property>
144
+ <property name="secondary_icon_sensitive">True</property>
145
+ </object>
146
+ <packing>
147
+ <property name="left_attach">1</property>
148
+ <property name="right_attach">2</property>
149
+ <property name="top_attach">1</property>
150
+ <property name="bottom_attach">2</property>
151
+ </packing>
152
+ </child>
153
+ <child>
154
+ <object class="GtkCheckButton" id="cbSSL">
155
+ <property name="label" translatable="yes">SSL</property>
156
+ <property name="visible">True</property>
157
+ <property name="can_focus">True</property>
158
+ <property name="receives_default">False</property>
159
+ <property name="use_action_appearance">False</property>
160
+ <property name="draw_indicator">True</property>
161
+ </object>
162
+ <packing>
163
+ <property name="right_attach">2</property>
164
+ <property name="top_attach">2</property>
165
+ <property name="bottom_attach">3</property>
176
166
  </packing>
177
167
  </child>
178
168
  </object>
169
+ <packing>
170
+ <property name="expand">True</property>
171
+ <property name="fill">True</property>
172
+ <property name="position">0</property>
173
+ </packing>
179
174
  </child>
180
175
  </object>
176
+ <packing>
177
+ <property name="expand">True</property>
178
+ <property name="fill">True</property>
179
+ <property name="position">0</property>
180
+ </packing>
181
181
  </child>
182
- <child type="label">
183
- <object class="GtkLabel" id="label2">
182
+ <child>
183
+ <object class="GtkHButtonBox" id="hbuttonbox1">
184
184
  <property name="visible">True</property>
185
185
  <property name="can_focus">False</property>
186
- <property name="xalign">0</property>
187
- <property name="label" translatable="yes">&lt;b&gt;OpenAll&lt;/b&gt;</property>
188
- <property name="use_markup">True</property>
186
+ <property name="spacing">3</property>
187
+ <property name="layout_style">end</property>
188
+ <child>
189
+ <object class="GtkButton" id="btnTest">
190
+ <property name="label" translatable="yes">Test</property>
191
+ <property name="visible">True</property>
192
+ <property name="can_focus">True</property>
193
+ <property name="receives_default">True</property>
194
+ <property name="use_action_appearance">False</property>
195
+ <signal name="clicked" handler="on_btnTest_clicked" swapped="no"/>
196
+ </object>
197
+ <packing>
198
+ <property name="expand">False</property>
199
+ <property name="fill">False</property>
200
+ <property name="position">0</property>
201
+ </packing>
202
+ </child>
203
+ <child>
204
+ <object class="GtkButton" id="btnSave">
205
+ <property name="label">gtk-save</property>
206
+ <property name="visible">True</property>
207
+ <property name="can_focus">True</property>
208
+ <property name="receives_default">True</property>
209
+ <property name="use_action_appearance">False</property>
210
+ <property name="use_stock">True</property>
211
+ <signal name="clicked" handler="on_btnSave_clicked" swapped="no"/>
212
+ </object>
213
+ <packing>
214
+ <property name="expand">False</property>
215
+ <property name="fill">False</property>
216
+ <property name="position">1</property>
217
+ </packing>
218
+ </child>
189
219
  </object>
220
+ <packing>
221
+ <property name="expand">False</property>
222
+ <property name="fill">True</property>
223
+ <property name="position">1</property>
224
+ </packing>
190
225
  </child>
226
+ <child>
227
+ <object class="GtkLabel" id="label9">
228
+ <property name="visible">True</property>
229
+ <property name="can_focus">False</property>
230
+ </object>
231
+ <packing>
232
+ <property name="expand">True</property>
233
+ <property name="fill">True</property>
234
+ <property name="position">2</property>
235
+ </packing>
236
+ </child>
237
+ </object>
238
+ </child>
239
+ <child type="tab">
240
+ <object class="GtkLabel" id="label1">
241
+ <property name="visible">True</property>
242
+ <property name="can_focus">False</property>
243
+ <property name="label" translatable="yes">OpenAll</property>
191
244
  </object>
192
245
  <packing>
193
- <property name="expand">False</property>
194
- <property name="fill">True</property>
195
- <property name="position">0</property>
246
+ <property name="tab_fill">False</property>
196
247
  </packing>
197
248
  </child>
198
249
  <child>
199
- <object class="GtkHButtonBox" id="hbuttonbox1">
250
+ <object class="GtkVBox" id="vbox3">
200
251
  <property name="visible">True</property>
201
252
  <property name="can_focus">False</property>
202
- <property name="spacing">3</property>
203
- <property name="layout_style">end</property>
204
253
  <child>
205
- <object class="GtkButton" id="btnTest">
206
- <property name="label" translatable="yes">Test</property>
254
+ <object class="GtkVBox" id="vbox4">
207
255
  <property name="visible">True</property>
208
- <property name="can_focus">True</property>
209
- <property name="receives_default">True</property>
210
- <property name="use_action_appearance">False</property>
211
- <signal name="clicked" handler="on_btnTest_clicked" swapped="no"/>
256
+ <property name="can_focus">False</property>
257
+ <child>
258
+ <object class="GtkTable" id="table2">
259
+ <property name="visible">True</property>
260
+ <property name="can_focus">False</property>
261
+ <property name="n_rows">2</property>
262
+ <property name="n_columns">2</property>
263
+ <property name="column_spacing">3</property>
264
+ <property name="row_spacing">3</property>
265
+ <child>
266
+ <object class="GtkCheckButton" id="cbReminderEnabled">
267
+ <property name="label" translatable="yes">Reminder enabled</property>
268
+ <property name="visible">True</property>
269
+ <property name="can_focus">True</property>
270
+ <property name="receives_default">False</property>
271
+ <property name="use_action_appearance">False</property>
272
+ <property name="draw_indicator">True</property>
273
+ </object>
274
+ <packing>
275
+ <property name="right_attach">2</property>
276
+ </packing>
277
+ </child>
278
+ <child>
279
+ <object class="GtkLabel" id="label8">
280
+ <property name="visible">True</property>
281
+ <property name="can_focus">False</property>
282
+ <property name="xalign">0</property>
283
+ <property name="label" translatable="yes">Remind every minute</property>
284
+ </object>
285
+ <packing>
286
+ <property name="top_attach">1</property>
287
+ <property name="bottom_attach">2</property>
288
+ <property name="x_options">GTK_FILL</property>
289
+ <property name="y_options">GTK_FILL</property>
290
+ </packing>
291
+ </child>
292
+ <child>
293
+ <object class="GtkEntry" id="txtReminderEveryMinute">
294
+ <property name="visible">True</property>
295
+ <property name="can_focus">True</property>
296
+ <property name="invisible_char">•</property>
297
+ <property name="primary_icon_activatable">False</property>
298
+ <property name="secondary_icon_activatable">False</property>
299
+ <property name="primary_icon_sensitive">True</property>
300
+ <property name="secondary_icon_sensitive">True</property>
301
+ </object>
302
+ <packing>
303
+ <property name="left_attach">1</property>
304
+ <property name="right_attach">2</property>
305
+ <property name="top_attach">1</property>
306
+ <property name="bottom_attach">2</property>
307
+ </packing>
308
+ </child>
309
+ </object>
310
+ <packing>
311
+ <property name="expand">True</property>
312
+ <property name="fill">True</property>
313
+ <property name="position">0</property>
314
+ </packing>
315
+ </child>
316
+ <child>
317
+ <object class="GtkHButtonBox" id="hbuttonbox2">
318
+ <property name="visible">True</property>
319
+ <property name="can_focus">False</property>
320
+ <property name="spacing">3</property>
321
+ <property name="layout_style">end</property>
322
+ <child>
323
+ <object class="GtkButton" id="btnReminderSave">
324
+ <property name="label">gtk-save</property>
325
+ <property name="visible">True</property>
326
+ <property name="can_focus">True</property>
327
+ <property name="receives_default">True</property>
328
+ <property name="use_action_appearance">False</property>
329
+ <property name="use_stock">True</property>
330
+ <signal name="clicked" handler="on_btnReminderSave_clicked" swapped="no"/>
331
+ </object>
332
+ <packing>
333
+ <property name="expand">False</property>
334
+ <property name="fill">False</property>
335
+ <property name="position">0</property>
336
+ </packing>
337
+ </child>
338
+ </object>
339
+ <packing>
340
+ <property name="expand">True</property>
341
+ <property name="fill">True</property>
342
+ <property name="position">1</property>
343
+ </packing>
344
+ </child>
212
345
  </object>
213
346
  <packing>
214
347
  <property name="expand">False</property>
215
- <property name="fill">False</property>
348
+ <property name="fill">True</property>
216
349
  <property name="position">0</property>
217
350
  </packing>
218
351
  </child>
219
352
  <child>
220
- <object class="GtkButton" id="btnSave">
221
- <property name="label">gtk-save</property>
353
+ <object class="GtkLabel" id="label3">
222
354
  <property name="visible">True</property>
223
- <property name="can_focus">True</property>
224
- <property name="receives_default">True</property>
225
- <property name="use_action_appearance">False</property>
226
- <property name="use_stock">True</property>
227
- <signal name="clicked" handler="on_btnSave_clicked" swapped="no"/>
355
+ <property name="can_focus">False</property>
228
356
  </object>
229
357
  <packing>
230
- <property name="expand">False</property>
231
- <property name="fill">False</property>
358
+ <property name="expand">True</property>
359
+ <property name="fill">True</property>
232
360
  <property name="position">1</property>
233
361
  </packing>
234
362
  </child>
235
363
  </object>
236
364
  <packing>
237
- <property name="expand">False</property>
238
- <property name="fill">True</property>
239
365
  <property name="position">1</property>
240
366
  </packing>
241
367
  </child>
368
+ <child type="tab">
369
+ <object class="GtkLabel" id="label2">
370
+ <property name="visible">True</property>
371
+ <property name="can_focus">False</property>
372
+ <property name="label" translatable="yes">Reminder</property>
373
+ </object>
374
+ <packing>
375
+ <property name="position">1</property>
376
+ <property name="tab_fill">False</property>
377
+ </packing>
378
+ </child>
242
379
  <child>
243
- <object class="GtkLabel" id="label1">
380
+ <object class="GtkVBox" id="vbox5">
381
+ <property name="visible">True</property>
382
+ <property name="can_focus">False</property>
383
+ <child>
384
+ <object class="GtkVBox" id="vbox6">
385
+ <property name="visible">True</property>
386
+ <property name="can_focus">False</property>
387
+ <property name="spacing">3</property>
388
+ <child>
389
+ <object class="GtkTable" id="table3">
390
+ <property name="visible">True</property>
391
+ <property name="can_focus">False</property>
392
+ <property name="n_columns">2</property>
393
+ <child>
394
+ <object class="GtkLabel" id="label12">
395
+ <property name="visible">True</property>
396
+ <property name="can_focus">False</property>
397
+ <property name="xalign">0</property>
398
+ <property name="label" translatable="yes">Text color</property>
399
+ </object>
400
+ <packing>
401
+ <property name="x_options">GTK_FILL</property>
402
+ <property name="y_options">GTK_FILL</property>
403
+ </packing>
404
+ </child>
405
+ <child>
406
+ <object class="GtkComboBox" id="cbTrayTextColor">
407
+ <property name="visible">True</property>
408
+ <property name="can_focus">False</property>
409
+ </object>
410
+ <packing>
411
+ <property name="left_attach">1</property>
412
+ <property name="right_attach">2</property>
413
+ <property name="y_options">GTK_FILL</property>
414
+ </packing>
415
+ </child>
416
+ </object>
417
+ <packing>
418
+ <property name="expand">True</property>
419
+ <property name="fill">True</property>
420
+ <property name="position">0</property>
421
+ </packing>
422
+ </child>
423
+ <child>
424
+ <object class="GtkHButtonBox" id="hbuttonbox3">
425
+ <property name="visible">True</property>
426
+ <property name="can_focus">False</property>
427
+ <property name="layout_style">end</property>
428
+ <child>
429
+ <object class="GtkButton" id="btnTraySave">
430
+ <property name="label">gtk-save</property>
431
+ <property name="visible">True</property>
432
+ <property name="can_focus">True</property>
433
+ <property name="receives_default">True</property>
434
+ <property name="use_action_appearance">False</property>
435
+ <property name="use_stock">True</property>
436
+ <signal name="clicked" handler="on_btnTraySave_clicked" swapped="no"/>
437
+ </object>
438
+ <packing>
439
+ <property name="expand">False</property>
440
+ <property name="fill">False</property>
441
+ <property name="position">0</property>
442
+ </packing>
443
+ </child>
444
+ </object>
445
+ <packing>
446
+ <property name="expand">True</property>
447
+ <property name="fill">True</property>
448
+ <property name="position">1</property>
449
+ </packing>
450
+ </child>
451
+ </object>
452
+ <packing>
453
+ <property name="expand">False</property>
454
+ <property name="fill">True</property>
455
+ <property name="position">0</property>
456
+ </packing>
457
+ </child>
458
+ <child>
459
+ <object class="GtkLabel" id="label11">
460
+ <property name="visible">True</property>
461
+ <property name="can_focus">False</property>
462
+ </object>
463
+ <packing>
464
+ <property name="expand">True</property>
465
+ <property name="fill">True</property>
466
+ <property name="position">1</property>
467
+ </packing>
468
+ </child>
469
+ </object>
470
+ <packing>
471
+ <property name="position">2</property>
472
+ </packing>
473
+ </child>
474
+ <child type="tab">
475
+ <object class="GtkLabel" id="label10">
244
476
  <property name="visible">True</property>
245
477
  <property name="can_focus">False</property>
478
+ <property name="label" translatable="yes">Tray</property>
246
479
  </object>
247
480
  <packing>
248
- <property name="expand">True</property>
249
- <property name="fill">True</property>
250
481
  <property name="position">2</property>
482
+ <property name="tab_fill">False</property>
251
483
  </packing>
252
484
  </child>
253
485
  </object>
data/gui/trayicon.rb CHANGED
@@ -1,3 +1,4 @@
1
+ #This class controls the behaviour around the trayicon.
1
2
  class Openall_time_applet::Gui::Trayicon
2
3
  attr_reader :args
3
4
 
@@ -5,8 +6,77 @@ class Openall_time_applet::Gui::Trayicon
5
6
  @args = args
6
7
 
7
8
  @ti = Gtk::StatusIcon.new
8
- @ti.file = "../gfx/icon_time.png"
9
9
  @ti.signal_connect("popup-menu", &self.method(:on_statusicon_rightclick))
10
+ self.update_icon
11
+
12
+ #Start icon-updater-thread.
13
+ self.icon_updater
14
+ end
15
+
16
+ #This methods starts the thread that updates the tray-icon.
17
+ def icon_updater
18
+ Knj::Thread.new do
19
+ loop do
20
+ self.update_icon
21
+ sleep 60
22
+ end
23
+ end
24
+ end
25
+
26
+ #This updates the icon in the system-tray. It draws seconds on the icon, if a timelog is being tracked.
27
+ def update_icon
28
+ if !@args[:oata].timelog_active
29
+ @ti.file = "../gfx/icon_time.png"
30
+ return nil
31
+ end
32
+
33
+ #Calculate minutes tracked and generate variables.
34
+ secs = Time.now.to_i - @args[:oata].timelog_active_time.to_i
35
+ mins = (secs.to_f / 60.0)
36
+ mins = 1 if mins < 1
37
+
38
+ if mins >= 60
39
+ hours = mins / 60
40
+ text = "#{Knj::Locales.number_out(hours, 1)}t"
41
+ else
42
+ text = "#{Knj::Locales.number_out(mins, 0)}m"
43
+ end
44
+
45
+ if text.length <= 2
46
+ padding_left = 9
47
+ elsif text.length <= 3
48
+ padding_left = 4
49
+ elsif text.length <= 4
50
+ padding_left = 2
51
+ else
52
+ padding_left = 0
53
+ end
54
+
55
+ #Generate image.
56
+ require "RMagick"
57
+ canvas = Magick::Image.new(53, 48){
58
+ self.background_color = "transparent"
59
+ self.format = "png"
60
+ }
61
+
62
+ color = Knj::Opts.get("tray_text_color")
63
+ color = "black" if color.to_s.strip.length <= 0
64
+
65
+ gc = Magick::Draw.new
66
+ gc.fill(color)
67
+ gc.pointsize = 23
68
+ gc.text(padding_left, 35, text)
69
+ gc.draw(canvas)
70
+
71
+ tmp_path = "#{Knj::Os.tmpdir}/openall_time_applet_icon.png"
72
+ canvas.write(tmp_path)
73
+ canvas.destroy!
74
+
75
+ #Set icon for tray.
76
+ @ti.file = tmp_path
77
+
78
+
79
+ return nil
10
80
  end
11
81
 
12
82
  def on_statusicon_rightclick(tray, button, time)
@@ -15,16 +15,21 @@ class Openall_time_applet::Gui::Win_preferences
15
15
 
16
16
  #Loads values from database into widgets.
17
17
  def load_values
18
+ #OpenAll settings.
18
19
  @gui["txtHost"].text = Knj::Opts.get("openall_host")
19
20
  @gui["txtPort"].text = Knj::Opts.get("openall_port")
20
21
  @gui["txtUsername"].text = Knj::Opts.get("openall_username")
21
22
  @gui["txtPassword"].text = Base64.strict_decode64(Knj::Opts.get("openall_password"))
23
+ @gui["cbSSL"].active = Knj::Strings.yn_str(Knj::Opts.get("openall_ssl"), true, false)
22
24
 
23
- if Knj::Opts.get("openall_ssl") == "1"
24
- @gui["cbSSL"].active = true
25
- else
26
- @gui["cbSSL"].active = false
27
- end
25
+ #Reminder settings.
26
+ @gui["cbReminderEnabled"].active = Knj::Strings.yn_str(Knj::Opts.get("reminder_enabled"), true, false)
27
+ @gui["txtReminderEveryMinute"].text = Knj::Opts.get("reminder_every_minute")
28
+
29
+ #Tray settings.
30
+ @tray_colors = {"black" => _("Black"), "white" => _("White")}
31
+ @gui["cbTrayTextColor"].init(@tray_colors.values)
32
+ @gui["cbTrayTextColor"].sel = @tray_colors[Knj::Opts.get("tray_text_color")] if Knj::Opts.get("tray_text_color").to_s.strip.length > 0
28
33
  end
29
34
 
30
35
  #Saves values from widgets into database.
@@ -34,7 +39,28 @@ class Openall_time_applet::Gui::Win_preferences
34
39
  Knj::Opts.set("openall_ssl", Knj::Strings.yn_str(@gui["cbSSL"].active?, 1, 0))
35
40
  Knj::Opts.set("openall_username", @gui["txtUsername"].text)
36
41
  Knj::Opts.set("openall_password", Base64.strict_encode64(@gui["txtPassword"].text))
37
- @gui["window"].destroy
42
+ Knj::Gtk2.msgbox(_("The OpenAll-settings was saved."), "info")
43
+ end
44
+
45
+ def on_btnReminderSave_clicked
46
+ if !Knj::Php.is_numeric(@gui["txtReminderEveryMinute"].text)
47
+ Knj::Gtk2.msgbox(_("Reminder-minute was not numeric."))
48
+ return nil
49
+ end
50
+
51
+ Knj::Opts.set("reminder_enabled", Knj::Strings.yn_str(@gui["cbReminderEnabled"].active?, 1, 0))
52
+ Knj::Opts.set("reminder_every_minute", @gui["txtReminderEveryMinute"].text)
53
+
54
+ #Reset reminder.
55
+ @args[:oata].reminder_next = nil
56
+
57
+ Knj::Gtk2.msgbox(_("The reminder-settings was saved."), "info")
58
+ end
59
+
60
+ def on_btnTraySave_clicked
61
+ color_key = @tray_colors.keys[@gui["cbTrayTextColor"].sel["active"]]
62
+ Knj::Opts.set("tray_text_color", color_key)
63
+ Knj::Gtk2.msgbox(_("The tray-settings was saved."), "info")
38
64
  end
39
65
 
40
66
  #Tries to connect to OpenAll with the given information and receive a task-list as well to validate information and connectivity.
@@ -31,7 +31,7 @@ class Openall_time_applet::Gui::Win_timelog_edit
31
31
  def on_btnSave_clicked(*args)
32
32
  #Generate task-ID based on widget-value.
33
33
  task = @gui["cbTask"].sel
34
- if task
34
+ if task.respond_to?(:is_knj?)
35
35
  task_id = task.id
36
36
  else
37
37
  task_id = 0
@@ -34,6 +34,11 @@ class Openall_time_applet::Gui::Win_worktime_overview
34
34
  stats[:days_total][date.date][:secs] += wt[:worktime].to_i
35
35
  stats[:days_total][date.date][:tasks][task.id] = task
36
36
 
37
+ #Generate first worktime of that date.
38
+ if !stats[:days_total][date.date].key?(:first_time) or stats[:days_total][date.date][:first_time].to_i > wt.timestamp.to_i
39
+ stats[:days_total][date.date][:first_time] = wt.timestamp
40
+ end
41
+
37
42
  stats[:week_total] += wt[:worktime].to_i
38
43
  end
39
44
 
@@ -46,6 +51,7 @@ class Openall_time_applet::Gui::Win_worktime_overview
46
51
  #Draw top total-row.
47
52
  week_total_title = Gtk::Label.new
48
53
  week_total_title.markup = "<b>#{sprintf(_("Week total: %s hours"), Knj::Locales.number_out(stats[:week_total].to_f / 3600.0, 2))}</b>"
54
+ week_total_title.selectable = true
49
55
  table.attach(week_total_title, 0, 5, row, row + 1)
50
56
  row += 1
51
57
 
@@ -60,31 +66,37 @@ class Openall_time_applet::Gui::Win_worktime_overview
60
66
  date = Knj::Datet.in(Time.new(date.year, date.month, day_no))
61
67
 
62
68
  day_title = Gtk::Label.new
63
- day_title.markup = "<b>#{date.out(:time => false)}</b>"
69
+ day_title.markup = "<b>#{date.day_str(:short => true)} #{date.time.strftime("%d/%m")} - #{stats[:days_total][day_no][:first_time].time.strftime("%H:%M")}</b>"
64
70
  day_title.xalign = 0
71
+ day_title.selectable = true
65
72
 
66
73
  day_sum_float = stats[:days_total][day_no][:secs].to_f / 3600.to_f
67
74
  day_sum = Gtk::Label.new
68
75
  day_sum.markup = "<b>#{Knj::Locales.number_out(day_sum_float, 2)}</b>"
69
76
  day_sum.xalign = 1
77
+ day_sum.selectable = true
70
78
 
71
79
  table.attach(day_title, 0, 3, row, row + 1)
72
80
  table.attach(day_sum, 4, 5, row, row + 1)
73
81
  row += 1
74
82
 
75
83
  stats[:days_total][day_no][:tasks].each do |task_id, task|
76
- uid_title = Gtk::Label.new(Knj::Locales.number_out(task[:openall_uid], 0))
84
+ uid_title = Gtk::Label.new(task[:openall_uid].to_s)
77
85
  uid_title.xalign = 0
86
+ uid_title.selectable = true
78
87
 
79
88
  task_title = Gtk::Label.new(task.title)
80
89
  task_title.xalign = 0
90
+ task_title.selectable = true
81
91
 
82
92
  task_sum_float = stats[:task_total][task_id][:secs].to_f / 3600.to_f
83
93
  task_sum = Gtk::Label.new(Knj::Locales.number_out(task_sum_float, 2))
84
94
  task_sum.xalign = 1
95
+ task_sum.selectable = true
85
96
 
86
97
  company_title = Gtk::Label.new(task.organisation_name)
87
98
  company_title.xalign = 0
99
+ company_title.selectable = true
88
100
 
89
101
  table.attach(Gtk::Label.new(""), 0, 1, row, row + 1)
90
102
  table.attach(uid_title, 1, 2, row, row + 1)
@@ -59,6 +59,7 @@ class Openall_time_applet
59
59
 
60
60
  #Various readable variables.
61
61
  attr_reader :db, :ob, :timelog_active, :timelog_active_time
62
+ attr_accessor :reminder_next
62
63
 
63
64
  #Config controlling paths and more.
64
65
  CONFIG = {
@@ -95,6 +96,9 @@ class Openall_time_applet
95
96
 
96
97
  #Set crash-operation to save tracked time instead of loosing it.
97
98
  Kernel.at_exit(&self.method(:destroy))
99
+
100
+ #Start reminder.
101
+ self.reminding
98
102
  end
99
103
 
100
104
  #Updates the database according to the db-schema.
@@ -103,6 +107,32 @@ class Openall_time_applet
103
107
  Knj::Db::Revision.new.init_db("db" => @db, "schema" => Openall_time_applet::DB_SCHEMA)
104
108
  end
105
109
 
110
+ #This method starts the reminder-thread, that checks if a reminder should be shown.
111
+ def reminding
112
+ Knj::Thread.new do
113
+ loop do
114
+ enabled = Knj::Strings.yn_str(Knj::Opts.get("reminder_enabled"), true, false)
115
+ if enabled and !@reminder_next
116
+ @reminder_next = Knj::Datet.new
117
+ @reminder_next.mins + Knj::Opts.get("reminder_every_minute").to_i
118
+ elsif enabled and @reminder_next and Time.now >= @reminder_next
119
+ self.reminding_exec
120
+ @reminder_next = nil
121
+ end
122
+
123
+ sleep 30
124
+ end
125
+ end
126
+
127
+ return nil
128
+ end
129
+
130
+ #This executes the notification that notifies if a timelog is being tracked.
131
+ def reminding_exec
132
+ return nil unless @timelog_active
133
+ Knj::Notify.send("time" => 5, "msg" => sprintf(_("Tracking task: %s"), @timelog_active[:descr]))
134
+ end
135
+
106
136
  #Creates a connection to OpenAll, logs in, yields the connection and destroys it again.
107
137
  #===Examples
108
138
  # oata.oa_conn do |conn|
@@ -220,6 +250,7 @@ class Openall_time_applet
220
250
 
221
251
  @timelog_active = nil
222
252
  @timelog_active_time = nil
253
+ @ti.update_icon if @ti
223
254
  end
224
255
 
225
256
  #Sets a new timelog to track. Stops tracking of previous timelog if already tracking.
@@ -228,6 +259,7 @@ class Openall_time_applet
228
259
 
229
260
  @timelog_active = timelog
230
261
  @timelog_active_time = Time.new
262
+ @ti.update_icon if @ti
231
263
  end
232
264
 
233
265
  #Saves tracking-status if tracking. Stops Gtks main loop.
Binary file
@@ -1,8 +1,8 @@
1
1
  msgid ""
2
2
  msgstr ""
3
3
  "Project-Id-Version: Openall_time_applet\n"
4
- "POT-Creation-Date: 2012-05-21 11:58+0100\n"
5
- "PO-Revision-Date: 2012-05-21 12:02+0100\n"
4
+ "POT-Creation-Date: 2012-05-21 13:20+0100\n"
5
+ "PO-Revision-Date: 2012-05-21 13:20+0100\n"
6
6
  "Last-Translator: Kasper Johansen <k@spernj.org>\n"
7
7
  "Language-Team: Kasper Johansen <k@spernj.org>\n"
8
8
  "Language: \n"
@@ -28,6 +28,34 @@ msgstr "Tom body returneret fra OpenAll."
28
28
  msgid "Could not parse JSON from: %s"
29
29
  msgstr "Kunne ikke oversætte JSON fra: %s"
30
30
 
31
+ #: classes/translations.rb:4
32
+ msgid "Monday"
33
+ msgstr "Mandag"
34
+
35
+ #: classes/translations.rb:5
36
+ msgid "Thuesday"
37
+ msgstr "Tirsday"
38
+
39
+ #: classes/translations.rb:6
40
+ msgid "Wednesday"
41
+ msgstr "Onsdag"
42
+
43
+ #: classes/translations.rb:7
44
+ msgid "Thursday"
45
+ msgstr "Torsday"
46
+
47
+ #: classes/translations.rb:8
48
+ msgid "Friday"
49
+ msgstr "Freday"
50
+
51
+ #: classes/translations.rb:9
52
+ msgid "Saturday"
53
+ msgstr "Lørday"
54
+
55
+ #: classes/translations.rb:10
56
+ msgid "Sunday"
57
+ msgstr "Søndag"
58
+
31
59
  #: gui/trayicon.rb:15
32
60
  msgid "New timelog"
33
61
  msgstr "Ny tidslog"
@@ -5,7 +5,7 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{openall_time_applet}
8
- s.version = "0.0.4"
8
+ s.version = "0.0.5"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Kasper Johansen"]
@@ -29,6 +29,7 @@ Gem::Specification.new do |s|
29
29
  "VERSION",
30
30
  "bin/openall_time_applet.rb",
31
31
  "classes/connection.rb",
32
+ "classes/translations.rb",
32
33
  "conf/db_schema.rb",
33
34
  "gfx/icon_time.png",
34
35
  "glade/win_overview.glade",
@@ -66,6 +67,7 @@ Gem::Specification.new do |s|
66
67
  s.add_runtime_dependency(%q<sqlite3>, [">= 0"])
67
68
  s.add_runtime_dependency(%q<gettext>, [">= 0"])
68
69
  s.add_runtime_dependency(%q<json>, [">= 0"])
70
+ s.add_runtime_dependency(%q<rmagick>, [">= 0"])
69
71
  s.add_development_dependency(%q<rspec>, ["~> 2.8.0"])
70
72
  s.add_development_dependency(%q<rdoc>, ["~> 3.12"])
71
73
  s.add_development_dependency(%q<bundler>, [">= 1.0.0"])
@@ -77,6 +79,7 @@ Gem::Specification.new do |s|
77
79
  s.add_dependency(%q<sqlite3>, [">= 0"])
78
80
  s.add_dependency(%q<gettext>, [">= 0"])
79
81
  s.add_dependency(%q<json>, [">= 0"])
82
+ s.add_dependency(%q<rmagick>, [">= 0"])
80
83
  s.add_dependency(%q<rspec>, ["~> 2.8.0"])
81
84
  s.add_dependency(%q<rdoc>, ["~> 3.12"])
82
85
  s.add_dependency(%q<bundler>, [">= 1.0.0"])
@@ -89,6 +92,7 @@ Gem::Specification.new do |s|
89
92
  s.add_dependency(%q<sqlite3>, [">= 0"])
90
93
  s.add_dependency(%q<gettext>, [">= 0"])
91
94
  s.add_dependency(%q<json>, [">= 0"])
95
+ s.add_dependency(%q<rmagick>, [">= 0"])
92
96
  s.add_dependency(%q<rspec>, ["~> 2.8.0"])
93
97
  s.add_dependency(%q<rdoc>, ["~> 3.12"])
94
98
  s.add_dependency(%q<bundler>, [">= 1.0.0"])
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: openall_time_applet
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.0.4
5
+ version: 0.0.5
6
6
  platform: ruby
7
7
  authors:
8
8
  - Kasper Johansen
@@ -69,8 +69,19 @@ dependencies:
69
69
  prerelease: false
70
70
  version_requirements: *id005
71
71
  - !ruby/object:Gem::Dependency
72
- name: rspec
72
+ name: rmagick
73
73
  requirement: &id006 !ruby/object:Gem::Requirement
74
+ none: false
75
+ requirements:
76
+ - - ">="
77
+ - !ruby/object:Gem::Version
78
+ version: "0"
79
+ type: :runtime
80
+ prerelease: false
81
+ version_requirements: *id006
82
+ - !ruby/object:Gem::Dependency
83
+ name: rspec
84
+ requirement: &id007 !ruby/object:Gem::Requirement
74
85
  none: false
75
86
  requirements:
76
87
  - - ~>
@@ -78,10 +89,10 @@ dependencies:
78
89
  version: 2.8.0
79
90
  type: :development
80
91
  prerelease: false
81
- version_requirements: *id006
92
+ version_requirements: *id007
82
93
  - !ruby/object:Gem::Dependency
83
94
  name: rdoc
84
- requirement: &id007 !ruby/object:Gem::Requirement
95
+ requirement: &id008 !ruby/object:Gem::Requirement
85
96
  none: false
86
97
  requirements:
87
98
  - - ~>
@@ -89,10 +100,10 @@ dependencies:
89
100
  version: "3.12"
90
101
  type: :development
91
102
  prerelease: false
92
- version_requirements: *id007
103
+ version_requirements: *id008
93
104
  - !ruby/object:Gem::Dependency
94
105
  name: bundler
95
- requirement: &id008 !ruby/object:Gem::Requirement
106
+ requirement: &id009 !ruby/object:Gem::Requirement
96
107
  none: false
97
108
  requirements:
98
109
  - - ">="
@@ -100,10 +111,10 @@ dependencies:
100
111
  version: 1.0.0
101
112
  type: :development
102
113
  prerelease: false
103
- version_requirements: *id008
114
+ version_requirements: *id009
104
115
  - !ruby/object:Gem::Dependency
105
116
  name: jeweler
106
- requirement: &id009 !ruby/object:Gem::Requirement
117
+ requirement: &id010 !ruby/object:Gem::Requirement
107
118
  none: false
108
119
  requirements:
109
120
  - - ~>
@@ -111,10 +122,10 @@ dependencies:
111
122
  version: 1.8.3
112
123
  type: :development
113
124
  prerelease: false
114
- version_requirements: *id009
125
+ version_requirements: *id010
115
126
  - !ruby/object:Gem::Dependency
116
127
  name: rcov
117
- requirement: &id010 !ruby/object:Gem::Requirement
128
+ requirement: &id011 !ruby/object:Gem::Requirement
118
129
  none: false
119
130
  requirements:
120
131
  - - ">="
@@ -122,7 +133,7 @@ dependencies:
122
133
  version: "0"
123
134
  type: :development
124
135
  prerelease: false
125
- version_requirements: *id010
136
+ version_requirements: *id011
126
137
  description: Off-line time-tracking for OpenAll with syncing when online.
127
138
  email: k@spernj.org
128
139
  executables:
@@ -143,6 +154,7 @@ files:
143
154
  - VERSION
144
155
  - bin/openall_time_applet.rb
145
156
  - classes/connection.rb
157
+ - classes/translations.rb
146
158
  - conf/db_schema.rb
147
159
  - gfx/icon_time.png
148
160
  - glade/win_overview.glade
@@ -178,7 +190,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
178
190
  requirements:
179
191
  - - ">="
180
192
  - !ruby/object:Gem::Version
181
- hash: 1153976607519334321
193
+ hash: -3134655013415234649
182
194
  segments:
183
195
  - 0
184
196
  version: "0"