From 18ba63d651f8927a43951be5d3a4ab6193dd782a Mon Sep 17 00:00:00 2001 From: Luigi Baldoni Date: Fri, 1 May 2020 10:26:49 +0000 Subject: [PATCH] Accepting request 799467 from home:alois:branches:graphics - Update to version 0.9 What's new: * Directory tree & bookmarks in folder view * High quality scaling via OpenCV * Reduced memory usage when viewing zoomed images * Zoom level indicator * Image centering options * Slideshow mode (~ key) * Show directory now highlights current file * Improved touchpad support (see settings > controls) * gif playback controls. Play / pause & frame step, similar to video * Crop panel now has save button. Shortcut is Shift+Enter * Added an option to start into folder view * Support for HEIF / HEIC image format Bug fixes: * Window state is now saved correctly * Various UI fixes * Possible crash fix in thumbnailer - Refreshed qimgv-nosharedlib.patch - Dropped mpv-qthelper.patch (merged upstream) - Added qimgv-includepath.patch and qimgv-Qt512.patch OBS-URL: https://build.opensuse.org/request/show/799467 OBS-URL: https://build.opensuse.org/package/show/graphics/qimgv?expand=0&rev=32 --- mpv-qthelper.patch | 430 ---------------------------------------- qimgv-0.8.9.tar.gz | 3 - qimgv-0.9.tar.gz | 3 + qimgv-Qt512.patch | 25 +++ qimgv-includepath.patch | 26 +++ qimgv-nosharedlib.patch | 12 +- qimgv.changes | 26 +++ qimgv.spec | 11 +- 8 files changed, 93 insertions(+), 443 deletions(-) delete mode 100644 mpv-qthelper.patch delete mode 100644 qimgv-0.8.9.tar.gz create mode 100644 qimgv-0.9.tar.gz create mode 100644 qimgv-Qt512.patch create mode 100644 qimgv-includepath.patch diff --git a/mpv-qthelper.patch b/mpv-qthelper.patch deleted file mode 100644 index 90314fd..0000000 --- a/mpv-qthelper.patch +++ /dev/null @@ -1,430 +0,0 @@ -From 935c6f35b4d0315b9c3aadcf375072998d542eb0 Mon Sep 17 00:00:00 2001 -From: easymodo -Date: Thu, 19 Mar 2020 14:42:35 +0200 -Subject: [PATCH] [mpv] include qthelper.hpp in project #184 - ---- - qimgv_libs/qimgv_player_mpv/CMakeLists.txt | 3 +- - qimgv_libs/qimgv_player_mpv/src/mpvwidget.h | 2 +- - qimgv_libs/qimgv_player_mpv/src/qthelper.hpp | 386 +++++++++++++++++++ - 3 files changed, 389 insertions(+), 2 deletions(-) - create mode 100644 qimgv_libs/qimgv_player_mpv/src/qthelper.hpp - -Index: qimgv-0.8.9/qimgv_libs/qimgv_player_mpv/CMakeLists.txt -=================================================================== ---- qimgv-0.8.9.orig/qimgv_libs/qimgv_player_mpv/CMakeLists.txt -+++ qimgv-0.8.9/qimgv_libs/qimgv_player_mpv/CMakeLists.txt -@@ -15,7 +15,8 @@ include(GNUInstallDirs) - add_library(qimgv_player_mpv STATIC - src/videoplayer.cpp - src/mpvwidget.cpp -- src/videoplayermpv.cpp) -+ src/videoplayermpv.cpp -+ src/qthelper.hpp) - - target_compile_features(qimgv_player_mpv PRIVATE cxx_std_11) - -Index: qimgv-0.8.9/qimgv_libs/qimgv_player_mpv/src/mpvwidget.h -=================================================================== ---- qimgv-0.8.9.orig/qimgv_libs/qimgv_player_mpv/src/mpvwidget.h -+++ qimgv-0.8.9/qimgv_libs/qimgv_player_mpv/src/mpvwidget.h -@@ -3,7 +3,7 @@ - #include - #include - #include --#include -+#include "qthelper.hpp" - #include - #include - #include -Index: qimgv-0.8.9/qimgv_libs/qimgv_player_mpv/src/qthelper.hpp -=================================================================== ---- /dev/null -+++ qimgv-0.8.9/qimgv_libs/qimgv_player_mpv/src/qthelper.hpp -@@ -0,0 +1,386 @@ -+/* Copyright (C) 2017 the mpv developers -+ * -+ * Permission to use, copy, modify, and/or distribute this software for any -+ * purpose with or without fee is hereby granted, provided that the above -+ * copyright notice and this permission notice appear in all copies. -+ * -+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -+ */ -+ -+#ifndef MPV_CLIENT_API_QTHELPER_H_ -+#define MPV_CLIENT_API_QTHELPER_H_ -+ -+#include -+ -+#if !MPV_ENABLE_DEPRECATED -+#error "This helper is deprecated. Copy it into your project instead." -+#else -+ -+/** -+ * Note: these helpers are provided for convenience for C++/Qt applications. -+ * This is based on the public API in client.h, and it does not encode any -+ * knowledge that is not known or guaranteed outside of the C client API. You -+ * can even copy and modify this code as you like, or implement similar things -+ * for other languages. -+ */ -+ -+#include -+ -+#include -+#include -+#include -+#include -+#include -+#include -+ -+namespace mpv { -+namespace qt { -+ -+// Wrapper around mpv_handle. Does refcounting under the hood. -+class Handle -+{ -+ struct container { -+ container(mpv_handle *h) : mpv(h) {} -+ ~container() { mpv_terminate_destroy(mpv); } -+ mpv_handle *mpv; -+ }; -+ QSharedPointer sptr; -+public: -+ // Construct a new Handle from a raw mpv_handle with refcount 1. If the -+ // last Handle goes out of scope, the mpv_handle will be destroyed with -+ // mpv_terminate_destroy(). -+ // Never destroy the mpv_handle manually when using this wrapper. You -+ // will create dangling pointers. Just let the wrapper take care of -+ // destroying the mpv_handle. -+ // Never create multiple wrappers from the same raw mpv_handle; copy the -+ // wrapper instead (that's what it's for). -+ static Handle FromRawHandle(mpv_handle *handle) { -+ Handle h; -+ h.sptr = QSharedPointer(new container(handle)); -+ return h; -+ } -+ -+ // Return the raw handle; for use with the libmpv C API. -+ operator mpv_handle*() const { return sptr ? (*sptr).mpv : 0; } -+}; -+ -+static inline QVariant node_to_variant(const mpv_node *node) -+{ -+ switch (node->format) { -+ case MPV_FORMAT_STRING: -+ return QVariant(QString::fromUtf8(node->u.string)); -+ case MPV_FORMAT_FLAG: -+ return QVariant(static_cast(node->u.flag)); -+ case MPV_FORMAT_INT64: -+ return QVariant(static_cast(node->u.int64)); -+ case MPV_FORMAT_DOUBLE: -+ return QVariant(node->u.double_); -+ case MPV_FORMAT_NODE_ARRAY: { -+ mpv_node_list *list = node->u.list; -+ QVariantList qlist; -+ for (int n = 0; n < list->num; n++) -+ qlist.append(node_to_variant(&list->values[n])); -+ return QVariant(qlist); -+ } -+ case MPV_FORMAT_NODE_MAP: { -+ mpv_node_list *list = node->u.list; -+ QVariantMap qmap; -+ for (int n = 0; n < list->num; n++) { -+ qmap.insert(QString::fromUtf8(list->keys[n]), -+ node_to_variant(&list->values[n])); -+ } -+ return QVariant(qmap); -+ } -+ default: // MPV_FORMAT_NONE, unknown values (e.g. future extensions) -+ return QVariant(); -+ } -+} -+ -+struct node_builder { -+ node_builder(const QVariant& v) { -+ set(&node_, v); -+ } -+ ~node_builder() { -+ free_node(&node_); -+ } -+ mpv_node *node() { return &node_; } -+private: -+ Q_DISABLE_COPY(node_builder) -+ mpv_node node_; -+ mpv_node_list *create_list(mpv_node *dst, bool is_map, int num) { -+ dst->format = is_map ? MPV_FORMAT_NODE_MAP : MPV_FORMAT_NODE_ARRAY; -+ mpv_node_list *list = new mpv_node_list(); -+ dst->u.list = list; -+ if (!list) -+ goto err; -+ list->values = new mpv_node[num](); -+ if (!list->values) -+ goto err; -+ if (is_map) { -+ list->keys = new char*[num](); -+ if (!list->keys) -+ goto err; -+ } -+ return list; -+ err: -+ free_node(dst); -+ return NULL; -+ } -+ char *dup_qstring(const QString &s) { -+ QByteArray b = s.toUtf8(); -+ char *r = new char[b.size() + 1]; -+ if (r) -+ std::memcpy(r, b.data(), b.size() + 1); -+ return r; -+ } -+ bool test_type(const QVariant &v, QMetaType::Type t) { -+ // The Qt docs say: "Although this function is declared as returning -+ // "QVariant::Type(obsolete), the return value should be interpreted -+ // as QMetaType::Type." -+ // So a cast really seems to be needed to avoid warnings (urgh). -+ return static_cast(v.type()) == static_cast(t); -+ } -+ void set(mpv_node *dst, const QVariant &src) { -+ if (test_type(src, QMetaType::QString)) { -+ dst->format = MPV_FORMAT_STRING; -+ dst->u.string = dup_qstring(src.toString()); -+ if (!dst->u.string) -+ goto fail; -+ } else if (test_type(src, QMetaType::Bool)) { -+ dst->format = MPV_FORMAT_FLAG; -+ dst->u.flag = src.toBool() ? 1 : 0; -+ } else if (test_type(src, QMetaType::Int) || -+ test_type(src, QMetaType::LongLong) || -+ test_type(src, QMetaType::UInt) || -+ test_type(src, QMetaType::ULongLong)) -+ { -+ dst->format = MPV_FORMAT_INT64; -+ dst->u.int64 = src.toLongLong(); -+ } else if (test_type(src, QMetaType::Double)) { -+ dst->format = MPV_FORMAT_DOUBLE; -+ dst->u.double_ = src.toDouble(); -+ } else if (src.canConvert()) { -+ QVariantList qlist = src.toList(); -+ mpv_node_list *list = create_list(dst, false, qlist.size()); -+ if (!list) -+ goto fail; -+ list->num = qlist.size(); -+ for (int n = 0; n < qlist.size(); n++) -+ set(&list->values[n], qlist[n]); -+ } else if (src.canConvert()) { -+ QVariantMap qmap = src.toMap(); -+ mpv_node_list *list = create_list(dst, true, qmap.size()); -+ if (!list) -+ goto fail; -+ list->num = qmap.size(); -+ for (int n = 0; n < qmap.size(); n++) { -+ list->keys[n] = dup_qstring(qmap.keys()[n]); -+ if (!list->keys[n]) { -+ free_node(dst); -+ goto fail; -+ } -+ set(&list->values[n], qmap.values()[n]); -+ } -+ } else { -+ goto fail; -+ } -+ return; -+ fail: -+ dst->format = MPV_FORMAT_NONE; -+ } -+ void free_node(mpv_node *dst) { -+ switch (dst->format) { -+ case MPV_FORMAT_STRING: -+ delete[] dst->u.string; -+ break; -+ case MPV_FORMAT_NODE_ARRAY: -+ case MPV_FORMAT_NODE_MAP: { -+ mpv_node_list *list = dst->u.list; -+ if (list) { -+ for (int n = 0; n < list->num; n++) { -+ if (list->keys) -+ delete[] list->keys[n]; -+ if (list->values) -+ free_node(&list->values[n]); -+ } -+ delete[] list->keys; -+ delete[] list->values; -+ } -+ delete list; -+ break; -+ } -+ default: ; -+ } -+ dst->format = MPV_FORMAT_NONE; -+ } -+}; -+ -+/** -+ * RAII wrapper that calls mpv_free_node_contents() on the pointer. -+ */ -+struct node_autofree { -+ mpv_node *ptr; -+ node_autofree(mpv_node *a_ptr) : ptr(a_ptr) {} -+ ~node_autofree() { mpv_free_node_contents(ptr); } -+}; -+ -+#if MPV_ENABLE_DEPRECATED -+ -+/** -+ * Return the given property as mpv_node converted to QVariant, or QVariant() -+ * on error. -+ * -+ * @deprecated use get_property() instead -+ * -+ * @param name the property name -+ */ -+static inline QVariant get_property_variant(mpv_handle *ctx, const QString &name) -+{ -+ mpv_node node; -+ if (mpv_get_property(ctx, name.toUtf8().data(), MPV_FORMAT_NODE, &node) < 0) -+ return QVariant(); -+ node_autofree f(&node); -+ return node_to_variant(&node); -+} -+ -+/** -+ * Set the given property as mpv_node converted from the QVariant argument. -+ -+ * @deprecated use set_property() instead -+ */ -+static inline int set_property_variant(mpv_handle *ctx, const QString &name, -+ const QVariant &v) -+{ -+ node_builder node(v); -+ return mpv_set_property(ctx, name.toUtf8().data(), MPV_FORMAT_NODE, node.node()); -+} -+ -+/** -+ * Set the given option as mpv_node converted from the QVariant argument. -+ * -+ * @deprecated use set_property() instead -+ */ -+static inline int set_option_variant(mpv_handle *ctx, const QString &name, -+ const QVariant &v) -+{ -+ node_builder node(v); -+ return mpv_set_option(ctx, name.toUtf8().data(), MPV_FORMAT_NODE, node.node()); -+} -+ -+/** -+ * mpv_command_node() equivalent. Returns QVariant() on error (and -+ * unfortunately, the same on success). -+ * -+ * @deprecated use command() instead -+ */ -+static inline QVariant command_variant(mpv_handle *ctx, const QVariant &args) -+{ -+ node_builder node(args); -+ mpv_node res; -+ if (mpv_command_node(ctx, node.node(), &res) < 0) -+ return QVariant(); -+ node_autofree f(&res); -+ return node_to_variant(&res); -+} -+ -+#endif -+ -+/** -+ * This is used to return error codes wrapped in QVariant for functions which -+ * return QVariant. -+ * -+ * You can use get_error() or is_error() to extract the error status from a -+ * QVariant value. -+ */ -+struct ErrorReturn -+{ -+ /** -+ * enum mpv_error value (or a value outside of it if ABI was extended) -+ */ -+ int error; -+ -+ ErrorReturn() : error(0) {} -+ explicit ErrorReturn(int err) : error(err) {} -+}; -+ -+/** -+ * Return the mpv error code packed into a QVariant, or 0 (success) if it's not -+ * an error value. -+ * -+ * @return error code (<0) or success (>=0) -+ */ -+static inline int get_error(const QVariant &v) -+{ -+ if (!v.canConvert()) -+ return 0; -+ return v.value().error; -+} -+ -+/** -+ * Return whether the QVariant carries a mpv error code. -+ */ -+static inline bool is_error(const QVariant &v) -+{ -+ return get_error(v) < 0; -+} -+ -+/** -+ * Return the given property as mpv_node converted to QVariant, or QVariant() -+ * on error. -+ * -+ * @param name the property name -+ * @return the property value, or an ErrorReturn with the error code -+ */ -+static inline QVariant get_property(mpv_handle *ctx, const QString &name) -+{ -+ mpv_node node; -+ int err = mpv_get_property(ctx, name.toUtf8().data(), MPV_FORMAT_NODE, &node); -+ if (err < 0) -+ return QVariant::fromValue(ErrorReturn(err)); -+ node_autofree f(&node); -+ return node_to_variant(&node); -+} -+ -+/** -+ * Set the given property as mpv_node converted from the QVariant argument. -+ * -+ * @return mpv error code (<0 on error, >= 0 on success) -+ */ -+static inline int set_property(mpv_handle *ctx, const QString &name, -+ const QVariant &v) -+{ -+ node_builder node(v); -+ return mpv_set_property(ctx, name.toUtf8().data(), MPV_FORMAT_NODE, node.node()); -+} -+ -+/** -+ * mpv_command_node() equivalent. -+ * -+ * @param args command arguments, with args[0] being the command name as string -+ * @return the property value, or an ErrorReturn with the error code -+ */ -+static inline QVariant command(mpv_handle *ctx, const QVariant &args) -+{ -+ node_builder node(args); -+ mpv_node res; -+ int err = mpv_command_node(ctx, node.node(), &res); -+ if (err < 0) -+ return QVariant::fromValue(ErrorReturn(err)); -+ node_autofree f(&res); -+ return node_to_variant(&res); -+} -+ -+} -+} -+ -+Q_DECLARE_METATYPE(mpv::qt::ErrorReturn) -+ -+#endif /* else #if MPV_ENABLE_DEPRECATED */ -+ -+#endif diff --git a/qimgv-0.8.9.tar.gz b/qimgv-0.8.9.tar.gz deleted file mode 100644 index 095fc19..0000000 --- a/qimgv-0.8.9.tar.gz +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b7271b9f1324b56416708606d9ed69d695a862a1336276dc504a2333cb923e62 -size 476034 diff --git a/qimgv-0.9.tar.gz b/qimgv-0.9.tar.gz new file mode 100644 index 0000000..68270ed --- /dev/null +++ b/qimgv-0.9.tar.gz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b994cdcaad269de6774a59ff01dbfdb4adf0994f974fc5756daf43aa9bfeab05 +size 669848 diff --git a/qimgv-Qt512.patch b/qimgv-Qt512.patch new file mode 100644 index 0000000..4cb3474 --- /dev/null +++ b/qimgv-Qt512.patch @@ -0,0 +1,25 @@ +From a39d6086ceb9445d2c16943e0719096a99920bf8 Mon Sep 17 00:00:00 2001 +From: easymodo +Date: Fri, 1 May 2020 04:20:44 +0300 +Subject: [PATCH] fix build with qt < 5.14 #205 + +--- + .../directorymanager/watchers/linux/linuxworker.cpp | 4 ++++ + 1 file changed, 4 insertions(+) + +diff --git a/qimgv/components/directorymanager/watchers/linux/linuxworker.cpp b/qimgv/components/directorymanager/watchers/linux/linuxworker.cpp +index 96ec9d3..e49cf40 100644 +--- a/qimgv/components/directorymanager/watchers/linux/linuxworker.cpp ++++ b/qimgv/components/directorymanager/watchers/linux/linuxworker.cpp +@@ -21,7 +21,11 @@ void LinuxWorker::setDescriptor(int desc) { + + void LinuxWorker::run() { + emit started(); ++#if QT_VERSION < QT_VERSION_CHECK(5, 14, 0) ++ isRunning.store(true); ++#else + isRunning.storeRelaxed(true); ++#endif + + if (fd == -1) { + qDebug() << TAG << "File descriptor isn't set! Stopping"; diff --git a/qimgv-includepath.patch b/qimgv-includepath.patch new file mode 100644 index 0000000..de6b50a --- /dev/null +++ b/qimgv-includepath.patch @@ -0,0 +1,26 @@ +Index: qimgv-0.9/qimgv/3rdparty/QtOpenCV/cvmatandqimage.cpp +=================================================================== +--- qimgv-0.9.orig/qimgv/3rdparty/QtOpenCV/cvmatandqimage.cpp ++++ qimgv-0.9/qimgv/3rdparty/QtOpenCV/cvmatandqimage.cpp +@@ -28,7 +28,7 @@ + #include + #include + #include +-#include ++#include + + namespace QtOcv { + namespace { +Index: qimgv-0.9/qimgv/3rdparty/QtOpenCV/cvmatandqimage.h +=================================================================== +--- qimgv-0.9.orig/qimgv/3rdparty/QtOpenCV/cvmatandqimage.h ++++ qimgv-0.9/qimgv/3rdparty/QtOpenCV/cvmatandqimage.h +@@ -27,7 +27,7 @@ + #define CVMATANDQIMAGE_H + + #include +-#include ++#include + + namespace QtOcv { + diff --git a/qimgv-nosharedlib.patch b/qimgv-nosharedlib.patch index 8fceaaf..6a40bd5 100644 --- a/qimgv-nosharedlib.patch +++ b/qimgv-nosharedlib.patch @@ -1,7 +1,7 @@ -Index: qimgv-0.8.9/qimgv_libs/qimgv_player_mpv/CMakeLists.txt +Index: qimgv-0.9/qimgv_libs/qimgv_player_mpv/CMakeLists.txt =================================================================== ---- qimgv-0.8.9.orig/qimgv_libs/qimgv_player_mpv/CMakeLists.txt -+++ qimgv-0.8.9/qimgv_libs/qimgv_player_mpv/CMakeLists.txt +--- qimgv-0.9.orig/qimgv_libs/qimgv_player_mpv/CMakeLists.txt ++++ qimgv-0.9/qimgv_libs/qimgv_player_mpv/CMakeLists.txt @@ -12,7 +12,7 @@ pkg_check_modules(Mpv REQUIRED IMPORTED_ include(GNUInstallDirs) @@ -10,9 +10,9 @@ Index: qimgv-0.8.9/qimgv_libs/qimgv_player_mpv/CMakeLists.txt +add_library(qimgv_player_mpv STATIC src/videoplayer.cpp src/mpvwidget.cpp - src/videoplayermpv.cpp) -@@ -38,4 +38,3 @@ endif() + src/videoplayermpv.cpp +@@ -39,4 +39,3 @@ endif() target_compile_definitions(qimgv_player_mpv PRIVATE QIMGV_PLAYER_MPV_LIBRARY) --install(TARGETS qimgv_player_mpv) +-install(TARGETS qimgv_player_mpv LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}) diff --git a/qimgv.changes b/qimgv.changes index ae20b5d..dc7c0e9 100644 --- a/qimgv.changes +++ b/qimgv.changes @@ -1,3 +1,29 @@ +------------------------------------------------------------------- +Fri May 1 07:05:43 UTC 2020 - Luigi Baldoni + +- Update to version 0.9 + What's new: + * Directory tree & bookmarks in folder view + * High quality scaling via OpenCV + * Reduced memory usage when viewing zoomed images + * Zoom level indicator + * Image centering options + * Slideshow mode (~ key) + * Show directory now highlights current file + * Improved touchpad support (see settings > controls) + * gif playback controls. Play / pause & frame step, similar to + video + * Crop panel now has save button. Shortcut is Shift+Enter + * Added an option to start into folder view + * Support for HEIF / HEIC image format + Bug fixes: + * Window state is now saved correctly + * Various UI fixes + * Possible crash fix in thumbnailer +- Refreshed qimgv-nosharedlib.patch +- Dropped mpv-qthelper.patch (merged upstream) +- Added qimgv-includepath.patch and qimgv-Qt512.patch + ------------------------------------------------------------------- Thu Mar 19 13:12:28 UTC 2020 - Luigi Baldoni diff --git a/qimgv.spec b/qimgv.spec index 84fb105..4ae0cfd 100644 --- a/qimgv.spec +++ b/qimgv.spec @@ -17,7 +17,7 @@ Name: qimgv -Version: 0.8.9 +Version: 0.9 Release: 0 Summary: Qt5 image viewer License: GPL-3.0-only @@ -27,8 +27,10 @@ Source0: https://github.com/easymodo/qimgv/archive/v%{version}.tar.gz#/%{ Patch0: qimgv-nosharedlib.patch # PATCH-FEATURE-OPENSUSE qimgv-PIE.patch # aloisio@gmx.com add PIE flags Patch1: qimgv-PIE.patch -# PATCH-FIX-UPSTREAM mpv-qthelper.patch -Patch2: mpv-qthelper.patch +# PATCH-FIX-OPENSUSE qimgv-includepath.patch # aloisio@gmx.com use correct path for opencv includes +Patch2: qimgv-includepath.patch +# PATCH-FIX-UPSTREAM qimgv-Qt512.patch +Patch3: qimgv-Qt512.patch BuildRequires: cmake >= 3.13 %if 0%{?suse_version} > 1500 BuildRequires: gcc-c++ @@ -36,9 +38,10 @@ BuildRequires: gcc-c++ BuildRequires: gcc8-c++ %endif BuildRequires: hicolor-icon-theme +BuildRequires: opencv-devel BuildRequires: pkgconfig BuildRequires: pkgconfig(Qt5Concurrent) >= 5.9 -BuildRequires: pkgconfig(Qt5Widgets) >= 5.9 +BuildRequires: pkgconfig(Qt5Widgets) BuildRequires: pkgconfig(exiv2) BuildRequires: pkgconfig(mpv) >= 1.22.0