fix caret/keyboard issue(#62)

pressing space on a button will trigger click event
This commit is contained in:
Jinhao 2015-07-05 16:21:13 +08:00
parent 37481a2065
commit 0d14620052
5 changed files with 56 additions and 51 deletions

View File

@ -84,6 +84,7 @@ namespace nana
end_of_medium = 0x19, //Ctrl+Y end_of_medium = 0x19, //Ctrl+Y
substitute = 0x1A, //Ctrl+Z substitute = 0x1A, //Ctrl+Z
escape = 0x1B, escape = 0x1B,
space = 0x20, //Space
//The following names are intuitive name of ASCII control codes //The following names are intuitive name of ASCII control codes
select_all = start_of_headline, select_all = start_of_headline,

View File

@ -23,12 +23,18 @@ namespace nana
{ {
class widget; class widget;
namespace detail
{
class drawer;
}
class drawer_trigger class drawer_trigger
: ::nana::noncopyable, ::nana::nonmovable : ::nana::noncopyable, ::nana::nonmovable
{ {
friend class detail::drawer;
public: public:
typedef widget& widget_reference; using widget_reference = widget&;
typedef paint::graphics& graph_reference; using graph_reference = paint::graphics&;
virtual ~drawer_trigger(); virtual ~drawer_trigger();
virtual void attached(widget_reference, graph_reference); //none-const 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 key_release(graph_reference, const arg_keyboard&);
virtual void shortkey(graph_reference, const arg_keyboard&); virtual void shortkey(graph_reference, const arg_keyboard&);
void _m_reset_overrided();
bool _m_overrided() const;
private: private:
bool overrided_{false}; void _m_reset_overrided();
bool _m_overrided(event_code) const;
private:
unsigned overrided_{ 0xFFFFFFFF };
}; };
namespace detail namespace detail
@ -83,7 +90,7 @@ namespace nana
enum class method_state enum class method_state
{ {
unknown, pending,
overrided, overrided,
not_overrided not_overrided
}; };
@ -127,23 +134,20 @@ namespace nana
template<typename Arg, typename Mfptr> template<typename Arg, typename Mfptr>
void _m_emit(event_code evt_code, const Arg& arg, Mfptr mfptr) void _m_emit(event_code evt_code, const Arg& arg, Mfptr mfptr)
{
if (realizer_)
{ {
const int pos = static_cast<int>(evt_code); const int pos = static_cast<int>(evt_code);
if (method_state::not_overrided != mth_state_[pos]) if (realizer_ && (method_state::not_overrided != mth_state_[pos]))
{ {
_m_bground_pre(); _m_bground_pre();
if (method_state::unknown == mth_state_[pos]) if (method_state::pending == mth_state_[pos])
{ {
realizer_->_m_reset_overrided();
(realizer_->*mfptr)(graphics, arg); (realizer_->*mfptr)(graphics, arg);
//Check realizer, when the window is closed in that event handler, the drawer will be //Check realizer, when the window is closed in that event handler, the drawer will be
//detached and realizer will be a nullptr //detached and realizer will be a nullptr
if(realizer_) if(realizer_)
mth_state_[pos] = (realizer_->_m_overrided() ? method_state::overrided : method_state::not_overrided); mth_state_[pos] = (realizer_->_m_overrided(evt_code) ? method_state::overrided : method_state::not_overrided);
} }
else else
(realizer_->*mfptr)(graphics, arg); (realizer_->*mfptr)(graphics, arg);
@ -155,7 +159,6 @@ namespace nana
} }
} }
} }
}
public: public:
nana::paint::graphics graphics; nana::paint::graphics graphics;
private: private:

View File

@ -34,99 +34,99 @@ namespace nana
void drawer_trigger::resizing(graph_reference, const arg_resizing&) void drawer_trigger::resizing(graph_reference, const arg_resizing&)
{ {
overrided_ = false; overrided_ &= ~(1 << static_cast<int>(event_code::resizing));
} }
void drawer_trigger::resized(graph_reference graph, const arg_resized&) void drawer_trigger::resized(graph_reference graph, const arg_resized&)
{ {
overrided_ = true; overrided_ |= (1 << static_cast<int>(event_code::resized));
this->refresh(graph); this->refresh(graph);
detail::bedrock::instance().thread_context_lazy_refresh(); detail::bedrock::instance().thread_context_lazy_refresh();
} }
void drawer_trigger::move(graph_reference, const arg_move&) void drawer_trigger::move(graph_reference, const arg_move&)
{ {
overrided_ = false; overrided_ &= ~(1 << static_cast<int>(event_code::move));
} }
void drawer_trigger::click(graph_reference, const arg_mouse&) void drawer_trigger::click(graph_reference, const arg_mouse&)
{ {
overrided_ = false; overrided_ &= ~(1 << static_cast<int>(event_code::click));
} }
void drawer_trigger::dbl_click(graph_reference, const arg_mouse&) void drawer_trigger::dbl_click(graph_reference, const arg_mouse&)
{ {
overrided_ = false; overrided_ &= ~(1 << static_cast<int>(event_code::dbl_click));
} }
void drawer_trigger::mouse_enter(graph_reference, const arg_mouse&) void drawer_trigger::mouse_enter(graph_reference, const arg_mouse&)
{ {
overrided_ = false; overrided_ &= ~(1 << static_cast<int>(event_code::mouse_enter));
} }
void drawer_trigger::mouse_move(graph_reference, const arg_mouse&) void drawer_trigger::mouse_move(graph_reference, const arg_mouse&)
{ {
overrided_ = false; overrided_ &= ~(1 << static_cast<int>(event_code::mouse_move));
} }
void drawer_trigger::mouse_leave(graph_reference, const arg_mouse&) void drawer_trigger::mouse_leave(graph_reference, const arg_mouse&)
{ {
overrided_ = false; overrided_ &= ~(1 << static_cast<int>(event_code::mouse_leave));
} }
void drawer_trigger::mouse_down(graph_reference, const arg_mouse&) void drawer_trigger::mouse_down(graph_reference, const arg_mouse&)
{ {
overrided_ = false; overrided_ &= ~(1 << static_cast<int>(event_code::mouse_down));
} }
void drawer_trigger::mouse_up(graph_reference, const arg_mouse&) void drawer_trigger::mouse_up(graph_reference, const arg_mouse&)
{ {
overrided_ = false; overrided_ &= ~(1 << static_cast<int>(event_code::mouse_up));
} }
void drawer_trigger::mouse_wheel(graph_reference, const arg_wheel&) void drawer_trigger::mouse_wheel(graph_reference, const arg_wheel&)
{ {
overrided_ = false; overrided_ &= ~(1 << static_cast<int>(event_code::mouse_wheel));
} }
void drawer_trigger::mouse_dropfiles(graph_reference, const arg_dropfiles&) void drawer_trigger::mouse_dropfiles(graph_reference, const arg_dropfiles&)
{ {
overrided_ = false; overrided_ &= ~(1 << static_cast<int>(event_code::mouse_drop));
} }
void drawer_trigger::focus(graph_reference, const arg_focus&) void drawer_trigger::focus(graph_reference, const arg_focus&)
{ {
overrided_ = false; overrided_ &= ~(1 << static_cast<int>(event_code::focus));
} }
void drawer_trigger::key_press(graph_reference, const arg_keyboard&) void drawer_trigger::key_press(graph_reference, const arg_keyboard&)
{ {
overrided_ = false; overrided_ &= ~(1 << static_cast<int>(event_code::key_press));
} }
void drawer_trigger::key_char(graph_reference, const arg_keyboard&) void drawer_trigger::key_char(graph_reference, const arg_keyboard&)
{ {
overrided_ = false; overrided_ &= ~(1 << static_cast<int>(event_code::key_char));
} }
void drawer_trigger::key_release(graph_reference, const arg_keyboard&) void drawer_trigger::key_release(graph_reference, const arg_keyboard&)
{ {
overrided_ = false; overrided_ &= ~(1 << static_cast<int>(event_code::key_release));
} }
void drawer_trigger::shortkey(graph_reference, const arg_keyboard&) void drawer_trigger::shortkey(graph_reference, const arg_keyboard&)
{ {
overrided_ = false; overrided_ &= ~(1 << static_cast<int>(event_code::shortkey));
} }
void drawer_trigger::_m_reset_overrided() 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<int>(evt_code)));
} }
//end class drawer_trigger //end class drawer_trigger
@ -306,9 +306,10 @@ namespace nana
void drawer::attached(widget& wd, drawer_trigger& realizer) void drawer::attached(widget& wd, drawer_trigger& realizer)
{ {
for (auto i = std::begin(mth_state_), end = std::end(mth_state_); i != end; ++i) 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_ = &realizer;
realizer._m_reset_overrided();
realizer.attached(wd, graphics); realizer.attached(wd, graphics);
} }

View File

@ -1073,7 +1073,7 @@ namespace detail
while (new_stop && (wd != new_stop)) 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; return new_stop;
new_stop = get_tabstop(new_stop, forward); new_stop = get_tabstop(new_stop, forward);

View File

@ -151,7 +151,7 @@ namespace nana{ namespace drawerbase
void trigger::key_char(graph_reference, const arg_keyboard& arg) void trigger::key_char(graph_reference, const arg_keyboard& arg)
{ {
if(arg.key == static_cast<char_t>(keyboard::enter)) if (static_cast<char_t>(keyboard::enter) == arg.key || static_cast<char_t>(keyboard::space) == arg.key)
emit_click(); emit_click();
} }