summaryrefslogtreecommitdiff
path: root/libcef/browser/views/box_layout_impl.cc
blob: 0305ef8265bc16461896b414a93ed8fd071b9da8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
// Copyright 2016 The Chromium Embedded Framework Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be found
// in the LICENSE file.

#include "libcef/browser/views/box_layout_impl.h"

#include "libcef/browser/thread_util.h"
#include "libcef/browser/views/view_util.h"

// static
CefRefPtr<CefBoxLayoutImpl> CefBoxLayoutImpl::Create(
    const CefBoxLayoutSettings& settings,
    views::View* owner_view) {
  CEF_REQUIRE_UIT_RETURN(nullptr);
  CefRefPtr<CefBoxLayoutImpl> impl = new CefBoxLayoutImpl(settings);
  impl->Initialize(owner_view);
  return impl;
}

void CefBoxLayoutImpl::SetFlexForView(CefRefPtr<CefView> view, int flex) {
  CEF_REQUIRE_VALID_RETURN_VOID();
  DCHECK_GE(flex, 0);
  if (flex < 0) {
    return;
  }

  DCHECK(view && view->IsValid() && view->IsAttached());
  if (!view || !view->IsValid() || !view->IsAttached()) {
    return;
  }

  views::View* view_ptr = view_util::GetFor(view);
  DCHECK_EQ(view_ptr->parent(), owner_view());
  if (view_ptr->parent() != owner_view()) {
    return;
  }

  layout()->SetFlexForView(view_ptr, flex);
}

void CefBoxLayoutImpl::ClearFlexForView(CefRefPtr<CefView> view) {
  CEF_REQUIRE_VALID_RETURN_VOID();
  DCHECK(view && view->IsValid() && view->IsAttached());
  if (!view || !view->IsValid() || !view->IsAttached()) {
    return;
  }

  views::View* view_ptr = view_util::GetFor(view);
  DCHECK_EQ(view_ptr->parent(), owner_view());
  if (view_ptr->parent() != owner_view()) {
    return;
  }

  layout()->ClearFlexForView(view_ptr);
}

CefBoxLayoutImpl::CefBoxLayoutImpl(const CefBoxLayoutSettings& settings)
    : settings_(settings) {}

views::BoxLayout* CefBoxLayoutImpl::CreateLayout() {
  views::BoxLayout* layout = new views::BoxLayout(
      settings_.horizontal ? views::BoxLayout::Orientation::kHorizontal
                           : views::BoxLayout::Orientation::kVertical,
      gfx::Insets::VH(settings_.inside_border_vertical_spacing,
                      settings_.inside_border_horizontal_spacing),
      settings_.between_child_spacing);
  layout->set_main_axis_alignment(
      static_cast<views::BoxLayout::MainAxisAlignment>(
          settings_.main_axis_alignment));
  layout->set_cross_axis_alignment(
      static_cast<views::BoxLayout::CrossAxisAlignment>(
          settings_.cross_axis_alignment));
  layout->set_inside_border_insets(gfx::Insets::TLBR(
      settings_.inside_border_insets.top, settings_.inside_border_insets.left,
      settings_.inside_border_insets.bottom,
      settings_.inside_border_insets.right));
  layout->set_minimum_cross_axis_size(settings_.minimum_cross_axis_size);
  if (settings_.default_flex > 0) {
    layout->SetDefaultFlex(settings_.default_flex);
  }
  return layout;
}