21#include <QGuiApplication>
26#include <QStandardItemModel>
27#include <QStyleFactory>
28#include <QActionGroup>
31#include <kconfiggroup.h>
32#include <klocalizedstring.h>
44 int pixelMetric(PixelMetric metric,
const QStyleOption *option =
nullptr,
const QWidget *widget =
nullptr)
const override
46 if (metric == QStyle::PM_SmallIconSize) {
49 return QProxyStyle::pixelMetric(metric, option, widget);
54 : KSelectAction(parent),
62 : KSelectAction(parent),
73 : KSelectAction(parent),
88 q->setMenu(
new QMenu());
89 q->setToolBarMode(KSelectAction::MenuMode);
96 clearAction = q->menu()->addAction(i18n(
"Clear List"), q, SLOT(clearActionTriggered()));
97 clearAction->setObjectName(QLatin1String(
"clear_action"));
100#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
101 q->connect(q, SIGNAL(triggered(QAction*)), SLOT(
_k_urlSelected(QAction*)));
103 q->connect(q, SIGNAL(actionTriggered(QAction*)), SLOT(
_k_urlSelected(QAction*)));
105 QString baseStyleName = q->menu()->style()->objectName();
106 if (baseStyleName != QLatin1String(
"windows")) {
109 baseStyleName = QStringLiteral(
"fusion");
111 QStyle *baseStyle = QStyleFactory::create(baseStyleName);
113 newStyle->setParent(q->menu());
114 q->menu()->setStyle(newStyle);
116 q->connect(q->menu(),
117 SIGNAL(aboutToShow()),
118 SLOT(menuAboutToShow()));
121 SIGNAL(fileAdded(
const QUrl &)),
122 SLOT(fileAdded(
const QUrl &)));
124 SIGNAL(fileRemoved(
const QUrl &)),
125 SLOT(fileRemoved(
const QUrl &)));
127 SIGNAL(listRenewed()),
128 SLOT(listRenewed()));
143 Q_EMIT q->urlSelected(
m_urls[action]);
151 const QUrl url = item->data().toUrl();
152 if (!url.isValid()) {
155 QAction *action =
m_urls.key(url);
159 const QIcon icon = item->icon();
163 action->setIcon(icon);
164 action->setIconVisibleInMenu(
true);
173 int maxWidthForTitles = INT_MAX;
174 Q_FOREACH(
const QScreen *screen, QGuiApplication::screens()) {
175 maxWidthForTitles = qMin(maxWidthForTitles, screen->availableGeometry().width() * 3 / 4);
177 const QFontMetrics fontMetrics = QFontMetrics(QFont());
179 QString title = nameValue +
" [" +
value +
']';
180 if (fontMetrics.boundingRect(title).width() > maxWidthForTitles) {
183 const int nameValueMaxWidth = maxWidthForTitles * 3 / 4;
184 const int nameWidth = fontMetrics.boundingRect(nameValue).width();
185 QString cutNameValue, cutValue;
186 if (nameWidth > nameValueMaxWidth) {
187 cutNameValue = fontMetrics.elidedText(nameValue, Qt::ElideMiddle, nameValueMaxWidth);
188 cutValue = fontMetrics.elidedText(
value, Qt::ElideMiddle, maxWidthForTitles - nameValueMaxWidth);
190 cutNameValue = nameValue;
191 cutValue = fontMetrics.elidedText(
value, Qt::ElideMiddle, maxWidthForTitles - nameWidth);
193 title = cutNameValue +
" [" + cutValue +
']';
202 menu()->insertAction(menu()->actions().
value(0), action);
203 d->m_urls.insert(action, url);
209 KSelectAction::removeAction(action);
211 d->m_urls.remove(action);
220 if (d->m_recentFilesModel) {
221 disconnect(d->m_recentFilesModel,
nullptr,
this,
nullptr);
224 d->m_recentFilesModel = model;
227 d->m_fileIconsPopulated =
false;
239 for (
int i = first; i <= last; i++) {
240 d->updateIcon(d->m_recentFilesModel->item(i));
247 if (!d->m_fileIconsPopulated) {
248 d->m_fileIconsPopulated =
true;
249 connect(d->m_recentFilesModel, SIGNAL(itemChanged(QStandardItem *)),
251 connect(d->m_recentFilesModel, SIGNAL(rowsInserted(
const QModelIndex &,
int,
int)),
255 const int count = d->m_recentFilesModel->rowCount();
256 for (
int i = 0; i < count; i++) {
257 d->updateIcon(d->m_recentFilesModel->item(i));
270 KSelectAction::clear();
272 d->m_noEntriesAction->setVisible(
true);
273 d->clearSeparator->setVisible(
false);
274 d->clearAction->setVisible(
false);
278void KRecentFilesAction::rebuildEntries()
285 if (items.count() > d->m_visibleItemsCount) {
286 items = items.mid(items.count() - d->m_visibleItemsCount);
288 bool thereAreEntries =
false;
289 Q_FOREACH(
const auto &item, items) {
291 if (item.m_url.isLocalFile()) {
292 value = item.m_url.toLocalFile();
298 value = item.m_url.toDisplayString();
300 const QString nameValue = item.m_displayName;
302 if (!
value.isNull()) {
303 thereAreEntries =
true;
304 QAction *action =
new QAction(title);
305 action->setActionGroup(selectableActionGroup());
306 addAction(action, item.m_url, nameValue);
309 if (thereAreEntries) {
310 d->m_noEntriesAction->setVisible(
false);
311 d->clearSeparator->setVisible(
true);
312 d->clearAction->setVisible(
true);
322 if (d->m_visibleItemsCount <= 0) {
327 if (selectableActionGroup()->actions().count() >= d->m_visibleItemsCount) {
329 delete removeAction(selectableActionGroup()->actions().first());
332 const QString tmpName = name.isEmpty() ? url.fileName() : name;
333 const QString pathOrUrl(url.toDisplayString(QUrl::PreferLocalFile));
336 const QString file = url.isLocalFile() ? QDir::toNativeSeparators(pathOrUrl) : pathOrUrl;
338 const QString file = pathOrUrl;
341 d->m_noEntriesAction->setVisible(
false);
342 d->clearSeparator->setVisible(
true);
343 d->clearAction->setVisible(
true);
347 QAction *action =
new QAction(title, selectableActionGroup());
354 for (QMap<QAction *, QUrl>::ConstIterator it = d->m_urls.constBegin(); it != d->m_urls.constEnd(); ++it) {
355 if (it.value() == url) {
367#include "moc_krecentfilesaction.cpp"
float value(const T *src, size_t ch)
connect(this, SIGNAL(optionsChanged()), this, SLOT(saveOptions()))
void _k_urlSelected(QAction *)
QMap< QAction *, QUrl > m_urls
QAction * m_noEntriesAction
void updateIcon(const QStandardItem *item)
void setRecentFilesModel(const QStandardItemModel *model)
virtual void clearActionTriggered()
void modelItemChanged(QStandardItem *item)
void modelRowsInserted(const QModelIndex &parent, int first, int last)
void fileRemoved(const QUrl &url)
KRecentFilesAction(QObject *parent)
void addAction(QAction *action, const QUrl &url, const QString &name)
QAction * removeAction(QAction *action) override
~KRecentFilesAction() override
KRecentFilesActionPrivate * d_ptr
void fileAdded(const QUrl &url)
int pixelMetric(PixelMetric metric, const QStyleOption *option=nullptr, const QWidget *widget=nullptr) const override
KRecentFilesIconProxyStyle(QStyle *style=nullptr)
QVector< KisRecentFilesEntry > recentFiles() const
static KisRecentFilesManager * instance()
static QString titleWithSensibleWidth(const QString &nameValue, const QString &value)