Git commit f0c3995833f8be42e9aa70b5b97ecca8ceef7b5c by Robby Stephenson. Committed on 25/12/2025 at 01:56. Pushed by rstephenson into branch 'master'.
Add option for preview size and increase default from 128 to 256 M +4 -0 ChangeLog M +18 -8 doc/hacking.docbook M +7 -5 src/core/netaccess.cpp M +1 -0 src/core/netaccess.h M +27 -24 src/translators/filereader.cpp M +5 -0 src/translators/filereader.h M +4 -40 src/translators/filereaderbook.cpp M +0 -6 src/translators/filereaderbook.h M +2 -34 src/translators/filereadervideo.cpp M +0 -5 src/translators/filereadervideo.h https://invent.kde.org/office/tellico/-/commit/f0c3995833f8be42e9aa70b5b97ecca8ceef7b5c diff --git a/ChangeLog b/ChangeLog index bb0d3ec25..647c45c73 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +2025-12-24 Robby Stephenson <[email protected]> + + * Added option to change file preview size and increased default to 256. + 2025-11-25 Robby Stephenson <[email protected]> * Fixed bug with XML generation for user-locale (Bug 512581). diff --git a/doc/hacking.docbook b/doc/hacking.docbook index b05661df2..dce6e12c6 100644 --- a/doc/hacking.docbook +++ b/doc/hacking.docbook @@ -359,6 +359,24 @@ This setting is for the location of the lyxpipe for sending bibliographic citati </sect3> </sect2> +<sect2 id="file-reader-options"> +<title>[File Reader Options]</title> + +<para>These settings should be placed in the <emphasis>File Reader Options</emphasis> group.</para> + +<sect3> +<title>Preview Size</title> + +<para>This setting is for the maximum size of the generated file preview.</para> +</sect3> + +<sect3> +<title>Example</title> +<informalexample> +<para><userinput>Preview Size=523</userinput></para> +</informalexample> +</sect3> +</sect2> </sect1> <sect1 id="bibtex-translation"> @@ -379,12 +397,4 @@ When bibtex files are imported or exported, certain characters are translated be </sect1> -<sect1 id="xslt-tricks"> -<title>XSLT Tricks</title> - -<para> -Here are some tips for writing XSLT to parse &appname; &XML; data: (TBD). -</para> -</sect1> - </chapter> diff --git a/src/core/netaccess.cpp b/src/core/netaccess.cpp index 4a5bfc507..8218d3c3f 100644 --- a/src/core/netaccess.cpp +++ b/src/core/netaccess.cpp @@ -40,6 +40,7 @@ static QStringList* tmpfiles = nullptr; +QStringList Tellico::NetAccess::s_defaultPreviewPlugins; QString Tellico::NetAccess::s_lastErrorMessage; using Tellico::NetAccess; @@ -105,11 +106,12 @@ QPixmap NetAccess::filePreview(const QUrl& url, int size) { QPixmap NetAccess::filePreview(const KFileItem& item, int size) { NetAccess netaccess; - // the default plugins are not used by default (what???) - // the default ones are in config settings instead, so ignore that - const QStringList plugins = KIO::PreviewJob::defaultPlugins(); - KIO::PreviewJob* previewJob = KIO::filePreview(KFileItemList() << item, QSize(size, size), - &plugins); + // the default plugins are not used by default, preferring + // ones are in config settings instead, so ignore that + if(s_defaultPreviewPlugins.isEmpty()) { + s_defaultPreviewPlugins = KIO::PreviewJob::defaultPlugins(); + } + auto previewJob = KIO::filePreview({item}, QSize(size, size), &s_defaultPreviewPlugins); connect(previewJob, &KIO::PreviewJob::gotPreview, &netaccess, &Tellico::NetAccess::slotPreview); diff --git a/src/core/netaccess.h b/src/core/netaccess.h index c49888090..765975c2f 100644 --- a/src/core/netaccess.h +++ b/src/core/netaccess.h @@ -51,6 +51,7 @@ private Q_SLOTS: private: QPixmap m_preview; + static QStringList s_defaultPreviewPlugins; static QString s_lastErrorMessage; }; diff --git a/src/translators/filereader.cpp b/src/translators/filereader.cpp index bc8ff2340..ad0ba25b9 100644 --- a/src/translators/filereader.cpp +++ b/src/translators/filereader.cpp @@ -36,12 +36,37 @@ #include <KFileMetaData/Extractor> #include <KFileMetaData/SimpleExtractionResult> #endif +#include <KSharedConfig> +#include <KConfigGroup> #include <QDir> #include <QIcon> namespace { - static const int FILE_PREVIEW_SIZE = 128; + static const int FILE_PREVIEW_SIZE = 256; + static const int FILE_ICON_SIZE = 128; +} + +QString Tellico::AbstractFileReader::getCoverImage(const KFileItem& fi_) { + QPixmap pixmap; + if(useFilePreview()) { + KConfigGroup cfg(KSharedConfig::openConfig(), QLatin1String("File Reader Options")); + const auto previewSize = cfg.readEntry("Preview Size", FILE_PREVIEW_SIZE); + pixmap = Tellico::NetAccess::filePreview(fi_, previewSize); + } + if(pixmap.isNull()) { + if(iconImageId.contains(fi_.iconName())) { + return iconImageId.value(fi_.iconName()); + } else { + pixmap = QIcon::fromTheme(fi_.iconName()).pixmap(QSize(FILE_ICON_SIZE, FILE_ICON_SIZE)); + const QString id = ImageFactory::addImage(pixmap, QStringLiteral("PNG")); + if(!id.isEmpty()) { + iconImageId.insert(fi_.iconName(), id); + } + return id; + } + } + return ImageFactory::addImage(pixmap, QStringLiteral("PNG")); } using Tellico::FileReaderMetaData; @@ -76,8 +101,6 @@ public: QString volume; QStringList metaIgnore; - // cache the icon image ids to avoid repeated creation of Data::Image objects - QHash<QString, QString> iconImageId; #ifdef HAVE_KFILEMETADATA QHash<KFileMetaData::Property::Property, QString> propertyNameHash; #endif @@ -156,27 +179,7 @@ bool FileReaderFile::populate(Data::EntryPtr entry, const KFileItem& item) { entry->setField(metainfo, strings.join(FieldFormat::rowDelimiterString())); #endif - QPixmap pixmap; - if(useFilePreview()) { - pixmap = Tellico::NetAccess::filePreview(item, FILE_PREVIEW_SIZE); - } - if(pixmap.isNull()) { - if(d->iconImageId.contains(item.iconName())) { - entry->setField(icon, d->iconImageId.value(item.iconName())); - } else { - pixmap = QIcon::fromTheme(item.iconName()).pixmap(QSize(FILE_PREVIEW_SIZE, FILE_PREVIEW_SIZE)); - const QString id = ImageFactory::addImage(pixmap, QStringLiteral("PNG")); - if(!id.isEmpty()) { - entry->setField(icon, id); - d->iconImageId.insert(item.iconName(), id); - } - } - } else { - const QString id = ImageFactory::addImage(pixmap, QStringLiteral("PNG")); - if(!id.isEmpty()) { - entry->setField(icon, id); - } - } + entry->setField(icon, getCoverImage(item)); return true; } diff --git a/src/translators/filereader.h b/src/translators/filereader.h index 2641f54c8..827d7a81e 100644 --- a/src/translators/filereader.h +++ b/src/translators/filereader.h @@ -53,9 +53,14 @@ public: virtual bool populate(Data::EntryPtr entry, const KFileItem& fileItem) = 0; +protected: + QString getCoverImage(const KFileItem& fileItem); + private: QUrl m_url; bool m_useFilePreview; + // cache the icon image ids to avoid repeated creation of Data::Image objects + QHash<QString, QString> iconImageId; }; class FileReaderMetaData : public AbstractFileReader { diff --git a/src/translators/filereaderbook.cpp b/src/translators/filereaderbook.cpp index 2c004d916..c8b82e9d6 100644 --- a/src/translators/filereaderbook.cpp +++ b/src/translators/filereaderbook.cpp @@ -40,21 +40,9 @@ #include <QDomDocument> #include <QImageReader> -namespace { - static const int FILE_PREVIEW_SIZE = 128; -} - using Tellico::FileReaderBook; -class FileReaderBook::Private { -public: - Private() = default; - - // cache the icon image ids to avoid repeated creation of Data::Image objects - QHash<QString, QString> iconImageId; -}; - -FileReaderBook::FileReaderBook(const QUrl& url_) : FileReaderMetaData(url_), d(new Private) { +FileReaderBook::FileReaderBook(const QUrl& url_) : FileReaderMetaData(url_) { } FileReaderBook::~FileReaderBook() = default; @@ -86,8 +74,9 @@ bool FileReaderBook::populate(Data::EntryPtr entry, const KFileItem& item) { entry->setField(QStringLiteral("binding"), i18n("E-Book")); // does it have a cover yet? - if(entry->field(QStringLiteral("cover")).isEmpty()) { - setCover(entry, item); + const QString cover = QStringLiteral("cover"); + if(entry->field(cover).isEmpty()) { + entry->setField(cover, getCoverImage(item)); } return true; } @@ -327,28 +316,3 @@ bool FileReaderBook::readMeta(Data::EntryPtr entry, const KFileItem& item) { return true; #endif } - -void FileReaderBook::setCover(Data::EntryPtr entry, const KFileItem& item) { - const QString cover = QStringLiteral("cover"); - QPixmap pixmap; - if(useFilePreview()) { - pixmap = Tellico::NetAccess::filePreview(item, FILE_PREVIEW_SIZE); - } - if(pixmap.isNull()) { - if(d->iconImageId.contains(item.iconName())) { - entry->setField(cover, d->iconImageId.value(item.iconName())); - } else { - pixmap = QIcon::fromTheme(item.iconName()).pixmap(QSize(FILE_PREVIEW_SIZE, FILE_PREVIEW_SIZE)); - const QString id = ImageFactory::addImage(pixmap, QStringLiteral("PNG")); - if(!id.isEmpty()) { - entry->setField(cover, id); - d->iconImageId.insert(item.iconName(), id); - } - } - } else { - const QString id = ImageFactory::addImage(pixmap, QStringLiteral("PNG")); - if(!id.isEmpty()) { - entry->setField(cover, id); - } - } -} diff --git a/src/translators/filereaderbook.h b/src/translators/filereaderbook.h index 1624bdf46..c8b3bbd6a 100644 --- a/src/translators/filereaderbook.h +++ b/src/translators/filereaderbook.h @@ -29,7 +29,6 @@ namespace Tellico { -class FileReaderBookPrivate; class FileReaderBook : public FileReaderMetaData { public: FileReaderBook(const QUrl& u); @@ -40,11 +39,6 @@ public: private: bool readEpub(Data::EntryPtr entry, const KFileItem& fileItem); bool readMeta(Data::EntryPtr entry, const KFileItem& fileItem); - void setCover(Data::EntryPtr entry, const KFileItem& fileItem); - - class Private; - friend class Private; - std::unique_ptr<Private> d; }; } diff --git a/src/translators/filereadervideo.cpp b/src/translators/filereadervideo.cpp index b00b06b53..0514fc06d 100644 --- a/src/translators/filereadervideo.cpp +++ b/src/translators/filereadervideo.cpp @@ -39,21 +39,9 @@ #include <QFileInfo> #include <QDomDocument> -namespace { - static const int FILE_PREVIEW_SIZE = 128; -} - using Tellico::FileReaderVideo; -class FileReaderVideo::Private { -public: - Private() = default; - - // cache the icon image ids to avoid repeated creation of Data::Image objects - QHash<QString, QString> iconImageId; -}; - -FileReaderVideo::FileReaderVideo(const QUrl& url_) : FileReaderMetaData(url_), d(new Private) { +FileReaderVideo::FileReaderVideo(const QUrl& url_) : FileReaderMetaData(url_) { } FileReaderVideo::~FileReaderVideo() = default; @@ -137,27 +125,7 @@ bool FileReaderVideo::populate(Data::EntryPtr entry, const KFileItem& item) { const QString id = ImageFactory::addImage(QUrl::fromLocalFile(posterFile), true /* quiet */); entry->setField(cover, id); } else { - QPixmap pixmap; - if(useFilePreview()) { - pixmap = Tellico::NetAccess::filePreview(item, FILE_PREVIEW_SIZE); - } - if(pixmap.isNull()) { - if(d->iconImageId.contains(item.iconName())) { - entry->setField(cover, d->iconImageId.value(item.iconName())); - } else { - pixmap = QIcon::fromTheme(item.iconName()).pixmap(QSize(FILE_PREVIEW_SIZE, FILE_PREVIEW_SIZE)); - const QString id = ImageFactory::addImage(pixmap, QStringLiteral("PNG")); - if(!id.isEmpty()) { - entry->setField(cover, id); - d->iconImageId.insert(item.iconName(), id); - } - } - } else { - const QString id = ImageFactory::addImage(pixmap, QStringLiteral("PNG")); - if(!id.isEmpty()) { - entry->setField(cover, id); - } - } + entry->setField(cover, getCoverImage(item)); } return true; diff --git a/src/translators/filereadervideo.h b/src/translators/filereadervideo.h index d229c7000..cd3166d08 100644 --- a/src/translators/filereadervideo.h +++ b/src/translators/filereadervideo.h @@ -29,7 +29,6 @@ namespace Tellico { -class FileReaderVideoPrivate; class FileReaderVideo : public FileReaderMetaData { public: FileReaderVideo(const QUrl& u); @@ -39,10 +38,6 @@ public: private: bool populateNfo(Data::EntryPtr entry, const QString& nfoFile); - - class Private; - friend class Private; - std::unique_ptr<Private> d; }; }
