~veselkovsd/homebank/ignore_week-end

« back to all changes in this revision

Viewing changes to src/ui-budget.c

  • Committer: Maxime Doyen
  • Date: 2020-01-09 20:51:22 UTC
  • Revision ID: homebank@free.fr-20200109205122-160pgd4y7hirpins
5.3 release

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
/*  HomeBank -- Free, easy, personal accounting for everyone.
2
 
 *  Copyright (C) 1995-2019 Maxime DOYEN
 
2
 *  Copyright (C) 1995-2020 Maxime DOYEN
3
3
 *
4
4
 *  This file is part of HomeBank.
5
5
 *
44
44
extern gchar *CYA_ABMONTHS[];
45
45
 
46
46
 
47
 
static gchar *ui_bud_manage_getcsvbudgetstr(Category *item);
48
 
static void ui_bud_manage_update(GtkWidget *treeview, gpointer user_data);
49
 
static void ui_bud_manage_set(GtkWidget *widget, gpointer user_data);
50
 
static void ui_bud_manage_getlast(struct ui_bud_manage_data *data);
51
 
static void ui_bud_manage_selection_change(GtkWidget *treeview, gpointer user_data);
52
 
static void ui_bud_manage_toggle(GtkRadioButton *radiobutton, gpointer user_data);
53
 
static void ui_bud_manage_selection(GtkTreeSelection *treeselection, gpointer user_data);
54
 
 
55
 
 
56
47
/* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
57
48
 
58
49
/*
91
82
        // get the transaction
92
83
        gtk_tree_model_get(model, iter, LST_DEFCAT_DATAS, &item, -1);
93
84
 
94
 
        iconname = ( item->flags & GF_BUDGET ) ? ICONNAME_HB_OPE_BUDGET : NULL;
 
85
        //5.3 added
 
86
        if( item->flags & GF_FORCED )
 
87
                iconname = ICONNAME_HB_OPE_FORCED;
 
88
        else
 
89
                if( item->flags & GF_BUDGET )
 
90
                        iconname = ICONNAME_HB_OPE_BUDGET;
95
91
 
96
92
        g_object_set(renderer, "icon-name", iconname, NULL);
97
93
}
120
116
 
121
117
        type = category_get_type_char(entry);
122
118
 
123
 
        #if MYDEBUG
124
 
                string = g_markup_printf_escaped("%s ::(f=%d, %c)", name, entry->flags, type );
125
 
        #else
126
119
        if(entry->key == 0)
127
120
                string = g_strdup(name);
128
121
        else
142
135
                                string = g_markup_printf_escaped(" %c <i>%s</i>", type, name);
143
136
                }
144
137
        }
145
 
        #endif
146
 
 
147
 
        g_object_set(renderer, "markup", string, NULL);
148
 
 
149
 
        g_free(string);
150
 
}
 
138
 
 
139
        g_object_set(renderer, "markup", string, NULL);
 
140
 
 
141
        g_free(string);
 
142
}
 
143
 
 
144
 
 
145
#if MYDEBUG == 1
 
146
static void
 
147
ui_bud_listview_cell_data_function_debug (GtkTreeViewColumn *col, GtkCellRenderer *renderer, GtkTreeModel *model, GtkTreeIter *iter, gpointer user_data)
 
148
{
 
149
Category *entry;
 
150
gchar *string;
 
151
gchar type;
 
152
 
 
153
        gtk_tree_model_get(model, iter, LST_DEFCAT_DATAS, &entry, -1);
 
154
 
 
155
        type = category_get_type_char(entry);
 
156
 
 
157
        string = g_markup_printf_escaped("f:%d t:%c", entry->flags, type );
 
158
        g_object_set(renderer, "markup", string, NULL);
 
159
        g_free(string);
 
160
}
 
161
#endif  
 
162
 
151
163
 
152
164
 
153
165
static gboolean ui_bud_listview_search_equal_func (GtkTreeModel *model,
220
232
 
221
233
        gtk_tree_view_set_grid_lines (GTK_TREE_VIEW (treeview), PREFS->grid_lines);
222
234
        gtk_tree_view_set_enable_tree_lines(GTK_TREE_VIEW (treeview), TRUE);
223
 
        
224
 
        /* column 1 */
225
 
        renderer = gtk_cell_renderer_text_new ();
226
 
        g_object_set(renderer, 
227
 
                "ellipsize", PANGO_ELLIPSIZE_END,
228
 
            "ellipsize-set", TRUE,
229
 
            NULL);      
230
235
 
 
236
        #if MYDEBUG == 1
 
237
        renderer = gtk_cell_renderer_text_new ();
 
238
        column = gtk_tree_view_column_new();
 
239
        gtk_tree_view_column_pack_start(column, renderer, TRUE);
 
240
        gtk_tree_view_column_set_cell_data_func(column, renderer, ui_bud_listview_cell_data_function_debug, NULL, NULL);
 
241
        gtk_tree_view_append_column (GTK_TREE_VIEW(treeview), column);
 
242
        #endif
 
243
        
 
244
        /* icon column */
 
245
        column = gtk_tree_view_column_new();
 
246
        renderer = gtk_cell_renderer_pixbuf_new ();
 
247
        //gtk_cell_renderer_set_fixed_size(renderer, GLOBALS->lst_pixbuf_maxwidth, -1);
 
248
        gtk_tree_view_column_pack_start(column, renderer, TRUE);
 
249
        gtk_tree_view_column_set_cell_data_func(column, renderer, ui_bud_listview_icon_cell_data_function, NULL, NULL);
 
250
        gtk_tree_view_append_column (GTK_TREE_VIEW(treeview), column);
 
251
        
 
252
        /* category name */
 
253
        renderer = gtk_cell_renderer_text_new ();
231
254
        column = gtk_tree_view_column_new();
232
255
        gtk_tree_view_column_set_title(column, _("Category"));
233
256
        gtk_tree_view_column_pack_start(column, renderer, TRUE);
238
261
        gtk_tree_view_column_set_resizable(column, TRUE);
239
262
        gtk_tree_view_append_column (GTK_TREE_VIEW(treeview), column);
240
263
 
241
 
        /* icon column */
242
 
        column = gtk_tree_view_column_new();
243
 
        renderer = gtk_cell_renderer_pixbuf_new ();
244
 
        //gtk_cell_renderer_set_fixed_size(renderer, GLOBALS->lst_pixbuf_maxwidth, -1);
245
 
        gtk_tree_view_column_pack_start(column, renderer, TRUE);
246
 
        gtk_tree_view_column_set_cell_data_func(column, renderer, ui_bud_listview_icon_cell_data_function, NULL, NULL);
247
 
        gtk_tree_view_append_column (GTK_TREE_VIEW(treeview), column);
248
 
 
 
264
        gtk_tree_view_set_expander_column(GTK_TREE_VIEW(treeview), column);
