mirror of
https://github.com/martinrotter/rssguard.git
synced 2025-02-03 02:37:46 +01:00
make webengine profile actually WORK, working user-data cache path working
This commit is contained in:
parent
1f6d7c0bf4
commit
191b503050
@ -24,7 +24,7 @@
|
||||
<url type="donation">https://github.com/sponsors/martinrotter</url>
|
||||
<content_rating type="oars-1.1" />
|
||||
<releases>
|
||||
<release version="4.2.4" date="2022-09-05"/>
|
||||
<release version="4.2.4" date="2022-09-06"/>
|
||||
</releases>
|
||||
<content_rating type="oars-1.0">
|
||||
<content_attribute id="violence-cartoon">none</content_attribute>
|
||||
|
@ -3,7 +3,7 @@
|
||||
#ifndef MESSAGE_H
|
||||
#define MESSAGE_H
|
||||
|
||||
#include "definitions/definitions.h"
|
||||
//#include "definitions/definitions.h"
|
||||
|
||||
#include <QDataStream>
|
||||
#include <QDateTime>
|
||||
|
@ -4,6 +4,7 @@
|
||||
|
||||
#include "3rd-party/boolinq/boolinq.h"
|
||||
#include "database/databasefactory.h"
|
||||
#include "definitions/definitions.h"
|
||||
|
||||
#include <QSqlDatabase>
|
||||
#include <QSqlError>
|
||||
|
@ -165,7 +165,7 @@
|
||||
|
||||
#if defined(USE_WEBENGINE)
|
||||
#define HTTP_COMPLETE_USERAGENT \
|
||||
(QWebEngineProfile::defaultProfile()->httpUserAgent().toLocal8Bit() + QByteArrayLiteral(" ") + \
|
||||
(qApp->web()->engineProfile()->httpUserAgent().toLocal8Bit() + QByteArrayLiteral(" ") + \
|
||||
QByteArrayLiteral(APP_USERAGENT))
|
||||
#else
|
||||
#define HTTP_COMPLETE_USERAGENT \
|
||||
|
@ -11,6 +11,7 @@
|
||||
#include "miscellaneous/iconfactory.h"
|
||||
#include "miscellaneous/settingsproperties.h"
|
||||
#include "miscellaneous/textfactory.h"
|
||||
#include "network-web/webfactory.h"
|
||||
|
||||
#include <QFile>
|
||||
#include <QJsonArray>
|
||||
@ -18,10 +19,6 @@
|
||||
#include <QPlainTextEdit>
|
||||
#include <QTextStream>
|
||||
|
||||
#if defined(USE_WEBENGINE)
|
||||
#include <QWebEngineProfile>
|
||||
#endif
|
||||
|
||||
FormAbout::FormAbout(QWidget* parent) : QDialog(parent) {
|
||||
m_ui.setupUi(this);
|
||||
m_ui.m_lblIcon->setPixmap(QPixmap(APP_ICON_PATH));
|
||||
@ -68,7 +65,7 @@ void FormAbout::loadSettingsAndPaths() {
|
||||
QDir::toNativeSeparators(qApp->nodejs()->packageFolder())
|
||||
.replace(user_data_path, QSL(USER_DATA_PLACEHOLDER)),
|
||||
#if defined(USE_WEBENGINE)
|
||||
QDir::toNativeSeparators(QWebEngineProfile::defaultProfile()->cachePath())
|
||||
QDir::toNativeSeparators(qApp->web()->engineProfile()->cachePath())
|
||||
.replace(user_data_path, QSL(USER_DATA_PLACEHOLDER))
|
||||
#else
|
||||
QSL("-")
|
||||
|
@ -107,6 +107,10 @@ void MessagePreviewer::clear() {
|
||||
m_message = Message();
|
||||
}
|
||||
|
||||
void MessagePreviewer::showItemInfo(RootItem* item) {
|
||||
m_msgBrowser->setHtml(item->additionalTooltip());
|
||||
}
|
||||
|
||||
void MessagePreviewer::hideToolbar() {
|
||||
m_toolBar->setVisible(false);
|
||||
}
|
||||
|
@ -17,7 +17,7 @@ class QToolBar;
|
||||
class WebBrowser;
|
||||
|
||||
class LabelButton : public QToolButton {
|
||||
Q_OBJECT
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit LabelButton(QWidget* parent = nullptr);
|
||||
@ -30,7 +30,7 @@ class LabelButton : public QToolButton {
|
||||
};
|
||||
|
||||
class MessagePreviewer : public QWidget {
|
||||
Q_OBJECT
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit MessagePreviewer(QWidget* parent = nullptr);
|
||||
@ -43,6 +43,7 @@ class MessagePreviewer : public QWidget {
|
||||
public slots:
|
||||
void setToolbarsVisible(bool visible);
|
||||
void clear();
|
||||
void showItemInfo(RootItem* item);
|
||||
void hideToolbar();
|
||||
void loadUrl(const QString& url);
|
||||
void loadMessage(const Message& message, RootItem* root);
|
||||
|
@ -26,7 +26,6 @@
|
||||
#include <QWebEngineContextMenuData>
|
||||
#endif
|
||||
|
||||
#include <QWebEngineProfile>
|
||||
#include <QWheelEvent>
|
||||
|
||||
WebEngineViewer::WebEngineViewer(QWidget* parent) : QWebEngineView(parent), m_browser(nullptr), m_root(nullptr) {
|
||||
@ -218,13 +217,10 @@ void WebEngineViewer::setVerticalScrollBarPosition(double pos) {
|
||||
void WebEngineViewer::applyFont(const QFont& fon) {
|
||||
auto pixel_size = QFontMetrics(fon).ascent();
|
||||
|
||||
QWebEngineProfile::defaultProfile()->settings()->setFontFamily(QWebEngineSettings::FontFamily::StandardFont,
|
||||
fon.family());
|
||||
QWebEngineProfile::defaultProfile()->settings()->setFontFamily(QWebEngineSettings::FontFamily::SerifFont,
|
||||
fon.family());
|
||||
QWebEngineProfile::defaultProfile()->settings()->setFontFamily(QWebEngineSettings::FontFamily::SansSerifFont,
|
||||
fon.family());
|
||||
QWebEngineProfile::defaultProfile()->settings()->setFontSize(QWebEngineSettings::DefaultFontSize, pixel_size);
|
||||
qApp->web()->engineProfile()->settings()->setFontFamily(QWebEngineSettings::FontFamily::StandardFont, fon.family());
|
||||
qApp->web()->engineProfile()->settings()->setFontFamily(QWebEngineSettings::FontFamily::SerifFont, fon.family());
|
||||
qApp->web()->engineProfile()->settings()->setFontFamily(QWebEngineSettings::FontFamily::SansSerifFont, fon.family());
|
||||
qApp->web()->engineProfile()->settings()->setFontSize(QWebEngineSettings::DefaultFontSize, pixel_size);
|
||||
}
|
||||
|
||||
qreal WebEngineViewer::zoomFactor() const {
|
||||
|
@ -3,6 +3,8 @@
|
||||
|
||||
#include "core/message.h"
|
||||
|
||||
#include "definitions/definitions.h"
|
||||
|
||||
#include <QUrl>
|
||||
|
||||
class WebBrowser;
|
||||
|
@ -50,8 +50,6 @@
|
||||
#else
|
||||
#include <QWebEngineDownloadItem>
|
||||
#endif
|
||||
|
||||
#include <QWebEngineProfile>
|
||||
#endif
|
||||
|
||||
#if defined(Q_OS_WIN)
|
||||
@ -153,17 +151,15 @@ Application::Application(const QString& id, int& argc, char** argv, const QStrin
|
||||
|
||||
const QString web_data_root = userDataFolder() + QDir::separator() + QSL("web");
|
||||
|
||||
QWebEngineProfile::defaultProfile()->setCachePath(web_data_root + QDir::separator() + QSL("cache"));
|
||||
QWebEngineProfile::defaultProfile()->setPersistentStoragePath(web_data_root + QDir::separator() + QSL("storage"));
|
||||
QWebEngineProfile::defaultProfile()->setHttpUserAgent(QString(HTTP_COMPLETE_USERAGENT));
|
||||
m_webFactory->engineProfile()->setCachePath(web_data_root + QDir::separator() + QSL("cache"));
|
||||
m_webFactory->engineProfile()->setHttpCacheType(QWebEngineProfile::HttpCacheType::DiskHttpCache);
|
||||
m_webFactory->engineProfile()->setPersistentStoragePath(web_data_root + QDir::separator() + QSL("storage"));
|
||||
m_webFactory->engineProfile()->setHttpUserAgent(QString(HTTP_COMPLETE_USERAGENT));
|
||||
|
||||
qDebugNN << LOGSEC_NETWORK << "Persistent web data storage path:"
|
||||
<< QUOTE_W_SPACE_DOT(QWebEngineProfile::defaultProfile()->persistentStoragePath());
|
||||
<< QUOTE_W_SPACE_DOT(m_webFactory->engineProfile()->persistentStoragePath());
|
||||
|
||||
connect(QWebEngineProfile::defaultProfile(),
|
||||
&QWebEngineProfile::downloadRequested,
|
||||
this,
|
||||
&Application::downloadRequested);
|
||||
connect(m_webFactory->engineProfile(), &QWebEngineProfile::downloadRequested, this, &Application::downloadRequested);
|
||||
#endif
|
||||
|
||||
connect(m_webFactory->adBlock(), &AdBlockManager::processTerminated, this, &Application::onAdBlockFailure);
|
||||
|
@ -4,26 +4,21 @@
|
||||
|
||||
#include "miscellaneous/application.h"
|
||||
#include "miscellaneous/textfactory.h"
|
||||
#include "network-web/webfactory.h"
|
||||
|
||||
#include <QNetworkProxy>
|
||||
#include <QNetworkReply>
|
||||
#include <QNetworkRequest>
|
||||
|
||||
#if defined(USE_WEBENGINE)
|
||||
#include <QWebEngineProfile>
|
||||
#endif
|
||||
|
||||
BaseNetworkAccessManager::BaseNetworkAccessManager(QObject* parent)
|
||||
: QNetworkAccessManager(parent) {
|
||||
BaseNetworkAccessManager::BaseNetworkAccessManager(QObject* parent) : QNetworkAccessManager(parent) {
|
||||
connect(this, &BaseNetworkAccessManager::sslErrors, this, &BaseNetworkAccessManager::onSslErrors);
|
||||
loadSettings();
|
||||
}
|
||||
|
||||
void BaseNetworkAccessManager::loadSettings() {
|
||||
QNetworkProxy new_proxy;
|
||||
const QNetworkProxy::ProxyType selected_proxy_type = static_cast<QNetworkProxy::ProxyType>(qApp->settings()->value(GROUP(Proxy),
|
||||
SETTING(Proxy::Type)).
|
||||
toInt());
|
||||
const QNetworkProxy::ProxyType selected_proxy_type =
|
||||
static_cast<QNetworkProxy::ProxyType>(qApp->settings()->value(GROUP(Proxy), SETTING(Proxy::Type)).toInt());
|
||||
|
||||
if (selected_proxy_type == QNetworkProxy::ProxyType::NoProxy) {
|
||||
// No extra setting is needed, set new proxy and exit this method.
|
||||
@ -35,10 +30,8 @@ void BaseNetworkAccessManager::loadSettings() {
|
||||
if (QNetworkProxy::applicationProxy().type() != QNetworkProxy::ProxyType::DefaultProxy &&
|
||||
QNetworkProxy::applicationProxy().type() != QNetworkProxy::ProxyType::NoProxy) {
|
||||
qWarningNN << LOGSEC_NETWORK
|
||||
<< "Used proxy address:"
|
||||
<< QUOTE_W_SPACE_COMMA(QNetworkProxy::applicationProxy().hostName())
|
||||
<< " type:"
|
||||
<< QUOTE_W_SPACE_DOT(QNetworkProxy::applicationProxy().type());
|
||||
<< "Used proxy address:" << QUOTE_W_SPACE_COMMA(QNetworkProxy::applicationProxy().hostName())
|
||||
<< " type:" << QUOTE_W_SPACE_DOT(QNetworkProxy::applicationProxy().type());
|
||||
}
|
||||
|
||||
setProxy(QNetworkProxy::applicationProxy());
|
||||
@ -48,9 +41,7 @@ void BaseNetworkAccessManager::loadSettings() {
|
||||
}
|
||||
|
||||
void BaseNetworkAccessManager::onSslErrors(QNetworkReply* reply, const QList<QSslError>& error) {
|
||||
qWarningNN << LOGSEC_NETWORK
|
||||
<< "Ignoring SSL errors for"
|
||||
<< QUOTE_W_SPACE_DOT(reply->url().toString());
|
||||
qWarningNN << LOGSEC_NETWORK << "Ignoring SSL errors for" << QUOTE_W_SPACE_DOT(reply->url().toString());
|
||||
reply->ignoreSslErrors(error);
|
||||
}
|
||||
|
||||
|
@ -7,6 +7,7 @@
|
||||
#include "miscellaneous/application.h"
|
||||
#include "miscellaneous/iofactory.h"
|
||||
#include "miscellaneous/settings.h"
|
||||
#include "network-web/webfactory.h"
|
||||
|
||||
#include <QDateTime>
|
||||
#include <QDir>
|
||||
@ -15,16 +16,19 @@
|
||||
|
||||
#if defined(USE_WEBENGINE)
|
||||
#include <QWebEngineCookieStore>
|
||||
#include <QWebEngineProfile>
|
||||
#endif
|
||||
|
||||
CookieJar::CookieJar(QObject* parent) : QNetworkCookieJar(parent) {
|
||||
#if defined(USE_WEBENGINE)
|
||||
// WebEngine does not store cookies, CookieJar does.
|
||||
QWebEngineProfile::defaultProfile()
|
||||
->setPersistentCookiesPolicy(QWebEngineProfile::PersistentCookiesPolicy::NoPersistentCookies);
|
||||
auto* web_factory = qobject_cast<WebFactory*>(parent);
|
||||
|
||||
m_webEngineCookies = QWebEngineProfile::defaultProfile()->cookieStore();
|
||||
if (web_factory != nullptr) {
|
||||
// WebEngine does not store cookies, CookieJar does.
|
||||
web_factory->engineProfile()
|
||||
->setPersistentCookiesPolicy(QWebEngineProfile::PersistentCookiesPolicy::NoPersistentCookies);
|
||||
|
||||
m_webEngineCookies = web_factory->engineProfile()->cookieStore();
|
||||
}
|
||||
#endif
|
||||
|
||||
// Load all cookies and also set them into WebEngine store.
|
||||
|
@ -23,8 +23,6 @@
|
||||
#include "miscellaneous/settings.h"
|
||||
#include "network-web/webengine/urlinterceptor.h"
|
||||
|
||||
#include <QWebEngineProfile>
|
||||
|
||||
NetworkUrlInterceptor::NetworkUrlInterceptor(QObject* parent)
|
||||
: QWebEngineUrlRequestInterceptor(parent), m_sendDnt(false) {}
|
||||
|
||||
|
@ -17,7 +17,7 @@
|
||||
#include <QUrlQuery>
|
||||
#include <QWebEngineScript>
|
||||
|
||||
WebEnginePage::WebEnginePage(QObject* parent) : QWebEnginePage(parent) {
|
||||
WebEnginePage::WebEnginePage(QObject* parent) : QWebEnginePage(qApp->web()->engineProfile(), parent) {
|
||||
setBackgroundColor(Qt::GlobalColor::transparent);
|
||||
|
||||
connect(this, &QWebEnginePage::loadFinished, this, &WebEnginePage::hideUnwantedElements);
|
||||
|
@ -32,18 +32,19 @@ WebFactory::WebFactory(QObject* parent) : QObject(parent) {
|
||||
m_adBlock = new AdBlockManager(this);
|
||||
|
||||
#if defined(USE_WEBENGINE)
|
||||
m_engineProfile = new QWebEngineProfile(QSL(APP_LOW_NAME), this);
|
||||
m_engineSettings = nullptr;
|
||||
m_urlInterceptor = new NetworkUrlInterceptor(this);
|
||||
#endif
|
||||
|
||||
m_cookieJar = new CookieJar(nullptr);
|
||||
m_cookieJar = new CookieJar(this);
|
||||
m_readability = new Readability(this);
|
||||
|
||||
#if defined(USE_WEBENGINE)
|
||||
#if QT_VERSION >= 0x050D00 // Qt >= 5.13.0
|
||||
QWebEngineProfile::defaultProfile()->setUrlRequestInterceptor(m_urlInterceptor);
|
||||
m_engineProfile->setUrlRequestInterceptor(m_urlInterceptor);
|
||||
#else
|
||||
QWebEngineProfile::defaultProfile()->setRequestInterceptor(m_urlInterceptor);
|
||||
m_engineProfile->setRequestInterceptor(m_urlInterceptor);
|
||||
#endif
|
||||
#endif
|
||||
}
|
||||
@ -55,9 +56,9 @@ WebFactory::~WebFactory() {
|
||||
}
|
||||
#endif
|
||||
|
||||
if (m_cookieJar != nullptr) {
|
||||
/*if (m_cookieJar != nullptr) {
|
||||
m_cookieJar->deleteLater();
|
||||
}
|
||||
}*/
|
||||
}
|
||||
|
||||
bool WebFactory::sendMessageViaEmail(const Message& message) {
|
||||
@ -271,6 +272,10 @@ NetworkUrlInterceptor* WebFactory::urlIinterceptor() const {
|
||||
return m_urlInterceptor;
|
||||
}
|
||||
|
||||
QWebEngineProfile* WebFactory::engineProfile() const {
|
||||
return m_engineProfile;
|
||||
}
|
||||
|
||||
QAction* WebFactory::engineSettingsAction() {
|
||||
if (m_engineSettings == nullptr) {
|
||||
m_engineSettings =
|
||||
@ -363,7 +368,7 @@ void WebFactory::webEngineSettingChanged(bool enabled) {
|
||||
QWebEngineSettings::WebAttribute attribute = static_cast<QWebEngineSettings::WebAttribute>(act->data().toInt());
|
||||
|
||||
qApp->settings()->setValue(WebEngineAttributes::ID, QString::number(static_cast<int>(attribute)), enabled);
|
||||
QWebEngineProfile::defaultProfile()->settings()->setAttribute(attribute, act->isChecked());
|
||||
m_engineProfile->settings()->setAttribute(attribute, act->isChecked());
|
||||
}
|
||||
|
||||
QAction* WebFactory::createEngineSettingsAction(const QString& title, QWebEngineSettings::WebAttribute attribute) {
|
||||
@ -374,7 +379,7 @@ QAction* WebFactory::createEngineSettingsAction(const QString& title, QWebEngine
|
||||
act->setChecked(qApp->settings()
|
||||
->value(WebEngineAttributes::ID, QString::number(static_cast<int>(attribute)), true)
|
||||
.toBool());
|
||||
QWebEngineProfile::defaultProfile()->settings()->setAttribute(attribute, act->isChecked());
|
||||
m_engineProfile->settings()->setAttribute(attribute, act->isChecked());
|
||||
connect(act, &QAction::toggled, this, &WebFactory::webEngineSettingChanged);
|
||||
return act;
|
||||
}
|
||||
|
@ -5,13 +5,15 @@
|
||||
|
||||
#include <QObject>
|
||||
|
||||
#include "core/messagesmodel.h"
|
||||
#include "core/message.h"
|
||||
|
||||
#include <QMap>
|
||||
|
||||
#if defined(USE_WEBENGINE)
|
||||
#include <QWebEngineProfile>
|
||||
#include <QWebEngineSettings>
|
||||
|
||||
class QAction;
|
||||
class NetworkUrlInterceptor;
|
||||
#endif
|
||||
|
||||
@ -21,7 +23,7 @@ class CookieJar;
|
||||
class Readability;
|
||||
|
||||
class WebFactory : public QObject {
|
||||
Q_OBJECT
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit WebFactory(QObject* parent = nullptr);
|
||||
@ -43,6 +45,7 @@ class WebFactory : public QObject {
|
||||
|
||||
#if defined(USE_WEBENGINE)
|
||||
NetworkUrlInterceptor* urlIinterceptor() const;
|
||||
QWebEngineProfile* engineProfile() const;
|
||||
#endif
|
||||
|
||||
CookieJar* cookieJar() const;
|
||||
@ -68,6 +71,7 @@ class WebFactory : public QObject {
|
||||
AdBlockManager* m_adBlock;
|
||||
|
||||
#if defined(USE_WEBENGINE)
|
||||
QWebEngineProfile* m_engineProfile;
|
||||
NetworkUrlInterceptor* m_urlInterceptor;
|
||||
QAction* m_engineSettings;
|
||||
#endif
|
||||
|
@ -10,14 +10,13 @@
|
||||
class RootItem;
|
||||
|
||||
class CustomMessagePreviewer : public QWidget {
|
||||
Q_OBJECT
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit CustomMessagePreviewer(QWidget* parent = nullptr);
|
||||
virtual ~CustomMessagePreviewer();
|
||||
|
||||
public:
|
||||
|
||||
// Clears displayed message.
|
||||
virtual void clear() = 0;
|
||||
|
||||
|
@ -2,6 +2,7 @@
|
||||
|
||||
#include "services/reddit/redditsubscription.h"
|
||||
|
||||
#include "definitions/definitions.h"
|
||||
#include "services/reddit/redditserviceroot.h"
|
||||
|
||||
RedditSubscription::RedditSubscription(RootItem* parent) : Feed(parent), m_prefixedName(QString()) {}
|
||||
|
@ -2,6 +2,7 @@
|
||||
|
||||
#include "services/tt-rss/gui/ttrssaccountdetails.h"
|
||||
|
||||
#include "definitions/definitions.h"
|
||||
#include "gui/guiutilities.h"
|
||||
#include "network-web/networkfactory.h"
|
||||
#include "services/tt-rss/definitions.h"
|
||||
|
@ -2,6 +2,7 @@
|
||||
|
||||
#include "services/tt-rss/gui/ttrssfeeddetails.h"
|
||||
|
||||
#include "definitions/definitions.h"
|
||||
#include "services/abstract/category.h"
|
||||
|
||||
TtRssFeedDetails::TtRssFeedDetails(QWidget* parent) : QWidget(parent) {
|
||||
@ -21,8 +22,9 @@ void TtRssFeedDetails::onUrlChanged(const QString& new_url) {
|
||||
}
|
||||
else if (!new_url.simplified().isEmpty()) {
|
||||
// New url is not well-formed but is not empty on the other hand.
|
||||
ui.m_txtUrl->setStatus(LineEditWithStatus::StatusType::Warning,
|
||||
tr(R"(The URL does not meet standard pattern. Does your URL start with "http://" or "https://" prefix.)"));
|
||||
ui.m_txtUrl->setStatus(
|
||||
LineEditWithStatus::StatusType::Warning,
|
||||
tr(R"(The URL does not meet standard pattern. Does your URL start with "http://" or "https://" prefix.)"));
|
||||
}
|
||||
else {
|
||||
// New url is empty.
|
||||
@ -30,16 +32,19 @@ void TtRssFeedDetails::onUrlChanged(const QString& new_url) {
|
||||
}
|
||||
}
|
||||
|
||||
void TtRssFeedDetails::loadCategories(const QList<Category*>& categories, RootItem* root_item, RootItem* parent_to_select) {
|
||||
ui.m_cmbParentCategory->addItem(root_item->fullIcon(), root_item->title(), QVariant::fromValue((void*) root_item));
|
||||
void TtRssFeedDetails::loadCategories(const QList<Category*>& categories,
|
||||
RootItem* root_item,
|
||||
RootItem* parent_to_select) {
|
||||
ui.m_cmbParentCategory->addItem(root_item->fullIcon(), root_item->title(), QVariant::fromValue((void*)root_item));
|
||||
|
||||
for (Category* category : categories) {
|
||||
ui.m_cmbParentCategory->addItem(category->fullIcon(), category->title(), QVariant::fromValue((void*) category));
|
||||
ui.m_cmbParentCategory->addItem(category->fullIcon(), category->title(), QVariant::fromValue((void*)category));
|
||||
}
|
||||
|
||||
if (parent_to_select != nullptr) {
|
||||
if (parent_to_select->kind() == RootItem::Kind::Category) {
|
||||
ui.m_cmbParentCategory->setCurrentIndex(ui.m_cmbParentCategory->findData(QVariant::fromValue((void*)parent_to_select)));
|
||||
ui.m_cmbParentCategory
|
||||
->setCurrentIndex(ui.m_cmbParentCategory->findData(QVariant::fromValue((void*)parent_to_select)));
|
||||
}
|
||||
else if (parent_to_select->kind() == RootItem::Kind::Feed) {
|
||||
int target_item = ui.m_cmbParentCategory->findData(QVariant::fromValue((void*)parent_to_select->parent()));
|
||||
|
Loading…
x
Reference in New Issue
Block a user