1 /* HomeBank -- Free, easy, personal accounting for everyone.
2 * Copyright (C) 1995-2019 Maxime DOYEN
4 * This file is part of HomeBank.
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.
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.
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/>.
22 #include "ui-assist-start.h"
23 #include "dsp-mainwindow.h"
24 #include "ui-currency.h"
35 /* our global datas */
36 extern struct HomeBank
*GLOBALS
;
38 extern HbKvData CYA_ACC_TYPE
[];
40 /* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
44 on_assistant_apply (GtkWidget
*widget
, gpointer user_data
)
46 struct assist_start_data
*data
= user_data
;
50 DB( g_print("\n[ui-start] apply\n") );
54 gchar
*owner
= (gchar
*)gtk_entry_get_text(GTK_ENTRY(data
->ST_owner
));
57 hbfile_change_owner(g_strdup(owner
));
58 GLOBALS
->changes_count
++;
61 if( data
->curfmt
!= NULL
)
63 hbfile_replace_basecurrency(data
->curfmt
);
66 /* load preset categories */
67 if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data
->CM_load
)))
69 if(data
->pathfilename
!= NULL
)
72 category_load_csv(data
->pathfilename
, &error
);
73 //DB( g_print(" -> loaded=%d\n", ok) );
77 /* initialise an account */
78 item
= da_acc_malloc();
80 gchar
*txt
= (gchar
*)gtk_entry_get_text(GTK_ENTRY(data
->ST_name
));
83 item
->name
= g_strdup(txt
);
86 item
->kcur
= GLOBALS
->kcur
;
87 item
->type
= hbtk_combo_box_get_active_id(GTK_COMBO_BOX_TEXT(data
->CY_type
));
89 item
->number
= g_strdup(gtk_entry_get_text(GTK_ENTRY(data
->ST_number
)));
91 gtk_spin_button_update(GTK_SPIN_BUTTON(data
->ST_initial
));
92 value
= gtk_spin_button_get_value(GTK_SPIN_BUTTON(data
->ST_initial
));
93 item
->initial
= value
;
95 gtk_spin_button_update(GTK_SPIN_BUTTON(data
->ST_minimum
));
96 value
= gtk_spin_button_get_value(GTK_SPIN_BUTTON(data
->ST_minimum
));
97 item
->minimum
= value
;
100 GLOBALS
->changes_count
++;
102 //our global list has changed, so update the treeview
103 //todo: #1693998 crappy to do this here
104 account_compute_balances ();
105 ui_mainwindow_update(GLOBALS
->mainwindow
, GINT_TO_POINTER(UF_TITLE
+UF_SENSITIVE
+UF_BALANCE
+UF_REFRESHALL
));
110 on_assistant_close_cancel (GtkWidget
*widget
, gpointer user_data
)
112 struct assist_start_data
*data
= user_data
;
114 DB( g_print("\n[ui-start] close/cancel\n") );
117 //data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data");
118 gtk_widget_destroy (data
->window
);
120 g_free(data
->pathfilename
);
127 on_assistant_prepare (GtkWidget
*widget
, GtkWidget
*page
, gpointer user_data
)
129 struct assist_start_data
*data
= user_data
;
130 gint current_page
, n_pages
;
133 DB( g_print("\n[ui-start] prepare\n") );
136 current_page
= gtk_assistant_get_current_page (GTK_ASSISTANT (widget
));
137 n_pages
= gtk_assistant_get_n_pages (GTK_ASSISTANT (widget
));
139 title
= g_strdup_printf (_("New HomeBank file (%d of %d)"), current_page
+ 1, n_pages
);
140 gtk_window_set_title (GTK_WINDOW (widget
), title
);
144 switch( current_page
)
148 gchar
**langs
= (gchar
**)g_get_language_names ();
149 gchar
*txt
= g_strjoinv(", ", langs
);
151 DB( g_print("%s\n", txt
) );;
153 gtk_label_set_label(GTK_LABEL(data
->TX_lang
), txt
);
158 data
->pathfilename
= category_find_preset(&lang
);
159 if(data
->pathfilename
!= NULL
)
161 gtk_label_set_label(GTK_LABEL(data
->TX_file
), lang
);
162 gtk_widget_show(data
->CM_load
);
163 gtk_widget_show(data
->ok_image
);
164 gtk_widget_hide(data
->ko_image
);
165 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(data
->CM_load
), TRUE
);
169 gtk_widget_hide(data
->CM_load
);
170 gtk_label_set_label(GTK_LABEL(data
->TX_file
), _("Not found"));
171 gtk_widget_show(data
->ko_image
);
172 gtk_widget_hide(data
->ok_image
);
173 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(data
->CM_load
), FALSE
);
186 on_entry_changed (GtkWidget
*widget
, gpointer data
)
188 GtkAssistant
*assistant
= GTK_ASSISTANT (data
);
189 GtkWidget
*current_page
;
193 page_number
= gtk_assistant_get_current_page (assistant
);
194 current_page
= gtk_assistant_get_nth_page (assistant
, page_number
);
195 text
= gtk_entry_get_text (GTK_ENTRY (widget
));
198 gtk_assistant_set_page_complete (assistant
, current_page
, TRUE
);
200 gtk_assistant_set_page_complete (assistant
, current_page
, FALSE
);
204 static void ui_start_assistant_property_change_action(GtkWidget
*widget
, gpointer user_data
)
206 struct assist_start_data
*data
;
207 struct curSelectContext selectCtx
;
209 DB( g_print("\n[ui-start] property_change_action\n") );
211 data
= g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget
, GTK_TYPE_WINDOW
)), "inst_data");
214 ui_cur_select_dialog_new(GTK_WINDOW(data
->window
), CUR_SELECT_MODE_BASE
, &selectCtx
);
215 if( selectCtx
.cur_4217
!= NULL
)
217 Currency4217
*curfmt
;
221 curfmt
= selectCtx
.cur_4217
;
223 DB( g_printf("- user selected: '%s' '%s'\n", curfmt
->curr_iso_code
, curfmt
->name
) );
225 data
->curfmt
= curfmt
;
229 g_snprintf(label
, 127, "%s - %s", curfmt
->curr_iso_code
, name
);
230 gtk_label_set_text (GTK_LABEL(data
->LB_currency
), label
);
236 ui_start_assistant_property_fill (GtkWidget
*assistant
, struct assist_start_data
*data
)
241 DB( g_print("\n[ui-start] property_fill\n") );
244 gtk_entry_set_text(GTK_ENTRY(data
->ST_owner
), g_get_real_name ());
246 cur
= da_cur_get (GLOBALS
->kcur
);
248 g_snprintf(label
, 127, "%s - %s", cur
->iso_code
, cur
->name
);
249 gtk_label_set_text (GTK_LABEL(data
->LB_currency
), label
);
255 ui_start_assistant_property_create (GtkWidget
*assistant
, struct assist_start_data
*data
)
257 GtkWidget
*table
, *label
, *widget
;
260 table
= gtk_grid_new ();
261 gtk_grid_set_row_spacing (GTK_GRID (table
), SPACING_SMALL
);
262 gtk_grid_set_column_spacing (GTK_GRID (table
), SPACING_MEDIUM
);
263 //gtk_container_set_border_width (GTK_CONTAINER (table), SPACING_MEDIUM);
264 gtk_widget_set_valign (table
, GTK_ALIGN_CENTER
);
267 label
= make_label_widget(_("_Owner:"));
268 gtk_grid_attach (GTK_GRID (table
), label
, 1, row
, 1, 1);
269 widget
= make_string(label
);
270 data
->ST_owner
= widget
;
271 gtk_widget_set_hexpand(widget
, TRUE
);
272 gtk_grid_attach (GTK_GRID (table
), widget
, 2, row
, 2, 1);
275 label
= make_label_widget(_("Currency:"));
276 gtk_grid_attach (GTK_GRID (table
), label
, 1, row
, 1, 1);
277 widget
= make_label (NULL
, 0, 0.5);
278 data
->LB_currency
= widget
;
279 gtk_grid_attach (GTK_GRID (table
), widget
, 2, row
, 1, 1);
280 widget
= gtk_button_new_with_mnemonic (_("_Change"));
281 data
->BT_change
= widget
;
282 gtk_grid_attach (GTK_GRID (table
), widget
, 3, row
, 1, 1);
284 g_signal_connect (G_OBJECT (data
->ST_owner
), "changed", G_CALLBACK (on_entry_changed
), assistant
);
285 g_signal_connect (G_OBJECT (data
->BT_change
), "clicked", G_CALLBACK (ui_start_assistant_property_change_action
), data
);
288 gtk_widget_show_all (table
);
289 gtk_assistant_append_page (GTK_ASSISTANT (assistant
), table
);
291 gtk_assistant_set_page_title (GTK_ASSISTANT (assistant
), table
, _("File properties"));
292 gtk_assistant_set_page_type (GTK_ASSISTANT (assistant
), table
, GTK_ASSISTANT_PAGE_INTRO
);
297 ui_start_assistant_create_page2 (GtkWidget
*assistant
, struct assist_start_data
*data
)
299 GtkWidget
*box
, *hbox
, *label
, *table
, *widget
;
302 box
= gtk_box_new (GTK_ORIENTATION_VERTICAL
, SPACING_SMALL
);
303 gtk_container_set_border_width (GTK_CONTAINER (box
), SPACING_MEDIUM
);
305 table
= gtk_grid_new ();
306 //gtk_container_set_border_width (GTK_CONTAINER (table), SP_BORDER);
307 gtk_grid_set_row_spacing (GTK_GRID (table
), SPACING_SMALL
*2);
308 gtk_grid_set_column_spacing (GTK_GRID (table
), SPACING_MEDIUM
*2);
310 gtk_box_pack_start (GTK_BOX (box
), table
, TRUE
, TRUE
, 0);
313 label
= make_label_group(_("System detection"));
314 gtk_grid_attach (GTK_GRID (table
), label
, 0, row
, 3, 1);
317 label
= make_label_widget(_("Languages:"));
318 gtk_grid_attach (GTK_GRID (table
), label
, 1, row
, 1, 1);
319 widget
= make_label(NULL
, 0.0, 0.5);
320 data
->TX_lang
= widget
;
321 gtk_grid_attach (GTK_GRID (table
), widget
, 2, row
, 1, 1);
324 label
= make_label_widget(_("Preset file:"));
325 gtk_grid_attach (GTK_GRID (table
), label
, 1, row
, 1, 1);
326 hbox
= gtk_box_new (GTK_ORIENTATION_HORIZONTAL
, SPACING_SMALL
);
327 gtk_grid_attach (GTK_GRID (table
), hbox
, 2, row
, 1, 1);
329 widget
= gtk_image_new_from_icon_name(ICONNAME_HB_FILE_VALID
, GTK_ICON_SIZE_LARGE_TOOLBAR
);
330 data
->ok_image
= widget
;
331 gtk_box_pack_start (GTK_BOX (hbox
), widget
, FALSE
, FALSE
, 0);
333 widget
= gtk_image_new_from_icon_name(ICONNAME_HB_FILE_INVALID
, GTK_ICON_SIZE_LARGE_TOOLBAR
);
334 data
->ko_image
= widget
;
335 gtk_box_pack_start (GTK_BOX (hbox
), widget
, FALSE
, FALSE
, 0);
337 widget
= make_label(NULL
, 0.0, 0.5);
338 data
->TX_file
= widget
;
339 gtk_box_pack_start (GTK_BOX (hbox
), widget
, FALSE
, FALSE
, 0);
342 widget
= gtk_check_button_new_with_mnemonic (_("Initialize my categories with this file"));
343 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget
), TRUE
);
344 data
->CM_load
= widget
;
345 gtk_grid_attach (GTK_GRID (table
), widget
, 1, row
, 3, 1);
347 gtk_widget_show_all (box
);
349 gtk_widget_hide(data
->ok_image
);
350 gtk_widget_hide(data
->ko_image
);
352 gtk_assistant_append_page (GTK_ASSISTANT (assistant
), box
);
353 gtk_assistant_set_page_complete (GTK_ASSISTANT (assistant
), box
, TRUE
);
354 gtk_assistant_set_page_title (GTK_ASSISTANT (assistant
), box
, _("Preset categories"));
359 ui_start_assistant_create_page3 (GtkWidget
*assistant
, struct assist_start_data
*data
)
361 GtkWidget
*box
, *label
, *widget
, *table
;
364 box
= gtk_box_new (GTK_ORIENTATION_VERTICAL
, SPACING_SMALL
);
365 gtk_container_set_border_width (GTK_CONTAINER (box
), SPACING_MEDIUM
);
368 table
= gtk_grid_new ();
369 //gtk_container_set_border_width (GTK_CONTAINER (table), SP_BORDER);
370 gtk_grid_set_row_spacing (GTK_GRID (table
), SPACING_SMALL
);
371 gtk_grid_set_column_spacing (GTK_GRID (table
), SPACING_MEDIUM
);
372 gtk_box_pack_start (GTK_BOX (box
), table
, TRUE
, TRUE
, 0);
375 label
= make_label_group(_("Information"));
376 gtk_grid_attach (GTK_GRID (table
), label
, 0, row
, 3, 1);
379 label
= make_label_widget(_("_Name:"));
380 gtk_grid_attach (GTK_GRID (table
), label
, 1, row
, 1, 1);
381 widget
= make_string(label
);
382 data
->ST_name
= widget
;
383 gtk_widget_set_hexpand(widget
, TRUE
);
384 gtk_grid_attach (GTK_GRID (table
), widget
, 2, row
, 1, 1);
386 g_signal_connect (G_OBJECT (widget
), "changed",
387 G_CALLBACK (on_entry_changed
), assistant
);
391 label
= make_label_widget(_("_Type:"));
392 gtk_grid_attach (GTK_GRID (table
), label
, 1, row
, 1, 1);
393 //widget = make_cycle(label, CYA_ACC_TYPE);
394 widget
= hbtk_combo_box_new_with_data(label
, CYA_ACC_TYPE
);
395 data
->CY_type
= widget
;
396 gtk_widget_set_hexpand(widget
, TRUE
);
397 gtk_grid_attach (GTK_GRID (table
), widget
, 2, row
, 1, 1);
400 label
= make_label_widget(_("N_umber:"));
401 gtk_grid_attach (GTK_GRID (table
), label
, 1, row
, 1, 1);
402 widget
= make_string(label
);
403 data
->ST_number
= widget
;
404 gtk_widget_set_hexpand(widget
, TRUE
);
405 gtk_grid_attach (GTK_GRID (table
), widget
, 2, row
, 1, 1);
411 label
= make_label_group(_("Balances"));
412 gtk_grid_attach (GTK_GRID (table
), label
, 0, row
, 3, 1);
415 label
= make_label_widget(_("_Initial:"));
416 gtk_grid_attach (GTK_GRID (table
), label
, 1, row
, 1, 1);
417 widget
= make_amount(label
);
418 data
->ST_initial
= widget
;
419 gtk_grid_attach (GTK_GRID (table
), widget
, 2, row
, 1, 1);
422 label
= make_label_widget(_("_Overdrawn at:"));
423 gtk_grid_attach (GTK_GRID (table
), label
, 1, row
, 1, 1);
424 widget
= make_amount(label
);
425 data
->ST_minimum
= widget
;
426 gtk_grid_attach (GTK_GRID (table
), widget
, 2, row
, 1, 1);
428 gtk_widget_show_all (box
);
429 gtk_assistant_append_page (GTK_ASSISTANT (assistant
), box
);
431 gtk_assistant_set_page_title (GTK_ASSISTANT (assistant
), box
, _("Create an account"));
436 ui_start_assistant_create_page4 (GtkWidget
*assistant
, struct assist_start_data
*data
)
441 label
= gtk_label_new (_("This is a confirmation page, press 'Apply' to apply changes"));
443 gtk_widget_show (label
);
444 gtk_assistant_append_page (GTK_ASSISTANT (assistant
), label
);
445 gtk_assistant_set_page_type (GTK_ASSISTANT (assistant
), label
, GTK_ASSISTANT_PAGE_CONFIRM
);
446 gtk_assistant_set_page_complete (GTK_ASSISTANT (assistant
), label
, TRUE
);
447 gtk_assistant_set_page_title (GTK_ASSISTANT (assistant
), label
, _("Confirmation"));
457 ui_start_assistant (void)
459 struct assist_start_data
*data
;
460 GtkWidget
*assistant
, *page
;
462 DB( g_print("\n[ui-start] new\n") );
465 data
= g_malloc0(sizeof(struct assist_start_data
));
466 if(!data
) return NULL
;
468 assistant
= gtk_assistant_new ();
469 data
->window
= assistant
;
471 //store our window private data
472 g_object_set_data(G_OBJECT(assistant
), "inst_data", (gpointer
)data
);
473 //DB( g_print("** (import) window=%x, inst_data=%x\n", assistant, data) );
475 gtk_window_set_default_size (GTK_WINDOW (assistant
), 400, -1);
477 gtk_window_set_modal(GTK_WINDOW (assistant
), TRUE
);
478 gtk_window_set_transient_for(GTK_WINDOW(assistant
), GTK_WINDOW(GLOBALS
->mainwindow
));
480 ui_start_assistant_property_create (assistant
, data
);
481 ui_start_assistant_create_page2 (assistant
, data
);
482 ui_start_assistant_create_page3 (assistant
, data
);
483 ui_start_assistant_create_page4 (assistant
, data
);
485 ui_start_assistant_property_fill(assistant
, data
);
487 page
= gtk_assistant_get_nth_page(GTK_ASSISTANT (assistant
), 0);
488 gtk_assistant_set_page_complete (GTK_ASSISTANT (assistant
), page
, TRUE
);
491 g_signal_connect (G_OBJECT (assistant
), "cancel",
492 G_CALLBACK (on_assistant_close_cancel
), data
);
493 g_signal_connect (G_OBJECT (assistant
), "close",
494 G_CALLBACK (on_assistant_close_cancel
), data
);
495 g_signal_connect (G_OBJECT (assistant
), "apply",
496 G_CALLBACK (on_assistant_apply
), data
);
497 g_signal_connect (G_OBJECT (assistant
), "prepare",
498 G_CALLBACK (on_assistant_prepare
), data
);
500 gtk_widget_show (assistant
);