Merge remote-tracking branch 'cnjinhao/develop-1.7' into cmake-dev
This commit is contained in:
		
						commit
						65d2440e26
					
				@ -211,10 +211,10 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#undef _nana_std_optional
 | 
					#undef _nana_std_optional
 | 
				
			||||||
#if ((defined(_MSC_VER) && (_MSC_VER >= 1912) && ((!defined(_MSVC_LANG)) || _MSVC_LANG < 201703))) ||	\
 | 
					#if ((defined(_MSC_VER) && ((!defined(_MSVC_LANG)) || _MSVC_LANG < 201703))) ||	\
 | 
				
			||||||
	((__cplusplus < 201703L) || \
 | 
						((!defined(_MSC_VER)) && ((__cplusplus < 201703L) || \
 | 
				
			||||||
		(defined(__clang__) && (__clang_major__ * 100 + __clang_minor__ < 400)) ||				\
 | 
							(defined(__clang__) && (__clang_major__ * 100 + __clang_minor__ < 400)) ||				\
 | 
				
			||||||
		(!defined(__clang__) && defined(__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__ < 701))	\
 | 
							(!defined(__clang__) && defined(__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__ < 701)))	\
 | 
				
			||||||
	)
 | 
						)
 | 
				
			||||||
#	define _nana_std_optional
 | 
					#	define _nana_std_optional
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
				
			|||||||
@ -1,7 +1,7 @@
 | 
				
			|||||||
/*
 | 
					/*
 | 
				
			||||||
 *	An Animation Implementation
 | 
					 *	An Animation Implementation
 | 
				
			||||||
 *	Nana C++ Library(http://www.nanapro.org)
 | 
					 *	Nana C++ Library(http://www.nanapro.org)
 | 
				
			||||||
 *	Copyright(C) 2003-2015 Jinhao(cnjinhao@hotmail.com)
 | 
					 *	Copyright(C) 2003-2018 Jinhao(cnjinhao@hotmail.com)
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 *	Distributed under the Boost Software License, Version 1.0.
 | 
					 *	Distributed under the Boost Software License, Version 1.0.
 | 
				
			||||||
 *	(See accompanying file LICENSE_1_0.txt or copy at
 | 
					 *	(See accompanying file LICENSE_1_0.txt or copy at
 | 
				
			||||||
@ -49,24 +49,18 @@ namespace nana
 | 
				
			|||||||
		
 | 
							
 | 
				
			||||||
		struct impl;
 | 
							struct impl;
 | 
				
			||||||
		class performance_manager;
 | 
							class performance_manager;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							/// Non-copyable
 | 
				
			||||||
 | 
							animation(const animation&) = delete;
 | 
				
			||||||
 | 
							animation& operator=(const animation&) = delete;
 | 
				
			||||||
	public:
 | 
						public:
 | 
				
			||||||
		animation(std::size_t fps = 23);
 | 
							animation(std::size_t fps = 23);
 | 
				
			||||||
		~animation();
 | 
							~animation();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		void push_back(frameset frms);
 | 
							animation(animation&&);
 | 
				
			||||||
		/*
 | 
							animation& operator=(animation&&);
 | 
				
			||||||
		void branch(const std::string& name, const frameset& frms)
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			impl_->branches[name].frames = frms;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
		void branch(const std::string& name, const frameset& frms, std::function<std::size_t(const std::string&, std::size_t, std::size_t&)> condition)
 | 
							void push_back(frameset frms);
 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			auto & br = impl_->branches[name];
 | 
					 | 
				
			||||||
			br.frames = frms;
 | 
					 | 
				
			||||||
			br.condition = condition;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		*/
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
		void looped(bool enable);       ///< Enables or disables the animation repeating playback.
 | 
							void looped(bool enable);       ///< Enables or disables the animation repeating playback.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -1,7 +1,7 @@
 | 
				
			|||||||
