1
0
mirror of https://github.com/vcmi/vcmi.git synced 2024-12-24 22:14:36 +02:00

Merge pull request #2653 from Nordsoft91/turn-timer

This commit is contained in:
Nordsoft91 2023-08-25 00:09:00 +04:00 committed by GitHub
commit 07210973f4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 168 additions and 43 deletions

View File

@ -17,6 +17,8 @@
#include "../gui/CGuiHandler.h"
#include "../gui/ShortcutHandler.h"
#include "../gui/Shortcut.h"
#include "../render/Graphics.h"
#include "../render/IFont.h"
#include "../widgets/CComponent.h"
#include "../widgets/Buttons.h"
#include "../widgets/MiscWidgets.h"
@ -43,6 +45,7 @@ InterfaceObjectConfigurable::InterfaceObjectConfigurable(int used, Point offset)
REGISTER_BUILDER("texture", &InterfaceObjectConfigurable::buildTexture);
REGISTER_BUILDER("animation", &InterfaceObjectConfigurable::buildAnimation);
REGISTER_BUILDER("label", &InterfaceObjectConfigurable::buildLabel);
REGISTER_BUILDER("multiLineLabel", &InterfaceObjectConfigurable::buildMultiLineLabel);
REGISTER_BUILDER("toggleGroup", &InterfaceObjectConfigurable::buildToggleGroup);
REGISTER_BUILDER("toggleButton", &InterfaceObjectConfigurable::buildToggleButton);
REGISTER_BUILDER("button", &InterfaceObjectConfigurable::buildButton);
@ -301,6 +304,20 @@ std::shared_ptr<CLabel> InterfaceObjectConfigurable::buildLabel(const JsonNode &
return std::make_shared<CLabel>(position.x, position.y, font, alignment, color, text);
}
std::shared_ptr<CMultiLineLabel> InterfaceObjectConfigurable::buildMultiLineLabel(const JsonNode & config) const
{
logGlobal->debug("Building widget CMultiLineLabel");
auto font = readFont(config["font"]);
auto alignment = readTextAlignment(config["alignment"]);
auto color = readColor(config["color"]);
auto text = readText(config["text"]);
Rect rect = readRect(config["rect"]);
if(!config["adoptHeight"].isNull() && config["adoptHeight"].Bool())
rect.h = graphics->fonts[font]->getLineHeight() * 2;
return std::make_shared<CMultiLineLabel>(rect, font, alignment, color, text);
}
std::shared_ptr<CToggleGroup> InterfaceObjectConfigurable::buildToggleGroup(const JsonNode & config) const
{
logGlobal->debug("Building widget CToggleGroup");
@ -466,11 +483,14 @@ std::shared_ptr<CSlider> InterfaceObjectConfigurable::buildSlider(const JsonNode
const auto & result =
std::make_shared<CSlider>(position, length, callbacks.at(config["callback"].String()), itemsVisible, itemsTotal, value, horizontal ? Orientation::HORIZONTAL : Orientation::VERTICAL, style);
if (!config["scrollBounds"].isNull())
if(!config["scrollBounds"].isNull())
{
Rect bounds = readRect(config["scrollBounds"]);
result->setScrollBounds(bounds);
}
if(!config["panningStep"].isNull())
result->setPanningStep(config["panningStep"].Integer());
return result;
}

View File

@ -18,6 +18,7 @@
class CPicture;
class CLabel;
class CMultiLineLabel;
class CToggleGroup;
class CToggleButton;
class CButton;
@ -88,6 +89,7 @@ protected:
//basic widgets
std::shared_ptr<CPicture> buildPicture(const JsonNode &) const;
std::shared_ptr<CLabel> buildLabel(const JsonNode &) const;
std::shared_ptr<CMultiLineLabel> buildMultiLineLabel(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;

View File

@ -31,6 +31,7 @@
#include "../windows/InfoWindows.h"
#include "../eventsSDL/InputHandler.h"
#include "../../lib/filesystem/Filesystem.h"
#include "../../lib/NetPacksLobby.h"
#include "../../lib/CGeneralTextHandler.h"
#include "../../lib/CArtHandler.h"
@ -42,23 +43,20 @@
OptionsTab::OptionsTab() : humanPlayers(0)
{
recActions = 0;
OBJ_CONSTRUCTION;
background = std::make_shared<CPicture>("ADVOPTBK", 0, 6);
pos = background->pos;
labelTitle = std::make_shared<CLabel>(222, 30, FONT_BIG, ETextAlignment::CENTER, Colors::YELLOW, CGI->generaltexth->allTexts[515]);
labelSubTitle = std::make_shared<CMultiLineLabel>(Rect(60, 44, 320, (int)graphics->fonts[EFonts::FONT_SMALL]->getLineHeight()*2), EFonts::FONT_SMALL, ETextAlignment::CENTER, Colors::WHITE, CGI->generaltexth->allTexts[516]);
labelPlayerNameAndHandicap = std::make_shared<CMultiLineLabel>(Rect(58, 86, 100, (int)graphics->fonts[EFonts::FONT_SMALL]->getLineHeight()*2), EFonts::FONT_SMALL, ETextAlignment::CENTER, Colors::YELLOW, CGI->generaltexth->allTexts[517]);
labelStartingTown = std::make_shared<CMultiLineLabel>(Rect(163, 86, 70, (int)graphics->fonts[EFonts::FONT_SMALL]->getLineHeight()*2), EFonts::FONT_SMALL, ETextAlignment::CENTER, Colors::YELLOW, CGI->generaltexth->allTexts[518]);
labelStartingHero = std::make_shared<CMultiLineLabel>(Rect(239, 86, 70, (int)graphics->fonts[EFonts::FONT_SMALL]->getLineHeight()*2), EFonts::FONT_SMALL, ETextAlignment::CENTER, Colors::YELLOW, CGI->generaltexth->allTexts[519]);
labelStartingBonus = std::make_shared<CMultiLineLabel>(Rect(315, 86, 70, (int)graphics->fonts[EFonts::FONT_SMALL]->getLineHeight()*2), EFonts::FONT_SMALL, ETextAlignment::CENTER, Colors::YELLOW, CGI->generaltexth->allTexts[520]);
addCallback("setTurnLength", std::bind(&IServerAPI::setTurnLength, CSH, _1));
const JsonNode config(ResourceID("config/widgets/optionsTab.json"));
build(config);
if(SEL->screenType == ESelectionScreen::newGame || SEL->screenType == ESelectionScreen::loadGame || SEL->screenType == ESelectionScreen::scenarioInfo)
{
sliderTurnDuration = std::make_shared<CSlider>(Point(55, 551), 194, std::bind(&IServerAPI::setTurnLength, CSH, _1), 1, (int)GameConstants::POSSIBLE_TURNTIME.size(), (int)GameConstants::POSSIBLE_TURNTIME.size(), Orientation::HORIZONTAL, CSlider::BLUE);
sliderTurnDuration->setScrollBounds(Rect(-3, -25, 337, 43));
sliderTurnDuration->setPanningStep(20);
labelPlayerTurnDuration = std::make_shared<CLabel>(222, 538, FONT_SMALL, ETextAlignment::CENTER, Colors::YELLOW, CGI->generaltexth->allTexts[521]);
labelTurnDurationValue = std::make_shared<CLabel>(319, 559, FONT_SMALL, ETextAlignment::CENTER, Colors::WHITE);
if(auto w = widget<CSlider>("sliderTurnDuration"))
w->deactivate();
if(auto w = widget<CLabel>("labelPlayerTurnDuration"))
w->deactivate();
if(auto w = widget<CLabel>("labelTurnDurationValue"))
w->deactivate();
}
}
@ -76,10 +74,11 @@ void OptionsTab::recreate()
entries.insert(std::make_pair(pInfo.first, std::make_shared<PlayerOptionsEntry>(pInfo.second, * this)));
}
if(sliderTurnDuration)
if(auto turnSlider = widget<CSlider>("sliderTurnDuration"))
{
sliderTurnDuration->scrollTo(vstd::find_pos(GameConstants::POSSIBLE_TURNTIME, SEL->getStartInfo()->turnTimerInfo.turnTimer / (60 * 1000)));
labelTurnDurationValue->setText(CGI->generaltexth->turnDurations[sliderTurnDuration->getValue()]);
turnSlider->scrollTo(vstd::find_pos(GameConstants::POSSIBLE_TURNTIME, SEL->getStartInfo()->turnTimerInfo.turnTimer / (60 * 1000)));
if(auto w = widget<CLabel>("labelTurnDurationValue"))
w->setText(CGI->generaltexth->turnDurations[turnSlider->getValue()]);
}
}
@ -851,7 +850,7 @@ OptionsTab::PlayerOptionsEntry::PlayerOptionsEntry(const PlayerSettings & S, con
}
pos.x += 54;
pos.y += 122 + serial * 50;
pos.y += 128 + serial * 50;
assert(CSH->mi && CSH->mi->mapHeader);
const PlayerInfo & p = SEL->getPlayerInfo(s->color.getNum());

