event-widget: Use a vertical AdwSqueezer
This replaces the GtkStack and some custom code by a AdwSqueezer and way less custom code to achieve the same result, making the code simpler.
This commit is contained in:
committed by
Georges Basile Stavracas Neto
parent
19b520fa2d
commit
6b649b8ef7
+12
-112
@@ -53,7 +53,7 @@ struct _GcalEventWidget
|
||||
GtkWidget *color_box;
|
||||
GtkWidget *horizontal_box;
|
||||
GtkWidget *hour_label;
|
||||
GtkWidget *stack;
|
||||
GtkWidget *squeezer;
|
||||
GtkWidget *summary_label;
|
||||
GtkWidget *vertical_box;
|
||||
GtkEventController *drag_source;
|
||||
@@ -67,10 +67,6 @@ struct _GcalEventWidget
|
||||
|
||||
GtkOrientation orientation;
|
||||
|
||||
guint vertical_label_source_id;
|
||||
gboolean vertical_value_to_set;
|
||||
gboolean vertical_labels;
|
||||
|
||||
gint old_width;
|
||||
gint old_height;
|
||||
|
||||
@@ -111,59 +107,11 @@ G_DEFINE_TYPE_WITH_CODE (GcalEventWidget, gcal_event_widget, GTK_TYPE_WIDGET,
|
||||
*/
|
||||
|
||||
static gboolean
|
||||
can_hold_vertical_labels_with_height (GcalEventWidget *self,
|
||||
gint height)
|
||||
get_vertical_enabled (gpointer user_data,
|
||||
GcalEvent *event,
|
||||
GtkOrientation orientation)
|
||||
{
|
||||
gint total_height;
|
||||
|
||||
gtk_widget_measure (self->vertical_box,
|
||||
GTK_ORIENTATION_VERTICAL,
|
||||
-1,
|
||||
&total_height,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL);
|
||||
|
||||
return height >= total_height;
|
||||
}
|
||||
|
||||
static void
|
||||
set_vertical_labels (GcalEventWidget *self,
|
||||
gboolean vertical)
|
||||
{
|
||||
if (self->vertical_labels == vertical)
|
||||
return;
|
||||
|
||||
gtk_stack_set_visible_child (GTK_STACK (self->stack), vertical ? self->vertical_box : self->horizontal_box);
|
||||
self->vertical_labels = vertical;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
set_vertical_labels_in_idle_cb (gpointer data)
|
||||
{
|
||||
GcalEventWidget *self = (GcalEventWidget*) data;
|
||||
|
||||
set_vertical_labels (self, self->vertical_value_to_set);
|
||||
|
||||
self->vertical_label_source_id = 0;
|
||||
return G_SOURCE_REMOVE;
|
||||
}
|
||||
|
||||
static void
|
||||
queue_set_vertical_labels (GcalEventWidget *self,
|
||||
gboolean vertical)
|
||||
{
|
||||
if (self->vertical_label_source_id > 0)
|
||||
{
|
||||
g_source_remove (self->vertical_label_source_id);
|
||||
self->vertical_label_source_id = 0;
|
||||
}
|
||||
|
||||
if (self->vertical_labels == vertical)
|
||||
return;
|
||||
|
||||
self->vertical_value_to_set = vertical;
|
||||
self->vertical_label_source_id = g_idle_add (set_vertical_labels_in_idle_cb, self);
|
||||
return orientation == GTK_ORIENTATION_VERTICAL && !gcal_event_get_all_day (event);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -225,8 +173,8 @@ gcal_event_widget_update_style (GcalEventWidget *self)
|
||||
|
||||
if (self->orientation == GTK_ORIENTATION_HORIZONTAL)
|
||||
{
|
||||
gtk_widget_set_margin_start (self->stack, 0);
|
||||
gtk_widget_set_margin_end (self->stack, 2);
|
||||
gtk_widget_set_margin_start (self->squeezer, 0);
|
||||
gtk_widget_set_margin_end (self->squeezer, 2);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -585,53 +533,6 @@ on_event_popover_edit_cb (GtkWidget *event_popover,
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* GtkWidget overrides
|
||||
*/
|
||||
|
||||
static void
|
||||
gcal_event_widget_size_allocate (GtkWidget *widget,
|
||||
gint width,
|
||||
gint height,
|
||||
gint baseline)
|
||||
{
|
||||
GcalEventWidget *self = GCAL_EVENT_WIDGET (widget);
|
||||
|
||||
gtk_widget_allocate (GTK_WIDGET (self->stack), width, height, baseline, NULL);
|
||||
|
||||
if (self->old_width != width || self->old_height != height)
|
||||
{
|
||||
if (self->orientation == GTK_ORIENTATION_HORIZONTAL || gcal_event_get_all_day (self->event))
|
||||
return;
|
||||
|
||||
queue_set_vertical_labels (self, can_hold_vertical_labels_with_height (self, height));
|
||||
|
||||
self->old_width = width;
|
||||
self->old_height = height;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
gcal_event_widget_measure (GtkWidget *widget,
|
||||
GtkOrientation orientation,
|
||||
gint for_size,
|
||||
gint *minimum,
|
||||
gint *natural,
|
||||
gint *minimum_baseline,
|
||||
gint *natural_baseline)
|
||||
{
|
||||
GcalEventWidget *self = GCAL_EVENT_WIDGET (widget);
|
||||
|
||||
gtk_widget_measure (GTK_WIDGET (self->stack),
|
||||
orientation,
|
||||
for_size,
|
||||
minimum,
|
||||
natural,
|
||||
minimum_baseline,
|
||||
natural_baseline);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* GObject overrides
|
||||
*/
|
||||
@@ -721,8 +622,7 @@ gcal_event_widget_dispose (GObject *object)
|
||||
{
|
||||
GcalEventWidget *self = GCAL_EVENT_WIDGET (object);
|
||||
|
||||
g_clear_handle_id (&self->vertical_label_source_id, g_source_remove);
|
||||
g_clear_pointer (&self->stack, gtk_widget_unparent);
|
||||
g_clear_pointer (&self->squeezer, gtk_widget_unparent);
|
||||
|
||||
G_OBJECT_CLASS (gcal_event_widget_parent_class)->dispose (object);
|
||||
}
|
||||
@@ -757,9 +657,6 @@ gcal_event_widget_class_init (GcalEventWidgetClass *klass)
|
||||
object_class->dispose = gcal_event_widget_dispose;
|
||||
object_class->finalize = gcal_event_widget_finalize;
|
||||
|
||||
widget_class->measure = gcal_event_widget_measure;
|
||||
widget_class->size_allocate = gcal_event_widget_size_allocate;
|
||||
|
||||
/**
|
||||
* GcalEventWidget::context:
|
||||
*
|
||||
@@ -839,16 +736,19 @@ gcal_event_widget_class_init (GcalEventWidgetClass *klass)
|
||||
gtk_widget_class_bind_template_child (widget_class, GcalEventWidget, drag_source);
|
||||
gtk_widget_class_bind_template_child (widget_class, GcalEventWidget, horizontal_box);
|
||||
gtk_widget_class_bind_template_child (widget_class, GcalEventWidget, hour_label);
|
||||
gtk_widget_class_bind_template_child (widget_class, GcalEventWidget, stack);
|
||||
gtk_widget_class_bind_template_child (widget_class, GcalEventWidget, squeezer);
|
||||
gtk_widget_class_bind_template_child (widget_class, GcalEventWidget, summary_label);
|
||||
gtk_widget_class_bind_template_child (widget_class, GcalEventWidget, vertical_box);
|
||||
|
||||
gtk_widget_class_bind_template_callback (widget_class, get_vertical_enabled);
|
||||
gtk_widget_class_bind_template_callback (widget_class, on_click_gesture_pressed_cb);
|
||||
gtk_widget_class_bind_template_callback (widget_class, on_click_gesture_release_cb);
|
||||
gtk_widget_class_bind_template_callback (widget_class, on_drag_source_begin_cb);
|
||||
gtk_widget_class_bind_template_callback (widget_class, on_drag_source_prepare_cb);
|
||||
|
||||
gtk_widget_class_set_css_name (widget_class, "event");
|
||||
|
||||
gtk_widget_class_set_layout_manager_type (widget_class, GTK_TYPE_BIN_LAYOUT);
|
||||
}
|
||||
|
||||
static void
|
||||
|
||||
@@ -21,14 +21,45 @@
|
||||
|
||||
<!-- Main Stack -->
|
||||
<child>
|
||||
<object class="GtkStack" id="stack">
|
||||
<object class="AdwSqueezer" id="squeezer">
|
||||
<property name="hexpand">False</property>
|
||||
<property name="homogeneous">False</property>
|
||||
<property name="margin-top">1</property>
|
||||
<property name="margin-bottom">1</property>
|
||||
<property name="margin-start">6</property>
|
||||
<property name="margin-end">4</property>
|
||||
<property name="hhomogeneous">False</property>
|
||||
<property name="vhomogeneous">False</property>
|
||||
<property name="orientation">vertical</property>
|
||||
|
||||
<!-- Vertical page -->
|
||||
<child>
|
||||
<object class="GtkBox" id="vertical_box">
|
||||
<binding name="visible">
|
||||
<closure type="gboolean" function="get_vertical_enabled">
|
||||
<lookup name="event">GcalEventWidget</lookup>
|
||||
<lookup name="orientation">GcalEventWidget</lookup>
|
||||
</closure>
|
||||
</binding>
|
||||
<property name="orientation">vertical</property>
|
||||
<child>
|
||||
<object class="GtkLabel">
|
||||
<property name="label" bind-source="hour_label" bind-property="label" bind-flags="default" />
|
||||
<property name="xalign">0.0</property>
|
||||
<style>
|
||||
<class name="dim-label" />
|
||||
</style>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkLabel">
|
||||
<property name="label" bind-source="summary_label" bind-property="label" bind-flags="default" />
|
||||
<property name="wrap">True</property>
|
||||
<property name="hexpand">True</property>
|
||||
<property name="xalign">0.0</property>
|
||||
<property name="ellipsize">end</property>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
|
||||
<!-- Horizontal page -->
|
||||
<child>
|
||||
@@ -62,31 +93,6 @@
|
||||
</object>
|
||||
</child>
|
||||
|
||||
<!-- Vertical page -->
|
||||
<child>
|
||||
<object class="GtkBox" id="vertical_box">
|
||||
<property name="orientation">vertical</property>
|
||||
<child>
|
||||
<object class="GtkLabel">
|
||||
<property name="label" bind-source="hour_label" bind-property="label" bind-flags="default" />
|
||||
<property name="xalign">0.0</property>
|
||||
<style>
|
||||
<class name="dim-label" />
|
||||
</style>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkLabel">
|
||||
<property name="label" bind-source="summary_label" bind-property="label" bind-flags="default" />
|
||||
<property name="wrap">True</property>
|
||||
<property name="hexpand">True</property>
|
||||
<property name="xalign">0.0</property>
|
||||
<property name="ellipsize">end</property>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
|
||||
</object>
|
||||
</child>
|
||||
</template>
|
||||
|
||||
Reference in New Issue
Block a user