Set the current time on the date-time picker. I think we're good for now...
This commit is contained in:
parent
f0dc52d1dc
commit
0942888b4a
|
@ -1,7 +1,8 @@
|
||||||
// 4 september 2015
|
// 4 september 2015
|
||||||
#include "dtp.h"
|
#include "dtp.h"
|
||||||
|
|
||||||
// TODO imitate gnome-calendar's day/month/year entries
|
// TODO imitate gnome-calendar's day/month/year entries?
|
||||||
|
// TODO 24-hour time
|
||||||
|
|
||||||
#define dateTimePickerWidgetType (dateTimePickerWidget_get_type())
|
#define dateTimePickerWidgetType (dateTimePickerWidget_get_type())
|
||||||
#define dateTimePickerWidget(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), dateTimePickerWidgetType, dateTimePickerWidget))
|
#define dateTimePickerWidget(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), dateTimePickerWidgetType, dateTimePickerWidget))
|
||||||
|
@ -30,6 +31,11 @@ struct dateTimePickerWidget {
|
||||||
GtkWidget *seconds;
|
GtkWidget *seconds;
|
||||||
GtkWidget *ampm;
|
GtkWidget *ampm;
|
||||||
|
|
||||||
|
gulong hoursBlock;
|
||||||
|
gulong minutesBlock;
|
||||||
|
gulong secondsBlock;
|
||||||
|
gulong ampmBlock;
|
||||||
|
|
||||||
GdkDevice *keyboard;
|
GdkDevice *keyboard;
|
||||||
GdkDevice *mouse;
|
GdkDevice *mouse;
|
||||||
};
|
};
|
||||||
|
@ -48,14 +54,26 @@ static int realSpinValue(GtkSpinButton *spinButton)
|
||||||
return (int) gtk_adjustment_get_value(adj);
|
return (int) gtk_adjustment_get_value(adj);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void setRealSpinValue(GtkSpinButton *spinButton, int value, gulong block)
|
||||||
|
{
|
||||||
|
GtkAdjustment *adj;
|
||||||
|
|
||||||
|
g_signal_handler_block(spinButton, block);
|
||||||
|
adj = gtk_spin_button_get_adjustment(spinButton);
|
||||||
|
gtk_adjustment_set_value(adj, value);
|
||||||
|
g_signal_handler_unblock(spinButton, block);
|
||||||
|
}
|
||||||
|
|
||||||
static GDateTime *selected(dateTimePickerWidget *d)
|
static GDateTime *selected(dateTimePickerWidget *d)
|
||||||
{
|
{
|
||||||
// choose a day for which all times are likely to be valid for the default date in case we're only dealing with time
|
// choose a day for which all times are likely to be valid for the default date in case we're only dealing with time
|
||||||
guint year = 1970, month = 1, day = 1;
|
guint year = 1970, month = 1, day = 1;
|
||||||
guint hour = 0, minute = 0, second = 0;
|
guint hour = 0, minute = 0, second = 0;
|
||||||
|
|
||||||
if (d->hasDate)
|
if (d->hasDate) {
|
||||||
gtk_calendar_get_date(GTK_CALENDAR(d->calendar), &year, &month, &day);
|
gtk_calendar_get_date(GTK_CALENDAR(d->calendar), &year, &month, &day);
|
||||||
|
month++; // GtkCalendar/GDateTime differences
|
||||||
|
}
|
||||||
if (d->hasTime) {
|
if (d->hasTime) {
|
||||||
hour = realSpinValue(GTK_SPIN_BUTTON(d->hours));
|
hour = realSpinValue(GTK_SPIN_BUTTON(d->hours));
|
||||||
if (realSpinValue(GTK_SPIN_BUTTON(d->ampm)) != 0)
|
if (realSpinValue(GTK_SPIN_BUTTON(d->ampm)) != 0)
|
||||||
|
@ -69,20 +87,25 @@ static GDateTime *selected(dateTimePickerWidget *d)
|
||||||
static void setLabel(dateTimePickerWidget *d)
|
static void setLabel(dateTimePickerWidget *d)
|
||||||
{
|
{
|
||||||
GDateTime *dt;
|
GDateTime *dt;
|
||||||
const char *fmt;
|
char *fmt;
|
||||||
char *msg;
|
char *msg;
|
||||||
|
gboolean free;
|
||||||
|
|
||||||
dt = selected(d);
|
dt = selected(d);
|
||||||
// TODO switch to D_FMT + " " + T_FMT?
|
free = FALSE;
|
||||||
if (d->hasDate && d->hasTime)
|
if (d->hasDate && d->hasTime) {
|
||||||
fmt = nl_langinfo(D_T_FMT);
|
// don't use D_T_FMT; that's too verbose
|
||||||
else if (d->hasDate)
|
fmt = g_strdup_printf("%s %s", nl_langinfo(D_FMT), nl_langinfo(T_FMT));
|
||||||
|
free = TRUE;
|
||||||
|
} else if (d->hasDate)
|
||||||
fmt = nl_langinfo(D_FMT);
|
fmt = nl_langinfo(D_FMT);
|
||||||
else
|
else
|
||||||
fmt = nl_langinfo(T_FMT);
|
fmt = nl_langinfo(T_FMT);
|
||||||
msg = g_date_time_format(dt, fmt);
|
msg = g_date_time_format(dt, fmt);
|
||||||
gtk_button_set_label(GTK_BUTTON(d), msg);
|
gtk_button_set_label(GTK_BUTTON(d), msg);
|
||||||
g_free(msg);
|
g_free(msg);
|
||||||
|
if (free)
|
||||||
|
g_free(fmt);
|
||||||
g_date_time_unref(dt);
|
g_date_time_unref(dt);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -333,7 +356,7 @@ static void spinboxChanged(GtkSpinButton *sb, gpointer data)
|
||||||
dateTimeChanged(d);
|
dateTimeChanged(d);
|
||||||
}
|
}
|
||||||
|
|
||||||
static GtkWidget *newSpinbox(dateTimePickerWidget *d, int min, int max, gint (*input)(GtkSpinButton *, gpointer, gpointer), gboolean (*output)(GtkSpinButton *, gpointer))
|
static GtkWidget *newSpinbox(dateTimePickerWidget *d, int min, int max, gint (*input)(GtkSpinButton *, gpointer, gpointer), gboolean (*output)(GtkSpinButton *, gpointer), gulong *block)
|
||||||
{
|
{
|
||||||
GtkWidget *sb;
|
GtkWidget *sb;
|
||||||
|
|
||||||
|
@ -341,7 +364,7 @@ static GtkWidget *newSpinbox(dateTimePickerWidget *d, int min, int max, gint (*i
|
||||||
gtk_spin_button_set_digits(GTK_SPIN_BUTTON(sb), 0);
|
gtk_spin_button_set_digits(GTK_SPIN_BUTTON(sb), 0);
|
||||||
gtk_spin_button_set_wrap(GTK_SPIN_BUTTON(sb), TRUE);
|
gtk_spin_button_set_wrap(GTK_SPIN_BUTTON(sb), TRUE);
|
||||||
gtk_orientable_set_orientation(GTK_ORIENTABLE(sb), GTK_ORIENTATION_VERTICAL);
|
gtk_orientable_set_orientation(GTK_ORIENTABLE(sb), GTK_ORIENTATION_VERTICAL);
|
||||||
g_signal_connect(sb, "value-changed", G_CALLBACK(spinboxChanged), d);
|
*block = g_signal_connect(sb, "value-changed", G_CALLBACK(spinboxChanged), d);
|
||||||
if (input != NULL)
|
if (input != NULL)
|
||||||
g_signal_connect(sb, "input", G_CALLBACK(input), NULL);
|
g_signal_connect(sb, "input", G_CALLBACK(input), NULL);
|
||||||
if (output != NULL)
|
if (output != NULL)
|
||||||
|
@ -370,7 +393,11 @@ static void setTimeOnly(dateTimePickerWidget *d)
|
||||||
|
|
||||||
static void dateTimePickerWidget_init(dateTimePickerWidget *d)
|
static void dateTimePickerWidget_init(dateTimePickerWidget *d)
|
||||||
{
|
{
|
||||||
// TODO give a more pronounced shadow
|
GDateTime *dt;
|
||||||
|
gint year, month, day;
|
||||||
|
gint hour;
|
||||||
|
gulong calendarBlock;
|
||||||
|
|
||||||
d->window = gtk_window_new(GTK_WINDOW_POPUP);
|
d->window = gtk_window_new(GTK_WINDOW_POPUP);
|
||||||
gtk_window_set_resizable(GTK_WINDOW(d->window), FALSE);
|
gtk_window_set_resizable(GTK_WINDOW(d->window), FALSE);
|
||||||
gtk_window_set_attached_to(GTK_WINDOW(d->window), GTK_WIDGET(d));
|
gtk_window_set_attached_to(GTK_WINDOW(d->window), GTK_WIDGET(d));
|
||||||
|
@ -384,31 +411,33 @@ static void dateTimePickerWidget_init(dateTimePickerWidget *d)
|
||||||
// TODO focus_on_map()?
|
// TODO focus_on_map()?
|
||||||
gtk_window_set_has_resize_grip(GTK_WINDOW(d->window), FALSE);
|
gtk_window_set_has_resize_grip(GTK_WINDOW(d->window), FALSE);
|
||||||
gtk_container_set_border_width(GTK_CONTAINER(d->window), 12);
|
gtk_container_set_border_width(GTK_CONTAINER(d->window), 12);
|
||||||
|
// and make it stand out a bit
|
||||||
|
gtk_style_context_add_class(gtk_widget_get_style_context(d->window), "frame");
|
||||||
|
|
||||||
d->box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 6);
|
d->box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 6);
|
||||||
gtk_container_add(GTK_CONTAINER(d->window), d->box);
|
gtk_container_add(GTK_CONTAINER(d->window), d->box);
|
||||||
|
|
||||||
d->calendar = gtk_calendar_new();
|
d->calendar = gtk_calendar_new();
|
||||||
g_signal_connect(d->calendar, "day-selected", G_CALLBACK(dateChanged), d);
|
calendarBlock = g_signal_connect(d->calendar, "day-selected", G_CALLBACK(dateChanged), d);
|
||||||
gtk_container_add(GTK_CONTAINER(d->box), d->calendar);
|
gtk_container_add(GTK_CONTAINER(d->box), d->calendar);
|
||||||
|
|
||||||
d->timebox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 6);
|
d->timebox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 6);
|
||||||
gtk_widget_set_valign(d->timebox, GTK_ALIGN_CENTER);
|
gtk_widget_set_valign(d->timebox, GTK_ALIGN_CENTER);
|
||||||
gtk_container_add(GTK_CONTAINER(d->box), d->timebox);
|
gtk_container_add(GTK_CONTAINER(d->box), d->timebox);
|
||||||
|
|
||||||
d->hours = newSpinbox(d, 0, 11, hoursSpinboxInput, hoursSpinboxOutput);
|
d->hours = newSpinbox(d, 0, 11, hoursSpinboxInput, hoursSpinboxOutput, &(d->hoursBlock));
|
||||||
gtk_container_add(GTK_CONTAINER(d->timebox), d->hours);
|
gtk_container_add(GTK_CONTAINER(d->timebox), d->hours);
|
||||||
|
|
||||||
gtk_container_add(GTK_CONTAINER(d->timebox),
|
gtk_container_add(GTK_CONTAINER(d->timebox),
|
||||||
gtk_label_new(":"));
|
gtk_label_new(":"));
|
||||||
|
|
||||||
d->minutes = newSpinbox(d, 0, 59, NULL, zeroPadSpinbox);
|
d->minutes = newSpinbox(d, 0, 59, NULL, zeroPadSpinbox, &(d->minutesBlock));
|
||||||
gtk_container_add(GTK_CONTAINER(d->timebox), d->minutes);
|
gtk_container_add(GTK_CONTAINER(d->timebox), d->minutes);
|
||||||
|
|
||||||
gtk_container_add(GTK_CONTAINER(d->timebox),
|
gtk_container_add(GTK_CONTAINER(d->timebox),
|
||||||
gtk_label_new(":"));
|
gtk_label_new(":"));
|
||||||
|
|
||||||
d->seconds = newSpinbox(d, 0, 59, NULL, zeroPadSpinbox);
|
d->seconds = newSpinbox(d, 0, 59, NULL, zeroPadSpinbox, &(d->secondsBlock));
|
||||||
gtk_container_add(GTK_CONTAINER(d->timebox), d->seconds);
|
gtk_container_add(GTK_CONTAINER(d->timebox), d->seconds);
|
||||||
|
|
||||||
// TODO this should be the case, but that interferes with grabs
|
// TODO this should be the case, but that interferes with grabs
|
||||||
|
@ -418,8 +447,7 @@ static void dateTimePickerWidget_init(dateTimePickerWidget *d)
|
||||||
gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(d->ampm), NULL, "AM");
|
gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(d->ampm), NULL, "AM");
|
||||||
gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(d->ampm), NULL, "PM");
|
gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(d->ampm), NULL, "PM");
|
||||||
#endif
|
#endif
|
||||||
// TODO why does pressing the button work oddly?
|
d->ampm = newSpinbox(d, 0, 1, ampmSpinboxInput, ampmSpinboxOutput, &(d->ampmBlock));
|
||||||
d->ampm = newSpinbox(d, 0, 1, ampmSpinboxInput, ampmSpinboxOutput);
|
|
||||||
gtk_spin_button_set_numeric(GTK_SPIN_BUTTON(d->ampm), FALSE);
|
gtk_spin_button_set_numeric(GTK_SPIN_BUTTON(d->ampm), FALSE);
|
||||||
gtk_widget_set_valign(d->ampm, GTK_ALIGN_CENTER);
|
gtk_widget_set_valign(d->ampm, GTK_ALIGN_CENTER);
|
||||||
gtk_container_add(GTK_CONTAINER(d->timebox), d->ampm);
|
gtk_container_add(GTK_CONTAINER(d->timebox), d->ampm);
|
||||||
|
@ -436,7 +464,24 @@ static void dateTimePickerWidget_init(dateTimePickerWidget *d)
|
||||||
d->hasTime = TRUE;
|
d->hasTime = TRUE;
|
||||||
d->hasDate = TRUE;
|
d->hasDate = TRUE;
|
||||||
|
|
||||||
// TODO set current time to now
|
// set the current date/time
|
||||||
|
// notice how we block signals from firing
|
||||||
|
dt = g_date_time_new_now_local();
|
||||||
|
g_date_time_get_ymd(dt, &year, &month, &day);
|
||||||
|
month--; // GDateTime/GtkCalendar differences
|
||||||
|
g_signal_handler_block(d->calendar, calendarBlock);
|
||||||
|
gtk_calendar_select_month(GTK_CALENDAR(d->calendar), month, year);
|
||||||
|
gtk_calendar_select_day(GTK_CALENDAR(d->calendar), day);
|
||||||
|
g_signal_handler_unblock(d->calendar, calendarBlock);
|
||||||
|
hour = g_date_time_get_hour(dt);
|
||||||
|
if (hour >= 12) {
|
||||||
|
hour -= 12;
|
||||||
|
setRealSpinValue(GTK_SPIN_BUTTON(d->ampm), 1, d->ampmBlock);
|
||||||
|
}
|
||||||
|
setRealSpinValue(GTK_SPIN_BUTTON(d->hours), hour, d->hoursBlock);
|
||||||
|
setRealSpinValue(GTK_SPIN_BUTTON(d->minutes), g_date_time_get_minute(dt), d->minutesBlock);
|
||||||
|
setRealSpinValue(GTK_SPIN_BUTTON(d->seconds), g_date_time_get_seconds(dt), d->secondsBlock);
|
||||||
|
g_date_time_unref(dt);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void dateTimePickerWidget_dispose(GObject *obj)
|
static void dateTimePickerWidget_dispose(GObject *obj)
|
||||||
|
|
Loading…
Reference in New Issue