openall_time_applet 0.0.4 → 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
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"