event-widget: lazily relayout main grid

This commit is contained in:
Georges Basile Stavracas Neto
2017-10-29 19:05:34 -02:00
parent ab8364bf9f
commit e04b7f0fd3
2 changed files with 95 additions and 18 deletions
+42
View File
@@ -41,4 +41,46 @@
</object>
</child>
</template>
<!-- HACK!!!
We need this ghost GtkGrid because we can't change the position of the
labels in size-allocate. This grid will simulate the main grid with the
labels vertically positioned, so we don't need to chage the main grid's
label position in size-allocate -->
<object class="GtkGrid" id="ghost_grid">
<property name="visible">True</property>
<property name="column_spacing">4</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>
<child>
<object class="GtkLabel">
<property name="visible">True</property>
<property name="label" bind-source="hour_label" bind-property="label" bind-flags="default" />
<property name="can_focus">False</property>
<property name="xalign">0.0</property>
<attributes>
<attribute name="weight" value="semibold"/>
</attributes>
</object>
<packing>
<property name="left_attach">0</property>
<property name="top_attach">0</property>
</packing>
</child>
<child>
<object class="GtkLabel">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" bind-source="summary_label" bind-property="label" bind-flags="default" />
<property name="hexpand">True</property>
<property name="xalign">0</property>
<property name="ellipsize">end</property>
</object>
<packing>
<property name="top_attach">1</property>
</packing>
</child>
</object>
</interface>
+53 -18
View File
@@ -38,6 +38,7 @@ struct _GcalEventWidget
GDateTime *dt_end;
/* widgets */
GtkWidget *ghost_grid;
GtkWidget *hour_label;
GtkWidget *main_grid;
GtkWidget *summary_label;
@@ -53,6 +54,7 @@ struct _GcalEventWidget
GtkOrientation orientation;
guint toggle_description_id;
gboolean button_pressed;
};
@@ -90,6 +92,40 @@ G_DEFINE_TYPE_WITH_CODE (GcalEventWidget, gcal_event_widget, GTK_TYPE_BIN,
* Auxiliary methods
*/
static gboolean
toggle_description_position_cb (GcalEventWidget *self)
{
gint current_top;
gtk_container_child_get (GTK_CONTAINER (self->main_grid),
self->summary_label,
"top-attach", &current_top,
NULL);
gtk_label_set_line_wrap (GTK_LABEL (self->summary_label),
!gtk_label_get_line_wrap (GTK_LABEL (self->summary_label)));
gtk_container_child_set (GTK_CONTAINER (self->main_grid),
self->summary_label,
"left-attach", current_top == 1 ? 1 : 0,
"top-attach", current_top == 1 ? 0 : 1,
"width", current_top == 1 ? 1 : 2,
NULL);
self->toggle_description_id = 0;
return G_SOURCE_REMOVE;
}
static void
queue_toggle_description_position (GcalEventWidget *self)
{
if (self->toggle_description_id > 0)
g_source_remove (self->toggle_description_id);
self->toggle_description_id = g_idle_add ((GSourceFunc) toggle_description_position_cb, self);
}
static void
set_drag_source_enabled (GcalEventWidget *self,
gboolean enabled)
@@ -526,32 +562,23 @@ gcal_event_widget_size_allocate (GtkWidget *widget,
if (self->orientation == GTK_ORIENTATION_VERTICAL && !gcal_event_get_all_day (self->event))
{
gint minimum_grid_height;
gint current_top;
gtk_label_set_line_wrap (GTK_LABEL (self->summary_label), TRUE);
gtk_widget_get_preferred_height (self->ghost_grid, &minimum_grid_height, NULL);
gtk_container_child_set (GTK_CONTAINER (self->main_grid),
gtk_container_child_get (GTK_CONTAINER (self->main_grid),
self->summary_label,
"left-attach", 0,
"top-attach", 1,
"width", 2,
"top-attach", &current_top,
NULL);
gtk_widget_get_preferred_height (self->main_grid, &minimum_grid_height, NULL);
/*
* There is no vertical space to put the summary label below the hour label.
* Thus, reset the label's original attributes.
* Since we can't change the position of the events inside size-allocate,
* queue it for future iterations of the mainloop.
*/
if (allocation->height < minimum_grid_height)
if ((allocation->height < minimum_grid_height && current_top == 1) ||
(allocation->height >= minimum_grid_height && current_top == 0))
{
gtk_container_child_set (GTK_CONTAINER (self->main_grid),
self->summary_label,
"left-attach", 1,
"top-attach", 0,
"width", 1,
NULL);
gtk_label_set_line_wrap (GTK_LABEL (self->summary_label), FALSE);
queue_toggle_description_position (self);
}
}
@@ -777,6 +804,13 @@ gcal_event_widget_finalize (GObject *object)
g_clear_pointer (&self->css_class, g_free);
g_clear_object (&self->event);
/* withdraw mainloop sources */
if (self->toggle_description_id > 0)
{
g_source_remove (self->toggle_description_id);
self->toggle_description_id = 0;
}
G_OBJECT_CLASS (gcal_event_widget_parent_class)->finalize (object);
}
@@ -866,6 +900,7 @@ gcal_event_widget_class_init (GcalEventWidgetClass *klass)
gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/calendar/event-widget.ui");
gtk_widget_class_bind_template_child (widget_class, GcalEventWidget, ghost_grid);
gtk_widget_class_bind_template_child (widget_class, GcalEventWidget, hour_label);
gtk_widget_class_bind_template_child (widget_class, GcalEventWidget, main_grid);
gtk_widget_class_bind_template_child (widget_class, GcalEventWidget, summary_label);