add resizable window and original fullscreen options

This commit is contained in:
jacob1 2018-05-19 16:50:47 -04:00
parent 58127f355b
commit 743ec98e3f
9 changed files with 122 additions and 15 deletions

View File

@ -61,6 +61,8 @@ SDL_Renderer * sdl_renderer;
SDL_Texture * sdl_texture; SDL_Texture * sdl_texture;
int scale = 1; int scale = 1;
bool fullscreen = false; bool fullscreen = false;
bool altFullscreen = false;
bool resizable = false;
void ClipboardPush(ByteString text) void ClipboardPush(ByteString text)
@ -120,7 +122,7 @@ void blit(pixel * vid)
{ {
SDL_UpdateTexture(sdl_texture, NULL, vid, WINDOWW * sizeof (Uint32)); SDL_UpdateTexture(sdl_texture, NULL, vid, WINDOWW * sizeof (Uint32));
// need to clear the renderer if there are black edges (fullscreen, or resizable window) // need to clear the renderer if there are black edges (fullscreen, or resizable window)
if (fullscreen) if (fullscreen || resizable)
SDL_RenderClear(sdl_renderer); SDL_RenderClear(sdl_renderer);
SDL_RenderCopy(sdl_renderer, sdl_texture, NULL, NULL); SDL_RenderCopy(sdl_renderer, sdl_texture, NULL, NULL);
SDL_RenderPresent(sdl_renderer); SDL_RenderPresent(sdl_renderer);
@ -140,8 +142,13 @@ int SDLOpen()
desktopWidth = SDLDisplayMode.w; desktopWidth = SDLDisplayMode.w;
desktopHeight = SDLDisplayMode.h; desktopHeight = SDLDisplayMode.h;
unsigned int flags = 0;
if (fullscreen)
flags = altFullscreen ? SDL_WINDOW_FULLSCREEN : SDL_WINDOW_FULLSCREEN_DESKTOP;
if (resizable)
flags |= SDL_WINDOW_RESIZABLE;
sdl_window = SDL_CreateWindow("The Powder Toy", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, WINDOWW * scale, WINDOWH * scale, sdl_window = SDL_CreateWindow("The Powder Toy", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, WINDOWW * scale, WINDOWH * scale,
fullscreen ? SDL_WINDOW_FULLSCREEN_DESKTOP : 0); flags);
sdl_renderer = SDL_CreateRenderer(sdl_window, -1, 0); sdl_renderer = SDL_CreateRenderer(sdl_window, -1, 0);
SDL_RenderSetLogicalSize(sdl_renderer, WINDOWW, WINDOWH); SDL_RenderSetLogicalSize(sdl_renderer, WINDOWW, WINDOWH);
//Uncomment this to force fullscreen to an integer resolution //Uncomment this to force fullscreen to an integer resolution
@ -180,14 +187,20 @@ int SDLOpen()
return 0; return 0;
} }
void SDLSetScreen(int newScale, bool newFullscreen) void SDLSetScreen(int scale_, bool resizable_, bool fullscreen_, bool altFullscreen_)
{ {
scale = newScale; scale = scale_;
fullscreen = newFullscreen; fullscreen = fullscreen_;
SDL_SetWindowSize(sdl_window, WINDOWW * newScale, WINDOWH * newScale); altFullscreen = altFullscreen_;
SDL_SetWindowFullscreen(sdl_window, newFullscreen ? SDL_WINDOW_FULLSCREEN_DESKTOP : 0); resizable = resizable_;
if (newFullscreen) SDL_SetWindowSize(sdl_window, WINDOWW * scale, WINDOWH * scale);
unsigned int flags = 0;
if (fullscreen)
flags = altFullscreen ? SDL_WINDOW_FULLSCREEN : SDL_WINDOW_FULLSCREEN_DESKTOP;
SDL_SetWindowFullscreen(sdl_window, flags);
if (fullscreen)
SDL_RaiseWindow(sdl_window); SDL_RaiseWindow(sdl_window);
SDL_SetWindowResizable(sdl_window, resizable ? SDL_TRUE : SDL_FALSE);
} }
unsigned int GetTicks() unsigned int GetTicks()
@ -417,9 +430,10 @@ void EngineProcess()
engine->Tick(); engine->Tick();
engine->Draw(); engine->Draw();
if(scale != engine->Scale || fullscreen != engine->Fullscreen) if (scale != engine->Scale || fullscreen != engine->Fullscreen
|| altFullscreen != engine->GetAltFullscreen() || resizable != engine->GetResizable())
{ {
SDLSetScreen(engine->Scale, engine->Fullscreen); SDLSetScreen(engine->Scale, engine->GetResizable(), engine->Fullscreen, engine->GetAltFullscreen());
} }
#ifdef OGLI #ifdef OGLI
@ -534,7 +548,9 @@ int main(int argc, char * argv[])
#endif #endif
scale = Client::Ref().GetPrefInteger("Scale", 1); scale = Client::Ref().GetPrefInteger("Scale", 1);
resizable = Client::Ref().GetPrefBool("Resizable", false);
fullscreen = Client::Ref().GetPrefBool("Fullscreen", false); fullscreen = Client::Ref().GetPrefBool("Fullscreen", false);
altFullscreen = Client::Ref().GetPrefBool("AltFullscreen", false);
if(arguments["kiosk"] == "true") if(arguments["kiosk"] == "true")
@ -598,7 +614,9 @@ int main(int argc, char * argv[])
#endif #endif
ui::Engine::Ref().g = new Graphics(); ui::Engine::Ref().g = new Graphics();
ui::Engine::Ref().Scale = scale; ui::Engine::Ref().Scale = scale;
ui::Engine::Ref().SetResizable(resizable);
ui::Engine::Ref().Fullscreen = fullscreen; ui::Engine::Ref().Fullscreen = fullscreen;
ui::Engine::Ref().SetAltFullscreen(altFullscreen);
engine = &ui::Engine::Ref(); engine = &ui::Engine::Ref();
engine->SetMaxSize(desktopWidth, desktopHeight); engine->SetMaxSize(desktopWidth, desktopHeight);

