From bf35932bfb65204ab4f4107b4d005876c3f27f12 Mon Sep 17 00:00:00 2001 From: cnjinhao Date: Fri, 16 Jan 2015 16:50:38 +0800 Subject: [PATCH] Add widget_traits class --- include/nana/gui/detail/general_events.hpp | 10 ----- include/nana/gui/programming_interface.hpp | 43 +++++++++++++++++----- include/nana/gui/widgets/widget.hpp | 4 +- 3 files changed, 34 insertions(+), 23 deletions(-) diff --git a/include/nana/gui/detail/general_events.hpp b/include/nana/gui/detail/general_events.hpp index 2d802b86..e95ebfc7 100644 --- a/include/nana/gui/detail/general_events.hpp +++ b/include/nana/gui/detail/general_events.hpp @@ -483,16 +483,6 @@ namespace nana basic_event unload; }; }//end namespace detail - - namespace dev - { - template - struct event_mapping - { - typedef general_events type; - }; - }//end namespace dev - }//end namespace nana #endif diff --git a/include/nana/gui/programming_interface.hpp b/include/nana/gui/programming_interface.hpp index 9bcf2842..44bf2287 100644 --- a/include/nana/gui/programming_interface.hpp +++ b/include/nana/gui/programming_interface.hpp @@ -24,6 +24,17 @@ namespace nana class drawer_trigger; class widget; + namespace dev + { + /// Traits for widget classes + template + 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 - Scheme& get_scheme() - { - auto & brock = ::nana::detail::bedrock::instance(); - return static_cast(brock.get_scheme_template(::nana::detail::scheme_factory{})); - } - 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 ::nana::dev::event_mapping::type & events(window wd) + typename ::nana::dev::widget_traits::event_type & events(window wd) { - typedef typename ::nana::dev::event_mapping::type event_type; + using event_type = typename ::nana::dev::widget_traits::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::value) + if (std::is_same<::nana::general_events, event_type>::value) return *static_cast(general_evt); auto * widget_evt = dynamic_cast(general_evt); @@ -169,6 +173,25 @@ namespace API void umake_event(event_handle); + template + typename ::nana::dev::widget_traits::scheme_type & scheme(window wd) + { + using scheme_type = typename ::nana::dev::widget_traits::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(wdg_colors); + + auto * comp_wdg_colors = dynamic_cast(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&); diff --git a/include/nana/gui/widgets/widget.hpp b/include/nana/gui/widgets/widget.hpp index bc1ba141..54dd39b9 100644 --- a/include/nana/gui/widgets/widget.hpp +++ b/include/nana/gui/widgets/widget.hpp @@ -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 {