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 130 131 132 133 134 135 136 137 138 139 140
|
// Copyright 2012 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef UI_VIEWS_BORDER_H_
#define UI_VIEWS_BORDER_H_
#include <memory>
#include "third_party/skia/include/core/SkColor.h"
#include "ui/color/color_id.h"
#include "ui/color/color_variant.h"
#include "ui/gfx/color_palette.h"
#include "ui/gfx/geometry/insets.h"
#include "ui/views/views_export.h"
namespace gfx {
class Canvas;
class Size;
} // namespace gfx
namespace views {
class Painter;
class View;
////////////////////////////////////////////////////////////////////////////////
//
// Border class.
//
// The border class is used to display a border around a view.
// To set a border on a view, call SetBorder on the view, for example:
// view->SetBorder(
// CreateSolidBorder(1, view->GetColorProvider()->GetColor(
// ui::kColorFocusableBorderUnfocused)));
// Make sure the border color is updated on theme changes.
// Once set on a view, the border is owned by the view.
//
// IMPORTANT NOTE: not all views support borders at this point. In order to
// support the border, views should make sure to use bounds excluding the
// border (by calling View::GetLocalBoundsExcludingBorder) when doing layout and
// painting.
//
////////////////////////////////////////////////////////////////////////////////
class VIEWS_EXPORT Border {
public:
Border();
Border(const Border&) = delete;
Border& operator=(const Border&) = delete;
virtual ~Border();
// Renders the border for the specified view.
virtual void Paint(const View& view, gfx::Canvas* canvas) = 0;
// Returns the border insets.
virtual gfx::Insets GetInsets() const = 0;
// Returns the minimum size this border requires. Note that this may not be
// the same as the insets. For example, a Border may paint images to draw
// some graphical border around a view, and this would return the minimum size
// such that these images would not be clipped or overlapping -- but the
// insets may be larger or smaller, depending on how the view wanted its
// content laid out relative to these images.
virtual gfx::Size GetMinimumSize() const = 0;
// This is called by the View on which it is attached. This is overridden for
// subclasses that depend on theme colors.
virtual void OnViewThemeChanged(View* view);
ui::ColorVariant color() const { return color_; }
// Sets the border color.
virtual void SetColor(ui::ColorVariant color);
private:
ui::ColorVariant color_;
};
// Convenience for creating a scoped_ptr with no Border.
VIEWS_EXPORT std::unique_ptr<Border> NullBorder();
// Creates a border that is a simple line of the specified thickness and color.
VIEWS_EXPORT std::unique_ptr<Border> CreateSolidBorder(int thickness,
ui::ColorVariant color);
// Creates a border that is a rounded rectangle of the specified thickness and
// color.
// NOTE: `corner_radius` is an OUTER EDGE RADIUS, not a stroke radius!
VIEWS_EXPORT std::unique_ptr<Border> CreateRoundedRectBorder(
int thickness,
float corner_radius,
ui::ColorVariant color);
VIEWS_EXPORT std::unique_ptr<Border> CreateRoundedRectBorder(
int thickness,
float corner_radius,
const gfx::Insets& paint_insets,
ui::ColorVariant color);
// Creates a border for reserving space. The returned border does not paint
// anything.
VIEWS_EXPORT std::unique_ptr<Border> CreateEmptyBorder(
const gfx::Insets& insets);
// A simpler version of the above for a border with uniform thickness.
VIEWS_EXPORT std::unique_ptr<Border> CreateEmptyBorder(int thickness);
// Creates a border of the specified color, and thickness on each side specified
// in |insets|.
VIEWS_EXPORT std::unique_ptr<Border> CreateSolidSidedBorder(
const gfx::Insets& insets,
ui::ColorVariant color);
// Creates a new border that draws |border| and adds additional padding. This is
// equivalent to changing the insets of |border| without changing how or what it
// paints. Example:
//
// view->SetBorder(CreatePaddedBorder(
// CreateSolidBorder(1, view->GetColorProvider()->GetColor(
// ui::kColorFocusableBorderUnfocused)),
// gfx::Insets::TLBR(2, 0, 0, 0)));
//
// yields a single dip red border and an additional 2dip of unpainted padding
// above the view content (below the border).
VIEWS_EXPORT std::unique_ptr<Border> CreatePaddedBorder(
std::unique_ptr<Border> border,
const gfx::Insets& insets);
// Creates a Border from the specified Painter. |insets| define size of an area
// allocated for a Border.
VIEWS_EXPORT std::unique_ptr<Border> CreateBorderPainter(
std::unique_ptr<Painter> painter,
const gfx::Insets& insets);
} // namespace views
#endif // UI_VIEWS_BORDER_H_
|