einstein/cpp-source/options.cpp

89 lines
2.9 KiB
C++

#include "options.h"
#include "storage.h"
#include "main.h"
#include "messages.h"
#include "sound.h"
class OptionsChangedCommand: public Command
{
private:
bool &fullscreen;
bool &niceCursor;
float &volume;
Area *area;
public:
OptionsChangedCommand(Area *a, bool &fs, bool &ns, float &v):
fullscreen(fs), niceCursor(ns), volume(v) {
area = a;
};
virtual void doAction() {
bool oldFullscreen = (getStorage()->get(L"fullscreen", 1) != 0);
bool oldCursor = (getStorage()->get(L"niceCursor", 1) != 0);
float oldVolume = (float)getStorage()->get(L"volume", 20) / 100.0f;
if (fullscreen != oldFullscreen) {
getStorage()->set(L"fullscreen", fullscreen);
screen.setMode(VideoMode(800, 600, 24, fullscreen));
}
#ifndef __APPLE__
if (niceCursor != oldCursor) {
getStorage()->set(L"niceCursor", niceCursor);
screen.setCursor(niceCursor);
}
#endif
if (volume != oldVolume) {
getStorage()->set(L"volume", (int)(volume * 100.0f));
sound->setVolume(volume);
}
getStorage()->flush();
area->finishEventLoop();
};
};
#define LABEL(y, s) \
area.add(new Label(&font, 300, y, 300, 20, Label::ALIGN_LEFT, \
Label::ALIGN_MIDDLE, 255,255,255, msg(s)));
#define CHECKBOX(y, var) \
area.add(new Checkbox(265, y, 20, 20, &font, 255,255,255, L"blue.bmp", \
var));
#define OPTION(y, s, var) LABEL(y, s) CHECKBOX(y, var)
void showOptionsWindow(Area *parentArea)
{
Font titleFont(L"nova.ttf", 26);
Font font(L"laudcn2.ttf", 14);
bool fullscreen = (getStorage()->get(L"fullscreen", 1) != 0);
bool niceCursor = (getStorage()->get(L"niceCursor", 1) != 0);
float volume = ((float)getStorage()->get(L"volume", 20)) / 100.0f;
Area area;
area.add(parentArea);
area.add(new Window(250, 170, 300, 260, L"blue.bmp"));
area.add(new Label(&titleFont, 250, 175, 300, 40, Label::ALIGN_CENTER,
Label::ALIGN_MIDDLE, 255,255,0, msg(L"options")));
OPTION(260, L"fullscreen", fullscreen);
#ifndef __APPLE__
OPTION(280, L"niceCursor", niceCursor);
#endif
area.add(new Label(&font, 265, 330, 300, 20, Label::ALIGN_LEFT,
Label::ALIGN_MIDDLE, 255,255,255, msg(L"volume")));
area.add(new Slider(360, 332, 160, 16, volume));
ExitCommand exitCmd(area);
OptionsChangedCommand okCmd(&area, fullscreen, niceCursor, volume);
area.add(new Button(315, 390, 85, 25, &font, 255,255,0, L"blue.bmp",
msg(L"ok"), &okCmd));
area.add(new Button(405, 390, 85, 25, &font, 255,255,0, L"blue.bmp",
msg(L"cancel"), &exitCmd));
area.add(new KeyAccel(SDLK_ESCAPE, &exitCmd));
area.add(new KeyAccel(SDLK_RETURN, &okCmd));
area.run();
}