changeset 30379:242bcf6b1258

Applied and slightly modified Sadrul's patch (http://pidgin.im/~sadrul/pp/icq-list.patch.txt) for making the Visible/Invisible list editors support in-place editing. The end result looks like this: http://pidgin.im/~sadrul/ss/icq-list.png This dialog has some rough edges, so I commit it as a separate revision and return to it later.
author ivan.komarov@soc.pidgin.im
date Thu, 08 Jul 2010 14:58:55 +0000
parents c5790044f32f
children d48ae82c58ac 7b761c8601f7
files libpurple/protocols/oscar/visibility.c
diffstat 1 files changed, 98 insertions(+), 24 deletions(-) [+]
line wrap: on
line diff
--- a/libpurple/protocols/oscar/visibility.c	Sun Jul 04 01:13:11 2010 +0000
+++ b/libpurple/protocols/oscar/visibility.c	Thu Jul 08 14:58:55 2010 +0000
@@ -16,9 +16,10 @@
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
-*/
+ */
 
 #include "visibility.h"
+#include "request.h"
 
 /* 4 separate strings are needed in order to ease translators' job */
 #define APPEAR_ONLINE		N_("Appear Online")
@@ -70,17 +71,77 @@
 	return purple_menu_action_new(label, PURPLE_CALLBACK(visibility_cb), NULL, NULL);
 }
 
+typedef void (*ShowDialog)(PurplePluginAction *);
+
+struct list_remove_data
+{
+	PurplePluginAction *action;
+	ShowDialog show_dialog_again;
+	OscarData *od;
+	guint16 list_type;
+	const gchar *list_name;
+};
+
 static void
-show_private_list(PurplePluginAction *action, guint16 list_type, const gchar *title, const gchar *list_description, const gchar *menu_action_name)
+list_remove_cb(struct list_remove_data *data, PurpleRequestFields *fields)
+{
+	ShowDialog show_dialog_again = data->show_dialog_again;
+	PurplePluginAction *action = data->action;
+	PurpleRequestField *field = purple_request_fields_get_field(fields, "list-items");
+	GList *sels = purple_request_field_list_get_selected(field);
+	for (; sels; sels = sels->next) {
+		const gchar *name = sels->data;
+		const gchar *bname = purple_request_field_list_get_data(field, name);
+
+		purple_debug_info("oscar", "Removing %s from %s\n", bname, data->list_name);
+
+		aim_ssi_del_from_private_list(data->od, bname, data->list_type);
+	}
+
+	g_free(data);
+	show_dialog_again(action);
+}
+
+static void
+list_close_cb(struct list_remove_data *data, gpointer ignored)
+{
+	g_free(data);
+}
+
+static void
+show_private_list(PurplePluginAction *action,
+		  guint16 list_type,
+		  const gchar *list_name,
+		  const gchar *list_description,
+		  const gchar *menu_action_name,
+		  ShowDialog caller)
 {
 	PurpleConnection *gc = (PurpleConnection *) action->context;
 	OscarData *od = purple_connection_get_protocol_data(gc);
 	PurpleAccount *account = purple_connection_get_account(gc);
-	GSList *buddies, *filtered_buddies, *cur;
-	gchar *text, *secondary;
+	GSList *buddies, *cur;
+	gchar *desc;
+	struct list_remove_data *data;
+
+	PurpleRequestField *field;
+	PurpleRequestFields *fields = purple_request_fields_new();
+	PurpleRequestFieldGroup *group = purple_request_field_group_new(NULL);
+
+	purple_request_fields_add_group(fields, group);
+
+	desc = g_strdup_printf(_("You can add a buddy to this list "
+				 "by right-clicking on them and "
+				 "selecting \"%s\""), menu_action_name);
+
+	field = purple_request_field_list_new("list-items", desc);
+	g_free(desc);
+
+	purple_request_field_group_add_field(group, field);
+
+	purple_request_field_list_set_multi_select(field, TRUE);
+	purple_request_field_set_required(field, TRUE);
 
 	buddies = purple_find_buddies(account, NULL);
-	filtered_buddies = NULL;
 	for (cur = buddies; cur != NULL; cur = cur->next) {
 		PurpleBuddy *buddy;
 		const gchar *bname;
@@ -88,38 +149,51 @@
 		buddy = cur->data;
 		bname = purple_buddy_get_name(buddy);
 		if (aim_ssi_itemlist_finditem(od->ssi.local, NULL, bname, list_type)) {
-			filtered_buddies = g_slist_prepend(filtered_buddies, buddy);
+			const gchar *alias = purple_buddy_get_alias_only(buddy);
+			char *dname = alias ? g_strdup_printf("%s (%s)", bname, alias) : NULL;
+			purple_request_field_list_add(field, dname ? dname : bname, (void *)bname);
+			g_free(dname);
 		}
 	}
 
 	g_slist_free(buddies);
 
-	filtered_buddies = g_slist_reverse(filtered_buddies);
-	text = oscar_format_buddies(filtered_buddies, _("you have no buddies on this list"));
-	g_slist_free(filtered_buddies);
+	data = g_new0(struct list_remove_data, 1);
+	data->action = action;
+	data->show_dialog_again = caller;
+	data->od = od;
+	data->list_type = list_type;
+	data->list_name = list_name;
 
-	secondary = g_strdup_printf(_("You can add a buddy to this list "
-					"by right-clicking on them and "
-					"selecting \"%s\""), menu_action_name);
-	purple_notify_formatted(gc, title, list_description, secondary, text, NULL, NULL);
-	g_free(secondary);
-	g_free(text);
+	purple_request_fields(gc, list_name, list_description, NULL,
+			      fields,
+			      _("Close"), G_CALLBACK(list_close_cb),
+			      _("Remove"), G_CALLBACK(list_remove_cb),
+			      account, NULL, NULL,
+			      data);
 }
 
 void
 oscar_show_visible_list(PurplePluginAction *action)
 {
-	show_private_list(action, AIM_SSI_TYPE_PERMIT, _("Visible List"),
-							_("These buddies will see "
-							"your status when you switch "
-							"to \"Invisible\""),
-							_(APPEAR_ONLINE));
+	show_private_list(action,
+			  AIM_SSI_TYPE_PERMIT,
+			  _("Visible List"),
+			  _("These buddies will see "
+			    "your status when you switch "
+			    "to \"Invisible\""),
+			  _(APPEAR_ONLINE),
+			  oscar_show_visible_list);
 }
 
 void
 oscar_show_invisible_list(PurplePluginAction *action)
 {
-	show_private_list(action, AIM_SSI_TYPE_DENY, _("Invisible List"),
-							_("These buddies will always see you as offline"),
-							_(APPEAR_OFFLINE));
-}
\ No newline at end of file
+	show_private_list(action,
+			  AIM_SSI_TYPE_DENY,
+			  _("Invisible List"),
+			  _("These buddies will always see you as offline"),
+			  _(APPEAR_OFFLINE),
+			  oscar_show_invisible_list);
+}
+