249
265
        
250
266
        gtk_tree_view_set_search_equal_func(GTK_TREE_VIEW(treeview), ui_bud_listview_search_equal_func, NULL, NULL);
251
267
 
380
396
        //data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(GTK_WIDGET(widget), GTK_TYPE_WINDOW)), "inst_data");
381
397
 
382
398
 
383
 
        DB( g_print("(ui_bud_manage) load csv - data %p\n", data) );
 
399
        DB( g_print("\n[ui-budget] load csv - data %p\n", data) );
384
400
 
385
 
        if( ui_file_chooser_csv(GTK_WINDOW(data->window), GTK_FILE_CHOOSER_ACTION_OPEN, &filename, NULL) == TRUE )
 
401
        if( ui_file_chooser_csv(GTK_WINDOW(data->dialog), GTK_FILE_CHOOSER_ACTION_OPEN, &filename, NULL) == TRUE )
386
402
        {
387
403
                DB( g_print(" + filename is %s\n", filename) );
388
404
 
501
517
 
502
518
                        if( error == TRUE )
503
519
                        {
504
 
                                ui_dialog_msg_infoerror(GTK_WINDOW(data->window), GTK_MESSAGE_ERROR,
 
520
                                ui_dialog_msg_infoerror(GTK_WINDOW(data->dialog), GTK_MESSAGE_ERROR,
505
521
                                        _("File format error"),
506
522
                                        _("The CSV file must contains the exact numbers of column,\nseparated by a semi-colon, please see the help for more details.")
507
523
                                        );
524
540
gboolean valid;
525
541
GIOChannel *io;
526
542
 
527
 
        DB( g_print("(ui_bud_manage) save csv\n") );
 
543
        DB( g_print("\n[ui-budget] save csv\n") );
528
544
 
529
545
        //data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data");
530
546
 
531
 
        if( ui_file_chooser_csv(GTK_WINDOW(data->window), GTK_FILE_CHOOSER_ACTION_SAVE, &filename, NULL) == TRUE )
 
547
        if( ui_file_chooser_csv(GTK_WINDOW(data->dialog), GTK_FILE_CHOOSER_ACTION_SAVE, &filename, NULL) == TRUE )
532
548
        {
533
549
 
534
550
                DB( g_print(" + filename is %s\n", filename) );
608
624
struct ui_bud_manage_data *data;
609
625
 
610
626
        data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data");
611
 
        DB( g_print("\n(ui_bud_manage) expand all (data=%x)\n", (guint)data) );
 
627
        DB( g_print("\n[ui-budget] expand all (data=%p)\n", data) );
612
628
 
613
629
        gtk_tree_view_expand_all(GTK_TREE_VIEW(data->LV_cat));
614
630
 
620
636
struct ui_bud_manage_data *data;
621
637
 
622
638
        data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data");
623
 
        DB( g_print("\n(ui_bud_manage) collapse all (data=%x)\n", (guint)data) );
 
639
        DB( g_print("\n[ui-budget] collapse all (data=%p)\n", data) );
624
640
 
625
641
        gtk_tree_view_collapse_all(GTK_TREE_VIEW(data->LV_cat));
626
642
 
627
643
}
628
644
 
 
645
 
629
646
static void ui_bud_manage_update(GtkWidget *treeview, gpointer user_data)
630
647
{
631
648
struct ui_bud_manage_data *data;
634
651
 
635
652
        data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(GTK_WIDGET(treeview), GTK_TYPE_WINDOW)), "inst_data");
636
653
 
637
 
        DB( g_print("\n(ui_bud_manage) update %x\n", (gint)data) );
 
654
        DB( g_print("\n[ui-budget] update %p\n", data) );
638
655
 
639
656
 
640
657
        name = FALSE;
660
677
#endif
661
678
 
662
679
        custom = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data->CM_type[1]));
663
 
        DB( g_print(" custom = %d\n\n", custom) );
 
680
        DB( g_print(" custom = %d\n", custom) );
664
681
 
665
682
        sensitive = name == FALSE ? FALSE : custom == TRUE ? FALSE: TRUE;
666
683
        gtk_widget_set_sensitive(data->spinner[0], sensitive);
672
689
                gtk_widget_set_sensitive(data->spinner[i+1], sensitive);
673
690
        }
674
691
 
 
692
 
 
693
 
 
694
        
 
695
        DB( g_print(" -- end update %p\n", data) );
 
696
 
 
697
        
 
698
}
 
699
 
 
700
 
 
701
static void
 
702
ui_bud_manage_compute_total(GtkWidget *widget, gpointer user_data)
 
703
{
 
704
struct ui_bud_manage_data *data;
 
705
GList *lcat, *list;
 
706
gdouble value;
 
707
gint j;
 
708
 
 
709
        data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(GTK_WIDGET(widget), GTK_TYPE_WINDOW)), "inst_data");
 
710
 
 
711
        DB( g_print("\n[ui-budget] compute total\n") );
 
712
 
 
713
        data->totexp = 0;
 
714
        data->totinc = 0;
 
715
 
 
716
        lcat = list = category_glist_sorted(1);
 
717
        while (list != NULL)
 
718
        {
 
719
        Category *item = list->data;
 
720
 
 
721
                value = 0;
 
722
                if(!(item->flags & GF_CUSTOM))
 
723
                {
 
724
                        value += (12*item->budget[0]);
 
725
                }
 
726
                //otherwise     sum each month from mindate month
 
727
                else
 
728
                {
 
729
                        for(j=1;j<12;j++) {
 
730
                                value += item->budget[j];
 
731
                        }
 
732
                }
 
733
 
 
734
                if( value <= 0.0 )
 
735
                        data->totexp += value;
 
736
                else
 
737
                        data->totinc += value;
 
738
 
 
739
                list = g_list_next(list);
 
740
        }
 
741
        g_list_free(lcat);
 
742
 
 
743
        hb_label_set_colvalue(GTK_LABEL(data->TX_totexp), data->totexp, GLOBALS->kcur, GLOBALS->minor);
 
744
        hb_label_set_colvalue(GTK_LABEL(data->TX_totinc), data->totinc, GLOBALS->kcur, GLOBALS->minor);
 
745
        hb_label_set_colvalue(GTK_LABEL(data->TX_totbal), data->totexp + data->totinc, GLOBALS->kcur, GLOBALS->minor);
 
746
}
 
747
 
 
748
 
 
749
 
 
750
static void
 
751
ui_bud_manage_cb_forcemonitor_toggled(GtkWidget *widget, gpointer user_data)
 
752
{
 
753
struct ui_bud_manage_data *data;
 
754
Category *item;
 
755
        
 
756
        DB( g_print("\n[ui-budget] forced toggled\n") );
 
757
        
 
758
        data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(GTK_WIDGET(widget), GTK_TYPE_WINDOW)), "inst_data");
 
