event-editor/date-selector: Port to GTK4
Needed some popover management, but otherwise uneventful.
This commit is contained in:
@@ -59,7 +59,7 @@ update_text (GcalDateSelector *self)
|
|||||||
/* rebuild the date label */
|
/* rebuild the date label */
|
||||||
label = g_date_time_format (date, "%x");
|
label = g_date_time_format (date, "%x");
|
||||||
|
|
||||||
gtk_entry_set_text (GTK_ENTRY (self), label);
|
gtk_editable_set_text (GTK_EDITABLE (self), label);
|
||||||
g_free (label);
|
g_free (label);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -78,7 +78,7 @@ parse_date (GcalDateSelector *self)
|
|||||||
GDate parsed_date;
|
GDate parsed_date;
|
||||||
|
|
||||||
g_date_clear (&parsed_date, 1);
|
g_date_clear (&parsed_date, 1);
|
||||||
g_date_set_parse (&parsed_date, gtk_entry_get_text (GTK_ENTRY (self)));
|
g_date_set_parse (&parsed_date, gtk_editable_get_text (GTK_EDITABLE (self)));
|
||||||
|
|
||||||
if (!g_date_valid (&parsed_date))
|
if (!g_date_valid (&parsed_date))
|
||||||
{
|
{
|
||||||
@@ -105,20 +105,64 @@ icon_pressed_cb (GcalDateSelector *self,
|
|||||||
|
|
||||||
gtk_entry_get_icon_area (GTK_ENTRY (self), position, &icon_bounds);
|
gtk_entry_get_icon_area (GTK_ENTRY (self), position, &icon_bounds);
|
||||||
|
|
||||||
gtk_popover_set_relative_to (GTK_POPOVER (self->date_selector_popover), GTK_WIDGET (self));
|
|
||||||
gtk_popover_set_pointing_to (GTK_POPOVER (self->date_selector_popover), &icon_bounds);
|
gtk_popover_set_pointing_to (GTK_POPOVER (self->date_selector_popover), &icon_bounds);
|
||||||
|
|
||||||
gtk_widget_show (self->date_selector_popover);
|
gtk_popover_popup (GTK_POPOVER (self->date_selector_popover));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gcal_date_selector_finalize (GObject *object)
|
on_contains_focus_changed_cb (GtkEventControllerFocus *focus_controller,
|
||||||
|
GParamSpec *pspec,
|
||||||
|
GcalDateSelector *self)
|
||||||
|
{
|
||||||
|
parse_date (self);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* GtkWidget overrides
|
||||||
|
*/
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
gcal_date_selector_focus (GtkWidget *widget,
|
||||||
|
GtkDirectionType direction)
|
||||||
|
{
|
||||||
|
GcalDateSelector *self= GCAL_DATE_SELECTOR (widget);
|
||||||
|
|
||||||
|
if (gtk_widget_get_visible (self->date_selector_popover))
|
||||||
|
return gtk_widget_child_focus (self->date_selector_popover, direction);
|
||||||
|
else
|
||||||
|
return GTK_WIDGET_CLASS (gcal_date_selector_parent_class)->focus (widget, direction);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
gcal_date_selector_size_allocate (GtkWidget *widget,
|
||||||
|
gint width,
|
||||||
|
gint height,
|
||||||
|
gint baseline)
|
||||||
|
{
|
||||||
|
GcalDateSelector *self= GCAL_DATE_SELECTOR (widget);
|
||||||
|
|
||||||
|
GTK_WIDGET_CLASS (gcal_date_selector_parent_class)->size_allocate (widget,
|
||||||
|
width,
|
||||||
|
height,
|
||||||
|
baseline);
|
||||||
|
|
||||||
|
gtk_popover_present (GTK_POPOVER (self->date_selector_popover));
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* GObject overrides
|
||||||
|
*/
|
||||||
|
|
||||||
|
static void
|
||||||
|
gcal_date_selector_dispose (GObject *object)
|
||||||
{
|
{
|
||||||
GcalDateSelector *self = GCAL_DATE_SELECTOR (object);
|
GcalDateSelector *self = GCAL_DATE_SELECTOR (object);
|
||||||
|
|
||||||
|
g_clear_pointer (&self->date_selector_popover, gtk_widget_unparent);
|
||||||
g_clear_object (&self->settings);
|
g_clear_object (&self->settings);
|
||||||
|
|
||||||
G_OBJECT_CLASS (gcal_date_selector_parent_class)->finalize (object);
|
G_OBJECT_CLASS (gcal_date_selector_parent_class)->dispose (object);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -159,24 +203,6 @@ gcal_date_selector_set_property (GObject *object,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
|
||||||
gcal_date_selector_focus_in_event (GtkWidget *widget,
|
|
||||||
GdkEventFocus *event)
|
|
||||||
{
|
|
||||||
parse_date (GCAL_DATE_SELECTOR (widget));
|
|
||||||
|
|
||||||
return GTK_WIDGET_CLASS (gcal_date_selector_parent_class)->focus_in_event (widget, event);
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
gcal_date_selector_focus_out_event (GtkWidget *widget,
|
|
||||||
GdkEventFocus *event)
|
|
||||||
{
|
|
||||||
parse_date (GCAL_DATE_SELECTOR (widget));
|
|
||||||
|
|
||||||
return GTK_WIDGET_CLASS (gcal_date_selector_parent_class)->focus_out_event (widget, event);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gcal_date_selector_activate (GtkEntry *entry)
|
gcal_date_selector_activate (GtkEntry *entry)
|
||||||
{
|
{
|
||||||
@@ -192,12 +218,12 @@ gcal_date_selector_class_init (GcalDateSelectorClass *klass)
|
|||||||
|
|
||||||
g_type_ensure (GCAL_TYPE_DATE_CHOOSER);
|
g_type_ensure (GCAL_TYPE_DATE_CHOOSER);
|
||||||
|
|
||||||
object_class->finalize = gcal_date_selector_finalize;
|
object_class->dispose = gcal_date_selector_dispose;
|
||||||
object_class->get_property = gcal_date_selector_get_property;
|
object_class->get_property = gcal_date_selector_get_property;
|
||||||
object_class->set_property = gcal_date_selector_set_property;
|
object_class->set_property = gcal_date_selector_set_property;
|
||||||
|
|
||||||
widget_class->focus_in_event = gcal_date_selector_focus_in_event;
|
widget_class->focus = gcal_date_selector_focus;
|
||||||
widget_class->focus_out_event = gcal_date_selector_focus_out_event;
|
widget_class->size_allocate = gcal_date_selector_size_allocate;
|
||||||
|
|
||||||
entry_class->activate = gcal_date_selector_activate;
|
entry_class->activate = gcal_date_selector_activate;
|
||||||
|
|
||||||
@@ -221,13 +247,12 @@ gcal_date_selector_class_init (GcalDateSelectorClass *klass)
|
|||||||
|
|
||||||
gtk_widget_class_bind_template_callback (widget_class, calendar_day_selected);
|
gtk_widget_class_bind_template_callback (widget_class, calendar_day_selected);
|
||||||
gtk_widget_class_bind_template_callback (widget_class, icon_pressed_cb);
|
gtk_widget_class_bind_template_callback (widget_class, icon_pressed_cb);
|
||||||
|
gtk_widget_class_bind_template_callback (widget_class, on_contains_focus_changed_cb);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gcal_date_selector_init (GcalDateSelector *self)
|
gcal_date_selector_init (GcalDateSelector *self)
|
||||||
{
|
{
|
||||||
gtk_widget_set_has_window (GTK_WIDGET (self), FALSE);
|
|
||||||
|
|
||||||
gtk_widget_init_template (GTK_WIDGET (self));
|
gtk_widget_init_template (GTK_WIDGET (self));
|
||||||
|
|
||||||
self->settings = g_settings_new ("org.gnome.desktop.calendar");
|
self->settings = g_settings_new ("org.gnome.desktop.calendar");
|
||||||
|
|||||||
@@ -1,24 +1,33 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<interface>
|
<interface>
|
||||||
<requires lib="gtk+" version="3.12"/>
|
|
||||||
<template class="GcalDateSelector" parent="GtkEntry">
|
<template class="GcalDateSelector" parent="GtkEntry">
|
||||||
<property name="visible">True</property>
|
|
||||||
<property name="width-chars">11</property>
|
<property name="width-chars">11</property>
|
||||||
<property name="max-width-chars">11</property>
|
<property name="max-width-chars">11</property>
|
||||||
<property name="secondary-icon-name">pan-down-symbolic</property>
|
<property name="secondary-icon-name">pan-down-symbolic</property>
|
||||||
<property name="input-hints">no-emoji</property>
|
<property name="input-hints">no-emoji</property>
|
||||||
<signal name="icon-press" handler="icon_pressed_cb" object="GcalDateSelector" swapped="no"/>
|
<signal name="icon-press" handler="icon_pressed_cb" object="GcalDateSelector" swapped="no"/>
|
||||||
</template>
|
|
||||||
<object class="GtkPopover" id="date_selector_popover">
|
|
||||||
<property name="position">bottom</property>
|
|
||||||
<property name="border_width">12</property>
|
|
||||||
<child>
|
<child>
|
||||||
<object class="GcalDateChooser" id="date_chooser">
|
<object class="GtkEventControllerFocus">
|
||||||
<property name="visible">True</property>
|
<signal name="notify::contains-focus" handler="on_contains_focus_changed_cb" object="GcalDateSelector" swapped="no" />
|
||||||
<property name="can_focus">True</property>
|
|
||||||
<property name="show_week_numbers">True</property>
|
|
||||||
<signal name="day-selected" handler="calendar_day_selected" object="GcalDateSelector" swapped="yes"/>
|
|
||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
</object>
|
|
||||||
|
<child>
|
||||||
|
<object class="GtkPopover" id="date_selector_popover">
|
||||||
|
<property name="position">bottom</property>
|
||||||
|
<property name="margin-top">12</property>
|
||||||
|
<property name="margin-bottom">12</property>
|
||||||
|
<property name="margin-start">12</property>
|
||||||
|
<property name="margin-end">12</property>
|
||||||
|
<child>
|
||||||
|
<object class="GcalDateChooser" id="date_chooser">
|
||||||
|
<property name="show_week_numbers">True</property>
|
||||||
|
<signal name="day-selected" handler="calendar_day_selected" object="GcalDateSelector" swapped="yes"/>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
|
||||||
|
</template>
|
||||||
</interface>
|
</interface>
|
||||||
|
|||||||
Reference in New Issue
Block a user