Rapicorn - Experimental UI Toolkit - Source Code  13.07.0
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Defines
container.hh
Go to the documentation of this file.
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__ */
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Defines