View File

@ -10,15 +10,14 @@
#pragma once
#include "../windows/CWindowObject.h"
#include "../widgets/Scrollable.h"
#include "../gui/InterfaceObjectConfigurable.h"
VCMI_LIB_NAMESPACE_BEGIN
struct PlayerSettings;
struct PlayerInfo;
VCMI_LIB_NAMESPACE_END
#include "../widgets/Scrollable.h"
class CSlider;
class CLabel;
class CMultiLineLabel;
class CFilledTexture;
@ -30,21 +29,19 @@ class CButton;
class FilledTexturePlayerColored;
/// The options tab which is shown at the map selection phase.
class OptionsTab : public CIntObject
class OptionsTab : public InterfaceObjectConfigurable
{
std::shared_ptr<CPicture> background;
std::shared_ptr<CLabel> labelTitle;
std::shared_ptr<CMultiLineLabel> labelSubTitle;
std::shared_ptr<CMultiLineLabel> labelPlayerNameAndHandicap;
std::shared_ptr<CMultiLineLabel> labelStartingTown;
std::shared_ptr<CMultiLineLabel> labelStartingHero;
std::shared_ptr<CMultiLineLabel> labelStartingBonus;
std::shared_ptr<CLabel> labelPlayerTurnDuration;
std::shared_ptr<CLabel> labelTurnDurationValue;
struct PlayerOptionsEntry;
ui8 humanPlayers;
std::map<PlayerColor, std::shared_ptr<PlayerOptionsEntry>> entries;
public:
OptionsTab();
void recreate();
void onSetPlayerClicked(const PlayerSettings & ps) const;
enum SelType
{
TOWN,
@ -52,6 +49,8 @@ public:
BONUS
};
private:
struct CPlayerSettingsHelper
{
const PlayerSettings & settings;
@ -187,11 +186,4 @@ public:
private:
const OptionsTab & parentTab;
};
std::shared_ptr<CSlider> sliderTurnDuration;
std::map<PlayerColor, std::shared_ptr<PlayerOptionsEntry>> entries;
OptionsTab();
void recreate();
void onSetPlayerClicked(const PlayerSettings & ps) const;
};

