]> Dogcows Code - chaz/homebank/blob - src/ui-assist-start.c
Merge branch 'upstream'
[chaz/homebank] / src / ui-assist-start.c
1 /* HomeBank -- Free, easy, personal accounting for everyone.
2 * Copyright (C) 1995-2019 Maxime DOYEN
3 *
4 * This file is part of HomeBank.
5 *
6 * HomeBank 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 * HomeBank 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, see <http://www.gnu.org/licenses/>.
18 */
19
20 #include "homebank.h"
21
22 #include "ui-assist-start.h"
23 #include "dsp-mainwindow.h"
24 #include "ui-currency.h"
25
26
27 #define MYDEBUG 0
28
29 #if MYDEBUG
30 #define DB(x) (x);
31 #else
32 #define DB(x);
33 #endif
34
35 /* our global datas */
36 extern struct HomeBank *GLOBALS;
37
38 extern HbKvData CYA_ACC_TYPE[];
39
40 /* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
41
42
43 static void
44 on_assistant_apply (GtkWidget *widget, gpointer user_data)
45 {
46 struct assist_start_data *data = user_data;
47 Account *item;
48 gdouble value;
49
50 DB( g_print("\n[ui-start] apply\n") );
51
52
53 /* set owner */
54 gchar *owner = (gchar *)gtk_entry_get_text(GTK_ENTRY(data->ST_owner));
55 if (owner && *owner)
56 {
57 hbfile_change_owner(g_strdup(owner));
58 GLOBALS->changes_count++;
59 }
60
61 if( data->curfmt != NULL )
62 {
63 hbfile_replace_basecurrency(data->curfmt);
64 }
65
66 /* load preset categories */
67 if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data->CM_load)))
68 {
69 if(data->pathfilename != NULL)
70 {
71 gchar *error;
72 category_load_csv(data->pathfilename, &error);
73 //DB( g_print(" -> loaded=%d\n", ok) );
74 }
75 }
76
77 /* initialise an account */
78 item = da_acc_malloc();
79
80 gchar *txt = (gchar *)gtk_entry_get_text(GTK_ENTRY(data->ST_name));
81 if (txt && *txt)
82 {
83 item->name = g_strdup(txt);
84 //#1837838 remove extra lead/tail space
85 g_strstrip(item->name);
86 }
87
88 item->kcur = GLOBALS->kcur;
89 item->type = hbtk_combo_box_get_active_id(GTK_COMBO_BOX_TEXT(data->CY_type));
90
91 item->number = g_strdup(gtk_entry_get_text(GTK_ENTRY(data->ST_number)));
92
93 gtk_spin_button_update(GTK_SPIN_BUTTON(data->ST_initial));
94 value = gtk_spin_button_get_value(GTK_SPIN_BUTTON(data->ST_initial));
95 item->initial = value;
96
97 gtk_spin_button_update(GTK_SPIN_BUTTON(data->ST_minimum));
98 value = gtk_spin_button_get_value(GTK_SPIN_BUTTON(data->ST_minimum));
99 item->minimum = value;
100
101 da_acc_append(item);
102 GLOBALS->changes_count++;
103
104 //our global list has changed, so update the treeview
105 //todo: #1693998 crappy to do this here
106 account_compute_balances ();
107 ui_mainwindow_update(GLOBALS->mainwindow, GINT_TO_POINTER(UF_TITLE+UF_SENSITIVE+UF_BALANCE+UF_REFRESHALL));
108
109 }
110
111 static void
112 on_assistant_close_cancel (GtkWidget *widget, gpointer user_data)
113 {
114 struct assist_start_data *data = user_data;
115
116 DB( g_print("\n[ui-start] close/cancel\n") );
117
118
119 //data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data");
120 gtk_widget_destroy (data->window);
121
122 g_free(data->pathfilename);
123
124 g_free(data);
125
126 }
127
128 static void
129 on_assistant_prepare (GtkWidget *widget, GtkWidget *page, gpointer user_data)
130 {
131 struct assist_start_data *data = user_data;
132 gint current_page, n_pages;
133 gchar *title;
134
135 DB( g_print("\n[ui-start] prepare\n") );
136
137
138 current_page = gtk_assistant_get_current_page (GTK_ASSISTANT (widget));
139 n_pages = gtk_assistant_get_n_pages (GTK_ASSISTANT (widget));
140
141 title = g_strdup_printf (_("New HomeBank file (%d of %d)"), current_page + 1, n_pages);
142 gtk_window_set_title (GTK_WINDOW (widget), title);
143 g_free (title);
144
145
146 switch( current_page )
147 {
148 case 1:
149 {
150 gchar **langs = (gchar **)g_get_language_names ();
151 gchar *txt = g_strjoinv(", ", langs);
152
153 DB( g_print("%s\n", txt) );;
154
155 gtk_label_set_label(GTK_LABEL(data->TX_lang), txt);
156 g_free(txt);
157
158
159 gchar *lang;
160 data->pathfilename = category_find_preset(&lang);
161 if(data->pathfilename != NULL)
162 {
163 gtk_label_set_label(GTK_LABEL(data->TX_file), lang);
164 gtk_widget_show(data->CM_load);
165 gtk_widget_show(data->ok_image);
166 gtk_widget_hide(data->ko_image);
167 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(data->CM_load), TRUE);
168 }
169 else
170 {
171 gtk_widget_hide(data->CM_load);
172 gtk_label_set_label(GTK_LABEL(data->TX_file), _("Not found"));
173 gtk_widget_show(data->ko_image);
174 gtk_widget_hide(data->ok_image);
175 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(data->CM_load), FALSE);
176 }
177
178
179 }
180 break;
181
182
183 }
184
185 }
186
187
188 static void
189 on_entry_changed (GtkWidget *widget, gpointer data)
190 {
191 GtkAssistant *assistant = GTK_ASSISTANT (data);
192 GtkWidget *current_page;
193 gint page_number;
194 gchar *text;
195
196 page_number = gtk_assistant_get_current_page (assistant);
197 current_page = gtk_assistant_get_nth_page (assistant, page_number);
198 //#1837838: complete space or leadin/trialin space is possible
199 text = g_strdup(gtk_entry_get_text (GTK_ENTRY (widget)));
200 g_strstrip(text);
201
202 if (strlen(text) > 0)
203 gtk_assistant_set_page_complete (assistant, current_page, TRUE);
204 else
205 gtk_assistant_set_page_complete (assistant, current_page, FALSE);
206
207 g_free(text);
208 }
209
210
211 static void ui_start_assistant_property_change_action(GtkWidget *widget, gpointer user_data)
212 {
213 struct assist_start_data *data;
214 struct curSelectContext selectCtx;
215
216 DB( g_print("\n[ui-start] property_change_action\n") );
217
218 data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data");
219
220 data->curfmt = NULL;
221 ui_cur_select_dialog_new(GTK_WINDOW(data->window), CUR_SELECT_MODE_BASE, &selectCtx);
222 if( selectCtx.cur_4217 != NULL )
223 {
224 Currency4217 *curfmt;
225 gchar label[128];
226 gchar *name;
227
228 curfmt = selectCtx.cur_4217;
229
230 DB( g_printf("- user selected: '%s' '%s'\n", curfmt->curr_iso_code, curfmt->name) );
231
232 data->curfmt = curfmt;
233
234 name = curfmt->name;
235
236 g_snprintf(label, 127, "%s - %s", curfmt->curr_iso_code, name);
237 gtk_label_set_text (GTK_LABEL(data->LB_currency), label);
238 }
239 }
240
241
242 static void
243 ui_start_assistant_property_fill (GtkWidget *assistant, struct assist_start_data *data)
244 {
245 Currency *cur;
246 gchar label[128];
247
248 DB( g_print("\n[ui-start] property_fill\n") );
249
250
251 gtk_entry_set_text(GTK_ENTRY(data->ST_owner), g_get_real_name ());
252
253 cur = da_cur_get (GLOBALS->kcur);
254
255 g_snprintf(label, 127, "%s - %s", cur->iso_code, cur->name);
256 gtk_label_set_text (GTK_LABEL(data->LB_currency), label);
257
258 }
259
260
261 static void
262 ui_start_assistant_property_create (GtkWidget *assistant, struct assist_start_data *data)
263 {
264 GtkWidget *table, *label, *widget;
265 gint row;
266
267 table = gtk_grid_new ();
268 gtk_grid_set_row_spacing (GTK_GRID (table), SPACING_SMALL);
269 gtk_grid_set_column_spacing (GTK_GRID (table), SPACING_MEDIUM);
270 //gtk_container_set_border_width (GTK_CONTAINER (table), SPACING_MEDIUM);
271 gtk_widget_set_valign (table, GTK_ALIGN_CENTER);
272
273 row = 0;
274 label = make_label_widget(_("_Owner:"));
275 gtk_grid_attach (GTK_GRID (table), label, 1, row, 1, 1);
276 widget = make_string(label);
277 data->ST_owner = widget;
278 gtk_widget_set_hexpand(widget, TRUE);
279 gtk_grid_attach (GTK_GRID (table), widget, 2, row, 2, 1);
280
281 row++;
282 label = make_label_widget(_("Currency:"));
283 gtk_grid_attach (GTK_GRID (table), label, 1, row, 1, 1);
284 widget = make_label (NULL, 0, 0.5);
285 data->LB_currency = widget;
286 gtk_grid_attach (GTK_GRID (table), widget, 2, row, 1, 1);
287 widget = gtk_button_new_with_mnemonic (_("_Change"));
288 data->BT_change = widget;
289 gtk_grid_attach (GTK_GRID (table), widget, 3, row, 1, 1);
290
291 g_signal_connect (G_OBJECT (data->ST_owner), "changed", G_CALLBACK (on_entry_changed), assistant);
292 g_signal_connect (G_OBJECT (data->BT_change), "clicked", G_CALLBACK (ui_start_assistant_property_change_action), data);
293
294
295 gtk_widget_show_all (table);
296 gtk_assistant_append_page (GTK_ASSISTANT (assistant), table);
297
298 gtk_assistant_set_page_title (GTK_ASSISTANT (assistant), table, _("File properties"));
299 gtk_assistant_set_page_type (GTK_ASSISTANT (assistant), table, GTK_ASSISTANT_PAGE_INTRO);
300
301 }
302
303 static void
304 ui_start_assistant_create_page2 (GtkWidget *assistant, struct assist_start_data *data)
305 {
306 GtkWidget *box, *hbox, *label, *table, *widget;
307 gint row;
308
309 box = gtk_box_new (GTK_ORIENTATION_VERTICAL, SPACING_SMALL);
310 gtk_container_set_border_width (GTK_CONTAINER (box), SPACING_MEDIUM);
311
312 table = gtk_grid_new ();
313 //gtk_container_set_border_width (GTK_CONTAINER (table), SP_BORDER);
314 gtk_grid_set_row_spacing (GTK_GRID (table), SPACING_SMALL*2);
315 gtk_grid_set_column_spacing (GTK_GRID (table), SPACING_MEDIUM*2);
316
317 gtk_box_pack_start (GTK_BOX (box), table, TRUE, TRUE, 0);
318
319 row = 0;
320 label = make_label_group(_("System detection"));
321 gtk_grid_attach (GTK_GRID (table), label, 0, row, 3, 1);
322
323 row++;
324 label = make_label_widget(_("Languages:"));
325 gtk_grid_attach (GTK_GRID (table), label, 1, row, 1, 1);
326 widget = make_label(NULL, 0.0, 0.5);
327 data->TX_lang = widget;
328 gtk_grid_attach (GTK_GRID (table), widget, 2, row, 1, 1);
329
330 row++;
331 label = make_label_widget(_("Preset file:"));
332 gtk_grid_attach (GTK_GRID (table), label, 1, row, 1, 1);
333 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, SPACING_SMALL);
334 gtk_grid_attach (GTK_GRID (table), hbox, 2, row, 1, 1);
335
336 widget = gtk_image_new_from_icon_name(ICONNAME_HB_FILE_VALID, GTK_ICON_SIZE_LARGE_TOOLBAR);
337 data->ok_image = widget;
338 gtk_box_pack_start (GTK_BOX (hbox), widget, FALSE, FALSE, 0);
339
340 widget = gtk_image_new_from_icon_name(ICONNAME_HB_FILE_INVALID, GTK_ICON_SIZE_LARGE_TOOLBAR);
341 data->ko_image = widget;
342 gtk_box_pack_start (GTK_BOX (hbox), widget, FALSE, FALSE, 0);
343
344 widget = make_label(NULL, 0.0, 0.5);
345 data->TX_file = widget;
346 gtk_box_pack_start (GTK_BOX (hbox), widget, FALSE, FALSE, 0);
347
348 row++;
349 widget = gtk_check_button_new_with_mnemonic (_("Initialize my categories with this file"));
350 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), TRUE);
351 data->CM_load = widget;
352 gtk_grid_attach (GTK_GRID (table), widget, 1, row, 3, 1);
353
354 gtk_widget_show_all (box);
355
356 gtk_widget_hide(data->ok_image);
357 gtk_widget_hide(data->ko_image);
358
359 gtk_assistant_append_page (GTK_ASSISTANT (assistant), box);
360 gtk_assistant_set_page_complete (GTK_ASSISTANT (assistant), box, TRUE);
361 gtk_assistant_set_page_title (GTK_ASSISTANT (assistant), box, _("Preset categories"));
362
363 }
364
365 static void
366 ui_start_assistant_create_page3 (GtkWidget *assistant, struct assist_start_data *data)
367 {
368 GtkWidget *box, *label, *widget, *table;
369 gint row;
370
371 box = gtk_box_new (GTK_ORIENTATION_VERTICAL, SPACING_SMALL);
372 gtk_container_set_border_width (GTK_CONTAINER (box), SPACING_MEDIUM);
373
374
375 table = gtk_grid_new ();
376 //gtk_container_set_border_width (GTK_CONTAINER (table), SP_BORDER);
377 gtk_grid_set_row_spacing (GTK_GRID (table), SPACING_SMALL);
378 gtk_grid_set_column_spacing (GTK_GRID (table), SPACING_MEDIUM);
379 gtk_box_pack_start (GTK_BOX (box), table, TRUE, TRUE, 0);
380
381 row = 0;
382 label = make_label_group(_("Information"));
383 gtk_grid_attach (GTK_GRID (table), label, 0, row, 3, 1);
384
385 row++;
386 label = make_label_widget(_("_Name:"));
387 gtk_grid_attach (GTK_GRID (table), label, 1, row, 1, 1);
388 widget = make_string(label);
389 data->ST_name = widget;
390 gtk_widget_set_hexpand(widget, TRUE);
391 gtk_grid_attach (GTK_GRID (table), widget, 2, row, 1, 1);
392
393 g_signal_connect (G_OBJECT (widget), "changed",
394 G_CALLBACK (on_entry_changed), assistant);
395
396
397 row++;
398 label = make_label_widget(_("_Type:"));
399 gtk_grid_attach (GTK_GRID (table), label, 1, row, 1, 1);
400 //widget = make_cycle(label, CYA_ACC_TYPE);
401 widget = hbtk_combo_box_new_with_data(label, CYA_ACC_TYPE);
402 data->CY_type = widget;
403 gtk_widget_set_hexpand(widget, TRUE);
404 gtk_grid_attach (GTK_GRID (table), widget, 2, row, 1, 1);
405
406 row++;
407 label = make_label_widget(_("N_umber:"));
408 gtk_grid_attach (GTK_GRID (table), label, 1, row, 1, 1);
409 widget = make_string(label);
410 data->ST_number = widget;
411 gtk_widget_set_hexpand(widget, TRUE);
412 gtk_grid_attach (GTK_GRID (table), widget, 2, row, 1, 1);
413
414 //other
415
416 //row = 0;
417 row++;
418 label = make_label_group(_("Balances"));
419 gtk_grid_attach (GTK_GRID (table), label, 0, row, 3, 1);
420
421 row++;
422 label = make_label_widget(_("_Initial:"));
423 gtk_grid_attach (GTK_GRID (table), label, 1, row, 1, 1);
424 widget = make_amount(label);
425 data->ST_initial = widget;
426 gtk_grid_attach (GTK_GRID (table), widget, 2, row, 1, 1);
427
428 row++;
429 label = make_label_widget(_("_Overdrawn at:"));
430 gtk_grid_attach (GTK_GRID (table), label, 1, row, 1, 1);
431 widget = make_amount(label);
432 data->ST_minimum = widget;
433 gtk_grid_attach (GTK_GRID (table), widget, 2, row, 1, 1);
434
435 gtk_widget_show_all (box);
436 gtk_assistant_append_page (GTK_ASSISTANT (assistant), box);
437
438 gtk_assistant_set_page_title (GTK_ASSISTANT (assistant), box, _("Create an account"));
439 }
440
441
442 static void
443 ui_start_assistant_create_page4 (GtkWidget *assistant, struct assist_start_data *data)
444 {
445 GtkWidget *label;
446
447
448 label = gtk_label_new (_("This is a confirmation page, press 'Apply' to apply changes"));
449
450 gtk_widget_show (label);
451 gtk_assistant_append_page (GTK_ASSISTANT (assistant), label);
452 gtk_assistant_set_page_type (GTK_ASSISTANT (assistant), label, GTK_ASSISTANT_PAGE_CONFIRM);
453 gtk_assistant_set_page_complete (GTK_ASSISTANT (assistant), label, TRUE);
454 gtk_assistant_set_page_title (GTK_ASSISTANT (assistant), label, _("Confirmation"));
455
456
457 }
458
459
460
461
462
463 GtkWidget*
464 ui_start_assistant (void)
465 {
466 struct assist_start_data *data;
467 GtkWidget *assistant, *page;
468
469 DB( g_print("\n[ui-start] new\n") );
470
471
472 data = g_malloc0(sizeof(struct assist_start_data));
473 if(!data) return NULL;
474
475 assistant = gtk_assistant_new ();
476 data->window = assistant;
477
478 //store our window private data
479 g_object_set_data(G_OBJECT(assistant), "inst_data", (gpointer)data);
480 //DB( g_print("** (import) window=%x, inst_data=%x\n", assistant, data) );
481
482 gtk_window_set_default_size (GTK_WINDOW (assistant), 400, -1);
483
484 gtk_window_set_modal(GTK_WINDOW (assistant), TRUE);
485 gtk_window_set_transient_for(GTK_WINDOW(assistant), GTK_WINDOW(GLOBALS->mainwindow));
486
487 ui_start_assistant_property_create (assistant, data);
488 ui_start_assistant_create_page2 (assistant, data);
489 ui_start_assistant_create_page3 (assistant, data);
490 ui_start_assistant_create_page4 (assistant, data);
491
492 ui_start_assistant_property_fill(assistant, data);
493
494 page = gtk_assistant_get_nth_page(GTK_ASSISTANT (assistant), 0);
495 gtk_assistant_set_page_complete (GTK_ASSISTANT (assistant), page, TRUE);
496
497
498 g_signal_connect (G_OBJECT (assistant), "cancel",
499 G_CALLBACK (on_assistant_close_cancel), data);
500 g_signal_connect (G_OBJECT (assistant), "close",
501 G_CALLBACK (on_assistant_close_cancel), data);
502 g_signal_connect (G_OBJECT (assistant), "apply",
503 G_CALLBACK (on_assistant_apply), data);
504 g_signal_connect (G_OBJECT (assistant), "prepare",
505 G_CALLBACK (on_assistant_prepare), data);
506
507 gtk_widget_show (assistant);
508
509 return assistant;
510 }
This page took 0.049471 seconds and 4 git commands to generate.