Rapicorn - Experimental UI Toolkit - Source Code
13.07.0
|
00001 // Licensed GNU LGPL v3 or later: http://www.gnu.org/licenses/lgpl.html 00002 #ifndef __RAPICORN_CONTAINER_HH__ 00003 #define __RAPICORN_CONTAINER_HH__ 00004 00005 #include <ui/widget.hh> 00006 00007 namespace Rapicorn { 00008 00009 class ResizeContainerImpl; 00010 00011 // == Container == 00012 struct ContainerImpl : public virtual WidgetImpl, public virtual ContainerIface { 00013 friend class WidgetImpl; 00014 friend class WindowImpl; 00015 void uncross_descendant(WidgetImpl &descendant); 00016 size_t widget_cross_link (WidgetImpl &owner, 00017 WidgetImpl &link, 00018 const WidgetSlot &uncross); 00019 void widget_cross_unlink (WidgetImpl &owner, 00020 WidgetImpl &link, 00021 size_t link_id); 00022 void widget_uncross_links(WidgetImpl &owner, 00023 WidgetImpl &link); 00024 protected: 00025 virtual ~ContainerImpl (); 00026 virtual void add_child (WidgetImpl &widget) = 0; 00027 virtual void repack_child (WidgetImpl &widget, 00028 const PackInfo &orig, 00029 const PackInfo &pnew); 00030 virtual void remove_child (WidgetImpl &widget) = 0; 00031 virtual void unparent_child (WidgetImpl &widget); 00032 virtual void dispose_widget (WidgetImpl &widget); 00033 virtual void hierarchy_changed (WidgetImpl *old_toplevel); 00034 virtual bool move_focus (FocusDirType fdir); 00035 void expose_enclosure (); /* expose without children */ 00036 void change_unviewable (WidgetImpl &child, bool); 00037 virtual void focus_lost () { set_focus_child (NULL); } 00038 virtual void set_focus_child (WidgetImpl *widget); 00039 virtual void scroll_to_child (WidgetImpl &widget); 00040 virtual void dump_test_data (TestStream &tstream); 00041 static Allocation layout_child (WidgetImpl &child, const Allocation &carea); 00042 public: 00043 WidgetImpl* get_focus_child () const; 00044 typedef Walker<WidgetImpl> ChildWalker; 00045 void child_container (ContainerImpl *child_container); 00046 ContainerImpl& child_container (); 00047 virtual ChildWalker local_children () const = 0; 00048 virtual size_t n_children () = 0; 00049 virtual WidgetImpl* nth_child (size_t nth) = 0; 00050 bool has_children () { return 0 != n_children(); } 00051 void remove (WidgetImpl &widget); 00052 void remove (WidgetImpl *widget) { assert_return (widget != NULL); remove (*widget); } 00053 void add (WidgetImpl &widget); 00054 void add (WidgetImpl *widget); 00055 virtual Affine child_affine (const WidgetImpl &widget); /* container => widget affine */ 00056 virtual 00057 const CommandList& list_commands (); /* essentially chaining to WidgetImpl:: */ 00058 virtual void point_children (Point p, /* widget coordinates relative */ 00059 std::vector<WidgetImpl*> &stack); 00060 void screen_window_point_children (Point p, /* screen_window coordinates relative */ 00061 std::vector<WidgetImpl*> &stack); 00062 virtual ContainerImpl* as_container_impl () { return this; } 00063 virtual void render_recursive(RenderContext &rcontext); 00064 void debug_tree (String indent = String()); 00065 // ContainerIface 00066 virtual WidgetIface* create_child (const std::string &widget_identifier, 00067 const StringSeq &args); 00068 }; 00069 00070 // == Single Child Container == 00071 class SingleContainerImpl : public virtual ContainerImpl { 00072 WidgetImpl *child_widget; 00073 protected: 00074 void size_request_child (Requisition &requisition, bool *hspread, bool *vspread); 00075 virtual void size_request (Requisition &requisition); 00076 virtual void size_allocate (Allocation area, bool changed); 00077 virtual void render (RenderContext&, const Rect&) {} 00078 WidgetImpl& get_child () { critical_unless (child_widget != NULL); return *child_widget; } 00079 virtual void pre_finalize (); 00080 virtual ~SingleContainerImpl (); 00081 virtual ChildWalker local_children () const; 00082 virtual size_t n_children () { return child_widget ? 1 : 0; } 00083 virtual WidgetImpl* nth_child (size_t nth) { return nth == 0 ? child_widget : NULL; } 00084 bool has_visible_child () { return child_widget && child_widget->visible(); } 00085 bool has_drawable_child () { return child_widget && child_widget->drawable(); } 00086 virtual void add_child (WidgetImpl &widget); 00087 virtual void remove_child (WidgetImpl &widget); 00088 explicit SingleContainerImpl (); 00089 }; 00090 00091 // == AnchorInfo == 00092 struct AnchorInfo { 00093 ResizeContainerImpl *resize_container; 00094 ViewportImpl *viewport; 00095 WindowImpl *window; 00096 constexpr AnchorInfo() : resize_container (NULL), viewport (NULL), window (NULL) {} 00097 }; 00098 00099 // == Resize Container == 00100 class ResizeContainerImpl : public virtual SingleContainerImpl { 00101 uint tunable_requisition_counter_; 00102 uint resizer_; 00103 AnchorInfo anchor_info_; 00104 void idle_sizing (); 00105 void update_anchor_info (); 00106 protected: 00107 virtual void invalidate_parent (); 00108 virtual void hierarchy_changed (WidgetImpl *old_toplevel); 00109 void negotiate_size (const Allocation *carea); 00110 explicit ResizeContainerImpl (); 00111 virtual ~ResizeContainerImpl (); 00112 public: 00113 bool requisitions_tunable () const { return tunable_requisition_counter_ > 0; } 00114 AnchorInfo* container_anchor_info () { return &anchor_info_; } 00115 }; 00116 00117 // == Multi Child Container == 00118 class MultiContainerImpl : public virtual ContainerImpl { 00119 std::vector<WidgetImpl*> widgets; 00120 protected: 00121 virtual void pre_finalize (); 00122 virtual ~MultiContainerImpl (); 00123 virtual void render (RenderContext&, const Rect&) {} 00124 virtual ChildWalker local_children () const { return value_walker (widgets); } 00125 virtual size_t n_children () { return widgets.size(); } 00126 virtual WidgetImpl* nth_child (size_t nth) { return nth < widgets.size() ? widgets[nth] : NULL; } 00127 virtual void add_child (WidgetImpl &widget); 00128 virtual void remove_child (WidgetImpl &widget); 00129 void raise_child (WidgetImpl &widget); 00130 void lower_child (WidgetImpl &widget); 00131 void remove_all_children (); 00132 explicit MultiContainerImpl (); 00133 }; 00134 00135 } // Rapicorn 00136 00137 #endif /* __RAPICORN_CONTAINER_HH__ */