source/code/menudef_themes.cpp
browsing at commit = 2a78ad0d898a80fb270533e7d7158ab22f6474c5
/*
===========================================================================
blockattack - Block Attack - Rise of the Blocks
Copyright (C) 2005-2013 Poul Sander
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see http://www.gnu.org/licenses/
Source information and contacts persons can be found at
http://blockattack.net
===========================================================================
*/
#include "global.hpp"
#include "menudef_themes.hpp"
#include "MenuSystem.h"
#include "BlockGameSdl.hpp"
#include <fmt/core.h>
static void switchTheme() {
globalData.theme = ThemesGetNext();
Config::getInstance()->setString("theme", globalData.theme.theme_name);
}
static void testMusic() {
static bool highbeatNext = false;
int musicVolume = Config::getInstance()->getInt("volume_music");
std::string music_name = "bgmusic";
if (highbeatNext) {
music_name = "highbeat";
}
Mix_PlayMusic(globalData.spriteHolder->GetDataHolder().getMusicHandler(music_name.c_str()).get(), 1);
Mix_VolumeMusic(musicVolume);
highbeatNext = !highbeatNext; //Toggle between standard and highbeat
}
class ThemesMenu : public Menu {
public:
std::shared_ptr<BlockGameSdl> game;
sago::SagoTextField themeTitle;
ThemesMenu(SDL_Renderer* screen, const std::string& title, bool submenu) : Menu(screen, title, submenu) {
game = std::make_shared<BlockGameSdl>(globalData.xsize-450,100,&globalData.spriteHolder->GetDataHolder());
game->name = "Player 1";
game->putSampleBlocks();
sagoTextSetBlueFont(themeTitle);
}
void placeButtons() override {
int nextY = 100;
int X = 10;
for (Button* it : buttons) {
it->x = X;
it->y = nextY;
nextY += it->standardButton.ysize+10;
}
exit.x = X;
exit.y = nextY;
}
void Draw(SDL_Renderer* target) override {
Menu::Draw(target);
game->DoPaintJob();
themeTitle.SetText(fmt::format(_("Theme: {}"), globalData.theme.theme_name));
themeTitle.Draw(target, 10, globalData.ysize-50,sago::SagoTextField::Alignment::left, sago::SagoTextField::VerticalAlignment::top, &globalData.logicalResize);
}
};
static Theme themeBackup;
static Theme themeToEdit;
static void themesEditSwitchBackground() {
themeToEdit.background = ThemesGetNextBackground(themeToEdit.background.name);
globalData.theme = themeToEdit;
}
static void themesEditSwitchBoardBackground() {
themeToEdit.back_board = ThemesGetNextBoardBackground(themeToEdit.back_board);
globalData.theme = themeToEdit;
}
static void themesEditSwitchBorder() {
themeToEdit.border = ThemesGetNextBorder(themeToEdit.border.name);
globalData.theme = themeToEdit;
}
static void themesEditSlot(int slot) {
ThemesMenu tem(globalData.screen, fmt::format(_("Edit custom theme {}"), slot), true);
size_t theme_index = ThemesGetNumber(fmt::format("custom_slot_{}", slot));
if (theme_index == 0) {
// Theme not found
return;
}
Button bSwitchBackground;
bSwitchBackground.setLabel(_("Switch background"));
bSwitchBackground.setAction(&themesEditSwitchBackground);
tem.addButton(&bSwitchBackground);
Button bSwitchBoardBackground;
bSwitchBoardBackground.setLabel(_("Switch board background"));
bSwitchBoardBackground.setAction(&themesEditSwitchBoardBackground);
tem.addButton(&bSwitchBoardBackground);
Button bSwitchBorder;
bSwitchBorder.setLabel(_("Switch border"));
bSwitchBorder.setAction(&themesEditSwitchBorder);
tem.addButton(&bSwitchBorder);
themeBackup = globalData.theme;
themeToEdit = ThemesGet(theme_index);
globalData.theme = themeToEdit;
RunGameState(tem);
ThemesAddOrReplace(themeToEdit);
globalData.theme = themeBackup;
ThemesSaveCustomSlots();
}
static void themesEditSlot1() {
themesEditSlot(1);
}
static void themesEditSlot2() {
themesEditSlot(2);
}
void OpenThemesMenu() {
ThemesMenu tm(globalData.screen, _("Themes"), true);
Button bSwitchTheme;
bSwitchTheme.setLabel(_("Switch theme"));
bSwitchTheme.setAction(&switchTheme);
tm.addButton(&bSwitchTheme);
Button bEditTheme1;
bEditTheme1.setLabel(fmt::format(_("Edit custom theme {}"), 1));
bEditTheme1.setAction(&themesEditSlot1);
tm.addButton(&bEditTheme1);
Button bEditTheme2;
bEditTheme2.setLabel(fmt::format(_("Edit custom theme {}"), 2));
bEditTheme2.setAction(&themesEditSlot2);
tm.addButton(&bEditTheme2);
if (!globalData.NoSound) {
Button bTestMusic;
bTestMusic.setLabel(_("Test music"));
bTestMusic.setAction(&testMusic);
tm.addButton(&bTestMusic);
}
RunGameState(tm);
}