From c2fbca6ffe4199aa0faa2fdb614e8d92e576a006 Mon Sep 17 00:00:00 2001 From: turanszkij Date: Sat, 28 May 2016 00:15:36 +0200 Subject: [PATCH] updated gui --- WickedEngine/wiGUI.cpp | 14 ++++ WickedEngine/wiGUI.h | 1 + WickedEngine/wiVersion.cpp | 2 +- WickedEngine/wiWidget.cpp | 127 ++++++++++++++++++++++++++++++++++++- WickedEngine/wiWidget.h | 41 +++++++++--- 5 files changed, 175 insertions(+), 10 deletions(-) diff --git a/WickedEngine/wiGUI.cpp b/WickedEngine/wiGUI.cpp index 5574ce460..991b001eb 100644 --- a/WickedEngine/wiGUI.cpp +++ b/WickedEngine/wiGUI.cpp @@ -15,6 +15,15 @@ wiGUI::~wiGUI() void wiGUI::Update() { + if (activeWidget != nullptr) + { + if (!activeWidget->IsEnabled() || !activeWidget->IsVisible()) + { + // deactivate active widget if it became invisible or disabled + DeactivateWidget(activeWidget); + } + } + for (auto&x : widgets) { x->Update(this); @@ -34,6 +43,11 @@ void wiGUI::AddWidget(wiWidget* widget) widgets.push_back(widget); } +void wiGUI::RemoveWidget(wiWidget* widget) +{ + widgets.remove(widget); +} + wiWidget* wiGUI::GetWidget(const wiHashString& name) { for (auto& x : widgets) diff --git a/WickedEngine/wiGUI.h b/WickedEngine/wiGUI.h index d1b7dbd83..156e364a2 100644 --- a/WickedEngine/wiGUI.h +++ b/WickedEngine/wiGUI.h @@ -21,6 +21,7 @@ public: void Render(); void AddWidget(wiWidget* widget); + void RemoveWidget(wiWidget* widget); wiWidget* GetWidget(const wiHashString& name); void ActivateWidget(wiWidget* widget); diff --git a/WickedEngine/wiVersion.cpp b/WickedEngine/wiVersion.cpp index 7d5b6439d..c9a897cf4 100644 --- a/WickedEngine/wiVersion.cpp +++ b/WickedEngine/wiVersion.cpp @@ -7,7 +7,7 @@ namespace wiVersion // minor features, major bug fixes const int minor = 7; // minor bug fixes, alterations, refactors - const int revision = 16; + const int revision = 17; long GetVersion() diff --git a/WickedEngine/wiWidget.cpp b/WickedEngine/wiWidget.cpp index 482a0122f..cf9d248a0 100644 --- a/WickedEngine/wiWidget.cpp +++ b/WickedEngine/wiWidget.cpp @@ -23,7 +23,13 @@ wiWidget::~wiWidget() void wiWidget::Update(wiGUI* gui) { assert(gui != nullptr && "Ivalid GUI!"); - Transform::UpdateTransform(); + + // Only do the updatetransform if it has no parent because if it has, its transform + // will be updated down the chain anyway + if (Transform::parent == nullptr) + { + Transform::UpdateTransform(); + } } wiHashString wiWidget::GetName() { @@ -55,16 +61,34 @@ void wiWidget::SetPos(const XMFLOAT2& value) { Transform::translation_rest.x = value.x; Transform::translation_rest.y = value.y; + Transform::UpdateTransform(); } void wiWidget::SetSize(const XMFLOAT2& value) { Transform::scale_rest.x = value.x; Transform::scale_rest.y = value.y; + Transform::UpdateTransform(); } wiWidget::WIDGETSTATE wiWidget::GetState() { return state; } +void wiWidget::SetEnabled(bool val) +{ + enabled = val; +} +bool wiWidget::IsEnabled() +{ + return enabled && visible; +} +void wiWidget::SetVisible(bool val) +{ + visible = val; +} +bool wiWidget::IsVisible() +{ + return visible; +} void wiWidget::Activate() { state = ACTIVE; @@ -506,3 +530,104 @@ bool wiCheckBox::GetCheck() return checked; } + + + + + +wiWindow::wiWindow(wiGUI* gui, const string& name) :wiWidget() + , gui(gui) +{ + assert(gui != nullptr && "Ivalid GUI!"); + + SetName(name); + SetText(fastName.GetString()); + SetSize(XMFLOAT2(640, 480)); + + SAFE_INIT(closeButton); +} +wiWindow::~wiWindow() +{ + SAFE_DELETE(closeButton); +} +void wiWindow::AddWidget(wiWidget* widget) +{ + assert(gui != nullptr && "Ivalid GUI!"); + + gui->AddWidget(widget); + widget->attachTo(this); + + children.push_back(widget); +} +void wiWindow::RemoveWidget(wiWidget* widget) +{ + assert(gui != nullptr && "Ivalid GUI!"); + + gui->RemoveWidget(widget); + widget->detach(); + + children.remove(widget); +} +void wiWindow::AddCloseButton() +{ + closeButton = new wiButton(name + "_close_button"); + closeButton->SetText("x"); + closeButton->SetSize(XMFLOAT2(20, 20)); + closeButton->SetPos(XMFLOAT2(translation.x + scale.x - 20, translation.y)); + closeButton->OnClick([this](wiEventArgs args) { + this->SetVisible(false); + }); + gui->AddWidget(closeButton); + closeButton->attachTo(this); +} +void wiWindow::Update(wiGUI* gui) +{ + wiWidget::Update(gui); + + if (!IsEnabled()) + { + return; + } + + if (gui->IsWidgetDisabled(this)) + { + return; + } +} +void wiWindow::Render(wiGUI* gui) +{ + assert(gui != nullptr && "Ivalid GUI!"); + + if (!IsVisible()) + { + return; + } + + wiColor color = GetColor(); + if (!IsEnabled()) + { + color = wiColor::lerp(wiColor::Transparent, color, 0.25f); + } + + // body + wiImage::Draw(wiTextureHelper::getInstance()->getColor(color) + , wiImageEffects(translation.x, translation.y, scale.x, scale.y), gui->GetGraphicsThread()); + + // head + wiImage::Draw(wiTextureHelper::getInstance()->getColor(color) + , wiImageEffects(translation.x, translation.y, scale.x, 20), gui->GetGraphicsThread()); + + wiFont(text, wiFontProps(translation.x, translation.y, 0, WIFALIGN_LEFT, WIFALIGN_TOP)).Draw(gui->GetGraphicsThread()); +} +void wiWindow::SetVisible(bool value) +{ + wiWidget::SetVisible(value); + if (closeButton != nullptr) + { + closeButton->SetVisible(value); + } + for (auto& x : children) + { + x->SetVisible(value); + } +} diff --git a/WickedEngine/wiWidget.h b/WickedEngine/wiWidget.h index 5db584a3c..43f4c5a56 100644 --- a/WickedEngine/wiWidget.h +++ b/WickedEngine/wiWidget.h @@ -49,10 +49,10 @@ public: void SetPos(const XMFLOAT2& value); void SetSize(const XMFLOAT2& value); WIDGETSTATE GetState(); - void SetEnabled(bool val) { enabled = val; } - bool IsEnabled() { return enabled; } - void SetVisible(bool val) { visible = val; } - bool IsVisible() { return visible; } + void SetEnabled(bool val); + bool IsEnabled(); + virtual void SetVisible(bool val); + bool IsVisible(); void SetColor(const wiColor& color, WIDGETSTATE state); wiColor GetColor(); @@ -60,6 +60,7 @@ public: virtual void Render(wiGUI* gui) = 0; }; +// Clickable box class wiButton : public wiWidget { protected: @@ -75,6 +76,7 @@ public: void OnClick(function func); }; +// Static box that holds text class wiLabel : public wiWidget { protected: @@ -86,6 +88,7 @@ public: virtual void Render(wiGUI* gui) override; }; +// Define an interval and slide the control along it class wiSlider : public wiWidget { protected: @@ -95,10 +98,10 @@ protected: float step; float value; public: - // start : slider minimum value - // end : slider maximum value - // defaultValue : slider default Value - // step : slider step size + // start : slider minimum value + // end : slider maximum value + // defaultValue : slider default Value + // step : slider step size wiSlider(float start = 0.0f, float end = 1.0f, float defaultValue = 0.5f, float step = 1000.0f, const string& name = ""); virtual ~wiSlider(); @@ -111,6 +114,7 @@ public: void OnSlide(function func); }; +// Two-state clickable box class wiCheckBox :public wiWidget { protected: @@ -130,3 +134,24 @@ public: void OnClick(function func); }; +// Widget container +class wiWindow :public wiWidget +{ +protected: + wiGUI* gui; + wiButton* closeButton; + list children; +public: + wiWindow(wiGUI* gui, const string& name = ""); + virtual ~wiWindow(); + + void AddWidget(wiWidget* widget); + void RemoveWidget(wiWidget* widget); + void AddCloseButton(); + + virtual void Update(wiGUI* gui) override; + virtual void Render(wiGUI* gui) override; + + virtual void SetVisible(bool value) override; +}; +