[gnome-calendar] window: Add a sidebar with a date chooser and an agenda



commit a3f21be8b4ee342d16bcc22c0660a35a888e2737
Author: Adrien Plazas <kekun plazas laposte net>
Date:   Fri May 6 12:58:22 2022 +0200

    window: Add a sidebar with a date chooser and an agenda
    
    This starts implementing the sidebar of the new design.

 src/gui/gcal-window.c  | 31 +++++++++++++++++++++++++++++++
 src/gui/gcal-window.ui | 43 +++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 74 insertions(+)
---
diff --git a/src/gui/gcal-window.c b/src/gui/gcal-window.c
index cd2f10de..4257e4fa 100644
--- a/src/gui/gcal-window.c
+++ b/src/gui/gcal-window.c
@@ -20,9 +20,11 @@
 #define G_LOG_DOMAIN "GcalWindow"
 
 #include "css-code.h"
+#include "gcal-agenda-view.h"
 #include "gcal-calendar-management-dialog.h"
 #include "gcal-calendar-button.h"
 #include "config.h"
+#include "gcal-date-chooser.h"
 #include "gcal-debug.h"
 #include "gcal-event-editor-dialog.h"
 #include "gcal-event-widget.h"
@@ -100,6 +102,8 @@ struct _GcalWindow
   AdwViewStack       *views_stack;
   GtkWidget          *week_view;
   GtkWidget          *month_view;
+  GtkWidget          *agenda_view;
+  GtkWidget          *date_chooser;
 
   /* header_bar widets */
   GtkWidget          *back_button;
@@ -224,6 +228,8 @@ maybe_add_subscribers_to_timeline (GcalWindow *self)
   timeline = gcal_manager_get_timeline (gcal_context_get_manager (self->context));
   gcal_timeline_add_subscriber (timeline, GCAL_TIMELINE_SUBSCRIBER (self->week_view));
   gcal_timeline_add_subscriber (timeline, GCAL_TIMELINE_SUBSCRIBER (self->month_view));
+  gcal_timeline_add_subscriber (timeline, GCAL_TIMELINE_SUBSCRIBER (self->agenda_view));
+  gcal_timeline_add_subscriber (timeline, GCAL_TIMELINE_SUBSCRIBER (self->date_chooser));
 
   self->subscribed = TRUE;
 }
@@ -244,6 +250,8 @@ update_active_date (GcalWindow *window,
 
   for (i = GCAL_WINDOW_VIEW_WEEK; i <= GCAL_WINDOW_VIEW_MONTH; i++)
     gcal_view_set_date (GCAL_VIEW (window->views[i]), new_date);
+  gcal_view_set_date (GCAL_VIEW (window->agenda_view), new_date);
+  gcal_view_set_date (GCAL_VIEW (window->date_chooser), new_date);
 
   update_today_button_sensitive (window);
 
@@ -653,6 +661,12 @@ event_preview_cb (GcalEventWidget        *event_widget,
     }
 }
 
