/* * VisualLogger.h, part of VCMI engine * * Authors: listed in file AUTHORS in main folder * * License: GNU General Public License v2.0 or later * Full text of license available in license.txt file, in main folder * */ #pragma once #include "../int3.h" #include "../constants/EntityIdentifiers.h" #include "../battle/BattleHex.h" #include "../Color.h" VCMI_LIB_NAMESPACE_BEGIN class IMapOverlayLogVisualizer { public: virtual void drawLine(int3 start, int3 end) = 0; virtual void drawText(int3 tile, int lineNumber, const std::string & text, const std::optional & color) = 0; }; class IBattleOverlayLogVisualizer { public: virtual void drawText(BattleHex tile, int lineNumber, const std::string & text) = 0; }; class DLL_LINKAGE IVisualLogBuilder { public: virtual void addLine(int3 start, int3 end) = 0; virtual void addText(int3 tile, const std::string & text, const std::optional & color = {}) = 0; virtual void addText(BattleHex tile, const std::string & text) = 0; void addText(int3 tile, const std::string & text, PlayerColor background); }; /// The logger is used to show screen overlay class DLL_LINKAGE VisualLogger { private: template struct Line { T start; T end; Line(T start, T end) :start(start), end(end) { } }; template struct Text { T tile; std::string text; std::optional background; Text(T tile, std::string text, std::optional background) :tile(tile), text(text), background(background) { } }; class VisualLogBuilder : public IVisualLogBuilder { private: std::vector> & mapLines; std::vector> & battleTexts; std::vector> & mapTexts; public: VisualLogBuilder( std::vector> & mapLines, std::vector> & mapTexts, std::vector> & battleTexts) :mapLines(mapLines), mapTexts(mapTexts), battleTexts(battleTexts) { } void addLine(int3 start, int3 end) override { mapLines.emplace_back(start, end); } void addText(BattleHex tile, const std::string & text) override { battleTexts.emplace_back(tile, text, std::optional()); } void addText(int3 tile, const std::string & text, const std::optional & background) override { mapTexts.emplace_back(tile, text, background); } }; private: std::map>> mapLines; std::map>> mapTexts; std::map>> battleTexts; std::mutex mutex; std::string keyToShow; public: void updateWithLock(const std::string & channel, const std::function & func); void visualize(IMapOverlayLogVisualizer & visulizer); void visualize(IBattleOverlayLogVisualizer & visulizer); void setKey(const std::string & key); }; extern DLL_LINKAGE VisualLogger * logVisual; VCMI_LIB_NAMESPACE_END