event-editor/event-editor-section: Turn it into an abstract class

Currently, GcalEventEditorSection is an interface that doesn't
really do much apart from requiring a property and providing
virtual methods.

This proposed approach turns it into an abstract class, derived
from AdwPreferencesGroup, which gives access to virtual methods
as well as public methods. It comes with the same benefits of
an interface, while sharing a lot of code that were duplicated
in the previous commits.

As a stopgap measure, it overrides several GtkWidget virtual
methods to smoothly transition without causing the commits
to break. These overrides will get removed in a later commit.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-calendar/-/merge_requests/711>
This commit is contained in:
Hari Rana
2026-06-26 08:23:08 -04:00
parent da9b28cf93
commit 66e7d9b6d7
2 changed files with 300 additions and 67 deletions
@@ -20,41 +20,37 @@
#pragma once
#include "gcal-event.h"
#include <adwaita.h>
#include "gcal-event.h"
G_BEGIN_DECLS
#define GCAL_TYPE_EVENT_EDITOR_SECTION (gcal_event_editor_section_get_type ())
#define GCAL_TYPE_EVENT_EDITOR_SECTION (gcal_event_editor_section_get_type())
G_DECLARE_INTERFACE (GcalEventEditorSection, gcal_event_editor_section, GCAL, EVENT_EDITOR_SECTION, AdwPreferencesGroup)
G_DECLARE_DERIVABLE_TYPE (GcalEventEditorSection, gcal_event_editor_section, GCAL, EVENT_EDITOR_SECTION, AdwPreferencesGroup)
typedef enum
struct _GcalEventEditorSectionClass
{
GCAL_EVENT_EDITOR_FLAG_NONE = 0,
GCAL_EVENT_EDITOR_FLAG_NEW_EVENT = 1 << 0,
} GcalEventEditorFlags;
AdwPreferencesGroupClass parent_class;
struct _GcalEventEditorSectionInterface
{
GTypeInterface parent;
void (*set_event) (GcalEventEditorSection *self,
GcalEvent *event,
GcalEventEditorFlags flags);
void (*apply) (GcalEventEditorSection *self);
gboolean (*changed) (GcalEventEditorSection *self);
/**
* GcalEventEditorSectionClass::event_set_cb:
* @self: a #GcalEventEditorSection
* @event: (nullable) (transfer none): a #GcalEvent
*
* Invoked when a new event has been set.
*
* Subclasses must implement this virtual method and update its children
* to reflect the new event.
*/
void (* event_set_cb) (GcalEventEditorSection *self,
GcalEvent *event);
};
void gcal_event_editor_section_set_event (GcalEventEditorSection *self,
GcalEvent *event,
GcalEventEditorFlags flags);
void gcal_event_editor_section_apply (GcalEventEditorSection *self);
gboolean gcal_event_editor_section_changed (GcalEventEditorSection *self);
GcalEvent *gcal_event_editor_section_get_event (GcalEventEditorSection *self);
GtkWidget *gcal_event_editor_section_get_dialog (GcalEventEditorSection *self);
void gcal_event_editor_section_set_dialog (GcalEventEditorSection *self,
GtkWidget *dialog);
G_END_DECLS