improve dockpane caption

This commit is contained in:
Jinhao 2015-09-21 23:43:00 +08:00
parent c04751ac1a
commit 8dcd730715
10 changed files with 132 additions and 42 deletions

View File

@ -29,6 +29,13 @@ namespace nana
/// Traits for widget classes /// Traits for widget classes
template<typename Widget> template<typename Widget>
struct widget_traits struct widget_traits
{
using event_type = typename Widget::event_type;
using scheme_type = typename Widget::scheme_type;
};
template<>
struct widget_traits<widget>
{ {
using event_type = ::nana::general_events; using event_type = ::nana::general_events;
using scheme_type = ::nana::widget_colors; using scheme_type = ::nana::widget_colors;

View File

@ -229,7 +229,8 @@ namespace nana
nana::any * _m_anyobj(std::size_t pos, bool alloc_if_empty) const override; nana::any * _m_anyobj(std::size_t pos, bool alloc_if_empty) const override;
}; };
namespace dev /*
namespace dev //deprecated
{ {
template<> template<>
struct widget_traits<combox> struct widget_traits<combox>
@ -238,5 +239,6 @@ namespace nana
using scheme_type = ::nana::widgets::skeletons::text_editor_scheme; using scheme_type = ::nana::widgets::skeletons::text_editor_scheme;
}; };
} }
*/
} }
#endif #endif

View File

@ -664,14 +664,16 @@ By \a clicking on one header the list get \a reordered, first up, and then down
void _m_erase_key(nana::detail::key_interface*); void _m_erase_key(nana::detail::key_interface*);
}; };
/*
namespace dev namespace dev
{ {
template<> template<>
struct widget_traits<listbox> struct widget_traits<listbox> //deprecated
{ {
using event_type = drawerbase::listbox::listbox_events; using event_type = drawerbase::listbox::listbox_events;
using scheme_type = drawerbase::listbox::scheme; using scheme_type = drawerbase::listbox::scheme;
}; };
} }
*/
}//end namespace nana }//end namespace nana
#endif #endif

View File

@ -110,15 +110,17 @@ namespace nana
void _m_caption(::nana::string&&); void _m_caption(::nana::string&&);
}; //end class spinbox }; //end class spinbox
/*
namespace dev namespace dev
{ {
template<> template<>
struct widget_traits<spinbox> struct widget_traits<spinbox> //deprecated
{ {
using event_type = drawerbase::spinbox::spinbox_events; using event_type = drawerbase::spinbox::spinbox_events;
using scheme_type = ::nana::widgets::skeletons::text_editor_scheme; using scheme_type = ::nana::widgets::skeletons::text_editor_scheme;
}; };
} }
*/
}//end namespace nana }//end namespace nana
#endif //NANA_GUI_WIDGET_SPINBOX_HPP #endif //NANA_GUI_WIDGET_SPINBOX_HPP

View File

@ -343,6 +343,12 @@ namespace nana
{ {
class model; class model;
struct events
: public general_events
{
basic_event<event_arg> selected;
};
class driver class driver
: public drawer_trigger : public drawer_trigger
{ {
@ -365,7 +371,7 @@ namespace nana
}//end namespace drawerbase }//end namespace drawerbase
class tabbar_lite class tabbar_lite
: public widget_object<category::widget_tag, drawerbase::tabbar_lite::driver> : public widget_object<category::widget_tag, drawerbase::tabbar_lite::driver, drawerbase::tabbar_lite::events>
{ {
public: public:
tabbar_lite() = default; tabbar_lite() = default;
@ -376,6 +382,7 @@ namespace nana
public: //modifiers public: //modifiers
void attach(std::size_t pos, window); void attach(std::size_t pos, window);
window attach(std::size_t pos) const;
void push_back(std::string text, ::nana::any par = {}); void push_back(std::string text, ::nana::any par = {});
void push_front(std::string text, ::nana::any par = {}); void push_front(std::string text, ::nana::any par = {});
@ -383,6 +390,19 @@ namespace nana
std::size_t selected() const; std::size_t selected() const;
void erase(std::size_t pos, bool close_attached = true); void erase(std::size_t pos, bool close_attached = true);
}; };
/*
namespace dev
{
/// Traits for widget classes
template<>
struct widget_traits<tabbar_lite> //deprecated
{
using event_type = drawerbase::tabbar_lite::events;
using scheme_type = ::nana::widget_colors;
};
}
*/
} }
#endif #endif

View File

@ -195,15 +195,17 @@ namespace nana
void _m_typeface(const paint::font&) override; void _m_typeface(const paint::font&) override;
}; };
/*
namespace dev namespace dev
{ {
/// Traits for widget classes /// Traits for widget classes
template<> template<>
struct widget_traits<textbox> struct widget_traits<textbox> //deprecated
{ {
using event_type = drawerbase::textbox::textbox_events; using event_type = drawerbase::textbox::textbox_events;
using scheme_type = ::nana::widgets::skeletons::text_editor_scheme; using scheme_type = ::nana::widgets::skeletons::text_editor_scheme;
}; };
} }
*/
}//end namespace nana }//end namespace nana
#endif #endif

