blob: 0ff29674e3143a5642f6444038b29699925a3ec2 [file] [log] [blame]
// Copyright 2020 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef ASH_CLIPBOARD_CLIPBOARD_HISTORY_ITEM_H_
#define ASH_CLIPBOARD_CLIPBOARD_HISTORY_ITEM_H_
#include <optional>
#include <string>
#include "ash/ash_export.h"
#include "base/callback_list.h"
#include "base/functional/callback_forward.h"
#include "base/time/time.h"
#include "base/unguessable_token.h"
#include "chromeos/crosapi/mojom/clipboard_history.mojom.h"
#include "ui/base/clipboard/clipboard_data.h"
#include "ui/base/models/image_model.h"
#include "ui/gfx/text_constants.h"
namespace ash {
// Wraps `ClipboardData` with extra metadata for the data's visual presentation.
class ASH_EXPORT ClipboardHistoryItem {
public:
// Note: `data` must have at least one supported format, as determined by
// `clipboard_history_util::IsSupported()`.
explicit ClipboardHistoryItem(ui::ClipboardData data);
// TODO(b/279797913): Remove copy and move constructors once the clipboard
// history model starts storing and returning shared pointers to items.
ClipboardHistoryItem(const ClipboardHistoryItem&);
ClipboardHistoryItem(ClipboardHistoryItem&&);
// Copy assignment operator is deleted to be consistent with
// `ui::ClipboardData`.
ClipboardHistoryItem& operator=(const ClipboardHistoryItem&) = delete;
~ClipboardHistoryItem();
// Replaces `data_` with `new_data`. The two data instances must be equal,
// i.e., their contents (not including sequence number) must be the same.
// Returns the replaced `data_`.
ui::ClipboardData ReplaceEquivalentData(ui::ClipboardData&& new_data);
// Sets `display_image_` to `display_image` and notifies
// `display_image_updated_callbacks_`.
void SetDisplayImage(const ui::ImageModel& display_image);
// Adds `callback` to be notified if `display_image_` is updated.
// Note: `callback` will only run if `display_image_` is updated on the item
// to which it was added; copy-constructed and move-constructed items do not
// retain callbacks added to the original.
base::CallbackListSubscription AddDisplayImageUpdatedCallback(
base::RepeatingClosure callback) const;
const base::UnguessableToken& id() const { return id_; }
const ui::ClipboardData& data() const { return data_; }
const base::Time time_copied() const { return time_copied_; }
ui::ClipboardInternalFormat main_format() const { return main_format_; }
crosapi::mojom::ClipboardHistoryDisplayFormat display_format() const {
return display_format_;
}
const std::optional<ui::ImageModel>& display_image() const {
return display_image_;
}
const std::u16string& display_text() const { return display_text_; }
const std::optional<gfx::ElideBehavior>& display_text_elide_behavior() const {
return display_text_elide_behavior_;
}
const std::optional<size_t>& display_text_max_lines() const {
return display_text_max_lines_;
}
size_t file_count() const { return file_count_; }
const std::optional<ui::ImageModel>& icon() const { return icon_; }
const std::optional<std::u16string>& secondary_display_text() const {
return secondary_display_text_;
}
void set_secondary_display_text(
const std::optional<std::u16string>& secondary_display_text) {
secondary_display_text_ = secondary_display_text;
}
private:
// Unique identifier.
const base::UnguessableToken id_;
// Underlying data for an item in the clipboard history menu.
ui::ClipboardData data_;
// Time when the item's current data was set.
base::Time time_copied_;
// The most highly prioritized format present in `data_`, based on the
// usefulness of that format's presentation to the user.
const ui::ClipboardInternalFormat main_format_;
// The item's categorization based on the options we have for presenting data
// to the user.
const crosapi::mojom::ClipboardHistoryDisplayFormat display_format_;
// Cached display image. For PNG items, this will be set during construction.
// For HTML items, this will be a placeholder image until the real preview is
// ready, at which point it will be updated. For other items, there will be no
// value.
std::optional<ui::ImageModel> display_image_;
// The text that should be displayed on this item's menu entry.
const std::u16string display_text_;
// TODO(http://b/275629173): Consider a new display format for URLs instead.
// If present, overrides elide behavior for the text that should be displayed
// on this item's menu entry.
const std::optional<gfx::ElideBehavior> display_text_elide_behavior_;
// TODO(http://b/275629173): Consider a new display format for URLs instead.
// If present, overrides max lines for the text that should be displayed on
// this item's menu entry.
const std::optional<size_t> display_text_max_lines_;
// Indicates the count of copied files in the underlying clipboard data.
const size_t file_count_;
// Cached image model for the item's icon. Currently, there will be no value
// for non-file items.
const std::optional<ui::ImageModel> icon_;
// The text, if any, that should be displayed underneath `display_text_` on
// this item's menu entry.
std::optional<std::u16string> secondary_display_text_;
// Mutable to allow const access from `AddDisplayImageUpdatedCallback()`.
mutable base::RepeatingClosureList display_image_updated_callbacks_;
};
} // namespace ash
#endif // ASH_CLIPBOARD_CLIPBOARD_HISTORY_ITEM_H_