1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-26 10:57:34 +00:00

ClipboardHistory: Add Time column

Add a Time column to ClipboardHistory that shows the time when each
item in the list was copied.
This commit is contained in:
Nícolas F. R. A. Prado 2022-02-21 21:07:28 -05:00 committed by Andreas Kling
parent 9d94c85b6a
commit eebdd86fbd
3 changed files with 20 additions and 7 deletions

View file

@ -30,6 +30,8 @@ String ClipboardHistoryModel::column_name(int column) const
return "Type"; return "Type";
case Column::Size: case Column::Size:
return "Size"; return "Size";
case Column::Time:
return "Time";
default: default:
VERIFY_NOT_REACHED(); VERIFY_NOT_REACHED();
} }
@ -62,7 +64,9 @@ GUI::Variant ClipboardHistoryModel::data(const GUI::ModelIndex& index, GUI::Mode
{ {
if (role != GUI::ModelRole::Display) if (role != GUI::ModelRole::Display)
return {}; return {};
auto& data_and_type = m_history_items[index.row()]; auto& item = m_history_items[index.row()];
auto& data_and_type = item.data_and_type;
auto& time = item.time;
switch (index.column()) { switch (index.column()) {
case Column::Data: case Column::Data:
if (data_and_type.mime_type.starts_with("text/")) if (data_and_type.mime_type.starts_with("text/"))
@ -91,6 +95,8 @@ GUI::Variant ClipboardHistoryModel::data(const GUI::ModelIndex& index, GUI::Mode
return data_and_type.mime_type; return data_and_type.mime_type;
case Column::Size: case Column::Size:
return AK::human_readable_size(data_and_type.data.size()); return AK::human_readable_size(data_and_type.data.size());
case Column::Time:
return time.to_string();
default: default:
VERIFY_NOT_REACHED(); VERIFY_NOT_REACHED();
} }
@ -98,14 +104,14 @@ GUI::Variant ClipboardHistoryModel::data(const GUI::ModelIndex& index, GUI::Mode
void ClipboardHistoryModel::add_item(const GUI::Clipboard::DataAndType& item) void ClipboardHistoryModel::add_item(const GUI::Clipboard::DataAndType& item)
{ {
m_history_items.remove_first_matching([&](GUI::Clipboard::DataAndType& existing) { m_history_items.remove_first_matching([&](ClipboardItem& existing) {
return existing.data == item.data && existing.mime_type == item.mime_type; return existing.data_and_type.data == item.data && existing.data_and_type.mime_type == item.mime_type;
}); });
if (m_history_items.size() == m_history_limit) if (m_history_items.size() == m_history_limit)
m_history_items.take_last(); m_history_items.take_last();
m_history_items.prepend(item); m_history_items.prepend({ item, Core::DateTime::now() });
invalidate(); invalidate();
} }

View file

@ -10,6 +10,7 @@
#include <AK/Vector.h> #include <AK/Vector.h>
#include <LibConfig/Listener.h> #include <LibConfig/Listener.h>
#include <LibCore/DateTime.h>
#include <LibGUI/Clipboard.h> #include <LibGUI/Clipboard.h>
#include <LibGUI/Model.h> #include <LibGUI/Model.h>
@ -23,12 +24,18 @@ public:
Data, Data,
Type, Type,
Size, Size,
Time,
__Count __Count
}; };
struct ClipboardItem {
GUI::Clipboard::DataAndType data_and_type;
Core::DateTime time;
};
virtual ~ClipboardHistoryModel() override = default; virtual ~ClipboardHistoryModel() override = default;
const GUI::Clipboard::DataAndType& item_at(int index) const { return m_history_items[index]; } const ClipboardItem& item_at(int index) const { return m_history_items[index]; }
void remove_item(int index); void remove_item(int index);
// ^GUI::Model // ^GUI::Model
@ -49,6 +56,6 @@ private:
// ^GUI::Clipboard::ClipboardClient // ^GUI::Clipboard::ClipboardClient
virtual void clipboard_content_did_change(const String&) override { add_item(GUI::Clipboard::the().fetch_data_and_type()); } virtual void clipboard_content_did_change(const String&) override { add_item(GUI::Clipboard::the().fetch_data_and_type()); }
Vector<GUI::Clipboard::DataAndType> m_history_items; Vector<ClipboardItem> m_history_items;
size_t m_history_limit; size_t m_history_limit;
}; };

View file

@ -38,7 +38,7 @@ ErrorOr<int> serenity_main(Main::Arguments arguments)
table_view->set_model(model); table_view->set_model(model);
table_view->on_activation = [&](GUI::ModelIndex const& index) { table_view->on_activation = [&](GUI::ModelIndex const& index) {
auto& data_and_type = model->item_at(index.row()); auto& data_and_type = model->item_at(index.row()).data_and_type;
GUI::Clipboard::the().set_data(data_and_type.data, data_and_type.mime_type, data_and_type.metadata); GUI::Clipboard::the().set_data(data_and_type.data, data_and_type.mime_type, data_and_type.metadata);
}; };