123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139 |
- /*
- * CStatisticScreen.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 "../windows/CWindowObject.h"
- #include "../../lib/gameState/GameStatistics.h"
- class FilledTexturePlayerColored;
- class CToggleButton;
- class GraphicalPrimitiveCanvas;
- class LineChart;
- class CGStatusBar;
- class ComboBox;
- class CSlider;
- class IImage;
- class CPicture;
- class TransparentFilledRectangle;
- using TData = std::vector<std::pair<ColorRGBA, std::vector<float>>>;
- using TIcons = std::vector<std::tuple<ColorRGBA, int, std::shared_ptr<IImage>, std::string>>; // Color, Day, Image, Helptext
- class CStatisticScreen : public CWindowObject
- {
- enum Content {
- OVERVIEW,
- CHART_RESOURCES,
- CHART_INCOME,
- CHART_NUMBER_OF_HEROES,
- CHART_NUMBER_OF_TOWNS,
- CHART_NUMBER_OF_ARTIFACTS,
- CHART_NUMBER_OF_DWELLINGS,
- CHART_NUMBER_OF_MINES,
- CHART_ARMY_STRENGTH,
- CHART_EXPERIENCE,
- CHART_RESOURCES_SPENT_ARMY,
- CHART_RESOURCES_SPENT_BUILDINGS,
- CHART_MAP_EXPLORED,
- };
- std::map<Content, std::tuple<std::string, bool>> contentInfo = { // tuple: textid, resource selection needed
- { OVERVIEW, { "vcmi.statisticWindow.title.overview", false } },
- { CHART_RESOURCES, { "vcmi.statisticWindow.title.resources", true } },
- { CHART_INCOME, { "vcmi.statisticWindow.title.income", false } },
- { CHART_NUMBER_OF_HEROES, { "vcmi.statisticWindow.title.numberOfHeroes", false } },
- { CHART_NUMBER_OF_TOWNS, { "vcmi.statisticWindow.title.numberOfTowns", false } },
- { CHART_NUMBER_OF_ARTIFACTS, { "vcmi.statisticWindow.title.numberOfArtifacts", false } },
- { CHART_NUMBER_OF_DWELLINGS, { "vcmi.statisticWindow.title.numberOfDwellings", false } },
- { CHART_NUMBER_OF_MINES, { "vcmi.statisticWindow.title.numberOfMines", true } },
- { CHART_ARMY_STRENGTH, { "vcmi.statisticWindow.title.armyStrength", false } },
- { CHART_EXPERIENCE, { "vcmi.statisticWindow.title.experience", false } },
- { CHART_RESOURCES_SPENT_ARMY, { "vcmi.statisticWindow.title.resourcesSpentArmy", true } },
- { CHART_RESOURCES_SPENT_BUILDINGS, { "vcmi.statisticWindow.title.resourcesSpentBuildings", true } },
- { CHART_MAP_EXPLORED, { "vcmi.statisticWindow.title.mapExplored", false } },
- };
- std::shared_ptr<FilledTexturePlayerColored> filledBackground;
- std::vector<std::shared_ptr<CIntObject>> layout;
- std::shared_ptr<CToggleButton> buttonCsvSave;
- std::shared_ptr<CToggleButton> buttonSelect;
- StatisticDataSet statistic;
- std::shared_ptr<CIntObject> mainContent;
- Rect contentArea;
- using ExtractFunctor = std::function<float(StatisticDataSetEntry val)>;
- TData extractData(const StatisticDataSet & stat, const ExtractFunctor & selector) const;
- TIcons extractIcons() const;
- std::shared_ptr<CIntObject> getContent(Content c, EGameResID res);
- void onSelectButton();
- public:
- CStatisticScreen(const StatisticDataSet & stat);
- static std::string getDay(int day);
- };
- class StatisticSelector : public CWindowObject
- {
- std::shared_ptr<FilledTexturePlayerColored> filledBackground;
- std::vector<std::shared_ptr<CToggleButton>> buttons;
- std::shared_ptr<CSlider> slider;
- const int LINES = 10;
- std::vector<std::string> texts;
- std::function<void(int selectedIndex)> cb;
- void update(int to);
- public:
- StatisticSelector(const std::vector<std::string> & texts, const std::function<void(int selectedIndex)> & cb);
- };
- class OverviewPanel : public CIntObject
- {
- std::shared_ptr<GraphicalPrimitiveCanvas> canvas;
- std::vector<std::shared_ptr<CIntObject>> layout;
- std::vector<std::shared_ptr<CIntObject>> content;
- std::shared_ptr<CSlider> slider;
- Point fieldSize;
- StatisticDataSet data;
- std::vector<std::pair<std::string, std::function<std::string(PlayerColor color)>>> dataExtract;
- const int LINES = 15;
- const int Y_OFFS = 30;
- std::vector<StatisticDataSetEntry> playerDataFilter(PlayerColor color);
- void update(int to);
- public:
- OverviewPanel(Rect position, std::string title, const StatisticDataSet & stat);
- };
- class LineChart : public CIntObject
- {
- std::shared_ptr<GraphicalPrimitiveCanvas> canvas;
- std::vector<std::shared_ptr<CIntObject>> layout;
- std::shared_ptr<CGStatusBar> statusBar;
- std::vector<std::shared_ptr<CPicture>> pictures;
- std::shared_ptr<TransparentFilledRectangle> hoverMarker;
- Rect chartArea;
- float maxVal;
- int niceMaxVal;
- int maxDay;
- TData data;
- void updateStatusBar(const Point & cursorPosition);
- // calculate points in chart
- Point getPoint(int i, std::vector<float> data);
- public:
- LineChart(Rect position, std::string title, TData data, TIcons icons, float maxY);
- void mouseMoved(const Point & cursorPosition, const Point & lastUpdateDistance) override;
- void gesturePanning(const Point & initialPosition, const Point & currentPosition, const Point & lastUpdateDistance) override;
- };
|