Complete.Org: Mailing Lists: Archives: freeciv-dev: April 2004:
[Freeciv-Dev] (PR#3712) City choose production dialog
Home

[Freeciv-Dev] (PR#3712) City choose production dialog

[Top] [All Lists]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index] [Thread Index]
To: dspeyer@xxxxxxxxxxx
Subject: [Freeciv-Dev] (PR#3712) City choose production dialog
From: "Vasco Alexandre da Silva Costa" <vasc@xxxxxxxxxxxxxx>
Date: Thu, 1 Apr 2004 13:24:55 -0800
Reply-to: rt@xxxxxxxxxxx

<URL: http://rt.freeciv.org/Ticket/Display.html?id=3712 >

> [guest - Wed Mar 12 20:55:01 2003]:
> 
> I was recently talkingto a comparative freeciv newbie who complained the
> choose production dialog gave too few hints about what the things were.
>  She suggested color coding.  Here is my code:
> 
> Units{
>  Land: green
>  Sea: blue
>  Air/Heli: red
> }
> Buildings{
>  redundand: grey
>  current: black
> }
> Wonders{
>  obsolete: grey
>  current: black
> }
> 
> The patch is appended, it's very simple.  I can't think of much to add
> to it.

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.

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 21:22:50 -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 21:22:50 -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 21:22:50 -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 21:22:51 -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 21:22:54 -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,98 @@
                             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;
 
-  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);
+
+  if (GTK_IS_CELL_RENDERER_PIXBUF(rend)) {
+    GdkPixbuf *pix;
+    int id = cid_id(cid);
+
+    if (is_unit) {
+      struct canvas store;
+
+      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);
 
-  for (i = 0; i < ARRAY_SIZE(row); i++) {
-    row[i] = buf[i];
+      pix = sprite_get_pixbuf(impr->sprite);
+      g_object_set(rend, "pixbuf", pix, NULL);
+    }
+  } else {
+    struct city **pcity;
+    gint column;
+    char *row[4];
+    char  buf[4][64];
+    int   i;
+
+    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]), cid_id(cid),
+       is_unit, *pcity);
+    g_object_set(rend, "text", row[column], 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;
+
+
+  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;
 
-  get_city_dialog_production_row(row, sizeof(buf[0]), cid_id(cid),
-                                is_unit, *pcity);
-  g_object_set(rend, "text", row[column], NULL);
+      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;
+      }
+    }
+  }
 }
 
 /****************************************************************
@@ -813,12 +885,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 +900,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 +925,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 +962,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,

[Prev in Thread] Current Thread [Next in Thread]