78
78
gtk_tree_model_get(model, iter, 0, &split, -1);
80
80
//hb_strfmon(buf, G_ASCII_DTOSTR_BUF_SIZE-1, amount, ope->kcur, GLOBALS->minor);
81
format = g_object_get_data(G_OBJECT(col), "format");
81
format = g_object_get_data(G_OBJECT(col), "format_data");
83
83
amount = split->amount;
84
84
g_snprintf(buf, G_ASCII_DTOSTR_BUF_SIZE-1, format, amount);
146
146
split = da_splits_get(splits, i);
148
DB( g_print("- set split %d : %d, %.2f, %s\n", i, split->kcat, split->amount, split->memo) );
148
DB( g_print(" append split %d : %d, %.2f, '%s'\n", i, split->kcat, split->amount, split->memo) );
150
150
gtk_list_store_append (GTK_LIST_STORE(model), &iter);
151
151
gtk_list_store_set (GTK_LIST_STORE(model), &iter,
237
237
g_object_set(renderer, "xalign", 1.0, NULL);
239
239
column = gtk_tree_view_column_new_with_attributes(_("Amount"), renderer, NULL);
240
g_object_set_data(G_OBJECT(column), "format", format);
240
g_object_set_data(G_OBJECT(column), "format_data", format);
242
242
gtk_tree_view_column_set_alignment (column, 1.0);
243
243
gtk_tree_view_column_set_resizable(column, TRUE);
316
316
gtk_tree_model_get (model, &iter, 0, &split, -1);
319
DB( g_print("split pos: %d '%s' %.2f\n", i, split->memo, split->amount) );
319
DB( g_print(" split pos: %d '%s' %.2f\n", i, split->memo, split->amount) );
321
321
i++; valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(model), &iter);
328
static void ui_split_dialog_cb_eval_split(GtkWidget *widget, gpointer user_data)
328
static gboolean ui_split_dialog_cb_amount_focus_out (GtkEditable *spin_button, GdkEvent *event, gpointer user_data)
330
330
struct ui_split_dialog_data *data;
333
331
const gchar *txt;
336
DB( g_print("\n[ui_split_dialog] eval split\n") );
338
data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(GTK_WIDGET(widget), GTK_TYPE_WINDOW)), "inst_data");
340
amount = g_strtod(gtk_entry_get_text(GTK_ENTRY(data->ST_amount)), NULL);
341
sensitive = hb_amount_round(amount, data->cur->frac_digits) != 0.0 ? TRUE : FALSE;
342
gtk_widget_set_sensitive (data->BT_apply, sensitive);
344
count = da_splits_length (data->tmp_splits);
345
sensitive = ( count >= TXN_MAX_SPLIT ) ? FALSE : TRUE;
346
gtk_widget_set_sensitive (data->BT_add, sensitive);
348
//#5.4.3 get a sign -/+
349
txt = gtk_entry_get_text(GTK_ENTRY(data->ST_amount));
350
data->amtsigned = (*txt == '-' || *txt == '+') ? TRUE : FALSE;
352
DB( g_print(" - txt='%s' amt=%.2f, signed=%d, nbsplit=%d\n", txt, amount, data->amtsigned, count) );
333
DB( g_print("\n[ui_split_dialog] cb amount focus out\n") );
335
data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(GTK_WIDGET(spin_button), GTK_TYPE_WINDOW)), "inst_data");
337
txt = gtk_entry_get_text(GTK_ENTRY(spin_button));
339
data->isopposite = FALSE;
340
if( ((data->txntype == TXN_TYPE_EXPENSE) && (*txt == '+')) || ((data->txntype == TXN_TYPE_INCOME) && (*txt == '-')) )
342
data->isopposite = TRUE;
345
DB( g_print(" txt='%s'\n amt=%.8f\n opp=%d\n", txt, gtk_spin_button_get_value (GTK_SPIN_BUTTON(spin_button)), data->isopposite) );
375
369
tmpval = (count > 1) ? TRUE : FALSE;
376
370
gtk_widget_set_sensitive (data->BT_remall, (data->isedited) ? FALSE : tmpval);
378
ui_split_dialog_cb_eval_split(widget, NULL);
381
373
/*amount = gtk_spin_button_get_value(GTK_SPIN_BUTTON(data->ST_amount));
382
374
tmpval = hb_amount_round(amount, 2) != 0.0 ? TRUE : FALSE;
407
399
data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(GTK_WIDGET(widget), GTK_TYPE_WINDOW)), "inst_data");
409
g_signal_handler_block(data->PO_cat, data->hid_cat);
410
g_signal_handler_block(data->ST_amount, data->hid_amt);
412
401
//ui_cat_comboboxentry_set_active(GTK_COMBO_BOX(data->PO_cat), 0);
413
402
ui_cat_entry_popover_set_active(GTK_BOX(data->PO_cat), 0);
414
403
if( data->mode == SPLIT_MODE_EMPTY )
415
404
gtk_spin_button_set_value(GTK_SPIN_BUTTON(data->ST_amount), 0.0);
416
405
gtk_entry_set_text(GTK_ENTRY(data->ST_memo), "");
418
g_signal_handler_unblock(data->ST_amount, data->hid_amt);
419
g_signal_handler_unblock(data->PO_cat, data->hid_cat);
421
407
gtk_widget_grab_focus(data->ST_amount);
423
409
data->isedited = FALSE;
490
476
gtk_tree_model_get(model, &iter, 0, &split, -1);
477
DB( g_print(" update spin\n") );
491
478
gtk_spin_button_update (GTK_SPIN_BUTTON(data->ST_amount));
492
479
amount = gtk_spin_button_get_value(GTK_SPIN_BUTTON(data->ST_amount));
564
DB( g_print("\n[ui_split_dialog] add\n") );
551
DB( g_print("--------\n[ui_split_dialog] add\n") );
566
553
data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(GTK_WIDGET(widget), GTK_TYPE_WINDOW)), "inst_data");
568
555
count = da_splits_length (data->tmp_splits);
556
DB( g_print(" n_split: %d (of %d)\n", count, TXN_MAX_SPLIT) );
569
558
if( count <= TXN_MAX_SPLIT )
573
560
split = da_split_malloc ();
574
//preserve amtsigned, resetted with gtk_spin_button_update
575
amtsigned = data->amtsigned;
562
DB( g_print(" update spin\n") );
576
563
gtk_spin_button_update (GTK_SPIN_BUTTON(data->ST_amount));
577
564
amount = gtk_spin_button_get_value(GTK_SPIN_BUTTON(data->ST_amount));
580
//#5.4.3 force sign only if the input has no sign
581
//#1880386 wish: revert ease to combine expense/income in splits dialog
582
if( amtsigned == FALSE )
584
//#1848604 force sign according txn type
585
if( hb_amount_type_match(amount, data->txntype) == FALSE)
567
//by default affect txntype sign
568
if( data->txntype == TXN_TYPE_EXPENSE && amount > 0 )
570
DB( g_print(" force expense\n") );
573
//but take opposite into account
574
if( data->isopposite == TRUE )
576
DB( g_print(" force opposite\n") );
589
579
//split->amount = amount;
590
580
//#1910819 must round frac digit
591
581
split->amount = hb_amount_round(amount, data->cur->frac_digits);
594
584
split->kcat = ui_cat_entry_popover_get_key_add_new(GTK_BOX(data->PO_cat));
595
585
split->memo = g_strdup((gchar *)gtk_entry_get_text(GTK_ENTRY(data->ST_memo)));
597
DB( g_print("- get split : %d, %.2f, %s\n", split->kcat, split->amount, split->memo) );
587
DB( g_print(" append split : %d, %.2f, %s\n", split->kcat, split->amount, split->memo) );
599
589
da_splits_append (data->tmp_splits, split);
628
621
data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(GTK_WIDGET(widget), GTK_TYPE_WINDOW)), "inst_data");
623
//we trigger the focus-out-event on spinbutton, with grab the add button
624
//because we also do things before the legacy spinbutton fucntion
625
gtk_widget_grab_focus(data->BT_add);
630
627
if( data->isedited == TRUE )
631
628
ui_split_dialog_apply_cb(widget, NULL);
637
static void ui_split_rowactivated (GtkTreeView *treeview, GtkTreePath *path, GtkTreeViewColumn *col, gpointer user_data)
634
static void ui_split_rowactivated(GtkTreeView *treeview, GtkTreePath *path, GtkTreeViewColumn *col, gpointer user_data)
639
636
DB( g_print("\n[ui_split_dialog] rowactivated\n") );
690
DB( g_print("- count=%d, nbvalid=%d\n", count, nbvalid ) );
687
DB( g_print(" n_count=%d, n_valid=%d\n", count, nbvalid ) );
692
689
data->remsplit = data->amount - data->sumsplit;
753
750
count = da_splits_length(data->tmp_splits);
754
751
data->nbsplit = count > 1 ? count-1 : 0;
756
DB( g_print("- count = %d\n", count) );
753
DB( g_print(" n_count = %d\n", count) );
757
754
list_split_populate (data->LV_split, data->tmp_splits);
759
756
data->isedited = FALSE;
792
789
//store our dialog private data
793
DB( g_print(" - window=%p\n", dialog) );
790
DB( g_print(" window=%p\n", dialog) );
795
792
g_signal_connect (dialog, "destroy",
796
793
G_CALLBACK (gtk_widget_destroyed), &dialog);
861
858
//store our dialog private data
862
859
g_object_set_data(G_OBJECT(dialog), "inst_data", (gpointer)data);
863
DB( g_print(" - window=%p, inst_data=%p\n", dialog, data) );
860
DB( g_print(" window=%p, inst_data=%p\n", dialog, data) );
865
862
g_signal_connect (dialog, "destroy",
866
863
G_CALLBACK (gtk_widget_destroyed), &dialog);
882
879
data->amount = amount;
883
880
data->sumsplit = amount;
882
DB( g_print(" amount : %f\n", data->amount) );
883
DB( g_print(" txntype: %s\n", data->txntype == TXN_TYPE_EXPENSE ? "expense" : "income" ));
884
DB( g_print(" mode : %s\n", data->mode == SPLIT_MODE_AMOUNT ? "amount" : "empty" ));
885
886
if( *src_splits != NULL )
886
887
data->tmp_splits = da_splits_clone(*src_splits);
1027
1028
g_signal_connect (gtk_tree_view_get_selection(GTK_TREE_VIEW(data->LV_split)), "changed", G_CALLBACK (ui_split_selection), data);
1028
1029
g_signal_connect (GTK_TREE_VIEW(data->LV_split), "row-activated", G_CALLBACK (ui_split_rowactivated), data);
1030
g_signal_connect (data->ST_memo, "insert-text", G_CALLBACK(ui_split_dialog_filter_text_handler), data);
1032
//data->hid_cat = g_signal_connect (data->PO_cat , "changed" , G_CALLBACK (ui_split_dialog_cb_eval_split), data);
1033
data->hid_cat = g_signal_connect (ui_cat_entry_popover_get_entry(GTK_BOX(data->PO_cat)), "changed" , G_CALLBACK (ui_split_dialog_cb_eval_split), data);
1035
data->hid_amt = g_signal_connect (data->ST_amount, "changed", G_CALLBACK (ui_split_dialog_cb_eval_split), data);
1036
//data->hid_amt = g_signal_connect (data->ST_amount, "value-changed", G_CALLBACK (ui_split_dialog_cb_eval_split), data);
1038
//todo: add enter validate
1039
g_signal_connect (data->ST_amount, "activate", G_CALLBACK (ui_split_dialog_cb_activate_split), NULL);
1042
1031
g_signal_connect (data->BT_edit , "clicked", G_CALLBACK (ui_split_dialog_edit_start), NULL);
1043
1032
g_signal_connect (data->BT_rem , "clicked", G_CALLBACK (ui_split_dialog_delete_cb), NULL);
1044
1033
g_signal_connect (data->BT_remall, "clicked", G_CALLBACK (ui_split_dialog_deleteall_cb), NULL);
1035
g_signal_connect (data->ST_memo , "insert-text", G_CALLBACK(ui_split_dialog_filter_text_handler), data);
1036
g_signal_connect (data->ST_amount, "focus-out-event", G_CALLBACK (ui_split_dialog_cb_amount_focus_out), data);
1037
g_signal_connect (data->ST_amount, "activate", G_CALLBACK (ui_split_dialog_cb_activate_split), NULL);
1046
1039
g_signal_connect (data->BT_add , "clicked", G_CALLBACK (ui_split_dialog_add_cb), NULL);
1047
1040
g_signal_connect (data->BT_apply , "clicked", G_CALLBACK (ui_split_dialog_apply_cb), NULL);
1048
1041
g_signal_connect (data->BT_cancel, "clicked", G_CALLBACK (ui_split_dialog_cancel_cb), NULL);