# HG changeset patch # User ivan.komarov@soc.pidgin.im # Date 1278601135 0 # Node ID 242bcf6b1258d2f2f09ecb2ac57c1a940f050f3a # Parent c5790044f32f841edad13aa200bee31508309176 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. diff -r c5790044f32f -r 242bcf6b1258 libpurple/protocols/oscar/visibility.c --- 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); +} +