fix caret/keyboard issue(#62)
pressing space on a button will trigger click event
This commit is contained in:
parent
37481a2065
commit
0d14620052
@ -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,
|
||||||
|
|||||||
@ -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:
|
||||||
|
|||||||
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -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);
|
||||||
|
|||||||
@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user