manager: unify completion flags

Instead of having a completion flag for GOA and calendars,
unify both of them and simplify some code.
This commit is contained in:
Georges Basile Stavracas Neto
2017-03-17 12:46:40 -03:00
parent 1d64b00df3
commit be137fca02
5 changed files with 78 additions and 73 deletions
+47 -48
View File
@@ -100,7 +100,9 @@ enum
{ {
PROP_0, PROP_0,
PROP_DEFAULT_CALENDAR, PROP_DEFAULT_CALENDAR,
PROP_LOADING,
PROP_SETTINGS, PROP_SETTINGS,
NUM_PROPS
}; };
enum enum
@@ -109,13 +111,12 @@ enum
SOURCE_CHANGED, SOURCE_CHANGED,
SOURCE_REMOVED, SOURCE_REMOVED,
SOURCE_ENABLED, SOURCE_ENABLED,
LOAD_COMPLETED,
QUERY_COMPLETED, QUERY_COMPLETED,
GOA_CLIENT_READY,
NUM_SIGNALS NUM_SIGNALS
}; };
static guint signals[NUM_SIGNALS] = { 0, }; static guint signals[NUM_SIGNALS] = { 0, };
static GParamSpec *properties[NUM_PROPS] = { NULL, };
/* -- start: threading related code provided by Milan Crha */ /* -- start: threading related code provided by Milan Crha */
typedef struct { typedef struct {
@@ -346,8 +347,9 @@ on_client_connected (GObject *source_object,
source = e_client_get_source (E_CLIENT (source_object)); source = e_client_get_source (E_CLIENT (source_object));
manager->sources_at_launch--; manager->sources_at_launch--;
if (manager->sources_at_launch == 0) if (manager->sources_at_launch == 0)
g_signal_emit (user_data, signals[LOAD_COMPLETED], 0); g_object_notify_by_pspec (G_OBJECT (manager), properties[PROP_LOADING]);
error = NULL; error = NULL;
client = E_CAL_CLIENT (e_cal_client_connect_finish (result, &error)); client = E_CAL_CLIENT (e_cal_client_connect_finish (result, &error));
@@ -746,8 +748,6 @@ gcal_manager_client_ready_cb (GObject *source,
manager->goa_client = goa_client_new_finish (result, &error); manager->goa_client = goa_client_new_finish (result, &error);
manager->goa_client_ready = TRUE; manager->goa_client_ready = TRUE;
g_signal_emit (user_data, signals[GOA_CLIENT_READY], 0, manager->goa_client);
if (error != NULL) if (error != NULL)
{ {
g_warning ("%s: Error retrieving GoaClient: %s", g_warning ("%s: Error retrieving GoaClient: %s",
@@ -757,6 +757,8 @@ gcal_manager_client_ready_cb (GObject *source,
g_error_free (error); g_error_free (error);
} }
g_object_notify_by_pspec (G_OBJECT (manager), properties[PROP_LOADING]);
GCAL_EXIT; GCAL_EXIT;
} }
@@ -972,6 +974,10 @@ gcal_manager_get_property (GObject *object,
g_value_take_object (value, e_source_registry_ref_default_calendar (self->source_registry)); g_value_take_object (value, e_source_registry_ref_default_calendar (self->source_registry));
break; break;
case PROP_LOADING:
g_value_set_boolean (value, gcal_manager_get_loading (self));
break;
case PROP_SETTINGS: case PROP_SETTINGS:
g_value_set_object (value, self->settings); g_value_set_object (value, self->settings);
return; return;
@@ -995,22 +1001,40 @@ gcal_manager_class_init (GcalManagerClass *klass)
object_class->set_property = gcal_manager_set_property; object_class->set_property = gcal_manager_set_property;
object_class->get_property = gcal_manager_get_property; object_class->get_property = gcal_manager_get_property;
/* properties */ /**
g_object_class_install_property (object_class, * GcalManager:default-calendar:
PROP_DEFAULT_CALENDAR, *
g_param_spec_object ("default-calendar", * The default calendar.
"Default calendar", */
"The default calendar", properties[PROP_DEFAULT_CALENDAR] = g_param_spec_object ("default-calendar",
E_TYPE_SOURCE, "Default calendar",
G_PARAM_READWRITE)); "The default calendar",
E_TYPE_SOURCE,
G_PARAM_READWRITE);
g_object_class_install_property (object_class, /**
PROP_SETTINGS, * GcalManager:loading:
g_param_spec_object ("settings", *
"Application settings", * Whether the manager is loading or not.
"The settings of the application passed down from GcalApplication", */
G_TYPE_SETTINGS, properties[PROP_LOADING] = g_param_spec_boolean ("loading",
G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE)); "Loading",
"Whether it's still loading or not",
TRUE,
G_PARAM_READABLE);
/**
* GcalManager:settings:
*
* The settings.
*/
properties[PROP_SETTINGS] = g_param_spec_object ("settings",
"Application settings",
"The settings of the application passed down from GcalApplication",
G_TYPE_SETTINGS,
G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE);
g_object_class_install_properties (object_class, NUM_PROPS, properties);
/* signals */ /* signals */
signals[SOURCE_ADDED] = g_signal_new ("source-added", signals[SOURCE_ADDED] = g_signal_new ("source-added",
@@ -1047,13 +1071,6 @@ gcal_manager_class_init (GcalManagerClass *klass)
E_TYPE_SOURCE, E_TYPE_SOURCE,
G_TYPE_BOOLEAN); G_TYPE_BOOLEAN);
signals[LOAD_COMPLETED] = g_signal_new ("load-completed",
GCAL_TYPE_MANAGER,
G_SIGNAL_RUN_LAST,
0, NULL, NULL, NULL,
G_TYPE_NONE,
0);
signals[QUERY_COMPLETED] = g_signal_new ("query-completed", signals[QUERY_COMPLETED] = g_signal_new ("query-completed",
GCAL_TYPE_MANAGER, GCAL_TYPE_MANAGER,
G_SIGNAL_RUN_LAST, G_SIGNAL_RUN_LAST,
@@ -1061,14 +1078,6 @@ gcal_manager_class_init (GcalManagerClass *klass)
NULL, NULL, NULL, NULL, NULL, NULL,
G_TYPE_NONE, G_TYPE_NONE,
0); 0);
signals[GOA_CLIENT_READY] = g_signal_new ("goa-client-ready",
GCAL_TYPE_MANAGER,
G_SIGNAL_RUN_LAST,
0, NULL, NULL, NULL,
G_TYPE_NONE,
1,
GOA_TYPE_CLIENT);
} }
static void static void
@@ -1805,11 +1814,11 @@ gcal_manager_get_events (GcalManager *manager,
} }
gboolean gboolean
gcal_manager_load_completed (GcalManager *self) gcal_manager_get_loading (GcalManager *self)
{ {
g_return_val_if_fail (GCAL_IS_MANAGER (self), FALSE); g_return_val_if_fail (GCAL_IS_MANAGER (self), FALSE);
return self->sources_at_launch == 0; return !self->goa_client_ready || self->sources_at_launch > 0;
} }
GcalEvent* GcalEvent*
@@ -1847,16 +1856,6 @@ gcal_manager_get_event_from_shell_search (GcalManager *manager,
GCAL_RETURN (new_event); GCAL_RETURN (new_event);
} }
gboolean
gcal_manager_is_goa_client_ready (GcalManager *manager)
{
g_return_val_if_fail (GCAL_IS_MANAGER (manager), FALSE);
GCAL_ENTRY;
GCAL_RETURN (manager->goa_client_ready);
}
GoaClient* GoaClient*
gcal_manager_get_goa_client (GcalManager *manager) gcal_manager_get_goa_client (GcalManager *manager)
{ {
+1 -3
View File
@@ -104,11 +104,9 @@ GList* gcal_manager_get_events (GcalManager
icaltimetype *range_start, icaltimetype *range_start,
icaltimetype *range_end); icaltimetype *range_end);
gboolean gcal_manager_load_completed (GcalManager *self); gboolean gcal_manager_get_loading (GcalManager *self);
/* Online Accounts */ /* Online Accounts */
gboolean gcal_manager_is_goa_client_ready (GcalManager *manager);
GoaClient* gcal_manager_get_goa_client (GcalManager *manager); GoaClient* gcal_manager_get_goa_client (GcalManager *manager);
+2 -2
View File
@@ -78,7 +78,7 @@ execute_search (GcalShellSearchProvider *search_provider)
priv = search_provider->priv; priv = search_provider->priv;
if (!gcal_manager_load_completed (priv->manager)) if (gcal_manager_get_loading (priv->manager))
return TRUE; return TRUE;
zone = gcal_manager_get_system_timezone (priv->manager); zone = gcal_manager_get_system_timezone (priv->manager);
@@ -151,7 +151,7 @@ schedule_search (GcalShellSearchProvider *search_provider,
priv->pending_search->invocation = g_object_ref (invocation); priv->pending_search->invocation = g_object_ref (invocation);
priv->pending_search->terms = g_strdupv (terms); priv->pending_search->terms = g_strdupv (terms);
if (!gcal_manager_load_completed (priv->manager)) if (gcal_manager_get_loading (priv->manager))
{ {
priv->scheduled_search_id = g_timeout_add_seconds (1, (GSourceFunc) execute_search, search_provider); priv->scheduled_search_id = g_timeout_add_seconds (1, (GSourceFunc) execute_search, search_provider);
return; return;
+27 -19
View File
@@ -16,8 +16,9 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
#define G_LOG_DOMAIN "GcaçSourceDialog" #define G_LOG_DOMAIN "GcalSourceDialog"
#include "gcal-debug.h"
#include "gcal-source-dialog.h" #include "gcal-source-dialog.h"
#include "gcal-utils.h" #include "gcal-utils.h"
@@ -2143,16 +2144,24 @@ goa_account_removed_cb (GoaClient *client,
} }
static void static void
goa_client_ready_cb (GcalSourceDialog *dialog, loading_changed_cb (GcalSourceDialog *dialog)
GoaClient *client,
gpointer user_data)
{ {
GoaClient *client;
GList *accounts, *l; GList *accounts, *l;
GCAL_ENTRY;
g_return_if_fail (GCAL_IS_SOURCE_DIALOG (dialog)); g_return_if_fail (GCAL_IS_SOURCE_DIALOG (dialog));
g_return_if_fail (GOA_IS_CLIENT (client));
if (gcal_manager_get_loading (dialog->manager))
{
GCAL_TRACE_MSG ("Not loaded yet");
GCAL_EXIT;
return;
}
/* Add already fetched accounts */ /* Add already fetched accounts */
client = gcal_manager_get_goa_client (dialog->manager);
accounts = goa_client_get_accounts (client); accounts = goa_client_get_accounts (client);
for (l = accounts; l != NULL; l = l->next) for (l = accounts; l != NULL; l = l->next)
@@ -2162,7 +2171,12 @@ goa_client_ready_cb (GcalSourceDialog *dialog,
g_signal_connect (client, "account-added", G_CALLBACK (goa_account_added_cb), dialog); g_signal_connect (client, "account-added", G_CALLBACK (goa_account_added_cb), dialog);
g_signal_connect (client, "account-removed", G_CALLBACK (goa_account_removed_cb), dialog); g_signal_connect (client, "account-removed", G_CALLBACK (goa_account_removed_cb), dialog);
/* Once we loaded, no need to track it down again */
g_signal_handlers_disconnect_by_func (dialog->manager, loading_changed_cb, dialog);
g_list_free (accounts); g_list_free (accounts);
GCAL_EXIT;
} }
/** /**
@@ -2179,20 +2193,7 @@ gcal_source_dialog_set_manager (GcalSourceDialog *dialog,
{ {
dialog->manager = manager; dialog->manager = manager;
/* if (!gcal_manager_get_loading (dialog->manager))
* If the GoaClient is already loaded, fetch the online accounts
* directly. Otherwise, wait for it to be ready.
*/
if (gcal_manager_is_goa_client_ready (manager))
{
goa_client_ready_cb (dialog, gcal_manager_get_goa_client (manager), NULL);
}
else
{
g_signal_connect_swapped (manager, "goa-client-ready", G_CALLBACK (goa_client_ready_cb), dialog);
}
if (gcal_manager_load_completed (dialog->manager))
{ {
GList *sources, *l; GList *sources, *l;
@@ -2201,6 +2202,13 @@ gcal_source_dialog_set_manager (GcalSourceDialog *dialog,
for (l = sources; l != NULL; l = l->next) for (l = sources; l != NULL; l = l->next)
add_source (dialog->manager, l->data, gcal_manager_source_enabled (dialog->manager, l->data), dialog); add_source (dialog->manager, l->data, gcal_manager_source_enabled (dialog->manager, l->data), dialog);
} }
else
{
g_signal_connect_swapped (manager,
"notify::loading",
G_CALLBACK (loading_changed_cb),
dialog);
}
g_signal_connect (dialog->manager, "source-added", G_CALLBACK (add_source), dialog); g_signal_connect (dialog->manager, "source-added", G_CALLBACK (add_source), dialog);
g_signal_connect (dialog->manager, "source-removed", G_CALLBACK (remove_source), dialog); g_signal_connect (dialog->manager, "source-removed", G_CALLBACK (remove_source), dialog);
+1 -1
View File
@@ -1242,7 +1242,7 @@ gcal_window_constructed (GObject *object)
gtk_list_box_set_sort_func (GTK_LIST_BOX (window->calendar_listbox), (GtkListBoxSortFunc) calendar_listbox_sort_func, gtk_list_box_set_sort_func (GTK_LIST_BOX (window->calendar_listbox), (GtkListBoxSortFunc) calendar_listbox_sort_func,
object, NULL); object, NULL);
if (gcal_manager_load_completed (window->manager)) if (!gcal_manager_get_loading (window->manager))
{ {
GList *sources, *l; GList *sources, *l;
sources = gcal_manager_get_sources_connected (window->manager); sources = gcal_manager_get_sources_connected (window->manager);