/*
 | 
					/*
 | 
				
			||||||
 *	A Menubar implementation
 | 
					 *	A Menubar implementation
 | 
				
			||||||
 *	Nana C++ Library(http://www.nanapro.org)
 | 
					 *	Nana C++ Library(http://www.nanapro.org)
 | 
				
			||||||
 *	Copyright(C) 2009-2017 Jinhao(cnjinhao@hotmail.com)
 | 
					 *	Copyright(C) 2009-2018 Jinhao(cnjinhao@hotmail.com)
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 *	Distributed under the Boost Software License, Version 1.0.
 | 
					 *	Distributed under the Boost Software License, Version 1.0.
 | 
				
			||||||
 *	(See accompanying file LICENSE_1_0.txt or copy at
 | 
					 *	(See accompanying file LICENSE_1_0.txt or copy at
 | 
				
			||||||
@ -34,26 +34,6 @@ namespace nana
 | 
				
			|||||||
				color_proxy border_highlight{ colors::highlight };
 | 
									color_proxy border_highlight{ colors::highlight };
 | 
				
			||||||
			};
 | 
								};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			class item_renderer
 | 
					 | 
				
			||||||
			{
 | 
					 | 
				
			||||||
			public:
 | 
					 | 
				
			||||||
				enum class state
 | 
					 | 
				
			||||||
				{
 | 
					 | 
				
			||||||
					normal, highlighted, selected
 | 
					 | 
				
			||||||
				};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
				using graph_reference = paint::graphics&;
 | 
					 | 
				
			||||||
				using scheme = ::nana::drawerbase::menubar::scheme;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
				item_renderer(window, graph_reference);
 | 
					 | 
				
			||||||
				virtual void background(const point&, const ::nana::size&, state);
 | 
					 | 
				
			||||||
				virtual void caption(const point&, const native_string_type&);
 | 
					 | 
				
			||||||
				scheme *scheme_ptr() const { return scheme_ptr_; };
 | 
					 | 
				
			||||||
			private:
 | 
					 | 
				
			||||||
				graph_reference graph_;
 | 
					 | 
				
			||||||
				scheme *scheme_ptr_;
 | 
					 | 
				
			||||||
			};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			class trigger
 | 
								class trigger
 | 
				
			||||||
				: public drawer_trigger
 | 
									: public drawer_trigger
 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
 | 
				
			|||||||
@ -87,13 +87,15 @@ namespace nana
 | 
				
			|||||||
			class trigger
 | 
								class trigger
 | 
				
			||||||
				:public drawer_trigger
 | 
									:public drawer_trigger
 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
				template<typename Renderer>
 | 
									//template<typename Renderer>
 | 
				
			||||||
				struct basic_implement;
 | 
									//struct basic_implement;	//deprecated
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				class item_renderer;
 | 
									class implementation;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									//class item_renderer;	//deprecated
 | 
				
			||||||
				class item_locator;
 | 
									class item_locator;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				typedef basic_implement<item_renderer> implement;
 | 
									//typedef basic_implement<item_renderer> implement;	//deprecated
 | 
				
			||||||
			public:
 | 
								public:
 | 
				
			||||||
				struct treebox_node_type
 | 
									struct treebox_node_type
 | 
				
			||||||
				{
 | 
									{
 | 
				
			||||||
@ -116,27 +118,30 @@ namespace nana
 | 
				
			|||||||
				trigger();
 | 
									trigger();
 | 
				
			||||||
				~trigger();
 | 
									~trigger();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				implement * impl() const;
 | 
									implementation * impl() const;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				void check(node_type*, checkstate);
 | 
									void check(node_type*, checkstate);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				void renderer(::nana::pat::cloneable<renderer_interface>&&);
 | 
									pat::cloneable<renderer_interface>& renderer() const;
 | 
				
			||||||
				const ::nana::pat::cloneable<renderer_interface>& renderer() const;
 | 
					
 | 
				
			||||||
 | 
									//void renderer(::nana::pat::cloneable<renderer_interface>&&);
 | 
				
			||||||
 | 
									//const ::nana::pat::cloneable<renderer_interface>& renderer() const;	//deprecated
 | 
				
			||||||
				void placer(::nana::pat::cloneable<compset_placer_interface>&&);
 | 
									void placer(::nana::pat::cloneable<compset_placer_interface>&&);
 | 
				
			||||||
				const ::nana::pat::cloneable<compset_placer_interface>& placer() const;
 | 
									const ::nana::pat::cloneable<compset_placer_interface>& placer() const;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				node_type* insert(node_type*, const std::string& key, std::string&&);
 | 
									node_type* insert(node_type*, const std::string& key, std::string&&);
 | 
				
			||||||
				node_type* insert(const std::string& path, std::string&&);
 | 
									node_type* insert(const std::string& path, std::string&&);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				node_type * selected() const;
 | 
									//node_type * selected() const;	//deprecated
 | 
				
			||||||
				void selected(node_type*);
 | 
									//void selected(node_type*);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				node_image_tag& icon(const ::std::string&) const;
 | 
									node_image_tag& icon(const ::std::string&);
 | 
				
			||||||
				void icon_erase(const ::std::string&);
 | 
									void icon_erase(const ::std::string&);
 | 
				
			||||||
				void node_icon(node_type*, const ::std::string& id);
 | 
									void node_icon(node_type*, const ::std::string& id);
 | 
				
			||||||
				unsigned node_width(const node_type*) const;
 | 
									unsigned node_width(const node_type*) const;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				bool rename(node_type*, const char* key, const char* name);
 | 
									bool rename(node_type*, const char* key, const char* name);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			private:
 | 
								private:
 | 
				
			||||||
				//Overrides drawer_trigger methods
 | 
									//Overrides drawer_trigger methods
 | 
				
			||||||
				void attached(widget_reference, graph_reference)		override;
 | 
									void attached(widget_reference, graph_reference)		override;
 | 
				
			||||||
@ -152,7 +157,7 @@ namespace nana
 | 
				
			|||||||
				void key_press(graph_reference, const arg_keyboard&)	override;
 | 
									void key_press(graph_reference, const arg_keyboard&)	override;
 | 
				
			||||||
				void key_char(graph_reference, const arg_keyboard&)	override;
 | 
									void key_char(graph_reference, const arg_keyboard&)	override;
 | 
				
			||||||
			private:
 | 
								private:
 | 
				
			||||||
				implement * const impl_;
 | 
									implementation * const impl_;
 | 
				
			||||||
			}; //end class trigger
 | 
								}; //end class trigger
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -171,11 +176,11 @@ namespace nana
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
				/// Append a child with a specified value (user object.).
 | 
									/// Append a child with a specified value (user object.).
 | 
				
			||||||
				template<typename T>
 | 
									template<typename T>
 | 
				
			||||||
				item_proxy append(const ::std::string& key, ::std::string name, const T&t)
 | 
									item_proxy append(const ::std::string& key, ::std::string name, T&& t)
 | 
				
			||||||
				{
 | 
									{
 | 
				
			||||||
					item_proxy ip = append(key, std::move(name));
 | 
										item_proxy ip = append(key, std::move(name));
 | 
				
			||||||
					if(false == ip.empty())
 | 
										if(false == ip.empty())
 | 
				
			||||||
						ip.value(t);
 | 
											ip.value(std::forward<T>(t));
 | 
				
			||||||
					return ip;
 | 
										return ip;
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -291,17 +296,19 @@ namespace nana
 | 
				
			|||||||
					return *p;
 | 
										return *p;
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									/*
 | 
				
			||||||
				template<typename T>
 | 
									template<typename T>
 | 
				
			||||||
				item_proxy & value(const T& t)
 | 
									item_proxy & value(const T& t)	//deprecated
 | 
				
			||||||
				{
 | 
									{
 | 
				
			||||||
					_m_value() = t;
 | 
										_m_value() = t;
 | 
				
			||||||
					return *this;
 | 
										return *this;
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
 | 
									*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				template<typename T>
 | 
									template<typename T>
 | 
				
			||||||
				item_proxy & value(T&& t)
 | 
									item_proxy & value(T&& t)
 | 
				
			||||||
				{
 | 
									{
 | 
				
			||||||
					_m_value() = std::move(t);
 | 
										_m_value() = std::forward<T>(t);
 | 
				
			||||||
					return *this;
 | 
										return *this;
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -378,7 +385,7 @@ namespace nana
 | 
				
			|||||||
		template<typename ItemRenderer>
 | 
							template<typename ItemRenderer>
 | 
				
			||||||
		treebox & renderer(const ItemRenderer & rd) ///< set user-defined node renderer
 | 
							treebox & renderer(const ItemRenderer & rd) ///< set user-defined node renderer
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			get_drawer_trigger().renderer(::nana::pat::cloneable<renderer_interface>(rd));
 | 
								get_drawer_trigger().renderer() = ::nana::pat::cloneable<renderer_interface>{rd};
 | 
				
			||||||
			return *this;
 | 
								return *this;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -403,6 +410,23 @@ namespace nana
 | 
				
			|||||||
		/// @param enable bool  whether to enable.
 | 
							/// @param enable bool  whether to enable.
 | 
				
			||||||
		void auto_draw(bool enable);
 | 
							void auto_draw(bool enable);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							/// Prevents drawing during execution.
 | 
				
			||||||
 | 
							template<typename Function>
 | 
				
			||||||
 | 
							void avoid_drawing(Function fn)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								this->auto_draw(false);
 | 
				
			||||||
 | 
								try
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									fn();
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								catch (...)
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									this->auto_draw(true);
 | 
				
			||||||
 | 
									throw;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								this->auto_draw(true);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		/// \brief  Enable the checkboxs for each item of the widget.
 | 
							/// \brief  Enable the checkboxs for each item of the widget.
 | 
				
			||||||
		/// @param enable bool  indicates whether to show or hide the checkboxs.
 | 
							/// @param enable bool  indicates whether to show or hide the checkboxs.
 | 
				
			||||||
		treebox & checkable(bool enable);
 | 
							treebox & checkable(bool enable);
 | 
				
			||||||
@ -419,8 +443,9 @@ namespace nana
 | 
				
			|||||||
        /// These states are 'normal', 'hovered' and 'expanded'. 
 | 
					        /// These states are 'normal', 'hovered' and 'expanded'. 
 | 
				
			||||||
        /// If 'hovered' or 'expanded' are not set, it uses 'normal' state image for these 2 states.
 | 
					        /// If 'hovered' or 'expanded' are not set, it uses 'normal' state image for these 2 states.
 | 
				
			||||||
        /// See also in [documentation](http://nanapro.org/en-us/help/widgets/treebox.htm)
 | 
					        /// See also in [documentation](http://nanapro.org/en-us/help/widgets/treebox.htm)
 | 
				
			||||||
		node_image_type& icon(const ::std::string& id ///< the name of an icon scheme. If the name is not existing, it creates a new scheme for the name.
 | 
							/// @param id The name of an icon scheme. If the name is not existing, it creates a new scheme for the name.
 | 
				
			||||||
                               ) const;
 | 
							/// @return The reference of node image scheme correspending with the specified id.
 | 
				
			||||||
 | 
							node_image_type& icon(const ::std::string& id);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		void icon_erase(const ::std::string& id);
 | 
							void icon_erase(const ::std::string& id);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -445,6 +470,19 @@ namespace nana
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
		item_proxy selected() const; ///< returns the selected node
 | 
							item_proxy selected() const; ///< returns the selected node
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							/// Scrolls a specified item into view.
 | 
				
			||||||
 | 
							/**
 | 
				
			||||||
 | 
							 * @param item An item to be requested.
 | 
				
			||||||
 | 
							 * @param bearing The position where the item to be positioned in the view.
 | 
				
			||||||
 | 
							 */
 | 
				
			||||||
 | 
							void scroll_into_view(item_proxy item, align_v bearing);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							/// Scrolls a specified item into view.
 | 
				
			||||||
 | 
							/**
 | 
				
			||||||
 | 
							 * @param item An item to be requested.
 | 
				
			||||||
 | 
							 */
 | 
				
			||||||
 | 
							void scroll_into_view(item_proxy item);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	private:
 | 
						private:
 | 
				
			||||||
		std::shared_ptr<scroll_operation_interface> _m_scroll_operation() override;
 | 
							std::shared_ptr<scroll_operation_interface> _m_scroll_operation() override;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -658,21 +658,31 @@ namespace detail
 | 
				
			|||||||
		platform_scope_guard lock;
 | 
							platform_scope_guard lock;
 | 
				
			||||||
		if(umake_owner(wd))
 | 
							if(umake_owner(wd))
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
 | 
								auto & wd_manager = detail::bedrock::instance().wd_manager();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								std::vector<native_window_type> owned_children;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			auto i = wincontext_.find(wd);
 | 
								auto i = wincontext_.find(wd);
 | 
				
			||||||
			if(i != wincontext_.end())
 | 
								if(i != wincontext_.end())
 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
				if(i->second.owned)
 | 
									if(i->second.owned)
 | 
				
			||||||
				{
 | 
									{
 | 
				
			||||||
					set_error_handler();
 | 
										for(auto child : *i->second.owned)
 | 
				
			||||||
					auto & wd_manager = detail::bedrock::instance().wd_manager();
 | 
											owned_children.push_back(child);
 | 
				
			||||||
					for(auto u = i->second.owned->rbegin(); u != i->second.owned->rend(); ++u)
 | 
					 | 
				
			||||||
						wd_manager.close(wd_manager.root(*u));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
					rev_error_handler();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
					delete i->second.owned;
 | 
					 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								//Closing a child will erase the wd from the table wincontext_, so the 
 | 
				
			||||||
 | 
								//iterator i can't be reused after children closed.
 | 
				
			||||||
 | 
								set_error_handler();
 | 
				
			||||||
 | 
								for(auto u = owned_children.rbegin(); u != owned_children.rend(); ++u)
 | 
				
			||||||
 | 
									wd_manager.close(wd_manager.root(*u));
 | 
				
			||||||
 | 
								rev_error_handler();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								i = wincontext_.find(wd);
 | 
				
			||||||
 | 
								if(i != wincontext_.end())
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									delete i->second.owned;
 | 
				
			||||||
				wincontext_.erase(i);
 | 
									wincontext_.erase(i);
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
				
			|||||||
@ -1,7 +1,7 @@
 | 
				
			|||||||
/*
 | 
					/*
 | 
				
			||||||
 *	An Animation Implementation
 | 
					 *	An Animation Implementation
 | 
				
			||||||
 *	Nana C++ Library(http://www.nanapro.org)
 | 
					 *	Nana C++ Library(http://www.nanapro.org)
 | 
				
			||||||
 *	Copyright(C) 2003-2015 Jinhao(cnjinhao@hotmail.com)
 | 
					 *	Copyright(C) 2003-2018 Jinhao(cnjinhao@hotmail.com)
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 *	Distributed under the Boost Software License, Version 1.0.
 | 
					 *	Distributed under the Boost Software License, Version 1.0.
 | 
				
			||||||
 *	(See accompanying file LICENSE_1_0.txt or copy at
 | 
					 *	(See accompanying file LICENSE_1_0.txt or copy at
 | 
				
			||||||
@ -571,6 +571,25 @@ namespace nana
 | 
				
			|||||||
			delete impl_;
 | 
								delete impl_;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							animation::animation(animation&& rhs)
 | 
				
			||||||
 | 
								: impl_(rhs.impl_)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								rhs.impl_ = new impl(23);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							animation& animation::operator=(animation&& rhs)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								if (this != &rhs)
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									auto imp = new impl{ 23 };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									delete impl_;
 | 
				
			||||||
 | 
									impl_ = rhs.impl_;
 | 
				
			||||||
 | 
									rhs.impl_ = imp;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								return *this;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		void animation::push_back(frameset frms)
 | 
							void animation::push_back(frameset frms)
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			impl_->framesets.emplace_back(std::move(frms));
 | 
								impl_->framesets.emplace_back(std::move(frms));
 | 
				
			||||||
 | 
				
			|||||||
@ -973,7 +973,12 @@ namespace detail
 | 
				
			|||||||
			case Expose:
 | 
								case Expose:
 | 
				
			||||||
				if(msgwnd->visible && (msgwnd->root_graph->empty() == false))
 | 
									if(msgwnd->visible && (msgwnd->root_graph->empty() == false))
 | 
				
			||||||
				{
 | 
									{
 | 
				
			||||||
					nana::detail::platform_scope_guard lock;
 | 
										nana::internal_scope_guard lock;
 | 
				
			||||||
 | 
										//Don't lock this scope using platform-scope-guard. Because it would cause the platform-scope-lock to be locked
 | 
				
			||||||
 | 
										//before the internal-scope-guard, and the order of locking would cause dead-lock.
 | 
				
			||||||
 | 
										//
 | 
				
			||||||
 | 
										//Locks this scope using internal-scope-guard is correct and safe. In the scope, the Xlib functions aren't called
 | 
				
			||||||
 | 
										//directly.
 | 
				
			||||||
					if(msgwnd->is_draw_through())
 | 
										if(msgwnd->is_draw_through())
 | 
				
			||||||
					{
 | 
										{
 | 
				
			||||||
						msgwnd->other.attribute.root->draw_through();
 | 
											msgwnd->other.attribute.root->draw_through();
 | 
				
			||||||
 | 
				
			|||||||
@ -371,6 +371,8 @@ namespace nana{
 | 
				
			|||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			Window parent = (owner ? reinterpret_cast<Window>(owner) : restrict::spec.root_window());
 | 
								Window parent = (owner ? reinterpret_cast<Window>(owner) : restrict::spec.root_window());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								//The position passed to XCreateWindow is a screen coordinate.
 | 
				
			||||||
			nana::point pos(r.x, r.y);
 | 
								nana::point pos(r.x, r.y);
 | 
				
			||||||
			if((false == nested) && owner)
 | 
								if((false == nested) && owner)
 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
@ -396,7 +398,9 @@ namespace nana{
 | 
				
			|||||||
				{
 | 
									{
 | 
				
			||||||
					auto origin_owner = (owner ? owner : reinterpret_cast<native_window_type>(restrict::spec.root_window()));
 | 
										auto origin_owner = (owner ? owner : reinterpret_cast<native_window_type>(restrict::spec.root_window()));
 | 
				
			||||||
					restrict::spec.make_owner(origin_owner, reinterpret_cast<native_window_type>(handle));
 | 
										restrict::spec.make_owner(origin_owner, reinterpret_cast<native_window_type>(handle));
 | 
				
			||||||
					exposed_positions[handle] = pos;
 | 
					
 | 
				
			||||||
 | 
										//The exposed_position is a relative position to its owner/parent.
 | 
				
			||||||
 | 
										exposed_positions[handle] = r.position();
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				XChangeWindowAttributes(disp, handle, attr_mask, &win_attr);
 | 
									XChangeWindowAttributes(disp, handle, attr_mask, &win_attr);
 | 
				
			||||||
@ -945,13 +949,14 @@ namespace nana{
 | 
				
			|||||||
				auto fm_extents = window_frame_extents(wd);
 | 
									auto fm_extents = window_frame_extents(wd);
 | 
				
			||||||
				origin.x = -fm_extents.left;
 | 
									origin.x = -fm_extents.left;
 | 
				
			||||||
				origin.y = -fm_extents.top;
 | 
									origin.y = -fm_extents.top;
 | 
				
			||||||
 | 
					#if 0	//deprecated
 | 
				
			||||||
				if(reinterpret_cast<Window>(coord_wd) != restrict::spec.root_window())
 | 
									if(reinterpret_cast<Window>(coord_wd) != restrict::spec.root_window())
 | 
				
			||||||
				{
 | 
									{
 | 
				
			||||||
					fm_extents = window_frame_extents(coord_wd);
 | 
										fm_extents = window_frame_extents(coord_wd);
 | 
				
			||||||
					origin.x += fm_extents.left;
 | 
										origin.x += fm_extents.left;
 | 
				
			||||||
					origin.y += fm_extents.top;
 | 
										origin.y += fm_extents.top;
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			else
 | 
								else
 | 
				
			||||||
				coord_wd = get_window(wd, window_relationship::parent);
 | 
									coord_wd = get_window(wd, window_relationship::parent);
 | 
				
			||||||
@ -1010,8 +1015,14 @@ namespace nana{
 | 
				
			|||||||
			if(owner && (owner != reinterpret_cast<native_window_type>(restrict::spec.root_window())))
 | 
								if(owner && (owner != reinterpret_cast<native_window_type>(restrict::spec.root_window())))
 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
				auto origin = window_position(owner);
 | 
									auto origin = window_position(owner);
 | 
				
			||||||
 | 
					#if 0
 | 
				
			||||||
				x += origin.x;
 | 
									x += origin.x;
 | 
				
			||||||
				y += origin.y;
 | 
									y += origin.y;
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
									auto owner_extents = window_frame_extents(owner);
 | 
				
			||||||
 | 
									x += origin.x + owner_extents.left;
 | 
				
			||||||
 | 
									y += origin.y + owner_extents.top;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			::XMoveWindow(disp, reinterpret_cast<Window>(wd), x, y);
 | 
								::XMoveWindow(disp, reinterpret_cast<Window>(wd), x, y);
 | 
				
			||||||
@ -1099,8 +1110,14 @@ namespace nana{
 | 
				
			|||||||
			if(owner && (owner != reinterpret_cast<native_window_type>(restrict::spec.root_window())))
 | 
								if(owner && (owner != reinterpret_cast<native_window_type>(restrict::spec.root_window())))
 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
				auto origin = window_position(owner);
 | 
									auto origin = window_position(owner);
 | 
				
			||||||
 | 
					#if 0
 | 
				
			||||||
				x += origin.x;
 | 
									x += origin.x;
 | 
				
			||||||
				y += origin.y;
 | 
									y += origin.y;
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
									auto owner_extents = window_frame_extents(owner);
 | 
				
			||||||
 | 
									x += origin.x + owner_extents.left;
 | 
				
			||||||
 | 
									y += origin.y + owner_extents.top;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			::XMoveResizeWindow(disp, reinterpret_cast<Window>(wd), x, y, r.width, r.height);
 | 
								::XMoveResizeWindow(disp, reinterpret_cast<Window>(wd), x, y, r.width, r.height);
 | 
				
			||||||
@ -1580,14 +1597,21 @@ namespace nana{
 | 
				
			|||||||
				pos.y = point.y;
 | 
									pos.y = point.y;
 | 
				
			||||||
				return true;
 | 
									return true;
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			return false;
 | 
					 | 
				
			||||||
#elif defined(NANA_X11)
 | 
					#elif defined(NANA_X11)
 | 
				
			||||||
			nana::detail::platform_scope_guard psg;
 | 
								nana::detail::platform_scope_guard psg;
 | 
				
			||||||
			int x = pos.x, y = pos.y;
 | 
								int x = pos.x, y = pos.y;
 | 
				
			||||||
			Window child;
 | 
								Window child;
 | 
				
			||||||
			return (True == ::XTranslateCoordinates(restrict::spec.open_display(),
 | 
								if(True == ::XTranslateCoordinates(restrict::spec.open_display(),
 | 
				
			||||||
													reinterpret_cast<Window>(wd), restrict::spec.root_window(), x, y, &pos.x, &pos.y, &child));
 | 
																		reinterpret_cast<Window>(wd), restrict::spec.root_window(), x, y, &pos.x, &pos.y, &child))
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									//deprecated
 | 
				
			||||||
 | 
									//auto fm_extents = window_frame_extents(wd);
 | 
				
			||||||
 | 
									//pos.x += fm_extents.left;
 | 
				
			||||||
 | 
									//pos.y += fm_extents.top;
 | 
				
			||||||
 | 
									return true;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
								return false;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		bool native_interface::calc_window_point(native_window_type wd, nana::point& pos)
 | 
							bool native_interface::calc_window_point(native_window_type wd, nana::point& pos)
 | 
				
			||||||
@ -1600,14 +1624,21 @@ namespace nana{
 | 
				
			|||||||
				pos.y = point.y;
 | 
									pos.y = point.y;
 | 
				
			||||||
				return true;
 | 
									return true;
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			return false;
 | 
					 | 
				
			||||||
#elif defined(NANA_X11)
 | 
					#elif defined(NANA_X11)
 | 
				
			||||||
			nana::detail::platform_scope_guard psg;
 | 
								nana::detail::platform_scope_guard psg;
 | 
				
			||||||
			int x = pos.x, y = pos.y;
 | 
								int x = pos.x, y = pos.y;
 | 
				
			||||||
			Window child;
 | 
								Window child;
 | 
				
			||||||
			return (True == ::XTranslateCoordinates(restrict::spec.open_display(),
 | 
								if(True == ::XTranslateCoordinates(restrict::spec.open_display(), restrict::spec.root_window(), reinterpret_cast<Window>(wd), x, y, &pos.x, &pos.y, &child))
 | 
				
			||||||
													restrict::spec.root_window(), reinterpret_cast<Window>(wd), x, y, &pos.x, &pos.y, &child));
 | 
								{
 | 
				
			||||||
 | 
									//deprecated
 | 
				
			||||||
 | 
									//Now the origin of pos is the left-top corner of the window(including titlebar and border)
 | 
				
			||||||
 | 
									//auto fm_extents = window_frame_extents(wd);
 | 
				
			||||||
 | 
									//pos.x += fm_extents.left;
 | 
				
			||||||
 | 
									//pos.y += fm_extents.top;
 | 
				
			||||||
 | 
									return true;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
								return false;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		native_window_type native_interface::find_window(int x, int y)
 | 
							native_window_type native_interface::find_window(int x, int y)
 | 
				
			||||||
 | 
				
			|||||||
@ -303,7 +303,7 @@ namespace nana
 | 
				
			|||||||
							extent_size.width = width_px;
 | 
												extent_size.width = width_px;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
						for (auto & vsline : rs.vslines)
 | 
											for (auto & vsline : rs.vslines)
 | 
				
			||||||
							extent_size.height += vsline.extent_height_px;
 | 
												extent_size.height += static_cast<size::value_type>(vsline.extent_height_px);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
						content_lines.emplace_back(std::move(rs.vslines));
 | 
											content_lines.emplace_back(std::move(rs.vslines));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -311,7 +311,8 @@ namespace nana
 | 
				
			|||||||
							break;
 | 
												break;
 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
					if (allowed_width_px < extent_size.width)
 | 
										//The width is not restricted if the allowed_width_px is zero.
 | 
				
			||||||
 | 
										if (allowed_width_px && (allowed_width_px < extent_size.width))
 | 
				
			||||||
						extent_size.width = allowed_width_px;
 | 
											extent_size.width = allowed_width_px;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
					if (transient_.current_font != pre_font)
 | 
										if (transient_.current_font != pre_font)
 | 
				
			||||||
@ -445,6 +446,10 @@ namespace nana
 | 
				
			|||||||
								unsigned sub_text_px = 0;
 | 
													unsigned sub_text_px = 0;
 | 
				
			||||||
								auto sub_text_len = _m_fit_text(graph, data->text().substr(text_begin), rs.allowed_width, sub_text_px);
 | 
													auto sub_text_len = _m_fit_text(graph, data->text().substr(text_begin), rs.allowed_width, sub_text_px);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
													//At least one character must be displayed no matter whether the width is enough or not.
 | 
				
			||||||
 | 
													if (0 == sub_text_len)
 | 
				
			||||||
 | 
														sub_text_len = 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
								if (text_begin + sub_text_len < data->text().size())
 | 
													if (text_begin + sub_text_len < data->text().size())
 | 
				
			||||||
								{
 | 
													{
 | 
				
			||||||
									//make a new visual line
 | 
														//make a new visual line
 | 
				
			||||||
@ -886,7 +891,8 @@ namespace nana
 | 
				
			|||||||
			if(graph_ptr->empty())
 | 
								if(graph_ptr->empty())
 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
				graph_ptr = &substitute;
 | 
									graph_ptr = &substitute;
 | 
				
			||||||
				graph_ptr->make({ 10, 10 });
 | 
									substitute.make({ 10, 10 });
 | 
				
			||||||
 | 
									substitute.typeface(this->typeface());
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			return impl->renderer.measure(*graph_ptr, limited, impl->text_align, impl->text_align_v);
 | 
								return impl->renderer.measure(*graph_ptr, limited, impl->text_align, impl->text_align_v);
 | 
				
			||||||
 | 
				
			|||||||
@ -1,7 +1,7 @@
 | 
				
			|||||||
/*
 | 
					/*
 | 
				
			||||||
*	A Menubar implementation
 | 
					*	A Menubar implementation
 | 
				
			||||||
*	Nana C++ Library(http://www.nanapro.org)
 | 
					*	Nana C++ Library(http://www.nanapro.org)
 | 
				
			||||||
*	Copyright(C) 2009-2017 Jinhao(cnjinhao@hotmail.com)
 | 
					*	Copyright(C) 2009-2018 Jinhao(cnjinhao@hotmail.com)
 | 
				
			||||||
*
 | 
					*
 | 
				
			||||||
*	Distributed under the Boost Software License, Version 1.0.
 | 
					*	Distributed under the Boost Software License, Version 1.0.
 | 
				
			||||||
*	(See accompanying file LICENSE_1_0.txt or copy at
 | 
					*	(See accompanying file LICENSE_1_0.txt or copy at
 | 
				
			||||||
@ -215,12 +215,32 @@ namespace nana
 | 
				
			|||||||
			};
 | 
								};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			//class item_renderer
 | 
								//class item_renderer
 | 
				
			||||||
				item_renderer::item_renderer(window wd, graph_reference graph)
 | 
								class item_renderer
 | 
				
			||||||
					:graph_(graph), scheme_ptr_(static_cast<scheme*>(API::dev::get_scheme(wd)))
 | 
								{
 | 
				
			||||||
				{}
 | 
								public:
 | 
				
			||||||
 | 
									enum class state
 | 
				
			||||||
				void item_renderer::background(const nana::point& pos, const nana::size& size, state item_state)
 | 
					 | 
				
			||||||
				{
 | 
									{
 | 
				
			||||||
 | 
										normal, highlighted, selected
 | 
				
			||||||
 | 
									};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									using graph_reference = paint::graphics&;
 | 
				
			||||||
 | 
									using scheme = ::nana::drawerbase::menubar::scheme;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									item_renderer(window, graph_reference);
 | 
				
			||||||
 | 
									virtual void background(const point&, const ::nana::size&, state);
 | 
				
			||||||
 | 
									virtual void caption(const point&, const native_string_type&);
 | 
				
			||||||
 | 
									scheme *scheme_ptr() const { return scheme_ptr_; };
 | 
				
			||||||
 | 
								private:
 | 
				
			||||||
 | 
									graph_reference graph_;
 | 
				
			||||||
 | 
									scheme *scheme_ptr_;
 | 
				
			||||||
 | 
								};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								item_renderer::item_renderer(window wd, graph_reference graph)
 | 
				
			||||||
 | 
									:graph_(graph), scheme_ptr_(static_cast<scheme*>(API::dev::get_scheme(wd)))
 | 
				
			||||||
 | 
								{}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								void item_renderer::background(const nana::point& pos, const nana::size& size, state item_state)
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
					auto bground = scheme_ptr_->text_fgcolor;
 | 
										auto bground = scheme_ptr_->text_fgcolor;
 | 
				
			||||||
					::nana::color border, body;
 | 
										::nana::color border, body;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -245,13 +265,12 @@ namespace nana
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
					paint::draw{ graph_ }.corner(r, 1);
 | 
										paint::draw{ graph_ }.corner(r, 1);
 | 
				
			||||||
					graph_.rectangle(r.pare_off(1), true, body);
 | 
										graph_.rectangle(r.pare_off(1), true, body);
 | 
				
			||||||
				}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				void item_renderer::caption(const point& pos, const native_string_type& text)
 | 
								void item_renderer::caption(const point& pos, const native_string_type& text)
 | 
				
			||||||
				{
 | 
								{
 | 
				
			||||||
					graph_.string(pos, text, scheme_ptr_->text_fgcolor);
 | 
									graph_.string(pos, text, scheme_ptr_->text_fgcolor);
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			//end class item_renderer
 | 
								//end class item_renderer
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			//class trigger
 | 
								//class trigger
 | 
				
			||||||
 | 
				
			|||||||
@ -180,13 +180,13 @@ namespace nana
 | 
				
			|||||||
				}
 | 
									}
 | 
				
			||||||
			};//end class tooltip_window
 | 
								};//end class tooltip_window
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			//item_locator should be defined before the definition of basic_implement
 | 
								//item_locator should be defined before the definition of implementation
 | 
				
			||||||
			class trigger::item_locator
 | 
								class trigger::item_locator
 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
			public:
 | 
								public:
 | 
				
			||||||
				using node_type = tree_cont_type::node_type;
 | 
									using node_type = tree_cont_type::node_type;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				item_locator(implement * impl, int item_pos, int x, int y);
 | 
									item_locator(implementation * impl, int item_pos, int x, int y);
 | 
				
			||||||
				int operator()(node_type &node, int affect);
 | 
									int operator()(node_type &node, int affect);
 | 
				
			||||||
				node_type * node() const;
 | 
									node_type * node() const;
 | 
				
			||||||
				component what() const;
 | 
									component what() const;
 | 
				
			||||||
@ -194,7 +194,7 @@ namespace nana
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
				nana::rectangle text_pos() const;
 | 
									nana::rectangle text_pos() const;
 | 
				
			||||||
			private:
 | 
								private:
 | 
				
			||||||
				trigger::implement * impl_;
 | 
									implementation * const impl_;
 | 
				
			||||||
				nana::point item_pos_;
 | 
									nana::point item_pos_;
 | 
				
			||||||
				const nana::point pos_;		//Mouse pointer position
 | 
									const nana::point pos_;		//Mouse pointer position
 | 
				
			||||||
				component	what_;
 | 
									component	what_;
 | 
				
			||||||
@ -212,11 +212,89 @@ namespace nana
 | 
				
			|||||||
				}
 | 
									}
 | 
				
			||||||
			};
 | 
								};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			//struct implement
 | 
								//struct implementation
 | 
				
			||||||
			//@brief:	some data for treebox trigger
 | 
								//@brief:	some data for treebox trigger
 | 
				
			||||||
			template<typename Renderer>
 | 
								class trigger::implementation
 | 
				
			||||||
			struct trigger::basic_implement
 | 
					 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
 | 
									class item_rendering_director
 | 
				
			||||||
 | 
										: public compset_interface
 | 
				
			||||||
 | 
									{
 | 
				
			||||||
 | 
									public:
 | 
				
			||||||
 | 
										using node_type = tree_cont_type::node_type;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
										item_rendering_director(implementation * impl, const nana::point& pos):
 | 
				
			||||||
 | 
											impl_(impl),
 | 
				
			||||||
 | 
											pos_(pos)
 | 
				
			||||||
 | 
										{
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
										//affect
 | 
				
			||||||
 | 
										//0 = Sibling, the last is a sibling of node
 | 
				
			||||||
 | 
										//1 = Owner, the last is the owner of node
 | 
				
			||||||
 | 
										//>=2 = Children, the last is a child of a node that before this node.
 | 
				
			||||||
 | 
										int operator()(const node_type& node, int affect)
 | 
				
			||||||
 | 
										{
 | 
				
			||||||
 | 
											iterated_node_ = &node;
 | 
				
			||||||
 | 
											switch (affect)
 | 
				
			||||||
 | 
											{
 | 
				
			||||||
 | 
											case 1:
 | 
				
			||||||
 | 
												pos_.x += impl_->shape.indent_pixels;
 | 
				
			||||||
 | 
												break;
 | 
				
			||||||
 | 
											default:
 | 
				
			||||||
 | 
												if (affect >= 2)
 | 
				
			||||||
 | 
													pos_.x -= impl_->shape.indent_pixels * (affect - 1);
 | 
				
			||||||
 | 
											}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
											auto & comp_placer = impl_->data.comp_placer;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
											impl_->assign_node_attr(node_attr_, iterated_node_);
 | 
				
			||||||
 | 
											node_r_.x = node_r_.y = 0;
 | 
				
			||||||
 | 
											node_r_.width = comp_placer->item_width(*impl_->data.graph, node_attr_);
 | 
				
			||||||
 | 
											node_r_.height = comp_placer->item_height(*impl_->data.graph);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
											auto renderer = impl_->data.renderer;
 | 
				
			||||||
 | 
											renderer->begin_paint(*impl_->data.widget_ptr);
 | 
				
			||||||
 | 
											renderer->bground(*impl_->data.graph, this);
 | 
				
			||||||
 | 
											renderer->expander(*impl_->data.graph, this);
 | 
				
			||||||
 | 
											renderer->crook(*impl_->data.graph, this);
 | 
				
			||||||
 | 
											renderer->icon(*impl_->data.graph, this);
 | 
				
			||||||
 | 
											renderer->text(*impl_->data.graph, this);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
											pos_.y += node_r_.height;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
											if (pos_.y > static_cast<int>(impl_->data.graph->height()))
 | 
				
			||||||
 | 
												return 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
											return (node.child && node.value.second.expanded ? 1 : 2);
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
									private:
 | 
				
			||||||
 | 
										//Overrides compset_interface
 | 
				
			||||||
 | 
										virtual const item_attribute_t& item_attribute() const override
 | 
				
			||||||
 | 
										{
 | 
				
			||||||
 | 
											return node_attr_;
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
										virtual bool comp_attribute(component_t comp, comp_attribute_t& attr) const override
 | 
				
			||||||
 | 
										{
 | 
				
			||||||
 | 
											attr.area = node_r_;
 | 
				
			||||||
 | 
											if (impl_->data.comp_placer->locate(comp, node_attr_, &attr.area))
 | 
				
			||||||
 | 
											{
 | 
				
			||||||
 | 
												attr.mouse_pointed = node_attr_.mouse_pointed;
 | 
				
			||||||
 | 
												attr.area.x += pos_.x;
 | 
				
			||||||
 | 
												attr.area.y += pos_.y;
 | 
				
			||||||
 | 
												return true;
 | 
				
			||||||
 | 
											}
 | 
				
			||||||
 | 
											return false;
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
									private:
 | 
				
			||||||
 | 
										implementation * const impl_;
 | 
				
			||||||
 | 
										::nana::point pos_;
 | 
				
			||||||
 | 
										const node_type * iterated_node_;
 | 
				
			||||||
 | 
										item_attribute_t node_attr_;
 | 
				
			||||||
 | 
										::nana::rectangle node_r_;
 | 
				
			||||||
 | 
									};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								public:
 | 
				
			||||||
				using node_type = trigger::node_type;
 | 
									using node_type = trigger::node_type;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				struct rep_tag
 | 
									struct rep_tag
 | 
				
			||||||
@ -271,7 +349,7 @@ namespace nana
 | 
				
			|||||||
					nana::timer timer;
 | 
										nana::timer timer;
 | 
				
			||||||
				}adjust;
 | 
									}adjust;
 | 
				
			||||||
			public:
 | 
								public:
 | 
				
			||||||
				basic_implement()
 | 
									implementation()
 | 
				
			||||||
				{
 | 
									{
 | 
				
			||||||
					data.graph			= nullptr;
 | 
										data.graph			= nullptr;
 | 
				
			||||||
					data.widget_ptr		= nullptr;
 | 
										data.widget_ptr		= nullptr;
 | 
				
			||||||
@ -353,6 +431,11 @@ namespace nana
 | 
				
			|||||||
					return true;
 | 
										return true;
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									static constexpr unsigned margin_top_bottom()
 | 
				
			||||||
 | 
									{
 | 
				
			||||||
 | 
										return 1;
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				bool draw(bool reset_scroll, bool ignore_update = false, bool ignore_auto_draw = false)
 | 
									bool draw(bool reset_scroll, bool ignore_update = false, bool ignore_auto_draw = false)
 | 
				
			||||||
				{
 | 
									{
 | 
				
			||||||
					if(data.graph && (false == data.stop_drawing))
 | 
										if(data.graph && (false == data.stop_drawing))
 | 
				
			||||||
@ -368,7 +451,7 @@ namespace nana
 | 
				
			|||||||
								data.graph->rectangle(true, data.widget_ptr->bgcolor());
 | 
													data.graph->rectangle(true, data.widget_ptr->bgcolor());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							//Draw tree
 | 
												//Draw tree
 | 
				
			||||||
							attr.tree_cont.for_each(shape.first, Renderer(this, nana::point(static_cast<int>(attr.tree_cont.indent_size(shape.first) * shape.indent_pixels) - shape.offset_x, 1)));
 | 
												attr.tree_cont.for_each(shape.first, item_rendering_director(this, nana::point(static_cast<int>(attr.tree_cont.indent_size(shape.first) * shape.indent_pixels) - shape.offset_x, margin_top_bottom())));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							if (!ignore_update)
 | 
												if (!ignore_update)
 | 
				
			||||||
								API::update_window(data.widget_ptr->handle());
 | 
													API::update_window(data.widget_ptr->handle());
 | 
				
			||||||
@ -460,6 +543,129 @@ namespace nana
 | 
				
			|||||||
					return nullptr;
 | 
										return nullptr;
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									node_type* last(bool ignore_folded_children) const
 | 
				
			||||||
 | 
									{
 | 
				
			||||||
 | 
										auto p = attr.tree_cont.get_root();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
										while (true)
 | 
				
			||||||
 | 
										{
 | 
				
			||||||
 | 
											while (p->next)
 | 
				
			||||||
 | 
												p = p->next;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
											if (p->child)
 | 
				
			||||||
 | 
											{
 | 
				
			||||||
 | 
												if (p->value.second.expanded || !ignore_folded_children)
 | 
				
			||||||
 | 
												{
 | 
				
			||||||
 | 
													p = p->child;
 | 
				
			||||||
 | 
													continue;
 | 
				
			||||||
 | 
												}
 | 
				
			||||||
 | 
											}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
											break;
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
										return p;
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									std::size_t screen_capacity(bool completed) const
 | 
				
			||||||
 | 
									{
 | 
				
			||||||
 | 
										auto const item_px = data.comp_placer->item_height(*data.graph);
 | 
				
			||||||
 | 
										auto screen_px = data.graph->size().height - (margin_top_bottom() << 1);
 | 
				
			||||||
 | 
										
 | 
				
			||||||
 | 
										if (completed || ((screen_px % item_px) == 0))
 | 
				
			||||||
 | 
											return screen_px / item_px;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
										return screen_px / item_px + 1;
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									bool scroll_into_view(node_type* node, bool use_bearing, align_v bearing)
 | 
				
			||||||
 | 
									{
 | 
				
			||||||
 | 
										auto & tree = attr.tree_cont;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
										auto parent = node->owner;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
										std::vector<node_type*> parent_path;
 | 
				
			||||||
 | 
										while (parent)
 | 
				
			||||||
 | 
										{
 | 
				
			||||||
 | 
											parent_path.push_back(parent);
 | 
				
			||||||
 | 
											parent = parent->owner;
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
										bool has_expanded = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
										//Expands the shrinked nodes which are ancestors of node
 | 
				
			||||||
 | 
										for (auto i = parent_path.rbegin(); i != parent_path.rend(); ++i)
 | 
				
			||||||
 | 
										{
 | 
				
			||||||
 | 
											if (!(*i)->value.second.expanded)
 | 
				
			||||||
 | 
											{
 | 
				
			||||||
 | 
												has_expanded = true;
 | 
				
			||||||
 | 
												(*i)->value.second.expanded = true;
 | 
				
			||||||
 | 
												item_proxy iprx(data.trigger_ptr, *i);
 | 
				
			||||||
 | 
												data.widget_ptr->events().expanded.emit(::nana::arg_treebox{ *data.widget_ptr, iprx, true }, data.widget_ptr->handle());
 | 
				
			||||||
 | 
											}
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
										auto pos = tree.distance_if(node, pred_allow_child{});
 | 
				
			||||||
 | 
										auto last_pos = tree.distance_if(last(true), pred_allow_child{});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
										auto const capacity = screen_capacity(true);
 | 
				
			||||||
 | 
										auto const item_px = data.comp_placer->item_height(*data.graph);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
										//If use_bearing is false, it calculates a bearing depending on the current
 | 
				
			||||||
 | 
										//position of the requested item.
 | 
				
			||||||
 | 
										if (!use_bearing)
 | 
				
			||||||
 | 
										{
 | 
				
			||||||
 | 
											auto first_pos = tree.distance_if(shape.first, pred_allow_child{});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
											if (pos < first_pos)
 | 
				
			||||||
 | 
												bearing = align_v::top;
 | 
				
			||||||
 | 
											else if (pos >= first_pos + capacity)
 | 
				
			||||||
 | 
												bearing = align_v::bottom;
 | 
				
			||||||
 | 
											else
 | 
				
			||||||
 | 
											{
 | 
				
			||||||
 | 
												//The item is already in the view.
 | 
				
			||||||
 | 
												//Returns true if a draw operation is needed
 | 
				
			||||||
 | 
												return has_expanded;
 | 
				
			||||||
 | 
											}
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
										if (align_v::top == bearing)
 | 
				
			||||||
 | 
										{
 | 
				
			||||||
 | 
											if (last_pos - pos + 1 < capacity)
 | 
				
			||||||
 | 
											{
 | 
				
			||||||
 | 
												if (last_pos + 1 >= capacity)
 | 
				
			||||||
 | 
													pos = last_pos + 1 - capacity;
 | 
				
			||||||
 | 
												else
 | 
				
			||||||
 | 
													pos = 0;
 | 
				
			||||||
 | 
											}
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
										else if (align_v::center == bearing)
 | 
				
			||||||
 | 
										{
 | 
				
			||||||
 | 
											auto const short_side = (std::min)(pos, last_pos - pos);
 | 
				
			||||||
 | 
											if (short_side >= capacity / 2)
 | 
				
			||||||
 | 
												pos -= capacity / 2;
 | 
				
			||||||
 | 
											else if (short_side == pos || (last_pos + 1 < capacity))
 | 
				
			||||||
 | 
												pos = 0;
 | 
				
			||||||
 | 
											else
 | 
				
			||||||
 | 
												pos = last_pos + 1 - capacity;
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
										else if (align_v::bottom == bearing)
 | 
				
			||||||
 | 
										{
 | 
				
			||||||
 | 
											if (pos + 1 >= capacity)
 | 
				
			||||||
 | 
												pos = pos + 1 - capacity;
 | 
				
			||||||
 | 
											else
 | 
				
			||||||
 | 
												pos = 0;
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
										auto prv_first = shape.first;
 | 
				
			||||||
 | 
										shape.first = attr.tree_cont.advance_if(nullptr, pos, drawerbase::treebox::pred_allow_child{});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
										//Update the position of scroll
 | 
				
			||||||
 | 
										show_scroll();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
										return has_expanded || (prv_first != shape.first);
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				bool make_adjust(node_type * node, int reason)
 | 
									bool make_adjust(node_type * node, int reason)
 | 
				
			||||||
				{
 | 
									{
 | 
				
			||||||
					if(!node) return false;
 | 
										if(!node) return false;
 | 
				
			||||||
@ -1356,7 +1562,7 @@ namespace nana
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			//class trigger::item_locator
 | 
								//class trigger::item_locator
 | 
				
			||||||
				trigger::item_locator::item_locator(implement * impl, int item_pos, int x, int y)
 | 
									trigger::item_locator::item_locator(implementation * impl, int item_pos, int x, int y)
 | 
				
			||||||
					:	impl_(impl),
 | 
										:	impl_(impl),
 | 
				
			||||||
						item_pos_(item_pos, 1),
 | 
											item_pos_(item_pos, 1),
 | 
				
			||||||
						pos_(x, y),
 | 
											pos_(x, y),
 | 
				
			||||||
@ -1439,86 +1645,6 @@ namespace nana
 | 
				
			|||||||
					return{node_text_r_.x + item_pos_.x, node_text_r_.y + item_pos_.y, node_text_r_.width, node_text_r_.height};
 | 
										return{node_text_r_.x + item_pos_.x, node_text_r_.y + item_pos_.y, node_text_r_.width, node_text_r_.height};
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			//end class item_locator
 | 
								//end class item_locator
 | 
				
			||||||
 | 
					 | 
				
			||||||
			class trigger::item_renderer
 | 
					 | 
				
			||||||
				: public compset_interface
 | 
					 | 
				
			||||||
			{
 | 
					 | 
				
			||||||
			public:
 | 
					 | 
				
			||||||
				typedef tree_cont_type::node_type node_type;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
				item_renderer(implement * impl, const nana::point& pos)
 | 
					 | 
				
			||||||
					:	impl_(impl),
 | 
					 | 
				
			||||||
						pos_(pos)
 | 
					 | 
				
			||||||
				{
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
				//affect
 | 
					 | 
				
			||||||
				//0 = Sibling, the last is a sibling of node
 | 
					 | 
				
			||||||
				//1 = Owner, the last is the owner of node
 | 
					 | 
				
			||||||
				//>=2 = Children, the last is a child of a node that before this node.
 | 
					 | 
				
			||||||
				int operator()(const node_type& node, int affect)
 | 
					 | 
				
			||||||
				{
 | 
					 | 
				
			||||||
					implement * draw_impl = impl_;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
					iterated_node_ = &node;
 | 
					 | 
				
			||||||
					switch(affect)
 | 
					 | 
				
			||||||
					{
 | 
					 | 
				
			||||||
					case 1:
 | 
					 | 
				
			||||||
						pos_.x += draw_impl->shape.indent_pixels;
 | 
					 | 
				
			||||||
						break;
 | 
					 | 
				
			||||||
					default:
 | 
					 | 
				
			||||||
						if(affect >= 2)
 | 
					 | 
				
			||||||
							pos_.x -= draw_impl->shape.indent_pixels * (affect - 1);
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
					auto & comp_placer = impl_->data.comp_placer;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
					impl_->assign_node_attr(node_attr_, iterated_node_);
 | 
					 | 
				
			||||||
					node_r_.x = node_r_.y = 0;
 | 
					 | 
				
			||||||
					node_r_.width = comp_placer->item_width(*impl_->data.graph, node_attr_);
 | 
					 | 
				
			||||||
					node_r_.height = comp_placer->item_height(*impl_->data.graph);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
					auto renderer = draw_impl->data.renderer;
 | 
					 | 
				
			||||||
					renderer->begin_paint(*draw_impl->data.widget_ptr);
 | 
					 | 
				
			||||||
					renderer->bground(*draw_impl->data.graph, this);
 | 
					 | 
				
			||||||
					renderer->expander(*draw_impl->data.graph, this);
 | 
					 | 
				
			||||||
					renderer->crook(*draw_impl->data.graph, this);
 | 
					 | 
				
			||||||
					renderer->icon(*draw_impl->data.graph, this);
 | 
					 | 
				
			||||||
					renderer->text(*draw_impl->data.graph, this);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
					pos_.y += node_r_.height;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
					if(pos_.y > static_cast<int>(draw_impl->data.graph->height()))
 | 
					 | 
				
			||||||
						return 0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
					return (node.child && node.value.second.expanded ? 1 : 2);
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			private:
 | 
					 | 
				
			||||||
				//Overrides compset_interface
 | 
					 | 
				
			||||||
				virtual const item_attribute_t& item_attribute() const override
 | 
					 | 
				
			||||||
				{
 | 
					 | 
				
			||||||
					return node_attr_;
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
				virtual bool comp_attribute(component_t comp, comp_attribute_t& attr) const override
 | 
					 | 
				
			||||||
				{
 | 
					 | 
				
			||||||
					attr.area = node_r_;
 | 
					 | 
				
			||||||
					if (impl_->data.comp_placer->locate(comp, node_attr_, &attr.area))
 | 
					 | 
				
			||||||
					{
 | 
					 | 
				
			||||||
						attr.mouse_pointed = node_attr_.mouse_pointed;
 | 
					 | 
				
			||||||
						attr.area.x += pos_.x;
 | 
					 | 
				
			||||||
						attr.area.y += pos_.y;
 | 
					 | 
				
			||||||
						return true;
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
					return false;
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			private:
 | 
					 | 
				
			||||||
				trigger::implement * impl_;
 | 
					 | 
				
			||||||
				::nana::point pos_;
 | 
					 | 
				
			||||||
				const node_type * iterated_node_;
 | 
					 | 
				
			||||||
				item_attribute_t node_attr_;
 | 
					 | 
				
			||||||
				::nana::rectangle node_r_;
 | 
					 | 
				
			||||||
			};
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		//Treebox Implementation
 | 
							//Treebox Implementation
 | 
				
			||||||
@ -1548,7 +1674,7 @@ namespace nana
 | 
				
			|||||||
				//end struct treebox_node_type
 | 
									//end struct treebox_node_type
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				trigger::trigger()
 | 
									trigger::trigger()
 | 
				
			||||||
					:	impl_(new implement)
 | 
										:	impl_(new implementation)
 | 
				
			||||||
				{
 | 
									{
 | 
				
			||||||
					impl_->data.trigger_ptr = this;
 | 
										impl_->data.trigger_ptr = this;
 | 
				
			||||||
					impl_->data.renderer = nana::pat::cloneable<renderer_interface>(internal_renderer());
 | 
										impl_->data.renderer = nana::pat::cloneable<renderer_interface>(internal_renderer());
 | 
				
			||||||
@ -1615,7 +1741,7 @@ namespace nana
 | 
				
			|||||||
					delete impl_;
 | 
										delete impl_;
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				trigger::implement * trigger::impl() const
 | 
									trigger::implementation * trigger::impl() const
 | 
				
			||||||
				{
 | 
									{
 | 
				
			||||||
					return impl_;
 | 
										return impl_;
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
@ -1687,6 +1813,7 @@ namespace nana
 | 
				
			|||||||
					}
 | 
										}
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									/*	//deprecated
 | 
				
			||||||
				void trigger::renderer(::nana::pat::cloneable<renderer_interface>&& r)
 | 
									void trigger::renderer(::nana::pat::cloneable<renderer_interface>&& r)
 | 
				
			||||||
				{
 | 
									{
 | 
				
			||||||
					impl_->data.renderer = std::move(r);
 | 
										impl_->data.renderer = std::move(r);
 | 
				
			||||||
@ -1696,6 +1823,12 @@ namespace nana
 | 
				
			|||||||
				{
 | 
									{
 | 
				
			||||||
					return impl_->data.renderer;
 | 
										return impl_->data.renderer;
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
 | 
									*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									::nana::pat::cloneable<renderer_interface>& trigger::renderer() const
 | 
				
			||||||
 | 
									{
 | 
				
			||||||
 | 
										return impl_->data.renderer;
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				void trigger::placer(::nana::pat::cloneable<compset_placer_interface>&& r)
 | 
									void trigger::placer(::nana::pat::cloneable<compset_placer_interface>&& r)
 | 
				
			||||||
				{
 | 
									{
 | 
				
			||||||
@ -1729,18 +1862,22 @@ namespace nana
 | 
				
			|||||||
					return x;
 | 
										return x;
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				trigger::node_type* trigger::selected() const
 | 
									/*
 | 
				
			||||||
 | 
									trigger::node_type* trigger::selected() const	//deprecated
 | 
				
			||||||
				{
 | 
									{
 | 
				
			||||||
					return impl_->node_state.selected;
 | 
										return impl_->node_state.selected;
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
 | 
									*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				void trigger::selected(node_type* node)
 | 
									/*
 | 
				
			||||||
 | 
									void trigger::selected(node_type* node)	//deprecated
 | 
				
			||||||
				{
 | 
									{
 | 
				
			||||||
					if(impl_->attr.tree_cont.verify(node) && impl_->set_selected(node))
 | 
										if(impl_->attr.tree_cont.verify(node) && impl_->set_selected(node))
 | 
				
			||||||
						impl_->draw(true);
 | 
											impl_->draw(true);
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
 | 
									*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				node_image_tag& trigger::icon(const std::string& id) const
 | 
									node_image_tag& trigger::icon(const std::string& id)
 | 
				
			||||||
				{
 | 
									{
 | 
				
			||||||
					auto i = impl_->shape.image_table.find(id);
 | 
										auto i = impl_->shape.image_table.find(id);
 | 
				
			||||||
					if(i != impl_->shape.image_table.end())
 | 
										if(i != impl_->shape.image_table.end())
 | 
				
			||||||
@ -2167,7 +2304,7 @@ namespace nana
 | 
				
			|||||||
				impl->draw(true);
 | 
									impl->draw(true);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		treebox::node_image_type& treebox::icon(const std::string& id) const
 | 
							treebox::node_image_type& treebox::icon(const std::string& id)
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			return get_drawer_trigger().icon(id);
 | 
								return get_drawer_trigger().icon(id);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
@ -2233,7 +2370,24 @@ namespace nana
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
		treebox::item_proxy treebox::selected() const
 | 
							treebox::item_proxy treebox::selected() const
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			return item_proxy(const_cast<drawer_trigger_t*>(&get_drawer_trigger()), get_drawer_trigger().selected());
 | 
								//return item_proxy(const_cast<drawer_trigger_t*>(&get_drawer_trigger()), get_drawer_trigger().selected());	//deprecated
 | 
				
			||||||
 | 
								auto dw = &get_drawer_trigger();
 | 
				
			||||||
 | 
								return item_proxy(const_cast<drawer_trigger_t*>(dw), dw->impl()->node_state.selected);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							void treebox::scroll_into_view(item_proxy item, align_v bearing)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								internal_scope_guard lock;
 | 
				
			||||||
 | 
								if(get_drawer_trigger().impl()->scroll_into_view(item._m_node(), true, bearing))
 | 
				
			||||||
 | 
									API::refresh_window(*this);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							void treebox::scroll_into_view(item_proxy item)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								internal_scope_guard lock;
 | 
				
			||||||
 | 
								//The third argument for scroll_into_view is ignored if the second argument is false.
 | 
				
			||||||
 | 
								if(get_drawer_trigger().impl()->scroll_into_view(item._m_node(), false, align_v::center))
 | 
				
			||||||
 | 
									API::refresh_window(*this);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		std::shared_ptr<scroll_operation_interface> treebox::_m_scroll_operation()
 | 
							std::shared_ptr<scroll_operation_interface> treebox::_m_scroll_operation()
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user