pidgin/pidginaccountsenabledmenu.c

Fri, 13 May 2022 04:50:00 -0500

author
Elliott Sales de Andrade <quantum.analyst@gmail.com>
date
Fri, 13 May 2022 04:50:00 -0500
changeset 41371
fe57d9ddc7ce
parent 41304
25830cad9bfc
child 41392
b5c84f55d5d2
permissions
-rw-r--r--

Split conversation/interface prefs into a separate widget

No re-design, just `HdyPreferencesGroup` instead of `GtkFrame`.

Testing Done:
Opened Preferences, changed options and made sure everything was saving according to the debug log.

Reviewed at https://reviews.imfreedom.org/r/1444/

/*
 * Pidgin - Internet Messenger
 * Copyright (C) Pidgin Developers <devel@pidgin.im>
 *
 * Pidgin is the legal property of its developers, whose names are too numerous
 * to list here.  Please refer to the COPYRIGHT file distributed with this
 * source distribution.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, see <https://www.gnu.org/licenses/>.
 */

#include <glib/gi18n.h>

#include "pidginaccountsenabledmenu.h"

#include "pidgincore.h"

/******************************************************************************
 * Helpers
 *****************************************************************************/
static GMenu *
pidgin_accounts_enabled_menu_build_submenu(PurpleAccount *account) {
	GMenu *menu = NULL, *section = NULL;
	gchar *action_id = NULL;
	const gchar *account_id = NULL;

	menu = g_menu_new();
	account_id = purple_account_get_id(account);

	/* Add the "Edit Account" section. */
	section = g_menu_new();
	g_menu_append_section(menu, NULL, G_MENU_MODEL(section));

	action_id = g_strdup_printf("app.edit-account::%s", account_id);
	g_menu_append(section, _("Edit Account"), action_id);
	g_free(action_id);

	/* Add the "Disable Account" section. */
	section = g_menu_new();
	g_menu_append_section(menu, NULL, G_MENU_MODEL(section));

	action_id = g_strdup_printf("app.disable-account::%s", account_id);
	g_menu_append(section, _("Disable"), action_id);
	g_free(action_id);

	return menu;
}

static void
pidgin_accounts_enabled_menu_refresh_helper(PurpleAccount *account,
                                            gpointer data)
{
	GMenu *menu = data;

	if(purple_account_get_enabled(account, PIDGIN_UI)) {
		GMenu *submenu = NULL;
		gchar *label = NULL;
		const gchar *account_name = purple_account_get_username(account);
		const gchar *protocol_name = purple_account_get_protocol_name(account);

		submenu = pidgin_accounts_enabled_menu_build_submenu(account);

		/* translators: This format string is intended to contain the account
		 * name followed by the protocol name to uniquely identify a specific
		 * account.
		 */
		label = g_strdup_printf(_("%s (%s)"), account_name, protocol_name);

		g_menu_append_submenu(menu, label, G_MENU_MODEL(submenu));

		g_free(label);
	}
}

static void
pidgin_accounts_enabled_menu_refresh(GMenu *menu) {
	PurpleAccountManager *manager = NULL;

	g_menu_remove_all(menu);

	manager = purple_account_manager_get_default();
	purple_account_manager_foreach(manager,
	                               pidgin_accounts_enabled_menu_refresh_helper,
	                               menu);
}

/******************************************************************************
 * Callbacks
 *****************************************************************************/
static void
pidgin_accounts_enabled_menu_enabled_cb(G_GNUC_UNUSED PurpleAccount *account,
                                        gpointer data)
{
	pidgin_accounts_enabled_menu_refresh(data);
}

static void
pidgin_accounts_enabled_menu_disabled_cb(G_GNUC_UNUSED PurpleAccount *account,
                                         gpointer data)
{
	pidgin_accounts_enabled_menu_refresh(data);
}

static void
pidgin_accounts_enabled_menu_weak_notify_cb(G_GNUC_UNUSED gpointer data,
                                            GObject *obj)
{
	purple_signals_disconnect_by_handle(obj);
}

/******************************************************************************
 * Public API
 *****************************************************************************/
GMenu *
pidgin_accounts_enabled_menu_new(void) {
	GMenu *menu = NULL;
	gpointer handle = NULL;

	/* Create the menu and set our instance as data on it so it'll be freed
	 * when the menu is destroyed.
	 */
	menu = g_menu_new();
	g_object_weak_ref(G_OBJECT(menu),
	                  pidgin_accounts_enabled_menu_weak_notify_cb, NULL);

	/* Populate ourselves with any accounts that are already enabled. */
	pidgin_accounts_enabled_menu_refresh(menu);

	/* Wire up the purple signals we care about. */
	handle = purple_accounts_get_handle();
	purple_signal_connect(handle, "account-enabled", menu,
	                      G_CALLBACK(pidgin_accounts_enabled_menu_enabled_cb),
	                      menu);
	purple_signal_connect(handle, "account-disabled", menu,
	                      G_CALLBACK(pidgin_accounts_enabled_menu_disabled_cb),
	                      menu);

	return menu;
}

mercurial