blob: acb5941e5526ace679a32be995bae5e5b8f9cd98 [file] [log] [blame]
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef SERVICES_UI_VIEW_MANAGER_VIEW_TREE_STATE_H_
#define SERVICES_UI_VIEW_MANAGER_VIEW_TREE_STATE_H_
#include <memory>
#include <set>
#include <string>
#include <unordered_map>
#include "base/macros.h"
#include "base/memory/weak_ptr.h"
#include "mojo/public/cpp/bindings/binding.h"
#include "mojo/services/ui/views/cpp/formatting.h"
#include "mojo/services/ui/views/interfaces/view_trees.mojom.h"
namespace view_manager {
class ViewRegistry;
class ViewState;
class ViewStub;
class ViewTreeImpl;
// Describes the state of a particular view tree.
// This object is owned by the ViewRegistry that created it.
class ViewTreeState {
public:
ViewTreeState(ViewRegistry* registry,
mojo::ui::ViewTreeTokenPtr view_tree_token,
mojo::InterfaceRequest<mojo::ui::ViewTree> view_tree_request,
mojo::ui::ViewTreeListenerPtr view_tree_listener,
const std::string& label);
~ViewTreeState();
base::WeakPtr<ViewTreeState> GetWeakPtr() {
return weak_factory_.GetWeakPtr();
}
// Gets the token used to refer to this view tree globally.
// Caller does not obtain ownership of the token.
mojo::ui::ViewTreeToken* view_tree_token() const {
return view_tree_token_.get();
}
// Gets the view tree listener interface, never null.
// Caller does not obtain ownership of the view tree listener.
mojo::ui::ViewTreeListener* view_tree_listener() const {
return view_tree_listener_.get();
}
// The view tree's renderer.
mojo::gfx::composition::Renderer* renderer() const { return renderer_.get(); }
void SetRenderer(mojo::gfx::composition::RendererPtr renderer);
// Gets the root of the view tree, or null if there is no root.
ViewStub* root() const { return root_.get(); }
// Links the root of the view tree.
void LinkRoot(uint32_t key, std::unique_ptr<ViewStub> root);
// Unlinks the root of the view tree and returns it.
std::unique_ptr<ViewStub> UnlinkRoot();
// True if there is a pending layout request.
bool layout_request_pending() const { return layout_request_pending_; }
void set_layout_request_pending(bool value) {
layout_request_pending_ = value;
}
// True if a layout request has been issued.
bool layout_request_issued() const { return layout_request_issued_; }
void set_layout_request_issued(bool value) { layout_request_issued_ = value; }
// Starts tracking a hit tester request.
// The request will be satisfied by the current renderer if possible.
// The callback will be invoked when the renderer changes.
void RequestHitTester(
mojo::InterfaceRequest<mojo::gfx::composition::HitTester>
hit_tester_request,
const mojo::ui::ViewInspector::GetHitTesterCallback& callback);
const std::string& label() const { return label_; }
const std::string& FormattedLabel() const;
private:
void ClearHitTesterCallbacks(bool renderer_changed);
mojo::ui::ViewTreeTokenPtr view_tree_token_;
mojo::ui::ViewTreeListenerPtr view_tree_listener_;
const std::string label_;
mutable std::string formatted_label_cache_;
std::unique_ptr<ViewTreeImpl> impl_;
mojo::Binding<mojo::ui::ViewTree> view_tree_binding_;
mojo::gfx::composition::RendererPtr renderer_;
std::unique_ptr<ViewStub> root_;
bool layout_request_pending_ = false;
bool layout_request_issued_ = false;
std::vector<mojo::ui::ViewInspector::GetHitTesterCallback>
pending_hit_tester_callbacks_;
base::WeakPtrFactory<ViewTreeState> weak_factory_; // must be last
DISALLOW_COPY_AND_ASSIGN(ViewTreeState);
};
std::ostream& operator<<(std::ostream& os, ViewTreeState* view_tree_state);
} // namespace view_manager
#endif // SERVICES_UI_VIEW_MANAGER_VIEW_TREE_STATE_H_