From d8fddaf358ffb1cc1a47a8039c939d18e4e46691 Mon Sep 17 00:00:00 2001 From: Louis Moureaux Date: Sat, 11 Sep 2021 01:02:22 +0200 Subject: [PATCH 01/12] Add a tileset debugger skeleton class See #632. --- client/gui-qt/CMakeLists.txt | 1 + client/gui-qt/tileset_debugger.cpp | 86 ++++++++++++++++++++++++++++++ client/gui-qt/tileset_debugger.h | 43 +++++++++++++++ 3 files changed, 130 insertions(+) create mode 100644 client/gui-qt/tileset_debugger.cpp create mode 100644 client/gui-qt/tileset_debugger.h diff --git a/client/gui-qt/CMakeLists.txt b/client/gui-qt/CMakeLists.txt index 708da47a1b..f9e0b4eacb 100644 --- a/client/gui-qt/CMakeLists.txt +++ b/client/gui-qt/CMakeLists.txt @@ -49,6 +49,7 @@ add_library( spaceshipdlg.cpp sprite.cpp themes.cpp + tileset_debugger.cpp tradecalculation.cpp tooltips.cpp unitreport.cpp diff --git a/client/gui-qt/tileset_debugger.cpp b/client/gui-qt/tileset_debugger.cpp new file mode 100644 index 0000000000..f267b1f360 --- /dev/null +++ b/client/gui-qt/tileset_debugger.cpp @@ -0,0 +1,86 @@ +/************************************************************************** + Copyright (c) 2021 Freeciv21 contributors. This file is + part of Freeciv21. Freeciv21 is free software: you can redistribute it + and/or modify it under the terms of the GNU General Public License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. You should have received + a copy of the GNU General Public License along with Freeciv21. If not, + see https://www.gnu.org/licenses/. +**************************************************************************/ + +#include "tileset_debugger.h" + +// common +#include "map.h" +#include "tile.h" + +// utility +#include "fcintl.h" + +#include +#include +#include + +namespace freeciv { + +/** + * \class tileset_debugger + * \brief A dialog to perform debugging of the tileset. + */ + +/** + * Constructor. + */ +tileset_debugger::tileset_debugger(QWidget *parent) : QDialog(parent) +{ + auto layout = new QVBoxLayout; + setLayout(layout); + + auto toolbar = new QToolBar; + toolbar->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); + layout->addWidget(toolbar); + + m_pick_action = + toolbar->addAction(QIcon::fromTheme("pointer"), _("Pick tile")); + m_pick_action->setToolTip(_("Pick a tile to inspect on the map")); + m_pick_action->setCheckable(true); + connect(m_pick_action, &QAction::toggled, this, + &tileset_debugger::pick_tile); + + m_label = new QLabel; + layout->addWidget(m_label, 100, Qt::AlignCenter); + + set_tile(nullptr); +} + +/** + * Destructor. + */ +tileset_debugger::~tileset_debugger() {} + +/** + * Sets the tile being debugged. + */ +void tileset_debugger::set_tile(const ::tile *t) +{ + m_tile = t; + + // Update the GUI + if (!t) { + m_label->setText(_("No tile selected")); + return; + } + + m_label->setText(QStringLiteral("%1 %2").arg( + index_to_map_pos_x(tile_index(t)), index_to_map_pos_y(tile_index(t)))); +} + +/** + * Enters or exits tile picking mode. + */ +void tileset_debugger::pick_tile(bool active) +{ + emit tile_picking_requested(active); +} + +} // namespace freeciv diff --git a/client/gui-qt/tileset_debugger.h b/client/gui-qt/tileset_debugger.h new file mode 100644 index 0000000000..48b3c584be --- /dev/null +++ b/client/gui-qt/tileset_debugger.h @@ -0,0 +1,43 @@ +/************************************************************************** + Copyright (c) 2021 Freeciv21 contributors. This file is + part of Freeciv21. Freeciv21 is free software: you can redistribute it + and/or modify it under the terms of the GNU General Public License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. You should have received + a copy of the GNU General Public License along with Freeciv21. If not, + see https://www.gnu.org/licenses/. +**************************************************************************/ +#pragma once + +#include + +class QAction; +class QLabel; + +struct tile; + +namespace freeciv { + +class tileset_debugger : public QDialog { + Q_OBJECT + +public: + explicit tileset_debugger(QWidget *parent = nullptr); + virtual ~tileset_debugger(); + + const ::tile *tile() const { return m_tile; } + void set_tile(const ::tile *t); + +signals: + void tile_picking_requested(bool active); + +private slots: + void pick_tile(bool active); + +private: + const ::tile *m_tile; + QLabel *m_label; + QAction *m_pick_action; +}; + +} // namespace freeciv From 1b1f4aeeb6957b29aebdca717b32fc90020f5bd5 Mon Sep 17 00:00:00 2001 From: Louis Moureaux Date: Sat, 11 Sep 2021 01:31:49 +0200 Subject: [PATCH 02/12] Add a menu entry for the tileset debugger Since it's going to interact quite a bit with the map view, make it a child of the view widget. See #632. --- client/gui-qt/fc_client.cpp | 6 ++++++ client/gui-qt/fc_client.h | 5 +++++ client/gui-qt/mapview.cpp | 24 ++++++++++++++++++++++++ client/gui-qt/mapview.h | 10 ++++++++++ client/gui-qt/menu.cpp | 3 +++ 5 files changed, 48 insertions(+) diff --git a/client/gui-qt/fc_client.cpp b/client/gui-qt/fc_client.cpp index ad16937937..3dfc57690b 100644 --- a/client/gui-qt/fc_client.cpp +++ b/client/gui-qt/fc_client.cpp @@ -50,6 +50,7 @@ #include "page_scenario.h" #include "sidebar.h" #include "sprite.h" +#include "tileset_debugger.h" #include "voteinfo_bar.h" fcFont *fcFont::m_instance = 0; @@ -256,6 +257,11 @@ void fc_client::switch_page(int new_pg) set_client_page(PAGE_MAIN); break; } + + // Maybe popdown the tileset debugger + if (page != PAGE_GAME) { + queen()->mapview_wdg->hide_debugger(); + } } /** diff --git a/client/gui-qt/fc_client.h b/client/gui-qt/fc_client.h index 6b5a633743..8646e1a5ea 100644 --- a/client/gui-qt/fc_client.h +++ b/client/gui-qt/fc_client.h @@ -13,6 +13,7 @@ #include #include #include + // common #include "packets.h" // client @@ -36,6 +37,10 @@ class QTimerEvent; class choice_dialog; struct server_scan; +namespace freeciv { +class tileset_debugger; +} + enum connection_state { LOGIN_TYPE, NEW_PASSWORD_TYPE, diff --git a/client/gui-qt/mapview.cpp b/client/gui-qt/mapview.cpp index a6afb463b4..2b77273884 100644 --- a/client/gui-qt/mapview.cpp +++ b/client/gui-qt/mapview.cpp @@ -196,6 +196,30 @@ void map_view::show_all_fcwidgets() m_hidden_fcwidgets.clear(); } +/** + * Ppens the tileset debugger. + */ +void map_view::show_debugger() +{ + if (!m_debugger) { + // We never destroy it once it's created. + m_debugger = new freeciv::tileset_debugger(this); + } + + m_debugger->show(); +} + +/** + * Closes the tileset debugger if it is open. + */ +void map_view::hide_debugger() +{ + if (m_debugger) { + m_debugger->set_tile(nullptr); + m_debugger->close(); + } +} + /** Timer for cursor */ diff --git a/client/gui-qt/mapview.h b/client/gui-qt/mapview.h index d6ecaaed13..22a51e1177 100644 --- a/client/gui-qt/mapview.h +++ b/client/gui-qt/mapview.h @@ -12,9 +12,14 @@ // Qt #include #include +#include #include #include #include + +// gui-qt +#include "tileset_debugger.h" + // common #include "tilespec.h" @@ -54,6 +59,10 @@ class map_view : public QWidget { bool menu_click; +public slots: + void show_debugger(); + void hide_debugger(); + protected: void paintEvent(QPaintEvent *event) override; void keyPressEvent(QKeyEvent *event) override; @@ -71,6 +80,7 @@ private slots: bool stored_autocenter; int cursor_frame{0}; int cursor; + QPointer m_debugger = nullptr; std::vector m_hidden_fcwidgets; }; diff --git a/client/gui-qt/menu.cpp b/client/gui-qt/menu.cpp index 39991a1b51..50a958ff0d 100644 --- a/client/gui-qt/menu.cpp +++ b/client/gui-qt/menu.cpp @@ -599,6 +599,9 @@ void mr_menu::setup_menus() connect(act, &QAction::triggered, this, &mr_menu::shortcut_options); act = menu->addAction(_("Load another tileset")); connect(act, &QAction::triggered, this, &mr_menu::tileset_custom_load); + act = menu->addAction(_("Tileset debugger")); + connect(act, &QAction::triggered, queen()->mapview_wdg, + &map_view::show_debugger); act = menu->addAction(_("Save Options Now")); act->setIcon(style()->standardIcon(QStyle::SP_DialogSaveButton)); connect(act, &QAction::triggered, this, &mr_menu::save_options_now); From 8aa9436d5d46831e18a6e77125acffaf536de3a7 Mon Sep 17 00:00:00 2001 From: Louis Moureaux Date: Sat, 11 Sep 2021 01:53:06 +0200 Subject: [PATCH 03/12] Instruct the user how to start debugging See #632. --- client/gui-qt/tileset_debugger.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/gui-qt/tileset_debugger.cpp b/client/gui-qt/tileset_debugger.cpp index f267b1f360..2cebf1577b 100644 --- a/client/gui-qt/tileset_debugger.cpp +++ b/client/gui-qt/tileset_debugger.cpp @@ -67,7 +67,7 @@ void tileset_debugger::set_tile(const ::tile *t) // Update the GUI if (!t) { - m_label->setText(_("No tile selected")); + m_label->setText(_("Select a tile to start debugging.")); return; } From d5faa263d378f62e6f26d17ba7ed3ff8570d60b2 Mon Sep 17 00:00:00 2001 From: Louis Moureaux Date: Sat, 11 Sep 2021 03:04:04 +0200 Subject: [PATCH 04/12] Implement the tile debugger selection logic See #632. --- client/control.cpp | 16 +++++++++++++++- client/control.h | 1 + client/goto.cpp | 1 + client/gui-qt/mapview.cpp | 19 +++++++++++++++++++ client/gui-qt/mapview.h | 4 ++++ client/include/mapview_g.h | 2 ++ client/mapctrl_common.cpp | 2 ++ client/mapview_common.cpp | 1 + 8 files changed, 45 insertions(+), 1 deletion(-) diff --git a/client/control.cpp b/client/control.cpp index 6e4298b2eb..796bfe9884 100644 --- a/client/control.cpp +++ b/client/control.cpp @@ -287,7 +287,7 @@ void set_hover_state(struct unit_list *punits, enum cursor_hover_state state, enum unit_orders order) { fc_assert_ret((punits && unit_list_size(punits) > 0) - || state == HOVER_NONE); + || (state == HOVER_NONE || state == HOVER_DEBUG_TILE)); fc_assert_ret(state == HOVER_CONNECT || activity == ACTIVITY_LAST); fc_assert_ret((state == HOVER_GOTO || state == HOVER_GOTO_SEL_TGT) || order == ORDER_LAST); @@ -1285,6 +1285,7 @@ void control_mouse_cursor(struct tile *ptile) break; case HOVER_ACT_SEL_TGT: case HOVER_GOTO_SEL_TGT: + case HOVER_DEBUG_TILE: /* Select a tile to target / find targets on. */ mouse_cursor_type = CURSOR_SELECT; break; @@ -2748,6 +2749,16 @@ void do_map_click(struct tile *ptile, enum quickselect_type qtype) fc_assert(action_id_exists(goto_last_action)); do_unit_goto(ptile); break; + case HOVER_DEBUG_TILE: + // This function is called twice, once on mouse press and once on mouse + // release. We get SELECT_POPUP the second time. + // We don't want to do anything the first time we're called to avoid + // selecting units or opening the tile dialog. + if (qtype == SELECT_POPUP) { + debug_tile(ptile); + clear_hover_state(); + } + return; } clear_hover_state(); @@ -3032,6 +3043,9 @@ void key_cancel_action() keyboardless_goto_active = false; keyboardless_goto_start_tile = NULL; break; + case HOVER_DEBUG_TILE: + clear_hover_state(); + break; case HOVER_NONE: break; }; diff --git a/client/control.h b/client/control.h index 1f699ab4b1..3e9b63f763 100644 --- a/client/control.h +++ b/client/control.h @@ -23,6 +23,7 @@ enum cursor_hover_state { HOVER_PATROL, HOVER_ACT_SEL_TGT, HOVER_GOTO_SEL_TGT, + HOVER_DEBUG_TILE, }; // Selecting unit from a stack without popup. diff --git a/client/goto.cpp b/client/goto.cpp index 7ffea16411..c3d4a49e9f 100644 --- a/client/goto.cpp +++ b/client/goto.cpp @@ -999,6 +999,7 @@ static void goto_fill_parameter_full(struct goto_map *goto_map, case HOVER_NONE: case HOVER_PARADROP: case HOVER_ACT_SEL_TGT: + case HOVER_DEBUG_TILE: fc_assert_msg(hover_state != HOVER_NONE, "Goto with HOVER_NONE?"); fc_assert_msg(hover_state != HOVER_PARADROP, "Goto with HOVER_PARADROP?"); diff --git a/client/gui-qt/mapview.cpp b/client/gui-qt/mapview.cpp index 2b77273884..04188d59d3 100644 --- a/client/gui-qt/mapview.cpp +++ b/client/gui-qt/mapview.cpp @@ -204,6 +204,16 @@ void map_view::show_debugger() if (!m_debugger) { // We never destroy it once it's created. m_debugger = new freeciv::tileset_debugger(this); + connect(m_debugger, &freeciv::tileset_debugger::tile_picking_requested, + [](bool active) { + if (active) { + set_hover_state(NULL, HOVER_DEBUG_TILE, ACTIVITY_LAST, NULL, + NO_TARGET, NO_TARGET, ACTION_NONE, + ORDER_LAST); + } else if (!active && hover_state == HOVER_DEBUG_TILE) { + clear_hover_state(); + } + }); } m_debugger->show(); @@ -797,3 +807,12 @@ void show_city_desc(QPixmap *pcanvas, int canvas_x, int canvas_y, p.end(); } + +/** + * Callback to set the tile being debugged. + */ +void debug_tile(tile *tile) +{ + fc_assert_ret(queen()->mapview_wdg->m_debugger); + queen()->mapview_wdg->m_debugger->set_tile(tile); +} diff --git a/client/gui-qt/mapview.h b/client/gui-qt/mapview.h index 22a51e1177..b5ea22d0f2 100644 --- a/client/gui-qt/mapview.h +++ b/client/gui-qt/mapview.h @@ -42,6 +42,10 @@ void draw_calculated_trade_routes(QPainter *painter); **************************************************************************/ class map_view : public QWidget { Q_OBJECT + + // Ought to be a private slot + friend void debug_tile(tile *tile); + void shortcut_pressed(int key); void shortcut_released(Qt::MouseButton mb); diff --git a/client/include/mapview_g.h b/client/include/mapview_g.h index 50c626792f..1626477166 100644 --- a/client/include/mapview_g.h +++ b/client/include/mapview_g.h @@ -55,3 +55,5 @@ GUI_FUNC_PROTO(void, draw_selection_rectangle, int canvas_x, int canvas_y, GUI_FUNC_PROTO(void, tileset_changed, void) void show_city_desc(QPixmap *pcanvas, int canvas_x, int canvas_y, struct city *pcity, int *width, int *height); + +void debug_tile(tile *t); diff --git a/client/mapctrl_common.cpp b/client/mapctrl_common.cpp index 5a90a494af..29a5f3afa3 100644 --- a/client/mapctrl_common.cpp +++ b/client/mapctrl_common.cpp @@ -632,6 +632,7 @@ void update_line(int canvas_x, int canvas_y) case HOVER_NONE: case HOVER_PARADROP: case HOVER_ACT_SEL_TGT: + case HOVER_DEBUG_TILE: break; }; } @@ -666,6 +667,7 @@ void overview_update_line(int overview_x, int overview_y) case HOVER_NONE: case HOVER_PARADROP: case HOVER_ACT_SEL_TGT: + case HOVER_DEBUG_TILE: break; }; } diff --git a/client/mapview_common.cpp b/client/mapview_common.cpp index ba6cea7565..9121018f09 100644 --- a/client/mapview_common.cpp +++ b/client/mapview_common.cpp @@ -577,6 +577,7 @@ static void base_set_mapview_origin(float gui_x0, float gui_y0) case HOVER_NONE: case HOVER_PARADROP: case HOVER_ACT_SEL_TGT: + case HOVER_DEBUG_TILE: break; }; if (rectangle_active) { From 11aa2b8b1c90cb1231075e3312f372159e8cbe48 Mon Sep 17 00:00:00 2001 From: Louis Moureaux Date: Sat, 11 Sep 2021 03:05:49 +0200 Subject: [PATCH 05/12] Improve the tile debugger UI --- client/gui-qt/tileset_debugger.cpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/client/gui-qt/tileset_debugger.cpp b/client/gui-qt/tileset_debugger.cpp index 2cebf1577b..1bbb00f10f 100644 --- a/client/gui-qt/tileset_debugger.cpp +++ b/client/gui-qt/tileset_debugger.cpp @@ -10,6 +10,9 @@ #include "tileset_debugger.h" +// client/include +#include "dialogs_g.h" + // common #include "map.h" #include "tile.h" @@ -64,6 +67,7 @@ tileset_debugger::~tileset_debugger() {} void tileset_debugger::set_tile(const ::tile *t) { m_tile = t; + m_pick_action->setChecked(false); // Update the GUI if (!t) { @@ -71,8 +75,9 @@ void tileset_debugger::set_tile(const ::tile *t) return; } - m_label->setText(QStringLiteral("%1 %2").arg( - index_to_map_pos_x(tile_index(t)), index_to_map_pos_y(tile_index(t)))); + m_label->setText(QStringLiteral("%1 %2") + .arg(index_to_map_pos_x(tile_index(t))) + .arg(index_to_map_pos_y(tile_index(t)))); } /** From e704ab5c741aa4fe357dcf69ec78f3c9a6568121 Mon Sep 17 00:00:00 2001 From: Louis Moureaux Date: Sat, 11 Sep 2021 04:06:25 +0200 Subject: [PATCH 06/12] Show crude information in the tileset debugger The sprites drawn by each layer are shown. Offsets are not accounted for, and no reason is given for which sprites were selected. Some layers do not work (for instance, the grid); they probably require pedge or pcorner. See #632. --- client/control.cpp | 2 +- client/control.h | 2 +- client/gui-qt/tileset_debugger.cpp | 47 ++++++++++++++++++++++++++++-- client/gui-qt/tileset_debugger.h | 2 ++ client/tilespec.cpp | 2 +- client/tilespec.h | 2 +- 6 files changed, 51 insertions(+), 6 deletions(-) diff --git a/client/control.cpp b/client/control.cpp index 796bfe9884..5e452ee4e3 100644 --- a/client/control.cpp +++ b/client/control.cpp @@ -802,7 +802,7 @@ void unit_focus_update() /** Return a pointer to a visible unit, if there is one. */ -struct unit *find_visible_unit(struct tile *ptile) +unit *find_visible_unit(const ::tile *ptile) { struct unit *panyowned = NULL, *panyother = NULL, *ptptother = NULL; diff --git a/client/control.h b/client/control.h index 3e9b63f763..c8e3ecf317 100644 --- a/client/control.h +++ b/client/control.h @@ -176,7 +176,7 @@ void unit_focus_update(); void auto_center_on_focus_unit(); void update_unit_pix_label(struct unit_list *punitlist); -struct unit *find_visible_unit(struct tile *ptile); +unit *find_visible_unit(const ::tile *ptile); void set_units_in_combat(struct unit *pattacker, struct unit *pdefender); int blink_active_unit(); int blink_turn_done_button(); diff --git a/client/gui-qt/tileset_debugger.cpp b/client/gui-qt/tileset_debugger.cpp index 1bbb00f10f..0bda0215ac 100644 --- a/client/gui-qt/tileset_debugger.cpp +++ b/client/gui-qt/tileset_debugger.cpp @@ -13,6 +13,11 @@ // client/include #include "dialogs_g.h" +// client +#include "climap.h" +#include "editor.h" +#include "tilespec.h" + // common #include "map.h" #include "tile.h" @@ -22,6 +27,7 @@ #include #include +#include #include namespace freeciv { @@ -36,6 +42,8 @@ namespace freeciv { */ tileset_debugger::tileset_debugger(QWidget *parent) : QDialog(parent) { + setWindowTitle(_("Tileset debugger")); + auto layout = new QVBoxLayout; setLayout(layout); @@ -51,7 +59,12 @@ tileset_debugger::tileset_debugger(QWidget *parent) : QDialog(parent) &tileset_debugger::pick_tile); m_label = new QLabel; - layout->addWidget(m_label, 100, Qt::AlignCenter); + layout->addWidget(m_label); + + m_content = new QTreeWidget; + m_content->setHeaderHidden(true); + m_content->setSelectionMode(QAbstractItemView::NoSelection); + layout->addWidget(m_content, 100); set_tile(nullptr); } @@ -75,9 +88,39 @@ void tileset_debugger::set_tile(const ::tile *t) return; } - m_label->setText(QStringLiteral("%1 %2") + m_label->setText(QString(_("Tile at %1, %2")) .arg(index_to_map_pos_x(tile_index(t))) .arg(index_to_map_pos_y(tile_index(t)))); + + // Fill tile data + m_content->clear(); + + auto maxSize = QSize(); // Max sprite size + for (const auto &layer : tileset_get_layers(tileset)) { + auto item = new QTreeWidgetItem(m_content); + + const auto name = mapview_layer_name(layer->type()); + item->setText(0, name); + + // Get the list of sprites for this layer + ::unit *unit = nullptr; + if (client_tile_get_known(t) != TILE_UNKNOWN + || (editor_is_active() && editor_tile_is_selected(t))) { + unit = get_drawable_unit(tileset, t); + } + const auto sprites = layer->fill_sprite_array(t, nullptr, nullptr, unit, + tile_city(t), nullptr); + + // Add the sprites as children + for (const auto &ds : sprites) { + auto child = new QTreeWidgetItem(item); + child->setIcon(0, QIcon(*ds.sprite)); + maxSize = maxSize.expandedTo(ds.sprite->size()); + } + } + + m_content->setIconSize(maxSize); + m_content->expandAll(); } /** diff --git a/client/gui-qt/tileset_debugger.h b/client/gui-qt/tileset_debugger.h index 48b3c584be..54b40ba8e8 100644 --- a/client/gui-qt/tileset_debugger.h +++ b/client/gui-qt/tileset_debugger.h @@ -13,6 +13,7 @@ class QAction; class QLabel; +class QTreeWidget; struct tile; @@ -38,6 +39,7 @@ private slots: const ::tile *m_tile; QLabel *m_label; QAction *m_pick_action; + QTreeWidget *m_content; }; } // namespace freeciv diff --git a/client/tilespec.cpp b/client/tilespec.cpp index a87c9593c6..8ada25b3a9 100644 --- a/client/tilespec.cpp +++ b/client/tilespec.cpp @@ -5240,7 +5240,7 @@ void toggle_focus_unit_state(struct tileset *t) /** Find unit that we can display from given tile. */ -struct unit *get_drawable_unit(const struct tileset *t, struct tile *ptile) +struct unit *get_drawable_unit(const struct tileset *t, const ::tile *ptile) { struct unit *punit = find_visible_unit(ptile); diff --git a/client/tilespec.h b/client/tilespec.h index 179c6b9c69..140d11a1c2 100644 --- a/client/tilespec.h +++ b/client/tilespec.h @@ -155,7 +155,7 @@ int get_focus_unit_toggle_timeout(const struct tileset *t); void reset_focus_unit_state(struct tileset *t); void focus_unit_in_combat(struct tileset *t); void toggle_focus_unit_state(struct tileset *t); -struct unit *get_drawable_unit(const struct tileset *t, struct tile *ptile); +struct unit *get_drawable_unit(const struct tileset *t, const ::tile *ptile); bool unit_drawn_with_city_outline(const struct unit *punit, bool check_focus); From c8aefcd51a39558c3c681556c9441318ca45f273 Mon Sep 17 00:00:00 2001 From: Louis Moureaux Date: Sat, 11 Sep 2021 20:15:19 +0200 Subject: [PATCH 07/12] Show how sprites combine within layers in the debugger This allows one to understand better what the layers are made of and how they works. See #632. --- client/gui-qt/tileset_debugger.cpp | 37 +++++++++++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/client/gui-qt/tileset_debugger.cpp b/client/gui-qt/tileset_debugger.cpp index 0bda0215ac..d5294269e0 100644 --- a/client/gui-qt/tileset_debugger.cpp +++ b/client/gui-qt/tileset_debugger.cpp @@ -26,6 +26,7 @@ #include "fcintl.h" #include +#include #include #include #include @@ -111,10 +112,44 @@ void tileset_debugger::set_tile(const ::tile *t) const auto sprites = layer->fill_sprite_array(t, nullptr, nullptr, unit, tile_city(t), nullptr); + if (sprites.empty()) { + continue; + } + + // Generate a sprite with this layer only + // Geometry + auto rectangle = QRect(); + for (const auto &ds : sprites) { + rectangle |= QRect(ds.offset_x, ds.offset_y, ds.sprite->width(), + ds.sprite->height()); + } + + // Draw the composite picture + auto this_layer = QPixmap(rectangle.size()); + this_layer.fill(Qt::transparent); + auto p = QPainter(); + p.begin(&this_layer); + // If there are negative offsets, the pixmap was extended in the negative + // direction. Compensate by offsetting the painter back... + p.translate(-rectangle.topLeft()); + for (const auto &ds : sprites) { + p.drawPixmap(ds.offset_x, ds.offset_y, *ds.sprite); + } + p.end(); + item->setIcon(0, QIcon(this_layer)); + // Add the sprites as children for (const auto &ds : sprites) { auto child = new QTreeWidgetItem(item); - child->setIcon(0, QIcon(*ds.sprite)); + auto this_sprite = QPixmap(rectangle.size()); + this_sprite.fill(Qt::transparent); + p.begin(&this_sprite); + // We inherit the translation set above + p.drawPixmap(ds.offset_x, ds.offset_y, *ds.sprite); + p.end(); + child->setIcon(0, QIcon(this_sprite)); + child->setText( + 0, QString(_("Offset: %1, %2")).arg(ds.offset_x).arg(ds.offset_y)); maxSize = maxSize.expandedTo(ds.sprite->size()); } } From 4fc86a71dff12863ec79651faff76e19581a730d Mon Sep 17 00:00:00 2001 From: Louis Moureaux Date: Sat, 11 Sep 2021 22:26:54 +0200 Subject: [PATCH 08/12] Draw a rectangle around sprites in the debugger The outline helps understand where sprites are drawn relative to each other. See #632. --- client/gui-qt/tileset_debugger.cpp | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/client/gui-qt/tileset_debugger.cpp b/client/gui-qt/tileset_debugger.cpp index d5294269e0..30b8150df8 100644 --- a/client/gui-qt/tileset_debugger.cpp +++ b/client/gui-qt/tileset_debugger.cpp @@ -125,13 +125,16 @@ void tileset_debugger::set_tile(const ::tile *t) } // Draw the composite picture - auto this_layer = QPixmap(rectangle.size()); + auto this_layer = QPixmap(rectangle.size() + QSize(2, 2)); this_layer.fill(Qt::transparent); auto p = QPainter(); p.begin(&this_layer); + // Outline + p.setPen(palette().color(QPalette::WindowText)); + p.drawRect(0, 0, this_layer.width() - 1, this_layer.height() - 1); // If there are negative offsets, the pixmap was extended in the negative // direction. Compensate by offsetting the painter back... - p.translate(-rectangle.topLeft()); + p.translate(-rectangle.topLeft() + QPoint(1, 1)); for (const auto &ds : sprites) { p.drawPixmap(ds.offset_x, ds.offset_y, *ds.sprite); } @@ -141,16 +144,21 @@ void tileset_debugger::set_tile(const ::tile *t) // Add the sprites as children for (const auto &ds : sprites) { auto child = new QTreeWidgetItem(item); - auto this_sprite = QPixmap(rectangle.size()); + auto this_sprite = QPixmap(rectangle.size() + QSize(2, 2)); this_sprite.fill(Qt::transparent); p.begin(&this_sprite); + // Outline + p.resetTransform(); + p.setPen(palette().color(QPalette::WindowText)); + p.drawRect(0, 0, this_layer.width() - 1, this_layer.height() - 1); // We inherit the translation set above + p.translate(-rectangle.topLeft() + QPoint(1, 1)); p.drawPixmap(ds.offset_x, ds.offset_y, *ds.sprite); p.end(); child->setIcon(0, QIcon(this_sprite)); child->setText( 0, QString(_("Offset: %1, %2")).arg(ds.offset_x).arg(ds.offset_y)); - maxSize = maxSize.expandedTo(ds.sprite->size()); + maxSize = maxSize.expandedTo(rectangle.size()); } } From 9447872ce71a7ff3f4a8300c9642fa9597d7a675 Mon Sep 17 00:00:00 2001 From: Louis Moureaux Date: Mon, 13 Sep 2021 00:22:10 +0200 Subject: [PATCH 09/12] Document the Tileset Debugger See #632. --- docs/Modding/Tilesets/debugger.rst | 48 +++++++++++++++++++++ docs/Modding/Tilesets/tileset_debugger.png | Bin 0 -> 74673 bytes docs/Modding/index.rst | 7 ++- 3 files changed, 54 insertions(+), 1 deletion(-) create mode 100644 docs/Modding/Tilesets/debugger.rst create mode 100644 docs/Modding/Tilesets/tileset_debugger.png diff --git a/docs/Modding/Tilesets/debugger.rst b/docs/Modding/Tilesets/debugger.rst new file mode 100644 index 0000000000..98fb6d4a79 --- /dev/null +++ b/docs/Modding/Tilesets/debugger.rst @@ -0,0 +1,48 @@ +Tileset Debugger +================ + +.. versionadded:: 3.0-alpha6 + +The Tileset Debugger, accessible from the :guilabel:`Game` menu, lets you +inspect how the map is drawn. This is very helpful when developing a tileset, to +understand why something is rendering incorrectly or to understand how other +tilesets work. + +.. note:: + If you have suggestions regarding the contents and functionality of the + debugger, you're very welcome to let us know on `Github`_ --- you'll get a + chance to shape it to your needs. + +To start using the debugger, click on the :guilabel:`Pick tile` button and then +somewhere on the map. The window will be updated with the list of sprites used +to draw the selected tile: + +.. image:: tileset_debugger.png + :alt: The tileset Debugger with a forest tile picked up. + :align: center + :scale: 75% + +The list has two levels. Each top level item corresponds to one layer used to +draw the map. When something is drawn for a layer, its image is added next to +its name and the individual sprites are added in the second level. The sprites +at the top of the list are drawn first and are hidden by the ones below. + +In the picture above, which uses the `amplio2` tileset, the four layers of a +forest tile are shown, two of which have sprites: ``Background``. a terrain +layer (``Terrain1``), ``Darkness``, and another terrain layer (also listed as +``Terrain1``). The first terrain layer is made of five sprites: one for the base +texture and four that blend it with adjacent tiles. The second terrain layer has +only one sprite, used to draw the trees. + +The offsets used to draw the sprites are also shown. The first number +corresponds to the horizontal axis and runs from left to right; the second to +the vertical axis that runs from top to bottom. Depending on the type of layer, +these values may be computed automatically, so they do not necessarily +correspond to a parameters in the ``tilespec`` file. + +.. note:: + The Tileset Debugger is still an experimental feature with important + limitations. In particular, it only shows sprites that correspond to the + tile as opposed to its corners and edges. + +.. _Github: https://github.com/longturn/freeciv21/issues/new?assignees=&labels=Untriaged%2C+enhancement&template=feature_request.md&title= diff --git a/docs/Modding/Tilesets/tileset_debugger.png b/docs/Modding/Tilesets/tileset_debugger.png new file mode 100644 index 0000000000000000000000000000000000000000..d5752ceb8e967259b7ca9e30bb8472f81d250fec GIT binary patch literal 74673 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 Date: Mon, 13 Sep 2021 00:56:32 +0200 Subject: [PATCH 10/12] Move tileset debugger image to _static For consistency with other images, as pointed out by jwrober. --- docs/Modding/Tilesets/debugger.rst | 2 +- .../images/gui-elements/tileset-debugger.png} | Bin 2 files changed, 1 insertion(+), 1 deletion(-) rename docs/{Modding/Tilesets/tileset_debugger.png => _static/images/gui-elements/tileset-debugger.png} (100%) diff --git a/docs/Modding/Tilesets/debugger.rst b/docs/Modding/Tilesets/debugger.rst index 98fb6d4a79..5b820d4e4b 100644 --- a/docs/Modding/Tilesets/debugger.rst +++ b/docs/Modding/Tilesets/debugger.rst @@ -17,7 +17,7 @@ To start using the debugger, click on the :guilabel:`Pick tile` button and then somewhere on the map. The window will be updated with the list of sprites used to draw the selected tile: -.. image:: tileset_debugger.png +.. image:: /_static/images/gui-elements/tileset-debugger.png :alt: The tileset Debugger with a forest tile picked up. :align: center :scale: 75% diff --git a/docs/Modding/Tilesets/tileset_debugger.png b/docs/_static/images/gui-elements/tileset-debugger.png similarity index 100% rename from docs/Modding/Tilesets/tileset_debugger.png rename to docs/_static/images/gui-elements/tileset-debugger.png From dd04e459eec0ef17db39b04a6d17709317586efc Mon Sep 17 00:00:00 2001 From: Louis Moureaux Date: Mon, 13 Sep 2021 00:59:01 +0200 Subject: [PATCH 11/12] Use a single note in the debugger documentation Better wording of the note, move the limitation to the main text. Also switch to "attention". See #633. --- docs/Modding/Tilesets/debugger.rst | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/docs/Modding/Tilesets/debugger.rst b/docs/Modding/Tilesets/debugger.rst index 5b820d4e4b..30f19f9e1e 100644 --- a/docs/Modding/Tilesets/debugger.rst +++ b/docs/Modding/Tilesets/debugger.rst @@ -8,10 +8,10 @@ inspect how the map is drawn. This is very helpful when developing a tileset, to understand why something is rendering incorrectly or to understand how other tilesets work. -.. note:: - If you have suggestions regarding the contents and functionality of the - debugger, you're very welcome to let us know on `Github`_ --- you'll get a - chance to shape it to your needs. +.. attention:: + The Tileset Debugger is still a work in progress. If you have suggestions + regarding its contents and functionality, you're very welcome to let us know + on `Github`_ --- you'll get a chance to shape it to your needs. To start using the debugger, click on the :guilabel:`Pick tile` button and then somewhere on the map. The window will be updated with the list of sprites used @@ -25,7 +25,8 @@ to draw the selected tile: The list has two levels. Each top level item corresponds to one layer used to draw the map. When something is drawn for a layer, its image is added next to its name and the individual sprites are added in the second level. The sprites -at the top of the list are drawn first and are hidden by the ones below. +at the top of the list are drawn first and are hidden by the ones below. Note +that at the moment, only sprites that correspond to the tile (as opposed to its corners and edges) are visible. In the picture above, which uses the `amplio2` tileset, the four layers of a forest tile are shown, two of which have sprites: ``Background``. a terrain @@ -40,9 +41,4 @@ the vertical axis that runs from top to bottom. Depending on the type of layer, these values may be computed automatically, so they do not necessarily correspond to a parameters in the ``tilespec`` file. -.. note:: - The Tileset Debugger is still an experimental feature with important - limitations. In particular, it only shows sprites that correspond to the - tile as opposed to its corners and edges. - .. _Github: https://github.com/longturn/freeciv21/issues/new?assignees=&labels=Untriaged%2C+enhancement&template=feature_request.md&title= From bd05d84b0196736c26b7e8964857cdf3685c267d Mon Sep 17 00:00:00 2001 From: Louis Moureaux Date: Mon, 13 Sep 2021 01:04:19 +0200 Subject: [PATCH 12/12] Document the use of ``...`` for :literal:`...` Requrested by @jwrober. --- docs/Developing/style-guide.rst | 42 ++++++++++++++++----------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/docs/Developing/style-guide.rst b/docs/Developing/style-guide.rst index bd1da2e6da..7a65804eae 100644 --- a/docs/Developing/style-guide.rst +++ b/docs/Developing/style-guide.rst @@ -6,9 +6,9 @@ Documentation Style Guide .. role:: improvement .. role:: wonder -The Longturn community uses the Python based Sphinx system to generate the documentation available on this -website and in the :file:`doc` directory in the released tarball. Sphinx takes plain text files formatted -with a superset of markdown called reStructuredText (ReST). Sphinx reStructuredText is documented here: +The Longturn community uses the Python based Sphinx system to generate the documentation available on this +website and in the :file:`doc` directory in the released tarball. Sphinx takes plain text files formatted +with a superset of markdown called reStructuredText (ReST). Sphinx reStructuredText is documented here: https://www.sphinx-doc.org/en/master/usage/restructuredtext/index.html This style guide is mostly meant for documentation authors to ensure that we keep a consistent look and feel @@ -19,7 +19,7 @@ Headings Headings create chapter breaks between sections of a document as well as provide the title. -Heading 1 +Heading 1 Heading 1 is used to for the title of the page/document. The asterisk is used to denote Heading 1 like this: @@ -53,31 +53,31 @@ Heading 3 Interpreted Text Roles ====================== -Interpreted text roles are special code blocks that are inserted in line with regular text to create user -interface markup elements to bring attention to something or make it more obvious to the reader what you -want to do. Interpreted text roles are simply a code word surrounded by a colon on both sides and the text +Interpreted text roles are special code blocks that are inserted in line with regular text to create user +interface markup elements to bring attention to something or make it more obvious to the reader what you +want to do. Interpreted text roles are simply a code word surrounded by a colon on both sides and the text you want to alter is placed inside back-ticks. -* :literal:`:doc:` -- Doc is used to create a hyperlink reference between documents in the documentation +* :literal:`:doc:` -- Doc is used to create a hyperlink reference between documents in the documentation system. * :literal:`:emphasis:` -- Emphasis is used to :emphasis:`bring attention to something`. * :literal:`:file:` -- File is used for file names and paths such as :file:`~/.local/share/freeciv21/saves` -* :literal:`:guilabel:` -- GUI Label is used to bring attention to someting on the screen like the +* :literal:`:guilabel:` -- GUI Label is used to bring attention to someting on the screen like the :guilabel:`Next` button on the installer wizard -* :literal:`:literal:` -- Literal is used when you want to note a text element in its raw form. -* :literal:`:menuselection:` -- Menu Selection is used to give the path of menu clicks such as - :menuselection:`Game --> Options --> Local Options`. To create the arrow character in between the options +* :literal:`:literal:` -- Literal is used when you want to note a text element in its raw form. This is equivalent to using four back-ticks: ````text````. +* :literal:`:menuselection:` -- Menu Selection is used to give the path of menu clicks such as + :menuselection:`Game --> Options --> Local Options`. To create the arrow character in between the options you will place a text arrow like this: :literal:`-->` in between the selection items. * :literal:`:strong:` -- Strong is used to :strong:`bold some text`. -* :literal:`:title-reference:` -- Title Reference is used notate a :title-reference:`title entry` in the - in-game help or to refer to a page in the documentation without giving an actual hyperlink reference +* :literal:`:title-reference:` -- Title Reference is used notate a :title-reference:`title entry` in the + in-game help or to refer to a page in the documentation without giving an actual hyperlink reference (see :literal:`:doc:` above). The docutils specification allows for custom Interpreted Text Roles and we use this feature. The docutils -documentation on this feature is available here: +documentation on this feature is available here: https://docutils.sourceforge.io/docs/ref/rst/directives.html#custom-interpreted-text-roles -* :literal:`:unit:` -- This provides an opportunity to highlight a Freeciv21 unit, such as the +* :literal:`:unit:` -- This provides an opportunity to highlight a Freeciv21 unit, such as the :unit:`Musketeer` * :literal:`:improvement:` -- This provides an opportunity to highlight a Freeciv21 building or city improvement, such as the :improvement:`Granary`. @@ -87,17 +87,17 @@ https://docutils.sourceforge.io/docs/ref/rst/directives.html#custom-interpreted- Admonition Directives ===================== -Admonitions are specially marked "topics" that can appear anywhere an ordinary body element can. Typically, -an admonition is rendered as an offset block in a document, sometimes outlined or shaded, with a title +Admonitions are specially marked "topics" that can appear anywhere an ordinary body element can. Typically, +an admonition is rendered as an offset block in a document, sometimes outlined or shaded, with a title matching the admonition type. We use some of the standard admonitions in our documentation as well. -* :literal:`.. attention::` -- Use attention to bring a very important high profile item to the reader's +* :literal:`.. attention::` -- Use attention to bring a very important high profile item to the reader's attention. .. attention:: This is a really important message! Don't forget to eat breakfast every day. -* :literal:`.. todo::` -- Use To Do as a reminder for documentation editors to come back and fix things at +* :literal:`.. todo::` -- Use To Do as a reminder for documentation editors to come back and fix things at a later date. .. todo:: @@ -108,7 +108,7 @@ matching the admonition type. We use some of the standard admonitions in our doc .. note:: It's important to note that Freeciv21 is really fun to play with group's of people online. -* :literal:`.. code-block:: rst` -- The code block is an excellent way to display actual code or any +* :literal:`.. code-block:: rst` -- The code block is an excellent way to display actual code or any pre-formatted plain text. .. code-block:: rst