#ifndef UI_VIEWS_WINDOW_FRAME_CAPTION_BUTTON_H_
#define UI_VIEWS_WINDOW_FRAME_CAPTION_BUTTON_H_
#include <memory>
#include <variant>
#include "base/callback_list.h"
#include "base/memory/raw_ptr.h"
#include "ui/base/metadata/metadata_header_macros.h"
#include "ui/base/metadata/metadata_types.h"
#include "ui/gfx/color_palette.h"
#include "ui/gfx/image/image_skia.h"
#include "ui/views/controls/button/button.h"
#include "ui/views/views_export.h"
#include "ui/views/window/caption_button_layout_constants.h"
#include "ui/views/window/caption_button_types.h"
namespace cc {
class PaintFlags;
}
namespace gfx {
class SlideAnimation;
struct VectorIcon;
}
namespace views {
class VIEWS_EXPORT FrameCaptionButton : public Button {
METADATA_HEADER(FrameCaptionButton, Button)
public:
enum class Animate { kYes, kNo };
FrameCaptionButton(PressedCallback callback,
CaptionButtonIcon icon,
int hit_test_type);
FrameCaptionButton(const FrameCaptionButton&) = delete;
FrameCaptionButton& operator=(const FrameCaptionButton&) = delete;
~FrameCaptionButton() override;
static SkColor GetButtonColor(SkColor background_color);
static float GetInactiveButtonColorAlphaRatio();
void SetImage(CaptionButtonIcon icon,
Animate animate,
const gfx::VectorIcon& icon_image);
bool IsAnimatingImageSwap() const;
void SetAlpha(SkAlpha alpha);
void OnGestureEvent(ui::GestureEvent* event) override;
views::PaintInfo::ScaleType GetPaintScaleType() const override;
void SetBackgroundColor(SkColor background_color);
SkColor GetBackgroundColor() const;
void SetIconColorId(ui::ColorId icon_color_id);
void SetPaintAsActive(bool paint_as_active);
bool GetPaintAsActive() const;
void SetInkDropCornerRadius(int ink_drop_corner_radius);
int GetInkDropCornerRadius() const;
base::CallbackListSubscription AddBackgroundColorChangedCallback(
PropertyChangedCallback callback);
CaptionButtonIcon GetIcon() const { return icon_; }
const gfx::ImageSkia& icon_image() const { return icon_image_; }
const gfx::VectorIcon* icon_definition_for_test() const {
return icon_definition_;
}
protected:
void PaintButtonContents(gfx::Canvas* canvas) override;
void OnThemeChanged() override;
virtual void DrawHighlight(gfx::Canvas* canvas, cc::PaintFlags flags);
virtual void DrawIconContents(gfx::Canvas* canvas,
gfx::ImageSkia image,
int x,
int y,
cc::PaintFlags flags);
virtual gfx::Size GetInkDropSize() const;
gfx::Insets GetInkdropInsets(const gfx::Size& button_size) const;
void MaybeRefreshIconAndInkdropBaseColor();
private:
class HighlightPathGenerator;
SkAlpha GetAlphaForIcon(SkAlpha base_alpha) const;
void UpdateInkDropBaseColor();
CaptionButtonIcon icon_;
std::variant<ui::ColorId, SkColor> color_ = gfx::kPlaceholderColor;
bool paint_as_active_ = false;
SkAlpha alpha_ = SK_AlphaOPAQUE;
int ink_drop_corner_radius_ = kCaptionButtonInkDropDefaultCornerRadius;
raw_ptr<const gfx::VectorIcon> icon_definition_ = nullptr;
gfx::ImageSkia icon_image_;
gfx::ImageSkia crossfade_icon_image_;
std::unique_ptr<gfx::SlideAnimation> swap_images_animation_;
};
}
#endif