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;
93std::vector<RecentFilesEntry *>::iterator KRecentFilesMenuPrivate::findEntry(
const QUrl &url)
95 return std::find_if(m_entries.begin(), m_entries.end(), [url](RecentFilesEntry *entry) {
96 return entry->url == url;
100void KRecentFilesMenuPrivate::recentFilesChanged()
const
103 Q_EMIT q->recentFilesChanged();
106KRecentFilesMenu::KRecentFilesMenu(
const QString &title,
QWidget *parent)
107 :
QMenu(title, parent)
108 , d(new KRecentFilesMenuPrivate(this))
113 d->m_settings =
new QSettings(fileName, QSettings::Format::IniFormat,
this);
115 d->m_noEntriesAction =
new QAction(tr(
"No Entries"));
116 d->m_noEntriesAction->setDisabled(
true);
123KRecentFilesMenu::KRecentFilesMenu(
QWidget *parent)
128KRecentFilesMenu::~KRecentFilesMenu()
131 qDeleteAll(d->m_entries);
132 delete d->m_clearAction;
133 delete d->m_noEntriesAction;
136void KRecentFilesMenu::readFromFile()
138 qDeleteAll(d->m_entries);
139 d->m_entries.clear();
141 d->m_settings->beginGroup(d->m_group);
142 const int size = d->m_settings->beginReadArray(QStringLiteral(
"files"));
144 d->m_entries.reserve(
size);
146 for (
int i = 0; i <
size; ++i) {
147 d->m_settings->setArrayIndex(i);
149 const QUrl url = d->m_settings->value(QStringLiteral(
"url")).toUrl();
150 RecentFilesEntry *entry =
new RecentFilesEntry(url, d->m_settings->value(QStringLiteral(
"displayName")).
toString(),
this);
151 d->m_entries.push_back(entry);
154 d->m_settings->endArray();
155 d->m_settings->endGroup();
157 d->recentFilesChanged();
162 if (d->m_entries.size() == d->m_maximumItems) {
163 delete d->m_entries.back();
164 d->m_entries.pop_back();
168 auto it = d->findEntry(url);
169 if (it != d->m_entries.cend()) {
171 d->m_entries.erase(it);
180 RecentFilesEntry *entry =
new RecentFilesEntry(url, displayName,
this);
181 d->m_entries.insert(d->m_entries.begin(), entry);
183 d->recentFilesChanged();
188 auto it = d->findEntry(url);
190 if (it == d->m_entries.end()) {
195 d->m_entries.erase(it);
197 d->recentFilesChanged();
200void KRecentFilesMenu::rebuildMenu()
204 if (d->m_entries.empty()) {
209 for (
const RecentFilesEntry *entry : d->m_entries) {
220void KRecentFilesMenu::writeToFile()
222 d->m_settings->remove(QString());
223 d->m_settings->beginGroup(d->m_group);
224 d->m_settings->beginWriteArray(QStringLiteral(
"files"));
227 for (
const RecentFilesEntry *entry : d->m_entries) {
228 d->m_settings->setArrayIndex(index);
229 d->m_settings->setValue(QStringLiteral(
"url"), entry->url);
230 d->m_settings->setValue(QStringLiteral(
"displayName"), entry->displayName);
234 d->m_settings->endArray();
235 d->m_settings->endGroup();
236 d->m_settings->sync();
252 return d->m_maximumItems;
261 qDeleteAll(d->m_entries.begin() +
maximumItems, d->m_entries.end());
262 d->m_entries.erase(d->m_entries.begin() +
maximumItems, d->m_entries.end());
264 d->recentFilesChanged();
271 urls.
reserve(d->m_entries.size());
272 std::transform(d->m_entries.cbegin(), d->m_entries.cend(), std::back_inserter(urls), [](
const RecentFilesEntry *entry) {
281 qDeleteAll(d->m_entries);
282 d->m_entries.clear();
284 d->recentFilesChanged();
287#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