| // Copyright 2021 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef CHROMEOS_UI_FRAME_CAPTION_BUTTONS_FRAME_CENTER_BUTTON_H_ |
| #define CHROMEOS_UI_FRAME_CAPTION_BUTTONS_FRAME_CENTER_BUTTON_H_ |
| |
| #include <optional> |
| |
| #include "base/component_export.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/render_text.h" |
| #include "ui/views/window/frame_caption_button.h" |
| |
| namespace chromeos { |
| |
| // A button to be shown at the center of the caption. The client of this class |
| // is responsible for managing the instance of this class, setting the primary |
| // image, and optionally setting a text and sub image. |
| class COMPONENT_EXPORT(CHROMEOS_UI_FRAME) FrameCenterButton |
| : public views::FrameCaptionButton { |
| METADATA_HEADER(FrameCenterButton, views::FrameCaptionButton) |
| |
| public: |
| FrameCenterButton(PressedCallback callback); |
| FrameCenterButton(const FrameCenterButton&) = delete; |
| FrameCenterButton& operator=(const FrameCenterButton&) = delete; |
| ~FrameCenterButton() override; |
| |
| // views::View override: |
| gfx::Size GetMinimumSize() const override; |
| |
| // Set the text to be painted next to the main icon. The text must be short |
| // enough to fit the caption. Otherwise, the button wouldn't be drawn |
| // properly. |
| void SetText(std::optional<std::u16string> text); |
| // Set the sub image to be painted next to the main icon and text. |
| void SetSubImage(const gfx::VectorIcon& icon_image); |
| |
| protected: |
| // views::View override: |
| // Unlike other caption buttons, the size should be calculated dynamically as |
| // this class may have an optional text and sub image. |
| gfx::Size CalculatePreferredSize( |
| const views::SizeBounds& available_size) const override; |
| |
| // views::FrameCaptionButton override: |
| void DrawHighlight(gfx::Canvas* canvas, cc::PaintFlags flags) override; |
| void DrawIconContents(gfx::Canvas* canvas, |
| gfx::ImageSkia image, |
| int x, |
| int y, |
| cc::PaintFlags flags) override; |
| // Returns the size of the inkdrop ripple. If the extra text and sub image |
| // aren't set, it's simply the size of a circle with the radius of |
| // |ink_drop_corner_radius_|. |
| gfx::Size GetInkDropSize() const override; |
| |
| private: |
| void OnBackgroundColorChanged(); |
| |
| // The extra text shown in the button if set. |
| std::unique_ptr<gfx::RenderText> text_; |
| |
| // The image id and image used to paint the sub icon if set. |
| std::optional<gfx::ImageSkia> sub_icon_image_; |
| raw_ptr<const gfx::VectorIcon> sub_icon_definition_ = nullptr; |
| |
| // Used to update the color of the optional contents when the background |
| // color is updated. |
| base::CallbackListSubscription background_color_changed_subscription_; |
| }; |
| |
| } // namespace chromeos |
| |
| #endif // CHROMEOS_UI_FRAME_CAPTION_BUTTONS_FRAME_CENTER_BUTTON_H_ |