add insert/append/erase methods to template class tabbar

This commit is contained in:
Jinhao 2015-12-04 00:20:29 +08:00
parent 243af14da7
commit faa33817e2
2 changed files with 88 additions and 29 deletions

View File

@ -40,7 +40,9 @@ namespace nana
: arg_tabbar<T>({wdg, v}) : arg_tabbar<T>({wdg, v})
{} {}
bool remove = true; bool remove = true; ///< determines whether to remove the item
bool close_attach_window = true; ///< determines whether to close the attached window. It is ignored if remove is false
}; };
namespace drawerbase namespace drawerbase
@ -51,11 +53,11 @@ namespace nana
struct tabbar_events struct tabbar_events
: public general_events : public general_events
{ {
typedef T value_type; using value_type = T;
basic_event<arg_tabbar<value_type>> added; basic_event<arg_tabbar<value_type>> added;
basic_event<arg_tabbar<value_type>> activated; basic_event<arg_tabbar<value_type>> activated;
basic_event<arg_tabbar<value_type>> removed; basic_event<arg_tabbar_removed<value_type>> removed;
}; };
class event_agent_interface class event_agent_interface
@ -64,7 +66,7 @@ namespace nana
virtual ~event_agent_interface() = default; virtual ~event_agent_interface() = default;
virtual void added(std::size_t) = 0; virtual void added(std::size_t) = 0;
virtual void activated(std::size_t) = 0; virtual void activated(std::size_t) = 0;
virtual bool removed(std::size_t) = 0; virtual bool removed(std::size_t, bool & close_attached) = 0;
}; };
class item_renderer class item_renderer
@ -98,7 +100,7 @@ namespace nana
: public event_agent_interface : public event_agent_interface
{ {
public: public:
typedef ::nana::arg_tabbar<T> arg_tabbar; using arg_tabbar = ::nana::arg_tabbar<T>;
event_agent(::nana::tabbar<T>& tb, DrawerTrigger & dtr) event_agent(::nana::tabbar<T>& tb, DrawerTrigger & dtr)
: tabbar_(tb), drawer_trigger_(dtr) : tabbar_(tb), drawer_trigger_(dtr)
@ -119,14 +121,16 @@ namespace nana
tabbar_.events().activated.emit(arg_tabbar({ tabbar_, tabbar_[pos]})); tabbar_.events().activated.emit(arg_tabbar({ tabbar_, tabbar_[pos]}));
} }
bool removed(std::size_t pos) 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]);
tabbar_.events().removed.emit(arg); tabbar_.events().removed.emit(arg);
close_attach = arg.close_attach_window;
return arg.remove; return arg.remove;
} }
close_attach = true;
return true; return true;
} }
private: private:
@ -140,8 +144,6 @@ namespace nana
: public drawer_trigger : public drawer_trigger
{ {
public: public:
//enum toolbox_button_t{ButtonAdd, ButtonScroll, ButtonList, ButtonClose}; //deprecated
enum class kits enum class kits
{ {
add, add,
@ -159,10 +161,11 @@ namespace nana
const pat::cloneable<item_renderer> & ext_renderer() const; const pat::cloneable<item_renderer> & ext_renderer() const;
void ext_renderer(const pat::cloneable<item_renderer>&); void ext_renderer(const pat::cloneable<item_renderer>&);
void set_event_agent(event_agent_interface*); void set_event_agent(event_agent_interface*);
void push_back(const nana::string&, const nana::any&); void insert(std::size_t, nana::string&&, nana::any&&);
std::size_t length() const; std::size_t length() const;
bool close_fly(bool); bool close_fly(bool);
void relate(size_t, window); void attach(std::size_t, window);
void erase(std::size_t);
void tab_color(std::size_t, bool is_bgcolor, const ::nana::color&); void tab_color(std::size_t, bool is_bgcolor, const ::nana::color&);
void tab_image(size_t, const nana::paint::image&); void tab_image(size_t, const nana::paint::image&);
void text(std::size_t, const nana::string&); void text(std::size_t, const nana::string&);
@ -289,16 +292,57 @@ namespace nana
return this->get_drawer_trigger().length(); return this->get_drawer_trigger().length();
} }
void push_back(const nana::string& text) /// Append a new item. void append(const std::string& text, window attach_wd, value_type value = {})
{ {
auto & t = this->get_drawer_trigger(); this->append(static_cast<std::wstring>(nana::charset(text, nana::unicode::utf8)), attach_wd);
t.push_back(text, value_type()); }
void append(const std::wstring& text, window attach_wd, value_type value = {})
{
this->get_drawer_trigger().insert(::nana::npos, std::wstring(text), std::move(value));
if (attach_wd)
{
auto pos = this->get_drawer_trigger().length();
relate(pos, attach_wd);
}
API::update_window(*this); API::update_window(*this);
} }
void push_back(nana::string text) /// Append a new item.
{
this->get_drawer_trigger().insert(::nana::npos, std::move(text), value_type());
API::update_window(*this);
}
void insert(std::size_t pos, const std::string& text, const value_type& value = {})
{
this->insert(pos, static_cast<std::wstring>(nana::charset(text, nana::unicode::utf8)), value);
}
void insert(std::size_t pos, const std::wstring& text, const value_type& value = {})
{
if (pos > length())
throw std::out_of_range("tabbar::insert invalid position");
this->get_drawer_trigger().insert(pos, std::wstring(text), value_type(value));
API::update_window(*this);
}
//deprecated from 1.2.1, removed from 1.3
void relate(std::size_t pos, window wd) /// Binds a window to an item specified by pos, if the item is selected, shows the window, otherwise, hides it. void relate(std::size_t pos, window wd) /// Binds a window to an item specified by pos, if the item is selected, shows the window, otherwise, hides it.
{ {
this->get_drawer_trigger().relate(pos, wd); this->get_drawer_trigger().attach(pos, wd);
}
void attach(std::size_t pos, window wd)
{
this->get_drawer_trigger().attach(pos, wd);
}
void erase(std::size_t pos)
{
this->get_drawer_trigger().erase(pos);
} }
void tab_bgcolor(std::size_t i, const ::nana::color& clr) void tab_bgcolor(std::size_t i, const ::nana::color& clr)

View File

@ -30,6 +30,12 @@ namespace nana
::nana::color bgcolor; ::nana::color bgcolor;
::nana::color fgcolor; ::nana::color fgcolor;
item_t() = default;
item_t(nana::string&& text, any && value)
: text(std::move(text)), value(std::move(value))
{}
}; };
class def_renderer class def_renderer
@ -414,13 +420,13 @@ namespace nana
evt_agent_ = evt; evt_agent_ = evt;
} }
void push_back(const nana::string& text, const nana::any & value) void insert(std::size_t pos, nana::string&& text, nana::any&& value)
{ {
item_t m; if (pos >= list_.size())
m.text = text; pos = list_.size();
m.value = value;
list_.push_back(m); list_.emplace(iterator_at(pos), std::move(text), std::move(value));
activate(static_cast<size_t>(list_.size() - 1)); this->activate(pos);
render(); render();
} }
@ -433,8 +439,12 @@ namespace nana
{ {
if(pos < list_.size()) if(pos < list_.size())
{ {
if ((nullptr == evt_agent_) || evt_agent_->removed(pos)) bool close_attach = true;
if ((nullptr == evt_agent_) || evt_agent_->removed(pos, close_attach))
{ {
if (close_attach)
API::close_window(iterator_at(pos)->relative);
else
API::show_window(iterator_at(pos)->relative, false); API::show_window(iterator_at(pos)->relative, false);
list_.erase(iterator_at(pos)); list_.erase(iterator_at(pos));
_m_adjust(); _m_adjust();
@ -593,7 +603,7 @@ namespace nana
return basis_.active; return basis_.active;
} }
void relate(std::size_t pos, window wd) void attach(std::size_t pos, window wd)
{ {
if(pos < list_.size()) if(pos < list_.size())
{ {
@ -1152,9 +1162,9 @@ namespace nana
layouter_->event_agent(evt); layouter_->event_agent(evt);
} }
void trigger::push_back(const nana::string& text, const nana::any& value) void trigger::insert(std::size_t pos, nana::string&& text, nana::any&& value)
{ {
layouter_->push_back(text, value); layouter_->insert(pos, std::move(text), std::move(value));
} }
std::size_t trigger::length() const std::size_t trigger::length() const
@ -1167,9 +1177,14 @@ namespace nana
return layouter_->toolbox_object().close_fly(fly); return layouter_->toolbox_object().close_fly(fly);
} }
void trigger::relate(std::size_t i, window wd) void trigger::attach(std::size_t pos, window wd)
{ {
layouter_->relate(i, wd); layouter_->attach(pos, wd);
}
void trigger::erase(std::size_t pos)
{
layouter_->erase(pos);
} }
void trigger::tab_color(std::size_t i, bool is_bgcolor, const ::nana::color& clr) void trigger::tab_color(std::size_t i, bool is_bgcolor, const ::nana::color& clr)