mirror of
https://github.com/xenia-project/elemental-forms.git
synced 2026-01-31 01:25:17 +01:00
Simple modal window helper.
This commit is contained in:
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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"
|
||||
|
||||
95
src/el/elements/modal_window.cc
Normal file
95
src/el/elements/modal_window.cc
Normal 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
|
||||
57
src/el/elements/modal_window.h
Normal file
57
src/el/elements/modal_window.h
Normal 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_
|
||||
Reference in New Issue
Block a user