Add widget_traits class

This commit is contained in:
cnjinhao 2015-01-16 16:50:38 +08:00
parent 7b30855976
commit bf35932bfb
3 changed files with 34 additions and 23 deletions

View File

@ -483,16 +483,6 @@ namespace nana
basic_event<arg_unload> unload; basic_event<arg_unload> unload;
}; };
}//end namespace detail }//end namespace detail
namespace dev
{
template<typename Widget>
struct event_mapping
{
typedef general_events type;
};
}//end namespace dev
}//end namespace nana }//end namespace nana
#endif #endif

View File

@ -24,6 +24,17 @@ namespace nana
class drawer_trigger; class drawer_trigger;
class widget; class widget;
namespace dev
{
/// Traits for widget classes
template<typename Widget>
struct widget_traits
{
using event_type = ::nana::general_events;
using scheme_type = ::nana::widget_colors;
};
}
namespace API namespace API
{ {
void effects_edge_nimbus(window, effects::edge_nimbus); void effects_edge_nimbus(window, effects::edge_nimbus);
@ -76,13 +87,6 @@ namespace API
void exit(); void exit();
template<typename Scheme>
Scheme& get_scheme()
{
auto & brock = ::nana::detail::bedrock::instance();
return static_cast<Scheme&>(brock.get_scheme_template(::nana::detail::scheme_factory<Scheme>{}));
}
nana::string transform_shortkey_text(nana::string text, nana::string::value_type &shortkey, nana::string::size_type *skpos); nana::string transform_shortkey_text(nana::string text, nana::string::value_type &shortkey, nana::string::size_type *skpos);
bool register_shortkey(window, unsigned long); bool register_shortkey(window, unsigned long);
void unregister_shortkey(window); void unregister_shortkey(window);
@ -142,16 +146,16 @@ namespace API
bool set_parent_window(window, window new_parent); bool set_parent_window(window, window new_parent);
template<typename Widget=::nana::widget> template<typename Widget=::nana::widget>
typename ::nana::dev::event_mapping<Widget>::type & events(window wd) typename ::nana::dev::widget_traits<Widget>::event_type & events(window wd)
{ {
typedef typename ::nana::dev::event_mapping<Widget>::type event_type; using event_type = typename ::nana::dev::widget_traits<Widget>::event_type;
internal_scope_guard lock; internal_scope_guard lock;
auto * general_evt = detail::get_general_events(wd); auto * general_evt = detail::get_general_events(wd);
if (nullptr == general_evt) if (nullptr == general_evt)
throw std::invalid_argument("API::events(): bad parameter window handle, no events object or invalid window handle."); throw std::invalid_argument("API::events(): bad parameter window handle, no events object or invalid window handle.");
if (std::is_same<decltype(*general_evt), event_type>::value) if (std::is_same<::nana::general_events, event_type>::value)
return *static_cast<event_type*>(general_evt); return *static_cast<event_type*>(general_evt);
auto * widget_evt = dynamic_cast<event_type*>(general_evt); auto * widget_evt = dynamic_cast<event_type*>(general_evt);
@ -169,6 +173,25 @@ namespace API
void umake_event(event_handle); void umake_event(event_handle);
template<typename Widget = ::nana::widget>
typename ::nana::dev::widget_traits<Widget>::scheme_type & scheme(window wd)
{
using scheme_type = typename ::nana::dev::widget_traits<Widget>::scheme_type;
internal_scope_guard lock;
auto * wdg_colors = ::nana::dev::get_scheme(wd);
if (nullptr == wdg_colors)
throw std::invalid_argument("API::scheme(): bad parameter window handle, no events object or invalid window handle.");
if (std::is_same<::nana::widget_colors, scheme_type>::value)
return *static_cast<scheme_type*>(wdg_colors);
auto * comp_wdg_colors = dynamic_cast<scheme_type*>(wdg_colors);
if (nullptr == comp_wdg_colors)
throw std::invalid_argument("API::scheme(): bad template parameter Widget, the widget type and window handle do not match.");
return *comp_wdg_colors;
}
nana::point window_position(window); nana::point window_position(window);
void move_window(window, int x, int y); void move_window(window, int x, int y);
void move_window(window wd, const rectangle&); void move_window(window wd, const rectangle&);

View File

@ -22,8 +22,6 @@
namespace nana namespace nana
{ {
class drawer_trigger;
/// Abstract class for defining the capacity interface. /// Abstract class for defining the capacity interface.
class widget class widget
: nana::noncopyable, nana::nonmovable : nana::noncopyable, nana::nonmovable