Simple modal window helper.

This commit is contained in:
Ben Vanik
2015-07-19 14:42:54 -07:00
parent f24f535f31
commit b0ecdb343c
5 changed files with 163 additions and 2 deletions

View File

@@ -42,6 +42,7 @@
<ClInclude Include="src\el\elements\list_box.h" />
<ClInclude Include="src\el\elements\menu_window.h" />
<ClInclude Include="src\el\elements\message_window.h" />
<ClInclude Include="src\el\elements\modal_window.h" />
<ClInclude Include="src\el\elements\mover.h" />
<ClInclude Include="src\el\elements\parts\base_radio_check_box.h" />
<ClInclude Include="src\el\elements\parts\scroller.h" />
@@ -143,6 +144,7 @@
<ClCompile Include="src\el\elements\list_box.cc" />
<ClCompile Include="src\el\elements\menu_window.cc" />
<ClCompile Include="src\el\elements\message_window.cc" />
<ClCompile Include="src\el\elements\modal_window.cc" />
<ClCompile Include="src\el\elements\mover.cc" />
<ClCompile Include="src\el\elements\parts\base_radio_check_box.cc" />
<ClCompile Include="src\el\elements\parts\scroller.cc" />
@@ -391,4 +393,4 @@
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>
</Project>

View File

@@ -229,6 +229,9 @@
<ClInclude Include="src\el\elements\message_window.h">
<Filter>src\el\elements</Filter>
</ClInclude>
<ClInclude Include="src\el\elements\modal_window.h">
<Filter>src\el\elements</Filter>
</ClInclude>
<ClInclude Include="src\el\elements\mover.h">
<Filter>src\el\elements</Filter>
</ClInclude>
@@ -560,6 +563,9 @@
<ClCompile Include="src\el\elements\message_window.cc">
<Filter>src\el\elements</Filter>
</ClCompile>
<ClCompile Include="src\el\elements\modal_window.cc">
<Filter>src\el\elements</Filter>
</ClCompile>
<ClCompile Include="src\el\elements\mover.cc">
<Filter>src\el\elements</Filter>
</ClCompile>
@@ -702,4 +708,4 @@
<ItemGroup>
<ResourceCompile Include="resources.rc" />
</ItemGroup>
</Project>
</Project>

View File

@@ -26,6 +26,7 @@
#include "el/elements/list_box.h"
#include "el/elements/menu_window.h"
#include "el/elements/message_window.h"
#include "el/elements/modal_window.h"
#include "el/elements/mover.h"
#include "el/elements/popup_window.h"
#include "el/elements/progress_spinner.h"

View File

@@ -0,0 +1,95 @@
/**
******************************************************************************
* Elemental Forms : a lightweight user interface framework *
******************************************************************************
* <20>2015 Ben Vanik. All rights reserved. Released under the BSD license. *
* Portions <20>2011-2015 Emil Seger<65>s: https://github.com/fruxo/turbobadger *
******************************************************************************
*/
#include <cassert>
#include "el/animation_manager.h"
#include "el/element_animation.h"
#include "el/elements/dimmer.h"
#include "el/elements/modal_window.h"
namespace el {
namespace elements {
int ModalWindow::visible_count_ = 0;
ModalWindow::ModalWindow(std::function<void()> on_close_callback)
: on_close_callback_(on_close_callback) {
++visible_count_;
set_settings(el::WindowSettings::kTitleBar |
el::WindowSettings::kCloseButton |
el::WindowSettings::kCanActivate);
el::ElementListener::AddGlobalListener(this);
}
ModalWindow::~ModalWindow() {
--visible_count_;
el::ElementListener::RemoveGlobalListener(this);
if (auto dimmer = dimmer_.get()) {
dimmer->RemoveFromParent();
delete dimmer;
}
}
void ModalWindow::Show(el::Element* root_element) {
auto dimmer = new Dimmer();
root_element->AddChild(dimmer);
dimmer_.reset(dimmer);
BuildUI();
root_element->AddChild(this);
ResizeToFitContent();
CenterInParent();
}
bool ModalWindow::OnEvent(const el::Event& ev) {
if (ev.target->id() == TBIDC("exit_button") &&
ev.type == el::EventType::kClick) {
Die();
return true;
} else if (ev.type == el::EventType::kKeyDown &&
ev.special_key == el::SpecialKey::kEsc) {
Die();
return true;
}
return el::Window::OnEvent(ev);
}
void ModalWindow::OnDie() {
if (auto dimmer = dimmer_.get()) {
dimmer->Die();
}
Window::OnDie();
}
void ModalWindow::OnRemove() { on_close_callback_(); }
void ModalWindow::OnElementAdded(Element* parent, Element* element) {
if (element == this) {
// Move in.
auto anim = new RectElementAnimation(this, Rect(0, -50, 0, 0),
RectElementAnimation::Mode::kDeltaOut);
AnimationManager::StartAnimation(anim);
}
}
bool ModalWindow::OnElementDying(Element* element) {
if (element == this) {
// Move out.
auto anim = new RectElementAnimation(this, Rect(0, 50, 0, 0),
RectElementAnimation::Mode::kDeltaIn);
AnimationManager::StartAnimation(anim, AnimationCurve::kSpeedUp);
return true;
}
return false;
}
} // namespace elements
} // namespace el

View File

@@ -0,0 +1,57 @@
/**
******************************************************************************
* Elemental Forms : a lightweight user interface framework *
******************************************************************************
* <20>2015 Ben Vanik. All rights reserved. Released under the BSD license. *
* Portions <20>2011-2015 Emil Seger<65>s: https://github.com/fruxo/turbobadger *
******************************************************************************
*/
#ifndef EL_ELEMENTS_MODAL_WINDOW_H_
#define EL_ELEMENTS_MODAL_WINDOW_H_
#include <functional>
#include "el/element_listener.h"
#include "el/window.h"
namespace el {
namespace elements {
// A window for showing modal messages.
// Events invoked in this window will travel up through the target element.
// When the user click any of its buttons, it will invoke a click event
// (with the window ID), with the clicked buttons id as ref_id.
// Then it will delete itself.
// If the target element is deleted while this window is alive, the window will
// delete itself.
class ModalWindow : public Window, private ElementListener {
public:
TBOBJECT_SUBCLASS(ModalWindow, Window);
ModalWindow(std::function<void()> on_close_callback);
~ModalWindow() override;
void Show(el::Element* root_element);
static bool is_any_visible() { return visible_count_ > 0; }
protected:
static int visible_count_;
virtual void BuildUI() = 0;
bool OnEvent(const el::Event& ev) override;
void OnDie() override;
void OnRemove() override;
void OnElementAdded(Element* parent, Element* element);
bool OnElementDying(Element* element) override;
std::function<void()> on_close_callback_;
WeakElementPointer dimmer_;
};
} // namespace elements
} // namespace el
#endif // EL_ELEMENTS_MODAL_WINDOW_H_