widelands-dev team mailing list archive
-
widelands-dev team
-
Mailing list archive
-
Message #02794
Re: [Merge] lp:~widelands-dev/widelands/bug-987510 into lp:widelands
Will do the numbers then.
The discinct message types are needed elsewhere, see the diff comment for details.
Diff comments:
> === modified file 'pics/message_archive.png'
> Binary files pics/message_archive.png 2010-01-14 18:22:23 +0000 and pics/message_archive.png 2014-09-29 15:04:07 +0000 differ
> === modified file 'pics/message_archived.png'
> Binary files pics/message_archived.png 2010-01-14 18:22:23 +0000 and pics/message_archived.png 2014-09-29 15:04:07 +0000 differ
> === added file 'pics/message_clear_selection.png'
> Binary files pics/message_clear_selection.png 1970-01-01 00:00:00 +0000 and pics/message_clear_selection.png 2014-09-29 15:04:07 +0000 differ
> === modified file 'pics/message_restore.png'
> Binary files pics/message_restore.png 2010-01-14 18:22:23 +0000 and pics/message_restore.png 2014-09-29 15:04:07 +0000 differ
> === added file 'pics/message_selection_invert.png'
> Binary files pics/message_selection_invert.png 1970-01-01 00:00:00 +0000 and pics/message_selection_invert.png 2014-09-29 15:04:07 +0000 differ
> === added file 'pics/messages_warfare.png'
> Binary files pics/messages_warfare.png 1970-01-01 00:00:00 +0000 and pics/messages_warfare.png 2014-09-29 15:04:07 +0000 differ
> === modified file 'src/logic/building.cc'
> --- src/logic/building.cc 2014-09-18 18:56:20 +0000
> +++ src/logic/building.cc 2014-09-29 15:04:07 +0000
> @@ -879,7 +879,7 @@
> */
> void Building::send_message
> (Game & game,
> - const std::string & msgsender,
> + const Message::Type msgtype,
> const std::string & title,
> const std::string & description,
> bool link_to_building_lifetime,
> @@ -910,7 +910,7 @@
> rt_description += "</p></rt>";
>
> Message * msg = new Message
> - (msgsender, game.get_gametime(), title, rt_description,
> + (msgtype, game.get_gametime(), title, rt_description,
> get_position(), (link_to_building_lifetime ? m_serial : 0));
>
> if (throttle_time)
>
> === modified file 'src/logic/building.h'
> --- src/logic/building.h 2014-09-14 11:31:58 +0000
> +++ src/logic/building.h 2014-09-29 15:04:07 +0000
> @@ -31,6 +31,7 @@
> #include "logic/bill_of_materials.h"
> #include "logic/buildcost.h"
> #include "logic/immovable.h"
> +#include "logic/message.h"
> #include "logic/soldier_counts.h"
> #include "logic/wareworker.h"
> #include "logic/widelands.h"
> @@ -259,7 +260,7 @@
>
> void send_message
> (Game & game,
> - const std::string & msgsender,
> + const Message::Type msgtype,
> const std::string & title,
> const std::string & description,
> bool link_to_building_lifetime = true,
>
> === modified file 'src/logic/cmd_luacoroutine.cc'
> --- src/logic/cmd_luacoroutine.cc 2014-09-18 18:56:20 +0000
> +++ src/logic/cmd_luacoroutine.cc 2014-09-29 15:04:07 +0000
> @@ -50,7 +50,7 @@
> for (int i = 1; i <= game.map().get_nrplayers(); i++) {
> Widelands::Message & msg =
> *new Widelands::Message
> - ("Game Logic", game.get_gametime(), "Lua Coroutine Failed", e.what());
> + (Message::Type::gameLogic, game.get_gametime(), "Lua Coroutine Failed", e.what());
> game.player(i).add_message(game, msg, true);
> }
> game.gameController()->setDesiredSpeed(0);
>
> === modified file 'src/logic/message.h'
> --- src/logic/message.h 2014-09-15 10:17:53 +0000
> +++ src/logic/message.h 2014-09-29 15:04:07 +0000
> @@ -30,9 +30,29 @@
>
> struct Message {
> enum Status {New, Read, Archived};
> + enum class Type: uint8_t {
> + noMessages,
I can give them the k prefix, no problem. The Google Style Guide is new to me, and I haven't done the bug about enum member renaming yet ;)
About the multiple names, they are needed elsewhere:
Geologist needs distinct message types, otherwise each geologist will only send 1 message instead of 1 message for each resource type.
Militarysites need multiple message types to play special notification sounds for the site being attacked etc.
> + allMessages,
> + gameLogic,
> + geologists,
> + geologistsCoal,
> + geologistsGold,
> + geologistsGranite,
> + geologistsIron,
> + geologistsWater,
> + scenario,
> + seafaring,
> + economy, // economy
> + siteOccupied, // economy
> + warfare, // everything starting from here is warfare
> + siteDefeated,
> + siteLost,
> + underAttack
> + };
> +
> /**
> * A new message to be displayed to the player
> - * \param msgsender The message sender
> + * \param msgtype The type of message (economy, geologists, etc.)
> * \param sent_time The (game) time at which the message is sent
> * \param t The message title
> * \param b The message body
> @@ -43,7 +63,7 @@
> * \param s The message status. Defaults to Status::New
> */
> Message
> - (const std::string & msgsender,
> + (Message::Type msgtype,
> uint32_t sent_time,
> const std::string & t,
> const std::string & b,
> @@ -51,8 +71,8 @@
> Widelands::Serial ser = 0,
> Status s = New)
> :
> - m_sender(msgsender),
> - m_title(t),
> + m_type (msgtype),
> + m_title (t),
> m_body (b),
> m_sent (sent_time),
> m_position(c),
> @@ -60,18 +80,35 @@
> m_status (s)
> {}
>
> - const std::string & sender() const {return m_sender;}
> - uint32_t sent () const {return m_sent;}
> - const std::string & title() const {return m_title;}
> - const std::string & body () const {return m_body;}
> - Widelands::Coords position() const {return m_position;}
> - Widelands::Serial serial() const {return m_serial;}
> - Status status () const {return m_status;}
> - Status set_status(Status const s) {return m_status = s;}
> + Message::Type type () const {return m_type;}
> + uint32_t sent () const {return m_sent;}
> + const std::string & title () const {return m_title;}
> + const std::string & body () const {return m_body;}
> + Widelands::Coords position() const {return m_position;}
> + Widelands::Serial serial () const {return m_serial;}
> + Status status () const {return m_status;}
> + Status set_status(Status const s) {return m_status = s;}
> +
> + /**
> + * Returns the main type for the message's sub type
> + */
> + Message::Type message_type_category() const {
> + if (m_type >= Widelands::Message::Type::warfare) {
> + return Widelands::Message::Type::warfare;
> +
> + } else if (m_type >= Widelands::Message::Type::economy &&
> + m_type <= Widelands::Message::Type::siteOccupied) {
> + return Widelands::Message::Type::economy;
> + } else if (m_type >= Widelands::Message::Type::geologists &&
> + m_type <= Widelands::Message::Type::geologistsWater) {
> + return Widelands::Message::Type::geologists;
> + }
> + return m_type;
> + }
>
> private:
> - std::string m_sender;
> - std::string m_title;
> + Message::Type m_type;
> + std::string m_title;
> std::string m_body;
> uint32_t m_sent;
> Widelands::Coords m_position;
>
> === modified file 'src/logic/militarysite.cc'
> --- src/logic/militarysite.cc 2014-09-10 10:18:46 +0000
> +++ src/logic/militarysite.cc 2014-09-29 15:04:07 +0000
> @@ -248,7 +248,7 @@
> if (upcast(Game, game, &egbase)) {
> send_message
> (*game,
> - "site_occupied",
> + Message::Type::siteOccupied,
> descr().descname(),
> descr().m_occupied_str,
> true);
> @@ -845,7 +845,7 @@
> {
> send_message
> (game,
> - "site_lost",
> + Message::Type::siteLost,
> _("Militarysite lost!"),
> descr().m_defeated_enemy_str,
> false);
> @@ -899,7 +899,7 @@
> // Of course we should inform the victorious player as well
> newsite->send_message
> (game,
> - "site_defeated",
> + Message::Type::siteDefeated,
> _("Enemy at site defeated!"),
> newsite->descr().m_defeated_you_str,
> true);
> @@ -949,7 +949,7 @@
> // radius <= 5 near the current location in the last 60 seconds
> send_message
> (game,
> - "under_attack",
> + Message::Type::underAttack,
> _("You are under attack"),
> discovered ? descr().m_aggressor_str : descr().m_attack_str,
> false,
>
> === modified file 'src/logic/player.cc'
> --- src/logic/player.cc 2014-09-18 18:56:20 +0000
> +++ src/logic/player.cc 2014-09-29 15:04:07 +0000
> @@ -292,15 +292,15 @@
> * Plays the corresponding sound when a message is received and if sound is
> * enabled.
> */
> -void Player::play_message_sound(const std::string & sender) {
> -#define MAYBE_PLAY(a, b) if (sender == a) { \
> - g_sound_handler.play_fx(b, 200, PRIO_ALWAYS_PLAY); \
> +void Player::play_message_sound(const Message::Type & msgtype) {
> +#define MAYBE_PLAY(type, file) if (msgtype == type) { \
> + g_sound_handler.play_fx(file, 200, PRIO_ALWAYS_PLAY); \
> return; \
> }
>
> if (g_options.pull_section("global").get_bool("sound_at_message", true)) {
> - MAYBE_PLAY("site_occupied", "sound/military/site_occupied");
> - MAYBE_PLAY("under_attack", "sound/military/under_attack");
> + MAYBE_PLAY(Message::Type::siteOccupied, "sound/military/site_occupied");
> + MAYBE_PLAY(Message::Type::underAttack, "sound/military/under_attack");
>
> g_sound_handler.play_fx("sound/message", 200, PRIO_ALWAYS_PLAY);
> }
> @@ -321,7 +321,7 @@
> // Sound & popup
> if (InteractivePlayer * const iplayer = game.get_ipl()) {
> if (&iplayer->player() == this) {
> - play_message_sound(message.sender());
> + play_message_sound(message.type());
> if (popup)
> iplayer->popup_message(id, message);
> }
> @@ -339,7 +339,7 @@
> Coords const position = m .position ();
> for (std::pair<MessageId, Message *> tmp_message : messages()) {
> if
> - (tmp_message.second->sender() == m.sender() &&
> + (tmp_message.second->type() == m.type() &&
> gametime < tmp_message.second->sent() + timeout &&
> map.calc_distance(tmp_message.second->position(), position) <= radius)
> {
>
> === modified file 'src/logic/player.h'
> --- src/logic/player.h 2014-09-18 18:56:20 +0000
> +++ src/logic/player.h 2014-09-29 15:04:07 +0000
> @@ -524,7 +524,7 @@
> private:
> void update_building_statistics(Building &, NoteImmovable::Ownership ownership);
> void update_team_players();
> - void play_message_sound(const std::string & sender);
> + void play_message_sound(const Message::Type & msgtype);
> void _enhance_or_dismantle
> (Building *, BuildingIndex const index_of_new_building);
>
>
> === modified file 'src/logic/productionsite.cc'
> --- src/logic/productionsite.cc 2014-09-10 18:56:42 +0000
> +++ src/logic/productionsite.cc 2014-09-29 15:04:07 +0000
> @@ -924,7 +924,7 @@
> assert(!descr().out_of_resource_message().empty());
> send_message
> (game,
> - "produce",
> + Message::Type::economy,
> descr().out_of_resource_title(),
> descr().out_of_resource_message(),
> true,
>
> === modified file 'src/logic/ship.cc'
> --- src/logic/ship.cc 2014-09-18 18:56:20 +0000
> +++ src/logic/ship.cc 2014-09-29 15:04:07 +0000
> @@ -459,7 +459,7 @@
> // Send a message to the player, that a new port space was found
> std::string msg_head = _("Port Space Found");
> std::string msg_body = _("An expedition ship found a new port build space.");
> - send_message(game, "exp_port_space", msg_head, msg_body, "port.png");
> + send_message(game, msg_head, msg_body, "port.png");
> }
> m_expedition->seen_port_buildspaces.swap(temp_port_buildspaces);
> }
> @@ -568,7 +568,7 @@
> std::string msg_head = _("Island Circumnavigated");
> std::string msg_body = _("An expedition ship sailed around its"
> " island without any events.");
> - send_message(game, "exp_island", msg_head, msg_body,
> + send_message(game, msg_head, msg_body,
> "ship_explore_island_cw.png");
> m_ship_state = EXP_WAITING;
> return start_task_idle(game, descr().main_animation(), 1500);
> @@ -624,7 +624,7 @@
> std::string msg_head = _("Coast Reached");
> std::string msg_body =
> _("An expedition ship reached a coast and is waiting for further commands.");
> - send_message(game, "exp_coast", msg_head, msg_body, "ship_explore_island_cw.png");
> + send_message(game, msg_head, msg_body, "ship_explore_island_cw.png");
> return;
> }
> }
> @@ -787,7 +787,7 @@
> // Send a message to the player, that an expedition is ready to go
> const std::string msg_head = _("Expedition Ready");
> const std::string msg_body = _("An expedition ship is waiting for your commands.");
> - send_message(game, "exp_ready", msg_head, msg_body, "start_expedition.png");
> + send_message(game, msg_head, msg_body, "start_expedition.png");
> }
>
> /// Initializes / changes the direction of scouting to @arg direction
> @@ -899,9 +899,7 @@
> * \param picture picture name relative to the pics directory
> */
> void Ship::send_message
> - (Game & game, const std::string & msgsender,
> - const std::string & title, const std::string & description,
> - const std::string & picture)
> + (Game & game, const std::string & title, const std::string & description, const std::string & picture)
> {
> std::string rt_description;
> if (picture.size() > 3) {
> @@ -914,7 +912,7 @@
> rt_description += "</p></rt>";
>
> Message * msg = new Message
> - (msgsender, game.get_gametime(), title, rt_description, get_position(), m_serial);
> + (Message::Type::seafaring, game.get_gametime(), title, rt_description, get_position(), m_serial);
>
> get_owner()->add_message(game, *msg);
> }
>
> === modified file 'src/logic/ship.h'
> --- src/logic/ship.h 2014-09-10 08:55:04 +0000
> +++ src/logic/ship.h 2014-09-29 15:04:07 +0000
> @@ -208,8 +208,7 @@
> void init_fleet(EditorGameBase &);
> void set_fleet(Fleet * fleet);
>
> - void send_message
> - (Game &, const std::string &, const std::string &, const std::string &, const std::string &);
> + void send_message(Game &, const std::string &, const std::string &, const std::string &);
>
> UI::Window * m_window;
>
>
> === modified file 'src/logic/soldier.cc'
> --- src/logic/soldier.cc 2014-09-18 18:56:20 +0000
> +++ src/logic/soldier.cc 2014-09-29 15:04:07 +0000
> @@ -1570,7 +1570,7 @@
> owner().add_message
> (game,
> *new Message
> - ("game engine",
> + (Message::Type::gameLogic,
> game.get_gametime(),
> _("Logic error"),
> buffer,
> @@ -1579,7 +1579,7 @@
> opponent.owner().add_message
> (game,
> *new Message
> - ("game engine",
> + (Message::Type::gameLogic,
> game.get_gametime(),
> _("Logic error"),
> buffer,
>
> === modified file 'src/logic/warehouse.cc'
> --- src/logic/warehouse.cc 2014-09-10 10:18:46 +0000
> +++ src/logic/warehouse.cc 2014-09-29 15:04:07 +0000
> @@ -451,18 +451,30 @@
> (ref_cast<Game, EditorGameBase>(egbase), 4000);
>
> log("Message: adding (wh) (%s) %i \n", to_string(descr().type()).c_str(), player.player_number());
> - char message[2048];
> - snprintf
> - (message, sizeof(message),
> - _("A new %s was added to your economy."),
> - descr().descname().c_str());
> - send_message
> - (ref_cast<Game, EditorGameBase>(egbase),
> - "warehouse",
> - descr().descname(),
> - message,
> - true);
> +
> + if (descr().name() == "port") {
> + send_message
> + (ref_cast<Game, EditorGameBase>(egbase),
> + Message::Type::seafaring,
> + descr().descname(),
> + _("A new port was added to your economy."),
> + true);
> + } else if (descr().name() == "headquarters") {
> + send_message
> + (ref_cast<Game, EditorGameBase>(egbase),
> + Message::Type::economy,
> + descr().descname(),
> + _("A new headquarters was added to your economy."),
> + true);
> + } else {
> + send_message
> + (ref_cast<Game, EditorGameBase>(egbase),
> + Message::Type::economy,
> + descr().descname(),
> + _("A new warehouse was added to your economy."),
> + true);
> }
> + }
>
> if (uint32_t const conquer_radius = descr().get_conquers())
> egbase.conquer_area
>
> === modified file 'src/logic/worker.cc'
> --- src/logic/worker.cc 2014-09-18 18:56:20 +0000
> +++ src/logic/worker.cc 2014-09-29 15:04:07 +0000
> @@ -941,12 +941,24 @@
> rdescr->name().c_str(),
> _("A geologist found resources."));
>
> + Message::Type message_type = Message::Type::geologists;
> + if (rdescr->name() == "coal")
> + message_type = Message::Type::geologistsCoal;
> + else if (rdescr->name() == "gold")
> + message_type = Message::Type::geologistsGold;
> + else if (rdescr->name() == "granite")
> + message_type = Message::Type::geologistsGranite;
> + else if (rdescr->name() == "iron")
> + message_type = Message::Type::geologistsIron;
> + else if (rdescr->name() == "water")
> + message_type = Message::Type::geologistsWater;
> +
> // We should add a message to the player's message queue - but only,
> // if there is not already a similar one in list.
> owner().add_message_with_timeout
> (game,
> *new Message
> - ("geologist " + rdescr->name(), // e.g. "geologist gold"
> + (message_type,
> game.get_gametime(),
> rdescr->descname(),
> message,
> @@ -1844,7 +1856,7 @@
> owner().add_message
> (game,
> *new Message
> - ("game engine",
> + (Message::Type::gameLogic,
> game.get_gametime(),
> _("Worker got lost!"),
> buffer,
>
> === modified file 'src/map_io/map_players_messages_packet.cc'
> --- src/map_io/map_players_messages_packet.cc 2014-09-18 18:56:20 +0000
> +++ src/map_io/map_players_messages_packet.cc 2014-09-29 15:04:07 +0000
> @@ -20,6 +20,7 @@
> #include "map_io/map_players_messages_packet.h"
>
> #include "logic/game_data_error.h"
> +#include "logic/message.h"
> #include "logic/player.h"
> #include "map_io/coords_profile.h"
> #include "map_io/map_object_loader.h"
> @@ -61,14 +62,14 @@
> "added it to the queue. This is only allowed during "
> "simulation, not at load. The following messge will be "
> "removed when the queue is reset:\n"
> - "\tsender : %s\n"
> + "\tstype : %u\n"
> "\ttitle : %s\n"
> "\tsent : %u\n"
> "\tposition: (%i, %i)\n"
> "\tstatus : %u\n"
> "\tbody : %s\n",
> p,
> - begin->second->sender ().c_str(),
> + begin->second->type (),
> begin->second->title ().c_str(),
> begin->second->sent (),
> begin->second->position().x, begin->second->position().y,
> @@ -120,7 +121,7 @@
>
> messages.add_message
> (*new Message
> - (s->get_string ("sender", ""),
> + (static_cast<Message::Type>(s->get_natural("type")),
> sent,
> s->get_name (),
> s->get_safe_string("body"),
> @@ -156,11 +157,10 @@
> assert(message.sent() <= static_cast<uint32_t>(egbase.get_gametime()));
>
> Section & s = prof.create_section_duplicate(message.title().c_str());
> - if (message.sender().size())
> - s.set_string("sender", message.sender ());
> - s.set_int ("sent", message.sent ());
> - s.set_string ("body", message.body ());
> - if (Coords const c = message.position())
> + s.set_int ("type", static_cast<int32_t>(message.type()));
> + s.set_int ("sent", message.sent ());
> + s.set_string ("body", message.body ());
> + if (Coords const c = message.position())
> set_coords("position", c, &s);
> switch (message.status()) {
> case Message::New:
>
> === modified file 'src/scripting/lua_game.cc'
> --- src/scripting/lua_game.cc 2014-09-18 18:56:20 +0000
> +++ src/scripting/lua_game.cc 2014-09-29 15:04:07 +0000
> @@ -29,6 +29,7 @@
> #include "logic/campaign_visibility.h"
> #include "logic/constants.h"
> #include "logic/game_controller.h"
> +#include "logic/message.h"
> #include "logic/objective.h"
> #include "logic/path.h"
> #include "logic/player.h"
> @@ -277,9 +278,6 @@
> 'archived'. Default: "new"
> :type status: :class:`string`
>
> - :arg sender: sender name of this string. Default: "ScriptingEngine"
> - :type sender: :class:`string`
> -
> :arg popup: should the message window be opened for this message or not.
> Default: :const:`false`
> :type popup: :class:`boolean`
> @@ -293,7 +291,6 @@
> std::string body = luaL_checkstring(L, 3);
> Coords c = Coords::Null();
> Message::Status st = Message::New;
> - std::string sender = "ScriptingEngine";
> bool popup = false;
>
> if (n == 4) {
> @@ -313,11 +310,6 @@
> }
> lua_pop(L, 1);
>
> - lua_getfield(L, 4, "sender");
> - if (!lua_isnil(L, -1))
> - sender = luaL_checkstring(L, -1);
> - lua_pop(L, 1);
> -
> lua_getfield(L, 4, "popup");
> if (!lua_isnil(L, -1))
> popup = luaL_checkboolean(L, -1);
> @@ -331,7 +323,7 @@
> plr.add_message
> (game,
> *new Message
> - (sender,
> + (Message::Type::scenario,
> game.get_gametime(),
> title,
> body,
> @@ -1049,7 +1041,6 @@
> {nullptr, nullptr},
> };
> const PropertyType<LuaMessage> LuaMessage::Properties[] = {
> - PROP_RO(LuaMessage, sender),
> PROP_RO(LuaMessage, title),
> PROP_RO(LuaMessage, body),
> PROP_RO(LuaMessage, sent),
> @@ -1079,15 +1070,7 @@
> PROPERTIES
> ==========================================================
> */
> -/* RST
> - .. attribute:: sender
>
> - (RO) The name of the sender of this message
> -*/
> -int LuaMessage::get_sender(lua_State * L) {
> - lua_pushstring(L, get(L, get_game(L)).sender());
> - return 1;
> -}
> /* RST
> .. attribute:: title
>
>
> === modified file 'src/scripting/lua_game.h'
> --- src/scripting/lua_game.h 2014-09-18 18:56:20 +0000
> +++ src/scripting/lua_game.h 2014-09-29 15:04:07 +0000
> @@ -161,7 +161,6 @@
> /*
> * Properties
> */
> - int get_sender(lua_State * L);
> int get_sent(lua_State * L);
> int get_title(lua_State * L);
> int get_body(lua_State * L);
>
> === modified file 'src/wui/game_message_menu.cc'
> --- src/wui/game_message_menu.cc 2014-09-10 14:48:40 +0000
> +++ src/wui/game_message_menu.cc 2014-09-29 15:04:07 +0000
> @@ -20,6 +20,7 @@
> #include "wui/game_message_menu.h"
>
> #include <boost/bind.hpp>
> +#include <boost/format.hpp>
>
> #include "base/deprecated.h"
> #include "base/time_string.h"
> @@ -46,11 +47,12 @@
> (&plr, "messages", ®istry, 580, 375, _("Messages: Inbox")),
> message_body
> (this,
> - 5, 150, 570, 220,
> + 5, 154, 570, 216,
> "", UI::Align_Left, 1),
> mode(Inbox)
> {
> - list = new UI::Table<uintptr_t>(this, 5, 35, 570, 110);
> +
> + list = new UI::Table<uintptr_t>(this, 5, message_body.get_y() - 110, 570, 110);
> list->selected.connect(boost::bind(&GameMessageMenu::selected, this, _1));
> list->double_clicked.connect(boost::bind(&GameMessageMenu::double_clicked, this, _1));
> list->add_column (60, _("Select"), "", UI::Align_HCenter, true);
> @@ -58,39 +60,105 @@
> list->add_column(330, _("Title"));
> list->add_column(120, _("Time sent"));
>
> + // Buttons for message types
> + m_geologistsbtn =
> + new UI::Button
> + (this, "filter_geologists_messages",
> + 5, 5, 34, 34,
> + g_gr->images().get("pics/but0.png"),
> + g_gr->images().get("pics/menu_geologist.png"),
> + "",
> + true);
> + m_geologistsbtn->sigclicked.connect
> + (boost::bind(&GameMessageMenu::filter_messages, this, Widelands::Message::Type::geologists));
> +
> + m_economybtn =
> + new UI::Button
> + (this, "filter_economy_messages",
> + 2 * 5 + 34, 5, 34, 34,
> + g_gr->images().get("pics/but0.png"),
> + g_gr->images().get("pics/menu_build_flag.png"),
> + "",
> + true);
> + m_economybtn->sigclicked.connect
> + (boost::bind(&GameMessageMenu::filter_messages, this, Widelands::Message::Type::economy));
> +
> + m_seafaringbtn =
> + new UI::Button
> + (this, "filter_seafaring_messages",
> + 3 * 5 + 2 * 34, 5, 34, 34,
> + g_gr->images().get("pics/but0.png"),
> + g_gr->images().get("pics/start_expedition.png"),
> + "",
> + true);
> + m_seafaringbtn->sigclicked.connect
> + (boost::bind(&GameMessageMenu::filter_messages, this, Widelands::Message::Type::seafaring));
> +
> + m_warfarebtn =
> + new UI::Button
> + (this, "filter_warfare_messages",
> + 4 * 5 + 3 * 34, 5, 34, 34,
> + g_gr->images().get("pics/but0.png"),
> + g_gr->images().get("pics/messages_warfare.png"),
> + "",
> + true);
> + m_warfarebtn->sigclicked.connect
> + (boost::bind(&GameMessageMenu::filter_messages, this, Widelands::Message::Type::warfare));
> +
> + m_scenariobtn =
> + new UI::Button
> + (this, "filter_scenario_messages",
> + 5 * 5 + 4 * 34, 5, 34, 34,
> + g_gr->images().get("pics/but0.png"),
> + g_gr->images().get("pics/menu_objectives.png"),
> + "",
> + true);
> + m_scenariobtn->sigclicked.connect
> + (boost::bind(&GameMessageMenu::filter_messages, this, Widelands::Message::Type::scenario));
> +
> + m_message_filter = Widelands::Message::Type::allMessages;
> + set_filter_messages_tooltips();
> + // End: Buttons for message types
> +
> UI::Button * clearselectionbtn =
> new UI::Button
> (this, "clear_selection",
> - 5, 5, 140, 25,
> - g_gr->images().get("pics/but0.png"),
> - _("Clear"), _("Clear selection"));
> + 5 * 5 + 6 * 34 + 17, 5, 34, 34,
> + g_gr->images().get("pics/but2.png"),
> + g_gr->images().get("pics/message_clear_selection.png"),
> + _("Clear selection"));
> clearselectionbtn->sigclicked.connect
> (boost::bind(&GameMessageMenu::do_clear_selection, this));
>
> UI::Button * invertselectionbtn =
> new UI::Button
> (this, "invert_selection",
> - 150, 5, 140, 25,
> - g_gr->images().get("pics/but0.png"),
> - _("Invert"), _("Invert selection"));
> + 6 * 5 + 7 * 34 + 17, 5, 34, 34,
> + g_gr->images().get("pics/but2.png"),
> + g_gr->images().get("pics/message_selection_invert.png"),
> + _("Invert selection"));
> invertselectionbtn->sigclicked.connect
> (boost::bind(&GameMessageMenu::do_invert_selection, this));
>
> m_archivebtn =
> new UI::Button
> (this, "archive_or_restore_selected_messages",
> - 295, 5, 25, 25,
> + 6 * 5 + 9 * 34 + 34, 5, 34, 34,
> g_gr->images().get("pics/but2.png"),
> g_gr->images().get("pics/message_archive.png"),
> - _("Archive selected messages"));
> + /** TRANSLATORS: %s is a tooltip, Del is the corresponding hotkey */
> + (boost::format(_("Del: %s"))
> + /** TRANSLATORS: Tooltip in the messages window */
> + % _("Archive selected messages")).str());
> m_archivebtn->sigclicked.connect
> (boost::bind(&GameMessageMenu::archive_or_restore, this));
>
> m_togglemodebtn =
> new UI::Button
> (this, "toggle_between_inbox_or_archive",
> - 325, 5, 190, 25,
> + 7 * 5 + 10 * 34 + 34, 5, 34, 34,
> g_gr->images().get("pics/but2.png"),
> + g_gr->images().get("pics/message_archived.png"),
> _("Show Archive"));
> m_togglemodebtn->sigclicked.connect
> (boost::bind(&GameMessageMenu::toggle_mode, this));
> @@ -98,13 +166,24 @@
> m_centerviewbtn =
> new UI::Button
> (this, "center_main_mapview_on_location",
> - 550, 5, 25, 25,
> + 580 - 5 - 34, 5, 34, 34,
> g_gr->images().get("pics/but2.png"),
> g_gr->images().get("pics/menu_goto.png"),
> - _("center main mapview on location"),
> + /** TRANSLATORS: %s is a tooltip, G is the corresponding hotkey */
> + (boost::format(_("G: %s"))
> + /** TRANSLATORS: Tooltip in the messages window */
> + % _("Center main mapview on location")).str(),
> false);
> m_centerviewbtn->sigclicked.connect(boost::bind(&GameMessageMenu::center_view, this));
>
> +
> + m_display_message_type_label =
> + new UI::MultilineTextarea
> + (this,
> + 5, 375 - 5 - 34, 5 * 34, 40,
> + "<rt image=pics/message_new.png></rt>",
> + UI::Align::Align_BottomLeft, false);
> +
> if (get_usedefaultpos())
> center_to_parent();
>
> @@ -183,6 +262,19 @@
> }
> }
>
> + // Filter message type
> + if (m_message_filter != Message::Type::allMessages) {
> + set_display_message_type_label(m_message_filter);
> + for (uint32_t j = list->size(); j; --j) {
> + MessageId m_id((*list)[j - 1]);
> + if (Message const * const message = mq[m_id]) {
> + if (message->message_type_category() != m_message_filter) {
> + list->remove(j - 1);
> + }
> + }
> + }
> + }
> +
> if (list->size()) {
> if (!list->has_selection())
> list->select(0);
> @@ -192,6 +284,7 @@
> } else {
> m_centerviewbtn->set_enabled(false);
> message_body.set_text(std::string());
> + set_display_message_type_label(Widelands::Message::Type::noMessages);
> }
> }
>
> @@ -226,6 +319,7 @@
> }
> m_centerviewbtn->set_enabled(message->position());
> message_body.set_text(message->body ());
> + set_display_message_type_label(message->message_type_category());
> return;
> }
> }
> @@ -247,12 +341,31 @@
> {
> if (down) {
> switch (code.sym) {
> + // Don't forget to change the tooltips if any of these get reassigned
> case SDLK_g:
> if (m_centerviewbtn->enabled())
> center_view();
> return true;
> -
> + case SDLK_a:
> + filter_messages(Widelands::Message::Type::allMessages);
> + return true;
> + case SDLK_l:
> + filter_messages(Widelands::Message::Type::geologists);
> + return true;
> + case SDLK_e:
> + filter_messages(Widelands::Message::Type::economy);
> + return true;
> + case SDLK_f:
> + filter_messages(Widelands::Message::Type::seafaring);
> + return true;
> + case SDLK_w:
> + filter_messages(Widelands::Message::Type::warfare);
> + return true;
> + case SDLK_r:
> + filter_messages(Widelands::Message::Type::scenario);
> + return true;
> case SDLK_KP_PERIOD:
> +
> if (code.mod & KMOD_NUM)
> break;
> /* no break */
> @@ -336,6 +449,141 @@
> }
>
> /**
> + * Show only messages of a certain type
> + * @param msgtype the types of messages to show
> + */
> +void GameMessageMenu::filter_messages(Widelands::Message::Type const msgtype) {
> + switch (msgtype) {
> + case Widelands::Message::Type::geologists:
> + toggle_filter_messages_button(*m_geologistsbtn, msgtype);
> + break;
> + case Widelands::Message::Type::economy:
> + toggle_filter_messages_button(*m_economybtn, msgtype);
> + break;
> + case Widelands::Message::Type::seafaring:
> + toggle_filter_messages_button(*m_seafaringbtn, msgtype);
> + break;
> + case Widelands::Message::Type::warfare:
> + toggle_filter_messages_button(*m_warfarebtn, msgtype);
> + break;
> + case Widelands::Message::Type::scenario:
> + toggle_filter_messages_button(*m_scenariobtn, msgtype);
> + break;
> + default:
> + set_filter_messages_tooltips();
> + m_message_filter = Widelands::Message::Type::allMessages;
> + m_geologistsbtn->set_perm_pressed(false);
> + m_economybtn->set_perm_pressed(false);
> + m_seafaringbtn->set_perm_pressed(false);
> + m_warfarebtn->set_perm_pressed(false);
> + m_scenariobtn->set_perm_pressed(false);
> + }
> + think();
> +}
> +
> +/**
> + * Helper for filter_messages
> + */
> +void GameMessageMenu::toggle_filter_messages_button(UI::Button & button, Widelands::Message::Type msgtype) {
> + set_filter_messages_tooltips();
> + if (button.get_perm_pressed()) {
> + button.set_perm_pressed(false);
> + m_message_filter = Widelands::Message::Type::allMessages;
> + } else {
> + m_geologistsbtn->set_perm_pressed(false);
> + m_economybtn->set_perm_pressed(false);
> + m_seafaringbtn->set_perm_pressed(false);
> + m_warfarebtn->set_perm_pressed(false);
> + m_scenariobtn->set_perm_pressed(false);
> + button.set_perm_pressed(true);
> + m_message_filter = msgtype;
> + /** TRANSLATORS: %1% is a tooltip, %2% is the corresponding hotkey */
> + button.set_tooltip((boost::format(_("%1% (Hotkey: %2%)"))
> + /** TRANSLATORS: Tooltip in the messages window */
> + % _("Show all messages")
> + % "A").str());
> + }
> +}
> +
> +/**
> + * Helper for filter_messages
> + */
> +void GameMessageMenu::set_filter_messages_tooltips() {
> + m_geologistsbtn->set_tooltip((boost::format(_("%1% (Hotkey: %2%)"))
> + /** TRANSLATORS: Tooltip in the messages window */
> + % _("Show geologists' messages only")
> + % "L").str());
> + m_economybtn->set_tooltip((boost::format(_("%1% (Hotkey: %2%)"))
> + /** TRANSLATORS: Tooltip in the messages window */
> + % _("Show economy messages only")
> + % "E").str());
> + m_seafaringbtn->set_tooltip((boost::format(_("%1% (Hotkey: %2%)"))
> + /** TRANSLATORS: Tooltip in the messages window */
> + % _("Show seafaring messages only")
> + % "F").str());
> + m_warfarebtn->set_tooltip((boost::format(_("%1% (Hotkey: %2%)"))
> + /** TRANSLATORS: Tooltip in the messages window */
> + % _("Show warfare messages only")
> + % "W").str());
> + m_scenariobtn->set_tooltip((boost::format(_("%1% (Hotkey: %2%)"))
> + /** TRANSLATORS: Tooltip in the messages window */
> + % _("Show scenario messages only")
> + % "R").str());
> +}
> +
> +/**
> + * Update image and tooltip for message category label
> + */
> +void GameMessageMenu::set_display_message_type_label(Widelands::Message::Type msgtype) {
> + std::string message_type_tooltip = "";
> + std::string message_type_image = "";
> +
> + switch (msgtype) {
> + case Widelands::Message::Type::geologists:
> + /** TRANSLATORS: This is a message's type */
> + message_type_tooltip = _("Geologists");
> + message_type_image = "<rt image=pics/menu_geologist.png></rt>";
> + break;
> + case Widelands::Message::Type::economy:
> + /** TRANSLATORS: This is a message's type */
> + message_type_tooltip = _("Economy");
> + message_type_image = "<rt image=pics/menu_build_flag.png></rt>";
> + break;
> + case Widelands::Message::Type::seafaring:
> + /** TRANSLATORS: This is a message's type */
> + message_type_tooltip = _("Seafaring");
> + message_type_image = "<rt image=pics/start_expedition.png></rt>";
> + break;
> + case Widelands::Message::Type::warfare:
> + /** TRANSLATORS: This is a message's type */
> + message_type_tooltip = _("Warfare");
> + message_type_image = "<rt image=pics/messages_warfare.png></rt>";
> + break;
> + case Widelands::Message::Type::scenario:
> + /** TRANSLATORS: This is a message's type */
> + message_type_tooltip = _("Scenario");
> + message_type_image = "<rt image=pics/menu_objectives.png></rt>";
> + break;
> + case Widelands::Message::Type::noMessages:
> + /** TRANSLATORS: This show up instead of a message's type when there are no messages found */
> + message_type_tooltip = _("No message found");
> + break;
> + default:
> + /** TRANSLATORS: This is the default message type */
> + message_type_tooltip = _("General");
> + message_type_image = "<rt image=pics/message_new.png></rt>";
> + }
> +
> + m_display_message_type_label->set_tooltip(
> + /** TRANSLATORS: %s is a message's type */
> + (boost::format(_("Type of this message: %s"))
> + /** TRANSLATORS: Tooltip in the messages window */
> + % message_type_tooltip).str());
> + m_display_message_type_label->set_text(message_type_image);
> +}
> +
> +
> +/**
> * Clear the current selection of messages.
> */
> void GameMessageMenu::do_clear_selection()
> @@ -359,15 +607,23 @@
> mode = Archive;
> set_title(_("Messages: Archive"));
> m_archivebtn->set_pic(g_gr->images().get("pics/message_restore.png"));
> - m_archivebtn->set_tooltip(_("Restore selected messages"));
> - m_togglemodebtn->set_title(_("Show Inbox"));
> + /** TRANSLATORS: %s is a tooltip, Del is the corresponding hotkey */
> + m_archivebtn->set_tooltip((boost::format(_("Del: %s"))
> + /** TRANSLATORS: Tooltip in the messages window */
> + % _("Restore selected messages")).str());
> + m_togglemodebtn->set_pic(g_gr->images().get("pics/message_new.png"));
> + m_togglemodebtn->set_tooltip(_("Show Inbox"));
> break;
> case Archive:
> mode = Inbox;
> set_title(_("Messages: Inbox"));
> m_archivebtn->set_pic(g_gr->images().get("pics/message_archive.png"));
> - m_archivebtn->set_tooltip(_("Archive selected messages"));
> - m_togglemodebtn->set_title(_("Show Archive"));
> + /** TRANSLATORS: %s is a tooltip, Del is the corresponding hotkey */
> + m_archivebtn->set_tooltip((boost::format(_("Del: %s"))
> + /** TRANSLATORS: Tooltip in the messages window */
> + % _("Archive selected messages")).str());
> + m_togglemodebtn->set_pic(g_gr->images().get("pics/message_archived.png"));
> + m_togglemodebtn->set_tooltip(_("Show Archive"));
> break;
> default:
> assert(false); // there is nothing but Archive and Inbox
>
> === modified file 'src/wui/game_message_menu.h'
> --- src/wui/game_message_menu.h 2014-09-10 14:48:40 +0000
> +++ src/wui/game_message_menu.h 2014-09-29 15:04:07 +0000
> @@ -22,6 +22,7 @@
>
> #include "base/deprecated.h"
> #include "base/i18n.h"
> +#include "logic/message.h"
> #include "logic/message_queue.h"
> #include "ui_basic/button.h"
> #include "ui_basic/multilinetextarea.h"
> @@ -49,6 +50,7 @@
>
> private:
> enum Cols {ColSelect, ColStatus, ColTitle, ColTimeSent};
> + enum class ReadUnread: uint8_t {allMessages, readMessages, newMessages};
>
> InteractivePlayer & iplayer() const;
> void selected(uint32_t);
> @@ -60,6 +62,10 @@
> void archive_or_restore();
> void toggle_mode();
> void center_view();
> + void filter_messages(Widelands::Message::Type);
> + void toggle_filter_messages_button(UI::Button &, Widelands::Message::Type);
> + void set_filter_messages_tooltips();
> + void set_display_message_type_label(Widelands::Message::Type);
> void update_record(UI::Table<uintptr_t>::EntryRecord & er, const Widelands::Message &);
>
> UI::Table<uintptr_t> * list;
> @@ -68,6 +74,14 @@
> UI::Button * m_togglemodebtn;
> UI::Button * m_centerviewbtn;
> Mode mode;
> + // Buttons for message types
> + UI::Button * m_geologistsbtn;
> + UI::Button * m_economybtn;
> + UI::Button * m_seafaringbtn;
> + UI::Button * m_warfarebtn;
> + UI::Button * m_scenariobtn;
> + Widelands::Message::Type m_message_filter;
> + UI::MultilineTextarea * m_display_message_type_label;
> };
>
> #endif // end of include guard: WL_WUI_GAME_MESSAGE_MENU_H
>
> === modified file 'test/maps/lua_persistence.wmf/scripting/test_persistence.lua'
> --- test/maps/lua_persistence.wmf/scripting/test_persistence.lua 2014-08-01 15:30:12 +0000
> +++ test/maps/lua_persistence.wmf/scripting/test_persistence.lua 2014-09-29 15:04:07 +0000
> @@ -49,7 +49,7 @@
> objective.done = true
>
> p:send_message("dummy msg1", "dummy msg 1")
> - msg = p:send_message("hello nice", "World", {sender="blah", field = field })
> + msg = p:send_message("hello nice", "World", {field = field })
> player_slot = map.player_slots[1]
>
> myset = Set:new{
> @@ -118,7 +118,6 @@
> assert_table(msg)
> assert_equal("hello nice", msg.title)
> assert_equal("World", msg.body)
> - assert_equal("blah", msg.sender)
> assert_equal(field, msg.field)
>
> assert_table(map)
>
> === modified file 'test/maps/lua_testsuite.wmf/scripting/messages.lua'
> --- test/maps/lua_testsuite.wmf/scripting/messages.lua 2014-09-09 08:24:10 +0000
> +++ test/maps/lua_testsuite.wmf/scripting/messages.lua 2014-09-29 15:04:07 +0000
> @@ -13,7 +13,6 @@
> local m = player1:send_message("Hallo", "World!")
> assert_equal("Hallo", m.title)
> assert_equal("World!", m.body)
> - assert_equal("ScriptingEngine", m.sender)
> assert_equal(0, m.sent)
> assert_equal(0, m.sent)
> assert_equal(nil, m.field)
> @@ -32,10 +31,6 @@
> player1:send_message("Hallo", "World!", {status="nono"})
> end)
> end
> -function messages_tests:test_sender()
> - local m = player1:send_message("Hallo", "World!", {sender="i am you"})
> - assert_equal("i am you", m.sender)
> -end
> function messages_tests:test_field()
> local f = map:get_field(23,28)
> local m = player1:send_message("Hallo", "World!", {field = f})
>
> === modified file 'txts/README.lua'
> --- txts/README.lua 2014-09-18 16:41:26 +0000
> +++ txts/README.lua 2014-09-29 15:04:07 +0000
> @@ -78,8 +78,14 @@
> ) .. p(_
> [[In the message window, the following additional shortcuts are available:]]
> ) .. p(
> -_ "G: jumps to the location corresponding to the current message" .. "<br>"
> -.. _"DELETE: archives the current message"
> +_ "A: shows all messages" .. "<br>"
> +.. _ "L: shows geologists' messages only" .. "<br>"
> +.. _ "E: shows economy messages only" .. "<br>"
> +.. _ "F: shows seafaring messages only" .. "<br>"
> +.. _ "W: shows warfare messages only" .. "<br>"
> +.. _ "R: shows scenario messages only" .. "<br>"
> +.. _ "G: jumps to the location corresponding to the current message" .. "<br>"
> +.. _"DELETE: archives/restores the current message"
> ) .. h2(_
> [[Online Help]]
> ) .. p( _
>
--
https://code.launchpad.net/~widelands-dev/widelands/bug-987510/+merge/236231
Your team Widelands Developers is requested to review the proposed merge of lp:~widelands-dev/widelands/bug-987510 into lp:widelands.
References