View File

@ -135,6 +135,7 @@ namespace nana
typedef DrawerTrigger drawer_trigger_t; typedef DrawerTrigger drawer_trigger_t;
public: public:
using scheme_type = Scheme; using scheme_type = Scheme;
using event_type = Events;
widget_object() widget_object()
: events_{ std::make_shared<Events>() }, : events_{ std::make_shared<Events>() },
@ -147,7 +148,7 @@ namespace nana
API::close_window(handle_); API::close_window(handle_);
} }
Events& events() const event_type& events() const
{ {
return *events_; return *events_;
} }
@ -228,6 +229,7 @@ namespace nana
typedef DrawerTrigger drawer_trigger_t; typedef DrawerTrigger drawer_trigger_t;
public: public:
using scheme_type = Scheme; using scheme_type = Scheme;
using event_type = Events;
widget_object() widget_object()
: events_{ std::make_shared<Events>() }, scheme_{ API::dev::make_scheme<scheme_type>() } : events_{ std::make_shared<Events>() }, scheme_{ API::dev::make_scheme<scheme_type>() }
@ -239,7 +241,7 @@ namespace nana
API::close_window(handle_); API::close_window(handle_);
} }
Events& events() const event_type& events() const
{ {
return *events_; return *events_;
} }
@ -297,6 +299,7 @@ namespace nana
typedef DrawerTrigger drawer_trigger_t; typedef DrawerTrigger drawer_trigger_t;
public: public:
using scheme_type = Scheme; using scheme_type = Scheme;
using event_type = Events;
widget_object() widget_object()
{ {
@ -322,7 +325,7 @@ namespace nana
API::close_window(handle_); API::close_window(handle_);
} }
Events& events() const event_type& events() const
{ {
return *events_; return *events_;
} }
@ -451,6 +454,7 @@ namespace nana
typedef int drawer_trigger_t; typedef int drawer_trigger_t;
public: public:
using scheme_type = Scheme; using scheme_type = Scheme;
using event_type = Events;
widget_object() widget_object()
: events_{ std::make_shared<Events>() }, scheme_{ API::dev::make_scheme<scheme_type>() } : events_{ std::make_shared<Events>() }, scheme_{ API::dev::make_scheme<scheme_type>() }
@ -462,7 +466,7 @@ namespace nana
API::close_window(handle_); API::close_window(handle_);
} }
Events& events() const event_type& events() const
{ {
return *events_; return *events_;
} }

View File

