[Freeciv-Dev] (PR#3712) City choose production dialog
[Top] [All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index] [Thread Index]
<URL: http://rt.freeciv.org/Ticket/Display.html?id=3712 >
> [vasc - Thu Apr 01 22:16:35 2004]:
>
> > [vasc - Thu Apr 01 21:24:53 2004]:
> > Even better, add icons instead. It would still be nice to make redundant
> > buildings and obsolete wonders be displayed differently, say, using an
> > italic font. This patch adds icon support.
>
> In this one, the redundant buildings and obsolete wonders should be
> displayed with strikethrough text. I also made the cell height constant,
> rather than the height of each icon.
After some more playtesting, I found a NULL pointer unreferencing bug.
This version has that fixed.
Index: client/gui-gtk-2.0/graphics.c
===================================================================
RCS file: /home/freeciv/CVS/freeciv/client/gui-gtk-2.0/graphics.c,v
retrieving revision 1.24
diff -u -r1.24 graphics.c
--- client/gui-gtk-2.0/graphics.c 24 Mar 2004 06:18:18 -0000 1.24
+++ client/gui-gtk-2.0/graphics.c 1 Apr 2004 22:39:08 -0000
@@ -382,7 +382,7 @@
/***************************************************************************
...
***************************************************************************/
-void create_overlay_unit(GtkWidget *pixcomm, int i)
+void create_overlay_unit(struct canvas *pcanvas, int i)
{
enum color_std bg_color;
@@ -394,23 +394,23 @@
case AIR_MOVING: bg_color = COLOR_STD_CYAN; break;
default: bg_color = COLOR_STD_BLACK; break;
}
- gtk_pixcomm_freeze(GTK_PIXCOMM(pixcomm));
- gtk_pixcomm_fill(GTK_PIXCOMM(pixcomm), colors_standard[bg_color]);
+ canvas_put_rectangle(pcanvas, bg_color,
+ 0, 0, UNIT_TILE_WIDTH, UNIT_TILE_HEIGHT);
+
/* If we're using flags, put one on the tile */
if(!solid_color_behind_units) {
struct Sprite *flag=get_nation_by_plr(game.player_ptr)->flag_sprite;
- gtk_pixcomm_copyto(GTK_PIXCOMM(pixcomm), flag, 0, 0);
+ canvas_put_sprite_full(pcanvas, 0, 0, flag);
}
/* Finally, put a picture of the unit in the tile */
if(i<game.num_unit_types) {
struct Sprite *s=get_unit_type(i)->sprite;
- gtk_pixcomm_copyto(GTK_PIXCOMM(pixcomm), s, 0, 0);
+ canvas_put_sprite_full(pcanvas, 0, 0, s);
}
- gtk_pixcomm_thaw(GTK_PIXCOMM(pixcomm));
}
/***************************************************************************
Index: client/gui-gtk-2.0/graphics.h
===================================================================
RCS file: /home/freeciv/CVS/freeciv/client/gui-gtk-2.0/graphics.h,v
retrieving revision 1.7
diff -u -r1.7 graphics.h
--- client/gui-gtk-2.0/graphics.h 19 Jul 2003 02:04:30 -0000 1.7
+++ client/gui-gtk-2.0/graphics.h 1 Apr 2004 22:39:08 -0000
@@ -16,6 +16,7 @@
#include <gtk/gtk.h>
#include "graphics_g.h"
+#include "mapview_common.h"
struct Sprite
{
@@ -30,7 +31,7 @@
typedef struct Sprite SPRITE;
-void create_overlay_unit (GtkWidget *pixcomm, int i);
+void create_overlay_unit(struct canvas *pcanvas, int i);
extern SPRITE * intro_gfx_sprite;
extern SPRITE * radar_gfx_sprite;
Index: client/gui-gtk-2.0/helpdlg.c
===================================================================
RCS file: /home/freeciv/CVS/freeciv/client/gui-gtk-2.0/helpdlg.c,v
retrieving revision 1.28
diff -u -r1.28 helpdlg.c
--- client/gui-gtk-2.0/helpdlg.c 25 Feb 2004 20:09:50 -0000 1.28
+++ client/gui-gtk-2.0/helpdlg.c 1 Apr 2004 22:39:11 -0000
@@ -800,8 +800,15 @@
gtk_text_buffer_set_text(help_text, buf, -1);
gtk_widget_show(help_text_sw);
- create_overlay_unit(unit_tile
- , i);
+ gtk_pixcomm_freeze(GTK_PIXCOMM(unit_tile));
+ {
+ struct canvas store;
+
+ store.type = CANVAS_PIXCOMM;
+ store.v.pixcomm = GTK_PIXCOMM(unit_tile);
+ create_overlay_unit(&store, i);
+ }
+ gtk_pixcomm_thaw(GTK_PIXCOMM(unit_tile));
gtk_widget_show(unit_tile);
}
else {
Index: client/gui-gtk-2.0/mapview.c
===================================================================
RCS file: /home/freeciv/CVS/freeciv/client/gui-gtk-2.0/mapview.c,v
retrieving revision 1.112
diff -u -r1.112 mapview.c
--- client/gui-gtk-2.0/mapview.c 31 Mar 2004 18:42:45 -0000 1.112
+++ client/gui-gtk-2.0/mapview.c 1 Apr 2004 22:39:11 -0000
@@ -794,7 +794,8 @@
break;
case CANVAS_PIXBUF:
gdk_pixbuf_fill(pcanvas->v.pixbuf,
- col->red >> 24 | col->green >> 16 | col->blue >> 8 | 0xFF);
+ ((guint32)(col->red & 0xff00) << 16)
+ | ((col->green & 0xff00) << 8) | (col->blue & 0xff00) | 0xff);
break;
default:
break;
Index: client/gui-gtk-2.0/wldlg.c
===================================================================
RCS file: /home/freeciv/CVS/freeciv/client/gui-gtk-2.0/wldlg.c,v
retrieving revision 1.28
diff -u -r1.28 wldlg.c
--- client/gui-gtk-2.0/wldlg.c 23 Nov 2003 18:56:57 -0000 1.28
+++ client/gui-gtk-2.0/wldlg.c 1 Apr 2004 22:39:11 -0000
@@ -37,6 +37,7 @@
#include "climisc.h"
#include "clinet.h"
#include "options.h"
+#include "tilespec.h"
#include "wldlg.h"
#include "citydlg.h"
@@ -777,27 +778,107 @@
GtkTreeModel *model, GtkTreeIter *it,
gpointer data)
{
- struct city **pcity;
- gint column;
- char *row[4];
- char buf[4][64];
- gint cid;
- int i;
- bool is_unit;
+ gint cid, id;
+ bool is_unit;
- pcity = (struct city **) data;
- column = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(rend), "column"));
+ gtk_tree_model_get(model, it, 0, &cid, -1);
+ is_unit = cid_is_unit(cid);
+ id = cid_id(cid);
+
+ if (GTK_IS_CELL_RENDERER_PIXBUF(rend)) {
+ GdkPixbuf *pix;
+
+ if (is_unit) {
+ struct canvas store;
- for (i = 0; i < ARRAY_SIZE(row); i++) {
- row[i] = buf[i];
+ pix = gdk_pixbuf_new(GDK_COLORSPACE_RGB, TRUE, 8,
+ UNIT_TILE_WIDTH, UNIT_TILE_HEIGHT);
+
+ store.type = CANVAS_PIXBUF;
+ store.v.pixbuf = pix;
+ create_overlay_unit(&store, id);
+
+ g_object_set(rend, "pixbuf", pix, NULL);
+ g_object_unref(pix);
+ } else {
+ struct impr_type *impr = get_improvement_type(id);
+
+ pix = sprite_get_pixbuf(impr->sprite);
+ g_object_set(rend, "pixbuf", pix, NULL);
+ }
+ } else {
+ struct city **pcity;
+ struct player *plr;
+ gint column;
+ char *row[4];
+ char buf[4][64];
+ int i;
+ gboolean useless;
+
+ pcity = (struct city **) data;
+
+ for (i = 0; i < ARRAY_SIZE(row); i++) {
+ row[i] = buf[i];
+ }
+ column = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(rend), "column"));
+
+ get_city_dialog_production_row(row, sizeof(buf[0]), id, is_unit, *pcity);
+ g_object_set(rend, "text", row[column], NULL);
+
+ if (*pcity) {
+ plr = city_owner(*pcity);
+ useless = improvement_obsolete(plr, id)
+ || improvement_redundant(plr, *pcity, id, FALSE);
+ g_object_set(rend, "strikethrough", useless, NULL);
+ }
}
+}
- gtk_tree_model_get(model, it, 0, &cid, -1);
- is_unit = cid_is_unit(cid);
+/****************************************************************
+...
+*****************************************************************/
+static void populate_view(GtkTreeView *view, struct city **ppcity,
+ GtkTreeViewColumn **pcol)
+{
+ static char *titles[] =
+ { N_("Type"), N_("Name"), N_("Info"), N_("Cost"), N_("Turns") };
+
+ static bool titles_done;
+ gint i;
- get_city_dialog_production_row(row, sizeof(buf[0]), cid_id(cid),
- is_unit, *pcity);
- g_object_set(rend, "text", row[column], NULL);
+
+ intl_slist(ARRAY_SIZE(titles), titles, &titles_done);
+
+ for (i = 0; i < ARRAY_SIZE(titles); i++) {
+ GtkCellRenderer *rend;
+ GtkTreeViewColumn *col;
+
+ if (i == 0) {
+ rend = gtk_cell_renderer_pixbuf_new();
+
+ gtk_tree_view_insert_column_with_data_func(view,
+ i, titles[i], rend, cell_render_func, ppcity, NULL);
+ } else {
+ gint pos = i-1;
+
+ rend = gtk_cell_renderer_text_new();
+ g_object_set_data(G_OBJECT(rend), "column", GINT_TO_POINTER(pos));
+
+ gtk_tree_view_insert_column_with_data_func(view,
+ i, titles[i], rend, cell_render_func, ppcity, NULL);
+ col = gtk_tree_view_get_column(view, i);
+
+ if (pos >= 2) {
+ g_object_set(G_OBJECT(rend), "xalign", 1.0, NULL);
+ gtk_tree_view_column_set_alignment(col, 1.0);
+ }
+
+ if (pos == 3) {
+ *pcol = col;
+ }
+ }
+ g_object_set(rend, "height", UNIT_TILE_HEIGHT, NULL);
+ }
}
/****************************************************************
@@ -813,12 +894,6 @@
GtkListStore *src_store, *dst_store;
- static char *titles[] =
- { N_("Type"), N_("Info"), N_("Cost"), N_("Turns") };
-
- static bool titles_done;
- gint i;
-
struct worklist_data *ptr;
@@ -834,8 +909,6 @@
ptr->future = FALSE;
- intl_slist(ARRAY_SIZE(titles), titles, &titles_done);
-
/* create shell. */
editor = gtk_vbox_new(FALSE, 6);
g_signal_connect(editor, "destroy", G_CALLBACK(worklist_destroy), ptr);
@@ -861,29 +934,7 @@
g_object_unref(src_store);
gtk_size_group_add_widget(group, src_view);
- for (i = 0; i < ARRAY_SIZE(titles); i++) {
- GtkCellRenderer *rend;
- GtkTreeViewColumn *col;
-
- rend = gtk_cell_renderer_text_new();
- g_object_set_data(G_OBJECT(rend), "column", GINT_TO_POINTER(i));
-
- gtk_tree_view_insert_column_with_data_func(GTK_TREE_VIEW(src_view),
- i, titles[i], rend,
- cell_render_func,
- &ptr->pcity, NULL);
-
- col = gtk_tree_view_get_column(GTK_TREE_VIEW(src_view), i);
-
- if (i >= 2) {
- g_object_set(G_OBJECT(rend), "xalign", 1.0, NULL);
- gtk_tree_view_column_set_alignment(col, 1.0);
- }
-
- if (i == 3) {
- ptr->src_col = col;
- }
- }
+ populate_view(GTK_TREE_VIEW(src_view), &ptr->pcity, &ptr->src_col);
gtk_container_add(GTK_CONTAINER(sw), src_view);
label = g_object_new(GTK_TYPE_LABEL,
@@ -920,29 +971,7 @@
g_object_unref(dst_store);
gtk_size_group_add_widget(group, dst_view);
- for (i = 0; i < ARRAY_SIZE(titles); i++) {
- GtkCellRenderer *rend;
- GtkTreeViewColumn *col;
-
- rend = gtk_cell_renderer_text_new();
- g_object_set_data(G_OBJECT(rend), "column", GINT_TO_POINTER(i));
-
- gtk_tree_view_insert_column_with_data_func(GTK_TREE_VIEW(dst_view),
- i, titles[i], rend,
- cell_render_func,
- &ptr->pcity, NULL);
-
- col = gtk_tree_view_get_column(GTK_TREE_VIEW(dst_view), i);
-
- if (i >= 2) {
- g_object_set(G_OBJECT(rend), "xalign", 1.0, NULL);
- gtk_tree_view_column_set_alignment(col, 1.0);
- }
-
- if (i == 3) {
- ptr->dst_col = col;
- }
- }
+ populate_view(GTK_TREE_VIEW(dst_view), &ptr->pcity, &ptr->dst_col);
gtk_container_add(GTK_CONTAINER(sw), dst_view);
label = g_object_new(GTK_TYPE_LABEL,
|
|