21#include <gdk/gdkkeysyms.h>
68 const struct city *pcity,
80 GCallback edit_callback,
81 gpointer callback_userdata);
88#define SPECHASH_TAG stored_tag
89#define SPECHASH_INT_KEY_TYPE
90#define SPECHASH_INT_DATA_TYPE
117#define PF_MAX_CLAUSES 16
118#define PF_DISJUNCTION_SEPARATOR "|"
119#define PF_CONJUNCTION_SEPARATOR "&"
266#define SPECHASH_TAG propstate
267#define SPECHASH_INT_KEY_TYPE
268#define SPECHASH_IDATA_TYPE struct propstate *
269#define SPECHASH_IDATA_FREE propstate_destroy
424 GtkTreeViewColumn *col);
431 const char *widget_name,
434 const char *widget_name);
446#define SPECHASH_TAG objprop
447#define SPECHASH_INT_KEY_TYPE
448#define SPECHASH_IDATA_TYPE struct objprop *
460 GtkTreeRowReference *
rowref;
497 GtkTreeRowReference *rr);
500#define SPECHASH_TAG objbind
501#define SPECHASH_INT_KEY_TYPE
502#define SPECHASH_IDATA_TYPE struct objbind *
503#define SPECHASH_IDATA_FREE objbind_destroy
571 const struct tile_list *tiles);
573 const struct tile *ptile);
577 gpointer object_data);
590 gboolean currently_selected,
601 struct tile_list *hint_tiles);
611 int tag,
int object_id);
632#define property_page_objprop_iterate(ARG_pp, NAME_op) \
633 TYPED_HASH_DATA_ITERATE(struct objprop *, (ARG_pp)->objprop_table, NAME_op)
634#define property_page_objprop_iterate_end HASH_DATA_ITERATE_END
636#define property_page_objbind_iterate(ARG_pp, NAME_ob) \
637 TYPED_HASH_DATA_ITERATE(struct objbind *, (ARG_pp)->objbind_table, NAME_ob)
638#define property_page_objbind_iterate_end HASH_DATA_ITERATE_END
670 return _(
"Start Position");
678 return Q_(
"?play:Game");
683 log_error(
"%s() Unhandled request to get name of object type %d.",
702 return ((
struct unit *)
object)->id;
704 return ((
struct city *)
object)->id;
713 log_error(
"%s(): Unhandled request to get object ID from object %p of "
714 "type %d (%s).", __FUNCTION__,
object,
objtype,
742 log_error(
"%s(): Unhandled request to get object of type %d (%s) "
743 "with ID %d.", __FUNCTION__,
objtype,
768 log_error(
"%s(): Unhandled request for object type %d (%s)).",
790 return "struct built_status[B_LAST]";
792 return "bool[A_LAST]";
802 return "struct nation_hash";
806 return "struct tile_vision_data";
809 log_error(
"%s(): unhandled value type %d.", __FUNCTION__, valtype);
823 GCallback edit_callback,
826 GtkCellRenderer *cell;
827 GtkTreeViewColumn *col;
828 const char *attr = NULL;
830 if (gtype == G_TYPE_BOOLEAN) {
831 cell = gtk_cell_renderer_toggle_new();
832 gtk_cell_renderer_toggle_set_radio(GTK_CELL_RENDERER_TOGGLE(cell),
835 g_signal_connect(cell,
"toggled", edit_callback, userdata);
838 }
else if (gtype == GDK_TYPE_PIXBUF) {
839 cell = gtk_cell_renderer_pixbuf_new();
842 cell = gtk_cell_renderer_text_new();
844 g_object_set(cell,
"editable",
TRUE, NULL);
845 g_signal_connect(cell,
"edited", edit_callback, userdata);
850 col = gtk_tree_view_column_new_with_attributes(
name, cell,
852 gtk_tree_view_append_column(GTK_TREE_VIEW(
view), col);
870 return g_strdup_printf(
"%d", pv->
data.
v_int);
873 return g_strdup_printf(
"%s", pv->
data.
v_bool ?
_(
"TRUE") :
_(
"FALSE"));
883 int great_wonder_count = 0, small_wonder_count = 0, building_count = 0;
892 great_wonder_count++;
894 small_wonder_count++;
901 return g_strdup_printf(
_(
"%db %ds %dW"),
902 building_count, small_wonder_count,
913 return g_strdup_printf(
_(
"%d known"), count);
923 return g_strdup_printf(
_(
"%d present"), count);
933 return g_strdup_printf(
_(
"%d present"), count);
943 return g_strdup_printf(
_(
"%d present"), count);
948 return g_strdup(
_(
"All nations"));
950 return g_strdup_printf(
PL_(
"%d nation",
"%d nations",
957 return g_strdup_printf(
PL_(
"%d byte",
"%d bytes", count),
965 log_error(
"%s(): Unhandled value type %d for property value %p.",
966 __FUNCTION__, pv->
valtype, pv);
978 turn_built = bs->
turn;
982 return g_strdup(
_(
"(never)"));
985 return g_strdup(
_(
"(destroyed)"));
987 return g_strdup_printf(
"%d", turn_built);
1029 static int tag_series = 0;
1110 log_error(
"%s(): Unhandled value type %d for property value %p.",
1111 __FUNCTION__, pv->
valtype, pv);
1164 log_error(
"%s(): Unhandled request to free data %p (type %s).",
1210 if (vatb < 0 && vbtb < 0) {
1247 log_error(
"%s(): Unhandled value type %d for property values %p and %p.",
1248 __FUNCTION__, pva->
valtype, pva, pvb);
1338 if (
object == NULL) {
1423 log_error(
"%s(): Unhandled request to destroy object %p (ID %d) of type "
1458 if (NULL == ptile) {
1471 case OPID_TILE_ADDRESS:
1480 if (NULL != pterrain) {
1491 if (NULL != presource) {
1499 pv->
data.
v_string = g_strdup_printf(
"(%d, %d)", tile_x, tile_y);
1571 if (ptile->
label != NULL) {
1578 log_error(
"%s(): Unhandled request for value of property %d "
1579 "(%s) from object of type \"%s\".", __FUNCTION__,
1589 const struct tile *ptile;
1614 log_error(
"%s(): Unhandled request for value of property %d "
1615 "(%s) from object of type \"%s\".", __FUNCTION__,
1626 if (NULL ==
punit) {
1636 case OPID_UNIT_ADDRESS:
1681 log_error(
"%s(): Unhandled request for value of property %d "
1682 "(%s) from object of type \"%s\".", __FUNCTION__,
1693 if (NULL == pcity) {
1703 case OPID_CITY_ADDRESS:
1740 log_error(
"%s(): Unhandled request for value of property %d "
1741 "(%s) from object of type \"%s\".", __FUNCTION__,
1753 if (NULL == pplayer) {
1771 case OPID_PLAYER_ADDRESS:
1796 log_error(
"%s(): Unhandled request for value of property %d "
1797 "(%s) from object of type \"%s\".", __FUNCTION__,
1808 if (NULL == pgame) {
1844 log_error(
"%s(): Unhandled request for value of property %d "
1845 "(%s) from object of type \"%s\".", __FUNCTION__,
1856 log_error(
"%s(): Unhandled request for object type \"%s\" (nb %d).",
1892 if (NULL != pstep) {
1897 if (NULL != pbig_step) {
1913 log_error(
"%s(): Unhandled request for value range of property %d (%s) "
1914 "from object of type \"%s\".", __FUNCTION__,
1923 if (NULL ==
punit) {
1958 log_error(
"%s(): Unhandled request for value range of property %d (%s) "
1959 "from object of type \"%s\".", __FUNCTION__,
1967 if (NULL == pcity) {
2000 log_error(
"%s(): Unhandled request for value range of property %d (%s) "
2001 "from object of type \"%s\".", __FUNCTION__,
2022 log_error(
"%s(): Unhandled request for value range of property %d (%s) "
2023 "from object of type \"%s\".", __FUNCTION__,
2028 log_error(
"%s(): Unhandled request for value range of property %d (%s) "
2029 "from object of type \"%s\".", __FUNCTION__,
2037 log_error(
"%s(): Unhandled request for object type \"%s\" (nb %d).",
2110 struct propval *pv_old, *pv_copy;
2179 gtk_tree_row_reference_free(ob->
rowref);
2230 if (NULL == ptile) {
2256 if (NULL ==
punit) {
2279 if (NULL == pcity) {
2283 packet->
id32 = pcity->
id;
2288 for (i = 0; i <
B_LAST; i++) {
2304 if (NULL == pplayer) {
2329 if (NULL == pgame) {
2349 log_error(
"%s(): Unhandled object type %s (nb %d).", __FUNCTION__,
2428 log_error(
"%s(): Unhandled request to pack value of property "
2429 "%d (%s) from object of type \"%s\".", __FUNCTION__,
2451 log_error(
"%s(): Unhandled request to pack value of property "
2452 "%d (%s) from object of type \"%s\".", __FUNCTION__,
2486 log_error(
"%s(): Unhandled request to pack value of property "
2487 "%d (%s) from object of type \"%s\".", __FUNCTION__,
2515 for (i = 0; i <
B_LAST; i++) {
2524 log_error(
"%s(): Unhandled request to pack value of property "
2525 "%d (%s) from object of type \"%s\".", __FUNCTION__,
2561 log_error(
"%s(): Unhandled request to pack value of property "
2562 "%d (%s) from object of type \"%s\".", __FUNCTION__,
2605 log_error(
"%s(): Unhandled request to pack value of property "
2606 "%d (%s) from object of type \"%s\".", __FUNCTION__,
2614 log_error(
"%s(): Unhandled request for object type \"%s\" (nb %d).",
2623 GtkTreeRowReference *rr)
2672 return G_TYPE_STRING;
2680 return G_TYPE_STRING;
2684 return GDK_TYPE_PIXBUF;
2738 if (gtype == G_TYPE_INT || gtype == G_TYPE_STRING
2739 || gtype == G_TYPE_BOOLEAN) {
2741 }
else if (gtype == GDK_TYPE_PIXBUF) {
2779 GtkTreeViewColumn *col)
2828 GtkCellRenderer *cell = NULL;
2833 if (gtype == G_TYPE_INT || gtype == G_TYPE_STRING
2834 || gtype == G_TYPE_BOOLEAN) {
2835 cell = gtk_cell_renderer_text_new();
2836 }
else if (gtype == GDK_TYPE_PIXBUF) {
2837 cell = gtk_cell_renderer_pixbuf_new();
2854 return gtype == G_TYPE_INT || gtype == G_TYPE_STRING;
2880 value.
data.
v_const_string = gtk_entry_buffer_get_text(gtk_text_get_buffer(GTK_TEXT(text)));
2897 value.
data.
v_int = gtk_spin_button_get_value_as_int(spin);
2914 value.
data.
v_bool = gtk_toggle_button_get_active(button);
2924 GtkWidget *hbox, *hbox2, *label, *image, *text, *spin, *button;
2936 hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 4);
2940 gtk_widget_set_halign(label, GTK_ALIGN_START);
2941 gtk_widget_set_valign(label, GTK_ALIGN_CENTER);
2942 gtk_box_append(GTK_BOX(hbox), label);
2965 case OPID_TILE_ADDRESS:
2966 case OPID_UNIT_ADDRESS:
2967 case OPID_CITY_ADDRESS:
2968 case OPID_PLAYER_ADDRESS:
2970 label = gtk_label_new(NULL);
2971 gtk_widget_set_hexpand(label,
TRUE);
2972 gtk_widget_set_halign(label, GTK_ALIGN_START);
2973 gtk_widget_set_valign(label, GTK_ALIGN_CENTER);
2974 gtk_box_append(GTK_BOX(hbox), label);
2982 image = gtk_image_new();
2983 gtk_widget_set_size_request(image,
2986 gtk_widget_set_hexpand(image,
TRUE);
2987 gtk_widget_set_halign(image, GTK_ALIGN_START);
2988 gtk_widget_set_valign(image, GTK_ALIGN_CENTER);
2989 gtk_box_append(GTK_BOX(hbox), image);
2997 text = gtk_text_new();
2998 gtk_widget_set_hexpand(text,
TRUE);
2999 gtk_widget_set_halign(text, GTK_ALIGN_END);
3000 gtk_editable_set_width_chars(GTK_EDITABLE(text), 8);
3001 g_signal_connect(text,
"changed",
3003 gtk_box_append(GTK_BOX(hbox), text);
3013 spin = gtk_spin_button_new_with_range(0.0, 100.0, 1.0);
3014 gtk_widget_set_hexpand(spin,
TRUE);
3015 gtk_widget_set_halign(spin, GTK_ALIGN_END);
3016 g_signal_connect(spin,
"value-changed",
3018 gtk_box_append(GTK_BOX(hbox), spin);
3026 hbox2 = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 4);
3027 gtk_widget_set_hexpand(hbox2,
TRUE);
3028 gtk_widget_set_halign(hbox2, GTK_ALIGN_END);
3029 gtk_box_append(GTK_BOX(hbox), hbox2);
3030 spin = gtk_spin_button_new_with_range(0.0, 100.0, 1.0);
3031 g_signal_connect(spin,
"value-changed",
3033 gtk_box_append(GTK_BOX(hbox2), spin);
3035 label = gtk_label_new(NULL);
3036 gtk_widget_set_halign(label, GTK_ALIGN_START);
3037 gtk_widget_set_valign(label, GTK_ALIGN_CENTER);
3038 gtk_box_append(GTK_BOX(hbox2), label);
3073 button = gtk_toggle_button_new();
3074 gtk_widget_set_hexpand(button,
TRUE);
3075 gtk_widget_set_halign(button, GTK_ALIGN_END);
3076 g_signal_connect(button,
"toggled",
3079 gtk_box_append(GTK_BOX(hbox), button);
3084 log_error(
"%s(): Unhandled request to create widget for property %d (%s).",
3099 GtkWidget *w, *label, *image, *text, *spin, *button;
3104 double min, max,
step, big_step;
3106 const char *newtext;
3107 GtkEntryBuffer *buffer;
3127 if (pv && modified) {
3152 gtk_image_set_from_pixbuf(GTK_IMAGE(image), pv->
data.
v_pixbuf);
3154 gtk_image_set_from_pixbuf(GTK_IMAGE(image), NULL);
3166 case OPID_TILE_ADDRESS:
3167 case OPID_UNIT_ADDRESS:
3168 case OPID_CITY_ADDRESS:
3169 case OPID_PLAYER_ADDRESS:
3173 gtk_label_set_text(GTK_LABEL(label), pv->
data.
v_string);
3175 gtk_label_set_text(GTK_LABEL(label), NULL);
3193 gtk_label_set_text(GTK_LABEL(label), agebuf);
3195 gtk_label_set_text(GTK_LABEL(label), NULL);
3211 buffer = gtk_text_get_buffer(GTK_TEXT(text));
3215 if (strcmp(newtext, gtk_entry_buffer_get_text(buffer))) {
3216 gtk_entry_buffer_set_text(buffer, newtext, -1);
3218 gtk_widget_set_sensitive(text, pv != NULL);
3232 &
step, &big_step)) {
3233 gtk_spin_button_set_range(GTK_SPIN_BUTTON(spin), min, max);
3234 gtk_spin_button_set_increments(GTK_SPIN_BUTTON(spin),
3237 gtk_spin_button_set_value(GTK_SPIN_BUTTON(spin), pv->
data.
v_int);
3241 gtk_widget_set_sensitive(spin, pv != NULL);
3254 &
step, &big_step)) {
3255 gtk_spin_button_set_range(GTK_SPIN_BUTTON(spin), min, max);
3256 gtk_spin_button_set_increments(GTK_SPIN_BUTTON(spin),
3259 gtk_label_set_text(GTK_LABEL(label), buf);
3261 gtk_label_set_text(GTK_LABEL(label), NULL);
3263 gtk_spin_button_set_value(GTK_SPIN_BUTTON(spin), pv->
data.
v_int);
3267 gtk_label_set_text(GTK_LABEL(label), NULL);
3269 gtk_widget_set_sensitive(spin, pv != NULL);
3307 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button),
3310 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button),
FALSE);
3314 gtk_widget_set_sensitive(button, pv != NULL);
3329 "<span foreground=\"red\">%s</span>",
name);
3330 gtk_label_set_markup(GTK_LABEL(label), namebuf);
3332 gtk_label_set_text(GTK_LABEL(label),
name);
3357 const char *widget_name,
3362 if (!op || !widget_name || !
widget) {
3368 log_error(
"Cannot store child widget %p under name "
3369 "\"%s\" using objprop_set_child_widget for object "
3370 "property %d (%s) because objprop_get_widget does "
3371 "not return a valid widget.",
3376 g_object_set_data(G_OBJECT(w), widget_name,
widget);
3384 const char *widget_name)
3386 GtkWidget *w, *child;
3388 if (!op || !widget_name) {
3394 log_error(
"Cannot retrieve child widget under name "
3395 "\"%s\" using objprop_get_child_widget for object "
3396 "property %d (%s) because objprop_get_widget does "
3397 "not return a valid widget.",
3402 child = g_object_get_data(G_OBJECT(w), widget_name);
3404 log_error(
"Child widget \"%s\" not found for object "
3405 "property %d (%s) via objprop_get_child_widget.",
3478 GtkWidget *hbox, *vbox, *label, *button, *scrollwin, *image;
3479 GtkWidget *
view = NULL;
3480 GtkTreeSelection *sel;
3481 GtkListStore *
store = NULL;
3482 GtkTextBuffer *
textbuf = NULL;
3508 hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 4);
3511 label = gtk_label_new(NULL);
3512 gtk_widget_set_halign(label, GTK_ALIGN_START);
3513 gtk_widget_set_valign(label, GTK_ALIGN_CENTER);
3514 gtk_box_append(GTK_BOX(hbox), label);
3520 vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 4);
3523 label = gtk_label_new(NULL);
3524 gtk_widget_set_halign(label, GTK_ALIGN_START);
3525 gtk_widget_set_valign(label, GTK_ALIGN_CENTER);
3526 gtk_box_append(GTK_BOX(vbox), label);
3529 hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 4);
3530 gtk_box_append(GTK_BOX(vbox), hbox);
3532 image = gtk_image_new();
3534 gtk_widget_set_size_request(image,
3539 gtk_widget_set_size_request(image, 100, 40);
3541 gtk_widget_set_halign(image, GTK_ALIGN_START);
3542 gtk_widget_set_valign(image, GTK_ALIGN_CENTER);
3543 gtk_box_append(GTK_BOX(hbox), image);
3548 hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 4);
3553 log_error(
"Unhandled request to create panel widget "
3554 "for property %d (%s) in extviewer_new().",
3556 hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 4);
3562 button = gtk_button_new_with_label(
Q_(
"?verb:View"));
3564 button = gtk_button_new_with_label(
_(
"Edit"));
3566 g_signal_connect(button,
"clicked",
3568 gtk_box_append(GTK_BOX(hbox), button);
3579 store = gtk_list_store_new(3, G_TYPE_BOOLEAN, G_TYPE_INT,
3583 num_cols = 3 + 1 + V_COUNT;
3584 gtypes =
fc_malloc(num_cols *
sizeof(GType));
3585 gtypes[0] = G_TYPE_INT;
3586 gtypes[1] = GDK_TYPE_PIXBUF;
3587 gtypes[2] = G_TYPE_STRING;
3588 gtypes[3] = G_TYPE_BOOLEAN;
3590 gtypes[4 + v] = G_TYPE_BOOLEAN;
3592 store = gtk_list_store_newv(num_cols, gtypes);
3596 store = gtk_list_store_new(4, G_TYPE_BOOLEAN, G_TYPE_INT,
3597 G_TYPE_STRING, G_TYPE_STRING);
3602 store = gtk_list_store_new(4, G_TYPE_BOOLEAN, G_TYPE_INT,
3603 GDK_TYPE_PIXBUF, G_TYPE_STRING);
3607 textbuf = gtk_text_buffer_new(NULL);
3610 log_error(
"Unhandled request to create data store "
3611 "for property %d (%s) in extviewer_new().",
3621 vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 4);
3625 gtk_widget_set_halign(label, GTK_ALIGN_START);
3626 gtk_widget_set_valign(label, GTK_ALIGN_CENTER);
3627 gtk_box_append(GTK_BOX(vbox), label);
3631 scrollwin = gtk_scrolled_window_new();
3632 gtk_scrolled_window_set_has_frame(GTK_SCROLLED_WINDOW(scrollwin),
3634 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrollwin),
3635 GTK_POLICY_AUTOMATIC,
3636 GTK_POLICY_AUTOMATIC);
3637 gtk_box_append(GTK_BOX(vbox), scrollwin);
3640 view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(
store));
3641 sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(
view));
3642 gtk_tree_selection_set_mode(sel, GTK_SELECTION_MULTIPLE);
3647 gtk_text_view_set_editable(GTK_TEXT_VIEW(
view), editable);
3648 gtk_text_view_set_cursor_visible(GTK_TEXT_VIEW(
view), editable);
3650 gtk_widget_set_hexpand(
view,
TRUE);
3651 gtk_widget_set_vexpand(
view,
TRUE);
3653 gtk_scrolled_window_set_child(GTK_SCROLLED_WINDOW(scrollwin),
view);
3737 g_signal_connect(
textbuf,
"changed",
3742 log_error(
"Unhandled request to configure view widget "
3743 "for property %d (%s) in extviewer_new().",
3801 GtkListStore *store;
3802 GtkTextBuffer *textbuf;
3828 gtk_list_store_clear(store);
3830 id = spe->data.special_idx;
3833 gtk_list_store_append(store, &iter);
3834 gtk_list_store_set(store, &iter, 0, present, 1,
id, 2,
name, -1);
3837 gtk_label_set_text(GTK_LABEL(ev->
panel_label), buf);
3842 gtk_list_store_clear(store);
3849 gtk_list_store_append(store, &iter);
3850 gtk_list_store_set(store, &iter, 0, present, 1,
id, 2,
name, -1);
3853 gtk_label_set_text(GTK_LABEL(ev->
panel_label), buf);
3858 gtk_list_store_clear(store);
3865 gtk_list_store_append(store, &iter);
3866 gtk_list_store_set(store, &iter, 0, present, 1,
id, 2,
name, -1);
3869 gtk_label_set_text(GTK_LABEL(ev->
panel_label), buf);
3874 gtk_list_store_clear(store);
3886 gtk_list_store_append(store, &iter);
3887 gtk_list_store_set(store, &iter, 0,
id, 2,
name, -1);
3889 gtk_list_store_set(store, &iter, 1, pixbuf, -1);
3890 g_object_unref(pixbuf);
3894 gtk_list_store_set(store, &iter, 3, present, -1);
3897 gtk_list_store_set(store, &iter, 4 + v, present, -1);
3903 gtk_list_store_clear(store);
3904 gtk_list_store_append(store, &iter);
3906 gtk_list_store_set(store, &iter, 0, all, 1, -1, 3,
3907 _(
"All nations"), -1);
3916 gtk_list_store_append(store, &iter);
3917 gtk_list_store_set(store, &iter, 0, present, 1,
id,
3918 2, pixbuf, 3,
name, -1);
3920 g_object_unref(pixbuf);
3925 gtk_label_set_text(GTK_LABEL(ev->
panel_label), buf);
3930 gtk_list_store_clear(store);
3938 present = turn_built >= 0;
3940 gtk_list_store_append(store, &iter);
3941 gtk_list_store_set(store, &iter, 0, present, 1,
id, 2,
name,
3946 gtk_label_set_text(GTK_LABEL(ev->
panel_label), buf);
3952 enum barbarian_type barbarian_type =
3955 gtk_list_store_clear(store);
3959 && (barbarian_type != NOT_A_BARBARIAN
3965 gtk_list_store_append(store, &iter);
3966 gtk_list_store_set(store, &iter, 0, present, 1,
id,
3967 2, pixbuf, 3,
name, -1);
3969 g_object_unref(pixbuf);
3976 gtk_image_set_from_pixbuf(GTK_IMAGE(ev->
panel_image), pixbuf);
3978 g_object_unref(pixbuf);
3985 gtk_list_store_clear(store);
3991 gtk_list_store_append(store, &iter);
3992 gtk_list_store_set(store, &iter, 0, present, 1,
id,
3993 2, pixbuf, 3,
name, -1);
3995 g_object_unref(pixbuf);
4001 gtk_image_set_from_pixbuf(GTK_IMAGE(ev->
panel_image), pixbuf);
4003 g_object_unref(pixbuf);
4009 gtk_list_store_clear(store);
4014 gtk_list_store_append(store, &iter);
4015 gtk_list_store_set(store, &iter, 0, present, 1,
id, 2,
name, -1);
4018 gtk_label_set_text(GTK_LABEL(ev->
panel_label), buf);
4027 GtkTextIter start, end;
4031 gtk_text_buffer_get_bounds(textbuf, &start, &end);
4032 oldtext = gtk_text_buffer_get_text(textbuf, &start, &end,
TRUE);
4041 gtk_label_set_text(GTK_LABEL(ev->
panel_label), buf);
4046 log_error(
"Unhandled request to refresh widgets "
4047 "extviewer_refresh_widgets() for objprop id=%d "
4072 gtk_label_set_text(GTK_LABEL(ev->
panel_label), NULL);
4083 gtk_list_store_clear(ev->
store);
4087 gtk_list_store_clear(ev->
store);
4088 gtk_image_set_from_pixbuf(GTK_IMAGE(ev->
panel_image), NULL);
4094 gtk_text_buffer_set_text(ev->
textbuf,
"", -1);
4100 log_error(
"Unhandled request to clear widgets "
4101 "in extviewer_clear_widgets() for objprop id=%d "
4139 GtkTreeModel *model;
4141 int id, old_id, turn_built;
4143 bool active, present;
4145 GdkPixbuf *pixbuf = NULL;
4159 active = gtk_cell_renderer_toggle_get_active(cell);
4162 model = GTK_TREE_MODEL(ev->
store);
4163 if (!gtk_tree_model_get_iter_from_string(model, &iter, path)) {
4172 gtk_tree_model_get(model, &iter, 1, &
id, -1);
4181 gtk_list_store_set(ev->
store, &iter, 0, present, -1);
4183 gtk_label_set_text(GTK_LABEL(ev->
panel_label), buf);
4188 gtk_tree_model_get(model, &iter, 1, &
id, -1);
4197 gtk_list_store_set(ev->
store, &iter, 0, present, -1);
4199 gtk_label_set_text(GTK_LABEL(ev->
panel_label), buf);
4204 gtk_tree_model_get(model, &iter, 1, &
id, -1);
4213 gtk_list_store_set(ev->
store, &iter, 0, present, -1);
4215 gtk_label_set_text(GTK_LABEL(ev->
panel_label), buf);
4220 gtk_tree_model_get(model, &iter, 1, &
id, -1);
4226 gtk_list_store_set(ev->
store, &iter, 0, present, -1);
4227 gtk_tree_model_get_iter_first(model, &iter);
4229 while (gtk_tree_model_iter_next(model, &iter)) {
4230 gtk_list_store_set(ev->
store, &iter, 0,
FALSE, -1);
4237 gtk_tree_model_iter_next(model, &iter);
4238 gtk_tree_model_get(model, &iter, 0, &id2, -1);
4239 gtk_list_store_set(ev->
store, &iter, 0,
TRUE, -1);
4247 gtk_list_store_set(ev->
store, &iter, 0, present, -1);
4254 gtk_tree_model_get_iter_first(model, &iter);
4256 gtk_list_store_set(ev->
store, &iter, 0, all, -1);
4259 gtk_label_set_text(GTK_LABEL(ev->
panel_label), buf);
4264 gtk_tree_model_get(model, &iter, 1, &
id, -1);
4265 if (!(0 <=
id &&
id <
B_LAST)) {
4271 gtk_list_store_set(ev->
store, &iter, 0, present, 3, buf, -1);
4274 gtk_label_set_text(GTK_LABEL(ev->
panel_label), buf);
4279 gtk_tree_model_get(model, &iter, 1, &
id, -1);
4285 gtk_list_store_set(ev->
store, &iter, 0,
TRUE, -1);
4286 gtk_tree_model_iter_nth_child(model, &iter, NULL, old_id);
4287 gtk_list_store_set(ev->
store, &iter, 0,
FALSE, -1);
4291 gtk_image_set_from_pixbuf(GTK_IMAGE(ev->
panel_image), pixbuf);
4293 g_object_unref(pixbuf);
4298 gtk_tree_model_get(model, &iter, 1, &
id, -1);
4304 gtk_list_store_set(ev->
store, &iter, 0,
TRUE, -1);
4305 gtk_tree_model_iter_nth_child(model, &iter, NULL, old_id);
4306 gtk_list_store_set(ev->
store, &iter, 0,
FALSE, -1);
4310 gtk_image_set_from_pixbuf(GTK_IMAGE(ev->
panel_image), pixbuf);
4312 g_object_unref(pixbuf);
4317 gtk_tree_model_get(model, &iter, 1, &
id, -1);
4326 gtk_list_store_set(ev->
store, &iter, 0, present, -1);
4328 gtk_label_set_text(GTK_LABEL(ev->
panel_label), buf);
4333 log_error(
"Unhandled widget toggled signal in "
4334 "extviewer_view_cell_toggled() for objprop id=%d "
4354 GtkTextIter start, end;
4367 gtk_text_buffer_get_start_iter(textbuf, &start);
4368 gtk_text_buffer_get_end_iter(textbuf, &end);
4369 text = gtk_text_buffer_get_text(textbuf, &start, &end,
FALSE);
4377 gtk_label_set_text(GTK_LABEL(ev->
panel_label), buf);
4381 log_error(
"Unhandled widget modified signal in "
4382 "extviewer_textbuf_changed() for objprop id=%d "
4397#define ADDPROP(ARG_id, ARG_name, ARG_tooltip, ARG_flags, ARG_valtype) do { \
4398 struct objprop *MY_op = objprop_new(ARG_id, ARG_name, ARG_tooltip, \
4399 ARG_flags, ARG_valtype, pp); \
4400 objprop_hash_insert(pp->objprop_table, MY_op->id, MY_op); \
4439 ADDPROP(OPID_TILE_ADDRESS,
_(
"Address"), NULL,
4469 ADDPROP(OPID_UNIT_ADDRESS,
_(
"Address"), NULL,
4501 ADDPROP(OPID_CITY_ADDRESS,
_(
"Address"), NULL,
4526 ADDPROP(OPID_PLAYER_ADDRESS,
_(
"Address"), NULL,
4554 _(
"Scenario Name"), NULL,
4558 _(
"Scenario Authors"), NULL,
4562 _(
"Scenario Description"), NULL,
4566 _(
"Save Random Number State"), NULL,
4569 _(
"Save Players"), NULL,
4572 _(
"Nation Start Positions"), NULL,
4575 _(
"Prevent New Cities"), NULL,
4578 _(
"Saltwater Flooding Lakes"), NULL,
4581 _(
"Lock to current Ruleset"), NULL,
4589 log_error(
"%s(): Unhandled page object type %s (nb %d).", __FUNCTION__,
4609 if (gtk_tree_selection_count_selected_rows(sel) < 1) {
4624 GtkTreeModel *model,
4625 GtkTreePath *sel_path,
4626 gboolean currently_selected,
4630 struct objbind *ob = NULL, *old_ob;
4634 if (!pp || !sel_path) {
4638 if (!gtk_tree_model_get_iter(model, &iter, sel_path)) {
4643 gtk_tree_model_get(model, &iter, 0, &ob, -1);
4644 if (currently_selected) {
4648 struct objbind *new_ob = NULL;
4650 rows = gtk_tree_selection_get_selected_rows(sel, NULL);
4651 for (p = rows; p != NULL; p = p->next) {
4653 if (gtk_tree_model_get_iter(model, &iter, path)) {
4654 struct objbind *test_ob = NULL;
4655 gtk_tree_model_get(model, &iter, 0, &test_ob, -1);
4656 if (test_ob == ob) {
4663 g_list_foreach(rows, (GFunc) gtk_tree_path_free, NULL);
4684 GtkTreeViewColumn *col;
4689 text = gtk_entry_buffer_get_text(gtk_entry_get_buffer(GTK_ENTRY(
entry)));
4708 gtk_tree_view_column_set_visible(col, matched);
4724 GtkWidget *vgrid, *vgrid2, *hgrid, *hgrid2, *paned, *frame, *w;
4725 GtkWidget *scrollwin, *
view, *label, *
entry, *notebook;
4726 GtkWidget *button, *hsep;
4727 GtkTreeSelection *sel;
4728 GtkCellRenderer *cell;
4729 GtkTreeViewColumn *col;
4730 GtkSizeGroup *sizegroup;
4731 int num_columns = 0;
4749 sizegroup = gtk_size_group_new(GTK_SIZE_GROUP_BOTH);
4767 gtype_array =
fc_malloc(num_columns *
sizeof(GType));
4768 gtype_array[0] = G_TYPE_POINTER;
4778 pp->
object_store = gtk_list_store_newv(num_columns, gtype_array);
4781 paned = gtk_paned_new(GTK_ORIENTATION_HORIZONTAL);
4782 gtk_paned_set_position(GTK_PANED(paned), 256);
4787 vgrid = gtk_grid_new();
4788 gtk_orientable_set_orientation(GTK_ORIENTABLE(vgrid),
4789 GTK_ORIENTATION_VERTICAL);
4790 gtk_grid_set_row_spacing(GTK_GRID(vgrid), 4);
4791 gtk_widget_set_margin_start(vgrid, 4);
4792 gtk_widget_set_margin_end(vgrid, 4);
4793 gtk_widget_set_margin_top(vgrid, 4);
4794 gtk_widget_set_margin_bottom(vgrid, 4);
4795 gtk_paned_set_start_child(GTK_PANED(paned), vgrid);
4797 scrollwin = gtk_scrolled_window_new();
4798 gtk_scrolled_window_set_has_frame(GTK_SCROLLED_WINDOW(scrollwin),
4800 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrollwin),
4801 GTK_POLICY_AUTOMATIC,
4802 GTK_POLICY_AUTOMATIC);
4803 gtk_grid_attach(GTK_GRID(vgrid), scrollwin, 0, grid_row++, 1, 1);
4806 gtk_widget_set_hexpand(
view,
TRUE);
4807 gtk_widget_set_vexpand(
view,
TRUE);
4815 if (!attr_type_str) {
4831 col = gtk_tree_view_column_new_with_attributes(
name, cell,
4832 attr_type_str, col_id,
4835 gtk_tree_view_column_set_sizing(col, GTK_TREE_VIEW_COLUMN_GROW_ONLY);
4836 gtk_tree_view_column_set_resizable(col,
TRUE);
4837 gtk_tree_view_column_set_reorderable(col,
TRUE);
4839 gtk_tree_view_column_set_clickable(col,
TRUE);
4840 gtk_tree_view_column_set_sort_column_id(col, col_id);
4842 gtk_tree_view_column_set_clickable(col,
FALSE);
4844 gtk_tree_view_append_column(GTK_TREE_VIEW(
view), col);
4849 sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(
view));
4850 gtk_tree_selection_set_mode(sel, GTK_SELECTION_MULTIPLE);
4851 g_signal_connect(sel,
"changed",
4853 gtk_tree_selection_set_select_function(sel,
4856 gtk_scrolled_window_set_child(GTK_SCROLLED_WINDOW(scrollwin),
view);
4860 hgrid = gtk_grid_new();
4861 gtk_grid_set_column_spacing(GTK_GRID(hgrid), 4);
4862 gtk_grid_attach(GTK_GRID(vgrid), hgrid, 0, grid_row++, 1, 1);
4864 button = gtk_button_new();
4865 gtk_button_set_icon_name(GTK_BUTTON(button),
"list-add");
4866 gtk_button_set_label(GTK_BUTTON(button),
_(
"Create"));
4867 gtk_size_group_add_widget(sizegroup, button);
4868 gtk_widget_set_tooltip_text(button,
4869 _(
"Pressing this button will create a new object of the "
4870 "same type as the current property page and add it to "
4871 "the page. The specific type and count of the objects "
4872 "is taken from the editor tool state. So for example, "
4873 "the \"tool value\" of the unit tool and its \"count\" "
4874 "parameter affect unit creation."));
4875 g_signal_connect(button,
"clicked",
4877 gtk_grid_attach(GTK_GRID(hgrid), button, grid_col++, 0, 1, 1);
4879 button = gtk_button_new();
4880 gtk_button_set_icon_name(GTK_BUTTON(button),
"list-remove");
4881 gtk_button_set_label(GTK_BUTTON(button),
_(
"Destroy"));
4882 gtk_size_group_add_widget(sizegroup, button);
4883 gtk_widget_set_tooltip_text(button,
4884 _(
"Pressing this button will send a request to the server "
4885 "to destroy (i.e. erase) the objects selected in the object "
4887 g_signal_connect(button,
"clicked",
4889 gtk_grid_attach(GTK_GRID(hgrid), button, grid_col++, 0, 1, 1);
4894 hgrid = gtk_grid_new();
4896 gtk_grid_set_column_spacing(GTK_GRID(hgrid), 4);
4897 gtk_paned_set_end_child(GTK_PANED(paned), hgrid);
4899 vgrid = gtk_grid_new();
4900 gtk_orientable_set_orientation(GTK_ORIENTABLE(vgrid),
4901 GTK_ORIENTATION_VERTICAL);
4902 gtk_grid_set_row_spacing(GTK_GRID(vgrid), 4);
4903 gtk_widget_set_margin_start(vgrid, 4);
4904 gtk_widget_set_margin_end(vgrid, 4);
4905 gtk_widget_set_margin_top(vgrid, 4);
4906 gtk_widget_set_margin_bottom(vgrid, 4);
4907 gtk_grid_attach(GTK_GRID(hgrid), vgrid, grid_col++, 0, 1, 1);
4913 vgrid2 = gtk_grid_new();
4914 gtk_widget_set_hexpand(vgrid2,
TRUE);
4915 gtk_widget_set_vexpand(vgrid,
TRUE);
4916 gtk_orientable_set_orientation(GTK_ORIENTABLE(vgrid2),
4917 GTK_ORIENTATION_VERTICAL);
4918 gtk_grid_set_row_spacing(GTK_GRID(vgrid2), 4);
4919 gtk_grid_attach(GTK_GRID(hgrid), vgrid2, grid_col++, 0, 1, 1);
4921 notebook = gtk_notebook_new();
4922 gtk_widget_set_vexpand(notebook,
TRUE);
4923 gtk_widget_set_size_request(notebook, 256, -1);
4924 gtk_notebook_set_show_tabs(GTK_NOTEBOOK(notebook),
FALSE);
4925 gtk_notebook_set_show_border(GTK_NOTEBOOK(notebook),
FALSE);
4926 gtk_grid_attach(GTK_GRID(vgrid2), notebook, 0, grid2_row++, 1, 1);
4929 hsep = gtk_separator_new(GTK_ORIENTATION_HORIZONTAL);
4930 gtk_grid_attach(GTK_GRID(vgrid2), hsep, 0, grid2_row++, 1, 1);
4932 hgrid2 = gtk_grid_new();
4933 gtk_widget_set_margin_start(hgrid2, 4);
4934 gtk_widget_set_margin_end(hgrid2, 4);
4935 gtk_widget_set_margin_top(hgrid2, 4);
4936 gtk_widget_set_margin_bottom(hgrid2, 4);
4937 gtk_grid_attach(GTK_GRID(vgrid2), hgrid2, 0, grid2_row++, 1, 1);
4939 button = gtk_button_new_with_mnemonic(
_(
"_Close"));
4940 gtk_size_group_add_widget(sizegroup, button);
4941 g_signal_connect_swapped(button,
"clicked",
4942 G_CALLBACK(gtk_widget_hide), pe->
widget);
4943 gtk_grid_attach(GTK_GRID(hgrid2), button, grid2_col++, 0, 1, 1);
4949 title = g_strdup_printf(
_(
"%s Properties"),
4951 frame = gtk_frame_new(
title);
4953 gtk_widget_set_size_request(frame, 256, -1);
4954 gtk_grid_attach(GTK_GRID(vgrid), frame, 0, grid_row++, 1, 1);
4956 scrollwin = gtk_scrolled_window_new();
4957 gtk_scrolled_window_set_has_frame(GTK_SCROLLED_WINDOW(scrollwin),
4959 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrollwin),
4960 GTK_POLICY_AUTOMATIC,
4961 GTK_POLICY_AUTOMATIC);
4962 gtk_frame_set_child(GTK_FRAME(frame), scrollwin);
4964 vgrid2 = gtk_grid_new();
4966 gtk_widget_set_vexpand(vgrid2,
TRUE);
4967 gtk_orientable_set_orientation(GTK_ORIENTABLE(vgrid2),
4968 GTK_ORIENTATION_VERTICAL);
4969 gtk_grid_set_row_spacing(GTK_GRID(vgrid2), 4);
4970 gtk_widget_set_margin_start(vgrid2, 4);
4971 gtk_widget_set_margin_end(vgrid2, 4);
4972 gtk_widget_set_margin_top(vgrid2, 4);
4973 gtk_widget_set_margin_bottom(vgrid2, 4);
4974 gtk_scrolled_window_set_child(GTK_SCROLLED_WINDOW(scrollwin), vgrid2);
4984 gtk_grid_attach(GTK_GRID(vgrid2), w, 0, grid2_row++, 1, 1);
4987 gtk_widget_set_tooltip_text(w,
tooltip);
4991 hgrid2 = gtk_grid_new();
4993 gtk_widget_set_margin_top(hgrid2, 4);
4994 gtk_widget_set_margin_bottom(hgrid2, 4);
4995 gtk_grid_set_column_spacing(GTK_GRID(hgrid2), 4);
4996 gtk_grid_attach(GTK_GRID(vgrid), hgrid2, 0, grid_row++, 1, 1);
4998 label = gtk_label_new(
_(
"Filter:"));
4999 gtk_grid_attach(GTK_GRID(hgrid2), label, grid2_col++, 0, 1, 1);
5001 entry = gtk_entry_new();
5002 gtk_widget_set_tooltip_text(
entry,
5003 _(
"Enter a filter string to limit which properties are shown. "
5004 "The filter is one or more text patterns separated by | "
5005 "(\"or\") or & (\"and\"). The symbol & has higher precedence "
5006 "than |. A pattern may also be negated by prefixing it with !."));
5007 g_signal_connect(
entry,
"changed",
5009 gtk_grid_attach(GTK_GRID(hgrid2),
entry, grid2_col++, 0, 1, 1);
5011 hgrid2 = gtk_grid_new();
5013 gtk_grid_set_column_spacing(GTK_GRID(hgrid2), 4);
5014 gtk_grid_attach(GTK_GRID(vgrid), hgrid2, 0, grid_row++, 1, 1);
5016 button = gtk_button_new_with_mnemonic(
_(
"_Refresh"));
5017 gtk_size_group_add_widget(sizegroup, button);
5018 gtk_widget_set_tooltip_text(button,
5019 _(
"Pressing this button will reset all modified properties of "
5020 "the selected objects to their current values (the values "
5021 "they have on the server)."));
5022 g_signal_connect(button,
"clicked",
5024 gtk_grid_attach(GTK_GRID(hgrid2), button, grid2_col++, 0, 1, 1);
5026 button = gtk_button_new_with_mnemonic(
_(
"_Apply"));
5027 gtk_size_group_add_widget(sizegroup, button);
5028 gtk_widget_set_tooltip_text(button,
5029 _(
"Pressing this button will send all modified properties of "
5030 "the objects selected in the object list to the server. "
5031 "Modified properties' names are shown in red in the properties "
5033 g_signal_connect(button,
"clicked",
5035 gtk_grid_attach(GTK_GRID(hgrid2), button, grid2_col++, 0, 1, 1);
5111 const struct city *pcity,
5123 canvas.
surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, fw, fh);
5126 cairo_set_operator(cr, CAIRO_OPERATOR_CLEAR);
5138 ptile, NULL, NULL,
punit, pcity,
5167 gpointer object_data)
5203 const struct tile *ptile)
5206 if (!pp || !ptile) {
5245 log_error(
"%s(): Unhandled page object type %s (nb %d).", __FUNCTION__,
5265 GdkPixbuf *pixbuf = NULL;
5266 GtkListStore *store;
5294 gtk_list_store_set(store, iter, col_id, pv->
data.
v_int, -1);
5304 for (p = buf; *p; p++) {
5305 if (*p ==
'\n' || *p ==
'\t' || *p ==
'\r') {
5309 gtk_list_store_set(store, iter, col_id, buf, -1);
5312 gtk_list_store_set(store, iter, col_id, pv->
data.
v_pixbuf, -1);
5321 gtk_list_store_set(store, iter, col_id, buf2, -1);
5326 gtk_list_store_set(store, iter, col_id, pixbuf, -1);
5328 g_object_unref(pixbuf);
5333 gtk_list_store_set(store, iter, col_id, pixbuf, -1);
5335 g_object_unref(pixbuf);
5361 GtkTreeRowReference *rr;
5362 GtkTreeModel *model;
5372 gtk_list_store_set(pp->
object_store, &iter, 0, ob, -1);
5373 path = gtk_tree_model_get_path(model, &iter);
5374 rr = gtk_tree_row_reference_new(model, path);
5375 gtk_tree_path_free(path);
5383 if (gtk_tree_model_get_iter_first(model, &iter)) {
5384 GtkTreeSelection *sel;
5385 sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(pp->
object_view));
5386 gtk_tree_selection_select_iter(sel, &iter);
5443 const struct tile_list *tiles)
5445 if (!pp || !tiles) {
5475 GtkTreeSelection *sel;
5476 GtkTreeModel *model;
5481 bool changed =
FALSE;
5491 sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(pp->
object_view));
5492 rows = gtk_tree_selection_get_selected_rows(sel, &model);
5494 for (p = rows; p != NULL; p = p->next) {
5496 if (gtk_tree_model_get_iter(model, &iter, path)) {
5497 gtk_tree_model_get(model, &iter, 0, &ob, -1);
5500 gtk_tree_path_free(path);
5515 GtkTreeSelection *sel;
5516 GtkTreeModel *model;
5528 sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(pp->
object_view));
5529 if (gtk_tree_selection_count_selected_rows(sel) < 1) {
5538 rows = gtk_tree_selection_get_selected_rows(sel, &model);
5540 for (p = rows; p != NULL; p = p->next) {
5542 if (gtk_tree_model_get_iter(model, &iter, path)) {
5543 gtk_tree_model_get(model, &iter, 0, &ob, -1);
5555 gtk_tree_path_free(path);
5641 log_error(
"%s(): Unhandled object type %s (nb %d).",
5671 GtkTreeSelection *sel;
5672 GtkTreeModel *model;
5682 sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(pp->
object_view));
5683 if (gtk_tree_selection_count_selected_rows(sel) < 1) {
5687 rows = gtk_tree_selection_get_selected_rows(sel, &model);
5688 for (p = rows; p != NULL; p = p->next) {
5690 if (gtk_tree_model_get_iter(model, &iter, path)) {
5691 gtk_tree_model_get(model, &iter, 0, &ob, -1);
5697 gtk_tree_path_free(path);
5712 GtkTreeSelection *sel;
5713 GtkTreeModel *model;
5724 sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(pp->
object_view));
5725 if (gtk_tree_selection_count_selected_rows(sel) < 1) {
5729 rows = gtk_tree_selection_get_selected_rows(sel, &model);
5731 for (p = rows; p != NULL; p = p->next) {
5733 if (gtk_tree_model_get_iter(model, &iter, path)) {
5734 gtk_tree_model_get(model, &iter, 0, &ob, -1);
5737 gtk_tree_path_free(path);
5750 struct tile_list *hint_tiles)
5753 int apno, value, count,
size;
5756 struct tile *ptile = NULL;
5782 if (NULL == ptile) {
5786 if (NULL == ptile) {
5832 if (pplayer && hint_tiles) {
5879 GtkTreeRowReference *rr;
5887 if (rr && gtk_tree_row_reference_valid(rr)) {
5890 GtkTreeModel *model;
5893 path = gtk_tree_row_reference_get_path(rr);
5895 if (gtk_tree_model_get_iter(model, &iter, path)) {
5905 gtk_tree_path_free(path);
5976 GtkNotebook *notebook;
5989 page = gtk_notebook_page_num(notebook, w);
5990 gtk_notebook_set_current_page(notebook, page);
6004 if (stored_tag_hash_lookup(pp->
tag_table, tag, NULL)) {
6005 log_error(
"Attempted to insert object creation tag %d "
6006 "twice into tag table for property page %p (%d %s).",
6012 stored_tag_hash_insert(pp->
tag_table, tag, count);
6028 if (stored_tag_hash_lookup(pp->
tag_table, tag, &count)) {
6030 stored_tag_hash_remove(pp->
tag_table, tag);
6043 return stored_tag_hash_lookup(pp->
tag_table, tag, NULL);
6085 struct tile_list *tiles = NULL;
6093 tiles = tile_list_new();
6098 tile_list_append(tiles, ptile);
6103 tile_list_destroy(tiles);
6141 label = gtk_label_new(
name);
6142 gtk_notebook_append_page(GTK_NOTEBOOK(pe->
notebook),
6178 win = gtk_window_new();
6179 gtk_window_set_title(GTK_WINDOW(win),
_(
"Property Editor"));
6180 gtk_window_set_resizable(GTK_WINDOW(win),
TRUE);
6181 gtk_window_set_default_size(GTK_WINDOW(win), 780, 560);
6182 gtk_window_set_transient_for(GTK_WINDOW(win), GTK_WINDOW(
toplevel));
6183 gtk_window_set_destroy_with_parent(GTK_WINDOW(win),
TRUE);
6184 gtk_widget_set_margin_start(win, 4);
6185 gtk_widget_set_margin_end(win, 4);
6186 gtk_widget_set_margin_top(win, 4);
6187 gtk_widget_set_margin_bottom(win, 4);
6188 gtk_window_set_hide_on_close(GTK_WINDOW(win),
TRUE);
6191 vgrid = gtk_grid_new();
6192 gtk_window_set_child(GTK_WINDOW(win), vgrid);
6197 gtk_notebook_set_show_tabs(GTK_NOTEBOOK(
notebook),
TRUE);
6198 gtk_grid_attach(GTK_GRID(vgrid),
notebook, 0, grid_row++, 1, 1);
6223 const struct tile_list *tiles)
6235 if (!pe || !tiles) {
6244 for (i = 0; i <
ARRAY_SIZE(preferred) - 1; i++) {
6261 if (!pe || !pe->
widget) {
6265 gtk_widget_show(pe->
widget);
6267 gtk_window_present(GTK_WINDOW(pe->
widget));
6278 if (!pe || !pe->
widget) {
6281 gtk_widget_hide(pe->
widget);
6311 int tag,
int object_id)
6401 int or_clause_count, and_clause_count;
6403 const char *pattern;
6408 if (!filter || filter[0] ==
'\0') {
6412 or_clause_count =
get_tokens(filter, or_clauses,
6416 for (i = 0; i < or_clause_count; i++) {
6417 if (or_clauses[i][0] ==
'\0') {
6422 and_clause_count =
get_tokens(or_clauses[i], and_clauses,
6426 for (j = 0; j < and_clause_count; j++) {
6427 if (and_clauses[j][0] ==
'\0') {
6431 pattern = and_clauses[j];
6433 switch (pattern[0]) {
6476 bool match, or_result, and_result;
6491 if (pf->
count < 1) {
6497 for (i = 0; i < pf->
count; i++) {
6500 for (j = 0; j < pfc->
count; j++) {
6502 match = (pfp->
text[0] ==
'\0'
6507 and_result = and_result && match;
6512 or_result = or_result || and_result;
6534 for (i = 0; i < pf->
count; i++) {
6536 for (j = 0; j < pfc->
count; j++) {
6538 if (pfp->
text != NULL) {
6557 return _(
"Seen (Main)");
6560 return _(
"Seen (Invis)");
6563 return _(
"Seen (Subsurface)");
6568 log_error(
"%s(): Unrecognized vision layer %d.", __FUNCTION__, vl);
6569 return _(
"Unknown");
Base_type_id base_number(const struct base_type *pbase)
Base_type_id base_count(void)
bool dbv_isset(const struct dbv *pdbv, int bit)
#define BV_ARE_EQUAL(vec1, vec2)
#define BV_ISSET(bv, bit)
struct canvas int int canvas_y
struct canvas int canvas_x
int city_granary_size(int city_size)
bool city_can_be_built_here(const struct civ_map *nmap, const struct tile *ptile, const struct unit *punit, bool hut_test)
#define city_tile(_pcity_)
static citizens city_size_get(const struct city *pcity)
#define city_owner(_pcity_)
bool client_nation_is_in_current_set(const struct nation_type *pnation)
void connection_do_buffer(struct connection *pc)
void connection_do_unbuffer(struct connection *pc)
struct unit struct city struct unit struct tile struct extra_type const struct act_prob *act_probs int actor_unit_id struct unit struct unit * punit
int editor_tool_get_size(enum editor_tool_type ett)
int editor_tool_get_value(enum editor_tool_type ett)
int editor_tool_get_count(enum editor_tool_type ett)
struct unit * editor_unit_virtual_create(void)
int editor_tool_get_applied_player(enum editor_tool_type ett)
void free_tokens(char **tokens, size_t ntokens)
int get_tokens(const char *str, char **tokens, size_t num_tokens, const char *delimiterset)
const struct functions * fc_funcs
#define PL_(String1, String2, n)
struct unit * game_unit_by_number(int id)
struct city * game_city_by_number(int id)
const char * government_name_translation(const struct government *pgovern)
Government_type_id government_count(void)
struct government * government_by_number(const Government_type_id gov)
Government_type_id government_index(const struct government *pgovern)
#define governments_iterate(NAME_pgov)
#define governments_iterate_end
#define FC_STATIC_CANVAS_INIT
static void add_column(GtkWidget *view, int col_id, const char *name, GType gtype, bool editable, bool is_radio, GCallback edit_callback, gpointer callback_userdata)
static void property_page_reset_objbinds(struct property_page *pp)
static void property_page_send_values(struct property_page *pp)
static void objprop_setup_widget(struct objprop *op)
static void property_page_store_creation_tag(struct property_page *pp, int tag, int count)
static gchar * propval_as_string(struct propval *pv)
static struct property_page * objprop_get_property_page(const struct objprop *op)
static const char * objprop_get_name(const struct objprop *op)
const char * vision_layer_get_name(enum vision_layer)
static int objbind_get_object_id(struct objbind *ob)
static void objprop_set_extviewer(struct objprop *op, struct extviewer *ev)
static GtkWidget * extviewer_get_panel_widget(struct extviewer *ev)
static gpointer objtype_get_object_from_id(enum editor_object_type objtype, int id)
void property_editor_handle_object_changed(struct property_editor *pe, enum editor_object_type objtype, int object_id, bool remove)
static struct propstate * propstate_new(struct objprop *op, struct propval *pv)
static const char * valtype_get_name(enum value_types valtype)
static void propstate_destroy(struct propstate *ps)
static bool objbind_set_modified_value(struct objbind *ob, struct objprop *op, struct propval *pv)
static GtkCellRenderer * objprop_create_cell_renderer(const struct objprop *op)
static void extviewer_clear_widgets(struct extviewer *ev)
@ VALTYPE_INVENTIONS_ARRAY
@ VALTYPE_TILE_VISION_DATA
static void objprop_set_child_widget(struct objprop *op, const char *widget_name, GtkWidget *widget)
static bool property_editor_add_page(struct property_editor *pe, enum editor_object_type objtype)
static void propstate_clear_value(struct propstate *ps)
static void objbind_pack_modified_value(struct objbind *ob, struct objprop *op, union packetdata packet)
static struct objbind * property_page_get_focused_objbind(struct property_page *pp)
static bool objprop_has_widget(const struct objprop *op)
static int objtype_get_id_from_object(enum editor_object_type objtype, gpointer object)
static enum editor_object_type objbind_get_objtype(const struct objbind *ob)
static struct extviewer * objprop_get_extviewer(struct objprop *op)
static void extviewer_refresh_widgets(struct extviewer *ev, struct propval *pv)
static enum editor_object_type property_page_get_objtype(const struct property_page *pp)
#define property_page_objbind_iterate_end
static void property_page_show_extviewer(struct property_page *pp, struct extviewer *ev)
static gpointer objbind_get_object(struct objbind *ob)
static const char * property_page_get_name(const struct property_page *pp)
void property_editor_handle_object_created(struct property_editor *pe, int tag, int object_id)
static bool objbind_property_is_modified(struct objbind *ob, struct objprop *op)
static struct propval * propstate_get_value(struct propstate *ps)
static void property_page_clear_tags(struct property_page *pp)
static void property_page_object_created(struct property_page *pp, int tag, int object_id)
static bool property_page_tag_is_known(struct property_page *pp, int tag)
static void property_page_remove_creation_tag(struct property_page *pp, int tag)
static void property_page_load_tiles(struct property_page *pp, const struct tile_list *tiles)
static void property_page_create_objects(struct property_page *pp, struct tile_list *hint_tiles)
static void property_page_add_extviewer(struct property_page *pp, struct extviewer *ev)
static void property_page_refresh_button_clicked(GtkButton *button, gpointer userdata)
static void property_page_set_focused_objbind(struct property_page *pp, struct objbind *ob)
static void property_page_setup_objprops(struct property_page *pp)
static void objbind_set_rowref(struct objbind *ob, GtkTreeRowReference *rr)
static void objbind_clear_modified_value(struct objbind *ob, struct objprop *op)
static struct propval * objbind_get_value_from_object(struct objbind *ob, struct objprop *op)
static void propval_free(struct propval *pv)
static struct property_filter * property_filter_new(const char *filter)
static bool property_page_set_store_value(struct property_page *pp, struct objprop *op, struct objbind *ob, GtkTreeIter *iter)
static const char * objtype_get_name(enum editor_object_type objtype)
static void objbind_clear_all_modified_values(struct objbind *ob)
static bool property_filter_match(struct property_filter *pf, const struct objprop *op)
void property_editor_popup(struct property_editor *pe, enum editor_object_type objtype)
static void property_page_destroy_button_clicked(GtkButton *button, gpointer userdata)
static struct objbind * objbind_new(enum editor_object_type objtype, gpointer object)
static gboolean property_page_selection_func(GtkTreeSelection *sel, GtkTreeModel *model, GtkTreePath *path, gboolean currently_selected, gpointer data)
static int property_page_get_num_objbinds(const struct property_page *pp)
static bool objprop_show_in_listview(const struct objprop *op)
static GType objprop_get_gtype(const struct objprop *op)
static void objprop_set_treeview_column(struct objprop *op, GtkTreeViewColumn *col)
static void objbind_pack_current_values(struct objbind *ob, union packetdata packet)
static const char * objprop_get_attribute_type_string(const struct objprop *op)
static struct propval * propval_copy(struct propval *pv)
struct property_editor * editprop_get_property_editor(void)
void property_editor_reload(struct property_editor *pe, enum editor_object_type objtype)
static GdkPixbuf * create_unit_pixbuf(const struct unit *punit)
static void extviewer_view_cell_toggled(GtkCellRendererToggle *cell, gchar *path, gpointer userdata)
static struct property_editor * property_editor_new(void)
static void property_page_send_packet(struct property_page *pp, union packetdata packet)
static gchar * built_status_to_string(struct built_status *bs)
static int objprop_get_id(const struct objprop *op)
@ OPID_GAME_LAKE_FLOODING
@ OPID_GAME_SCENARIO_NAME
@ OPID_GAME_SCENARIO_AUTHORS
@ OPID_GAME_PREVENT_CITIES
@ OPID_GAME_SCENARIO_DESC
@ OPID_GAME_STARTPOS_NATIONS
@ OPID_PLAYER_SCENARIO_RESERVED
@ OPID_GAME_SCENARIO_RANDSTATE
@ OPID_GAME_SCENARIO_PLAYERS
@ OPID_GAME_RULESET_LOCKED
static enum value_types objprop_get_valtype(const struct objprop *op)
static int get_next_unique_tag(void)
static bool objprop_is_sortable(const struct objprop *op)
static void property_page_add_objbinds_from_tile(struct property_page *pp, const struct tile *ptile)
static const char * objprop_get_tooltip(const struct objprop *op)
static GtkTreeRowReference * objbind_get_rowref(struct objbind *ob)
static void property_filter_free(struct property_filter *pf)
static void objprop_widget_spin_button_changed(GtkSpinButton *spin, gpointer userdata)
#define PF_DISJUNCTION_SEPARATOR
static GtkWidget * objprop_get_child_widget(struct objprop *op, const char *widget_name)
static void property_page_selection_changed(GtkTreeSelection *sel, gpointer userdata)
static bool objtype_is_conserved(enum editor_object_type objtype)
static struct extviewer * extviewer_new(struct objprop *op)
static bool propval_equal(struct propval *pva, struct propval *pvb)
static void property_page_quick_find_entry_changed(GtkWidget *entry, gpointer userdata)
static void objprop_refresh_widget(struct objprop *op, struct objbind *ob)
void property_editor_popdown(struct property_editor *pe)
static void objbind_destroy(struct objbind *ob)
static void property_page_add_objbind(struct property_page *pp, gpointer object_data)
static void objbind_request_destroy_object(struct objbind *ob)
static void property_page_create_button_clicked(GtkButton *button, gpointer userdata)
static GdkPixbuf * create_pixbuf_from_layers(const struct tile *ptile, const struct unit *punit, const struct city *pcity, enum layer_category category)
static union packetdata property_page_new_packet(struct property_page *pp)
static void propstate_set_value(struct propstate *ps, struct propval *pv)
static int objprop_get_column_id(const struct objprop *op)
static GdkPixbuf * create_tile_pixbuf(const struct tile *ptile)
static struct objprop * extviewer_get_objprop(struct extviewer *ev)
static bool can_create_unit_at_tile(struct tile *ptile)
static struct objbind * property_page_get_objbind(struct property_page *pp, int object_id)
static bool objbind_get_allowed_value_span(struct objbind *ob, struct objprop *op, double *pmin, double *pmax, double *pstep, double *pbig_step)
static void property_page_free_packet(struct property_page *pp, union packetdata packet)
static GdkPixbuf * create_city_pixbuf(const struct city *pcity)
#define ADDPROP(ARG_id, ARG_name, ARG_tooltip, ARG_flags, ARG_valtype)
static void extviewer_panel_button_clicked(GtkButton *button, gpointer userdata)
static void property_page_destroy_objects(struct property_page *pp)
void property_editor_load_tiles(struct property_editor *pe, const struct tile_list *tiles)
static struct property_page * property_page_new(enum editor_object_type objtype, struct property_editor *parent)
#define property_page_objprop_iterate_end
static void property_page_clear_objbinds(struct property_page *pp)
void property_editor_clear(struct property_editor *pe)
#define property_page_objprop_iterate(ARG_pp, NAME_op)
static void objprop_set_column_id(struct objprop *op, int col_id)
static void objbind_bind_properties(struct objbind *ob, struct property_page *pp)
static void property_page_fill_widgets(struct property_page *pp)
static bool objbind_has_modified_properties(struct objbind *ob)
static void property_page_change_value(struct property_page *pp, struct objprop *op, struct propval *pv)
static void objprop_widget_toggle_button_changed(GtkToggleButton *button, gpointer userdata)
#define PF_CONJUNCTION_SEPARATOR
static void property_page_apply_button_clicked(GtkButton *button, gpointer userdata)
static struct objprop * objprop_new(int id, const char *name, const char *tooltip, enum object_property_flags flags, enum value_types valtype, struct property_page *parent)
static GtkWidget * extviewer_get_view_widget(struct extviewer *ev)
static GtkWidget * objprop_get_widget(struct objprop *op)
static void propval_free_data(struct propval *pv)
static void extviewer_textbuf_changed(GtkTextBuffer *textbuf, gpointer userdata)
static struct property_editor * the_property_editor
static void property_page_object_changed(struct property_page *pp, int object_id, bool remove)
static bool objprop_is_readonly(const struct objprop *op)
#define property_page_objbind_iterate(ARG_pp, NAME_ob)
static GtkTreeViewColumn * objprop_get_treeview_column(const struct objprop *op)
static struct property_page * property_editor_get_page(struct property_editor *pe, enum editor_object_type objtype)
static struct propval * objbind_get_modified_value(struct objbind *ob, struct objprop *op)
void disable_gobject_callback(GObject *obj, GCallback cb)
void enable_gobject_callback(GObject *obj, GCallback cb)
GdkPixbuf * get_flag(const struct nation_type *nation)
GdkPixbuf * surface_get_pixbuf(cairo_surface_t *surf, int width, int height)
GdkPixbuf * sprite_get_pixbuf(struct sprite *sprite)
static void objprop_widget_text_changed(GtkEditable *text, gpointer userdata)
bool is_special_improvement(const struct impr_type *pimprove)
Impr_type_id improvement_index(const struct impr_type *pimprove)
bool is_great_wonder(const struct impr_type *pimprove)
const char * improvement_name_translation(const struct impr_type *pimprove)
bool is_small_wonder(const struct impr_type *pimprove)
#define improvement_iterate_end
#define improvement_iterate(_p)
#define fc_assert_ret_val(condition, val)
#define log_error(message,...)
struct startpos * map_startpos_get(const struct tile *ptile)
int startpos_number(const struct startpos *psp)
struct tile * startpos_tile(const struct startpos *psp)
const struct nation_hash * startpos_raw_nations(const struct startpos *psp)
bool startpos_pack(const struct startpos *psp, struct packet_edit_startpos_full *packet)
struct tile * index_to_tile(const struct civ_map *imap, int mindex)
bool startpos_is_excluding(const struct startpos *psp)
struct startpos * map_startpos_by_number(int id)
#define index_to_native_pos(pnat_x, pnat_y, mindex)
#define index_to_map_pos(pmap_x, pmap_y, mindex)
struct tile * get_center_tile_mapcanvas(void)
void put_one_element(struct canvas *pcanvas, float zoom, enum mapview_layer layer, const struct tile *ptile, const struct tile_edge *pedge, const struct tile_corner *pcorner, const struct unit *punit, const struct city *pcity, int canvas_x, int canvas_y, const struct city *citymode, const struct unit_type *putype)
#define fc_calloc(n, esz)
bool can_unit_exist_at_tile(const struct civ_map *nmap, const struct unit *punit, const struct tile *ptile)
Nation_type_id nation_count(void)
Nation_type_id nation_number(const struct nation_type *pnation)
const char * nation_adjective_translation(const struct nation_type *pnation)
struct nation_type * nation_by_number(const Nation_type_id nation)
struct nation_type * nation_of_player(const struct player *pplayer)
bool is_nation_playable(const struct nation_type *nation)
Nation_type_id nation_index(const struct nation_type *pnation)
enum barbarian_type nation_barbarian_type(const struct nation_type *nation)
#define nation_hash_iterate(nationhash, pnation)
#define nations_iterate_end
#define nations_iterate(NAME_pnation)
#define nation_hash_iterate_end
int dsend_packet_edit_city_create(struct connection *pc, int owner, int tile, int size, int tag)
int send_packet_edit_city(struct connection *pc, const struct packet_edit_city *packet)
int send_packet_edit_game(struct connection *pc, const struct packet_edit_game *packet)
int dsend_packet_edit_city_remove(struct connection *pc, int id16, int id32)
int dsend_packet_edit_unit_remove_by_id(struct connection *pc, int id16, int id32)
int send_packet_edit_startpos_full(struct connection *pc, const struct packet_edit_startpos_full *packet)
int dsend_packet_edit_startpos(struct connection *pc, int id, bool removal, int tag)
int send_packet_edit_player(struct connection *pc, const struct packet_edit_player *packet)
int dsend_packet_edit_player_create(struct connection *pc, int tag)
int send_packet_edit_unit(struct connection *pc, const struct packet_edit_unit *packet)
int send_packet_edit_scenario_desc(struct connection *pc, const struct packet_edit_scenario_desc *packet)
int dsend_packet_edit_unit_create(struct connection *pc, int owner, int tile, Unit_type_id type, int count, int tag)
int dsend_packet_edit_player_remove(struct connection *pc, int id)
int send_packet_edit_tile(struct connection *pc, const struct packet_edit_tile *packet)
bool player_slot_is_used(const struct player_slot *pslot)
struct player * player_by_number(const int player_id)
int player_number(const struct player *pplayer)
const char * player_name(const struct player *pplayer)
int player_slot_index(const struct player_slot *pslot)
bool player_has_flag(const struct player *pplayer, enum plr_flag_id flag)
int player_index(const struct player *pplayer)
bool pplayers_allied(const struct player *pplayer, const struct player *pplayer2)
struct player * player_slot_get_player(const struct player_slot *pslot)
#define players_iterate_end
#define players_iterate(_pplayer)
#define player_slots_iterate(_pslot)
#define player_slots_iterate_end
struct research * research_get(const struct player *pplayer)
enum tech_state research_invention_state(const struct research *presearch, Tech_type_id tech)
Road_type_id road_count(void)
Road_type_id road_number(const struct road_type *proad)
cairo_surface_t * surface
struct built_status built[B_LAST]
struct packet_scenario_description scenario_desc
struct packet_game_info info
struct packet_scenario_info scenario
struct propval * pv_cached
bool(* player_tile_vision_get)(const struct tile *ptile, const struct player *pplayer, enum vision_layer vision)
struct propstate_hash * propstate_table
struct property_page * parent_property_page
GtkTreeRowReference * rowref
enum editor_object_type objtype
struct property_page * parent_page
enum object_property_flags flags
struct extviewer * extviewer
GtkTreeViewColumn * view_column
char name[MAX_LEN_CITYNAME]
char scenario_authors[MAX_LEN_PACKET/3]
Government_type_id government
bool inventions[A_LAST+1]
bv_startpos_nations nations
char description[MAX_LEN_CONTENT]
char authors[MAX_LEN_PACKET/3]
struct pf_pattern conjunction[PF_MAX_CLAUSES]
struct government * government
struct player_economic economic
struct nation_type * nation
struct property_page * property_pages[NUM_OBJTYPES]
struct pf_conjunction disjunction[PF_MAX_CLAUSES]
GtkListStore * object_store
struct property_editor * pe_parent
GtkWidget * extviewer_notebook
struct objbind_hash * objbind_table
struct objbind * focused_objbind
struct stored_tag_hash * tag_table
enum editor_object_type objtype
struct objprop_hash * objprop_table
struct propval * property_value
bv_player tile_seen[V_COUNT]
int fc_snprintf(char *str, size_t n, const char *format,...)
size_t fc_strlcpy(char *dest, const char *src, size_t n)
char * fc_strcasestr(const char *haystack, const char *needle)
#define sz_strlcpy(dest, src)
#define sz_strlcat(dest, src)
const char * advance_name_translation(const struct advance *padvance)
Tech_type_id advance_index(const struct advance *padvance)
#define advance_index_iterate_end
#define advance_iterate(_start, _p)
static Tech_type_id advance_count(void)
#define advance_iterate_end
#define advance_index_iterate(_start, _index)
const char * terrain_name_translation(const struct terrain *pterrain)
struct city * tile_city(const struct tile *ptile)
#define tile_resource(_tile)
#define tile_list_iterate(tile_list, ptile)
#define tile_terrain(_tile)
#define tile_list_iterate_end
static const bv_extras * tile_extras(const struct tile *ptile)
#define tile_has_extra(ptile, pextra)
struct sprite * get_government_sprite(const struct tileset *t, const struct government *gov)
int tileset_small_sprite_width(const struct tileset *t)
int tileset_full_tile_height(const struct tileset *t)
bool tileset_layer_in_category(enum mapview_layer layer, enum layer_category cat)
int tileset_small_sprite_height(const struct tileset *t)
int tileset_tile_height(const struct tileset *t)
int tileset_full_tile_width(const struct tileset *t)
int tileset_tile_width(const struct tileset *t)
#define mapview_layer_iterate(layer)
#define mapview_layer_iterate_end
struct packet_edit_tile * tile
struct packet_edit_unit * unit
struct packetdata::@145 pointers
struct packet_edit_player * player
struct packet_edit_city * city
struct packet_edit_game * game
struct packet_edit_startpos_full * startpos
struct government * v_gov
bv_max_extras v_bv_special
struct tile_vision_data * v_tile_vision
struct built_status * v_built
struct nation_type * v_nation
struct nation_hash * v_nation_hash
const char * v_const_string
static bool is_enemy_unit_tile(const struct tile *ptile, const struct player *pplayer)
static bool is_non_allied_unit_tile(const struct tile *ptile, const struct player *pplayer)
#define unit_list_iterate(unitlist, punit)
#define unit_list_iterate_end
const struct unit_type * unit_type_get(const struct unit *punit)
int utype_veteran_levels(const struct unit_type *punittype)
const char * utype_name_translation(const struct unit_type *punittype)
#define utype_fuel(ptype)
#define vision_layer_iterate(v)
#define vision_layer_iterate_end