View File

@ -41,7 +41,6 @@ RandomMapTab::RandomMapTab():
recActions = 0;
mapGenOptions = std::make_shared<CMapGenOptions>();
const JsonNode config(ResourceID("config/widgets/randomMapTab.json"));
addCallback("toggleMapSize", [&](int btnId)
{
auto mapSizeVal = getPossibleMapSizes();
@ -123,6 +122,7 @@ RandomMapTab::RandomMapTab():
});
}
const JsonNode config(ResourceID("config/widgets/randomMapTab.json"));
build(config);
updateMapInfoByHost();

View File

@ -0,0 +1,112 @@
{
"items":
[
{
"name": "background",
"type": "picture",
"image": "ADVOPTBK",
"position": {"x": 0, "y": 6}
},
{
"name": "labelTitle",
"type": "label",
"font": "big",
"alignment": "center",
"color": "yellow",
"text": "core.genrltxt.515",
"position": {"x": 222, "y": 36}
},
{
"name": "labelSubTitle",
"type": "multiLineLabel",
"font": "small",
"alignment": "center",
"color": "white",
"text": "core.genrltxt.516",
"rect": {"x": 60, "y": 50, "w": 320, "h": 0},
"adoptHeight": true
},
{
"name": "labelPlayerNameAndHandicap",
"type": "multiLineLabel",
"font": "small",
"alignment": "center",
"color": "yellow",
"text": "core.genrltxt.517",
"rect": {"x": 58, "y": 92, "w": 100, "h": 0},
"adoptHeight": true
},
{
"name": "labelStartingTown",
"type": "multiLineLabel",
"font": "small",
"alignment": "center",
"color": "yellow",
"text": "core.genrltxt.518",
"rect": {"x": 163, "y": 92, "w": 70, "h": 0},
"adoptHeight": true
},
{
"name": "labelStartingHero",
"type": "multiLineLabel",
"font": "small",
"alignment": "center",
"color": "yellow",
"text": "core.genrltxt.519",
"rect": {"x": 239, "y": 92, "w": 70, "h": 0},
"adoptHeight": true
},
{
"name": "labelStartingBonus",
"type": "multiLineLabel",
"font": "small",
"alignment": "center",
"color": "yellow",
"text": "core.genrltxt.520",
"rect": {"x": 315, "y": 92, "w": 70, "h": 0},
"adoptHeight": true
},
// timer
{
"name": "labelPlayerTurnDuration",
"type": "label",
"font": "small",
"alignment": "center",
"color": "yellow",
"text": "core.genrltxt.521",
"position": {"x": 222, "y": 544}
},
{
"name": "labelTurnDurationValue",
"type": "label",
"font": "small",
"alignment": "center",
"color": "white",
"text": "",
"position": {"x": 319, "y": 565}
},
{
"name": "sliderTurnDuration",
"type": "slider",
"orientation": "horizontal",
"position": {"x": 55, "y": 557},
"size": 194,
"callback": "setTurnLength",
"itemsVisible": 1,
"itemsTotal": 11,
"selected": 11,
"style": "blue",
"scrollBounds": {"x": -3, "y": -25, "w": 337, "h": 43},
"panningStep": 20
},
]
}