* modify it. When we are creating an account, this member is set to TRUE */
gboolean creating_account;
+ /* whether there are any other real accounts. Necessary so we know whether
+ * it's safe to dismiss this widget in some cases (eg, whether the Cancel
+ * button should be sensitive) */
+ gboolean other_accounts_exist;
+
/* if TRUE, the GTK+ destroy signal has been fired and so the widgets
* embedded in this account widget can't be used any more
* workaround because some async callbacks can be called after the
PROP_PROTOCOL = 1,
PROP_SETTINGS,
PROP_SIMPLE,
- PROP_CREATING_ACCOUNT
+ PROP_CREATING_ACCOUNT,
+ PROP_OTHER_ACCOUNTS_EXIST,
};
enum {
if (!priv->simple)
{
+ /* we hit this case because of the 'other-accounts-exist' property handler
+ * being called during init (before constructed()) */
+ if (priv->apply_button == NULL || priv->cancel_button == NULL)
+ return;
+
gtk_widget_set_sensitive (priv->apply_button, sensitive);
- gtk_widget_set_sensitive (
- priv->cancel_button, sensitive || priv->creating_account);
+ gtk_widget_set_sensitive (priv->cancel_button,
+ (sensitive || priv->creating_account) && priv->other_accounts_exist);
}
}
account_widget_account_enabled_cb, user_data);
}
+void
+empathy_account_widget_set_other_accounts_exist (EmpathyAccountWidget *self,
+ gboolean others_exist)
+{
+ EmpathyAccountWidgetPriv *priv = GET_PRIV (self);
+
+ priv->other_accounts_exist = others_exist;
+
+ if (priv->creating_account)
+ account_widget_handle_control_buttons_sensitivity (self);
+}
+
static void
do_set_property (GObject *object,
guint prop_id,
case PROP_CREATING_ACCOUNT:
priv->creating_account = g_value_get_boolean (value);
break;
+ case PROP_OTHER_ACCOUNTS_EXIST:
+ empathy_account_widget_set_other_accounts_exist (
+ EMPATHY_ACCOUNT_WIDGET (object), g_value_get_boolean (value));
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
}
case PROP_CREATING_ACCOUNT:
g_value_set_boolean (value, priv->creating_account);
break;
+ case PROP_OTHER_ACCOUNTS_EXIST:
+ g_value_set_boolean (value, priv->other_accounts_exist);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
}
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT_ONLY);
g_object_class_install_property (oclass, PROP_CREATING_ACCOUNT, param_spec);
+ param_spec = g_param_spec_boolean ("other-accounts-exist",
+ "other-accounts-exist",
+ "TRUE if there are any other accounts (even if this isn't yet saved)",
+ FALSE,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT_ONLY);
+ g_object_class_install_property (oclass, PROP_OTHER_ACCOUNTS_EXIST,
+ param_spec);
+
signals[HANDLE_APPLY] =
g_signal_new ("handle-apply", G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST, 0, NULL, NULL,
g_object_unref (settings);
}
+static gboolean
+accounts_dialog_has_valid_accounts (EmpathyAccountsDialog *dialog)
+{
+ EmpathyAccountsDialogPriv *priv = GET_PRIV (dialog);
+ GtkTreeModel *model;
+ GtkTreeIter iter;
+ gboolean creating;
+
+ g_object_get (priv->setting_widget_object,
+ "creating-account", &creating, NULL);
+
+ if (!creating)
+ return TRUE;
+
+ model = gtk_tree_view_get_model (GTK_TREE_VIEW (priv->treeview));
+
+ if (gtk_tree_model_get_iter_first (model, &iter))
+ return gtk_tree_model_iter_next (model, &iter);
+
+ return FALSE;
+}
+
static void
account_dialog_create_settings_widget (EmpathyAccountsDialog *dialog,
EmpathyAccountSettings *settings)
priv->setting_widget_object =
empathy_account_widget_new_for_protocol (settings, FALSE);
+ if (accounts_dialog_has_valid_accounts (dialog))
+ empathy_account_widget_set_other_accounts_exist (
+ priv->setting_widget_object, TRUE);
+
priv->settings_widget =
empathy_account_widget_get_widget (priv->setting_widget_object);
tp_account_prepare_async (account, NULL, account_prepare_cb, dialog);
}
+static void
+accounts_dialog_accounts_model_row_inserted_cb (GtkTreeModel *model,
+ GtkTreePath *path,
+ GtkTreeIter *iter,
+ EmpathyAccountsDialog *dialog)
+{
+ EmpathyAccountsDialogPriv *priv = GET_PRIV (dialog);
+
+ if (priv->setting_widget_object != NULL &&
+ accounts_dialog_has_valid_accounts (dialog))
+ {
+ empathy_account_widget_set_other_accounts_exist (
+ priv->setting_widget_object, TRUE);
+ }
+}
+
+static void
+accounts_dialog_accounts_model_row_deleted_cb (GtkTreeModel *model,
+ GtkTreePath *path,
+ EmpathyAccountsDialog *dialog)
+{
+ EmpathyAccountsDialogPriv *priv = GET_PRIV (dialog);
+
+ if (priv->setting_widget_object != NULL &&
+ !accounts_dialog_has_valid_accounts (dialog))
+ {
+ empathy_account_widget_set_other_accounts_exist (
+ priv->setting_widget_object, FALSE);
+ }
+}
+
static void
accounts_dialog_account_removed_cb (TpAccountManager *manager,
TpAccount *account,
if (accounts_dialog_get_account_iter (dialog, account, &iter))
{
gtk_list_store_remove (GTK_LIST_STORE (
- gtk_tree_view_get_model (GTK_TREE_VIEW (priv->treeview))), &iter);
+ gtk_tree_view_get_model (GTK_TREE_VIEW (priv->treeview))), &iter);
}
}
{
EmpathyAccountsDialog *dialog = EMPATHY_ACCOUNTS_DIALOG (obj);
EmpathyAccountsDialogPriv *priv = GET_PRIV (dialog);
+ GtkTreeModel *model;
if (priv->dispose_has_run)
return;
priv->dispose_has_run = TRUE;
/* Disconnect signals */
+ model = gtk_tree_view_get_model (GTK_TREE_VIEW (priv->treeview));
+ g_signal_handlers_disconnect_by_func (model,
+ accounts_dialog_accounts_model_row_inserted_cb, dialog);
+ g_signal_handlers_disconnect_by_func (model,
+ accounts_dialog_accounts_model_row_deleted_cb, dialog);
+
g_signal_handlers_disconnect_by_func (priv->account_manager,
accounts_dialog_account_validity_changed_cb,
dialog);
EmpathyAccountsDialog *dialog = EMPATHY_ACCOUNTS_DIALOG (object);
EmpathyAccountsDialogPriv *priv = GET_PRIV (dialog);
gboolean import_asked;
+ GtkTreeModel *model;
accounts_dialog_build_ui (dialog);
accounts_dialog_model_setup (dialog);
+ model = gtk_tree_view_get_model (GTK_TREE_VIEW (priv->treeview));
+ g_signal_connect (model, "row-inserted",
+ (GCallback) accounts_dialog_accounts_model_row_inserted_cb, dialog);
+ g_signal_connect (model, "row-deleted",
+ (GCallback) accounts_dialog_accounts_model_row_deleted_cb, dialog);
+
/* Set up signalling */
priv->account_manager = tp_account_manager_dup ();