search-view: turn into a final class

This commit is contained in:
Georges Basile Stavracas Neto
2016-01-19 20:55:17 -02:00
parent f9101b9bc8
commit 65cfea9609
2 changed files with 58 additions and 109 deletions
+57 -87
View File
@@ -32,8 +32,10 @@ typedef struct
gchar *uuid; gchar *uuid;
} RowEventData; } RowEventData;
typedef struct struct _GcalSearchView
{ {
GtkPopover parent;
GtkWidget *listbox; GtkWidget *listbox;
GtkWidget *stack; GtkWidget *stack;
@@ -59,7 +61,7 @@ typedef struct
/* flags */ /* flags */
gboolean format_24h; gboolean format_24h;
gboolean subscribed; gboolean subscribed;
} GcalSearchViewPrivate; };
enum enum
{ {
@@ -141,7 +143,6 @@ static void gcal_search_view_thaw (ECalDataModelSu
G_DEFINE_TYPE_WITH_CODE (GcalSearchView, G_DEFINE_TYPE_WITH_CODE (GcalSearchView,
gcal_search_view, gcal_search_view,
GTK_TYPE_POPOVER, GTK_TYPE_POPOVER,
G_ADD_PRIVATE (GcalSearchView)
G_IMPLEMENT_INTERFACE (E_TYPE_CAL_DATA_MODEL_SUBSCRIBER, G_IMPLEMENT_INTERFACE (E_TYPE_CAL_DATA_MODEL_SUBSCRIBER,
gcal_data_model_subscriber_interface_init)); gcal_data_model_subscriber_interface_init));
@@ -220,11 +221,11 @@ sort_by_event (GtkListBoxRow *row1,
GtkListBoxRow *row2, GtkListBoxRow *row2,
gpointer user_data) gpointer user_data)
{ {
GcalSearchViewPrivate *priv; GcalSearchView *view;
RowEventData *rd1, *rd2; RowEventData *rd1, *rd2;
GcalEventData *ev1, *ev2; GcalEventData *ev1, *ev2;
priv = gcal_search_view_get_instance_private (GCAL_SEARCH_VIEW (user_data)); view = GCAL_SEARCH_VIEW (user_data);
/* retrieve event data */ /* retrieve event data */
rd1 = g_object_get_data (G_OBJECT (row1), "event-data"); rd1 = g_object_get_data (G_OBJECT (row1), "event-data");
@@ -236,7 +237,7 @@ sort_by_event (GtkListBoxRow *row1,
if (ev1 == NULL || ev2 == NULL) if (ev1 == NULL || ev2 == NULL)
return 0; return 0;
return compare_events (ev1, ev2, &(priv->current_utc_date)); return compare_events (ev1, ev2, &(view->current_utc_date));
} }
static gint static gint
@@ -273,15 +274,12 @@ compare_events (GcalEventData *ev1,
static gboolean static gboolean
show_no_results_page (GcalSearchView *view) show_no_results_page (GcalSearchView *view)
{ {
GcalSearchViewPrivate *priv; view->no_results_timeout_id = 0;
priv = gcal_search_view_get_instance_private (view); if (view->query)
priv->no_results_timeout_id = 0; gtk_stack_set_visible_child_name (GTK_STACK (view->stack), view->num_results != 0 ? "results" : "no_results");
if (priv->query)
gtk_stack_set_visible_child_name (GTK_STACK (priv->stack), priv->num_results != 0 ? "results" : "no_results");
else else
gtk_stack_set_visible_child_name (GTK_STACK (priv->stack), "results"); gtk_stack_set_visible_child_name (GTK_STACK (view->stack), "results");
return G_SOURCE_REMOVE; return G_SOURCE_REMOVE;
} }
@@ -324,8 +322,6 @@ static GtkWidget*
make_row_for_event_data (GcalSearchView *view, make_row_for_event_data (GcalSearchView *view,
GcalEventData *data) GcalEventData *data)
{ {
GcalSearchViewPrivate *priv;
g_autoptr(GTimeZone) tz; g_autoptr(GTimeZone) tz;
g_autoptr (GDateTime) datetime; g_autoptr (GDateTime) datetime;
g_autoptr (GDateTime) local_datetime; g_autoptr (GDateTime) local_datetime;
@@ -345,8 +341,6 @@ make_row_for_event_data (GcalSearchView *view,
GtkWidget *name_label; GtkWidget *name_label;
GtkWidget *image; GtkWidget *image;
priv = gcal_search_view_get_instance_private (view);
/* get event color */ /* get event color */
get_color_name_from_source (data->source, &color); get_color_name_from_source (data->source, &color);
pixbuf = gcal_get_pixbuf_from_color (&color, 16); pixbuf = gcal_get_pixbuf_from_color (&color, 16);
@@ -398,7 +392,7 @@ make_row_for_event_data (GcalSearchView *view,
/* show 'all day' instead of 00:00 */ /* show 'all day' instead of 00:00 */
if (comp_dt.value->is_date == 0) if (comp_dt.value->is_date == 0)
{ {
text = g_date_time_format (local_datetime, priv->format_24h ? "%R" : "%r"); text = g_date_time_format (local_datetime, view->format_24h ? "%R" : "%r");
time_label = gtk_label_new (text); time_label = gtk_label_new (text);
g_free (text); g_free (text);
} }
@@ -426,7 +420,7 @@ make_row_for_event_data (GcalSearchView *view,
} }
/* lock icon */ /* lock icon */
if (!gcal_manager_is_client_writable (priv->manager, data->source)) if (!gcal_manager_is_client_writable (view->manager, data->source))
{ {
GtkWidget *lock_icon; GtkWidget *lock_icon;
@@ -462,13 +456,10 @@ make_row_for_event_data (GcalSearchView *view,
static void static void
update_view (GcalSearchView *view) update_view (GcalSearchView *view)
{ {
GcalSearchViewPrivate *priv; if (view->no_results_timeout_id != 0)
priv = gcal_search_view_get_instance_private (view); g_source_remove (view->no_results_timeout_id);
if (priv->no_results_timeout_id != 0) view->no_results_timeout_id = g_timeout_add (NO_RESULT_TIMEOUT, (GSourceFunc) show_no_results_page, view);
g_source_remove (priv->no_results_timeout_id);
priv->no_results_timeout_id = g_timeout_add (NO_RESULT_TIMEOUT, (GSourceFunc) show_no_results_page, view);
} }
static void static void
@@ -492,7 +483,7 @@ gcal_search_view_class_init (GcalSearchViewClass *klass)
* *
*/ */
signals[EVENT_ACTIVATED] = g_signal_new ("event-activated", GCAL_TYPE_SEARCH_VIEW, G_SIGNAL_RUN_LAST, signals[EVENT_ACTIVATED] = g_signal_new ("event-activated", GCAL_TYPE_SEARCH_VIEW, G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (GcalSearchViewClass, event_activated), 0,
NULL, NULL, NULL, NULL, NULL, NULL,
G_TYPE_NONE, 1, ICAL_TIME_TYPE); G_TYPE_NONE, 1, ICAL_TIME_TYPE);
@@ -513,8 +504,8 @@ gcal_search_view_class_init (GcalSearchViewClass *klass)
/* bind things for/from the template class */ /* bind things for/from the template class */
gtk_widget_class_set_template_from_resource (GTK_WIDGET_CLASS (klass), "/org/gnome/calendar/search-view.ui"); gtk_widget_class_set_template_from_resource (GTK_WIDGET_CLASS (klass), "/org/gnome/calendar/search-view.ui");
gtk_widget_class_bind_template_child_private (GTK_WIDGET_CLASS (klass), GcalSearchView, stack); gtk_widget_class_bind_template_child (GTK_WIDGET_CLASS (klass), GcalSearchView, stack);
gtk_widget_class_bind_template_child_private (GTK_WIDGET_CLASS (klass), GcalSearchView, listbox); gtk_widget_class_bind_template_child (GTK_WIDGET_CLASS (klass), GcalSearchView, listbox);
gtk_widget_class_bind_template_callback (GTK_WIDGET_CLASS (klass), open_event); gtk_widget_class_bind_template_callback (GTK_WIDGET_CLASS (klass), open_event);
} }
@@ -538,17 +529,17 @@ gcal_data_model_subscriber_interface_init (ECalDataModelSubscriberInterface *ifa
static void static void
gcal_search_view_constructed (GObject *object) gcal_search_view_constructed (GObject *object)
{ {
GcalSearchViewPrivate *priv; GcalSearchView *view;
GtkWidget *placeholder_label; GtkWidget *placeholder_label;
priv = gcal_search_view_get_instance_private (GCAL_SEARCH_VIEW (object)); view = GCAL_SEARCH_VIEW (object);
/* make the listbox sorted */ /* make the listbox sorted */
gtk_list_box_set_sort_func (GTK_LIST_BOX (priv->listbox), (GtkListBoxSortFunc) sort_by_event, object, NULL); gtk_list_box_set_sort_func (GTK_LIST_BOX (view->listbox), (GtkListBoxSortFunc) sort_by_event, object, NULL);
gtk_list_box_set_header_func (GTK_LIST_BOX (priv->listbox), display_header_func, NULL, NULL); gtk_list_box_set_header_func (GTK_LIST_BOX (view->listbox), display_header_func, NULL, NULL);
// (gchar)uuid -> (RowEventData)event Hash table // (gchar)uuid -> (RowEventData)event Hash table
priv->uuid_to_event = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, (GDestroyNotify) free_row_data); view->uuid_to_event = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, (GDestroyNotify) free_row_data);
/* don't fill the list with all events on startup */ /* don't fill the list with all events on startup */
gcal_search_view_search (GCAL_SEARCH_VIEW (object), NULL, NULL); gcal_search_view_search (GCAL_SEARCH_VIEW (object), NULL, NULL);
@@ -563,7 +554,7 @@ gcal_search_view_constructed (GObject *object)
NULL); NULL);
gtk_style_context_add_class (gtk_widget_get_style_context (placeholder_label), "dim-label"); gtk_style_context_add_class (gtk_widget_get_style_context (placeholder_label), "dim-label");
gtk_list_box_set_placeholder (GTK_LIST_BOX (priv->listbox), placeholder_label); gtk_list_box_set_placeholder (GTK_LIST_BOX (view->listbox), placeholder_label);
} }
static void static void
@@ -572,18 +563,14 @@ gcal_search_view_set_property (GObject *object,
const GValue *value, const GValue *value,
GParamSpec *pspec) GParamSpec *pspec)
{ {
GcalSearchViewPrivate *priv; GcalSearchView *self = GCAL_SEARCH_VIEW (object);
priv = gcal_search_view_get_instance_private (GCAL_SEARCH_VIEW (object));
switch (property_id) switch (property_id)
{ {
case PROP_DATE: case PROP_DATE:
{ {
if (priv->date != NULL) g_clear_pointer (&self->date, g_free);
g_free (priv->date); self->date = g_value_dup_boxed (value);
priv->date = g_value_dup_boxed (value);
break; break;
} }
default: default:
@@ -598,14 +585,12 @@ gcal_search_view_get_property (GObject *object,
GValue *value, GValue *value,
GParamSpec *pspec) GParamSpec *pspec)
{ {
GcalSearchViewPrivate *priv; GcalSearchView *self = GCAL_SEARCH_VIEW (object);
priv = gcal_search_view_get_instance_private (GCAL_SEARCH_VIEW (object));
switch (property_id) switch (property_id)
{ {
case PROP_DATE: case PROP_DATE:
g_value_set_boxed (value, priv->date); g_value_set_boxed (value, self->date);
break; break;
default: default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
@@ -614,15 +599,12 @@ gcal_search_view_get_property (GObject *object,
} }
static void static void
gcal_search_view_finalize (GObject *object) gcal_search_view_finalize (GObject *object)
{ {
GcalSearchViewPrivate *priv; GcalSearchView *self = GCAL_SEARCH_VIEW (object);
priv = gcal_search_view_get_instance_private (GCAL_SEARCH_VIEW (object));
if (priv->date != NULL) g_clear_pointer (&self->date, g_free);
g_free (priv->date); g_clear_pointer (&self->uuid_to_event, g_hash_table_unref);
g_hash_table_unref (priv->uuid_to_event);
/* Chain up to parent's finalize() method. */ /* Chain up to parent's finalize() method. */
G_OBJECT_CLASS (gcal_search_view_parent_class)->finalize (object); G_OBJECT_CLASS (gcal_search_view_parent_class)->finalize (object);
@@ -634,14 +616,14 @@ gcal_search_view_component_added (ECalDataModelSubscriber *subscriber,
ECalClient *client, ECalClient *client,
ECalComponent *comp) ECalComponent *comp)
{ {
GcalSearchViewPrivate *priv; GcalSearchView *view;
RowEventData *row_data; RowEventData *row_data;
GcalEventData *data; GcalEventData *data;
ECalComponentId *id; ECalComponentId *id;
gchar *uuid; gchar *uuid;
priv = gcal_search_view_get_instance_private (GCAL_SEARCH_VIEW (subscriber)); view = GCAL_SEARCH_VIEW (subscriber);
/* event data */ /* event data */
data = g_new0 (GcalEventData, 1); data = g_new0 (GcalEventData, 1);
@@ -664,12 +646,12 @@ gcal_search_view_component_added (ECalDataModelSubscriber *subscriber,
g_signal_connect (row_data->row, "destroy", G_CALLBACK (gtk_widget_destroyed), &(row_data->row)); g_signal_connect (row_data->row, "destroy", G_CALLBACK (gtk_widget_destroyed), &(row_data->row));
g_object_set_data (G_OBJECT (row_data->row), "event-data", row_data); g_object_set_data (G_OBJECT (row_data->row), "event-data", row_data);
g_hash_table_insert (priv->uuid_to_event, uuid, row_data); g_hash_table_insert (view->uuid_to_event, uuid, row_data);
gtk_container_add (GTK_CONTAINER (priv->listbox), row_data->row); gtk_container_add (GTK_CONTAINER (view->listbox), row_data->row);
/* show 'no results' */ /* show 'no results' */
priv->num_results++; view->num_results++;
update_view (GCAL_SEARCH_VIEW (subscriber)); update_view (GCAL_SEARCH_VIEW (subscriber));
} }
@@ -688,12 +670,12 @@ gcal_search_view_component_removed (ECalDataModelSubscriber *subscriber,
const gchar *uid, const gchar *uid,
const gchar *rid) const gchar *rid)
{ {
GcalSearchViewPrivate *priv; GcalSearchView *view;
ESource *source; ESource *source;
RowEventData *row_data; RowEventData *row_data;
gchar *uuid; gchar *uuid;
priv = gcal_search_view_get_instance_private (GCAL_SEARCH_VIEW (subscriber)); view = GCAL_SEARCH_VIEW (subscriber);
/* if the widget has recurrency, it's UUID is different */ /* if the widget has recurrency, it's UUID is different */
source = e_client_get_source (E_CLIENT (client)); source = e_client_get_source (E_CLIENT (client));
@@ -704,19 +686,19 @@ gcal_search_view_component_removed (ECalDataModelSubscriber *subscriber,
uuid = g_strdup_printf ("%s:%s", e_source_get_uid (source), uid); uuid = g_strdup_printf ("%s:%s", e_source_get_uid (source), uid);
// Lookup the RowEventData // Lookup the RowEventData
row_data = g_hash_table_lookup (priv->uuid_to_event, uuid); row_data = g_hash_table_lookup (view->uuid_to_event, uuid);
/* Removing the given RowEventData entry will /* Removing the given RowEventData entry will
* call free_row_data, which removes the row * call free_row_data, which removes the row
* from the listbox and also free the uuid. * from the listbox and also free the uuid.
*/ */
if (row_data) if (row_data)
g_hash_table_remove (priv->uuid_to_event, uuid); g_hash_table_remove (view->uuid_to_event, uuid);
g_free (uuid); g_free (uuid);
/* show 'no results' */ /* show 'no results' */
priv->num_results--; view->num_results--;
update_view (GCAL_SEARCH_VIEW (subscriber)); update_view (GCAL_SEARCH_VIEW (subscriber));
} }
@@ -759,11 +741,8 @@ void
gcal_search_view_connect (GcalSearchView *search_view, gcal_search_view_connect (GcalSearchView *search_view,
GcalManager *manager) GcalManager *manager)
{ {
GcalSearchViewPrivate *priv; if (manager != NULL && manager != search_view->manager)
search_view->manager = manager;
priv = gcal_search_view_get_instance_private (search_view);
if (manager != NULL && manager != priv->manager)
priv->manager = manager;
} }
/** /**
@@ -779,10 +758,7 @@ void
gcal_search_view_set_time_format (GcalSearchView *view, gcal_search_view_set_time_format (GcalSearchView *view,
gboolean format_24h) gboolean format_24h)
{ {
GcalSearchViewPrivate *priv; view->format_24h = format_24h;
priv = gcal_search_view_get_instance_private (view);
priv->format_24h = format_24h;
} }
/** /**
@@ -800,17 +776,11 @@ gcal_search_view_search (GcalSearchView *view,
const gchar *field, const gchar *field,
const gchar *query) const gchar *query)
{ {
GcalSearchViewPrivate *priv; g_clear_pointer (&view->query, g_free);
g_clear_pointer (&view->field, g_free);
priv = gcal_search_view_get_instance_private (view); view->query = g_strdup (query);
view->field = g_strdup (field);
if (priv->query != NULL)
g_free (priv->query);
if (priv->field != NULL)
g_free (priv->field);
priv->query = g_strdup (query);
priv->field = g_strdup (field);
/* Only perform search on valid non-empty strings */ /* Only perform search on valid non-empty strings */
@@ -819,22 +789,22 @@ gcal_search_view_search (GcalSearchView *view,
gchar *search_query = g_strdup_printf ("(contains? \"%s\" \"%s\")", field != NULL? field : "summary", gchar *search_query = g_strdup_printf ("(contains? \"%s\" \"%s\")", field != NULL? field : "summary",
query != NULL? query : ""); query != NULL? query : "");
if (!priv->subscribed) if (!view->subscribed)
{ {
gcal_manager_set_search_subscriber (priv->manager, E_CAL_DATA_MODEL_SUBSCRIBER (view), 0, 0); gcal_manager_set_search_subscriber (view->manager, E_CAL_DATA_MODEL_SUBSCRIBER (view), 0, 0);
priv->subscribed = TRUE; view->subscribed = TRUE;
} }
/* update internal current time_t */ /* update internal current time_t */
priv->current_utc_date = time (NULL); view->current_utc_date = time (NULL);
gcal_manager_set_query (priv->manager, search_query); gcal_manager_set_query (view->manager, search_query);
g_free (search_query); g_free (search_query);
} }
else else
{ {
g_hash_table_remove_all (priv->uuid_to_event); g_hash_table_remove_all (view->uuid_to_event);
} }
update_view (view); update_view (view);
+1 -22
View File
@@ -28,29 +28,8 @@
G_BEGIN_DECLS G_BEGIN_DECLS
#define GCAL_TYPE_SEARCH_VIEW (gcal_search_view_get_type ()) #define GCAL_TYPE_SEARCH_VIEW (gcal_search_view_get_type ())
#define GCAL_SEARCH_VIEW(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), GCAL_TYPE_SEARCH_VIEW, GcalSearchView))
#define GCAL_SEARCH_VIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), GCAL_TYPE_SEARCH_VIEW, GcalSearchViewClass))
#define GCAL_IS_SEARCH_VIEW(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), GCAL_TYPE_SEARCH_VIEW))
#define GCAL_IS_SEARCH_VIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), GCAL_TYPE_SEARCH_VIEW))
#define GCAL_SEARCH_VIEW_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), GCAL_TYPE_SEARCH_VIEW, GcalSearchViewClass))
typedef struct _GcalSearchView GcalSearchView; G_DECLARE_FINAL_TYPE (GcalSearchView, gcal_search_view, GCAL, SEARCH_VIEW, GtkPopover)
typedef struct _GcalSearchViewClass GcalSearchViewClass;
struct _GcalSearchView
{
GtkPopover parent;
};
struct _GcalSearchViewClass
{
GtkPopoverClass parent_class;
/* signals */
void (*event_activated) (GcalSearchView *view, const icaltimetype *date);
};
GType gcal_search_view_get_type (void);
void gcal_search_view_set_time_format (GcalSearchView *view, void gcal_search_view_set_time_format (GcalSearchView *view,
gboolean format_24h); gboolean format_24h);