[office/tellico] /: Add option for preview size and increase default from 128 to 256

Robby Stephenson null at kde.org
Thu Dec 25 01:56:39 GMT 2025


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  <robby at periapsis.org>
+
+	* Added option to change file preview size and increased default to 256.
+
 2025-11-25  Robby Stephenson  <robby at periapsis.org>
 
 	* 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;
 };
 
 }


More information about the kde-doc-english mailing list