@ -2829,7 +2829,7 @@ namespace nana
{ {
auto i = impl_->dock_factoris.find(factory); auto i = impl_->dock_factoris.find(factory);
if (i == impl_->dock_factoris.end()) if (i == impl_->dock_factoris.end())
throw std::invalid_argument("nana::place - invalid factory name(" + factory + ")"); throw std::invalid_argument("invalid factory name(" + factory + ") of dockpane");
auto dock_ptr = i->second; auto dock_ptr = i->second;
dock_ptr->attached->set_display(true); dock_ptr->attached->set_display(true);

View File

@ -85,7 +85,6 @@ namespace nana
//draw caption //draw caption
auto text = API::window_caption(window_handle_); auto text = API::window_caption(window_handle_);
text = L"dockarea-caption";
text_rd_->render({ 3, 1 }, text.data(), text.size(), graph.size().width - 20, true); text_rd_->render({ 3, 1 }, text.data(), text.size(), graph.size().width - 20, true);
//draw x button //draw x button
@ -303,6 +302,17 @@ namespace nana
if (!tabbar_ && panels_.size() > 0) if (!tabbar_ && panels_.size() > 0)
{ {
tabbar_.reset(new tabbar_lite(*this)); tabbar_.reset(new tabbar_lite(*this));
tabbar_->events().selected.clear();
tabbar_->events().selected([this]
{
auto handle = tabbar_->attach(tabbar_->selected());
if (handle)
caption_.caption(API::window_caption(handle));
else
caption_.caption(::nana::string());
});
tabbar_->move({ 0, r.bottom() - 20, r.width, 20 }); tabbar_->move({ 0, r.bottom() - 20, r.width, 20 });
r.height -= 20; r.height -= 20;
@ -319,7 +329,12 @@ namespace nana
if (tabbar_) if (tabbar_)
{ {
tabbar_->push_back(::nana::charset(wdg->caption())); tabbar_->push_back(::nana::charset(wdg->caption()));
tabbar_->attach(panels_.size(), *wdg); tabbar_->attach(panels_.size(), wdg->handle());
}
if (panels_.empty())
{
caption_.caption(wdg->caption());
} }
panels_.emplace_back(); panels_.emplace_back();

View File

@ -344,7 +344,7 @@ namespace nana
{ {
if(i < list_.size()) if(i < list_.size())
return at_no_bound_check(i); return at_no_bound_check(i);
throw std::out_of_range("Nana.GUI.tabbar::at() is out of range"); throw std::out_of_range("invalid position of tabbar");
} }
iterator iterator_at(std::size_t pos) iterator iterator_at(std::size_t pos)
@ -370,7 +370,7 @@ namespace nana
{ {
if(pos < list_.size()) if(pos < list_.size())
return at_no_bound_check(pos); return at_no_bound_check(pos);
throw std::out_of_range("Nana.GUI.tabbar::at() const is out of range"); throw std::out_of_range("invalid position of tabbar");
} }
const nana::any& at_no_bound_check(std::size_t pos) const const nana::any& at_no_bound_check(std::size_t pos) const
@ -1345,15 +1345,21 @@ namespace nana
using graph_reference = ::nana::paint::graphics&; using graph_reference = ::nana::paint::graphics&;
static const std::size_t npos = static_cast<std::size_t>(-1); static const std::size_t npos = static_cast<std::size_t>(-1);
void set_widget(widget& wdg) void set_widget(::nana::tabbar_lite& wdg)
{ {
widget_ = &wdg; widget_ = &wdg;
} }
::nana::dev::widget_traits<widget>::scheme_type & scheme() ::nana::tabbar_lite* widget_ptr() const
{
return widget_;
}
/*
::nana::dev::widget_traits<widget>::scheme_type & scheme() //deprecated
{ {
return API::scheme(*widget_); return API::scheme(*widget_);
} }
*/
std::forward_list<item>& items() std::forward_list<item>& items()
{ {
@ -1407,7 +1413,7 @@ namespace nana
return indexes_; return indexes_;
} }
private: private:
widget * widget_{ nullptr }; ::nana::tabbar_lite * widget_{ nullptr };
std::forward_list<item> items_; std::forward_list<item> items_;
indexes indexes_; indexes indexes_;
}; };
@ -1421,7 +1427,7 @@ namespace nana
{ {
_m_calc_metrics(graph, model.items()); _m_calc_metrics(graph, model.items());
auto & scheme = model.scheme(); auto & scheme = model.widget_ptr()->scheme();
//draw background //draw background
graph.rectangle(true, scheme.background); graph.rectangle(true, scheme.background);
@ -1499,7 +1505,7 @@ namespace nana
void driver::attached(widget_reference wdg, graph_reference) void driver::attached(widget_reference wdg, graph_reference)
{ {
model_->set_widget(wdg); model_->set_widget(dynamic_cast<nana::tabbar_lite&>(wdg));
} }
//Overrides drawer_trigger's method //Overrides drawer_trigger's method
@ -1533,11 +1539,17 @@ namespace nana
if ((indexes.hovered_pos == model_->npos) || (indexes.active_pos == indexes.hovered_pos)) if ((indexes.hovered_pos == model_->npos) || (indexes.active_pos == indexes.hovered_pos))
return; return;
if (indexes.active_pos != indexes.hovered_pos)
{
indexes.active_pos = indexes.hovered_pos; indexes.active_pos = indexes.hovered_pos;
model_->show_attached_window(); model_->show_attached_window();
refresh(graph); refresh(graph);
API::lazy_refresh(); API::lazy_refresh();
event_arg arg;
model_->widget_ptr()->events().selected.emit(arg);
}
} }
//end class driver //end class driver
} }
@ -1577,6 +1589,20 @@ namespace nana
throw std::out_of_range("invalid position of tabbar_lite"); throw std::out_of_range("invalid position of tabbar_lite");
} }
window tabbar_lite::attach(std::size_t pos_set) const
{
auto model = get_drawer_trigger().get_model();
internal_scope_guard lock;
for (auto & m : model->items())
{
if (0 == pos_set--)
return m.attached_window;
}
throw std::out_of_range("invalid position of tabbar_lite");
}
void tabbar_lite::push_back(std::string text, ::nana::any any) void tabbar_lite::push_back(std::string text, ::nana::any any)
{ {
auto & items = get_drawer_trigger().get_model()->items(); auto & items = get_drawer_trigger().get_model()->items();
@ -1622,10 +1648,12 @@ namespace nana
const auto len = length(); const auto len = length();
if (len <= pos) if (len <= pos)
throw std::out_of_range("tabbar_lite: out of range"); throw std::out_of_range("invalid position of tabbar_lite");
auto active_pos = model->get_indexes().active_pos; auto active_pos = model->get_indexes().active_pos;
//selection_changed is used to determine whether the title will be updated
bool selection_changed = true;
if (pos == active_pos) if (pos == active_pos)
{ {
if (active_pos + 1 == len) if (active_pos + 1 == len)
@ -1638,6 +1666,8 @@ namespace nana
} }
else if (pos < active_pos) else if (pos < active_pos)
--active_pos; --active_pos;
else
selection_changed = false;
model->get_indexes().active_pos = active_pos; model->get_indexes().active_pos = active_pos;
@ -1653,6 +1683,12 @@ namespace nana
if (close_attached && attached_wd) if (close_attached && attached_wd)
API::close_window(attached_wd); API::close_window(attached_wd);
if (selection_changed)
{
event_arg arg;
events().selected.emit(arg);
}
} }
//end class tabbar //end class tabbar
}//end namespace nana }//end namespace nana