changeset 14126:b71bfeaaed58

[gaim-migrate @ 16764] Add a savedstatus dialog, and a "status" command to bring it up. You an also select "Saved..." from the dropdown in the buddylist. The 'Add' and 'Edit' buttons don't do anything yet. They will probably get to work some time tomorrow. committer: Tailor Script <tailor@pidgin.im>
author Sadrul Habib Chowdhury <imadil@gmail.com>
date Tue, 15 Aug 2006 06:21:39 +0000
parents 7dfa024c1a4a
children 9a4b76c288aa
files console/Makefile console/gntblist.c console/gntconv.c console/gntstatus.c console/gntstatus.h console/libgnt/gnttree.c doc/gntgaim.1.in
diffstat 7 files changed, 179 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/console/Makefile	Tue Aug 15 04:07:38 2006 +0000
+++ b/console/Makefile	Tue Aug 15 06:21:39 2006 +0000
@@ -13,6 +13,7 @@
 	gntplugin.c \
 	gntprefs.c \
 	gntrequest.c \
+	gntstatus.c \
 	gntui.c
 
 GG_HEADERS = \
@@ -25,6 +26,7 @@
 	gntprefs.h \
 	gntplugin.h \
 	gntrequest.h \
+	gntstatus.h \
 	gntui.h
 
 GG_OBJECTS = \
@@ -37,6 +39,7 @@
 	gntplugin.o \
 	gntprefs.o \
 	gntrequest.o \
+	gntstatus.o \
 	gntui.o
 
 all: gntgaim
--- a/console/gntblist.c	Tue Aug 15 04:07:38 2006 +0000
+++ b/console/gntblist.c	Tue Aug 15 06:21:39 2006 +0000
@@ -17,6 +17,7 @@
 #include "gnttree.h"
 
 #include "gntblist.h"
+#include "gntstatus.h"
 #include <string.h>
 
 #define PREF_ROOT "/gaim/gnt/blist"
@@ -42,7 +43,8 @@
 typedef enum
 {
 	STATUS_PRIMITIVE = 0,
-	STATUS_SAVED
+	STATUS_SAVED_POPULAR,
+	STATUS_SAVED_ALL,
 } StatusType;
 
 typedef struct
@@ -1035,6 +1037,7 @@
 	int i;
 	GList *iter;
 	GList *items = NULL;
