summaryrefslogtreecommitdiff
path: root/chromium/ui/views/examples/bubble_example.cc
blob: 07127e68caa93553f5bb4bed17ff4ed7c9b4bd56 (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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
// Copyright (c) 2012 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.

#include "ui/views/examples/bubble_example.h"

#include "base/stl_util.h"
#include "base/strings/utf_string_conversions.h"
#include "ui/gfx/geometry/insets.h"
#include "ui/views/bubble/bubble_dialog_delegate_view.h"
#include "ui/views/controls/button/label_button.h"
#include "ui/views/controls/label.h"
#include "ui/views/layout/box_layout.h"
#include "ui/views/widget/widget.h"

using base::ASCIIToUTF16;

namespace views {
namespace examples {

namespace {

SkColor colors[] = { SK_ColorWHITE, SK_ColorGRAY, SK_ColorCYAN, 0xFFC1B1E1 };

BubbleBorder::Arrow arrows[] = {
    BubbleBorder::TOP_LEFT, BubbleBorder::TOP_CENTER,
    BubbleBorder::TOP_RIGHT, BubbleBorder::RIGHT_TOP,
    BubbleBorder::RIGHT_CENTER, BubbleBorder::RIGHT_BOTTOM,
    BubbleBorder::BOTTOM_RIGHT, BubbleBorder::BOTTOM_CENTER,
    BubbleBorder::BOTTOM_LEFT, BubbleBorder::LEFT_BOTTOM,
    BubbleBorder::LEFT_CENTER, BubbleBorder::LEFT_TOP };

base::string16 GetArrowName(BubbleBorder::Arrow arrow) {
  switch (arrow) {
    case BubbleBorder::TOP_LEFT:      return ASCIIToUTF16("TOP_LEFT");
    case BubbleBorder::TOP_RIGHT:     return ASCIIToUTF16("TOP_RIGHT");
    case BubbleBorder::BOTTOM_LEFT:   return ASCIIToUTF16("BOTTOM_LEFT");
    case BubbleBorder::BOTTOM_RIGHT:  return ASCIIToUTF16("BOTTOM_RIGHT");
    case BubbleBorder::LEFT_TOP:      return ASCIIToUTF16("LEFT_TOP");
    case BubbleBorder::RIGHT_TOP:     return ASCIIToUTF16("RIGHT_TOP");
    case BubbleBorder::LEFT_BOTTOM:   return ASCIIToUTF16("LEFT_BOTTOM");
    case BubbleBorder::RIGHT_BOTTOM:  return ASCIIToUTF16("RIGHT_BOTTOM");
    case BubbleBorder::TOP_CENTER:    return ASCIIToUTF16("TOP_CENTER");
    case BubbleBorder::BOTTOM_CENTER: return ASCIIToUTF16("BOTTOM_CENTER");
    case BubbleBorder::LEFT_CENTER:   return ASCIIToUTF16("LEFT_CENTER");
    case BubbleBorder::RIGHT_CENTER:  return ASCIIToUTF16("RIGHT_CENTER");
    case BubbleBorder::NONE:          return ASCIIToUTF16("NONE");
    case BubbleBorder::FLOAT:         return ASCIIToUTF16("FLOAT");
  }
  return ASCIIToUTF16("INVALID");
}

class ExampleBubble : public BubbleDialogDelegateView {
 public:
  ExampleBubble(View* anchor, BubbleBorder::Arrow arrow)
      : BubbleDialogDelegateView(anchor, arrow) {}

 protected:
  int GetDialogButtons() const override { return ui::DIALOG_BUTTON_NONE; }

  void Init() override {
    SetLayoutManager(
        std::make_unique<BoxLayout>(BoxLayout::kVertical, gfx::Insets(50)));
    AddChildView(new Label(GetArrowName(arrow())));
  }

 private:
  DISALLOW_COPY_AND_ASSIGN(ExampleBubble);
};

}  // namespace

BubbleExample::BubbleExample() : ExampleBase("Bubble") {}

BubbleExample::~BubbleExample() {}

void BubbleExample::CreateExampleView(View* container) {
  PrintStatus("Click with optional modifiers: [Ctrl] for set_arrow(NONE), "
     "[Alt] for set_arrow(FLOAT), or [Shift] to reverse the arrow iteration.");
  container->SetLayoutManager(
      std::make_unique<BoxLayout>(BoxLayout::kHorizontal, gfx::Insets(), 10));
  no_shadow_ = new LabelButton(this, ASCIIToUTF16("No Shadow"));
  container->AddChildView(no_shadow_);
  no_shadow_opaque_ = new LabelButton(this, ASCIIToUTF16("Opaque Border"));
  container->AddChildView(no_shadow_opaque_);
  big_shadow_ = new LabelButton(this, ASCIIToUTF16("Big Shadow"));
  container->AddChildView(big_shadow_);
  small_shadow_ = new LabelButton(this, ASCIIToUTF16("Small Shadow"));
  container->AddChildView(small_shadow_);
  no_assets_ = new LabelButton(this, ASCIIToUTF16("No Assets"));
  container->AddChildView(no_assets_);
  persistent_ = new LabelButton(this, ASCIIToUTF16("Persistent"));
  container->AddChildView(persistent_);
}

void BubbleExample::ButtonPressed(Button* sender, const ui::Event& event) {
  static int arrow_index = 0, color_index = 0;
  static const int count = base::size(arrows);
  arrow_index = (arrow_index + count + (event.IsShiftDown() ? -1 : 1)) % count;
  BubbleBorder::Arrow arrow = arrows[arrow_index];
  if (event.IsControlDown())
    arrow = BubbleBorder::NONE;
  else if (event.IsAltDown())
    arrow = BubbleBorder::FLOAT;

  ExampleBubble* bubble = new ExampleBubble(sender, arrow);
  bubble->set_color(colors[(color_index++) % base::size(colors)]);

  if (sender == no_shadow_)
    bubble->set_shadow(BubbleBorder::NO_SHADOW);
  else if (sender == no_shadow_opaque_)
    bubble->set_shadow(BubbleBorder::NO_SHADOW_OPAQUE_BORDER);
  else if (sender == big_shadow_)
    bubble->set_shadow(BubbleBorder::BIG_SHADOW);
  else if (sender == small_shadow_)
    bubble->set_shadow(BubbleBorder::SMALL_SHADOW);
  else if (sender == no_assets_)
    bubble->set_shadow(BubbleBorder::NO_ASSETS);

  if (sender == persistent_)
    bubble->set_close_on_deactivate(false);

  BubbleDialogDelegateView::CreateBubble(bubble);

  bubble->GetWidget()->Show();
}

}  // namespace examples
}  // namespace views