~mdoyen/homebank/5.7.x

« back to all changes in this revision

Viewing changes to src/ui-widgets.c

  • Committer: Maxime Doyen
  • Date: 2023-09-06 19:22:10 UTC
  • Revision ID: homebank@free.fr-20230906192210-kal1pe00sty1jt2g
5.7 release

Show diffs side-by-side

added added

removed removed

Lines of Context:
38
38
extern struct HomeBank *GLOBALS;
39
39
 
40
40
 
41
 
/* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
42
 
 
43
 
 
44
 
extern HbKvData CYA_FLT_RANGE[];
45
 
 
46
 
 
47
 
/* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
 
41
/* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
 
42
 
 
43
 
 
44
extern HbKvData CYA_FLT_RANGE_DWF[];
 
45
extern HbKvData CYA_FLT_RANGE_MQY[];
 
46
extern HbKvData CYA_FLT_RANGE_NORMAL[];
 
47
extern HbKvData CYA_FLT_RANGE_BUDGET[];
 
48
extern HbKvData CYA_FLT_RANGE_CUSTOM[];
 
49
 
 
50
extern gchar *CYA_ABMONTHS[];
 
51
 
 
52
 
 
53
/* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
 
54
/* GTK4 transitional anticipation */
 
55
/* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
 
56
 
 
57
#if( (GTK_MAJOR_VERSION < 4)  )
 
58
 
 
59
void gtk_window_set_child (GtkWindow* window, GtkWidget* child)
 
60
{ gtk_container_add (GTK_CONTAINER(window), child); }
 
61
 
 
62
void gtk_popover_set_child (GtkPopover* popover, GtkWidget* child)
 
63
{ gtk_container_add (GTK_CONTAINER(popover), child); }
 
64
 
 
65
void gtk_frame_set_child (GtkFrame* frame, GtkWidget* child)
 
66
{ gtk_container_add (GTK_CONTAINER(frame), child); }
 
67
 
 
68
void gtk_overlay_set_child (GtkOverlay* overlay, GtkWidget* child)
 
69
{ gtk_container_add (GTK_CONTAINER(overlay), child); }
 
70
 
 
71
void gtk_scrolled_window_set_child (GtkScrolledWindow* scrolled_window, GtkWidget* child)
 
72
{ gtk_container_add (GTK_CONTAINER(scrolled_window), child); }
 
73
 
 
74
void gtk_revealer_set_child (GtkRevealer* revealer, GtkWidget* child)
 
75
{ gtk_container_add (GTK_CONTAINER(revealer), child); }
 
76
 
 
77
void gtk_expander_set_child (GtkExpander* expander, GtkWidget* child)
 
78
{ gtk_container_add (GTK_CONTAINER(expander), child); }
 
79
 
 
80
 
 
81
void gtk_window_destroy (GtkWindow* window)
 
82
{ gtk_widget_destroy(GTK_WIDGET(window)); }
 
83
 
 
84
#endif
 
85
 
 
86
/* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
 
87
 
48
88
 
49
89
//TODO: only WEIGHT & SCALE are used for now
50
90
void
185
225
}
186
226
 
187
227
 
 
228
void hb_widget_set_margins(GtkWidget *widget, gint top, gint right, gint bottom, gint left)
 
229
{
 
230
        gtk_widget_set_margin_top (widget, top);
 
231
        gtk_widget_set_margin_end (widget, right);
 
232
        gtk_widget_set_margin_bottom (widget, bottom);
 
233
        gtk_widget_set_margin_start (widget, left);
 
234
}
 
235
 
 
236
 
188
237
void hb_widget_set_margin(GtkWidget *widget, gint margin)
189
238
{
190
 
        gtk_widget_set_margin_start (widget, margin);
191
 
        gtk_widget_set_margin_end (widget, margin);
192
 
        gtk_widget_set_margin_top (widget, margin);
193
 
        gtk_widget_set_margin_bottom (widget, margin);
 
239
        hb_widget_set_margins (widget, margin, margin, margin, margin);
194
240
}
195
241
 
196
242
 
287
333
}
288
334
 
289
335
 
 
336
gboolean
 
337
hbtk_tree_store_get_top_level(GtkTreeModel *model, gint column_id, guint32 key, GtkTreeIter *return_iter)
 
338
{
 
339
GtkTreeIter iter;
 
340
gboolean valid;
 
341
guint32 tmpkey;
 
342
 
 
343
    if( model != NULL && key > 0 )
 
344
    {
 
345
                valid = gtk_tree_model_get_iter_first(model, &iter);
 
346
                while (valid)
 
347
                {
 
348
                        gtk_tree_model_get (model, &iter, column_id, &tmpkey, -1);
 
349
                        if(tmpkey == key)
 
350
                        {
 
351
                                *return_iter = iter;
 
352
                                return TRUE;
 
353
                        }
 
354
 
 
355
                 valid = gtk_tree_model_iter_next(model, &iter);
 
356
                }
 
357
        }
 
358
        return FALSE;
 
359
}
 
360
 
 
361
 
 
362
void 
 
363
hbtk_tree_store_remove_iter_with_child(GtkTreeModel *model, GtkTreeIter *iter)
 
364
{
 
365
GtkTreeIter child;
 
366
gboolean valid;
 
367
 
 
368
        valid = gtk_tree_model_iter_children(model, &child, iter);
 
369
        while( valid )
 
370
        {
 
371
                valid = gtk_tree_store_remove(GTK_TREE_STORE(model), &child);
 
372
                if( valid )
 
373
                        valid = gtk_tree_model_iter_next(model, &child);
 
374
        }
 
375
 
 
376
        gtk_tree_store_remove(GTK_TREE_STORE(model), iter);
 
377
}
 
378
 
 
379
 
290
380
GtkTreeViewColumn *
291
381
hbtk_treeview_get_column_by_id(GtkTreeView *treeview, gint search_id)
292
382
{
661
751
        spinner = gtk_spin_button_new (adj, 1.0, 2);
662
752
        g_object_set(spinner, "xalign", 1.0, NULL);
663
753
 
 
754
        //5.7
 
755
        gtk_entry_set_width_chars(GTK_ENTRY(spinner), 13);
 
756
 
664
757
        if(label)
665
758
                gtk_label_set_mnemonic_widget (GTK_LABEL(label), spinner);
666
759
 
740
833
}
741
834
 
742
835
 
 
836
static gint
 
837
hbtk_monthyear_spin_input (GtkSpinButton *spin_button,
 
838
                 gdouble       *new_val)
 
839
{
 
840
  const gchar *text;
 
841
  gchar **str;
 
842
  gboolean found = FALSE;
 
843
  gint month = 0;
 
844
  gint year;
 
845
  gchar *endm;
 
846
   gint i;
 
847
  gchar *tmp1, *tmp2;
 
848
 
 
849
  text = gtk_entry_get_text (GTK_ENTRY (spin_button));
 
850
  str = g_strsplit (text, " ", 2);
 
851
 
 
852
  if (g_strv_length (str) == 2)
 
853
    {
 
854
      //month = strtol (str[0], &endh, 10);
 
855
          for (i = 0; i < 12; i++)
 
856
                {
 
857
                  tmp1 = g_ascii_strup (CYA_ABMONTHS[i+1], -1);
 
858
                  tmp2 = g_ascii_strup (str[0], -1);
 
859
                  if (strstr (tmp1, tmp2) == tmp1)
 
860
                  {
 
861
                    found = TRUE;
 
862
                    month = i;
 
863
                  }
 
864
                  g_free (tmp1);
 
865
                  g_free (tmp2);
 
866
                  if (found)
 
867
                    break;
 
868
                }
 
869
 
 
870
 
 
871
      year = strtol (str[1], &endm, 10) - 1900;
 
872
      
 
873
        //g_print(" input: m=%d y=%d => %d\n", month, year, month + year * 12);
 
874
 
 
875
      if (found && !*endm && 0 <= month && month < 12 )
 
876
        {
 
877
          *new_val = month + (year * 12);
 
878
          found = TRUE;
 
879
          //g_print("  affect newval %f\n", *new_val);
 
880
        }
 
881
    }
 
882
 
 
883
  g_strfreev (str);
 
884
 
 
885
  if (!found)
 
886
    {
 
887
      *new_val = 0.0;
 
888
      return GTK_INPUT_ERROR;
 
889
    }
 
890
 
 
891
  return TRUE;
 
892
}
 
893
 
 
894
 
 
895
static gint
 
896
hbtk_monthyear_spin_output (GtkSpinButton *spin_button)
 
897
{
 
898
  GtkAdjustment *adjustment;
 
899
  gchar *buf;
 
900
  gint month;
 
901
  gint year;
 
902
  gint retval = TRUE;
 
903
 
 
904
  adjustment = gtk_spin_button_get_adjustment (spin_button);
 
905
  month = ((gint)gtk_adjustment_get_value (adjustment) % 12);
 
906
  year = (gint)gtk_adjustment_get_value (adjustment) / 12.0;
 
907
 
 
908
  //g_print(" output: %d => m:%d y:%d\n", (gint)gtk_adjustment_get_value (adjustment), month, year);
 
909
 
 
910
  buf = g_strdup_printf ("%s %04d", CYA_ABMONTHS[month+1], year+1900);
 
911
 
 
912
  //g_signal_handlers_block_by_func(spin_button, time_spin_input, NULL);
 
913
 
 
914
  if (strcmp (buf, gtk_entry_get_text (GTK_ENTRY (spin_button))))
 
915
  {
 
916
        //g_print("  update text '%s'\n", buf);
 
917
    gtk_entry_set_text (GTK_ENTRY (spin_button), buf);
 
918
    retval = TRUE;
 
919
        }
 
920
 
 
921
        //g_signal_handlers_unblock_by_func(spin_button, time_spin_input, NULL);
 
922
 
 
923
  g_free (buf);
 
924
 
 
925
  return retval;
 
926
}
 
927
 
 
928
 
 
929
static guint32 hbtk_monthyear_get_internal(GtkSpinButton *spin, guint type)
 
930
{
 
931
GDate date;
 
932
guint month, year;
 
933
gint val;
 
934
 
 
935
        if(!GTK_IS_SPIN_BUTTON(spin))
 
936
                return GLOBALS->today;
 
937
 
 
938
        val = gtk_spin_button_get_value_as_int(spin);
 
939
        year  = 1900 + (val / 12);
 
940
        month = (val % 12) + 1;
 
941
        
 
942
        g_date_clear(&date, 1);
 
943
        g_date_set_year(&date, year);
 
944
        g_date_set_month(&date, month);
 
945
        if(type == 0)
 
946
                g_date_set_day(&date, 1);
 
947
        else
 
948
                g_date_set_day(&date, g_date_get_days_in_month(month, year));
 
949
 
 
950
        return g_date_get_julian(&date);
 
951
}
 
952
 
 
953
 
 
954
guint32 hbtk_monthyear_getmin(GtkSpinButton *spin)
 
955
{
 
956
        return hbtk_monthyear_get_internal(spin, 0);
 
957
}
 
958
 
 
959
guint32 hbtk_monthyear_getmax(GtkSpinButton *spin)
 
960
{
 
961
        return hbtk_monthyear_get_internal(spin, 1);
 
962
}
 
963
 
 
964
 
 
965
void hbtk_monthyear_set(GtkSpinButton *spin, guint32 julian)
 
966
{
 
967
GDate date;
 
968
gdouble newval;
 
969
 
 
970
        if(!GTK_IS_SPIN_BUTTON(spin))
 
971
                return;
 
972
 
 
973
        g_date_set_julian(&date, julian);
 
974
        newval = (g_date_get_month(&date)-1) + (g_date_get_year(&date) - 1900) * 12;
 
975
        gtk_spin_button_set_value(spin, newval);
 
976
}
 
977
 
 
978
 
 
979
GtkWidget *make_monthyear(GtkWidget *label)
 
980
{
 
981
GtkWidget *spinner;
 
982
GtkAdjustment *adj;
 
983
 
 
984
        adj = (GtkAdjustment *) gtk_adjustment_new (0, 0, (2200-1900)*12, 1, 12, 0);
 
985
        //adj = (GtkAdjustment *) gtk_adjustment_new (0, 0, 14010, 30, 60, 0);
 
986
        spinner = gtk_spin_button_new (adj, 0, 0);
 
987
        //gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner), TRUE);
 
988
        //gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spinner), TRUE);
 
989
        //g_object_set(spinner, "xalign", 1.0, NULL);
 
990
 
 
991
        //gtk_entry_set_width_chars(spinner, 10);
 
992
 
 
993
        if(label)
 
994
                gtk_label_set_mnemonic_widget (GTK_LABEL(label), spinner);
 
995
 
 
996
        g_signal_connect (spinner, "output", G_CALLBACK (hbtk_monthyear_spin_output), NULL);
 
997
        g_signal_connect (spinner, "input", G_CALLBACK (hbtk_monthyear_spin_input), NULL);
 
998
 
 
999
        return spinner;
 
1000
}
 
1001
 
 
1002
 
 
1003
/*
743
1004
GtkWidget *make_year(GtkWidget *label)
744
1005
{
745
1006
GtkWidget *spinner;
755
1016
                gtk_label_set_mnemonic_widget (GTK_LABEL(label), spinner);
756
1017
 
757
1018
        return spinner;
758
 
}
 
1019
}*/
759
1020
 