+	StatusBoxItem *item = NULL;
 
 	/* First the primitives */
 	GaimStatusPrimitive prims[] = {GAIM_STATUS_AVAILABLE, GAIM_STATUS_AWAY,
@@ -1042,7 +1045,7 @@
 
 	for (i = 0; prims[i] != GAIM_STATUS_UNSET; i++)
 	{
-		StatusBoxItem *item = g_new0(StatusBoxItem, 1);
+		item = g_new0(StatusBoxItem, 1);
 		item->type = STATUS_PRIMITIVE;
 		item->u.prim = prims[i];
 		items = g_list_prepend(items, item);
@@ -1053,18 +1056,26 @@
 	/* Now the popular statuses */
 	for (iter = gaim_savedstatuses_get_popular(6); iter; iter = iter->next)
 	{
-		StatusBoxItem *item = g_new0(StatusBoxItem, 1);
-		item->type = STATUS_SAVED;
+		item = g_new0(StatusBoxItem, 1);
+		item->type = STATUS_SAVED_POPULAR;
 		item->u.saved = iter->data;
 		items = g_list_prepend(items, item);
 		gnt_combo_box_add_data(GNT_COMBO_BOX(ggblist->status), item,
 				gaim_savedstatus_get_title(iter->data));
 	}
 
+	/* More savedstatuses */
+	item = g_new0(StatusBoxItem, 1);
+	item->type = STATUS_SAVED_ALL;
+	items = g_list_prepend(items, item);
+	gnt_combo_box_add_data(GNT_COMBO_BOX(ggblist->status), item,
+			_("Saved..."));
+
 	/* The keys for the combobox are created here, and never used
 	 * anywhere else. So make sure the keys are freed when the widget
 	 * is destroyed. */
-	g_object_set_data_full(G_OBJECT(ggblist->status), "list of statuses", items, (GDestroyNotify)destroy_status_list);
+	g_object_set_data_full(G_OBJECT(ggblist->status), "list of statuses",
+			items, (GDestroyNotify)destroy_status_list);
 }
 
 void gg_blist_init()
@@ -1125,7 +1136,7 @@
 status_selection_changed(GntComboBox *box, StatusBoxItem *old, StatusBoxItem *now, gpointer null)
 {
 	gnt_entry_set_text(GNT_ENTRY(ggblist->statustext), NULL);
-	if (now->type == STATUS_SAVED)
+	if (now->type == STATUS_SAVED_POPULAR)
 	{
 		/* Set the status immediately */
 		gaim_savedstatus_activate(now->u.saved);
@@ -1137,6 +1148,10 @@
 		gnt_box_move_focus(GNT_BOX(ggblist->window), 1);
 		ggblist->typing = g_timeout_add(TYPING_TIMEOUT, (GSourceFunc)remove_typing_cb, NULL);
 	}
+	else if (now->type == STATUS_SAVED_ALL)
+	{
+		gg_savedstatus_show_all();
+	}
 	else
 		g_return_if_reached();
 }
--- a/console/gntconv.c	Tue Aug 15 04:07:38 2006 +0000
+++ b/console/gntconv.c	Tue Aug 15 06:21:39 2006 +0000
@@ -11,6 +11,7 @@
 #include "gntdebug.h"
 #include "gntplugin.h"
 #include "gntprefs.h"
+#include "gntstatus.h"
 
 #include "gnt.h"
 #include "gntbox.h"
@@ -566,6 +567,9 @@
 	gaim_cmd_register("prefs", "", GAIM_CMD_P_DEFAULT,
 	                  GAIM_CMD_FLAG_CHAT | GAIM_CMD_FLAG_IM, NULL,
 	                  cmd_show_window, _("prefs: Show the preference window."), gg_prefs_show_all);
+	gaim_cmd_register("status", "", GAIM_CMD_P_DEFAULT,
+	                  GAIM_CMD_FLAG_CHAT | GAIM_CMD_FLAG_IM, NULL,
+	                  cmd_show_window, _("statuses: Show the savedstatuses window."), gg_savedstatus_show_all);
 }
 
 void gg_conversation_uninit()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/console/gntstatus.c	Tue Aug 15 06:21:39 2006 +0000
