Set the current time on the date-time picker. I think we're good for now...

This commit is contained in:
Pietro Gagliardi 2016-05-04 23:18:48 -04:00
parent f0dc52d1dc
commit 0942888b4a
1 changed files with 62 additions and 17 deletions

View File

@ -1,7 +1,8 @@
// 4 september 2015
#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 dateTimePickerWidget(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), dateTimePickerWidgetType, dateTimePickerWidget))
@ -30,6 +31,11 @@ struct dateTimePickerWidget {
GtkWidget *seconds;
GtkWidget *ampm;
gulong hoursBlock;
gulong minutesBlock;
gulong secondsBlock;
gulong ampmBlock;
GdkDevice *keyboard;
GdkDevice *mouse;
};
@ -48,14 +54,26 @@ static int realSpinValue(GtkSpinButton *spinButton)
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)
{
// 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 hour = 0, minute = 0, second = 0;
if (d->hasDate)
if (d->hasDate) {
gtk_calendar_get_date(GTK_CALENDAR(d->calendar), &year, &month, &day);
month++; // GtkCalendar/GDateTime differences
}
if (d->hasTime) {
hour = realSpinValue(GTK_SPIN_BUTTON(d->hours));
if (realSpinValue(GTK_SPIN_BUTTON(d->ampm)) != 0)
@ -69,20 +87,25 @@ static GDateTime *selected(dateTimePickerWidget *d)
static void setLabel(dateTimePickerWidget *d)
{
GDateTime *dt;
const char *fmt;
char *fmt;
char *msg;
gboolean free;
dt = selected(d);
// TODO switch to D_FMT + " " + T_FMT?
if (d->hasDate && d->hasTime)
fmt = nl_langinfo(D_T_FMT);
else if (d->hasDate)
free = FALSE;
if (d->hasDate && d->hasTime) {
// don't use D_T_FMT; that's too verbose
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);
else
fmt = nl_langinfo(T_FMT);
msg = g_date_time_format(dt, fmt);
gtk_button_set_label(GTK_BUTTON(d), msg);
g_free(msg);
if (free)
g_free(fmt);
g_date_time_unref(dt);
}
@ -333,7 +356,7 @@ static void spinboxChanged(GtkSpinButton *sb, gpointer data)
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;
@ -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_wrap(GTK_SPIN_BUTTON(sb), TRUE);
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)
g_signal_connect(sb, "input", G_CALLBACK(input), NULL);
if (output != NULL)
@ -370,7 +393,11 @@ static void setTimeOnly(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);
gtk_window_set_resizable(GTK_WINDOW(d->window), FALSE);
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()?
gtk_window_set_has_resize_grip(GTK_WINDOW(d->window), FALSE);
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);
gtk_container_add(GTK_CONTAINER(d->window), d->box);
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);
d->timebox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 6);
gtk_widget_set_valign(d->timebox, GTK_ALIGN_CENTER);
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),
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),
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);
// 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, "PM");
#endif
// TODO why does pressing the button work oddly?
d->ampm = newSpinbox(d, 0, 1, ampmSpinboxInput, ampmSpinboxOutput);
d->ampm = newSpinbox(d, 0, 1, ampmSpinboxInput, ampmSpinboxOutput, &(d->ampmBlock));
gtk_spin_button_set_numeric(GTK_SPIN_BUTTON(d->ampm), FALSE);
gtk_widget_set_valign(d->ampm, GTK_ALIGN_CENTER);
gtk_container_add(GTK_CONTAINER(d->timebox), d->ampm);
@ -436,7 +464,24 @@ static void dateTimePickerWidget_init(dateTimePickerWidget *d)
d->hasTime = 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)