Merge branch 'besh81-hotfix-1.6.2' into hotfix-1.6.2

This commit is contained in:
Jinhao 2018-12-03 23:46:49 +08:00
commit ab2d39397f
2 changed files with 59 additions and 16 deletions

View File

@ -29,18 +29,44 @@ namespace nana
{ {
tabbar<T> & widget; tabbar<T> & widget;
T & value; T & value;
std::size_t item_pos; ///< position of the item
arg_tabbar(tabbar<T>& wdg, T& v) arg_tabbar(tabbar<T>& wdg, T& v, std::size_t p)
: widget(wdg), value{ v } : widget(wdg), value{ v }, item_pos(p)
{} {}
}; };
template<typename T>
struct arg_tabbar_click : public arg_tabbar<T>
{
arg_tabbar_click(tabbar<T>& wdg, T& v, std::size_t p)
: arg_tabbar<T>({wdg, v, p})
{}
bool left_button = false; ///< true if mouse left button is pressed
bool mid_button = false; ///< true if mouse middle button is pressed
bool right_button = false; ///< true if mouse right button is pressed
};
template<typename T>
struct arg_tabbar_mouse
: public arg_mouse
{
arg_tabbar_mouse(const arg_mouse& arg, tabbar<T>& wdg, T& v, std::size_t p)
: arg_mouse{ arg }, widget(wdg), value{ v }, item_pos(p)
{}
tabbar<T> & widget;
T & value;
std::size_t item_pos; ///< position of the item
};
template<typename T> template<typename T>
struct arg_tabbar_adding struct arg_tabbar_adding
: public event_arg : public event_arg
{ {
arg_tabbar_adding(tabbar<T>& wdg, std::size_t pos) arg_tabbar_adding(tabbar<T>& wdg, std::size_t p)
: widget(wdg), where(pos) : widget(wdg), where(p)
{} {}
tabbar<T> & widget; tabbar<T> & widget;
@ -51,8 +77,8 @@ namespace nana
template<typename T> template<typename T>
struct arg_tabbar_removed : public arg_tabbar<T> struct arg_tabbar_removed : public arg_tabbar<T>
{ {
arg_tabbar_removed(tabbar<T>& wdg, T& v) arg_tabbar_removed(tabbar<T>& wdg, T& v, std::size_t p)
: arg_tabbar<T>({wdg, v}) : arg_tabbar<T>({wdg, v, p})
{} {}
mutable bool remove = true; ///< determines whether to remove the item mutable bool remove = true; ///< determines whether to remove the item
@ -71,6 +97,7 @@ namespace nana
basic_event<arg_tabbar_adding<value_type>> adding; basic_event<arg_tabbar_adding<value_type>> adding;
basic_event<arg_tabbar<value_type>> added; basic_event<arg_tabbar<value_type>> added;
basic_event<arg_tabbar_mouse<value_type>> tab_click;
basic_event<arg_tabbar<value_type>> activated; basic_event<arg_tabbar<value_type>> activated;
basic_event<arg_tabbar_removed<value_type>> removed; basic_event<arg_tabbar_removed<value_type>> removed;
}; };
@ -81,6 +108,7 @@ namespace nana
virtual ~event_agent_interface() = default; virtual ~event_agent_interface() = default;
virtual bool adding(std::size_t) = 0; virtual bool adding(std::size_t) = 0;
virtual void added(std::size_t) = 0; virtual void added(std::size_t) = 0;
virtual bool click(const arg_mouse&, std::size_t) = 0;
virtual void activated(std::size_t) = 0; virtual void activated(std::size_t) = 0;
virtual bool removed(std::size_t, bool & close_attached) = 0; virtual bool removed(std::size_t, bool & close_attached) = 0;
}; };
@ -124,9 +152,9 @@ namespace nana
bool adding(std::size_t pos) override bool adding(std::size_t pos) override
{ {
::nana::arg_tabbar_adding<T> arg(tabbar_, pos); ::nana::arg_tabbar_adding<T> arg_ta(tabbar_, pos);
tabbar_.events().adding.emit(arg, tabbar_); tabbar_.events().adding.emit(arg_ta, tabbar_);
return arg.add; return arg_ta.add;
} }
void added(std::size_t pos) override void added(std::size_t pos) override
@ -134,21 +162,28 @@ namespace nana
if(pos != npos) if(pos != npos)
{ {
drawer_trigger_.at_no_bound_check(pos) = T(); drawer_trigger_.at_no_bound_check(pos) = T();
tabbar_.events().added.emit(arg_tabbar({ tabbar_, tabbar_[pos] }), tabbar_); tabbar_.events().added.emit(arg_tabbar({ tabbar_, tabbar_[pos], pos }), tabbar_);
} }
} }
bool click(const arg_mouse& arg, std::size_t pos) override
{
::nana::arg_tabbar_mouse<T> arg_tm(arg, tabbar_, tabbar_[pos], pos);
tabbar_.events().tab_click.emit(arg_tm, tabbar_);
return arg_tm.propagation_stopped();
}
void activated(std::size_t pos) override void activated(std::size_t pos) override
{ {
if(pos != npos) if(pos != npos)
tabbar_.events().activated.emit(arg_tabbar({ tabbar_, tabbar_[pos]}), tabbar_); tabbar_.events().activated.emit(arg_tabbar({ tabbar_, tabbar_[pos], pos}), tabbar_);
} }
bool removed(std::size_t pos, bool & close_attach) override bool removed(std::size_t pos, bool & close_attach) override
{ {
if (pos != npos) if(pos != npos)
{ {
::nana::arg_tabbar_removed<T> arg(tabbar_, tabbar_[pos]); ::nana::arg_tabbar_removed<T> arg(tabbar_, tabbar_[pos], pos);
tabbar_.events().removed.emit(arg, tabbar_); tabbar_.events().removed.emit(arg, tabbar_);
close_attach = arg.close_attach_window; close_attach = arg.close_attach_window;
return arg.remove; return arg.remove;

View File

@ -492,9 +492,17 @@ namespace nana
return (trace_.what != trace_.null); return (trace_.what != trace_.null);
} }
bool active_by_trace() bool active_by_trace(const arg_mouse& arg)
{ {
return ((trace_.what == trace_.item) && (trace_.item_part != trace_.close)? activate(trace_.u.index) : false); if((trace_.what == trace_.item) && (trace_.item_part != trace_.close))
{
if(false == evt_agent_->click(arg, trace_.u.index))
return activate(trace_.u.index);
return true;
}
return false;
} }
bool release() bool release()
@ -1285,7 +1293,7 @@ namespace nana
{ {
if(layouter_->press()) if(layouter_->press())
{ {
if(false == layouter_->active_by_trace()) if(false == layouter_->active_by_trace(arg))
layouter_->toolbox_answer(arg); layouter_->toolbox_answer(arg);
layouter_->render(); layouter_->render();
API::dev::lazy_refresh(); API::dev::lazy_refresh();