[prev in list] [next in list] [prev in thread] [next in thread]
List: freeciv-dev
Subject: [Freeciv-Dev] (PR#40718) [Patch] Option to prepend message window
From: "Madeline Book" <madeline.book () gmail ! com>
Date: 2009-02-19 2:44:29
Message-ID: 200902190244.n1J2iTw0020747 () rt ! freeciv ! org
[Download RAW message or body]
[Attachment #2 (text/plain)]
<URL: http://bugs.freeciv.org/Ticket/Display.html?id=40718 >
> [book - Sat Feb 14 03:33:57 2009]:
>
> Patch implements a gui option to have new message events
> appear at the top of the message window list, rather than
> being added to the bottom (where they might be missed by
> the user).
Version 2 to satisfy patch order dependencies.
-----------------------------------------------------------------------
この体が食べ物に依存しているのは残念です。
["S2_1-message_window_prepend_option_v2.patch" (text/x-diff)]
client/gui-gtk-2.0/gui_main.c | 7 ++
client/gui-gtk-2.0/gui_main.h | 1 +
client/gui-gtk-2.0/messagewin.c | 156 +++++++++++++++++++++-----------------
3 files changed, 94 insertions(+), 70 deletions(-)
diff --git a/client/gui-gtk-2.0/gui_main.c b/client/gui-gtk-2.0/gui_main.c
index 5b270e3..abea9ef 100644
--- a/client/gui-gtk-2.0/gui_main.c
+++ b/client/gui-gtk-2.0/gui_main.c
@@ -96,6 +96,7 @@ bool enable_tabs = TRUE;
bool better_fog = TRUE;
bool show_chat_message_time = FALSE;
bool split_bottom_notebook = FALSE;
+bool new_messages_go_to_top = FALSE;
bool metaserver_tab_first = FALSE;
GtkWidget *toplevel;
@@ -198,6 +199,12 @@ client_option gui_options[] = {
"notebook into a left and right notebook so that "
"two tabs may be viewed at once."),
COC_INTERFACE, split_bottom_notebook_callback),
+ GEN_BOOL_OPTION(new_messages_go_to_top,
+ N_("New message events go to top of list"),
+ N_("If this option is enabled, new events in the "
+ "message window will appear at the top of the list, "
+ "rather than being appended at the bottom."),
+ COC_INTERFACE),
GEN_BOOL_OPTION(metaserver_tab_first,
N_("Metaserver tab first in network page"),
N_("If this option is enabled, the metaserver tab will "
diff --git a/client/gui-gtk-2.0/gui_main.h b/client/gui-gtk-2.0/gui_main.h
index c52ce86..96c0dc2 100644
--- a/client/gui-gtk-2.0/gui_main.h
+++ b/client/gui-gtk-2.0/gui_main.h
@@ -28,6 +28,7 @@ extern bool enable_tabs;
extern bool better_fog;
extern bool show_chat_message_time;
extern bool split_bottom_notebook;
+extern bool new_messages_go_to_top;
extern bool metaserver_tab_first;
extern GdkGC * civ_gc;
diff --git a/client/gui-gtk-2.0/messagewin.c b/client/gui-gtk-2.0/messagewin.c
index 8697557..5fe7c37 100644
--- a/client/gui-gtk-2.0/messagewin.c
+++ b/client/gui-gtk-2.0/messagewin.c
@@ -98,27 +98,17 @@ bool is_meswin_open(void)
/****************************************************************
...
*****************************************************************/
-static void meswin_visited_item(gint n)
+static void meswin_set_visited(GtkTreeIter *it, bool visited)
{
- GtkTreeIter it;
-
- if (gtk_tree_model_iter_nth_child(GTK_TREE_MODEL(meswin_store),&it,NULL,n)) {
- gtk_list_store_set(meswin_store, &it, 1, (gint)TRUE, -1);
- set_message_visited_state(n, TRUE);
- }
-}
+ GtkListStore *store;
+ gint row;
-/****************************************************************
-...
-*****************************************************************/
-static void meswin_not_visited_item(gint n)
-{
- GtkTreeIter it;
+ store = meswin_store;
+ g_return_if_fail(store != NULL);
- if (gtk_tree_model_iter_nth_child(GTK_TREE_MODEL(meswin_store),&it,NULL,n)) {
- gtk_list_store_set(meswin_store, &it, 1, (gint)FALSE, -1);
- set_message_visited_state(n, FALSE);
- }
+ gtk_list_store_set(store, it, 1, visited, -1);
+ gtk_tree_model_get(GTK_TREE_MODEL(store), it, 2, &row, -1);
+ set_message_visited_state(row, visited);
}
/****************************************************************
@@ -152,8 +142,12 @@ static gboolean meswin_button_press_callback(GtkWidget *widget,
gpointer data)
{
GtkTreePath *path = NULL;
+ GtkTreeModel *model;
+ GtkTreeIter iter;
gint row;
+ g_return_val_if_fail(GTK_IS_TREE_VIEW(widget), FALSE);
+
if (ev->type != GDK_BUTTON_PRESS || ev->button != 3) {
return FALSE;
}
@@ -164,11 +158,13 @@ static gboolean meswin_button_press_callback(GtkWidget *widget,
return TRUE;
}
- row = gtk_tree_path_get_indices(path)[0];
+ model = gtk_tree_view_get_model(GTK_TREE_VIEW(widget));
+ if (gtk_tree_model_get_iter(model, &iter, path)) {
+ gtk_tree_model_get(model, &iter, 2, &row, -1);
+ meswin_goto(row);
+ }
gtk_tree_path_free(path);
- meswin_goto(row);
-
return TRUE;
}
@@ -189,7 +185,9 @@ static void create_meswin_dialog(void)
gui_dialog_new(&meswin_shell, GTK_NOTEBOOK(notebook), NULL);
gui_dialog_set_title(meswin_shell, _("Messages"));
- meswin_store = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_BOOLEAN);
+ meswin_store = gtk_list_store_new(3, G_TYPE_STRING,
+ G_TYPE_BOOLEAN,
+ G_TYPE_INT);
sw = gtk_scrolled_window_new(NULL, NULL);
gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(sw),
@@ -242,25 +240,29 @@ static void create_meswin_dialog(void)
**************************************************************************/
void real_update_meswin_dialog(void)
{
- int i, num = get_num_messages(), num_not_visited = 0;
+ int i, num, num_not_visited = 0;
+ struct message *pmsg;
+ GtkListStore *store;
GtkTreeIter it;
- gtk_list_store_clear(meswin_store);
+ store = meswin_store;
+ g_return_if_fail(store != NULL);
- for (i = 0; i < num; i++) {
- GValue value = { 0, };
-
- gtk_list_store_append(meswin_store, &it);
+ gtk_list_store_clear(store);
+ num = get_num_messages();
- g_value_init(&value, G_TYPE_STRING);
- g_value_set_static_string(&value, get_message(i)->descr);
- gtk_list_store_set_value(meswin_store, &it, 0, &value);
- g_value_unset(&value);
+ for (i = 0; i < num; i++) {
+ pmsg = get_message(i);
- if (get_message(i)->visited) {
- meswin_visited_item(i);
+ if (new_messages_go_to_top) {
+ gtk_list_store_prepend(store, &it);
} else {
- meswin_not_visited_item(i);
+ gtk_list_store_append(store, &it);
+ }
+ gtk_list_store_set(store, &it, 0, pmsg->descr, 2, i, -1);
+ meswin_set_visited(&it, pmsg->visited);
+
+ if (!pmsg->visited) {
num_not_visited++;
}
}
@@ -279,15 +281,23 @@ void real_update_meswin_dialog(void)
static void meswin_selection_callback(GtkTreeSelection *selection,
gpointer data)
{
- gint row = gtk_tree_selection_get_row(selection);
+ struct message *pmsg;
+ GtkTreeIter iter;
+ GtkTreeModel *model;
+ gint row;
- if (row != -1) {
- struct message *message = get_message(row);
+ if (!gtk_tree_selection_get_selected(selection, &model, &iter)) {
+ return;
+ }
+ gtk_tree_model_get(model, &iter, 2, &row, -1);
+ pmsg = get_message(row);
+
+ if (pmsg) {
gui_dialog_set_response_sensitive(meswin_shell, CMD_GOTO,
- message->location_ok);
+ pmsg->location_ok);
gui_dialog_set_response_sensitive(meswin_shell, CMD_POPCITY,
- message->city_ok);
+ pmsg->city_ok);
}
}
@@ -299,16 +309,26 @@ static void meswin_row_activated_callback(GtkTreeView *view,
GtkTreeViewColumn *col,
gpointer data)
{
- gint row = gtk_tree_path_get_indices(path)[0];
- struct message *message = get_message(row);
+ struct message *pmsg;
+ GtkTreeModel *model;
+ GtkTreeIter iter;
+ gint row;
+
+ model = gtk_tree_view_get_model(view);
+ if (!gtk_tree_model_get_iter(model, &iter, path)) {
+ return;
+ }
+
+ gtk_tree_model_get(model, &iter, 2, &row, -1);
+ pmsg = get_message(row);
meswin_double_click(row);
- meswin_visited_item(row);
+ meswin_set_visited(&iter, TRUE);
gui_dialog_set_response_sensitive(meswin_shell, CMD_GOTO,
- message->location_ok);
+ pmsg->location_ok);
gui_dialog_set_response_sensitive(meswin_shell, CMD_POPCITY,
- message->city_ok);
+ pmsg->city_ok);
}
/**************************************************************************
@@ -317,33 +337,29 @@ static void meswin_row_activated_callback(GtkTreeView *view,
static void meswin_response_callback(struct gui_dialog *dlg, int response,
gpointer data)
{
- switch (response) {
- case CMD_GOTO:
- {
- gint row = gtk_tree_selection_get_row(meswin_selection);
-
- if (row == -1) {
- return;
- }
+ GtkTreeSelection *sel;
+ GtkTreeModel *model;
+ GtkTreeIter iter;
+ gint row;
- meswin_goto(row);
- meswin_visited_item(row);
- }
- break;
- case CMD_POPCITY:
- {
- gint row = gtk_tree_selection_get_row(meswin_selection);
-
- if (row == -1) {
- return;
- }
- meswin_popup_city(row);
- meswin_visited_item(row);
- }
- break;
- default:
+ if (response != CMD_GOTO && response != CMD_POPCITY) {
gui_dialog_destroy(dlg);
- break;
+ return;
+ }
+
+ sel = meswin_selection;
+ g_return_if_fail(sel != NULL);
+ if (!gtk_tree_selection_get_selected(sel, &model, &iter)) {
+ return;
+ }
+
+ gtk_tree_model_get(model, &iter, 2, &row, -1);
+
+ if (response == CMD_GOTO) {
+ meswin_goto(row);
+ } else {
+ meswin_popup_city(row);
}
+ meswin_set_visited(&iter, TRUE);
}
["trunk-message_window_prepend_option_v2.patch" (text/x-diff)]
client/gui-gtk-2.0/gui_main.c | 7 ++
client/gui-gtk-2.0/gui_main.h | 1 +
client/gui-gtk-2.0/messagewin.c | 156 +++++++++++++++++++++-----------------
3 files changed, 94 insertions(+), 70 deletions(-)
diff --git a/client/gui-gtk-2.0/gui_main.c b/client/gui-gtk-2.0/gui_main.c
index 6840df0..b4c6a36 100644
--- a/client/gui-gtk-2.0/gui_main.c
+++ b/client/gui-gtk-2.0/gui_main.c
@@ -99,6 +99,7 @@ bool enable_tabs = TRUE;
bool better_fog = TRUE;
bool show_chat_message_time = FALSE;
bool split_bottom_notebook = FALSE;
+bool new_messages_go_to_top = FALSE;
bool metaserver_tab_first = FALSE;
GtkWidget *toplevel;
@@ -217,6 +218,12 @@ client_option gui_options[] = {
"notebook into a left and right notebook so that "
"two tabs may be viewed at once."),
COC_INTERFACE, split_bottom_notebook_callback),
+ GEN_BOOL_OPTION(new_messages_go_to_top,
+ N_("New message events go to top of list"),
+ N_("If this option is enabled, new events in the "
+ "message window will appear at the top of the list, "
+ "rather than being appended at the bottom."),
+ COC_INTERFACE),
GEN_BOOL_OPTION(metaserver_tab_first,
N_("Metaserver tab first in network page"),
N_("If this option is enabled, the metaserver tab will "
diff --git a/client/gui-gtk-2.0/gui_main.h b/client/gui-gtk-2.0/gui_main.h
index e587768..5fac954 100644
--- a/client/gui-gtk-2.0/gui_main.h
+++ b/client/gui-gtk-2.0/gui_main.h
@@ -28,6 +28,7 @@ extern bool enable_tabs;
extern bool better_fog;
extern bool show_chat_message_time;
extern bool split_bottom_notebook;
+extern bool new_messages_go_to_top;
extern bool metaserver_tab_first;
extern GdkGC * civ_gc;
diff --git a/client/gui-gtk-2.0/messagewin.c b/client/gui-gtk-2.0/messagewin.c
index 466039c..2c08667 100644
--- a/client/gui-gtk-2.0/messagewin.c
+++ b/client/gui-gtk-2.0/messagewin.c
@@ -97,27 +97,17 @@ bool is_meswin_open(void)
/****************************************************************
...
*****************************************************************/
-static void meswin_visited_item(gint n)
+static void meswin_set_visited(GtkTreeIter *it, bool visited)
{
- GtkTreeIter it;
-
- if (gtk_tree_model_iter_nth_child(GTK_TREE_MODEL(meswin_store),&it,NULL,n)) {
- gtk_list_store_set(meswin_store, &it, 1, (gint)TRUE, -1);
- set_message_visited_state(n, TRUE);
- }
-}
+ GtkListStore *store;
+ gint row;
-/****************************************************************
-...
-*****************************************************************/
-static void meswin_not_visited_item(gint n)
-{
- GtkTreeIter it;
+ store = meswin_store;
+ g_return_if_fail(store != NULL);
- if (gtk_tree_model_iter_nth_child(GTK_TREE_MODEL(meswin_store),&it,NULL,n)) {
- gtk_list_store_set(meswin_store, &it, 1, (gint)FALSE, -1);
- set_message_visited_state(n, FALSE);
- }
+ gtk_list_store_set(store, it, 1, visited, -1);
+ gtk_tree_model_get(GTK_TREE_MODEL(store), it, 2, &row, -1);
+ set_message_visited_state(row, visited);
}
/****************************************************************
@@ -151,8 +141,12 @@ static gboolean meswin_button_press_callback(GtkWidget *widget,
gpointer data)
{
GtkTreePath *path = NULL;
+ GtkTreeModel *model;
+ GtkTreeIter iter;
gint row;
+ g_return_val_if_fail(GTK_IS_TREE_VIEW(widget), FALSE);
+
if (ev->type != GDK_BUTTON_PRESS || ev->button != 3) {
return FALSE;
}
@@ -163,11 +157,13 @@ static gboolean meswin_button_press_callback(GtkWidget *widget,
return TRUE;
}
- row = gtk_tree_path_get_indices(path)[0];
+ model = gtk_tree_view_get_model(GTK_TREE_VIEW(widget));
+ if (gtk_tree_model_get_iter(model, &iter, path)) {
+ gtk_tree_model_get(model, &iter, 2, &row, -1);
+ meswin_goto(row);
+ }
gtk_tree_path_free(path);
- meswin_goto(row);
-
return TRUE;
}
@@ -188,7 +184,9 @@ static void create_meswin_dialog(void)
gui_dialog_new(&meswin_shell, GTK_NOTEBOOK(notebook), NULL);
gui_dialog_set_title(meswin_shell, _("Messages"));
- meswin_store = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_BOOLEAN);
+ meswin_store = gtk_list_store_new(3, G_TYPE_STRING,
+ G_TYPE_BOOLEAN,
+ G_TYPE_INT);
sw = gtk_scrolled_window_new(NULL, NULL);
gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(sw),
@@ -241,25 +239,29 @@ static void create_meswin_dialog(void)
**************************************************************************/
void real_update_meswin_dialog(void)
{
- int i, num = get_num_messages(), num_not_visited = 0;
+ int i, num, num_not_visited = 0;
+ struct message *pmsg;
+ GtkListStore *store;
GtkTreeIter it;
- gtk_list_store_clear(meswin_store);
+ store = meswin_store;
+ g_return_if_fail(store != NULL);
- for (i = 0; i < num; i++) {
- GValue value = { 0, };
-
- gtk_list_store_append(meswin_store, &it);
+ gtk_list_store_clear(store);
+ num = get_num_messages();
- g_value_init(&value, G_TYPE_STRING);
- g_value_set_static_string(&value, get_message(i)->descr);
- gtk_list_store_set_value(meswin_store, &it, 0, &value);
- g_value_unset(&value);
+ for (i = 0; i < num; i++) {
+ pmsg = get_message(i);
- if (get_message(i)->visited) {
- meswin_visited_item(i);
+ if (new_messages_go_to_top) {
+ gtk_list_store_prepend(store, &it);
} else {
- meswin_not_visited_item(i);
+ gtk_list_store_append(store, &it);
+ }
+ gtk_list_store_set(store, &it, 0, pmsg->descr, 2, i, -1);
+ meswin_set_visited(&it, pmsg->visited);
+
+ if (!pmsg->visited) {
num_not_visited++;
}
}
@@ -278,15 +280,23 @@ void real_update_meswin_dialog(void)
static void meswin_selection_callback(GtkTreeSelection *selection,
gpointer data)
{
- gint row = gtk_tree_selection_get_row(selection);
+ struct message *pmsg;
+ GtkTreeIter iter;
+ GtkTreeModel *model;
+ gint row;
- if (row != -1) {
- struct message *message = get_message(row);
+ if (!gtk_tree_selection_get_selected(selection, &model, &iter)) {
+ return;
+ }
+ gtk_tree_model_get(model, &iter, 2, &row, -1);
+ pmsg = get_message(row);
+
+ if (pmsg) {
gui_dialog_set_response_sensitive(meswin_shell, CMD_GOTO,
- message->location_ok);
+ pmsg->location_ok);
gui_dialog_set_response_sensitive(meswin_shell, CMD_POPCITY,
- message->city_ok);
+ pmsg->city_ok);
}
}
@@ -298,16 +308,26 @@ static void meswin_row_activated_callback(GtkTreeView *view,
GtkTreeViewColumn *col,
gpointer data)
{
- gint row = gtk_tree_path_get_indices(path)[0];
- struct message *message = get_message(row);
+ struct message *pmsg;
+ GtkTreeModel *model;
+ GtkTreeIter iter;
+ gint row;
+
+ model = gtk_tree_view_get_model(view);
+ if (!gtk_tree_model_get_iter(model, &iter, path)) {
+ return;
+ }
+
+ gtk_tree_model_get(model, &iter, 2, &row, -1);
+ pmsg = get_message(row);
meswin_double_click(row);
- meswin_visited_item(row);
+ meswin_set_visited(&iter, TRUE);
gui_dialog_set_response_sensitive(meswin_shell, CMD_GOTO,
- message->location_ok);
+ pmsg->location_ok);
gui_dialog_set_response_sensitive(meswin_shell, CMD_POPCITY,
- message->city_ok);
+ pmsg->city_ok);
}
/**************************************************************************
@@ -316,33 +336,29 @@ static void meswin_row_activated_callback(GtkTreeView *view,
static void meswin_response_callback(struct gui_dialog *dlg, int response,
gpointer data)
{
- switch (response) {
- case CMD_GOTO:
- {
- gint row = gtk_tree_selection_get_row(meswin_selection);
-
- if (row == -1) {
- return;
- }
+ GtkTreeSelection *sel;
+ GtkTreeModel *model;
+ GtkTreeIter iter;
+ gint row;
- meswin_goto(row);
- meswin_visited_item(row);
- }
- break;
- case CMD_POPCITY:
- {
- gint row = gtk_tree_selection_get_row(meswin_selection);
-
- if (row == -1) {
- return;
- }
- meswin_popup_city(row);
- meswin_visited_item(row);
- }
- break;
- default:
+ if (response != CMD_GOTO && response != CMD_POPCITY) {
gui_dialog_destroy(dlg);
- break;
+ return;
+ }
+
+ sel = meswin_selection;
+ g_return_if_fail(sel != NULL);
+ if (!gtk_tree_selection_get_selected(sel, &model, &iter)) {
+ return;
+ }
+
+ gtk_tree_model_get(model, &iter, 2, &row, -1);
+
+ if (response == CMD_GOTO) {
+ meswin_goto(row);
+ } else {
+ meswin_popup_city(row);
}
+ meswin_set_visited(&iter, TRUE);
}
_______________________________________________
Freeciv-dev mailing list
Freeciv-dev@gna.org
https://mail.gna.org/listinfo/freeciv-dev
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic