Add widget_traits class
This commit is contained in:
		
							parent
							
								
									7b30855976
								
							
						
					
					
						commit
						bf35932bfb
					
				@ -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
 | 
			
		||||
 | 
			
		||||
@ -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&);
 | 
			
		||||
 | 
			
		||||
@ -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
 | 
			
		||||
	{
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user