5#include "krecentfilesmenu.h"
7#include <QGuiApplication>
11#include <QStandardPaths>
18 QAction *action =
nullptr;
20 QString titleWithSensibleWidth(QWidget *widget)
const
27 int maxWidthForTitles = INT_MAX;
29 for (QScreen *screen : screens) {
30 maxWidthForTitles = qMin(maxWidthForTitles, screen->availableGeometry().width() * 3 / 4);
33 const QFontMetrics fontMetrics = widget->
fontMetrics();
35 QString title = displayName + QLatin1String(
" [") + urlString + QLatin1Char(
']');
37 if (nameWidth > maxWidthForTitles) {
40 const int displayNameMaxWidth = maxWidthForTitles * 3 / 4;
43 if (nameWidth > displayNameMaxWidth) {
47 cutNameValue = displayName;
50 title = cutNameValue + QLatin1String(
" [") + cutValue + QLatin1Char(
']');
55 explicit RecentFilesEntry(
const QUrl &_url,
const QString &_displayName, KRecentFilesMenu *menu)
57 , displayName(_displayName)
59 action =
new QAction(titleWithSensibleWidth(menu));
71class KRecentFilesMenuPrivate
74 explicit KRecentFilesMenuPrivate(KRecentFilesMenu *q_ptr);
76 std::vector<RecentFilesEntry *>::iterator findEntry(
const QUrl &url);
77 void recentFilesChanged()
const;
79 KRecentFilesMenu *
const q;
80 QString m_group = QStringLiteral(
"RecentFiles");
81 std::vector<RecentFilesEntry *> m_entries;
82 QSettings *m_settings;
83 size_t m_maximumItems = 10;
84 QAction *m_noEntriesAction;
85 QAction *m_clearAction;
92std::vector<RecentFilesEntry *>::iterator KRecentFilesMenuPrivate::findEntry(
const QUrl &url)
94 return std::find_if(m_entries.begin(), m_entries.end(), [url](RecentFilesEntry *entry) {
95 return entry->url == url;
99void KRecentFilesMenuPrivate::recentFilesChanged()
const
102 Q_EMIT q->recentFilesChanged();
105KRecentFilesMenu::KRecentFilesMenu(
const QString &title,
QWidget *parent)
106 :
QMenu(title, parent)
107 , d(new KRecentFilesMenuPrivate(this))
112 d->m_settings =
new QSettings(fileName, QSettings::Format::IniFormat,
this);
114 d->m_noEntriesAction =
new QAction(tr(
"No Entries"));
115 d->m_noEntriesAction->setDisabled(
true);
122KRecentFilesMenu::KRecentFilesMenu(
QWidget *parent)
127KRecentFilesMenu::~KRecentFilesMenu()
130 qDeleteAll(d->m_entries);
131 delete d->m_clearAction;
132 delete d->m_noEntriesAction;
135void KRecentFilesMenu::readFromFile()
137 qDeleteAll(d->m_entries);
138 d->m_entries.clear();
140 d->m_settings->beginGroup(d->m_group);
141 const int size = d->m_settings->beginReadArray(QStringLiteral(
"files"));
143 d->m_entries.reserve(
size);
145 for (
int i = 0; i <
size; ++i) {
146 d->m_settings->setArrayIndex(i);
148 const QUrl url = d->m_settings->value(QStringLiteral(
"url")).toUrl();
149 RecentFilesEntry *entry =
new RecentFilesEntry(url, d->m_settings->value(QStringLiteral(
"displayName")).
toString(),
this);
150 d->m_entries.push_back(entry);
153 d->m_settings->endArray();
154 d->m_settings->endGroup();
156 d->recentFilesChanged();
161 if (d->m_entries.size() == d->m_maximumItems) {
162 delete d->m_entries.back();
163 d->m_entries.pop_back();
167 auto it = d->findEntry(url);
168 if (it != d->m_entries.cend()) {
170 d->m_entries.erase(it);
179 RecentFilesEntry *entry =
new RecentFilesEntry(url, displayName,
this);
180 d->m_entries.insert(d->m_entries.begin(), entry);
182 d->recentFilesChanged();
187 auto it = d->findEntry(url);
189 if (it == d->m_entries.end()) {
194 d->m_entries.erase(it);
196 d->recentFilesChanged();
199void KRecentFilesMenu::rebuildMenu()
203 if (d->m_entries.empty()) {
208 for (
const RecentFilesEntry *entry : d->m_entries) {
219void KRecentFilesMenu::writeToFile()
221 d->m_settings->remove(QString());
222 d->m_settings->beginGroup(d->m_group);
223 d->m_settings->beginWriteArray(QStringLiteral(
"files"));
226 for (
const RecentFilesEntry *entry : d->m_entries) {
227 d->m_settings->setArrayIndex(index);
228 d->m_settings->setValue(QStringLiteral(
"url"), entry->url);
229 d->m_settings->setValue(QStringLiteral(
"displayName"), entry->displayName);
233 d->m_settings->endArray();
234 d->m_settings->endGroup();
235 d->m_settings->sync();
251 return d->m_maximumItems;
260 qDeleteAll(d->m_entries.begin() +
maximumItems, d->m_entries.end());
261 d->m_entries.erase(d->m_entries.begin() +
maximumItems, d->m_entries.end());
263 d->recentFilesChanged();
270 urls.
reserve(d->m_entries.size());
271 std::transform(d->m_entries.cbegin(), d->m_entries.cend(), std::back_inserter(urls), [](
const RecentFilesEntry *entry) {
280 qDeleteAll(d->m_entries);
281 d->m_entries.clear();
283 d->recentFilesChanged();
286#include "moc_krecentfilesmenu.cpp"
char * toString(const EngineQuery &query)
void triggered(bool checked)
QRect boundingRect(QChar ch) const const
QString elidedText(const QString &text, Qt::TextElideMode mode, int width, int flags) const const
QList< QScreen * > screens()
QIcon fromTheme(const QString &name)
void reserve(qsizetype size)
QMetaObject::Connection connect(const QObject *sender, PointerToMemberFunction signal, Functor functor)
QString writableLocation(StandardLocation type)
QString arg(Args &&... args) const const
bool isEmpty() const const
QString fileName(ComponentFormattingOptions options) const const