From 0d14620052da6c50de50bf9e8899a0ae6bacd453 Mon Sep 17 00:00:00 2001 From: Jinhao Date: Sun, 5 Jul 2015 16:21:13 +0800 Subject: [PATCH] fix caret/keyboard issue(#62) pressing space on a button will trigger click event --- include/nana/gui/basis.hpp | 1 + include/nana/gui/detail/drawer.hpp | 59 +++++++++++++++------------- source/gui/detail/drawer.cpp | 43 ++++++++++---------- source/gui/detail/window_manager.cpp | 2 +- source/gui/widgets/button.cpp | 2 +- 5 files changed, 56 insertions(+), 51 deletions(-) diff --git a/include/nana/gui/basis.hpp b/include/nana/gui/basis.hpp index c0ef0aa5..789ab5c3 100644 --- a/include/nana/gui/basis.hpp +++ b/include/nana/gui/basis.hpp @@ -84,6 +84,7 @@ namespace nana end_of_medium = 0x19, //Ctrl+Y substitute = 0x1A, //Ctrl+Z escape = 0x1B, + space = 0x20, //Space //The following names are intuitive name of ASCII control codes select_all = start_of_headline, diff --git a/include/nana/gui/detail/drawer.hpp b/include/nana/gui/detail/drawer.hpp index 121c84b8..fa62974b 100644 --- a/include/nana/gui/detail/drawer.hpp +++ b/include/nana/gui/detail/drawer.hpp @@ -23,12 +23,18 @@ namespace nana { class widget; + namespace detail + { + class drawer; + } + class drawer_trigger : ::nana::noncopyable, ::nana::nonmovable { + friend class detail::drawer; public: - typedef widget& widget_reference; - typedef paint::graphics& graph_reference; + using widget_reference = widget&; + using graph_reference = paint::graphics&; virtual ~drawer_trigger(); virtual void attached(widget_reference, graph_reference); //none-const @@ -56,10 +62,11 @@ namespace nana virtual void key_release(graph_reference, const arg_keyboard&); virtual void shortkey(graph_reference, const arg_keyboard&); - void _m_reset_overrided(); - bool _m_overrided() const; private: - bool overrided_{false}; + void _m_reset_overrided(); + bool _m_overrided(event_code) const; + private: + unsigned overrided_{ 0xFFFFFFFF }; }; namespace detail @@ -83,7 +90,7 @@ namespace nana enum class method_state { - unknown, + pending, overrided, not_overrided }; @@ -128,31 +135,27 @@ namespace nana template void _m_emit(event_code evt_code, const Arg& arg, Mfptr mfptr) { - if (realizer_) + const int pos = static_cast(evt_code); + if (realizer_ && (method_state::not_overrided != mth_state_[pos])) { - const int pos = static_cast(evt_code); - if (method_state::not_overrided != mth_state_[pos]) + _m_bground_pre(); + + if (method_state::pending == mth_state_[pos]) { - _m_bground_pre(); + (realizer_->*mfptr)(graphics, arg); + + //Check realizer, when the window is closed in that event handler, the drawer will be + //detached and realizer will be a nullptr + if(realizer_) + mth_state_[pos] = (realizer_->_m_overrided(evt_code) ? method_state::overrided : method_state::not_overrided); + } + else + (realizer_->*mfptr)(graphics, arg); - if (method_state::unknown == mth_state_[pos]) - { - realizer_->_m_reset_overrided(); - (realizer_->*mfptr)(graphics, arg); - - //Check realizer, when the window is closed in that event handler, the drawer will be - //detached and realizer will be a nullptr - if(realizer_) - mth_state_[pos] = (realizer_->_m_overrided() ? method_state::overrided : method_state::not_overrided); - } - else - (realizer_->*mfptr)(graphics, arg); - - if (_m_lazy_decleared()) - { - _m_draw_dynamic_drawing_object(); - _m_bground_end(); - } + if (_m_lazy_decleared()) + { + _m_draw_dynamic_drawing_object(); + _m_bground_end(); } } } diff --git a/source/gui/detail/drawer.cpp b/source/gui/detail/drawer.cpp index 0170ec0d..69c47190 100644 --- a/source/gui/detail/drawer.cpp +++ b/source/gui/detail/drawer.cpp @@ -34,99 +34,99 @@ namespace nana void drawer_trigger::resizing(graph_reference, const arg_resizing&) { - overrided_ = false; + overrided_ &= ~(1 << static_cast(event_code::resizing)); } void drawer_trigger::resized(graph_reference graph, const arg_resized&) { - overrided_ = true; + overrided_ |= (1 << static_cast(event_code::resized)); this->refresh(graph); detail::bedrock::instance().thread_context_lazy_refresh(); } void drawer_trigger::move(graph_reference, const arg_move&) { - overrided_ = false; + overrided_ &= ~(1 << static_cast(event_code::move)); } void drawer_trigger::click(graph_reference, const arg_mouse&) { - overrided_ = false; + overrided_ &= ~(1 << static_cast(event_code::click)); } void drawer_trigger::dbl_click(graph_reference, const arg_mouse&) { - overrided_ = false; + overrided_ &= ~(1 << static_cast(event_code::dbl_click)); } void drawer_trigger::mouse_enter(graph_reference, const arg_mouse&) { - overrided_ = false; + overrided_ &= ~(1 << static_cast(event_code::mouse_enter)); } void drawer_trigger::mouse_move(graph_reference, const arg_mouse&) { - overrided_ = false; + overrided_ &= ~(1 << static_cast(event_code::mouse_move)); } void drawer_trigger::mouse_leave(graph_reference, const arg_mouse&) { - overrided_ = false; + overrided_ &= ~(1 << static_cast(event_code::mouse_leave)); } void drawer_trigger::mouse_down(graph_reference, const arg_mouse&) { - overrided_ = false; + overrided_ &= ~(1 << static_cast(event_code::mouse_down)); } void drawer_trigger::mouse_up(graph_reference, const arg_mouse&) { - overrided_ = false; + overrided_ &= ~(1 << static_cast(event_code::mouse_up)); } void drawer_trigger::mouse_wheel(graph_reference, const arg_wheel&) { - overrided_ = false; + overrided_ &= ~(1 << static_cast(event_code::mouse_wheel)); } void drawer_trigger::mouse_dropfiles(graph_reference, const arg_dropfiles&) { - overrided_ = false; + overrided_ &= ~(1 << static_cast(event_code::mouse_drop)); } void drawer_trigger::focus(graph_reference, const arg_focus&) { - overrided_ = false; + overrided_ &= ~(1 << static_cast(event_code::focus)); } void drawer_trigger::key_press(graph_reference, const arg_keyboard&) { - overrided_ = false; + overrided_ &= ~(1 << static_cast(event_code::key_press)); } void drawer_trigger::key_char(graph_reference, const arg_keyboard&) { - overrided_ = false; + overrided_ &= ~(1 << static_cast(event_code::key_char)); } void drawer_trigger::key_release(graph_reference, const arg_keyboard&) { - overrided_ = false; + overrided_ &= ~(1 << static_cast(event_code::key_release)); } void drawer_trigger::shortkey(graph_reference, const arg_keyboard&) { - overrided_ = false; + overrided_ &= ~(1 << static_cast(event_code::shortkey)); } void drawer_trigger::_m_reset_overrided() { - overrided_ = true; + overrided_ = 0xFFFFFFFF; } - bool drawer_trigger::_m_overrided() const + bool drawer_trigger::_m_overrided(event_code evt_code) const { - return overrided_; + return 0 != (overrided_ & (1 << static_cast(evt_code))); } //end class drawer_trigger @@ -306,9 +306,10 @@ namespace nana void drawer::attached(widget& wd, drawer_trigger& realizer) { for (auto i = std::begin(mth_state_), end = std::end(mth_state_); i != end; ++i) - *i = method_state::unknown; + *i = method_state::pending; realizer_ = &realizer; + realizer._m_reset_overrided(); realizer.attached(wd, graphics); } diff --git a/source/gui/detail/window_manager.cpp b/source/gui/detail/window_manager.cpp index 59b54506..8a952bf2 100644 --- a/source/gui/detail/window_manager.cpp +++ b/source/gui/detail/window_manager.cpp @@ -1073,7 +1073,7 @@ namespace detail while (new_stop && (wd != new_stop)) { - if (new_stop->flags.enabled && new_stop->visible) + if (new_stop->flags.enabled && new_stop->displayed()) return new_stop; new_stop = get_tabstop(new_stop, forward); diff --git a/source/gui/widgets/button.cpp b/source/gui/widgets/button.cpp index 63d8e810..9e660203 100644 --- a/source/gui/widgets/button.cpp +++ b/source/gui/widgets/button.cpp @@ -151,7 +151,7 @@ namespace nana{ namespace drawerbase void trigger::key_char(graph_reference, const arg_keyboard& arg) { - if(arg.key == static_cast(keyboard::enter)) + if (static_cast(keyboard::enter) == arg.key || static_cast(keyboard::space) == arg.key) emit_click(); }