From a12785cd5d19534ea481e1ed0b89e01331a1836a Mon Sep 17 00:00:00 2001 From: LBPHacker Date: Thu, 23 Nov 2017 16:35:44 +0100 Subject: [PATCH] Use a dropdown instead of a textbox Textboxes don't mix well with error messages fired from from keypress handlers. --- src/gui/interface/Textbox.cpp | 5 +++-- src/gui/options/OptionsController.cpp | 18 +----------------- src/gui/options/OptionsController.h | 2 +- src/gui/options/OptionsModel.cpp | 11 +++++++++++ src/gui/options/OptionsModel.h | 2 ++ src/gui/options/OptionsView.cpp | 25 ++++++++++++++++++++----- src/gui/options/OptionsView.h | 2 +- 7 files changed, 39 insertions(+), 26 deletions(-) diff --git a/src/gui/interface/Textbox.cpp b/src/gui/interface/Textbox.cpp index 6e586b8c1c..cd5bb514de 100644 --- a/src/gui/interface/Textbox.cpp +++ b/src/gui/interface/Textbox.cpp @@ -144,7 +144,7 @@ void Textbox::cutSelection() std::string toCopy = backingText.substr(getLowerSelectionBound(), getHigherSelectionBound()-getLowerSelectionBound()); ClipboardPush(format::CleanString(toCopy, false, true, false)); backingText.erase(backingText.begin()+getLowerSelectionBound(), backingText.begin()+getHigherSelectionBound()); - cursor = getLowerSelectionBound(); + cursor = getLowerSelectionBound(); } else { @@ -278,7 +278,8 @@ void Textbox::Tick(float dt) keyDown = 0; characterDown = 0; } - if ((keyDown || characterDown) && repeatTime <= Platform::GetTime()) + unsigned long time_pls = Platform::GetTime(); + if ((keyDown || characterDown) && repeatTime <= time_pls) { OnVKeyPress(keyDown, characterDown, false, false, false); repeatTime = Platform::GetTime()+30; diff --git a/src/gui/options/OptionsController.cpp b/src/gui/options/OptionsController.cpp index 740cab5496..36f59cf552 100644 --- a/src/gui/options/OptionsController.cpp +++ b/src/gui/options/OptionsController.cpp @@ -9,7 +9,6 @@ OptionsController::OptionsController(GameModel * gModel_, ControllerCallback * c HasExited(false) { this->depth3d = ui::Engine::Ref().Get3dDepth(); - this->newScale = ui::Engine::Ref().GetScale(); view = new OptionsView(); model = new OptionsModel(gModel); model->AddObserver(view); @@ -64,7 +63,7 @@ void OptionsController::SetShowAvatars(bool showAvatars) void OptionsController::SetScale(int scale) { - newScale = scale; + model->SetScale(scale); } void OptionsController::SetFastQuit(bool fastquit) @@ -88,21 +87,6 @@ void OptionsController::Exit() // only update on close, it would be hard to edit if the changes were live ui::Engine::Ref().Set3dDepth(depth3d); - { - if (newScale < 1) - newScale = 1; - bool reduced_scale = false; - while (!(ui::Engine::Ref().GetMaxWidth() >= ui::Engine::Ref().GetWidth() * newScale && ui::Engine::Ref().GetMaxHeight() >= ui::Engine::Ref().GetHeight() * newScale) && newScale > 1) - { - newScale -= 1; - reduced_scale = true; - } - if (reduced_scale) - new ErrorMessage("Screen resolution error", "Your screen size is too small to use this scale mode. Using largest available scale."); - ui::Engine::Ref().SetScale(newScale); - Client::Ref().SetPref("Scale", newScale); - } - if (callback) callback->ControllerExit(); HasExited = true; diff --git a/src/gui/options/OptionsController.h b/src/gui/options/OptionsController.h index 3a9ee6e59f..fd6836bdf8 100644 --- a/src/gui/options/OptionsController.h +++ b/src/gui/options/OptionsController.h @@ -14,7 +14,7 @@ class OptionsController { OptionsView * view; OptionsModel * model; ControllerCallback * callback; - int depth3d, newScale; + int depth3d; public: bool HasExited; OptionsController(GameModel * gModel_, ControllerCallback * callback_); diff --git a/src/gui/options/OptionsModel.cpp b/src/gui/options/OptionsModel.cpp index 4f699c7cef..1a22acc679 100644 --- a/src/gui/options/OptionsModel.cpp +++ b/src/gui/options/OptionsModel.cpp @@ -90,6 +90,17 @@ void OptionsModel::SetGravityMode(int gravityMode) notifySettingsChanged(); } +int OptionsModel::GetScale() +{ + return ui::Engine::Ref().GetScale(); +} + +void OptionsModel::SetScale(int scale) +{ + ui::Engine::Ref().SetScale(scale); + Client::Ref().SetPref("Scale", int(scale)); + notifySettingsChanged(); +} bool OptionsModel::GetFullscreen() { diff --git a/src/gui/options/OptionsModel.h b/src/gui/options/OptionsModel.h index f9adcedeca..ba1fa84874 100644 --- a/src/gui/options/OptionsModel.h +++ b/src/gui/options/OptionsModel.h @@ -31,6 +31,8 @@ class OptionsModel { void SetEdgeMode(int edgeMode); int GetGravityMode(); void SetGravityMode(int gravityMode); + int GetScale(); + void SetScale(int scale); bool GetFullscreen(); void SetFullscreen(bool fullscreen); bool GetFastQuit(); diff --git a/src/gui/options/OptionsView.cpp b/src/gui/options/OptionsView.cpp index 36528ad247..477f9d2ac1 100644 --- a/src/gui/options/OptionsView.cpp +++ b/src/gui/options/OptionsView.cpp @@ -142,15 +142,29 @@ OptionsView::OptionsView(): tempLabel->Appearance.HorizontalAlign = ui::Appearance::AlignLeft; tempLabel->Appearance.VerticalAlign = ui::Appearance::AlignMiddle; AddComponent(tempLabel); - class ScaleAction: public ui::TextboxAction + class ScaleAction: public ui::DropDownAction { OptionsView * v; public: - ScaleAction(OptionsView * v_) { v = v_; } - virtual void TextChangedCallback(ui::Textbox * sender) { v->c->SetScale(format::StringToNumber(sender->GetText())); } + ScaleAction(OptionsView * v): v(v) { } + virtual void OptionChanged(ui::DropDown * sender, std::pair option) { v->c->SetScale(option.second); } }; - scale = new ui::Textbox(ui::Point(8, 210), ui::Point(25, 16), format::NumberToString(ui::Engine::Ref().GetScale())); - scale->SetInputType(ui::Textbox::Numeric); + scale = new ui::DropDown(ui::Point(8, 210), ui::Point(40, 16)); + { + int current_scale = ui::Engine::Ref().GetScale(); + int ix_scale = 1; + bool current_scale_valid = false; + do + { + if (current_scale == ix_scale) + current_scale_valid = true; + scale->AddOption(std::pair(format::NumberToString(ix_scale), ix_scale)); + ix_scale += 1; + } + while (ui::Engine::Ref().GetMaxWidth() >= ui::Engine::Ref().GetWidth() * ix_scale && ui::Engine::Ref().GetMaxHeight() >= ui::Engine::Ref().GetHeight() * ix_scale); + if (!current_scale_valid) + scale->AddOption(std::pair("current", current_scale)); + } scale->SetActionCallback(new ScaleAction(this)); AddComponent(scale); @@ -286,6 +300,7 @@ void OptionsView::NotifySettingsChanged(OptionsModel * sender) airMode->SetOption(sender->GetAirMode()); gravityMode->SetOption(sender->GetGravityMode()); edgeMode->SetOption(sender->GetEdgeMode()); + scale->SetOption(sender->GetScale()); fullscreen->SetChecked(sender->GetFullscreen()); fastquit->SetChecked(sender->GetFastQuit()); showAvatars->SetChecked(sender->GetShowAvatars()); diff --git a/src/gui/options/OptionsView.h b/src/gui/options/OptionsView.h index 43ff0765e5..99f40e4cf7 100644 --- a/src/gui/options/OptionsView.h +++ b/src/gui/options/OptionsView.h @@ -19,7 +19,7 @@ class OptionsView: public ui::Window { ui::DropDown * airMode; ui::DropDown * gravityMode; ui::DropDown * edgeMode; - ui::Textbox * scale; + ui::DropDown * scale; ui::Checkbox * fullscreen; ui::Checkbox * fastquit; ui::Checkbox * showAvatars;