~mdoyen/homebank/trunk

« back to all changes in this revision

Viewing changes to src/ui-split.c

  • Committer: Maxime Doyen
  • Date: 2022-06-30 10:37:12 UTC
  • Revision ID: homebank@free.fr-20220630103712-fth4g63eu9t9juhg
5.5.6 release

Show diffs side-by-side

added added

removed removed

Lines of Context:
29
29
#include "hb-split.h"
30
30
 
31
31
 
32
 
 
33
 
 
34
32
/****************************************************************************/
35
33
/* Debug macros                                                             */
36
34
/****************************************************************************/
51
49
 
52
50
 
53
51
/* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
 
52
 
 
53
 
54
54
static void list_split_number_cell_data_function (GtkTreeViewColumn *col, GtkCellRenderer *renderer, GtkTreeModel *model, GtkTreeIter *iter, gpointer user_data)
55
55
{
56
56
GtkTreePath *path;
78
78
        gtk_tree_model_get(model, iter, 0, &split, -1);
79
79
 
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");
82
82
        
83
83
        amount = split->amount;
84
84
        g_snprintf(buf, G_ASCII_DTOSTR_BUF_SIZE-1, format, amount);
145
145
        {
146
146
                split = da_splits_get(splits, i);
147
147
 
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) );
149
149
 
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);
238
238
 
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);
241
241
        
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);
317
317
                split->pos = i;
318
318
 
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) );
320
320
                
321
321
                i++; valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(model), &iter);
322
322
        }
325
325
}
326
326
 
327
327
 
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)
329
329
{
330
330
struct ui_split_dialog_data *data;
331
 
gboolean sensitive;
332
 
gdouble amount;
333
331
const gchar *txt;
334
 
guint count;
335
 
        
336
 
        DB( g_print("\n[ui_split_dialog] eval split\n") );
337
 
 
338
 
        data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(GTK_WIDGET(widget), GTK_TYPE_WINDOW)), "inst_data");
339
 
 
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);
343
 
 
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);
347
 
 
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;
351
 
 
352
 
        DB( g_print(" - txt='%s' amt=%.2f, signed=%d, nbsplit=%d\n", txt, amount, data->amtsigned, count) );
353
 
 
 
332
 
 
333
        DB( g_print("\n[ui_split_dialog] cb amount focus out\n") );
 
334
 
 
335
        data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(GTK_WIDGET(spin_button), GTK_TYPE_WINDOW)), "inst_data");
 
336
 
 
337
        txt = gtk_entry_get_text(GTK_ENTRY(spin_button));
 
338
 
 
339
        data->isopposite = FALSE;
 
340
        if( ((data->txntype == TXN_TYPE_EXPENSE) && (*txt == '+')) || ((data->txntype == TXN_TYPE_INCOME) && (*txt == '-')) )
 
341
        {
 
342
                data->isopposite = TRUE;
 
343
        }
 
344
 
 
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) );
 
346
 
 
347
        return FALSE;
354
348
}
355
349
 
356
350
 
375
369
        tmpval = (count > 1) ? TRUE : FALSE;
376
370
        gtk_widget_set_sensitive (data->BT_remall, (data->isedited) ? FALSE : tmpval);
377
371
 
378
 
        ui_split_dialog_cb_eval_split(widget, NULL);
379
 
        
380
372
        //btn: add/apply
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;
406
398
 
407
399
        data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(GTK_WIDGET(widget), GTK_TYPE_WINDOW)), "inst_data");
408
400
 
409
 
        g_signal_handler_block(data->PO_cat, data->hid_cat);
410
 
        g_signal_handler_block(data->ST_amount, data->hid_amt);
411
 
 
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), "");
417
406
 
418
 
        g_signal_handler_unblock(data->ST_amount, data->hid_amt);
419
 
        g_signal_handler_unblock(data->PO_cat, data->hid_cat);
420
 
 
421
407
        gtk_widget_grab_focus(data->ST_amount);
422
408
        
423
409
        data->isedited = FALSE;
477
463
GtkTreeModel             *model;
478
464
GtkTreeIter                      iter;
479
465
 
480
 
        DB( g_print("\n[ui_split_dialog] apply\n") );
 
466
        DB( g_print("--------\n[ui_split_dialog] apply\n") );
481
467
 
482
468
        data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(GTK_WIDGET(widget), GTK_TYPE_WINDOW)), "inst_data");
483
469
 
488
474
        gdouble amount;
489
475
 
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));
493
480
                if(amount)
561
548
guint count;
562
549
gdouble amount;
563
550
 
564
 
        DB( g_print("\n[ui_split_dialog] add\n") );
 
551
        DB( g_print("--------\n[ui_split_dialog] add\n") );
565
552
 
566
553
        data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(GTK_WIDGET(widget), GTK_TYPE_WINDOW)), "inst_data");
567
554
 
568
555
        count = da_splits_length (data->tmp_splits);
 
556
        DB( g_print(" n_split: %d (of %d)\n", count, TXN_MAX_SPLIT) );
 
557
        
569
558
        if( count <= TXN_MAX_SPLIT )
570
559
        {
571
 
        gboolean amtsigned;
572
 
        
573
560
                split = da_split_malloc ();
574
 
                //preserve amtsigned, resetted with gtk_spin_button_update
575
 
                amtsigned = data->amtsigned;
 
561
                //5.4.4
 
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));
578
565
                if(amount)
579
566
                {
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 )
583
 
                        {
584
 
                                //#1848604 force sign according txn type
585
 
                                if( hb_amount_type_match(amount, data->txntype) == FALSE)
586
 
                                        amount *= -1;
587
 
                        }
588
 
 
 
567
                        //by default affect txntype sign
 
568
                        if( data->txntype == TXN_TYPE_EXPENSE && amount > 0 )
 
569
                        {
 
570
                                DB( g_print(" force expense\n") );
 
571
                                amount *= -1;
 
572
                        }
 
573
                        //but take opposite into account
 
574
                        if( data->isopposite == TRUE )
 
575
                        {
 
576
                                DB( g_print(" force opposite\n") );
 
577
                                amount *= -1;
 
578
                        }
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)));
596
586
 
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) );
598
588
 
599
589
                        da_splits_append (data->tmp_splits, split);
600
590
 
612
602
                        da_split_free(split);
613
603
                }
614
604
        }
615
 
        //todo: msg max number reached
 
605
        else
 
606
        {
 
607
                g_warning("split error: limit of %d reached", TXN_MAX_SPLIT);
 
608
        }
616
609
        
617
610
        ui_split_dialog_edit_end(widget, user_data);
618
611
        ui_split_dialog_update (widget, user_data);
627
620
 
628
621
        data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(GTK_WIDGET(widget), GTK_TYPE_WINDOW)), "inst_data");
629
622
 
 
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);
 
626
 
630
627
        if( data->isedited == TRUE )
631
628
                ui_split_dialog_apply_cb(widget, NULL);
632
629
        else
634
631
}
635
632
 
636
633
 
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)
638
635
{
639
636
        DB( g_print("\n[ui_split_dialog] rowactivated\n") );
640
637
 
687
684
        }
688
685
        count = i;
689
686
 
690
 
        DB( g_print("- count=%d, nbvalid=%d\n", count, nbvalid ) );
 
687
        DB( g_print(" n_count=%d, n_valid=%d\n", count, nbvalid ) );
691
688
        
692
689
        data->remsplit = data->amount - data->sumsplit;
693
690
 
753
750
        count = da_splits_length(data->tmp_splits);
754
751
        data->nbsplit = count > 1 ? count-1 : 0;
755
752
 
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);
758
755
 
759
756
        data->isedited = FALSE;
790
787
                                            NULL);
791
788
 
792
789
        //store our dialog private data
793
 
        DB( g_print(" - window=%p\n", dialog) );
 
790
        DB( g_print(" window=%p\n", dialog) );
794
791
 
795
792
    g_signal_connect (dialog, "destroy",
796
793
                        G_CALLBACK (gtk_widget_destroyed), &dialog);
860
857
 
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) );
864
861
 
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;
884
881
 
 
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
 
885
886
        if( *src_splits != NULL )
886
887
                data->tmp_splits = da_splits_clone(*src_splits); 
887
888
        else
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);
1029
1030
 
1030
 
        g_signal_connect (data->ST_memo, "insert-text", G_CALLBACK(ui_split_dialog_filter_text_handler), data);
1031
 
        
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);
1034
 
 
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);
1037
 
 
1038
 
        //todo: add enter validate
1039
 
        g_signal_connect (data->ST_amount, "activate", G_CALLBACK (ui_split_dialog_cb_activate_split), NULL);
1040
 
 
1041
 
        
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);
1045
1034
 
 
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);
 
1038
 
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);