759
 
 
760
        item = data->cat;
 
761
        if( item )
 
762
        {
 
763
                item->flags &= ~(GF_FORCED);
 
764
                if( gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data->CM_force)) && !(item->flags & GF_BUDGET) )
 
765
                        item->flags |= GF_FORCED;
 
766
        
 
767
                hbtk_listview_redraw_selected_row (GTK_TREE_VIEW(data->LV_cat));
 
768
        }
 
769
}
 
770
 
 
771
 
 
772
static void
 
773
ui_bud_manage_toggle(GtkRadioButton *radiobutton, gpointer user_data)
 
774
{
 
775
//struct ui_bud_manage_data *data;
 
776
 
 
777
        //data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(GTK_WIDGET(radiobutton), GTK_TYPE_WINDOW)), "inst_data");
 
778
 
 
779
        DB( g_print("\n[ui-budget] toggle\n") );
 
780
 
 
781
        //ui_bud_manage_get(GTK_WIDGET(radiobutton), GINT_TO_POINTER(FIELD_TYPE));
 
782
 
 
783
        //data->custom ^= 1;
 
784
        ui_bud_manage_update(GTK_WIDGET(radiobutton), NULL);
 
785
}
 
786
 
 
787
 
 
788
static void ui_bud_manage_get(struct ui_bud_manage_data *data, Category *item)
 
789
{
 
790
 
 
791
        DB( g_print("\n[ui-budget] get") );
 
792
 
 
793
        if( item != NULL )
 
794
        {
 
795
                item->flags &= ~(GF_CUSTOM|GF_BUDGET|GF_FORCED);
 
796
 
 
797
                if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data->CM_type[0])) == FALSE)
 
798
                {
 
799
                        item->flags |= GF_CUSTOM;
 
800
                }
 
801
 
 
802
                for(guint i=0;i<=12;i++)
 
803
                {
 
804
                        gtk_spin_button_update(GTK_SPIN_BUTTON(data->spinner[i]));
 
805
                        item->budget[i] = gtk_spin_button_get_value(GTK_SPIN_BUTTON(data->spinner[i]));
 
806
                        if( item->budget[i] )
 
807
                                item->flags |= GF_BUDGET;
 
808
                }
 
809
 
 
810
                if( gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data->CM_force)) && !(item->flags & GF_BUDGET) )
 
811
                {
 
812
                        item->flags |= GF_FORCED;
 
813
                }
 
814
        }
 
815
 
 
816
        DB( g_print(" -- end get") );
 
817
 
 
818
}
 
819
 
 
820
 
 
821
static gboolean ui_bud_manage_cb_budget_changed(GtkSpinButton *spinbutton, gpointer user_data)
 
822
{
 
823
struct ui_bud_manage_data *data;
 
824
gboolean retval = FALSE;
 
825
 
 
826
        data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(GTK_WIDGET(spinbutton), GTK_TYPE_WINDOW)), "inst_data");
 
827
 
 
828
        DB( g_print("\n[ui-budget] budget changed\n") );
 
829
 
 
830
        ui_bud_manage_get(data, data->cat);
 
831
 
 
832
        hbtk_listview_redraw_selected_row (GTK_TREE_VIEW(data->LV_cat));
 
833
        ui_bud_manage_compute_total(data->dialog, NULL);
 
834
 
 
835
        DB( g_print(" -- end budget changed\n") );
 
836
 
 
837
        return retval;
 
838
}
 
839
 
 
840
 
 
841
static void ui_bud_manage_getlast(struct ui_bud_manage_data *data)
 
842
{
 
843
Category *item;
 
844
 
 
845
        DB( g_print("\n[ui-budget] getlast") );
 
846
 
 
847
        item = data->lastcatitem;
 
848
        if( item != NULL )
 
849
        {
 
850
        gushort old_flags = item->flags;
 
851
        gdouble oldsum = 0.0;
 
852
        gdouble sum = 0.0;
 
853
                
 
854
                for(guint i=0;i<=12;i++)
 
855
                {
 
856
                        oldsum += item->budget[i];
 
857
                }
 
858
 
 
859
                ui_bud_manage_get(data, item);
 
860
                
 
861
                for(guint i=0;i<=12;i++)
 
862
                {
 
863
                        sum += item->budget[i];
 
864
                }
 
865
 
 
866
                if( (old_flags != item->flags) || (oldsum != sum) )
 
867
                        data->change++;
 
868
 
 
869
                hbtk_listview_redraw_selected_row (GTK_TREE_VIEW(data->LV_cat));
 
870
                ui_bud_manage_compute_total(data->dialog, NULL);
 
871
 
 
872
        }
 
873
 
 
874
        DB( g_print(" -- end getlast") );
 
875
 
 
876
}
 
877
 
 
878
 
 
879
static void ui_bud_manage_set(GtkWidget *widget, gpointer user_data)
 
880
{
 
881
struct ui_bud_manage_data *data;
 
882
gint active;
 
883
 
 
884
        data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(GTK_WIDGET(widget), GTK_TYPE_WINDOW)), "inst_data");
 
885
 
 
886
        DB( g_print("\n[ui-budget] set\n") );
 
887
 
 
888
        active = (data->cat->flags & GF_CUSTOM) ? 1 : 0;
 
889
 
 
890
        g_signal_handlers_block_by_func (data->CM_type[0], G_CALLBACK (ui_bud_manage_toggle), NULL);
 
891
        gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(data->CM_type[active]), TRUE);
 
892
        g_signal_handlers_unblock_by_func (data->CM_type[0], G_CALLBACK (ui_bud_manage_toggle), NULL);
 
893
 
 
894
        for(guint i=0;i<=12;i++)
 
895
        {
 
896
                g_signal_handlers_block_by_func (data->spinner[i], G_CALLBACK (ui_bud_manage_cb_budget_changed), NULL);
 
897
                gtk_spin_button_set_value(GTK_SPIN_BUTTON(data->spinner[i]), data->cat->budget[i]);
 
898
                g_signal_handlers_unblock_by_func (data->spinner[i], G_CALLBACK (ui_bud_manage_cb_budget_changed), NULL);
 
899
        }
 
900
 
 
901
        g_signal_handlers_block_by_func (data->CM_force, G_CALLBACK (ui_bud_manage_cb_forcemonitor_toggled), NULL);
 
902
        gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(data->CM_force), (data->cat->flags & GF_FORCED) ? 1 : 0);
 
903
        g_signal_handlers_unblock_by_func (data->CM_force, G_CALLBACK (ui_bud_manage_cb_forcemonitor_toggled), NULL);
 
904
 
 
905
        DB( g_print(" -- end set\n") );
675
906
}
676
907
 
677
908
 
684
915
 
685
916
        data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(GTK_WIDGET(widget), GTK_TYPE_WINDOW)), "inst_data");
686
917
 
