date-chooser: Add the show-selected-week property

If enabled, the selected week will be made visible.
This commit is contained in:
Adrien Plazas
2022-06-16 08:16:04 -03:00
committed by Georges Basile Stavracas Neto
parent 7b5a934250
commit 9911386706
3 changed files with 127 additions and 1 deletions
+121 -1
View File
@@ -44,6 +44,7 @@ struct _GcalDateChooser
GtkWidget *cols[COLS];
GtkWidget *rows[ROWS];
GtkWidget *days[ROWS][COLS];
GtkWidget *week[ROWS];
GDateTime *date;
@@ -53,6 +54,7 @@ struct _GcalDateChooser
gboolean show_heading;
gboolean show_day_names;
gboolean show_week_numbers;
gboolean show_selected_week;
};
G_DEFINE_TYPE (GcalDateChooser, gcal_date_chooser, ADW_TYPE_BIN)
@@ -70,6 +72,7 @@ enum
PROP_SHOW_HEADING,
PROP_SHOW_DAY_NAMES,
PROP_SHOW_WEEK_NUMBERS,
PROP_SHOW_SELECTED_WEEK,
NUM_PROPERTIES
};
@@ -276,12 +279,20 @@ calendar_update_selected_day_display (GcalDateChooser *self)
for (row = 0; row < ROWS; row++)
{
gboolean row_selected = FALSE;
for (col = 0; col < COLS; col++)
{
gboolean day_selected;
d = GCAL_DATE_CHOOSER_DAY (self->days[row][col]);
date = gcal_date_chooser_day_get_date (d);
gcal_date_chooser_day_set_selected (d, gcal_date_time_compare_date (date, self->date) == 0);
day_selected = gcal_date_time_compare_date (date, self->date) == 0;
gcal_date_chooser_day_set_selected (d, day_selected);
row_selected |= day_selected;
}
gtk_widget_set_visible (self->week[row], row_selected && self->show_selected_week);
}
}
@@ -341,6 +352,10 @@ calendar_set_property (GObject *obj,
gcal_date_chooser_set_show_week_numbers (self, g_value_get_boolean (value));
break;
case PROP_SHOW_SELECTED_WEEK:
gcal_date_chooser_set_show_selected_week (self, g_value_get_boolean (value));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, property_id, pspec);
break;
@@ -373,6 +388,10 @@ calendar_get_property (GObject *obj,
g_value_set_boolean (value, self->show_week_numbers);
break;
case PROP_SHOW_SELECTED_WEEK:
g_value_set_boolean (value, self->show_selected_week);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, property_id, pspec);
break;
@@ -484,6 +503,17 @@ gcal_date_chooser_class_init (GcalDateChooserClass *class)
TRUE,
G_PARAM_READWRITE);
/**
* GcalDateChooser:show-selected-week:
*
* Whether the selected week is highlighted or not.
*/
properties[PROP_SHOW_SELECTED_WEEK] = g_param_spec_boolean ("show-selected-week",
"Show Selected Week",
"If TRUE, week numbers are displayed",
TRUE,
G_PARAM_READWRITE);
g_object_class_install_properties (object_class, NUM_PROPERTIES, properties);
signals[DAY_SELECTED] = g_signal_new ("day-selected",
@@ -504,6 +534,30 @@ gcal_date_chooser_class_init (GcalDateChooserClass *class)
}
static gboolean
show_week_number_to_column_cb (GBinding *binding,
const GValue *from_value,
GValue *to_value,
gpointer user_data)
{
g_value_set_int (to_value, g_value_get_boolean (from_value) ? -1 : 0);
return TRUE;
}
static gboolean
show_week_number_to_column_span_cb (GBinding *binding,
const GValue *from_value,
GValue *to_value,
gpointer user_data)
{
g_value_set_int (to_value, g_value_get_boolean (from_value) ? COLS + 1 : COLS);
return TRUE;
}
static void
gcal_date_chooser_init (GcalDateChooser *self)
{
@@ -511,10 +565,12 @@ gcal_date_chooser_init (GcalDateChooser *self)
GtkWidget *label;
gint row, col;
gint year, month;
GtkLayoutManager *layout_manager;
self->show_heading = TRUE;
self->show_day_names = TRUE;
self->show_week_numbers = TRUE;
self->show_selected_week = TRUE;
self->date = g_date_time_new_now_local ();
g_date_time_get_ymd (self->date, &self->this_year, NULL, NULL);
@@ -538,8 +594,12 @@ gcal_date_chooser_init (GcalDateChooser *self)
gtk_grid_attach (GTK_GRID (self->grid), self->cols[col], col, -1, 1, 1);
}
layout_manager = gtk_widget_get_layout_manager (self->grid);
for (row = 0; row < ROWS; row++)
{
GtkLayoutChild *layout_child;
self->rows[row] = gtk_label_new ("");
g_object_bind_property (self,
@@ -550,6 +610,33 @@ gcal_date_chooser_init (GcalDateChooser *self)
gtk_widget_add_css_class (self->rows[row], "weeknum");
gtk_grid_attach (GTK_GRID (self->grid), self->rows[row], -1, row, 1, 1);
self->week[row] = adw_bin_new ();
gtk_widget_hide (self->week[row]);
gtk_widget_add_css_class (self->week[row], "current-week");
gtk_grid_attach (GTK_GRID (self->grid), self->week[row], -1, row, 8, 1);
layout_child = gtk_layout_manager_get_layout_child (layout_manager, self->week[row]);
g_object_bind_property_full (self,
"show-week-numbers",
layout_child,
"column",
G_BINDING_SYNC_CREATE,
show_week_number_to_column_cb,
NULL,
NULL,
NULL);
g_object_bind_property_full (self,
"show-week-numbers",
layout_child,
"column-span",
G_BINDING_SYNC_CREATE,
show_week_number_to_column_span_cb,
NULL,
NULL,
NULL);
}
/* We are using a stack here to keep the week number column from shrinking
@@ -670,6 +757,39 @@ gcal_date_chooser_get_show_week_numbers (GcalDateChooser *self)
return self->show_week_numbers;
}
/**
* gcal_date_chooser_set_show_selected_week:
* @self: a #GcalDateChooser
* @setting: whether the selected week is highlighted or not.
*
* Sets the selected week is highlighted or not.
*/
void
gcal_date_chooser_set_show_selected_week (GcalDateChooser *self,
gboolean setting)
{
if (self->show_selected_week == setting)
return;
self->show_selected_week = setting;
calendar_update_selected_day_display (self);
g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_SHOW_SELECTED_WEEK]);
}
/**
* gcal_date_chooser_get_show_selected_week:
* @self: a #GcalDateChooser
*
* Returns: whether the selected week is highlighted or not.
*/
gboolean
gcal_date_chooser_get_show_selected_week (GcalDateChooser *self)
{
return self->show_selected_week;
}
void
gcal_date_chooser_set_date (GcalDateChooser *self,
GDateTime *date)
+5
View File
@@ -48,6 +48,11 @@ gboolean gcal_date_chooser_get_show_week_numbers (GcalDateChoose
void gcal_date_chooser_set_show_week_numbers (GcalDateChooser *self,
gboolean setting);
gboolean gcal_date_chooser_get_show_selected_week (GcalDateChooser *self);
void gcal_date_chooser_set_show_selected_week (GcalDateChooser *self,
gboolean setting);
G_END_DECLS
#endif /* __GCAL_DATE_CHOOSER_H__ */
@@ -22,6 +22,7 @@
<property name="margin-end">12</property>
<child>
<object class="GcalDateChooser" id="date_chooser">
<property name="show_selected_week">False</property>
<property name="show_week_numbers">True</property>
<signal name="day-selected" handler="calendar_day_selected" object="GcalDateSelector" swapped="yes"/>
</object>