mirror of
				https://github.com/ArthurSonzogni/FTXUI.git
				synced 2025-10-31 18:48:11 +08:00 
			
		
		
		
	 b0e087ecef
			
		
	
	b0e087ecef
	
	
	
		
			
			Instead of two levels of focus with `focus` and `selected`, use a recursive level. The components set the one "active" and hbox/vbox/dbox Co-authored-by: ArthurSonzogni <sonzogniarthur@gmail.com>
		
			
				
	
	
		
			106 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			106 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| // Copyright 2020 Arthur Sonzogni. All rights reserved.
 | |
| // Use of this source code is governed by the MIT license that can be found in
 | |
| // the LICENSE file.
 | |
| #ifndef FTXUI_COMPONENT_BASE_HPP
 | |
| #define FTXUI_COMPONENT_BASE_HPP
 | |
| 
 | |
| #include <memory>  // for unique_ptr
 | |
| #include <vector>  // for vector
 | |
| 
 | |
| #include "ftxui/component/captured_mouse.hpp"  // for CaptureMouse
 | |
| #include "ftxui/dom/elements.hpp"              // for Element
 | |
| 
 | |
| namespace ftxui {
 | |
| 
 | |
| class Delegate;
 | |
| class Focus;
 | |
| struct Event;
 | |
| 
 | |
| namespace animation {
 | |
| class Params;
 | |
| }  // namespace animation
 | |
| 
 | |
| class ComponentBase;
 | |
| using Component = std::shared_ptr<ComponentBase>;
 | |
| using Components = std::vector<Component>;
 | |
| 
 | |
| /// @brief It implement rendering itself as ftxui::Element. It implement
 | |
| /// keyboard navigation by responding to ftxui::Event.
 | |
| /// @ingroup component
 | |
| class ComponentBase {
 | |
|  public:
 | |
|   explicit ComponentBase(Components children)
 | |
|       : children_(std::move(children)) {}
 | |
|   virtual ~ComponentBase();
 | |
|   ComponentBase() = default;
 | |
| 
 | |
|   // A component is not copyable/movable.
 | |
|   ComponentBase(const ComponentBase&) = delete;
 | |
|   ComponentBase(ComponentBase&&) = delete;
 | |
|   ComponentBase& operator=(const ComponentBase&) = delete;
 | |
|   ComponentBase& operator=(ComponentBase&&) = delete;
 | |
| 
 | |
|   // Component hierarchy:
 | |
|   ComponentBase* Parent() const;
 | |
|   Component& ChildAt(size_t i);
 | |
|   size_t ChildCount() const;
 | |
|   int Index() const;
 | |
|   void Add(Component children);
 | |
|   void Detach();
 | |
|   void DetachAllChildren();
 | |
| 
 | |
|   // Renders the component.
 | |
|   Element Render();
 | |
| 
 | |
|   // Override this function modify how `Render` works.
 | |
|   virtual Element OnRender();
 | |
| 
 | |
|   // Handles an event.
 | |
|   // By default, reduce on children with a lazy OR.
 | |
|   //
 | |
|   // Returns whether the event was handled or not.
 | |
|   virtual bool OnEvent(Event);
 | |
| 
 | |
|   // Handle an animation step.
 | |
|   virtual void OnAnimation(animation::Params& params);
 | |
| 
 | |
|   // Focus management ----------------------------------------------------------
 | |
|   //
 | |
|   // If this component contains children, this indicates which one is active,
 | |
|   // nullptr if none is active.
 | |
|   //
 | |
|   // We say an element has the focus if the chain of ActiveChild() from the
 | |
|   // root component contains this object.
 | |
|   virtual Component ActiveChild();
 | |
| 
 | |
|   // Return true when the component contains focusable elements.
 | |
|   // The non focusable Component will be skipped when navigating using the
 | |
|   // keyboard.
 | |
|   virtual bool Focusable() const;
 | |
| 
 | |
|   // Whether this is the active child of its parent.
 | |
|   bool Active() const;
 | |
|   // Whether all the ancestors are active.
 | |
|   bool Focused() const;
 | |
| 
 | |
|   // Make the |child| to be the "active" one.
 | |
|   virtual void SetActiveChild(ComponentBase* child);
 | |
|   void SetActiveChild(Component child);
 | |
| 
 | |
|   // Configure all the ancestors to give focus to this component.
 | |
|   void TakeFocus();
 | |
| 
 | |
|  protected:
 | |
|   CapturedMouse CaptureMouse(const Event& event);
 | |
| 
 | |
|   Components children_;
 | |
| 
 | |
|  private:
 | |
|   ComponentBase* parent_ = nullptr;
 | |
|   bool in_render = false;
 | |
| };
 | |
| 
 | |
| }  // namespace ftxui
 | |
| 
 | |
| #endif /* end of include guard: FTXUI_COMPONENT_BASE_HPP */
 |