687
 
        DB( g_print("(ui_bud_manage) clear\n") );
 
918
        DB( g_print("\n[ui-budget] clear\n") );
688
919
 
689
920
 
690
921
        title = _("Are you sure you want to clear input?");
692
923
        secondtext = _("If you proceed, every amount will be set to 0.");
693
924
        
694
925
        result = ui_dialog_msg_confirm_alert(
695
 
                        GTK_WINDOW(data->window),
 
926
                        GTK_WINDOW(data->dialog),
696
927
                        title,
697
928
                        secondtext,
698
929
                        _("_Clear")
701
932
        if( result == GTK_RESPONSE_OK )
702
933
        {
703
934
                //g_signal_handler_block(data->CM_type[0], data->handler_id[HID_CUSTOM]);
 
935
 
 
936
                
 
937
                
704
938
                gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(data->CM_type[0]), TRUE);
705
939
                //g_signal_handler_unblock(data->CM_type[0], data->handler_id[HID_CUSTOM]);
706
940
 
707
941
                for(i=0;i<=12;i++)
708
942
                {
709
 
                        //g_signal_handler_block(data->spinner[i], data->spinner_hid[i]);
710
 
 
 
943
                        g_signal_handlers_block_by_func (data->spinner[i], G_CALLBACK (ui_bud_manage_cb_budget_changed), NULL);
711
944
                        gtk_spin_button_set_value(GTK_SPIN_BUTTON(data->spinner[i]), 0);
712
945
                        data->cat->budget[i] = 0;
713
 
 
714
 
                        //g_signal_handler_unblock(data->spinner[i], data->spinner_hid[i]);
 
946
                        g_signal_handlers_unblock_by_func (data->spinner[i], G_CALLBACK (ui_bud_manage_cb_budget_changed), NULL);
715
947
                }
716
948
 
717
949
                data->cat->flags &= ~(GF_BUDGET);       //delete flag
718
950
                data->change++;
719
951
                
720
 
                gtk_widget_queue_draw (data->LV_cat);
721
 
        }
722
 
                
723
 
}
724
 
 
725
 
 
726
 
static void ui_bud_manage_set(GtkWidget *widget, gpointer user_data)
727
 
{
728
 
struct ui_bud_manage_data *data;
729
 
gint active;
730
 
gint i;
731
 
 
732
 
        data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(GTK_WIDGET(widget), GTK_TYPE_WINDOW)), "inst_data");
733
 
 
734
 
        DB( g_print("(ui_bud_manage) set\n") );
735
 
 
736
 
        active = data->cat->flags & GF_CUSTOM ? 1 : 0;
737
 
        //data->custom = active;
738
 
 
739
 
        //DB( g_print(" set custom to %d\n", data->custom) );
740
 
 
741
 
        g_signal_handler_block(data->CM_type[0], data->handler_id[HID_CUSTOM]);
742
 
        gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(data->CM_type[active]), TRUE);
743
 
        g_signal_handler_unblock(data->CM_type[0], data->handler_id[HID_CUSTOM]);
744
 
 
745
 
        for(i=0;i<=12;i++)
746
 
        {
747
 
                //g_signal_handler_block(data->spinner[i], data->spinner_hid[i]);
748
 
 
749
 
                gtk_spin_button_set_value(GTK_SPIN_BUTTON(data->spinner[i]), data->cat->budget[i]);
750
 
                //DB( g_print(" %.2f\n", data->cat->budget[i]) );
751
 
 
752
 
                //g_signal_handler_unblock(data->spinner[i], data->spinner_hid[i]);
753
 
        }
754
 
 
755
 
        gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(data->CM_force), (data->cat->flags & GF_FORCED) ? 1 : 0);
756
 
 
757
 
}
758
 
 
759
 
static gboolean ui_bud_manage_has_budget(GtkSpinButton *spinbutton, gpointer user_data)
760
 
{
761
 
struct ui_bud_manage_data *data;
762
 
gint i;
763
 
Category *item;
764
 
gboolean retval;
765
 
 
766
 
        data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(GTK_WIDGET(spinbutton), GTK_TYPE_WINDOW)), "inst_data");
767
 
 
768
 
        DB( g_print("(ui_bud_manage) has budget\n") );
769
 
 
770
 
        retval = FALSE;
771
 
        
772
 
        item = data->cat;
773
 
 
774
 
        if( item != NULL )
775
 
        {
776
 
                item->flags &= ~(GF_BUDGET);    //delete flag
777
 
                for(i=0;i<=12;i++)
778
 
                {
779
 
                        gtk_spin_button_update(GTK_SPIN_BUTTON(data->spinner[i]));
780
 
                        if( gtk_spin_button_get_value(GTK_SPIN_BUTTON(data->spinner[i])) )
781
 
                        {
782
 
                                retval = TRUE;
783
 
                                item->flags |= GF_BUDGET;
784
 
                                break;
785
 
                        }
786
 
                }
787
 
                
788
 
        }
789
 
        return retval;
790
 
}
791
 
 
792
 
 
793
 
static void ui_bud_manage_getlast(struct ui_bud_manage_data *data)
794
 
{
795
 
gboolean budget, change;
796
 
gint i;
797
 
Category *item;
798
 
gdouble oldvalue;
799
 
        gint active;
800
 
 
801
 
        item = data->lastcatitem;
802
 
 
803
 
        DB( g_print("****\n(ui_bud_manage) getlast for '%s'\n", item->name ) );
804
 
 
805
 
        if( item != NULL )
806
 
        {
807
 
        gushort old_flags = item->flags;
808
 
 
809
 
                item->flags &= ~(GF_CUSTOM);
810
 
                if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data->CM_type[0])) == FALSE)
811
 
                        item->flags |= GF_CUSTOM;
812
 
 
813
 
                DB( g_print(" custom flag=%d\n", gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data->CM_type[1]))) );
814
 
 
815
 
                // if any value,set the flag to visual indicator
816
 
                budget = FALSE;
817
 
                change = FALSE;
818
 
                item->flags &= ~(GF_BUDGET);    //delete flag
819
 
                for(i=0;i<=12;i++)
820
 
                {
821
 
                        gtk_spin_button_update(GTK_SPIN_BUTTON(data->spinner[i]));
822
 
                        oldvalue = item->budget[i];
823
 
 
824
 
                        item->budget[i] = gtk_spin_button_get_value(GTK_SPIN_BUTTON(data->spinner[i]));
825
 
 
826
 
                        if( oldvalue != item->budget[i])
827
 
                                change = TRUE;
828
 
 
829
 
                        DB( g_print(" set value %d to %.2f\n", i, item->budget[i]) );
830
 
                        if(item->budget[i])
831
 
                        {
832
 
                                budget = TRUE;
833
 
                        }
834
 
                }
835
 
 
836
 
                item->flags &= ~(GF_FORCED);    //delete flag
837
 
                active = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data->CM_force));
