// Copyright 2016 The Fuchsia Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. library fuchsia.ui.viewsv1; using fuchsia.mem; using fuchsia.ui.viewsv1token; // A view container is an interface exposed by |View| and |ViewTree| to // manage their child views. Although |View| may have any number of children, // a |ViewTree| can have at most one (its root view). // // EMBEDDING // // The following steps are required to embed another view as a child: // // 1. Obtain the |ViewOwner| belonging to the view you would like to embed. // The means for doing this is not specified by the view system. // You might create another view of your own to embed or connect to // another application using a mechanism such as |ViewProvider| (or // any suitable agreed-upon protocol) to create the view to embed. // // 2. Call |AddChild()| to add the view you would like to embed and assign // it a unique key. // // 3. Call |SetChildProperties()| to provide layout parameters and other // properties for the new child using the same key that was provided // to |AddChild()|. // // 4. Watch for the child becoming unavailable, as reported by // |OnChildUnavailable()|, which indicates that the child is no longer // in a usable state (perhaps the application which provided it has // stopped). When this happens, you are still responsible for calling // |RemoveChild()| to remove the child and discard any state that your // view has associated with it. // // VIEW PROPERTIES AND LAYOUT // // The container controls the presentation of its children by setting // |ViewProperties| for each of them. View properties include layout // information and other parameters the child needs to know to participate // in the view hierarchy. // // The container must set properties for each of its children after adding // them, as otherwise the children cannot be rendered (since they lack enough // context to know what to draw). interface ViewContainer { // Sets the view container listener, or null to remove. 1: SetListener(ViewContainerListener? listener); // Adds the view referenced by |child_view_owner| as a child and assigns // it the provided |child_key| to identify it among its children. // The container may remove the child later by passing the same |child_key| // to |RemoveChild()|. // // This method takes ownership of the view. // // It is important for the container to choose locally unique values for // |child_key| to ensure that each child can be distinguished even as // more children are added or removed. We recommend using a simple // counter which is incremented on each (re-)addition. // // If the child becomes unavailable at any time prior to being removed // then an |OnChildUnavailable()| message will be sent. // // If |child_view_owner| refers to a view which is already unavailable or // if adding the view would create a cycle in the view tree then the // call proceeds as if it succeeded but an |OnChildUnavailable()| message // will be sent. // // If |child_view_owner| refers to a view which already has a container or is // the root of a view tree then an |OnChildUnavailable()| message will // be sent to its old container or root and the the view will be // (re-)added to its new container as usual. This special case also // applies when the specified view is already a child of this view, in which // case the behavior is similar to the view having been transferred to // some other container and then back again. // // Note that an unavailable child will remain in its container's list of // children until its container explicitly calls |RemoveChild()| to remove // it. // // |host_import_token| is an import token which the view manager will // use to import the node to which the child view's content should // be attached. // // To establish the graphical embedding relation, the container view // must create an event pair, bind one endpoint to an |ExportResourceOp| // associated with the node to which the child's content nodes will be // attached as descendants, and pass the other endpoint to this method as // |host_import_token|. // // It is an error to add a view whose |child_key| already appears // in the view's list of children; the connection will be closed. // // It is an error to add more than one child to a |ViewTree|'s container; // it can only have at most one child (its root). // // This method is deprecated in favor of the eventpair-based one below. // TODO(SCN-1018): Remove this. 2: AddChild(uint32 child_key, fuchsia.ui.viewsv1token.ViewOwner child_view_owner, handle<eventpair> host_import_token); 3: AddChild2(uint32 child_key, handle<eventpair> view_holder_token, handle<eventpair> host_import_token); // Removes the view referenced by |child_key| from the view's // list of children. // // If |transferred_view_owner| is not null, associates it with the // previously added child to allow it to be transferred elsewhere or // closes the |transferred_view_owner| channel if there was none. // // It is an error to remove a view whose |child_key| does not appear // in the container's list of children; the connection will be closed. // // This method is deprecated in favor of the eventpair-based one below. // TODO(SCN-1018): Remove this. 4: RemoveChild(uint32 child_key, request<fuchsia.ui.viewsv1token.ViewOwner>? transferred_view_owner); 5: RemoveChild2(uint32 child_key, handle<eventpair>? transferred_view_holder_token); // Sets view properties for the child, such as layout constraints. // // This method must be called at least once after a child is added to // set the view's properties before it can be rendered. Rendering for // children without properties is blocked until properties are set. // // The |child_view_properties| specifies the properties for the child, or // null to remove the properties from the child which will cause rendering // of the child's scene to be blocked until new properties are set. // // It is an error to specify a |child_key| that does not appear in // the container's list of children; the connection will be closed. // // It is an error to specify malformed |child_view_properties| such // as invalid layout properties; the connection will be closed. 6: SetChildProperties(uint32 child_key, ViewProperties? child_view_properties); // WIP API // Sends a hint about a pending size change to the given node and all nodes // below. This is generally sent before an animation. // // |width_change_factor| and |height_change_factor| is how much bigger or smaller // the item is expected to be in the near future. This one number encapsulate // both changes in scale, as well as changes to layout width and height. // // It is an error to specify a |child_key| that does not appear in // the container's list of children; the connection will be closed. // 7: SendSizeChangeHintHACK(uint32 child_key, float32 width_change_factor, float32 height_change_factor); // Request the child view to get input focus for key events. 8: RequestFocus(uint32 child_key); // Request the snapshot of the child view. 9: RequestSnapshotHACK(uint32 child_key)-> (fuchsia.mem.Buffer data); }; // An interface clients may implement to receive events from a view container. interface ViewContainerListener { // Called when a child view is attached along with embedding information. // // This method will be called at most once after the child is added. // // The implementation should invoke the callback once the event has // been handled. 1: OnChildAttached(uint32 child_key, ViewInfo child_view_info) -> (); // Called when a child view has become unavailable. // // A child may become unavailable for many reasons such being unregistered // by its application, abnormal termination of its application, or // cycles being introduced in the view tree. // // To complete removal of an unavailable child, this view component must // call RemoveChild() on its view with |child_key|. // // The implementation should invoke the callback once the event has // been handled. 2: OnChildUnavailable(uint32 child_key) -> (); // TODO(jeffbrown): Once we figure out measurement, add a |OnChildResized| // event or similar to allow the container to get the size along with the // scene version. }; // Provides embedding information about a view for use by its container. // // This information is valid until the container removes the view. struct ViewInfo { // There is currently no information here but we have preserved the // plumbing for now. May remove later. uint8 dummy; };