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;
};
}//end namespace detail
namespace dev
{
template<typename Widget>
struct event_mapping
{
typedef general_events type;
};
}//end namespace dev
}//end namespace nana
#endif

View File

@ -24,6 +24,17 @@ namespace nana
class drawer_trigger;
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
{
void effects_edge_nimbus(window, effects::edge_nimbus);
@ -76,13 +87,6 @@ namespace API
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);
bool register_shortkey(window, unsigned long);
void unregister_shortkey(window);
@ -142,16 +146,16 @@ namespace API
bool set_parent_window(window, window new_parent);
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;
auto * general_evt = detail::get_general_events(wd);
if (nullptr == general_evt)
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);
auto * widget_evt = dynamic_cast<event_type*>(general_evt);
@ -169,6 +173,25 @@ namespace API
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);
void move_window(window, int x, int y);
void move_window(window wd, const rectangle&);

View File

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