838
 
                if(active == 1)
839
 
                        item->flags |= GF_FORCED;
840
 
 
841
 
                if(budget == TRUE || active == 1)
842
 
                        item->flags |= GF_BUDGET;
843
 
 
844
 
                // compute changes
845
 
                if( (old_flags != item->flags) || change )
846
 
                        data->change++;
847
 
 
848
 
                gtk_widget_queue_draw (data->LV_cat);
849
 
 
850
 
        }
851
 
 
 
952
                hbtk_listview_redraw_selected_row (GTK_TREE_VIEW(data->LV_cat));
 
953
                ui_bud_manage_compute_total(data->dialog, NULL);
 
954
 
 
955
        }
 
956
                
852
957
}
853
958
 
854
959
 
857
962
struct ui_bud_manage_data *data;
858
963
GtkTreeModel *model;
859
964
GtkTreeIter iter;
 
965
gchar *title;
860
966
 
861
967
        data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(GTK_WIDGET(treeview), GTK_TYPE_WINDOW)), "inst_data");
862
968
 
863
 
        DB( g_print("(ui_bud_manage) changed\n") );
 
969
        DB( g_print("\n[ui-budget] selection changed\n") );
864
970
 
865
971
        data->cat = NULL;
866
972
 
874
980
 
875
981
                DB( g_print(" selected %s\n", item->name) );
876
982
 
 
983
                title = g_strdup_printf(_("Budget for %s"), item->fullname);
 
984
                gtk_label_set_text(GTK_LABEL(data->label_budget), title);
 
985
                g_free(title);
 
986
                
877
987
                if(data->lastcatitem != NULL && item != data->lastcatitem)
878
988
                {
879
989
                        DB( g_print(" -> should do a get for last selected (%s)\n", data->lastcatitem->name) );
889
999
        else
890
1000
        {
891
1001
                data->lastcatitem = NULL;
 
1002
                gtk_label_set_text(GTK_LABEL(data->label_budget), NULL);
892
1003
        }
893
1004
 
 
1005
 
894
1006
        ui_bud_manage_update(treeview, NULL);
895
1007
 
 
1008
 
 
1009
        DB( g_print(" -- end selection changed\n") );
 
1010
 
896
1011
}
897
1012
 
898
 
static void ui_bud_manage_toggle(GtkRadioButton *radiobutton, gpointer user_data)
 
1013
static void ui_bud_manage_populate_listview(struct ui_bud_manage_data *data)
899
1014
{
900
 
//struct ui_bud_manage_data *data;
901
 
 
902
 
        //data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(GTK_WIDGET(radiobutton), GTK_TYPE_WINDOW)), "inst_data");
903
 
 
904
 
        DB( g_print("(ui_bud_manage) toggle\n") );
905
 
 
906
 
        //ui_bud_manage_get(GTK_WIDGET(radiobutton), GINT_TO_POINTER(FIELD_TYPE));
907
 
 
908
 
        //data->custom ^= 1;
909
 
        ui_bud_manage_update(GTK_WIDGET(radiobutton), NULL);
 
1015
gint type;
 
1016
 
 
1017
        DB( g_print("\n[ui-budget] populate listview\n") );
 
1018
        
 
1019
        type = hbtk_radio_button_get_active(GTK_CONTAINER(data->RA_type)) == 1 ? CAT_TYPE_INCOME : CAT_TYPE_EXPENSE;
 
1020
 
 
1021
        ui_cat_listview_populate(data->LV_cat, type);
 
1022
        //gtk_tree_view_expand_all (GTK_TREE_VIEW(data->LV_cat));
 
1023
 
 
1024
        DB( g_print(" -- end populate listview\n") );
 
1025
 
910
1026
}
911
1027
 
912
1028
 
913
 
void ui_bud_manage_selection(GtkTreeSelection *treeselection, gpointer user_data)
 
1029
static void ui_bud_manage_selection(GtkTreeSelection *treeselection, gpointer user_data)
914
1030
{
915
1031
        ui_bud_manage_selection_change(GTK_WIDGET(gtk_tree_selection_get_tree_view (treeselection)), NULL);
916
1032
}
917
1033
 
 
1034
static void ui_bud_manage_cb_type_changed (GtkToggleButton *button, gpointer user_data)
 
1035
{
 
1036
        ui_bud_manage_populate_listview(user_data);
 
1037
        //g_print(" toggle type=%d\n", gtk_toggle_button_get_active(button));
 
1038
}
 
1039
 
918
1040
 
919
1041
static gboolean ui_bud_manage_cleanup(struct ui_bud_manage_data *data, gint result)
920
1042
{
921
1043
gboolean doupdate = FALSE;
922
1044
 
923
 
        DB( g_print("(ui_bud_manage) cleanup\n") );
 
1045
        DB( g_print("\n[ui-budget] cleanup\n") );
924
1046
 
925
1047
        if(data->lastcatitem != NULL)
926
1048
        {
938
1060
        return doupdate;
939
1061
}
940
1062
 
941
 
static void ui_bud_manage_populate_listview(struct ui_bud_manage_data *data)
942
 
{
943
 
gint type;
944
 
 
945
 
        type = hbtk_radio_button_get_active(GTK_CONTAINER(data->RA_type)) == 1 ? CAT_TYPE_INCOME : CAT_TYPE_EXPENSE;
946
 
 
947
 
        ui_cat_listview_populate(data->LV_cat, type);
948
 
        gtk_tree_view_expand_all (GTK_TREE_VIEW(data->LV_cat));
949
 
}
 
1063
 
 
1064
 
950
1065
 
951
1066
 
952
1067
static void ui_bud_manage_setup(struct ui_bud_manage_data *data)
953
1068
{
954
1069
 
955
 
        DB( g_print("(ui_bud_manage) setup\n") );
 
1070
        DB( g_print("\n[ui-budget] setup\n") );
956
1071
 
957
1072
        data->tmp_list = NULL;
958
1073
        data->change = 0;
960
1075
        data->lastcatitem = NULL;
961
1076
 
962
1077
        ui_bud_manage_populate_listview(data);
963
 
        
964
 
}
965
 
 
966
 
 
967
 
static void ui_bud_manage_type_changed_cb (GtkToggleButton *button, gpointer user_data)
968
 
{
969
 
        ui_bud_manage_populate_listview(user_data);
970
 
        //g_print(" toggle type=%d\n", gtk_toggle_button_get_active(button));
971
 
}
972
 
 
973
 
 
974
 
 
 
1078
        ui_bud_manage_compute_total(data->dialog, NULL);
 
1079
        ui_bud_manage_update(data->dialog, NULL);
 
1080
 
 
1081
        DB( g_print("-- end setup\n") );
 
1082
 
 
1083
}
975
1084
 
976
1085
 
