/
dtp.c
140 lines (122 loc) · 3.32 KB
/
dtp.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
// 9 january 2015
#include "dtp.h"
/* notes:
https://git.gnome.org/browse/gtk+/tree/gtk/gtkcombobox.c?h=gtk-3-4
*/
#define GDTP(x) ((goDateTimePicker *) x)
#define PRIV(x) (GDTP(x)->priv)
#define GDTPC(x) ((goDateTimePickerClass *) x)
struct goDateTimePickerPrivate {
gint year;
gint month;
gint day;
};
G_DEFINE_TYPE_WITH_CODE(goDateTimePicker, goDateTimePicker, GTK_TYPE_BOX,
;)
// TODO figure out how to share these between C and Go
enum {
gtkMargin = 12,
gtkXPadding = 12,
gtkYPadding = 6,
};
static void goDateTimePicker_init(goDateTimePicker *dtp)
{
dtp->priv = G_TYPE_INSTANCE_GET_PRIVATE(dtp, goDateTimePicker_get_type(), goDateTimePickerPrivate);
}
static void goDateTimePicker_dispose(GObject *obj)
{
goDateTimePickerPrivate *d = PRIV(obj);
// TODO really with g_clear_object()?
G_OBJECT_CLASS(goDateTimePicker_parent_class)->dispose(obj);
}
static void goDateTimePicker_finalize(GObject *obj)
{
G_OBJECT_CLASS(goDateTimePicker_parent_class)->finalize(obj);
}
enum {
pYear = 1,
pMonth,
pDay,
nParams,
};
static GParamSpec *gdtpParams[] = {
NULL, // always null
NULL, // year
NULL, // month
NULL, // day
};
static void goDateTimePicker_set_property(GObject *obj, guint prop, const GValue *value, GParamSpec *spec)
{
goDateTimePickerPrivate *d = PRIV(obj);
switch (prop) {
case pYear:
d->year = g_value_get_int(value);
break;
case pMonth:
d->month = g_value_get_int(value);
break;
case pDay:
d->day = g_value_get_int(value);
// see note on GtkCalendar comaptibility below
if (d->day == 0)
; // TODO
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, prop, spec);
return;
}
// TODO refresh everything here
}
static void goDateTimePicker_get_property(GObject *obj, guint prop, GValue *value, GParamSpec *spec)
{
goDateTimePickerPrivate *d = PRIV(obj);
switch (prop) {
case pYear:
g_value_set_int(value, d->year);
break;
case pMonth:
g_value_set_int(value, d->month);
break;
case pDay:
g_value_set_int(value, d->day);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, prop, spec);
return;
}
}
static void goDateTimePicker_class_init(goDateTimePickerClass *class)
{
g_type_class_add_private(class, sizeof (goDateTimePickerPrivate));
G_OBJECT_CLASS(class)->dispose = goDateTimePicker_dispose;
G_OBJECT_CLASS(class)->finalize = goDateTimePicker_finalize;
G_OBJECT_CLASS(class)->set_property = goDateTimePicker_set_property;
G_OBJECT_CLASS(class)->get_property = goDateTimePicker_get_property;
// types and values are to be compatible with the 3.4 GtkCalendar parameters
gdtpParams[pYear] = g_param_spec_int("year",
"current year",
"Current year",
0,
G_MAXINT >> 9,
0,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
gdtpParams[pMonth] = g_param_spec_uint("month",
"current month",
"Current month",
0,
11,
0,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
// because of the requirement to be compatible with GtkCalendar, we have to follow its rules about dates
// values are 1..31 with 0 meaning no date selected
// we will not allow no date to be selected, so we will set the default to 1 instead of 0
// TODO is this an issue for binding?
gdtpParams[pDay] = g_param_spec_uint("day",
"current day",
"Current day",
0,
31,
1,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
g_object_class_install_properties(G_OBJECT_CLASS(class), nParams, gdtpParams);
}