summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKa-Hing Cheung <khc@pidgin.im>2007-06-17 18:03:03 +0000
committerKa-Hing Cheung <khc@pidgin.im>2007-06-17 18:03:03 +0000
commitb0ab9a0477be26e69d873b1f4cb333da07725071 (patch)
tree086305f1c415905f8c3119adbef6b74ade3204f9
parent61e28fc91f4b76d53318790c23f209d3a04d5ffa (diff)
downloadpidgin-cpw.khc.ticket590.tar.gz
fixes #590 by allowing one to use the delete key to delete transient status,cpw.khc.ticket590
also introduced signals to repopulate the status lists when the statuses are added/deleted/modified
-rw-r--r--libpurple/savedstatuses.c60
-rw-r--r--libpurple/savedstatuses.h10
-rw-r--r--pidgin/gtksavedstatuses.c69
-rw-r--r--pidgin/gtkstatusbox.c77
4 files changed, 198 insertions, 18 deletions
diff --git a/libpurple/savedstatuses.c b/libpurple/savedstatuses.c
index f5d531b2a0..071c749c5b 100644
--- a/libpurple/savedstatuses.c
+++ b/libpurple/savedstatuses.c
@@ -569,6 +569,9 @@ purple_savedstatus_new(const char *title, PurpleStatusPrimitive type)
schedule_save();
+ purple_signal_emit(purple_savedstatuses_get_handle(), "savedstatus-added",
+ status);
+
return status;
}
@@ -584,6 +587,9 @@ purple_savedstatus_set_title(PurpleSavedStatus *status, const char *title)
status->title = g_strdup(title);
schedule_save();
+
+ purple_signal_emit(purple_savedstatuses_get_handle(),
+ "savedstatus-modified", status);
}
void
@@ -594,6 +600,8 @@ purple_savedstatus_set_type(PurpleSavedStatus *status, PurpleStatusPrimitive typ
status->type = type;
schedule_save();
+ purple_signal_emit(purple_savedstatuses_get_handle(),
+ "savedstatus-modified", status);
}
void
@@ -608,6 +616,9 @@ purple_savedstatus_set_message(PurpleSavedStatus *status, const char *message)
status->message = g_strdup(message);
schedule_save();
+
+ purple_signal_emit(purple_savedstatuses_get_handle(),
+ "savedstatus-modified", status);
}
void
@@ -637,6 +648,8 @@ purple_savedstatus_set_substatus(PurpleSavedStatus *saved_status,
substatus->message = g_strdup(message);
schedule_save();
+ purple_signal_emit(purple_savedstatuses_get_handle(),
+ "savedstatus-modified", saved_status);
}
void
@@ -660,6 +673,9 @@ purple_savedstatus_unset_substatus(PurpleSavedStatus *saved_status,
return;
}
}
+
+ purple_signal_emit(purple_savedstatuses_get_handle(),
+ "savedstatus-modified", saved_status);
}
/*
@@ -683,16 +699,12 @@ purple_savedstatus_unset_all_substatuses(const PurpleAccount *account,
}
}
-gboolean
-purple_savedstatus_delete(const char *title)
+void
+purple_savedstatus_delete_by_status(PurpleSavedStatus *status)
{
- PurpleSavedStatus *status;
time_t creation_time, current, idleaway;
- status = purple_savedstatus_find(title);
-
- if (status == NULL)
- return FALSE;
+ g_return_if_fail(status != NULL);
saved_statuses = g_list_remove(saved_statuses, status);
creation_time = purple_savedstatus_get_creation_time(status);
@@ -713,6 +725,25 @@ purple_savedstatus_delete(const char *title)
if (idleaway == creation_time)
purple_prefs_set_int("/purple/savedstatus/idleaway", 0);
+ purple_signal_emit(purple_savedstatuses_get_handle(),
+ "savedstatus-deleted", status);
+}
+
+gboolean
+purple_savedstatus_delete(const char *title)
+{
+ PurpleSavedStatus *status;
+
+ status = purple_savedstatus_find(title);
+
+ if (status == NULL)
+ return FALSE;
+
+ if (purple_savedstatus_get_current() == status)
+ return FALSE;
+
+ purple_savedstatus_delete_by_status(status);
+
return TRUE;
}
@@ -1171,6 +1202,21 @@ purple_savedstatuses_init(void)
purple_value_new(PURPLE_TYPE_SUBTYPE,
PURPLE_SUBTYPE_SAVEDSTATUS));
+ purple_signal_register(handle, "savedstatus-added",
+ purple_marshal_VOID__POINTER, NULL, 1,
+ purple_value_new(PURPLE_TYPE_SUBTYPE,
+ PURPLE_SUBTYPE_SAVEDSTATUS));
+
+ purple_signal_register(handle, "savedstatus-deleted",
+ purple_marshal_VOID__POINTER, NULL, 1,
+ purple_value_new(PURPLE_TYPE_SUBTYPE,
+ PURPLE_SUBTYPE_SAVEDSTATUS));
+
+ purple_signal_register(handle, "savedstatus-modified",
+ purple_marshal_VOID__POINTER, NULL, 1,
+ purple_value_new(PURPLE_TYPE_SUBTYPE,
+ PURPLE_SUBTYPE_SAVEDSTATUS));
+
purple_signal_connect(purple_accounts_get_handle(), "account-removed",
handle,
PURPLE_CALLBACK(purple_savedstatus_unset_all_substatuses),
diff --git a/libpurple/savedstatuses.h b/libpurple/savedstatuses.h
index d4a96999fe..588eccee1c 100644
--- a/libpurple/savedstatuses.h
+++ b/libpurple/savedstatuses.h
@@ -149,6 +149,16 @@ void purple_savedstatus_unset_substatus(PurpleSavedStatus *saved_status,
gboolean purple_savedstatus_delete(const char *title);
/**
+ * Delete a saved status. This removes the saved status from the list
+ * of saved statuses, and writes the revised list to status.xml.
+ *
+ * @param saved_status the status to delete, the pointer is invalid after
+ * the call
+ *
+ */
+void purple_savedstatus_delete_by_status(PurpleSavedStatus *saved_status);
+
+/**
* Returns all saved statuses.
*
* @return A list of saved statuses.
diff --git a/pidgin/gtksavedstatuses.c b/pidgin/gtksavedstatuses.c
index 69c221f81a..c7c5097402 100644
--- a/pidgin/gtksavedstatuses.c
+++ b/pidgin/gtksavedstatuses.c
@@ -285,9 +285,11 @@ status_window_delete_confirm_cb(gpointer data)
for (l = sel_titles; l != NULL; l = l->next) {
title = l->data;
- if (status_window_find_savedstatus(&iter, title))
- gtk_list_store_remove(status_window->model, &iter);
- purple_savedstatus_delete(title);
+ if (purple_savedstatus_find(title) != purple_savedstatus_get_current()) {
+ if (status_window_find_savedstatus(&iter, title))
+ gtk_list_store_remove(status_window->model, &iter);
+ purple_savedstatus_delete(title);
+ }
g_free(title);
}
g_list_free(sel_titles);
@@ -349,17 +351,39 @@ static void
status_selected_cb(GtkTreeSelection *sel, gpointer user_data)
{
StatusWindow *dialog = user_data;
- int num_selected = 0;
+ GList *sel_paths, *tmp;
+ gboolean can_use = TRUE, can_delete = TRUE;
+ int num_selected;
+ GtkTreeModel *model = GTK_TREE_MODEL(dialog->model);
#if GTK_CHECK_VERSION(2,2,0)
- num_selected = gtk_tree_selection_count_selected_rows(sel);
+ sel_paths = gtk_tree_selection_get_selected_rows(sel, NULL);
#else
- gtk_tree_selection_selected_foreach(sel, count_selected_helper, &num_selected);
+ gtk_tree_selection_selected_foreach(sel, list_selected_helper, &sel_paths);
#endif
- gtk_widget_set_sensitive(dialog->use_button, (num_selected == 1));
+ for (tmp = sel_paths, num_selected = 0; tmp; tmp = sel_paths->next, num_selected++) {
+ GtkTreeIter iter;
+ char *title;
+
+ if (gtk_tree_model_get_iter(model, &iter, tmp->data)) {
+ gtk_tree_model_get(model, &iter,
+ STATUS_WINDOW_COLUMN_TITLE, &title, -1);
+ if (purple_savedstatus_find(title) == purple_savedstatus_get_current()) {
+ can_use = can_delete = FALSE;
+ }
+
+ g_free(title);
+ }
+
+ gtk_tree_path_free(tmp->data);
+ }
+
+ gtk_widget_set_sensitive(dialog->use_button, (num_selected == 1) && can_use);
gtk_widget_set_sensitive(dialog->modify_button, (num_selected > 0));
- gtk_widget_set_sensitive(dialog->delete_button, (num_selected > 0));
+ gtk_widget_set_sensitive(dialog->delete_button, can_delete);
+
+ g_list_free(sel_paths);
}
static void
@@ -421,6 +445,12 @@ savedstatus_activated_cb(GtkTreeView *view, GtkTreePath *path, GtkTreeViewColumn
status_window_modify_cb(NULL, dialog);
}
+static void
+saved_status_updated_cb(PurpleSavedStatus *status, StatusWindow *sw)
+{
+ populate_saved_status_list(sw);
+}
+
static GtkWidget *
create_saved_status_list(StatusWindow *dialog)
{
@@ -529,6 +559,13 @@ configure_cb(GtkWidget *widget, GdkEventConfigure *event, StatusWindow *dialog)
return FALSE;
}
+static void
+current_status_changed(PurpleSavedStatus *old, PurpleSavedStatus *new_status,
+ StatusWindow *dialog)
+{
+ status_selected_cb(gtk_tree_view_get_selection(GTK_TREE_VIEW(dialog->treeview)), dialog);
+}
+
void
pidgin_status_window_show(void)
{
@@ -615,6 +652,20 @@ pidgin_status_window_show(void)
g_signal_connect(G_OBJECT(button), "clicked",
G_CALLBACK(status_window_close_cb), dialog);
+ purple_signal_connect(purple_savedstatuses_get_handle(),
+ "savedstatus-changed", dialog,
+ PURPLE_CALLBACK(current_status_changed), dialog);
+
+ purple_signal_connect(purple_savedstatuses_get_handle(),
+ "savedstatus-added", dialog,
+ PURPLE_CALLBACK(saved_status_updated_cb), dialog);
+ purple_signal_connect(purple_savedstatuses_get_handle(),
+ "savedstatus-deleted", dialog,
+ PURPLE_CALLBACK(saved_status_updated_cb), dialog);
+ purple_signal_connect(purple_savedstatuses_get_handle(),
+ "savedstatus-modified", dialog,
+ PURPLE_CALLBACK(saved_status_updated_cb), dialog);
+
gtk_widget_show_all(win);
}
@@ -804,8 +855,10 @@ status_editor_ok_cb(GtkButton *button, gpointer user_data)
gtk_widget_destroy(dialog->window);
g_free(dialog->original_title);
+/*
if (status_window != NULL)
add_status_to_saved_status_list(status_window->model, saved_status);
+*/
/* If they clicked on "Save & Use" or "Use," then activate the status */
if (button != dialog->save_button)
diff --git a/pidgin/gtkstatusbox.c b/pidgin/gtkstatusbox.c
index 9c49666310..9b7ae13422 100644
--- a/pidgin/gtkstatusbox.c
+++ b/pidgin/gtkstatusbox.c
@@ -47,6 +47,7 @@
#include "internal.h"
#include "imgstore.h"
#include "network.h"
+#include "request.h"
#include "savedstatuses.h"
#include "status.h"
#include "debug.h"
@@ -1223,6 +1224,12 @@ current_savedstatus_changed_cb(PurpleSavedStatus *now, PurpleSavedStatus *old, P
}
static void
+saved_status_updated_cb(PurpleSavedStatus *status, PidginStatusBox *status_box)
+{
+ pidgin_status_box_regenerate(status_box);
+}
+
+static void
spellcheck_prefs_cb(const char *name, PurplePrefType type,
gconstpointer value, gpointer data)
{
@@ -1514,6 +1521,56 @@ treeview_activate_current_selection(PidginStatusBox *status_box, GtkTreePath *pa
pidgin_status_box_changed(status_box);
}
+static void tree_view_delete_current_selection_cb(gpointer data)
+{
+ PurpleSavedStatus *saved;
+
+ saved = purple_savedstatus_find_by_creation_time(GPOINTER_TO_INT(data));
+ g_return_if_fail(saved != NULL);
+
+ if (purple_savedstatus_get_current() != saved)
+ purple_savedstatus_delete_by_status(saved);
+}
+
+static void
+tree_view_delete_current_selection(PidginStatusBox *status_box, GtkTreePath *path)
+{
+ GtkTreeIter iter;
+ gpointer data;
+ PurpleSavedStatus *saved;
+ gchar *msg;
+
+ if (status_box->active_row) {
+ /* don't delete active status */
+ if (gtk_tree_path_compare(path, gtk_tree_row_reference_get_path(status_box->active_row)) == 0)
+ return;
+ }
+
+ if (!gtk_tree_model_get_iter (GTK_TREE_MODEL(status_box->dropdown_store), &iter, path))
+ return;
+
+ gtk_tree_model_get(GTK_TREE_MODEL(status_box->dropdown_store), &iter,
+ DATA_COLUMN, &data,
+ -1);
+
+ saved = purple_savedstatus_find_by_creation_time(GPOINTER_TO_INT(data));
+ g_return_if_fail(saved != NULL);
+ if (saved == purple_savedstatus_get_current())
+ return;
+
+ msg = g_strdup_printf(_("Are you sure you want to delete %s?"), purple_savedstatus_get_title(saved));
+
+ purple_request_action(pidgin_status_get_handle(), NULL, msg, NULL, 0,
+ NULL, NULL, NULL,
+ data, 2,
+ _("Delete"), tree_view_delete_current_selection_cb,
+ _("Cancel"), NULL);
+
+ g_free(msg);
+
+ pidgin_status_box_popdown(status_box);
+}
+
static gboolean
treeview_button_release_cb(GtkWidget *widget, GdkEventButton *event, PidginStatusBox *status_box)
{
@@ -1561,18 +1618,23 @@ treeview_key_press_event(GtkWidget *widget,
if (event->keyval == GDK_Escape) {
pidgin_status_box_popdown(box);
return TRUE;
- } else if (event->keyval == GDK_Return) {
+ } else {
GtkTreeSelection *sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(box->tree_view));
GtkTreeIter iter;
GtkTreePath *path;
if (gtk_tree_selection_get_selected(sel, NULL, &iter)) {
path = gtk_tree_model_get_path(GTK_TREE_MODEL(box->dropdown_store), &iter);
- treeview_activate_current_selection(box, path);
+ if (event->keyval == GDK_Return) {
+ treeview_activate_current_selection(box, path);
+ } else if (event->keyval == GDK_Delete) {
+ tree_view_delete_current_selection(box, path);
+ }
+
gtk_tree_path_free (path);
return TRUE;
}
- }
+ }
}
return FALSE;
}
@@ -1742,6 +1804,15 @@ pidgin_status_box_init (PidginStatusBox *status_box)
status_box,
PURPLE_CALLBACK(current_savedstatus_changed_cb),
status_box);
+ purple_signal_connect(purple_savedstatuses_get_handle(),
+ "savedstatus-added", status_box,
+ PURPLE_CALLBACK(saved_status_updated_cb), status_box);
+ purple_signal_connect(purple_savedstatuses_get_handle(),
+ "savedstatus-deleted", status_box,
+ PURPLE_CALLBACK(saved_status_updated_cb), status_box);
+ purple_signal_connect(purple_savedstatuses_get_handle(),
+ "savedstatus-modified", status_box,
+ PURPLE_CALLBACK(saved_status_updated_cb), status_box);
purple_signal_connect(purple_accounts_get_handle(), "account-enabled", status_box,
PURPLE_CALLBACK(account_enabled_cb),
status_box);