977
1086
GtkWidget *ui_bud_manage_dialog (void)
978
1087
{
979
 
struct ui_bud_manage_data data;
 
1088
struct ui_bud_manage_data *data;
980
1089
GtkWidget *dialog, *content_area;
981
 
GtkWidget *content_grid, *group_grid, *table, *scrollwin, *label;
 
1090
GtkWidget *content_grid, *group_grid, *scrollwin, *label;
982
1091
GtkWidget *treeview, *hpaned, *bbox, *vbox, *hbox;
983
1092
GtkWidget *menu, *menuitem, *widget, *image, *tbar;
984
1093
GtkToolItem *toolitem;
987
1096
gint w, h;
988
1097
gint crow, row;
989
1098
 
990
 
        memset(&data, 0, sizeof(struct ui_bud_manage_data));
 
1099
        data = g_malloc0(sizeof(struct ui_bud_manage_data));
 
1100
        if(!data) return NULL;
991
1101
 
992
1102
        dialog = gtk_dialog_new_with_buttons (_("Manage Budget"),
993
1103
                                            GTK_WINDOW(GLOBALS->mainwindow),
996
1106
                                            GTK_RESPONSE_ACCEPT,
997
1107
                                            NULL);
998
1108
 
999
 
        data.window = dialog;
 
1109
        data->dialog = dialog;
1000
1110
 
1001
1111
        gtk_window_set_icon_name(GTK_WINDOW (dialog), ICONNAME_HB_BUDGET);
1002
1112
 
1006
1116
 
1007
1117
        
1008
1118
        //store our window private data
1009
 
        g_object_set_data(G_OBJECT(dialog), "inst_data", (gpointer)&data);
1010
 
        DB( g_print("(ui_bud_manage) window=%p, inst_data=%p\n", dialog, &data) );
 
1119
        g_object_set_data(G_OBJECT(dialog), "inst_data", (gpointer)data);
 
1120
        DB( g_print("\n[ui-budget] window=%p, inst_data=%p\n", dialog, data) );
1011
1121
 
1012
1122
        //window contents
1013
1123
        content_area = gtk_dialog_get_content_area(GTK_DIALOG (dialog));                // return a vbox
1014
1124
 
1015
 
  //our table
1016
 
        table = gtk_grid_new ();
1017
 
        gtk_grid_set_row_spacing (GTK_GRID (table), SPACING_MEDIUM);
1018
 
        gtk_grid_set_column_spacing (GTK_GRID (table), SPACING_MEDIUM);
1019
 
        g_object_set(table, "margin", SPACING_MEDIUM, NULL);
1020
 
        gtk_box_pack_start (GTK_BOX (content_area), table, TRUE, TRUE, 0);
1021
 
 
1022
 
        crow = 0;
 
1125
        hpaned = gtk_paned_new(GTK_ORIENTATION_HORIZONTAL);
 
1126
        gtk_container_set_border_width (GTK_CONTAINER(hpaned), SPACING_MEDIUM);
 
1127
        gtk_box_pack_start (GTK_BOX (content_area), hpaned, TRUE, TRUE, 0);
 
1128
 
 
1129
        /* left area */
 
1130
        //list
 
1131
        vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
 
1132
        gtk_widget_set_margin_end(vbox, SPACING_SMALL);
 
1133
        gtk_paned_pack1 (GTK_PANED(hpaned), vbox, FALSE, FALSE);
 
1134
 
 
1135
        hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
 
1136
        gtk_widget_set_margin_bottom(hbox, SPACING_MEDIUM);
 
1137
        gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
 
1138
 
1023
1139
        bbox = hbtk_radio_button_new(CYA_CAT_TYPE, TRUE);
1024
 
        data.RA_type = bbox;
 
1140
        data->RA_type = bbox;
1025
1141
        gtk_widget_set_halign (bbox, GTK_ALIGN_CENTER);
1026
 
        gtk_grid_attach (GTK_GRID (table), bbox, 0, crow, 1, 1);
1027
 
 
1028
 
        hbtk_radio_button_connect (GTK_CONTAINER(bbox), "toggled", G_CALLBACK (ui_bud_manage_type_changed_cb), &data);
 
1142
        gtk_box_pack_start (GTK_BOX (hbox), bbox, TRUE, TRUE, 0);
1029
1143
 
1030
1144
        menu = gtk_menu_new ();
1031
1145
        gtk_widget_set_halign (menu, GTK_ALIGN_END);
1032
1146
 
1033
1147
        menuitem = gtk_menu_item_new_with_mnemonic (_("_Import CSV"));
1034
1148
        gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
1035
 
        g_signal_connect (G_OBJECT (menuitem), "activate", G_CALLBACK (ui_bud_manage_load_csv), &data);
 
1149
        g_signal_connect (G_OBJECT (menuitem), "activate", G_CALLBACK (ui_bud_manage_load_csv), data);
1036
1150
 
1037
1151
        menuitem = gtk_menu_item_new_with_mnemonic (_("E_xport CSV"));
1038
1152
        gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
1039
 
        g_signal_connect (G_OBJECT (menuitem), "activate", G_CALLBACK (ui_bud_manage_save_csv), &data);
 
1153
        g_signal_connect (G_OBJECT (menuitem), "activate", G_CALLBACK (ui_bud_manage_save_csv), data);
1040
1154
        
1041
1155
        gtk_widget_show_all (menu);
1042
1156
        
1051
1165
 
1052
1166
        gtk_widget_set_hexpand (widget, FALSE);
1053
1167
        gtk_widget_set_halign (widget, GTK_ALIGN_END);
1054
 
        gtk_grid_attach (GTK_GRID (table), widget, 0, crow++, 1, 1);
1055
 
 
1056
 
 
1057
 
 
1058
 
        crow++;
1059
 
        hpaned = gtk_paned_new(GTK_ORIENTATION_HORIZONTAL);
1060
 
        //gtk_container_set_border_width (GTK_CONTAINER(hpaned), SPACING_MEDIUM);
1061
 
        gtk_grid_attach (GTK_GRID (table), hpaned, 0, crow++, 1, 1);
1062
 
 
1063
 
        /* left area */
1064
 
        //list
1065
 
        vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
1066
 
        gtk_widget_set_margin_right(vbox, SPACING_SMALL);
1067
 
        gtk_paned_pack1 (GTK_PANED(hpaned), vbox, FALSE, FALSE);
1068
 
        
 
1168
        gtk_box_pack_start (GTK_BOX (hbox), widget, FALSE, FALSE, 0);
 
1169
 
 
1170
 
1069
1171
        scrollwin = gtk_scrolled_window_new(NULL,NULL);
1070
1172
    gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrollwin), GTK_SHADOW_ETCHED_IN);
1071
1173
        gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrollwin), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
 
1174
        gtk_scrolled_window_set_min_content_height(GTK_SCROLLED_WINDOW(scrollwin), HB_MINHEIGHT_LIST);