760
1021
 
761
1022
GtkWidget *
767
1028
 
768
1029
        popover = gtk_popover_new (parent);
769
1030
        gtk_popover_set_position (GTK_POPOVER (popover), pos);
770
 
        gtk_container_add (GTK_CONTAINER (popover), child);
 
1031
        gtk_popover_set_child (GTK_POPOVER(popover), child);
771
1032
        gtk_widget_show (child);
772
1033
 
773
1034
        hb_widget_set_margin(child, SPACING_POPOVER);
1211
1472
/* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
1212
1473
 
1213
1474
static void
1214
 
set_sensitive (GtkCellLayout   *cell_layout,
 
1475
make_daterange_set_sensitive (GtkCellLayout   *cell_layout,
1215
1476
               GtkCellRenderer *cell,
1216
1477
               GtkTreeModel    *tree_model,
1217
1478
               GtkTreeIter     *iter,
1218
1479
               gpointer         data)
1219
1480
{
1220
 
GtkTreePath *path;
1221
 
gint *indices;
 
1481
gint id_column = GPOINTER_TO_INT(data);
1222
1482
gboolean sensitive;
1223
 
 
1224
 
        path = gtk_tree_model_get_path (tree_model, iter);
1225
 
        indices = gtk_tree_path_get_indices (path);
1226
 
        sensitive = indices[0] != FLT_RANGE_MISC_CUSTOM;  
1227
 
        gtk_tree_path_free (path);
1228
 
 
 
1483
gchar *textid;
 
1484
gint id;
 
1485
 
 
1486
        g_return_if_fail (id_column >= 0);
 
1487
        gtk_tree_model_get (tree_model, iter, id_column, &textid, -1);
 
1488
        id = atoi(textid);
 
1489
        sensitive = (id != FLT_RANGE_MISC_CUSTOM);
1229
1490
        g_object_set (cell, "sensitive", sensitive, NULL);
1230
 
}
1231
 
 
1232
 
 
1233
 
 
1234
 
GtkWidget *make_daterange(GtkWidget *label, guint dspmode)
1235
 
{
1236
 
GtkWidget *combobox = hbtk_combo_box_new(label);
 
1491
        g_free(textid);
 
1492
}
 
1493
 
 
1494
 
 
1495
static void make_daterange_fill_items(GtkComboBoxText *combo_box, HbKvData *kvdata)
 
1496
{
 
1497
HbKvData *tmp;
 
1498
guint32 i;
 
1499
 
 
1500
        for(i=0;i<HB_KV_ITEMS_MAX_LEN;i++)
 
1501
        {
 
1502
                tmp = &kvdata[i];
 
1503
                if( tmp->name == NULL )
 
1504
                        break;
 
1505
                hbtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(combo_box), tmp->key, (*tmp->name != 0) ? (gchar *)_(tmp->name) : (gchar *)"");
 
1506
        }
 
1507
}
 
1508
 
 
1509
 
 
1510
GtkWidget *make_daterange(GtkWidget *label, HbDateRangeFlags flags)
 
1511
{
 
1512
GtkWidget *combo_box;
1237
1513
GList *renderers, *list;
1238
 
HbKvData *tmp, *kvdata = CYA_FLT_RANGE;
1239
 
guint32 i;
1240
 
 
1241
 
        for(i=0;i<HB_KV_ITEMS_MAX_LEN;i++)
 
1514
 
 
1515
        combo_box = hbtk_combo_box_new(label);
 
1516
 
 
1517
        if( !(flags & DATE_RANGE_BUDGET_MODE) )
 
1518
                make_daterange_fill_items(GTK_COMBO_BOX_TEXT(combo_box), CYA_FLT_RANGE_DWF);
 
1519
 
 
1520
        make_daterange_fill_items(GTK_COMBO_BOX_TEXT(combo_box), CYA_FLT_RANGE_MQY);
 
1521
 
 
1522
        if( flags & DATE_RANGE_BUDGET_MODE )
 
1523
                make_daterange_fill_items(GTK_COMBO_BOX_TEXT(combo_box), CYA_FLT_RANGE_BUDGET);
 
1524
        else
 
1525
                make_daterange_fill_items(GTK_COMBO_BOX_TEXT(combo_box), CYA_FLT_RANGE_NORMAL);
 
1526
 
 
1527
        if( !(flags & DATE_RANGE_CUSTOM_HIDDEN) )
 
1528
                make_daterange_fill_items(GTK_COMBO_BOX_TEXT(combo_box), CYA_FLT_RANGE_CUSTOM);
 
1529
 
 
1530
        if( flags & DATE_RANGE_CUSTOM_DISABLE )
1242
1531
        {
1243
 
                tmp = &kvdata[i];
1244
 
                if( tmp->name == NULL )
1245
 
                        break;
1246
 
 
1247
 
                if( (tmp->key == FLT_RANGE_MISC_CUSTOM) )
 
1532
                renderers = gtk_cell_layout_get_cells (GTK_CELL_LAYOUT(combo_box));
 
1533
                if(g_list_length(renderers) == 1)
1248
1534
                {
1249
 
                        if( dspmode == DATE_RANGE_CUSTOM_DISABLE )
1250
 
                        {
1251
 
                                renderers = gtk_cell_layout_get_cells (GTK_CELL_LAYOUT(combobox));
1252
 
                                if(g_list_length(renderers) == 1)
1253
 
                                {
1254
 
                                        list = g_list_first(renderers);
1255
 
                                        gtk_cell_layout_set_cell_data_func (GTK_CELL_LAYOUT (combobox),
1256
 
                                                                        list->data,
1257
 
                                                                        set_sensitive,
1258
 
                                                                        NULL, NULL);
1259
 
                                }       
1260
 
                                g_list_free(renderers);
1261
 
                        }
1262
 
                        else
1263
 
                        if( dspmode == DATE_RANGE_CUSTOM_HIDE )
1264
 
                        {
1265
 
                                //if hide, we do not show it
1266
 
                                i++;
1267
 
                                continue;
1268
 
                        }
1269
 
                }
1270
 
 
1271
 
                hbtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(combobox), tmp->key, (*tmp->name != 0) ? (gchar *)_(tmp->name) : (gchar *)"");
 
1535
                gint id_column = gtk_combo_box_get_id_column (GTK_COMBO_BOX (combo_box));
 
1536
                
 
1537
                        list = g_list_first(renderers);
 
1538
                        gtk_cell_layout_set_cell_data_func (GTK_CELL_LAYOUT (combo_box),
 
1539
                                                        list->data,
 
1540
                                                        make_daterange_set_sensitive,
 
1541
                                                        GINT_TO_POINTER(id_column),
 
1542
                                                        NULL);
 
1543
                }       
 
1544
                g_list_free(renderers);
1272
1545
        }
1273
1546
 
1274
1547
        //TODO: option removed into GTK4 ??
1275
 
        gtk_combo_box_set_wrap_width (GTK_COMBO_BOX(combobox), 3);
1276
 
 
1277
 
        gtk_combo_box_set_active(GTK_COMBO_BOX(combobox), 0);
1278
 
        gtk_combo_box_set_row_separator_func (GTK_COMBO_BOX (combobox), hbtk_combo_box_is_separator, NULL, NULL);
1279
 
 
1280
 
        return combobox;
 
1548
        gtk_combo_box_set_wrap_width (GTK_COMBO_BOX(combo_box), 3);
 
1549
 
 
1550
        //gtk_combo_box_set_active(GTK_COMBO_BOX(combobox), FLT_RANGE_MISC_ALLDATE);
 
1551
        hbtk_combo_box_set_active_id(GTK_COMBO_BOX_TEXT(combo_box), FLT_RANGE_MISC_ALLDATE);
 
1552
        gtk_combo_box_set_row_separator_func (GTK_COMBO_BOX (combo_box), hbtk_combo_box_is_separator, NULL, NULL);
 
1553
 
 
1554
        return combo_box;
1281
1555
}
1282
1556
 
1283
1557