blob: d03753ade0a3230904cdf454c7ce53041e8d44bf [file] [log] [blame]
// 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 COMPONENTS_USER_EDUCATION_COMMON_HELP_BUBBLE_HELP_BUBBLE_PARAMS_H_
#define COMPONENTS_USER_EDUCATION_COMMON_HELP_BUBBLE_HELP_BUBBLE_PARAMS_H_
#include <optional>
#include <string>
#include <utility>
#include <vector>
#include "base/functional/callback.h"
#include "base/functional/callback_helpers.h"
#include "base/memory/raw_ptr.h"
#include "base/time/time.h"
#include "base/values.h"
#include "ui/base/interaction/element_tracker.h"
#include "ui/gfx/vector_icon_types.h"
namespace user_education {
// The amount of time the promo should stay onscreen.
constexpr base::TimeDelta kDefaultTimeoutWithoutButtons = base::Seconds(10);
constexpr base::TimeDelta kDefaultTimeoutWithButtons = base::Seconds(0);
// Mirrors most values of views::BubbleBorder::Arrow.
// All values except kNone show a visible arrow between the bubble and the
// anchor element.
enum class HelpBubbleArrow {
kNone, // Positions the bubble directly beneath the anchor with no arrow.
kTopLeft,
kTopRight,
kBottomLeft,
kBottomRight,
kLeftTop,
kRightTop,
kLeftBottom,
kRightBottom,
kTopCenter,
kBottomCenter,
kLeftCenter,
kRightCenter,
};
struct HelpBubbleButtonParams {
HelpBubbleButtonParams();
HelpBubbleButtonParams(HelpBubbleButtonParams&&) noexcept;
HelpBubbleButtonParams& operator=(HelpBubbleButtonParams&&) noexcept;
~HelpBubbleButtonParams();
std::u16string text;
bool is_default = false;
base::OnceClosure callback = base::DoNothing();
};
struct HelpBubbleParams {
// Platform-specific properties that can be set for a help bubble. If an
// extended property evolves to warrant cross-platform support, it should be
// promoted out of extended properties.
class ExtendedProperties {
public:
ExtendedProperties();
ExtendedProperties(const ExtendedProperties&);
ExtendedProperties(ExtendedProperties&&) noexcept;
ExtendedProperties& operator=(const ExtendedProperties&);
ExtendedProperties& operator=(ExtendedProperties&&) noexcept;
~ExtendedProperties();
friend bool operator==(const ExtendedProperties&,
const ExtendedProperties&) = default;
base::Value::Dict& values() { return dict_; }
const base::Value::Dict& values() const { return dict_; }
private:
base::Value::Dict dict_;
};
HelpBubbleParams();
HelpBubbleParams(HelpBubbleParams&&) noexcept;
HelpBubbleParams& operator=(HelpBubbleParams&&) noexcept;
~HelpBubbleParams();
HelpBubbleArrow arrow = HelpBubbleArrow::kTopRight;
std::u16string title_text;
raw_ptr<const gfx::VectorIcon> body_icon = nullptr;
std::u16string body_icon_alt_text;
std::u16string body_text;
std::u16string screenreader_text;
// Whether the bubble should receive focus when it is shown. This is a
// behavioral hint; how it is actually implemented will depend on the bubble
// implementation (for example, bubbles attached to menu items cannot take
// focus for system activation reasons).
std::optional<bool> focus_on_show_hint;
// Additional message to be read to screen reader users to aid in
// navigation.
std::u16string keyboard_navigation_hint;
// The buttons to display. Depending on platform defaults, a
// HelpBubbleFactory may choose to move a default button to the leading or
// trailing edge of the bubble; however the order of non-default buttons is
// guaranteed to remain stable.
std::vector<HelpBubbleButtonParams> buttons;
// Alt text to use for the close button.
std::u16string close_button_alt_text;
// Determines whether a progress indicator will be displayed; if set the
// first value is current progress and the second is max progress.
std::optional<std::pair<int, int>> progress;
// Sets the bubble timeout. If a timeout is not provided a default will
// be used. If the timeout is 0, the bubble never times out.
std::optional<base::TimeDelta> timeout;
// Called when the bubble is actively dismissed by the user, using the close
// button or the ESC key.
base::OnceClosure dismiss_callback = base::DoNothing();
// Called when the bubble times out.
base::OnceClosure timeout_callback = base::DoNothing();
// Platform-specific properties that can be set for a help bubble. If an
// extended property evolves to warrant cross-platform support, it should be
// promoted out of extended properties.
ExtendedProperties extended_properties;
};
} // namespace user_education
#endif // COMPONENTS_USER_EDUCATION_COMMON_HELP_BUBBLE_HELP_BUBBLE_PARAMS_H_