View File

@ -18,6 +18,8 @@ Engine::Engine():
Scale(1), Scale(1),
Fullscreen(false), Fullscreen(false),
FrameIndex(0), FrameIndex(0),
altFullscreen(false),
resizable(false),
lastBuffer(NULL), lastBuffer(NULL),
prevBuffers(stack<pixel*>()), prevBuffers(stack<pixel*>()),
windows(stack<Window*>()), windows(stack<Window*>()),

View File

@ -46,8 +46,12 @@ namespace ui
void SetFullscreen(bool fullscreen) { Fullscreen = fullscreen; } void SetFullscreen(bool fullscreen) { Fullscreen = fullscreen; }
inline bool GetFullscreen() { return Fullscreen; } inline bool GetFullscreen() { return Fullscreen; }
void SetAltFullscreen(bool altFullscreen) { this->altFullscreen = altFullscreen; }
inline bool GetAltFullscreen() { return altFullscreen; }
void SetScale(int scale) { Scale = scale; } void SetScale(int scale) { Scale = scale; }
inline int GetScale() { return Scale; } inline int GetScale() { return Scale; }
void SetResizable(bool resizable) { this->resizable = resizable; }
inline bool GetResizable() { return resizable; }
void SetFastQuit(bool fastquit) { FastQuit = fastquit; } void SetFastQuit(bool fastquit) { FastQuit = fastquit; }
inline bool GetFastQuit() {return FastQuit; } inline bool GetFastQuit() {return FastQuit; }
@ -80,6 +84,9 @@ namespace ui
unsigned int FrameIndex; unsigned int FrameIndex;
private: private:
bool altFullscreen;
bool resizable;
float dt; float dt;
float fps; float fps;
pixel * lastBuffer; pixel * lastBuffer;

View File