@@ -0,0 +1,139 @@
+#include <gnt.h>
+#include <gntbox.h>
+#include <gntbutton.h>
+#include <gntentry.h>
+#include <gntlabel.h>
+#include <gnttree.h>
+
+#include <request.h>
+
+#include "gntgaim.h"
+#include "gntstatus.h"
+
+static struct
+{
+	GntWidget *window;
+	GntWidget *tree;
+} statuses;
+
+static void
+reset_status_window(GntWidget *widget, gpointer null)
+{
+	statuses.window = NULL;
+	statuses.tree = NULL;
+}
+
+static void
+populate_statuses(GntTree *tree)
+{
+	const GList *list;
+
+	for (list = gaim_savedstatuses_get_all(); list; list = list->next)
+	{
+		GaimSavedStatus *saved = list->data;
+		const char *title, *type, *message;
+
+		if (gaim_savedstatus_is_transient(saved))
+			continue;
+
+		title = gaim_savedstatus_get_title(saved);
+		type = gaim_primitive_get_name_from_type(gaim_savedstatus_get_type(saved));
+		message = gaim_savedstatus_get_message(saved);  /* XXX: Strip possible markups */
+
+		gnt_tree_add_row_last(tree, saved,
+				gnt_tree_create_row(tree, title, type, message), NULL);
+	}
+}
+
+static void
+really_delete_status(GaimSavedStatus *saved)
+{
+	/* XXX: Close any modify dialog opened for the savedstatus */
+	if (statuses.tree)
+		gnt_tree_remove(GNT_TREE(statuses.tree), saved);
+
+	gaim_savedstatus_delete(gaim_savedstatus_get_title(saved));
+}
+
+static void
+ask_before_delete(GntWidget *button, gpointer null)
+{
+	char *ask;
+	GaimSavedStatus *saved;
+
+	g_return_if_fail(statuses.tree != NULL);
+
+	saved = gnt_tree_get_selection_data(GNT_TREE(statuses.tree));
+	ask = g_strdup_printf(_("Are you sure you want to delete \"%s\""),
+			gaim_savedstatus_get_title(saved));
+
+	gaim_request_action(saved, _("Delete Status"), ask, NULL, 0, saved, 2,
+			_("Delete"), really_delete_status, _("Cancel"), NULL);
+	g_free(ask);
+}
+
+static void
+use_savedstatus_cb(GntWidget *widget, gpointer null)
+{
+	g_return_if_fail(statuses.tree != NULL);
+
+	gaim_savedstatus_activate(gnt_tree_get_selection_data(GNT_TREE(statuses.tree)));
+}
+
+void gg_savedstatus_show_all()
+{
+	GntWidget *window, *tree, *box, *button;
+	if (statuses.window)
+		return;
+
+	statuses.window = window = gnt_vbox_new(FALSE);
+	gnt_box_set_toplevel(GNT_BOX(window), TRUE);
+	gnt_box_set_title(GNT_BOX(window), _("Saved Statuses"));
+	gnt_box_set_fill(GNT_BOX(window), FALSE);
+	gnt_box_set_alignment(GNT_BOX(window), GNT_ALIGN_MID);
+	gnt_box_set_pad(GNT_BOX(window), 0);
+
+	/* XXX: Add some sorting function to sort alphabetically, perhaps */
+	statuses.tree = tree = gnt_tree_new_with_columns(3);
+	gnt_tree_set_column_titles(GNT_TREE(tree), _("Title"), _("Type"), _("Message"));
+	gnt_tree_set_show_title(GNT_TREE(tree), TRUE);
+	gnt_tree_set_col_width(GNT_TREE(tree), 0, 25);
+	gnt_tree_set_col_width(GNT_TREE(tree), 1, 12);
+	gnt_tree_set_col_width(GNT_TREE(tree), 2, 35);
+	gnt_box_add_widget(GNT_BOX(window), tree);
+
+	populate_statuses(GNT_TREE(tree));
+
+	box = gnt_hbox_new(FALSE);
+	gnt_box_add_widget(GNT_BOX(window), box);
+
+	button = gnt_button_new(_("Use"));
+	gnt_box_add_widget(GNT_BOX(box), button);
+	g_signal_connect(G_OBJECT(button), "activate",
+			G_CALLBACK(use_savedstatus_cb), NULL);
+
+	button = gnt_button_new(_("Add"));
+	gnt_box_add_widget(GNT_BOX(box), button);
+
+	button = gnt_button_new(_("Edit"));
+	gnt_box_add_widget(GNT_BOX(box), button);
+
+	button = gnt_button_new(_("Delete"));
+	gnt_box_add_widget(GNT_BOX(box), button);
+	g_signal_connect(G_OBJECT(button), "activate",
+			G_CALLBACK(ask_before_delete), NULL);
+
+	button = gnt_button_new(_("Close"));
+	gnt_box_add_widget(GNT_BOX(box), button);
+	g_signal_connect_swapped(G_OBJECT(button), "activate",
+			G_CALLBACK(gnt_widget_destroy), window);
+
+	g_signal_connect(G_OBJECT(window), "destroy",
+			G_CALLBACK(reset_status_window), NULL);
+	gnt_widget_show(window);
+}
+
+void gg_savedstatus_edit(GaimSavedStatus *saved)
+{
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/console/gntstatus.h	Tue Aug 15 06:21:39 2006 +0000
@@ -0,0 +1,7 @@
+#include <status.h>
+#include <savedstatuses.h>
+
+void gg_savedstatus_show_all();
+
+void gg_savedstatus_edit(GaimSavedStatus *saved);
+
--- a/console/libgnt/gnttree.c	Tue Aug 15 04:07:38 2006 +0000
+++ b/console/libgnt/gnttree.c	Tue Aug 15 06:21:39 2006 +0000
@@ -274,7 +274,7 @@
 		int x = pos;
 
 		mvwhline(widget->window, pos + 1, pos, ACS_HLINE | COLOR_PAIR(GNT_COLOR_NORMAL),
-				widget->priv.width - pos);
+				widget->priv.width - pos - 1);
 		
 		for (i = 0; i < tree->ncol; i++)
 		{
--- a/doc/gntgaim.1.in	Tue Aug 15 04:07:38 2006 +0000
+++ b/doc/gntgaim.1.in	Tue Aug 15 06:21:39 2006 +0000
@@ -169,6 +169,10 @@
 .B prefs
 for the preferences window.
 
+.TP
+.B status
+for the status window.
+
 .SH BUGS
 Known bugs are listed at
 .br