+static void
+day_selected (GcalWindow *self)
+{
+  update_active_date (self, gcal_view_get_date (GCAL_VIEW (self->date_chooser)));
+}
+
 static void
 event_activated (GcalView        *view,
                  GcalEventWidget *event_widget,
@@ -695,6 +709,8 @@ on_event_editor_dialog_remove_event_cb (GcalEventEditorDialog *edit_dialog,
 {
   g_autoptr (AdwToast) toast = NULL;
   g_autoptr (GList) widgets = NULL;
+  g_autoptr (GList) agenda_view_widgets = NULL;
+  g_autoptr (GList) date_chooser_widgets = NULL;
   GcalView *view;
   gboolean has_deleted_event;
 
@@ -717,8 +733,12 @@ on_event_editor_dialog_remove_event_cb (GcalEventEditorDialog *edit_dialog,
   /* hide widget of the event */
   view = GCAL_VIEW (self->views[self->active_view]);
   widgets = gcal_view_get_children_by_uuid (view, modifier, gcal_event_get_uid (event));
+  agenda_view_widgets = gcal_view_get_children_by_uuid (GCAL_VIEW (self->agenda_view), modifier, 
gcal_event_get_uid (event));
+  date_chooser_widgets = gcal_view_get_children_by_uuid (GCAL_VIEW (self->date_chooser), modifier, 
gcal_event_get_uid (event));
 
   g_list_foreach (widgets, (GFunc) gtk_widget_hide, NULL);
+  g_list_foreach (agenda_view_widgets, (GFunc) gtk_widget_hide, NULL);
+  g_list_foreach (date_chooser_widgets, (GFunc) gtk_widget_hide, NULL);
 
   GCAL_EXIT;
 }
@@ -729,6 +749,8 @@ schedule_open_edit_dialog_by_uuid (OpenEditDialogData *edit_dialog_data)
   GcalWindow *window;
   GList *widgets;
 
+  /* FIXME Do that in the date chooser too? */
+
   window = edit_dialog_data->window;
   widgets = gcal_view_get_children_by_uuid (GCAL_VIEW (window->month_view),
                                             GCAL_RECURRENCE_MOD_THIS_ONLY,
@@ -793,6 +815,8 @@ gcal_window_dispose (GObject *object)
   timeline = gcal_manager_get_timeline (gcal_context_get_manager (self->context));
   gcal_timeline_remove_subscriber (timeline, GCAL_TIMELINE_SUBSCRIBER (self->week_view));
   gcal_timeline_remove_subscriber (timeline, GCAL_TIMELINE_SUBSCRIBER (self->month_view));
+  gcal_timeline_remove_subscriber (timeline, GCAL_TIMELINE_SUBSCRIBER (self->agenda_view));
+  gcal_timeline_remove_subscriber (timeline, GCAL_TIMELINE_SUBSCRIBER (self->date_chooser));
 
   g_clear_pointer (&self->quick_add_popover, gtk_widget_unparent);
 
@@ -837,6 +861,8 @@ gcal_window_constructed (GObject *object)
   g_object_bind_property (self, "context", self->calendar_management_dialog, "context", G_BINDING_DEFAULT | 
G_BINDING_SYNC_CREATE);
   g_object_bind_property (self, "context", self->week_view, "context", G_BINDING_DEFAULT | 
G_BINDING_SYNC_CREATE);
   g_object_bind_property (self, "context", self->month_view, "context", G_BINDING_DEFAULT | 
G_BINDING_SYNC_CREATE);
+  g_object_bind_property (self, "context", self->agenda_view, "context", G_BINDING_DEFAULT | 
G_BINDING_SYNC_CREATE);
+  g_object_bind_property (self, "context", self->date_chooser, "context", G_BINDING_DEFAULT | 
G_BINDING_SYNC_CREATE);
   g_object_bind_property (self, "context", self->event_editor, "context", G_BINDING_DEFAULT | 
G_BINDING_SYNC_CREATE);
   g_object_bind_property (self, "context", self->quick_add_popover, "context", G_BINDING_DEFAULT | 
G_BINDING_SYNC_CREATE);
   g_object_bind_property (self, "context", self->search_button, "context", G_BINDING_DEFAULT | 
G_BINDING_SYNC_CREATE);
@@ -964,8 +990,10 @@ gcal_window_class_init (GcalWindowClass *klass)
   GObjectClass *object_class;
   GtkWidgetClass *widget_class;
 
+  g_type_ensure (GCAL_TYPE_AGENDA_VIEW);
   g_type_ensure (GCAL_TYPE_CALENDAR_MANAGEMENT_DIALOG);
   g_type_ensure (GCAL_TYPE_CALENDAR_BUTTON);
+  g_type_ensure (GCAL_TYPE_DATE_CHOOSER);
   g_type_ensure (GCAL_TYPE_EVENT_EDITOR_DIALOG);
   g_type_ensure (GCAL_TYPE_MANAGER);
   g_type_ensure (GCAL_TYPE_MONTH_VIEW);
@@ -1016,7 +1044,9 @@ gcal_window_class_init (GcalWindowClass *klass)
 
   /* widgets */
   gtk_widget_class_bind_template_child (widget_class, GcalWindow, back_button);
+  gtk_widget_class_bind_template_child (widget_class, GcalWindow, agenda_view);
   gtk_widget_class_bind_template_child (widget_class, GcalWindow, calendars_button);
+  gtk_widget_class_bind_template_child (widget_class, GcalWindow, date_chooser);
   gtk_widget_class_bind_template_child (widget_class, GcalWindow, event_editor);
   gtk_widget_class_bind_template_child (widget_class, GcalWindow, forward_button);
   gtk_widget_class_bind_template_child (widget_class, GcalWindow, header_bar);
@@ -1040,6 +1070,7 @@ gcal_window_class_init (GcalWindowClass *klass)
   gtk_widget_class_bind_template_callback (widget_class, create_event_detailed_cb);
   gtk_widget_class_bind_template_callback (widget_class, show_new_event_widget);
   gtk_widget_class_bind_template_callback (widget_class, close_new_event_widget);
+  gtk_widget_class_bind_template_callback (widget_class, day_selected);
   gtk_widget_class_bind_template_callback (widget_class, event_activated);
 
   /* Edit dialog related */
diff --git a/src/gui/gcal-window.ui b/src/gui/gcal-window.ui
index a747d33c..317720e6 100644
--- a/src/gui/gcal-window.ui
+++ b/src/gui/gcal-window.ui
@@ -97,6 +97,47 @@
     <!-- Main Overlay -->
     <child>
       <object class="AdwToastOverlay" id="overlay">
+        <child>
+          <object class="GtkBox" id="box">
+            <child>
+              <object class="GtkBox">
+                <property name="hexpand">False</property>
+                <property name="orientation">vertical</property>
+                <child>
+                  <object class="AdwHeaderBar">
+                    <property name="show-end-title-buttons">False</property>
+                  </object>
+                </child>
+                <child>
+                  <object class="GcalDateChooser" id="date_chooser">
+                    <property name="split-month-year">False</property>
+                    <property name="vexpand">False</property>
+                    <property name="active-date" bind-source="GcalWindow" bind-property="active-date" 
bind-flags="bidirectional"/>
+                    <signal name="day-selected" handler="day_selected" object="GcalWindow" swapped="yes"/>
+                    <style>
+                      <class name="view"/>
+                    </style>
+                  </object>
+                </child>
+                <child>
+                  <object class="GtkSeparator"/>
+                </child>
+                <child>
+                  <object class="GcalAgendaView" id="agenda_view">
+                    <property name="vexpand">True</property>
+                    <property name="active-date" bind-source="GcalWindow" bind-property="active-date" 
bind-flags="bidirectional"/>
+                    <signal name="create-event" handler="show_new_event_widget" object="GcalWindow" 
swapped="no"/>
+                    <signal name="event-activated" handler="event_activated" object="GcalWindow" 
swapped="no"/>
+                    <style>
+                      <class name="view"/>
+                    </style>
+                  </object>
+                </child>
+              </object>
+            </child>
+            <child>
+              <object class="GtkSeparator"/>
+            </child>
     <child>
       <object class="GtkBox">
         <property name="orientation">vertical</property>
@@ -201,6 +242,8 @@
                 </child>
               </object>
             </child>
+              </object>
+            </child>
           </object>
         </child>
       </object>


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]