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;
T & value;
std::size_t item_pos; ///< position of the item
arg_tabbar(tabbar<T>& wdg, T& v)
: widget(wdg), value{ v }
arg_tabbar(tabbar<T>& wdg, T& v, std::size_t p)
: 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>
struct arg_tabbar_adding
: public event_arg
{
arg_tabbar_adding(tabbar<T>& wdg, std::size_t pos)
: widget(wdg), where(pos)
arg_tabbar_adding(tabbar<T>& wdg, std::size_t p)
: widget(wdg), where(p)
{}
tabbar<T> & widget;
@ -51,8 +77,8 @@ namespace nana
template<typename T>
struct arg_tabbar_removed : public arg_tabbar<T>
{
arg_tabbar_removed(tabbar<T>& wdg, T& v)
: arg_tabbar<T>({wdg, v})
arg_tabbar_removed(tabbar<T>& wdg, T& v, std::size_t p)
: arg_tabbar<T>({wdg, v, p})
{}
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<value_type>> added;
basic_event<arg_tabbar_mouse<value_type>> tab_click;
basic_event<arg_tabbar<value_type>> activated;
basic_event<arg_tabbar_removed<value_type>> removed;
};
@ -81,6 +108,7 @@ namespace nana
virtual ~event_agent_interface() = default;
virtual bool adding(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 bool removed(std::size_t, bool & close_attached) = 0;
};
@ -124,9 +152,9 @@ namespace nana
bool adding(std::size_t pos) override
{
::nana::arg_tabbar_adding<T> arg(tabbar_, pos);
tabbar_.events().adding.emit(arg, tabbar_);
return arg.add;
::nana::arg_tabbar_adding<T> arg_ta(tabbar_, pos);
tabbar_.events().adding.emit(arg_ta, tabbar_);
return arg_ta.add;
}
void added(std::size_t pos) override
@ -134,21 +162,28 @@ namespace nana
if(pos != npos)
{
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
{
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
{
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_);
close_attach = arg.close_attach_window;
return arg.remove;

View File

@ -492,9 +492,17 @@ namespace nana
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()
@ -1285,7 +1293,7 @@ namespace nana
{
if(layouter_->press())
{
if(false == layouter_->active_by_trace())
if(false == layouter_->active_by_trace(arg))
layouter_->toolbox_answer(arg);
layouter_->render();
API::dev::lazy_refresh();