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;
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 *ebox, *hbox, *hbox2, *label, *image, *
entry, *spin, *button;
2936 ebox = gtk_event_box_new();
2939 hbox = gtk_grid_new();
2940 gtk_grid_set_column_spacing(GTK_GRID(hbox), 4);
2942 gtk_container_add(GTK_CONTAINER(ebox), hbox);
2945 gtk_widget_set_halign(label, GTK_ALIGN_START);
2946 gtk_widget_set_valign(label, GTK_ALIGN_CENTER);
2947 gtk_container_add(GTK_CONTAINER(hbox), label);
2970 case OPID_TILE_ADDRESS:
2971 case OPID_UNIT_ADDRESS:
2972 case OPID_CITY_ADDRESS:
2973 case OPID_PLAYER_ADDRESS:
2975 label = gtk_label_new(NULL);
2976 gtk_widget_set_hexpand(label,
TRUE);
2977 gtk_widget_set_halign(label, GTK_ALIGN_START);
2978 gtk_widget_set_valign(label, GTK_ALIGN_CENTER);
2979 gtk_container_add(GTK_CONTAINER(hbox), label);
2987 image = gtk_image_new();
2988 gtk_widget_set_hexpand(image,
TRUE);
2989 gtk_widget_set_halign(image, GTK_ALIGN_START);
2990 gtk_widget_set_valign(image, GTK_ALIGN_CENTER);
2991 gtk_container_add(GTK_CONTAINER(hbox), image);
2999 entry = gtk_entry_new();
3001 gtk_widget_set_halign(
entry, GTK_ALIGN_END);
3002 gtk_entry_set_width_chars(GTK_ENTRY(
entry), 8);
3003 g_signal_connect(
entry,
"changed",
3005 gtk_container_add(GTK_CONTAINER(hbox),
entry);
3015 spin = gtk_spin_button_new_with_range(0.0, 100.0, 1.0);
3016 gtk_widget_set_hexpand(spin,
TRUE);
3017 gtk_widget_set_halign(spin, GTK_ALIGN_END);
3018 g_signal_connect(spin,
"value-changed",
3020 gtk_container_add(GTK_CONTAINER(hbox), spin);
3028 hbox2 = gtk_grid_new();
3029 gtk_widget_set_hexpand(hbox2,
TRUE);
3030 gtk_widget_set_halign(hbox2, GTK_ALIGN_END);
3031 gtk_grid_set_column_spacing(GTK_GRID(hbox2), 4);
3032 gtk_container_add(GTK_CONTAINER(hbox), hbox2);
3033 spin = gtk_spin_button_new_with_range(0.0, 100.0, 1.0);
3034 g_signal_connect(spin,
"value-changed",
3036 gtk_container_add(GTK_CONTAINER(hbox2), spin);
3038 label = gtk_label_new(NULL);
3039 gtk_widget_set_halign(label, GTK_ALIGN_START);
3040 gtk_widget_set_valign(label, GTK_ALIGN_CENTER);
3041 gtk_container_add(GTK_CONTAINER(hbox2), label);
3076 button = gtk_check_button_new();
3077 gtk_widget_set_hexpand(button,
TRUE);
3078 gtk_widget_set_halign(button, GTK_ALIGN_END);
3079 g_signal_connect(button,
"toggled",
3081 gtk_container_add(GTK_CONTAINER(hbox), button);
3086 log_error(
"%s(): Unhandled request to create widget for property %d (%s).",
3101 GtkWidget *w, *label, *image, *
entry, *spin, *button;
3106 double min, max,
step, big_step;
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);
3207 gtk_entry_set_text(GTK_ENTRY(
entry),
"");
3209 gtk_widget_set_sensitive(
entry, pv != NULL);
3223 &
step, &big_step)) {
3224 gtk_spin_button_set_range(GTK_SPIN_BUTTON(spin), min, max);
3225 gtk_spin_button_set_increments(GTK_SPIN_BUTTON(spin),
3228 gtk_spin_button_set_value(GTK_SPIN_BUTTON(spin), pv->
data.
v_int);
3232 gtk_widget_set_sensitive(spin, pv != NULL);
3245 &
step, &big_step)) {
3246 gtk_spin_button_set_range(GTK_SPIN_BUTTON(spin), min, max);
3247 gtk_spin_button_set_increments(GTK_SPIN_BUTTON(spin),
3250 gtk_label_set_text(GTK_LABEL(label), buf);
3252 gtk_label_set_text(GTK_LABEL(label), NULL);
3254 gtk_spin_button_set_value(GTK_SPIN_BUTTON(spin), pv->
data.
v_int);
3258 gtk_label_set_text(GTK_LABEL(label), NULL);
3260 gtk_widget_set_sensitive(spin, pv != NULL);
3298 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button),
3301 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button),
FALSE);
3305 gtk_widget_set_sensitive(button, pv != NULL);
3320 "<span foreground=\"red\">%s</span>",
name);
3321 gtk_label_set_markup(GTK_LABEL(label), namebuf);
3323 gtk_label_set_text(GTK_LABEL(label),
name);
3348 const char *widget_name,
3353 if (!op || !widget_name || !
widget) {
3359 log_error(
"Cannot store child widget %p under name "
3360 "\"%s\" using objprop_set_child_widget for object "
3361 "property %d (%s) because objprop_get_widget does "
3362 "not return a valid widget.",
3367 g_object_set_data(G_OBJECT(w), widget_name,
widget);
3375 const char *widget_name)
3377 GtkWidget *w, *child;
3379 if (!op || !widget_name) {
3385 log_error(
"Cannot retrieve child widget under name "
3386 "\"%s\" using objprop_get_child_widget for object "
3387 "property %d (%s) because objprop_get_widget does "
3388 "not return a valid widget.",
3393 child = g_object_get_data(G_OBJECT(w), widget_name);
3395 log_error(
"Child widget \"%s\" not found for object "
3396 "property %d (%s) via objprop_get_child_widget.",
3469 GtkWidget *hbox, *vbox, *label, *button, *scrollwin, *image;
3470 GtkWidget *
view = NULL;
3471 GtkTreeSelection *sel;
3472 GtkListStore *
store = NULL;
3473 GtkTextBuffer *
textbuf = NULL;
3499 hbox = gtk_grid_new();
3500 gtk_grid_set_column_spacing(GTK_GRID(hbox), 4);
3503 label = gtk_label_new(NULL);
3504 gtk_widget_set_halign(label, GTK_ALIGN_START);
3505 gtk_widget_set_valign(label, GTK_ALIGN_CENTER);
3506 gtk_container_add(GTK_CONTAINER(hbox), label);
3512 vbox = gtk_grid_new();
3513 gtk_orientable_set_orientation(GTK_ORIENTABLE(vbox),
3514 GTK_ORIENTATION_VERTICAL);
3515 gtk_grid_set_row_spacing(GTK_GRID(vbox), 4);
3518 label = gtk_label_new(NULL);
3519 gtk_widget_set_halign(label, GTK_ALIGN_START);
3520 gtk_widget_set_valign(label, GTK_ALIGN_CENTER);
3521 gtk_container_add(GTK_CONTAINER(vbox), label);
3524 hbox = gtk_grid_new();
3525 gtk_grid_set_column_spacing(GTK_GRID(hbox), 4);
3526 gtk_container_add(GTK_CONTAINER(vbox), hbox);
3528 image = gtk_image_new();
3529 gtk_widget_set_halign(image, GTK_ALIGN_START);
3530 gtk_widget_set_valign(image, GTK_ALIGN_CENTER);
3531 gtk_container_add(GTK_CONTAINER(hbox), image);
3536 hbox = gtk_grid_new();
3537 gtk_grid_set_column_spacing(GTK_GRID(hbox), 4);
3542 log_error(
"Unhandled request to create panel widget "
3543 "for property %d (%s) in extviewer_new().",
3545 hbox = gtk_grid_new();
3546 gtk_grid_set_column_spacing(GTK_GRID(hbox), 4);
3552 button = gtk_button_new_with_label(
Q_(
"?verb:View"));
3554 button = gtk_button_new_with_label(
_(
"Edit"));
3556 g_signal_connect(button,
"clicked",
3558 gtk_container_add(GTK_CONTAINER(hbox), button);
3569 store = gtk_list_store_new(3, G_TYPE_BOOLEAN, G_TYPE_INT,
3573 num_cols = 3 + 1 + V_COUNT;
3574 gtypes =
fc_malloc(num_cols *
sizeof(GType));
3575 gtypes[0] = G_TYPE_INT;
3576 gtypes[1] = GDK_TYPE_PIXBUF;
3577 gtypes[2] = G_TYPE_STRING;
3578 gtypes[3] = G_TYPE_BOOLEAN;
3580 gtypes[4 + v] = G_TYPE_BOOLEAN;
3582 store = gtk_list_store_newv(num_cols, gtypes);
3586 store = gtk_list_store_new(4, G_TYPE_BOOLEAN, G_TYPE_INT,
3587 G_TYPE_STRING, G_TYPE_STRING);
3592 store = gtk_list_store_new(4, G_TYPE_BOOLEAN, G_TYPE_INT,
3593 GDK_TYPE_PIXBUF, G_TYPE_STRING);
3597 textbuf = gtk_text_buffer_new(NULL);
3600 log_error(
"Unhandled request to create data store "
3601 "for property %d (%s) in extviewer_new().",
3611 vbox = gtk_grid_new();
3612 gtk_orientable_set_orientation(GTK_ORIENTABLE(vbox),
3613 GTK_ORIENTATION_VERTICAL);
3614 gtk_grid_set_row_spacing(GTK_GRID(vbox), 4);
3615 gtk_container_set_border_width(GTK_CONTAINER(vbox), 4);
3619 gtk_widget_set_halign(label, GTK_ALIGN_START);
3620 gtk_widget_set_valign(label, GTK_ALIGN_CENTER);
3621 gtk_container_add(GTK_CONTAINER(vbox), label);
3625 scrollwin = gtk_scrolled_window_new(NULL, NULL);
3626 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrollwin),
3627 GTK_SHADOW_ETCHED_IN);
3628 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrollwin),
3629 GTK_POLICY_AUTOMATIC,
3630 GTK_POLICY_AUTOMATIC);
3631 gtk_container_add(GTK_CONTAINER(vbox), scrollwin);
3634 view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(
store));
3635 sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(
view));
3636 gtk_tree_selection_set_mode(sel, GTK_SELECTION_MULTIPLE);
3640 gtk_text_view_set_editable(GTK_TEXT_VIEW(
view), editable);
3641 gtk_text_view_set_cursor_visible(GTK_TEXT_VIEW(
view), editable);
3643 gtk_widget_set_hexpand(
view,
TRUE);
3644 gtk_widget_set_vexpand(
view,
TRUE);
3646 gtk_container_add(GTK_CONTAINER(scrollwin),
view);
3730 g_signal_connect(
textbuf,
"changed",
3735 log_error(
"Unhandled request to configure view widget "
3736 "for property %d (%s) in extviewer_new().",
3794 GtkListStore *store;
3795 GtkTextBuffer *textbuf;
3821 gtk_list_store_clear(store);
3823 id = spe->data.special_idx;
3826 gtk_list_store_append(store, &iter);
3827 gtk_list_store_set(store, &iter, 0, present, 1,
id, 2,
name, -1);
3830 gtk_label_set_text(GTK_LABEL(ev->
panel_label), buf);
3835 gtk_list_store_clear(store);
3842 gtk_list_store_append(store, &iter);
3843 gtk_list_store_set(store, &iter, 0, present, 1,
id, 2,
name, -1);
3846 gtk_label_set_text(GTK_LABEL(ev->
panel_label), buf);
3851 gtk_list_store_clear(store);
3858 gtk_list_store_append(store, &iter);
3859 gtk_list_store_set(store, &iter, 0, present, 1,
id, 2,
name, -1);
3862 gtk_label_set_text(GTK_LABEL(ev->
panel_label), buf);
3867 gtk_list_store_clear(store);
3878 gtk_list_store_append(store, &iter);
3879 gtk_list_store_set(store, &iter, 0,
id, 2,
name, -1);
3881 gtk_list_store_set(store, &iter, 1, pixbuf, -1);
3882 g_object_unref(pixbuf);
3886 gtk_list_store_set(store, &iter, 3, present, -1);
3889 gtk_list_store_set(store, &iter, 4 + v, present, -1);
3895 gtk_list_store_clear(store);
3896 gtk_list_store_append(store, &iter);
3898 gtk_list_store_set(store, &iter, 0, all, 1, -1, 3,
3899 _(
"All nations"), -1);
3908 gtk_list_store_append(store, &iter);
3909 gtk_list_store_set(store, &iter, 0, present, 1,
id,
3910 2, pixbuf, 3,
name, -1);
3912 g_object_unref(pixbuf);
3917 gtk_label_set_text(GTK_LABEL(ev->
panel_label), buf);
3922 gtk_list_store_clear(store);
3930 present = turn_built >= 0;
3932 gtk_list_store_append(store, &iter);
3933 gtk_list_store_set(store, &iter, 0, present, 1,
id, 2,
name,
3938 gtk_label_set_text(GTK_LABEL(ev->
panel_label), buf);
3944 enum barbarian_type barbarian_type =
3947 gtk_list_store_clear(store);
3951 && (barbarian_type != NOT_A_BARBARIAN
3957 gtk_list_store_append(store, &iter);
3958 gtk_list_store_set(store, &iter, 0, present, 1,
id,
3959 2, pixbuf, 3,
name, -1);
3961 g_object_unref(pixbuf);
3968 gtk_image_set_from_pixbuf(GTK_IMAGE(ev->
panel_image), pixbuf);
3970 g_object_unref(pixbuf);
3977 gtk_list_store_clear(store);
3983 gtk_list_store_append(store, &iter);
3984 gtk_list_store_set(store, &iter, 0, present, 1,
id,
3985 2, pixbuf, 3,
name, -1);
3987 g_object_unref(pixbuf);
3993 gtk_image_set_from_pixbuf(GTK_IMAGE(ev->
panel_image), pixbuf);
3995 g_object_unref(pixbuf);
4001 gtk_list_store_clear(store);
4006 gtk_list_store_append(store, &iter);
4007 gtk_list_store_set(store, &iter, 0, present, 1,
id, 2,
name, -1);
4010 gtk_label_set_text(GTK_LABEL(ev->
panel_label), buf);
4019 GtkTextIter start, end;
4023 gtk_text_buffer_get_bounds(textbuf, &start, &end);
4024 oldtext = gtk_text_buffer_get_text(textbuf, &start, &end,
TRUE);
4033 gtk_label_set_text(GTK_LABEL(ev->
panel_label), buf);
4038 log_error(
"Unhandled request to refresh widgets "
4039 "extviewer_refresh_widgets() for objprop id=%d "
4064 gtk_label_set_text(GTK_LABEL(ev->
panel_label), NULL);
4075 gtk_list_store_clear(ev->
store);
4079 gtk_list_store_clear(ev->
store);
4080 gtk_image_set_from_pixbuf(GTK_IMAGE(ev->
panel_image), NULL);
4086 gtk_text_buffer_set_text(ev->
textbuf,
"", -1);
4092 log_error(
"Unhandled request to clear widgets "
4093 "in extviewer_clear_widgets() for objprop id=%d "
4131 GtkTreeModel *model;
4133 int id, old_id, turn_built;
4135 bool active, present;
4137 GdkPixbuf *pixbuf = NULL;
4151 active = gtk_cell_renderer_toggle_get_active(cell);
4154 model = GTK_TREE_MODEL(ev->
store);
4155 if (!gtk_tree_model_get_iter_from_string(model, &iter, path)) {
4164 gtk_tree_model_get(model, &iter, 1, &
id, -1);
4173 gtk_list_store_set(ev->
store, &iter, 0, present, -1);
4175 gtk_label_set_text(GTK_LABEL(ev->
panel_label), buf);
4180 gtk_tree_model_get(model, &iter, 1, &
id, -1);
4189 gtk_list_store_set(ev->
store, &iter, 0, present, -1);
4191 gtk_label_set_text(GTK_LABEL(ev->
panel_label), buf);
4196 gtk_tree_model_get(model, &iter, 1, &
id, -1);
4205 gtk_list_store_set(ev->
store, &iter, 0, present, -1);
4207 gtk_label_set_text(GTK_LABEL(ev->
panel_label), buf);
4212 gtk_tree_model_get(model, &iter, 1, &
id, -1);
4218 gtk_list_store_set(ev->
store, &iter, 0, present, -1);
4219 gtk_tree_model_get_iter_first(model, &iter);
4221 while (gtk_tree_model_iter_next(model, &iter)) {
4222 gtk_list_store_set(ev->
store, &iter, 0,
FALSE, -1);
4229 gtk_tree_model_iter_next(model, &iter);
4230 gtk_tree_model_get(model, &iter, 0, &id2, -1);
4231 gtk_list_store_set(ev->
store, &iter, 0,
TRUE, -1);
4239 gtk_list_store_set(ev->
store, &iter, 0, present, -1);
4246 gtk_tree_model_get_iter_first(model, &iter);
4248 gtk_list_store_set(ev->
store, &iter, 0, all, -1);
4251 gtk_label_set_text(GTK_LABEL(ev->
panel_label), buf);
4256 gtk_tree_model_get(model, &iter, 1, &
id, -1);
4257 if (!(0 <=
id &&
id <
B_LAST)) {
4263 gtk_list_store_set(ev->
store, &iter, 0, present, 3, buf, -1);
4266 gtk_label_set_text(GTK_LABEL(ev->
panel_label), buf);
4271 gtk_tree_model_get(model, &iter, 1, &
id, -1);
4277 gtk_list_store_set(ev->
store, &iter, 0,
TRUE, -1);
4278 gtk_tree_model_iter_nth_child(model, &iter, NULL, old_id);
4279 gtk_list_store_set(ev->
store, &iter, 0,
FALSE, -1);
4283 gtk_image_set_from_pixbuf(GTK_IMAGE(ev->
panel_image), pixbuf);
4285 g_object_unref(pixbuf);
4290 gtk_tree_model_get(model, &iter, 1, &
id, -1);
4296 gtk_list_store_set(ev->
store, &iter, 0,
TRUE, -1);
4297 gtk_tree_model_iter_nth_child(model, &iter, NULL, old_id);
4298 gtk_list_store_set(ev->
store, &iter, 0,
FALSE, -1);
4302 gtk_image_set_from_pixbuf(GTK_IMAGE(ev->
panel_image), pixbuf);
4304 g_object_unref(pixbuf);
4309 gtk_tree_model_get(model, &iter, 1, &
id, -1);
4318 gtk_list_store_set(ev->
store, &iter, 0, present, -1);
4320 gtk_label_set_text(GTK_LABEL(ev->
panel_label), buf);
4325 log_error(
"Unhandled widget toggled signal in "
4326 "extviewer_view_cell_toggled() for objprop id=%d "
4346 GtkTextIter start, end;
4359 gtk_text_buffer_get_start_iter(textbuf, &start);
4360 gtk_text_buffer_get_end_iter(textbuf, &end);
4361 text = gtk_text_buffer_get_text(textbuf, &start, &end,
FALSE);
4369 gtk_label_set_text(GTK_LABEL(ev->
panel_label), buf);
4373 log_error(
"Unhandled widget modified signal in "
4374 "extviewer_textbuf_changed() for objprop id=%d "
4389#define ADDPROP(ARG_id, ARG_name, ARG_tooltip, ARG_flags, ARG_valtype) do { \
4390 struct objprop *MY_op = objprop_new(ARG_id, ARG_name, ARG_tooltip, \
4391 ARG_flags, ARG_valtype, pp); \
4392 objprop_hash_insert(pp->objprop_table, MY_op->id, MY_op); \
4431 ADDPROP(OPID_TILE_ADDRESS,
_(
"Address"), NULL,
4461 ADDPROP(OPID_UNIT_ADDRESS,
_(
"Address"), NULL,
4493 ADDPROP(OPID_CITY_ADDRESS,
_(
"Address"), NULL,
4518 ADDPROP(OPID_PLAYER_ADDRESS,
_(
"Address"), NULL,
4546 _(
"Scenario Name"), NULL,
4550 _(
"Scenario Authors"), NULL,
4554 _(
"Scenario Description"), NULL,
4558 _(
"Save Random Number State"), NULL,
4561 _(
"Save Players"), NULL,
4564 _(
"Nation Start Positions"), NULL,
4567 _(
"Prevent New Cities"), NULL,
4570 _(
"Saltwater Flooding Lakes"), NULL,
4573 _(
"Lock to current Ruleset"), NULL,
4581 log_error(
"%s(): Unhandled page object type %s (nb %d).", __FUNCTION__,
4601 if (gtk_tree_selection_count_selected_rows(sel) < 1) {
4616 GtkTreeModel *model,
4617 GtkTreePath *sel_path,
4618 gboolean currently_selected,
4622 struct objbind *ob = NULL, *old_ob;
4626 if (!pp || !sel_path) {
4630 if (!gtk_tree_model_get_iter(model, &iter, sel_path)) {
4635 gtk_tree_model_get(model, &iter, 0, &ob, -1);
4636 if (currently_selected) {
4640 struct objbind *new_ob = NULL;
4642 rows = gtk_tree_selection_get_selected_rows(sel, NULL);
4643 for (p = rows; p != NULL; p = p->next) {
4645 if (gtk_tree_model_get_iter(model, &iter, path)) {
4646 struct objbind *test_ob = NULL;
4647 gtk_tree_model_get(model, &iter, 0, &test_ob, -1);
4648 if (test_ob == ob) {
4655 g_list_foreach(rows, (GFunc) gtk_tree_path_free, NULL);
4676 GtkTreeViewColumn *col;
4681 text = gtk_entry_get_text(GTK_ENTRY(
entry));
4700 gtk_tree_view_column_set_visible(col, matched);
4716 GtkWidget *vbox, *vbox2, *hbox, *hbox2, *paned, *frame, *w;
4717 GtkWidget *scrollwin, *
view, *label, *
entry, *notebook;
4718 GtkWidget *button, *hsep, *image;
4719 GtkTreeSelection *sel;
4720 GtkCellRenderer *cell;
4721 GtkTreeViewColumn *col;
4722 GtkSizeGroup *sizegroup;
4723 int num_columns = 0;
4737 sizegroup = gtk_size_group_new(GTK_SIZE_GROUP_BOTH);
4755 gtype_array =
fc_malloc(num_columns *
sizeof(GType));
4756 gtype_array[0] = G_TYPE_POINTER;
4766 pp->
object_store = gtk_list_store_newv(num_columns, gtype_array);
4769 paned = gtk_paned_new(GTK_ORIENTATION_HORIZONTAL);
4770 gtk_paned_set_position(GTK_PANED(paned), 256);
4775 vbox = gtk_grid_new();
4776 gtk_orientable_set_orientation(GTK_ORIENTABLE(vbox),
4777 GTK_ORIENTATION_VERTICAL);
4778 gtk_grid_set_row_spacing(GTK_GRID(vbox), 4);
4779 gtk_container_set_border_width(GTK_CONTAINER(vbox), 4);
4780 gtk_paned_pack1(GTK_PANED(paned), vbox,
TRUE,
TRUE);
4782 scrollwin = gtk_scrolled_window_new(NULL, NULL);
4783 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrollwin),
4784 GTK_SHADOW_ETCHED_IN);
4785 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrollwin),
4786 GTK_POLICY_AUTOMATIC,
4787 GTK_POLICY_AUTOMATIC);
4788 gtk_container_add(GTK_CONTAINER(vbox), scrollwin);
4791 gtk_widget_set_hexpand(
view,
TRUE);
4792 gtk_widget_set_vexpand(
view,
TRUE);
4800 if (!attr_type_str) {
4816 col = gtk_tree_view_column_new_with_attributes(
name, cell,
4817 attr_type_str, col_id,
4820 gtk_tree_view_column_set_sizing(col, GTK_TREE_VIEW_COLUMN_GROW_ONLY);
4821 gtk_tree_view_column_set_resizable(col,
TRUE);
4822 gtk_tree_view_column_set_reorderable(col,
TRUE);
4824 gtk_tree_view_column_set_clickable(col,
TRUE);
4825 gtk_tree_view_column_set_sort_column_id(col, col_id);
4827 gtk_tree_view_column_set_clickable(col,
FALSE);
4829 gtk_tree_view_append_column(GTK_TREE_VIEW(
view), col);
4834 sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(
view));
4835 gtk_tree_selection_set_mode(sel, GTK_SELECTION_MULTIPLE);
4836 g_signal_connect(sel,
"changed",
4838 gtk_tree_selection_set_select_function(sel,
4841 gtk_container_add(GTK_CONTAINER(scrollwin),
view);
4845 hbox = gtk_grid_new();
4846 gtk_grid_set_column_spacing(GTK_GRID(hbox), 4);
4847 gtk_container_add(GTK_CONTAINER(vbox), hbox);
4849 button = gtk_button_new();
4850 image = gtk_image_new_from_icon_name(
"list-add", GTK_ICON_SIZE_BUTTON);
4851 gtk_button_set_image(GTK_BUTTON(button), image);
4852 gtk_button_set_label(GTK_BUTTON(button),
_(
"Create"));
4853 gtk_size_group_add_widget(sizegroup, button);
4854 gtk_widget_set_tooltip_text(button,
4855 _(
"Pressing this button will create a new object of the "
4856 "same type as the current property page and add it to "
4857 "the page. The specific type and count of the objects "
4858 "is taken from the editor tool state. So for example, "
4859 "the \"tool value\" of the unit tool and its \"count\" "
4860 "parameter affect unit creation."));
4861 g_signal_connect(button,
"clicked",
4863 gtk_container_add(GTK_CONTAINER(hbox), button);
4865 button = gtk_button_new();
4866 image = gtk_image_new_from_icon_name(
"list-remove",
4867 GTK_ICON_SIZE_BUTTON);
4868 gtk_button_set_image(GTK_BUTTON(button), image);
4869 gtk_button_set_label(GTK_BUTTON(button),
_(
"Destroy"));
4870 gtk_size_group_add_widget(sizegroup, button);
4871 gtk_widget_set_tooltip_text(button,
4872 _(
"Pressing this button will send a request to the server "
4873 "to destroy (i.e. erase) the objects selected in the object "
4875 g_signal_connect(button,
"clicked",
4877 gtk_container_add(GTK_CONTAINER(hbox), button);
4882 hbox = gtk_grid_new();
4883 gtk_grid_set_column_spacing(GTK_GRID(hbox), 4);
4884 gtk_paned_pack2(GTK_PANED(paned), hbox,
TRUE,
TRUE);
4886 vbox = gtk_grid_new();
4887 gtk_orientable_set_orientation(GTK_ORIENTABLE(vbox),
4888 GTK_ORIENTATION_VERTICAL);
4889 gtk_grid_set_row_spacing(GTK_GRID(vbox), 4);
4890 gtk_container_set_border_width(GTK_CONTAINER(vbox), 4);
4891 gtk_container_add(GTK_CONTAINER(hbox), vbox);
4897 vbox2 = gtk_grid_new();
4898 gtk_widget_set_hexpand(vbox2,
TRUE);
4899 gtk_widget_set_vexpand(vbox2,
TRUE);
4900 gtk_orientable_set_orientation(GTK_ORIENTABLE(vbox2),
4901 GTK_ORIENTATION_VERTICAL);
4902 gtk_grid_set_row_spacing(GTK_GRID(vbox2), 4);
4903 gtk_container_add(GTK_CONTAINER(hbox), vbox2);
4905 notebook = gtk_notebook_new();
4906 gtk_widget_set_vexpand(notebook,
TRUE);
4907 gtk_widget_set_size_request(notebook, 256, -1);
4908 gtk_notebook_set_show_tabs(GTK_NOTEBOOK(notebook),
FALSE);
4909 gtk_notebook_set_show_border(GTK_NOTEBOOK(notebook),
FALSE);
4910 gtk_container_add(GTK_CONTAINER(vbox2), notebook);
4913 hsep = gtk_separator_new(GTK_ORIENTATION_HORIZONTAL);
4914 gtk_container_add(GTK_CONTAINER(vbox2), hsep);
4916 hbox2 = gtk_grid_new();
4917 gtk_container_set_border_width(GTK_CONTAINER(hbox2), 4);
4918 gtk_container_add(GTK_CONTAINER(vbox2), hbox2);
4920 button = gtk_button_new_with_mnemonic(
_(
"_Close"));
4921 gtk_size_group_add_widget(sizegroup, button);
4922 g_signal_connect_swapped(button,
"clicked",
4923 G_CALLBACK(gtk_widget_hide_on_delete), pe->
widget);
4924 gtk_container_add(GTK_CONTAINER(hbox2), button);
4930 title = g_strdup_printf(
_(
"%s Properties"),
4932 frame = gtk_frame_new(
title);
4934 gtk_widget_set_size_request(frame, 256, -1);
4935 gtk_container_add(GTK_CONTAINER(vbox), frame);
4937 scrollwin = gtk_scrolled_window_new(NULL, NULL);
4938 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrollwin),
4940 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrollwin),
4941 GTK_POLICY_AUTOMATIC,
4942 GTK_POLICY_AUTOMATIC);
4943 gtk_container_add(GTK_CONTAINER(frame), scrollwin);
4945 vbox2 = gtk_grid_new();
4946 gtk_widget_set_vexpand(vbox2,
TRUE);
4947 gtk_orientable_set_orientation(GTK_ORIENTABLE(vbox2),
4948 GTK_ORIENTATION_VERTICAL);
4949 gtk_grid_set_row_spacing(GTK_GRID(vbox2), 4);
4950 gtk_container_set_border_width(GTK_CONTAINER(vbox2), 4);
4951 gtk_container_add(GTK_CONTAINER(scrollwin), vbox2);
4961 gtk_container_add(GTK_CONTAINER(vbox2), w);
4964 gtk_widget_set_tooltip_text(w,
tooltip);
4968 hbox2 = gtk_grid_new();
4969 gtk_widget_set_margin_top(hbox2, 4);
4970 gtk_widget_set_margin_bottom(hbox2, 4);
4971 gtk_grid_set_column_spacing(GTK_GRID(hbox2), 4);
4972 gtk_container_add(GTK_CONTAINER(vbox), hbox2);
4974 label = gtk_label_new(
_(
"Filter:"));
4975 gtk_container_add(GTK_CONTAINER(hbox2), label);
4977 entry = gtk_entry_new();
4978 gtk_widget_set_tooltip_text(
entry,
4979 _(
"Enter a filter string to limit which properties are shown. "
4980 "The filter is one or more text patterns separated by | "
4981 "(\"or\") or & (\"and\"). The symbol & has higher precedence "
4982 "than |. A pattern may also be negated by prefixing it with !."));
4983 g_signal_connect(
entry,
"changed",
4985 gtk_container_add(GTK_CONTAINER(hbox2),
entry);
4987 hbox2 = gtk_grid_new();
4988 gtk_grid_set_column_spacing(GTK_GRID(hbox2), 4);
4989 gtk_container_add(GTK_CONTAINER(vbox), hbox2);
4991 button = gtk_button_new_with_mnemonic(
_(
"_Refresh"));
4992 gtk_size_group_add_widget(sizegroup, button);
4993 gtk_widget_set_tooltip_text(button,
4994 _(
"Pressing this button will reset all modified properties of "
4995 "the selected objects to their current values (the values "
4996 "they have on the server)."));
4997 g_signal_connect(button,
"clicked",
4999 gtk_container_add(GTK_CONTAINER(hbox2), button);
5001 button = gtk_button_new_with_mnemonic(
_(
"_Apply"));
5002 gtk_size_group_add_widget(sizegroup, button);
5003 gtk_widget_set_tooltip_text(button,
5004 _(
"Pressing this button will send all modified properties of "
5005 "the objects selected in the object list to the server. "
5006 "Modified properties' names are shown in red in the properties "
5008 g_signal_connect(button,
"clicked",
5010 gtk_container_add(GTK_CONTAINER(hbox2), button);
5086 const struct city *pcity,
5098 canvas.
surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, fw, fh);
5101 cairo_set_operator(cr, CAIRO_OPERATOR_CLEAR);
5113 ptile, NULL, NULL,
punit, pcity,
5142 gpointer object_data)
5178 const struct tile *ptile)
5181 if (!pp || !ptile) {
5220 log_error(
"%s(): Unhandled page object type %s (nb %d).", __FUNCTION__,
5240 GdkPixbuf *pixbuf = NULL;
5241 GtkListStore *store;
5269 gtk_list_store_set(store, iter, col_id, pv->
data.
v_int, -1);
5279 for (p = buf; *p; p++) {
5280 if (*p ==
'\n' || *p ==
'\t' || *p ==
'\r') {
5284 gtk_list_store_set(store, iter, col_id, buf, -1);
5287 gtk_list_store_set(store, iter, col_id, pv->
data.
v_pixbuf, -1);
5296 gtk_list_store_set(store, iter, col_id, buf2, -1);
5301 gtk_list_store_set(store, iter, col_id, pixbuf, -1);
5303 g_object_unref(pixbuf);
5308 gtk_list_store_set(store, iter, col_id, pixbuf, -1);
5310 g_object_unref(pixbuf);
5336 GtkTreeRowReference *rr;
5337 GtkTreeModel *model;
5347 gtk_list_store_set(pp->
object_store, &iter, 0, ob, -1);
5348 path = gtk_tree_model_get_path(model, &iter);
5349 rr = gtk_tree_row_reference_new(model, path);
5350 gtk_tree_path_free(path);
5358 if (gtk_tree_model_get_iter_first(model, &iter)) {
5359 GtkTreeSelection *sel;
5360 sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(pp->
object_view));
5361 gtk_tree_selection_select_iter(sel, &iter);
5418 const struct tile_list *tiles)
5420 if (!pp || !tiles) {
5450 GtkTreeSelection *sel;
5451 GtkTreeModel *model;
5456 bool changed =
FALSE;
5466 sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(pp->
object_view));
5467 rows = gtk_tree_selection_get_selected_rows(sel, &model);
5469 for (p = rows; p != NULL; p = p->next) {
5471 if (gtk_tree_model_get_iter(model, &iter, path)) {
5472 gtk_tree_model_get(model, &iter, 0, &ob, -1);
5475 gtk_tree_path_free(path);
5490 GtkTreeSelection *sel;
5491 GtkTreeModel *model;
5503 sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(pp->
object_view));
5504 if (gtk_tree_selection_count_selected_rows(sel) < 1) {
5513 rows = gtk_tree_selection_get_selected_rows(sel, &model);
5515 for (p = rows; p != NULL; p = p->next) {
5517 if (gtk_tree_model_get_iter(model, &iter, path)) {
5518 gtk_tree_model_get(model, &iter, 0, &ob, -1);
5530 gtk_tree_path_free(path);
5616 log_error(
"%s(): Unhandled object type %s (nb %d).",
5646 GtkTreeSelection *sel;
5647 GtkTreeModel *model;
5657 sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(pp->
object_view));
5658 if (gtk_tree_selection_count_selected_rows(sel) < 1) {
5662 rows = gtk_tree_selection_get_selected_rows(sel, &model);
5663 for (p = rows; p != NULL; p = p->next) {
5665 if (gtk_tree_model_get_iter(model, &iter, path)) {
5666 gtk_tree_model_get(model, &iter, 0, &ob, -1);
5672 gtk_tree_path_free(path);
5687 GtkTreeSelection *sel;
5688 GtkTreeModel *model;
5699 sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(pp->
object_view));
5700 if (gtk_tree_selection_count_selected_rows(sel) < 1) {
5704 rows = gtk_tree_selection_get_selected_rows(sel, &model);
5706 for (p = rows; p != NULL; p = p->next) {
5708 if (gtk_tree_model_get_iter(model, &iter, path)) {
5709 gtk_tree_model_get(model, &iter, 0, &ob, -1);
5712 gtk_tree_path_free(path);
5725 struct tile_list *hint_tiles)
5728 int apno, value, count,
size;
5731 struct tile *ptile = NULL;
5757 if (NULL == ptile) {
5761 if (NULL == ptile) {
5807 if (pplayer && hint_tiles) {
5853 GtkTreeRowReference *rr;
5861 if (rr && gtk_tree_row_reference_valid(rr)) {
5864 GtkTreeModel *model;
5867 path = gtk_tree_row_reference_get_path(rr);
5869 if (gtk_tree_model_get_iter(model, &iter, path)) {
5879 gtk_tree_path_free(path);
5950 GtkNotebook *notebook;
5963 page = gtk_notebook_page_num(notebook, w);
5964 gtk_notebook_set_current_page(notebook, page);
5978 if (stored_tag_hash_lookup(pp->
tag_table, tag, NULL)) {
5979 log_error(
"Attempted to insert object creation tag %d "
5980 "twice into tag table for property page %p (%d %s).",
5986 stored_tag_hash_insert(pp->
tag_table, tag, count);
6002 if (stored_tag_hash_lookup(pp->
tag_table, tag, &count)) {
6004 stored_tag_hash_remove(pp->
tag_table, tag);
6017 return stored_tag_hash_lookup(pp->
tag_table, tag, NULL);
6059 struct tile_list *tiles = NULL;
6067 tiles = tile_list_new();
6072 tile_list_append(tiles, ptile);
6077 tile_list_destroy(tiles);
6115 label = gtk_label_new(
name);
6116 gtk_notebook_append_page(GTK_NOTEBOOK(pe->
notebook),
6151 win = gtk_window_new(GTK_WINDOW_TOPLEVEL);
6152 gtk_window_set_title(GTK_WINDOW(win),
_(
"Property Editor"));
6153 gtk_window_set_resizable(GTK_WINDOW(win),
TRUE);
6154 gtk_window_set_default_size(GTK_WINDOW(win), 780, 560);
6155 gtk_window_set_position(GTK_WINDOW(win), GTK_WIN_POS_CENTER_ON_PARENT);
6156 gtk_window_set_transient_for(GTK_WINDOW(win), GTK_WINDOW(
toplevel));
6157 gtk_window_set_destroy_with_parent(GTK_WINDOW(win),
TRUE);
6158 gtk_window_set_type_hint(GTK_WINDOW(win), GDK_WINDOW_TYPE_HINT_DIALOG);
6159 gtk_container_set_border_width(GTK_CONTAINER(win), 4);
6160 g_signal_connect(win,
"delete-event",
6161 G_CALLBACK(gtk_widget_hide_on_delete), NULL);
6164 vbox = gtk_grid_new();
6165 gtk_container_add(GTK_CONTAINER(win), vbox);
6170 gtk_notebook_set_show_tabs(GTK_NOTEBOOK(
notebook),
TRUE);
6171 gtk_container_add(GTK_CONTAINER(vbox),
notebook);
6196 const struct tile_list *tiles)
6208 if (!pe || !tiles) {
6217 for (i = 0; i <
ARRAY_SIZE(preferred) - 1; i++) {
6234 if (!pe || !pe->
widget) {
6238 gtk_widget_show_all(pe->
widget);
6240 gtk_window_present(GTK_WINDOW(pe->
widget));
6251 if (!pe || !pe->
widget) {
6254 gtk_widget_hide(pe->
widget);
6284 int tag,
int object_id)
6374 int or_clause_count, and_clause_count;
6376 const char *pattern;
6381 if (!filter || filter[0] ==
'\0') {
6385 or_clause_count =
get_tokens(filter, or_clauses,
6389 for (i = 0; i < or_clause_count; i++) {
6390 if (or_clauses[i][0] ==
'\0') {
6395 and_clause_count =
get_tokens(or_clauses[i], and_clauses,
6399 for (j = 0; j < and_clause_count; j++) {
6400 if (and_clauses[j][0] ==
'\0') {
6404 pattern = and_clauses[j];
6406 switch (pattern[0]) {
6449 bool match, or_result, and_result;
6464 if (pf->
count < 1) {
6470 for (i = 0; i < pf->
count; i++) {
6473 for (j = 0; j < pfc->
count; j++) {
6475 match = (pfp->
text[0] ==
'\0'
6480 and_result = and_result && match;
6485 or_result = or_result || and_result;
6507 for (i = 0; i < pf->
count; i++) {
6509 for (j = 0; j < pfc->
count; j++) {
6511 if (pfp->
text != NULL) {
6530 return _(
"Seen (Main)");
6533 return _(
"Seen (Invis)");
6536 return _(
"Seen (Subsurface)");
6541 log_error(
"%s(): Unrecognized vision layer %d.", __FUNCTION__, vl);
6542 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 objprop_widget_entry_changed(GtkEntry *entry, gpointer userdata)
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)
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_full_tile_height(const struct tileset *t)
bool tileset_layer_in_category(enum mapview_layer layer, enum layer_category cat)
int tileset_tile_height(const struct tileset *t)
int tileset_full_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