1072
1175
        treeview = (GtkWidget *)ui_bud_listview_new();
1073
 
        data.LV_cat = treeview;
1074
 
        gtk_widget_set_size_request(treeview, HB_MINWIDTH_LIST, -1);
 
1176
        data->LV_cat = treeview;
1075
1177
        gtk_container_add(GTK_CONTAINER(scrollwin), treeview);
1076
1178
        gtk_widget_set_hexpand (scrollwin, TRUE);
1077
1179
        gtk_widget_set_vexpand (scrollwin, TRUE);
1096
1198
        gtk_toolbar_insert(GTK_TOOLBAR(tbar), GTK_TOOL_ITEM(toolitem), -1);
1097
1199
        
1098
1200
                widget = make_image_button(ICONNAME_HB_BUTTON_EXPAND, _("Expand all"));
1099
 
                data.BT_expand = widget;
 
1201
                data->BT_expand = widget;
1100
1202
                gtk_box_pack_start (GTK_BOX (hbox), widget, FALSE, FALSE, 0);
1101
1203
 
1102
1204
                widget = make_image_button(ICONNAME_HB_BUTTON_COLLAPSE, _("Collapse all"));
1103
 
                data.BT_collapse = widget;
 
1205
                data->BT_collapse = widget;
1104
1206
                gtk_box_pack_start (GTK_BOX (hbox), widget, FALSE, FALSE, 0);
1105
1207
 
1106
1208
        
1109
1211
        gtk_grid_set_row_spacing (GTK_GRID (content_grid), SPACING_LARGE);
1110
1212
        gtk_orientable_set_orientation(GTK_ORIENTABLE(content_grid), GTK_ORIENTATION_VERTICAL);
1111
1213
        //gtk_container_set_border_width (GTK_CONTAINER(content_grid), SPACING_MEDIUM);
1112
 
        gtk_widget_set_margin_left(content_grid, SPACING_SMALL);
 
1214
        gtk_widget_set_margin_start(content_grid, SPACING_SMALL);
1113
1215
        gtk_paned_pack2 (GTK_PANED(hpaned), content_grid, FALSE, FALSE);
1114
1216
 
1115
1217
        crow = 0;
1116
1218
 
1117
 
        
1118
1219
        // group :: General
1119
1220
    group_grid = gtk_grid_new ();
1120
1221
        gtk_grid_set_row_spacing (GTK_GRID (group_grid), SPACING_SMALL);
1121
1222
        gtk_grid_set_column_spacing (GTK_GRID (group_grid), SPACING_MEDIUM);
1122
1223
        gtk_grid_attach (GTK_GRID (content_grid), group_grid, 0, crow++, 1, 1);
1123
 
        
1124
 
        label = make_label_group(_("Budget for each month"));
1125
 
        data.label_budget = label;
1126
 
        gtk_grid_attach (GTK_GRID (group_grid), label, 0, 0, 3, 1);
 
1224
 
 
1225
        gtk_widget_set_halign(group_grid, GTK_ALIGN_END);
 
1226
        
 
1227
        //label = make_label_group(_("Budget total"));
 
1228
        //gtk_grid_attach (GTK_GRID (group_grid), label, 0, 0, 3, 1);
 
1229
 
 
1230
        row = 1;
 
1231
        label = gtk_label_new(_("Expense:"));
 
1232
        gtk_grid_attach (GTK_GRID (group_grid), label, 1, row, 1, 1);
 
1233
 
 
1234
        label = gtk_label_new(NULL);
 
1235
        data->TX_totexp = label;
 
1236
        gtk_grid_attach (GTK_GRID (group_grid), label, 2, row, 1, 1);
 
1237
 
 
1238
        label = gtk_label_new(_("Income:"));
 
1239
        gtk_grid_attach (GTK_GRID (group_grid), label, 3, row, 1, 1);
 
1240
 
 
1241
        label = gtk_label_new(NULL);
 
1242
        data->TX_totinc = label;
 
1243
        gtk_grid_attach (GTK_GRID (group_grid), label, 4, row, 1, 1);
 
1244
 
 
1245
        label = gtk_label_new(_("Balance:"));
 
1246
        gtk_grid_attach (GTK_GRID (group_grid), label, 5, row, 1, 1);
 
1247
 
 
1248
        label = gtk_label_new(NULL);
 
1249
        data->TX_totbal = label;
 
1250
        gtk_grid_attach (GTK_GRID (group_grid), label, 6, row, 1, 1);
 
1251
        
 
1252
        // group :: General
 
1253
        crow++;
 
1254
        group_grid = gtk_grid_new ();
 
1255
        gtk_grid_set_row_spacing (GTK_GRID (group_grid), SPACING_SMALL);
 
1256
        gtk_grid_set_column_spacing (GTK_GRID (group_grid), SPACING_MEDIUM);
 
1257
        gtk_grid_attach (GTK_GRID (content_grid), group_grid, 0, crow++, 1, 1);
 
1258
        
 
1259
        label = make_label_group(NULL);
 
1260
        data->label_budget = label;
 
1261
        gtk_grid_attach (GTK_GRID (group_grid), label, 0, 0, 5, 1);
1127
1262
 
1128
1263
        fchain = NULL;
1129
1264
        
1130
1265
        row = 1;
1131
 
        widget = gtk_radio_button_new_with_label (NULL, _("is the same"));
1132
 
        data.CM_type[0] = widget;
 
1266
        widget = gtk_radio_button_new_with_label (NULL, _("is the same each month"));
 
1267
        data->CM_type[0] = widget;
1133
1268
        gtk_widget_set_hexpand (widget, TRUE);
1134
1269
        gtk_grid_attach (GTK_GRID (group_grid), widget, 1, row, 4, 1);
1135
1270
        fchain = g_list_append(fchain, widget);
1136
1271
 
1137
1272
        row++;
1138
1273
        widget = make_amount(label);
1139
 
        data.spinner[0] = widget;
 
1274
        data->spinner[0] = widget;
1140
1275
        gtk_grid_attach (GTK_GRID (group_grid), widget, 2, row, 1, 1);
1141
1276
        fchain = g_list_append(fchain, widget);
1142
1277
 
1143
 
        g_signal_connect (G_OBJECT (data.spinner[0]), "value-changed", G_CALLBACK (ui_bud_manage_has_budget), NULL);
 
1278
        g_signal_connect (G_OBJECT (data->spinner[0]), "value-changed", G_CALLBACK (ui_bud_manage_cb_budget_changed), NULL);
1144
1279
        
1145
1280
        widget =  gtk_button_new_with_mnemonic (_("_Clear input"));
1146
 
        data.BT_clear = widget;
 
1281
        data->BT_clear = widget;
1147
1282
        gtk_widget_set_hexpand (widget, TRUE);
1148
1283
        gtk_widget_set_halign(widget, GTK_ALIGN_START);