@ -55,6 +55,11 @@ void OptionsController::SetFullscreen(bool fullscreen)
model->SetFullscreen(fullscreen); model->SetFullscreen(fullscreen);
} }
void OptionsController::SetAltFullscreen(bool altFullscreen)
{
model->SetAltFullscreen(altFullscreen);
}
void OptionsController::SetShowAvatars(bool showAvatars) void OptionsController::SetShowAvatars(bool showAvatars)
{ {
model->SetShowAvatars(showAvatars); model->SetShowAvatars(showAvatars);
@ -65,6 +70,11 @@ void OptionsController::SetScale(int scale)
model->SetScale(scale); model->SetScale(scale);
} }
void OptionsController::SetResizable(bool resizable)
{
model->SetResizable(resizable);
}
void OptionsController::SetFastQuit(bool fastquit) void OptionsController::SetFastQuit(bool fastquit)
{ {
model->SetFastQuit(fastquit); model->SetFastQuit(fastquit);

View File

@ -25,7 +25,9 @@ public:
void SetAirMode(int airMode); void SetAirMode(int airMode);
void SetEdgeMode(int edgeMode); void SetEdgeMode(int edgeMode);
void SetFullscreen(bool fullscreen); void SetFullscreen(bool fullscreen);
void SetAltFullscreen(bool altFullscreen);
void SetScale(int scale); void SetScale(int scale);
void SetResizable(bool resizable);
void SetFastQuit(bool fastquit); void SetFastQuit(bool fastquit);
void SetShowAvatars(bool showAvatars); void SetShowAvatars(bool showAvatars);
void Exit(); void Exit();

View File

@ -102,6 +102,18 @@ void OptionsModel::SetScale(int scale)
notifySettingsChanged(); notifySettingsChanged();
} }
bool OptionsModel::GetResizable()
{
return ui::Engine::Ref().GetResizable();
}
void OptionsModel::SetResizable(bool resizable)
{
ui::Engine::Ref().SetResizable(resizable);
Client::Ref().SetPref("Resizable", resizable);
notifySettingsChanged();
}
bool OptionsModel::GetFullscreen() bool OptionsModel::GetFullscreen()
{ {
return ui::Engine::Ref().GetFullscreen(); return ui::Engine::Ref().GetFullscreen();
@ -109,7 +121,19 @@ bool OptionsModel::GetFullscreen()
void OptionsModel::SetFullscreen(bool fullscreen) void OptionsModel::SetFullscreen(bool fullscreen)
{ {
ui::Engine::Ref().SetFullscreen(fullscreen); ui::Engine::Ref().SetFullscreen(fullscreen);
Client::Ref().SetPref("Fullscreen", bool(fullscreen)); Client::Ref().SetPref("Fullscreen", fullscreen);
notifySettingsChanged();
}
bool OptionsModel::GetAltFullscreen()
{
return ui::Engine::Ref().GetAltFullscreen();
}
void OptionsModel::SetAltFullscreen(bool altFullscreen)
{
ui::Engine::Ref().SetAltFullscreen(altFullscreen);
Client::Ref().SetPref("AltFullscreen", altFullscreen);
notifySettingsChanged(); notifySettingsChanged();
} }

View File

@ -33,8 +33,12 @@ public:
void SetGravityMode(int gravityMode); void SetGravityMode(int gravityMode);
int GetScale(); int GetScale();
void SetScale(int scale); void SetScale(int scale);
bool GetResizable();
void SetResizable(bool resizable);
bool GetFullscreen(); bool GetFullscreen();
void SetFullscreen(bool fullscreen); void SetFullscreen(bool fullscreen);
bool GetAltFullscreen();
void SetAltFullscreen(bool oldFullscreen);
bool GetFastQuit(); bool GetFastQuit();
void SetFastQuit(bool fastquit); void SetFastQuit(bool fastquit);
virtual ~OptionsModel(); virtual ~OptionsModel();

View File

@ -17,7 +17,7 @@
#include "gui/dialogues/ErrorMessage.h" #include "gui/dialogues/ErrorMessage.h"
OptionsView::OptionsView(): OptionsView::OptionsView():
ui::Window(ui::Point(-1, -1), ui::Point(300, 329)){ ui::Window(ui::Point(-1, -1), ui::Point(300, 369)){
ui::Label * tempLabel = new ui::Label(ui::Point(4, 5), ui::Point(Size.X-8, 14), "Simulation Options"); ui::Label * tempLabel = new ui::Label(ui::Point(4, 5), ui::Point(Size.X-8, 14), "Simulation Options");
tempLabel->SetTextColour(style::Colour::InformationTitle); tempLabel->SetTextColour(style::Colour::InformationTitle);
@ -173,6 +173,24 @@ OptionsView::OptionsView():
AddComponent(tempLabel); AddComponent(tempLabel);
class ResizableAction: public ui::CheckboxAction
{
OptionsView * v;
public:
ResizableAction(OptionsView * v_){ v = v_; }
virtual void ActionCallback(ui::Checkbox * sender)
{
v->c->SetResizable(sender->GetChecked());
}
};
resizable = new ui::Checkbox(ui::Point(8, scale->Position.Y + 20), ui::Point(Size.X-6, 16), "Resizable", "");
resizable->SetActionCallback(new ResizableAction(this));
tempLabel = new ui::Label(ui::Point(resizable->Position.X+Graphics::textwidth(resizable->GetText().c_str())+20, resizable->Position.Y), ui::Point(Size.X-28, 16), "\bg- Allow resizing and maximizing window");
tempLabel->Appearance.HorizontalAlign = ui::Appearance::AlignLeft; tempLabel->Appearance.VerticalAlign = ui::Appearance::AlignMiddle;
AddComponent(tempLabel);
AddComponent(resizable);
class FullscreenAction: public ui::CheckboxAction class FullscreenAction: public ui::CheckboxAction
{ {
OptionsView * v; OptionsView * v;
@ -184,13 +202,31 @@ OptionsView::OptionsView():
} }
}; };
fullscreen = new ui::Checkbox(ui::Point(8, 230), ui::Point(Size.X-6, 16), "Fullscreen", ""); fullscreen = new ui::Checkbox(ui::Point(8, resizable->Position.Y + 20), ui::Point(Size.X-6, 16), "Fullscreen", "");
fullscreen->SetActionCallback(new FullscreenAction(this)); fullscreen->SetActionCallback(new FullscreenAction(this));
tempLabel = new ui::Label(ui::Point(fullscreen->Position.X+Graphics::textwidth(fullscreen->GetText().c_str())+20, fullscreen->Position.Y), ui::Point(Size.X-28, 16), "\bg- Fill the entire screen"); tempLabel = new ui::Label(ui::Point(fullscreen->Position.X+Graphics::textwidth(fullscreen->GetText().c_str())+20, fullscreen->Position.Y), ui::Point(Size.X-28, 16), "\bg- Fill the entire screen");
tempLabel->Appearance.HorizontalAlign = ui::Appearance::AlignLeft; tempLabel->Appearance.VerticalAlign = ui::Appearance::AlignMiddle; tempLabel->Appearance.HorizontalAlign = ui::Appearance::AlignLeft; tempLabel->Appearance.VerticalAlign = ui::Appearance::AlignMiddle;
AddComponent(tempLabel); AddComponent(tempLabel);
AddComponent(fullscreen); AddComponent(fullscreen);
class AltFullscreenAction: public ui::CheckboxAction
{
OptionsView * v;
public:
AltFullscreenAction(OptionsView * v_){ v = v_; }
virtual void ActionCallback(ui::Checkbox * sender)
{
v->c->SetAltFullscreen(sender->GetChecked());
}
};
altFullscreen = new ui::Checkbox(ui::Point(23, fullscreen->Position.Y + 20), ui::Point(Size.X-6, 16), "Change Resolution", "");
altFullscreen->SetActionCallback(new AltFullscreenAction(this));
tempLabel = new ui::Label(ui::Point(altFullscreen->Position.X+Graphics::textwidth(altFullscreen->GetText().c_str())+20, altFullscreen->Position.Y), ui::Point(Size.X-28, 16), "\bg- Set optimial screen resolution");
tempLabel->Appearance.HorizontalAlign = ui::Appearance::AlignLeft; tempLabel->Appearance.VerticalAlign = ui::Appearance::AlignMiddle;
AddComponent(tempLabel);
AddComponent(altFullscreen);
class FastQuitAction: public ui::CheckboxAction class FastQuitAction: public ui::CheckboxAction
{ {
@ -200,7 +236,7 @@ OptionsView::OptionsView():
virtual void ActionCallback(ui::Checkbox * sender){ v->c->SetFastQuit(sender->GetChecked()); } virtual void ActionCallback(ui::Checkbox * sender){ v->c->SetFastQuit(sender->GetChecked()); }
}; };
fastquit = new ui::Checkbox(ui::Point(8, 250), ui::Point(Size.X-6, 16), "Fast Quit", ""); fastquit = new ui::Checkbox(ui::Point(8, altFullscreen->Position.Y + 20), ui::Point(Size.X-6, 16), "Fast Quit", "");
fastquit->SetActionCallback(new FastQuitAction(this)); fastquit->SetActionCallback(new FastQuitAction(this));
tempLabel = new ui::Label(ui::Point(fastquit->Position.X+Graphics::textwidth(fastquit->GetText().c_str())+20, fastquit->Position.Y), ui::Point(Size.X-28, 16), "\bg- Always exit completely when hitting close"); tempLabel = new ui::Label(ui::Point(fastquit->Position.X+Graphics::textwidth(fastquit->GetText().c_str())+20, fastquit->Position.Y), ui::Point(Size.X-28, 16), "\bg- Always exit completely when hitting close");
tempLabel->Appearance.HorizontalAlign = ui::Appearance::AlignLeft; tempLabel->Appearance.VerticalAlign = ui::Appearance::AlignMiddle; tempLabel->Appearance.HorizontalAlign = ui::Appearance::AlignLeft; tempLabel->Appearance.VerticalAlign = ui::Appearance::AlignMiddle;
@ -215,7 +251,7 @@ OptionsView::OptionsView():
virtual void ActionCallback(ui::Checkbox * sender){ v->c->SetShowAvatars(sender->GetChecked()); } virtual void ActionCallback(ui::Checkbox * sender){ v->c->SetShowAvatars(sender->GetChecked()); }
}; };
showAvatars = new ui::Checkbox(ui::Point(8, 270), ui::Point(Size.X-6, 16), "Show Avatars", ""); showAvatars = new ui::Checkbox(ui::Point(8, fastquit->Position.Y + 20), ui::Point(Size.X-6, 16), "Show Avatars", "");
showAvatars->SetActionCallback(new ShowAvatarsAction(this)); showAvatars->SetActionCallback(new ShowAvatarsAction(this));
tempLabel = new ui::Label(ui::Point(showAvatars->Position.X+Graphics::textwidth(showAvatars->GetText().c_str())+20, showAvatars->Position.Y), ui::Point(Size.X-28, 16), "\bg- Disable if you have a slow connection"); tempLabel = new ui::Label(ui::Point(showAvatars->Position.X+Graphics::textwidth(showAvatars->GetText().c_str())+20, showAvatars->Position.Y), ui::Point(Size.X-28, 16), "\bg- Disable if you have a slow connection");
tempLabel->Appearance.HorizontalAlign = ui::Appearance::AlignLeft; tempLabel->Appearance.VerticalAlign = ui::Appearance::AlignMiddle; tempLabel->Appearance.HorizontalAlign = ui::Appearance::AlignLeft; tempLabel->Appearance.VerticalAlign = ui::Appearance::AlignMiddle;
@ -279,7 +315,9 @@ void OptionsView::NotifySettingsChanged(OptionsModel * sender)
gravityMode->SetOption(sender->GetGravityMode()); gravityMode->SetOption(sender->GetGravityMode());
edgeMode->SetOption(sender->GetEdgeMode()); edgeMode->SetOption(sender->GetEdgeMode());
scale->SetOption(sender->GetScale()); scale->SetOption(sender->GetScale());
resizable->SetChecked(sender->GetResizable());
fullscreen->SetChecked(sender->GetFullscreen()); fullscreen->SetChecked(sender->GetFullscreen());
altFullscreen->SetChecked(sender->GetAltFullscreen());
fastquit->SetChecked(sender->GetFastQuit()); fastquit->SetChecked(sender->GetFastQuit());
showAvatars->SetChecked(sender->GetShowAvatars()); showAvatars->SetChecked(sender->GetShowAvatars());
} }

View File

@ -20,7 +20,9 @@ class OptionsView: public ui::Window {
ui::DropDown * gravityMode; ui::DropDown * gravityMode;
ui::DropDown * edgeMode; ui::DropDown * edgeMode;
ui::DropDown * scale; ui::DropDown * scale;
ui::Checkbox * resizable;
ui::Checkbox * fullscreen; ui::Checkbox * fullscreen;
ui::Checkbox * altFullscreen;
ui::Checkbox * fastquit; ui::Checkbox * fastquit;
ui::Checkbox * showAvatars; ui::Checkbox * showAvatars;
public: public: