2022-12-12 09:48:39 +02:00
|
|
|
/*
|
|
|
|
* InterfaceBuilder.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 "CIntObject.h"
|
2023-01-18 15:50:52 +02:00
|
|
|
#include "TextAlignment.h"
|
2022-12-12 09:48:39 +02:00
|
|
|
|
|
|
|
#include "../../lib/JsonNode.h"
|
|
|
|
|
2022-12-15 22:46:36 +02:00
|
|
|
class CPicture;
|
|
|
|
class CLabel;
|
|
|
|
class CToggleGroup;
|
|
|
|
class CToggleButton;
|
|
|
|
class CButton;
|
|
|
|
class CLabelGroup;
|
2022-12-16 00:15:53 +02:00
|
|
|
class CSlider;
|
2022-12-17 06:19:16 +02:00
|
|
|
class CAnimImage;
|
|
|
|
class CShowableAnim;
|
|
|
|
class CFilledTexture;
|
2022-12-15 22:46:36 +02:00
|
|
|
|
2022-12-22 00:05:29 +02:00
|
|
|
#define REGISTER_BUILDER(type, method) registerBuilder(type, std::bind(method, this, std::placeholders::_1))
|
|
|
|
|
2022-12-12 09:48:39 +02:00
|
|
|
class InterfaceObjectConfigurable: public CIntObject
|
|
|
|
{
|
|
|
|
public:
|
2022-12-16 00:15:53 +02:00
|
|
|
InterfaceObjectConfigurable(int used=0, Point offset=Point());
|
|
|
|
InterfaceObjectConfigurable(const JsonNode & config, int used=0, Point offset=Point());
|
2022-12-12 09:48:39 +02:00
|
|
|
|
|
|
|
protected:
|
2022-12-22 00:05:29 +02:00
|
|
|
|
|
|
|
using BuilderFunction = std::function<std::shared_ptr<CIntObject>(const JsonNode &)>;
|
|
|
|
void registerBuilder(const std::string &, BuilderFunction);
|
|
|
|
|
2022-12-12 09:48:39 +02:00
|
|
|
//must be called after adding callbacks
|
2022-12-25 12:22:07 +02:00
|
|
|
void build(const JsonNode & config);
|
2022-12-12 09:48:39 +02:00
|
|
|
|
|
|
|
void addCallback(const std::string & callbackName, std::function<void(int)> callback);
|
2022-12-17 18:38:16 +02:00
|
|
|
JsonNode variables;
|
2022-12-12 09:48:39 +02:00
|
|
|
|
|
|
|
template<class T>
|
|
|
|
const std::shared_ptr<T> widget(const std::string & name) const
|
|
|
|
{
|
|
|
|
auto iter = widgets.find(name);
|
|
|
|
if(iter == widgets.end())
|
|
|
|
return nullptr;
|
|
|
|
return std::dynamic_pointer_cast<T>(iter->second);
|
|
|
|
}
|
2022-12-25 12:33:10 +02:00
|
|
|
|
|
|
|
void deleteWidget(const std::string & name);
|
2022-12-17 18:38:16 +02:00
|
|
|
|
2022-12-15 22:46:36 +02:00
|
|
|
//basic serializers
|
|
|
|
Point readPosition(const JsonNode &) const;
|
2022-12-17 06:19:16 +02:00
|
|
|
Rect readRect(const JsonNode &) const;
|
2022-12-15 22:46:36 +02:00
|
|
|
ETextAlignment readTextAlignment(const JsonNode &) const;
|
|
|
|
SDL_Color readColor(const JsonNode &) const;
|
|
|
|
EFonts readFont(const JsonNode &) const;
|
|
|
|
std::string readText(const JsonNode &) const;
|
|
|
|
std::pair<std::string, std::string> readHintText(const JsonNode &) const;
|
2022-12-25 12:22:07 +02:00
|
|
|
int readKeycode(const JsonNode &) const;
|
2022-12-15 22:46:36 +02:00
|
|
|
|
|
|
|
//basic widgets
|
|
|
|
std::shared_ptr<CPicture> buildPicture(const JsonNode &) const;
|
|
|
|
std::shared_ptr<CLabel> buildLabel(const JsonNode &) const;
|
|
|
|
std::shared_ptr<CToggleGroup> buildToggleGroup(const JsonNode &) const;
|
|
|
|
std::shared_ptr<CToggleButton> buildToggleButton(const JsonNode &) const;
|
|
|
|
std::shared_ptr<CButton> buildButton(const JsonNode &) const;
|
|
|
|
std::shared_ptr<CLabelGroup> buildLabelGroup(const JsonNode &) const;
|
2022-12-16 00:15:53 +02:00
|
|
|
std::shared_ptr<CSlider> buildSlider(const JsonNode &) const;
|
2022-12-17 06:19:16 +02:00
|
|
|
std::shared_ptr<CAnimImage> buildImage(const JsonNode &) const;
|
|
|
|
std::shared_ptr<CShowableAnim> buildAnimation(const JsonNode &) const;
|
|
|
|
std::shared_ptr<CFilledTexture> buildTexture(const JsonNode &) const;
|
2022-12-22 00:05:29 +02:00
|
|
|
|
2022-12-16 00:15:53 +02:00
|
|
|
//composite widgets
|
2022-12-17 18:38:16 +02:00
|
|
|
std::shared_ptr<CIntObject> buildWidget(JsonNode config) const;
|
2022-12-15 22:46:36 +02:00
|
|
|
|
2022-12-12 09:48:39 +02:00
|
|
|
private:
|
|
|
|
|
2022-12-25 12:22:07 +02:00
|
|
|
int unnamedObjectId = 0;
|
2022-12-22 00:05:29 +02:00
|
|
|
std::map<std::string, BuilderFunction> builders;
|
2022-12-12 09:48:39 +02:00
|
|
|
std::map<std::string, std::shared_ptr<CIntObject>> widgets;
|
|
|
|
std::map<std::string, std::function<void(int)>> callbacks;
|
|
|
|
};
|