1149
1284
        gtk_grid_attach (GTK_GRID (group_grid), widget, 4, row, 1, 1);
1157
1292
        */
1158
1293
 
1159
1294
        row++;
1160
 
    widget = gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON (data.CM_type[0]), _("is different"));
1161
 
        data.CM_type[1] = widget;
 
1295
    widget = gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON (data->CM_type[0]), _("is different per month"));
 
1296
        data->CM_type[1] = widget;
1162
1297
        gtk_widget_set_hexpand (widget, TRUE);
1163
1298
        gtk_grid_attach (GTK_GRID (group_grid), widget, 1, row, 4, 1);
1164
1299
        fchain = g_list_append(fchain, widget);
1173
1308
 
1174
1309
                //#1826659 budget dialog month widget label decay by one
1175
1310
                label = make_label_widget(_(CYA_ABMONTHS[i+1]));
1176
 
                data.label[i+1] = label;
 
1311
                data->label[i+1] = label;
1177
1312
                gtk_grid_attach (GTK_GRID (group_grid), label, l, t, 1, 1);
1178
1313
 
1179
1314
                widget = make_amount(label);
1180
 
                data.spinner[i+1] = widget;
 
1315
                data->spinner[i+1] = widget;
1181
1316
                fchain = g_list_append(fchain, widget);
1182
1317
                gtk_widget_set_hexpand (widget, TRUE);
1183
1318
                gtk_grid_attach (GTK_GRID (group_grid), widget, l+1, t, 1, 1);
1184
1319
 
1185
 
                g_signal_connect (G_OBJECT (data.spinner[i+1]), "value-changed", G_CALLBACK (ui_bud_manage_has_budget), NULL);
 
1320
                g_signal_connect (G_OBJECT (data->spinner[i+1]), "value-changed", G_CALLBACK (ui_bud_manage_cb_budget_changed), NULL);
1186
1321
                
1187
 
                //DB( g_print("(ui_bud_manage) %s, col=%d, row=%d", CYA_ABMONTHS[i], col, row) );
 
1322
                //DB( g_print("\n[ui-budget] %s, col=%d, row=%d", CYA_ABMONTHS[i], col, row) );
1188
1323
        }
1189
1324
 
1190
1325
        gtk_container_set_focus_chain(GTK_CONTAINER(group_grid), fchain);
1197
1332
        gtk_grid_attach (GTK_GRID (content_grid), group_grid, 0, crow++, 1, 1);
1198
1333
 
1199
1334
        label = make_label_group(_("Options"));
1200
 
        data.label_options = label;
 
1335
        data->label_options = label;
1201
1336
        gtk_grid_attach (GTK_GRID (group_grid), label, 0, 0, 3, 1);
1202
1337
 
1203
1338
        row = 1;
1204
1339
        widget = gtk_check_button_new_with_mnemonic (_("_Force monitoring this category"));
1205
 
        data.CM_force = widget;
 
1340
        data->CM_force = widget;
1206
1341
        gtk_widget_set_hexpand (widget, TRUE);
1207
1342
        gtk_grid_attach (GTK_GRID (group_grid), widget, 1, row, 4, 1);
1208
1343
 
1211
1346
    g_signal_connect (dialog, "destroy",
1212
1347
                        G_CALLBACK (gtk_widget_destroyed), &dialog);
1213
1348
 
1214
 
 
1215
 
        g_signal_connect (gtk_tree_view_get_selection(GTK_TREE_VIEW(data.LV_cat)), "changed", G_CALLBACK (ui_bud_manage_selection), NULL);
1216
 
        //g_signal_connect (GTK_TREE_VIEW(data.LV_cat), "row-activated", G_CALLBACK (ui_bud_manage_onRowActivated), NULL);
1217
 
 
1218
 
        g_signal_connect (G_OBJECT (data.BT_expand), "clicked", G_CALLBACK (ui_bud_manage_expand_all), NULL);
1219
 
        g_signal_connect (G_OBJECT (data.BT_collapse), "clicked", G_CALLBACK (ui_bud_manage_collapse_all), NULL);
1220
 
 
1221
 
        data.handler_id[HID_CUSTOM] = g_signal_connect (data.CM_type[0], "toggled", G_CALLBACK (ui_bud_manage_toggle), NULL);
1222
 
 
1223
 
        g_signal_connect (G_OBJECT (data.BT_clear), "clicked", G_CALLBACK (ui_bud_manage_clear), NULL);
1224
 
 
1225
 
        //data.custom = FALSE;
1226
 
        //gtk_widget_set_sensitive(data.table, FALSE);
 
1349
        hbtk_radio_button_connect (GTK_CONTAINER(data->RA_type), "toggled", G_CALLBACK (ui_bud_manage_cb_type_changed), data);
 
1350
 
 
1351
        g_signal_connect (gtk_tree_view_get_selection(GTK_TREE_VIEW(data->LV_cat)), "changed", G_CALLBACK (ui_bud_manage_selection), NULL);
 
1352
        //g_signal_connect (GTK_TREE_VIEW(data->LV_cat), "row-activated", G_CALLBACK (ui_bud_manage_onRowActivated), NULL);
 
1353
 
 
1354
        g_signal_connect (G_OBJECT (data->BT_expand), "clicked", G_CALLBACK (ui_bud_manage_expand_all), NULL);
 
1355
        g_signal_connect (G_OBJECT (data->BT_collapse), "clicked", G_CALLBACK (ui_bud_manage_collapse_all), NULL);
 
1356
 
 
1357
        g_signal_connect (data->CM_type[0], "toggled", G_CALLBACK (ui_bud_manage_toggle), NULL);
 
1358
 
 
1359
        g_signal_connect (G_OBJECT (data->BT_clear), "clicked", G_CALLBACK (ui_bud_manage_clear), NULL);
 
1360
 
 
1361
        g_signal_connect (data->CM_force, "toggled", G_CALLBACK (ui_bud_manage_cb_forcemonitor_toggled), NULL);
 
1362
        
 
1363
        //data->custom = FALSE;
 
1364
        //gtk_widget_set_sensitive(data->table, FALSE);
1227
1365
 
1228
1366
        //setup, init and show window
1229
 
        ui_bud_manage_setup(&data);
1230
 
        ui_bud_manage_update(dialog, NULL);
1231
 
 
1232
 
 
 
1367
        ui_bud_manage_setup(data);
1233
1368
 
1234
1369
        gtk_widget_show_all (dialog);
1235
1370
 
1246
1381
    }
1247
1382
 
1248
1383
        // cleanup and destroy
1249
 
        ui_bud_manage_cleanup(&data, result);
 
1384
        ui_bud_manage_cleanup(data, result);
1250
1385
        gtk_widget_destroy (dialog);
1251
1386
 
 
1387
        g_free(data);
 
1388
        
1252
1389
        return NULL;
1253
1390
}
1254
1391