Skip to content
API Documentation
BastionGuard™
DeleteWindow.vala
Go to the documentation of this file.
1/*
2 * DeleteWindow.vala
3 *
4 * Copyright 2012-2018 Tony George <teejeetech@gmail.com>
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19 * MA 02110-1301, USA.
20 *
21 *
22 */
23
24using Gtk;
25using Gee;
26
27using TeeJee.Logging;
32using TeeJee.System;
33using TeeJee.Misc;
34
35class DeleteWindow : Gtk.Window{
36
37 public signal void request_close();
38
39 private Gtk.Box vbox_main;
40 private Gtk.Stack page_stack;
41 private int current_page = -1;
42 private Gtk.Box bbox_action;
43
44 // tabs
48
49 // actions
50 private Gtk.Button btn_prev;
51 private Gtk.Button btn_next;
52 private Gtk.Button btn_hide;
53 private Gtk.Button btn_cancel;
54 private Gtk.Button btn_close;
55
56 private uint tmr_init;
57 private int def_width = 500;
58 private int def_height = 500;
59 private bool success = false;
60 private bool embedded_mode = false;
61
62 public DeleteWindow(bool embedded = false) {
63 embedded_mode = embedded;
64
65 log_debug("DeleteWindow: DeleteWindow()");
66
67 this.title = _("Delete Snapshots");
68 if (!embedded_mode) this.modal = true;
69 this.set_default_size (def_width, def_height);
70 this.set_icon_name("bastionguard-backup");
71
72 if (!embedded_mode) this.close_request.connect(on_close_request);
73
74 this.set_default_size(def_width, def_height);
75
76 // vbox_main
77 vbox_main = new Gtk.Box(Orientation.VERTICAL, 6);
78 vbox_main.margin_start = 0;
79 vbox_main.margin_end = 0;
80 vbox_main.margin_top = 0;
81 vbox_main.margin_bottom = 0;
82 set_child(vbox_main);
83
84 page_stack = new Gtk.Stack();
85 page_stack.hexpand = true;
86 page_stack.vexpand = true;
87 vbox_main.append(page_stack);
88
89 // create tab
90
91 var vbox_tab = new Gtk.Box(Orientation.VERTICAL, 6);
92 vbox_tab.margin_start = 12;
93 vbox_tab.margin_end = 12;
94 vbox_tab.margin_top = 12;
95 vbox_tab.margin_bottom = 12;
96
97 add_label_header(vbox_tab, _("Select Snapshots"), true);
98
99 add_label(vbox_tab, _("Select the snapshots to be deleted"));
100
101 var label = new Gtk.Label(_("Snapshots"));
102
105 snapshot_list_box.margin_start = 0;
106 snapshot_list_box.margin_end = 0;
107 snapshot_list_box.margin_top = 0;
108 snapshot_list_box.margin_bottom = 0;
109 vbox_tab.append(snapshot_list_box);
110
111 page_stack.add_named(vbox_tab, "select");
112
113 label = new Gtk.Label(_("Delete"));
114 delete_box = new DeleteBox(this);
115 delete_box.margin_start = 12;
116 delete_box.margin_end = 12;
117 delete_box.margin_top = 12;
118 delete_box.margin_bottom = 12;
119 page_stack.add_named(delete_box, "delete");
120
121 label = new Gtk.Label(_("Finish"));
123 delete_finish_box.margin_start = 12;
124 delete_finish_box.margin_end = 12;
125 delete_finish_box.margin_top = 12;
126 delete_finish_box.margin_bottom = 12;
127 page_stack.add_named(delete_finish_box, "finish");
128
130
131 if (!embedded_mode)
132 show();
133
134 //go_first();
135
136 tmr_init = Timeout.add(100, init_delayed);
137
138 log_debug("DeleteWindow: DeleteWindow(): exit");
139 }
140
141 private bool init_delayed(){
142
143 if (tmr_init > 0){
144 Source.remove(tmr_init);
145 tmr_init = 0;
146 }
147
148 go_first();
149
150 return false;
151 }
152
153 private bool on_close_request(){
154
155 return false; // close window
156 }
157
158 private void create_actions(){
159
160 var hbox = new Gtk.Box(Gtk.Orientation.HORIZONTAL, 6);
161 vbox_main.append(hbox);
162
163 var bbox = new Gtk.Box (Gtk.Orientation.HORIZONTAL, 8);
164 bbox.margin_start = 12;
165 bbox.margin_end = 12;
166 bbox.margin_top = 12;
167 bbox.margin_bottom = 12;
168 bbox.spacing = 6;
169 bbox.hexpand = true;
170 hbox.append(bbox);
171
172 bbox_action = bbox;
173
174 #if GTK3_18
175 bbox.halign = Gtk.Align.CENTER;
176 #endif
177
178 Gtk.SizeGroup size_group = null; //new Gtk.SizeGroup(SizeGroupMode.HORIZONTAL);
179
180 // previous
181
182 btn_prev = add_button(bbox, _("Previous"), "", size_group, null);
183 btn_prev.get_style_context().add_class("btn-back");
184
185 btn_prev.clicked.connect(()=>{
186 go_prev();
187 });
188
189 // next
190
191 btn_next = add_button(bbox, _("Next"), "", size_group, null);
192 btn_next.get_style_context().add_class("btn-next");
193
194 btn_next.clicked.connect(()=>{
195 go_next();
196 });
197
198 // close
199
200 btn_close = add_button(bbox, _("Close"), "", size_group, null);
201 btn_close.get_style_context().add_class("btn-finish");
202
203 btn_close.clicked.connect(()=>{
204 if (embedded_mode)
206 else
207 this.destroy();
208 });
209
210 // hide
211
212 btn_hide = add_button(bbox, _("Hide"), "", size_group, null);
213 btn_hide.set_tooltip_text(_("Hide this window (files will be deleted in background)"));
214
215 btn_hide.clicked.connect(()=>{
216 if (embedded_mode)
218 else
219 this.destroy();
220 });
221
222 // cancel
223
224 btn_cancel = add_button(bbox, _("Cancel"), "", size_group, null);
225 btn_cancel.get_style_context().add_class("btn-cancel");
226
227 btn_cancel.clicked.connect(()=>{
228 // clear queue
229 App.delete_list.clear();
230 // kill current task
231 if (App.delete_file_task != null){
233 }
234
235 if (embedded_mode)
237 else
238 this.destroy(); // TODO: Show error page
239 });
240
241 btn_prev.hexpand = btn_next.hexpand = btn_cancel.hexpand = btn_close.hexpand = btn_hide.hexpand = true;
242
244 }
245
246 private void action_buttons_set_initial_visibility(bool visible){
247
248 btn_prev.visible = visible;
249 btn_next.visible = visible;
250 btn_hide.visible = visible;
251 btn_close.visible = visible;
252 btn_cancel.visible = visible;
253 }
254
255 // navigation
256
257 private void go_first(){
258
259 // set initial tab
260
261 if ((App.delete_list.size == 0) && !App.thread_delete_running){
262 set_page(Tabs.SNAPSHOT_LIST);
263 }
264 else {
265 set_page(Tabs.DELETE);
266 }
267
269 }
270
271 private void go_prev(){
272 switch(current_page){
273 case Tabs.SNAPSHOT_LIST:
274 case Tabs.DELETE:
275 break;
276 case Tabs.DELETE_FINISH:
277 break;
278 }
279
281 }
282
283 private void go_next(){
284 if (!validate_current_tab()){
285 return;
286 }
287
288 switch(current_page){
289 case Tabs.SNAPSHOT_LIST:
290 App.delete_list = snapshot_list_box.selected_snapshots();
291 set_page(Tabs.DELETE);
292 break;
293
294 case Tabs.DELETE:
295 set_page(Tabs.DELETE_FINISH);
296 break;
297
298 case Tabs.DELETE_FINISH:
299 if (embedded_mode)
301 else
302 destroy();
303 break;
304 }
305
307 }
308
309 private void initialize_tab(){
310
311 if (current_page < 0){
312 return;
313 }
314
315 log_msg("");
316 log_debug("page: %d".printf(current_page));
317
319
320 switch(current_page){
321 case Tabs.DELETE:
322 btn_prev.hide();
323 btn_next.hide();
324 btn_close.hide();
325 btn_hide.show();
326 btn_cancel.show();
327 break;
328
329 case Tabs.SNAPSHOT_LIST:
330 btn_prev.show();
331 btn_next.show();
332 btn_close.show();
333 btn_hide.hide();
334 btn_cancel.hide();
335 btn_prev.sensitive = false;
336 btn_next.sensitive = true;
337 btn_close.sensitive = true;
338 break;
339
340 case Tabs.DELETE_FINISH:
341 btn_prev.hide();
342 btn_next.hide();
343 btn_close.show();
344 btn_hide.hide();
345 btn_cancel.hide();
346 break;
347 }
348
349 switch(current_page){
350 case Tabs.SNAPSHOT_LIST:
352 break;
353 case Tabs.DELETE:
355 go_next();
356 break;
357 case Tabs.DELETE_FINISH:
359 wait_and_close_window(1000, this);
360 break;
361 }
362 }
363
364 private bool validate_current_tab(){
365 switch(current_page){
366 case Tabs.SNAPSHOT_LIST:
367 if (snapshot_list_box.selected_snapshots().size == 0){
368 gtk_messagebox(
369 _("No Snapshots Selected"),
370 _("Select snapshots to delete"),
371 this, false);
372 return false;
373 }
374 else{
375 return true;
376 }
377
378 default:
379 return true;
380 }
381 }
382
383 private void set_page(int page) {
384 current_page = page;
385 switch (page) {
386 case Tabs.SNAPSHOT_LIST:
387 page_stack.set_visible_child_name("select");
388 break;
389 case Tabs.DELETE:
390 page_stack.set_visible_child_name("delete");
391 break;
392 case Tabs.DELETE_FINISH:
393 page_stack.set_visible_child_name("finish");
394 break;
395 }
396 }
397
398 public enum Tabs{
399 SNAPSHOT_LIST = 0,
400 DELETE = 1,
401 DELETE_FINISH = 2
402 }
403
404 public Gtk.Widget detach_root_widget() {
405 set_child(null);
406 return vbox_main;
407 }
408
409 // ── Icon theme support ─────────────────────────────────────────────────
410 private Gee.ArrayList<Gtk.Image> themed_img_list = new Gee.ArrayList<Gtk.Image>();
411 private Gee.ArrayList<string> themed_img_name = new Gee.ArrayList<string>();
412 private Gee.ArrayList<int> themed_img_size = new Gee.ArrayList<int>();
413
414 private Gtk.Image themed_icon(string icon_name, int size) {
415 var img = IconManager.lookup_image(icon_name, size);
416 themed_img_list.add(img);
417 themed_img_name.add(icon_name);
418 themed_img_size.add(size);
419 return img;
420 }
421
422 public void reload_themed_icons() {
423 for (int i = 0; i < themed_img_list.size; i++) {
424 var img = themed_img_list[i];
425 var name = themed_img_name[i];
426 var sz = themed_img_size[i];
427 var pix = IconManager.lookup(name, sz);
428 if (pix != null) {
429 img.set_from_pixbuf(pix);
430 } else {
431 img.set_from_icon_name(name);
432 }
433 }
434 }
435
436}
Main App
AppStatus
#define _(s)
void stop(AppStatus status_to_update=AppStatus.CANCELLED)
DeleteBox(Gtk.Window _parent_window)
bool delete_snapshots()
DeleteFinishBox(Gtk.Window _parent_window)
void update_message(bool success)
Gtk.Box vbox_main
Gtk.Widget detach_root_widget()
DeleteWindow(bool embedded=false)
Gtk.Button btn_hide
Gtk.Button btn_cancel
void set_page(int page)
Gtk.Box bbox_action
void reload_themed_icons()
Gee.ArrayList< int > themed_img_size
SnapshotListBox snapshot_list_box
signal void request_close()
DeleteFinishBox delete_finish_box
Gtk.Button btn_close
void action_buttons_set_initial_visibility(bool visible)
Gtk.Button btn_next
Gee.ArrayList< string > themed_img_name
bool on_close_request()
DeleteBox delete_box
bool validate_current_tab()
Gtk.Stack page_stack
void initialize_tab()
void create_actions()
Gtk.Image themed_icon(string icon_name, int size)
Gee.ArrayList< Gtk.Image > themed_img_list
Gtk.Button btn_prev
static Gdk.? Pixbuf lookup(string icon_name, int icon_size, bool symbolic=false, bool use_hardcoded=false, int scale=1)
static Gtk.Image lookup_image(string icon_name, int icon_size, bool symbolic=false, bool use_hardcoded=false)
Gee.ArrayList< Snapshot > delete_list
Definition Main.vala:133
DeleteFileTask delete_file_task
Definition Main.vala:161
bool thread_delete_running
Definition Main.vala:108
SnapshotListBox(Gtk.Window _parent_window)
Gee.ArrayList< Snapshot > selected_snapshots()
Gtk.Label add_label(Gtk.Box box, string text, bool bold=false, bool italic=false, bool large=false)
void wait_and_close_window(int milliseconds, Gtk.Window window)
void log_debug(string message)
void log_msg(string message, bool highlight=false)