Browse Source

Merge pull request #15682 from Chocobo1/qt6

Store Qt6 table header states under a different key
adaptive-webui-19844
Chocobo1 3 years ago committed by GitHub
parent
commit
ae1b963e0f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 40
      src/app/qtlocalpeer/qtlocalpeer.cpp
  2. 12
      src/app/qtlocalpeer/qtlocalpeer.h
  3. 14
      src/app/qtlocalpeer/qtlockedfile.cpp
  4. 12
      src/app/qtlocalpeer/qtlockedfile.h
  5. 22
      src/app/qtlocalpeer/qtlockedfile_unix.cpp
  6. 167
      src/app/qtlocalpeer/qtlockedfile_win.cpp
  7. 4
      src/base/bittorrent/torrentimpl.cpp
  8. 72
      src/base/preferences.cpp
  9. 6
      src/base/utils/misc.cpp
  10. 10
      src/gui/addnewtorrentdialog.cpp
  11. 4
      src/gui/addnewtorrentdialog.h
  12. 21
      src/gui/cookiesdialog.cpp
  13. 5
      src/gui/cookiesdialog.h
  14. 4
      src/gui/previewselectdialog.cpp

40
src/app/qtlocalpeer/qtlocalpeer.cpp

@ -90,49 +90,49 @@ namespace QtLP_Private
#endif #endif
} }
const char* QtLocalPeer::ack = "ack"; const char ACK[] = "ack";
QtLocalPeer::QtLocalPeer(const QString &path, QObject *parent) QtLocalPeer::QtLocalPeer(const QString &path, QObject *parent)
: QObject(parent) : QObject(parent)
, socketName(path + QLatin1String("/ipc-socket")) , m_socketName(path + QLatin1String("/ipc-socket"))
, server(new QLocalServer(this)) , m_server(new QLocalServer(this))
{ {
server->setSocketOptions(QLocalServer::UserAccessOption); m_server->setSocketOptions(QLocalServer::UserAccessOption);
lockFile.setFileName(path + QLatin1String("/lockfile")); m_lockFile.setFileName(path + QLatin1String("/lockfile"));
lockFile.open(QIODevice::ReadWrite); m_lockFile.open(QIODevice::ReadWrite);
} }
QtLocalPeer::~QtLocalPeer() QtLocalPeer::~QtLocalPeer()
{ {
if (!isClient()) if (!isClient())
{ {
lockFile.unlock(); m_lockFile.unlock();
lockFile.remove(); m_lockFile.remove();
} }
} }
bool QtLocalPeer::isClient() bool QtLocalPeer::isClient()
{ {
if (lockFile.isLocked()) if (m_lockFile.isLocked())
return false; return false;
if (!lockFile.lock(QtLP_Private::QtLockedFile::WriteLock, false)) if (!m_lockFile.lock(QtLP_Private::QtLockedFile::WriteLock, false))
return true; return true;
bool res = server->listen(socketName); bool res = m_server->listen(m_socketName);
#if defined(Q_OS_UNIX) #if defined(Q_OS_UNIX)
// ### Workaround // ### Workaround
if (!res && server->serverError() == QAbstractSocket::AddressInUseError) if (!res && m_server->serverError() == QAbstractSocket::AddressInUseError)
{ {
QFile::remove(socketName); QFile::remove(m_socketName);
res = server->listen(socketName); res = m_server->listen(m_socketName);
} }
#endif #endif
if (!res) if (!res)
qWarning("QtSingleCoreApplication: listen on local socket failed, %s", qPrintable(server->errorString())); qWarning("QtSingleCoreApplication: listen on local socket failed, %s", qUtf8Printable(m_server->errorString()));
connect(server, &QLocalServer::newConnection, this, &QtLocalPeer::receiveConnection); connect(m_server, &QLocalServer::newConnection, this, &QtLocalPeer::receiveConnection);
return false; return false;
} }
@ -146,7 +146,7 @@ bool QtLocalPeer::sendMessage(const QString &message, const int timeout)
for(int i = 0; i < 2; i++) for(int i = 0; i < 2; i++)
{ {
// Try twice, in case the other instance is just starting up // Try twice, in case the other instance is just starting up
socket.connectToServer(socketName); socket.connectToServer(m_socketName);
connOk = socket.waitForConnected(timeout/2); connOk = socket.waitForConnected(timeout/2);
if (connOk || i) if (connOk || i)
break; break;
@ -169,14 +169,14 @@ bool QtLocalPeer::sendMessage(const QString &message, const int timeout)
{ {
res &= socket.waitForReadyRead(timeout); // wait for ack res &= socket.waitForReadyRead(timeout); // wait for ack
if (res) if (res)
res &= (socket.read(qstrlen(ack)) == ack); res &= (socket.read(qstrlen(ACK)) == ACK);
} }
return res; return res;
} }
void QtLocalPeer::receiveConnection() void QtLocalPeer::receiveConnection()
{ {
QLocalSocket* socket = server->nextPendingConnection(); QLocalSocket *socket = m_server->nextPendingConnection();
if (!socket) if (!socket)
return; return;
@ -220,7 +220,7 @@ void QtLocalPeer::receiveConnection()
return; return;
} }
QString message(QString::fromUtf8(uMsg)); QString message(QString::fromUtf8(uMsg));
socket->write(ack, qstrlen(ack)); socket->write(ACK, qstrlen(ACK));
socket->waitForBytesWritten(1000); socket->waitForBytesWritten(1000);
socket->waitForDisconnected(1000); // make sure client reads ack socket->waitForDisconnected(1000); // make sure client reads ack
delete socket; delete socket;

12
src/app/qtlocalpeer/qtlocalpeer.h

@ -89,15 +89,11 @@ public:
signals: signals:
void messageReceived(const QString &message); void messageReceived(const QString &message);
protected slots: private slots:
void receiveConnection(); void receiveConnection();
protected:
QString id;
QString socketName;
QLocalServer *server = nullptr;
QtLP_Private::QtLockedFile lockFile;
private: private:
static const char* ack; QString m_socketName;
QLocalServer *m_server = nullptr;
QtLP_Private::QtLockedFile m_lockFile;
}; };

14
src/app/qtlocalpeer/qtlockedfile.cpp

@ -108,11 +108,7 @@
\sa QFile::QFile() \sa QFile::QFile()
*/ */
QtLockedFile::QtLockedFile() QtLockedFile::QtLockedFile() = default;
: QFile()
{
m_lock_mode = NoLock;
}
/*! /*!
Constructs an unlocked QtLockedFile object with file \a name. This Constructs an unlocked QtLockedFile object with file \a name. This
@ -124,7 +120,6 @@ QtLockedFile::QtLockedFile()
QtLockedFile::QtLockedFile(const QString &name) QtLockedFile::QtLockedFile(const QString &name)
: QFile(name) : QFile(name)
{ {
m_lock_mode = NoLock;
} }
/*! /*!
@ -142,7 +137,8 @@ QtLockedFile::QtLockedFile(const QString &name)
*/ */
bool QtLockedFile::open(const OpenMode mode) bool QtLockedFile::open(const OpenMode mode)
{ {
if (mode & QIODevice::Truncate) { if (mode & QIODevice::Truncate)
{
qWarning("QtLockedFile::open(): Truncate mode not allowed."); qWarning("QtLockedFile::open(): Truncate mode not allowed.");
return false; return false;
} }
@ -157,7 +153,7 @@ bool QtLockedFile::open(const OpenMode mode)
*/ */
bool QtLockedFile::isLocked() const bool QtLockedFile::isLocked() const
{ {
return m_lock_mode != NoLock; return m_lockMode != NoLock;
} }
/*! /*!
@ -168,7 +164,7 @@ bool QtLockedFile::isLocked() const
*/ */
QtLockedFile::LockMode QtLockedFile::lockMode() const QtLockedFile::LockMode QtLockedFile::lockMode() const
{ {
return m_lock_mode; return m_lockMode;
} }
/*! /*!

12
src/app/qtlocalpeer/qtlockedfile.h

@ -101,14 +101,14 @@ namespace QtLP_Private
private: private:
#ifdef Q_OS_WIN #ifdef Q_OS_WIN
Qt::HANDLE getMutexHandle(int idx, bool doCreate); Qt::HANDLE getMutexHandle(int idx, bool doCreate);
bool waitMutex(Qt::HANDLE mutex, bool doBlock); bool waitMutex(Qt::HANDLE mutex, bool doBlock) const;
Qt::HANDLE wmutex = nullptr; Qt::HANDLE m_writeMutex = nullptr;
Qt::HANDLE rmutex = nullptr; Qt::HANDLE m_readMutex = nullptr;
QVector<Qt::HANDLE> rmutexes; QVector<Qt::HANDLE> m_readMutexes;
QString mutexname; QString m_mutexName;
#endif #endif
LockMode m_lock_mode; LockMode m_lockMode = NoLock;
}; };
} }

22
src/app/qtlocalpeer/qtlockedfile_unix.cpp

@ -73,9 +73,10 @@
#include <string.h> #include <string.h>
#include <unistd.h> #include <unistd.h>
bool QtLockedFile::lock(LockMode mode, bool block) bool QtLockedFile::lock(const LockMode mode, const bool block)
{ {
if (!isOpen()) { if (!isOpen())
{
qWarning("QtLockedFile::lock(): file is not opened"); qWarning("QtLockedFile::lock(): file is not opened");
return false; return false;
} }
@ -83,10 +84,10 @@ bool QtLockedFile::lock(LockMode mode, bool block)
if (mode == NoLock) if (mode == NoLock)
return unlock(); return unlock();
if (mode == m_lock_mode) if (mode == m_lockMode)
return true; return true;
if (m_lock_mode != NoLock) if (m_lockMode != NoLock)
unlock(); unlock();
struct flock fl; struct flock fl;
@ -97,19 +98,21 @@ bool QtLockedFile::lock(LockMode mode, bool block)
int cmd = block ? F_SETLKW : F_SETLK; int cmd = block ? F_SETLKW : F_SETLK;
int ret = fcntl(handle(), cmd, &fl); int ret = fcntl(handle(), cmd, &fl);
if (ret == -1) { if (ret == -1)
{
if (errno != EINTR && errno != EAGAIN) if (errno != EINTR && errno != EAGAIN)
qWarning("QtLockedFile::lock(): fcntl: %s", strerror(errno)); qWarning("QtLockedFile::lock(): fcntl: %s", strerror(errno));
return false; return false;
} }
m_lock_mode = mode; m_lockMode = mode;
return true; return true;
} }
bool QtLockedFile::unlock() bool QtLockedFile::unlock()
{ {
if (!isOpen()) { if (!isOpen())
{
qWarning("QtLockedFile::unlock(): file is not opened"); qWarning("QtLockedFile::unlock(): file is not opened");
return false; return false;
} }
@ -124,12 +127,13 @@ bool QtLockedFile::unlock()
fl.l_type = F_UNLCK; fl.l_type = F_UNLCK;
int ret = fcntl(handle(), F_SETLKW, &fl); int ret = fcntl(handle(), F_SETLKW, &fl);
if (ret == -1) { if (ret == -1)
{
qWarning("QtLockedFile::lock(): fcntl: %s", strerror(errno)); qWarning("QtLockedFile::lock(): fcntl: %s", strerror(errno));
return false; return false;
} }
m_lock_mode = NoLock; m_lockMode = NoLock;
return true; return true;
} }

167
src/app/qtlocalpeer/qtlockedfile_win.cpp

@ -70,64 +70,73 @@
#include <QFileInfo> #include <QFileInfo>
#define MUTEX_PREFIX "QtLockedFile mutex " #include "base/global.h"
// Maximum number of concurrent read locks. Must not be greater than MAXIMUM_WAIT_OBJECTS
#define MAX_READERS MAXIMUM_WAIT_OBJECTS
#define QT_WA(unicode, ansi) unicode // Maximum number of concurrent read locks. Must not be greater than MAXIMUM_WAIT_OBJECTS
const int MAX_READERS = MAXIMUM_WAIT_OBJECTS;
Qt::HANDLE QtLockedFile::getMutexHandle(int idx, bool doCreate) Qt::HANDLE QtLockedFile::getMutexHandle(const int idx, const bool doCreate)
{ {
if (mutexname.isEmpty()) { if (m_mutexName.isEmpty())
{
QFileInfo fi(*this); QFileInfo fi(*this);
mutexname = QString::fromLatin1(MUTEX_PREFIX) m_mutexName = QString::fromLatin1("QtLockedFile mutex ") + fi.absoluteFilePath().toLower();
+ fi.absoluteFilePath().toLower();
} }
QString mname(mutexname);
QString mname = m_mutexName;
if (idx >= 0) if (idx >= 0)
mname += QString::number(idx); mname += QString::number(idx);
Qt::HANDLE mutex; if (doCreate)
if (doCreate) { {
QT_WA( { mutex = CreateMutexW(NULL, FALSE, reinterpret_cast<const TCHAR *>(mname.utf16())); }, const Qt::HANDLE mutex = ::CreateMutexW(NULL, FALSE, reinterpret_cast<const TCHAR *>(mname.utf16()));
{ mutex = CreateMutexA(NULL, FALSE, mname.toLocal8Bit().constData()); } ); if (!mutex)
if (!mutex) { {
qErrnoWarning("QtLockedFile::lock(): CreateMutex failed"); qErrnoWarning("QtLockedFile::lock(): CreateMutex failed");
return 0; return nullptr;
} }
return mutex;
} }
else { else
QT_WA( { mutex = OpenMutexW(SYNCHRONIZE | MUTEX_MODIFY_STATE, FALSE, reinterpret_cast<const TCHAR *>(mname.utf16())); }, {
{ mutex = OpenMutexA(SYNCHRONIZE | MUTEX_MODIFY_STATE, FALSE, mname.toLocal8Bit().constData()); } ); const Qt::HANDLE mutex = ::OpenMutexW((SYNCHRONIZE | MUTEX_MODIFY_STATE), FALSE, reinterpret_cast<const TCHAR *>(mname.utf16()));
if (!mutex) { if (!mutex)
{
if (GetLastError() != ERROR_FILE_NOT_FOUND) if (GetLastError() != ERROR_FILE_NOT_FOUND)
qErrnoWarning("QtLockedFile::lock(): OpenMutex failed"); qErrnoWarning("QtLockedFile::lock(): OpenMutex failed");
return 0; return nullptr;
}
} }
return mutex; return mutex;
}
return nullptr;
} }
bool QtLockedFile::waitMutex(Qt::HANDLE mutex, bool doBlock) bool QtLockedFile::waitMutex(const Qt::HANDLE mutex, const bool doBlock) const
{ {
Q_ASSERT(mutex); Q_ASSERT(mutex);
DWORD res = WaitForSingleObject(mutex, doBlock ? INFINITE : 0);
switch (res) { const DWORD res = ::WaitForSingleObject(mutex, (doBlock ? INFINITE : 0));
switch (res)
{
case WAIT_OBJECT_0: case WAIT_OBJECT_0:
case WAIT_ABANDONED: case WAIT_ABANDONED:
return true; return true;
break;
case WAIT_TIMEOUT: case WAIT_TIMEOUT:
break; return false;
default: default:
qErrnoWarning("QtLockedFile::lock(): WaitForSingleObject failed"); qErrnoWarning("QtLockedFile::lock(): WaitForSingleObject failed");
break;
} }
return false; return false;
} }
bool QtLockedFile::lock(LockMode mode, bool block) bool QtLockedFile::lock(const LockMode mode, const bool block)
{ {
if (!isOpen()) { if (!isOpen())
{
qWarning("QtLockedFile::lock(): file is not opened"); qWarning("QtLockedFile::lock(): file is not opened");
return false; return false;
} }
@ -135,72 +144,85 @@ bool QtLockedFile::lock(LockMode mode, bool block)
if (mode == NoLock) if (mode == NoLock)
return unlock(); return unlock();
if (mode == m_lock_mode) if (mode == m_lockMode)
return true; return true;
if (m_lock_mode != NoLock) if (m_lockMode != NoLock)
unlock(); unlock();
if (!wmutex && !(wmutex = getMutexHandle(-1, true))) if (!m_writeMutex && !(m_writeMutex = getMutexHandle(-1, true)))
return false; return false;
if (!waitMutex(wmutex, block)) if (!waitMutex(m_writeMutex, block))
return false; return false;
if (mode == ReadLock) { if (mode == ReadLock)
{
int idx = 0; int idx = 0;
for (; idx < MAX_READERS; idx++) { for (; idx < MAX_READERS; ++idx)
rmutex = getMutexHandle(idx, false); {
if (!rmutex || waitMutex(rmutex, false)) m_readMutex = getMutexHandle(idx, false);
if (!m_readMutex || waitMutex(m_readMutex, false))
break; break;
CloseHandle(rmutex); ::CloseHandle(m_readMutex);
} }
bool ok = true; bool ok = true;
if (idx >= MAX_READERS) { if (idx >= MAX_READERS)
{
qWarning("QtLockedFile::lock(): too many readers"); qWarning("QtLockedFile::lock(): too many readers");
rmutex = 0; m_readMutex = nullptr;
ok = false; ok = false;
} }
else if (!rmutex) { else if (!m_readMutex)
rmutex = getMutexHandle(idx, true); {
if (!rmutex || !waitMutex(rmutex, false)) m_readMutex = getMutexHandle(idx, true);
if (!m_readMutex || !waitMutex(m_readMutex, false))
ok = false; ok = false;
} }
if (!ok && rmutex) {
CloseHandle(rmutex); if (!ok && m_readMutex)
rmutex = 0; {
::CloseHandle(m_readMutex);
m_readMutex = nullptr;
} }
ReleaseMutex(wmutex);
::ReleaseMutex(m_writeMutex);
if (!ok) if (!ok)
return false; return false;
} }
else { else
Q_ASSERT(rmutexes.isEmpty()); {
for (int i = 0; i < MAX_READERS; i++) { Q_ASSERT(m_readMutexes.isEmpty());
Qt::HANDLE mutex = getMutexHandle(i, false); for (int i = 0; i < MAX_READERS; ++i)
{
const Qt::HANDLE mutex = getMutexHandle(i, false);
if (mutex) if (mutex)
rmutexes.append(mutex); m_readMutexes.append(mutex);
} }
if (rmutexes.size()) { if (m_readMutexes.size())
DWORD res = WaitForMultipleObjects(rmutexes.size(), rmutexes.constData(), {
TRUE, block ? INFINITE : 0); const DWORD res = ::WaitForMultipleObjects(m_readMutexes.size(), m_readMutexes.constData(),
if (res != WAIT_OBJECT_0 && res != WAIT_ABANDONED) { TRUE, (block ? INFINITE : 0));
if ((res != WAIT_OBJECT_0) && (res != WAIT_ABANDONED))
{
if (res != WAIT_TIMEOUT) if (res != WAIT_TIMEOUT)
qErrnoWarning("QtLockedFile::lock(): WaitForMultipleObjects failed"); qErrnoWarning("QtLockedFile::lock(): WaitForMultipleObjects failed");
m_lock_mode = WriteLock; // trick unlock() to clean up - semiyucky m_lockMode = WriteLock; // trick unlock() to clean up - semiyucky
unlock(); unlock();
return false; return false;
} }
} }
} }
m_lock_mode = mode; m_lockMode = mode;
return true; return true;
} }
bool QtLockedFile::unlock() bool QtLockedFile::unlock()
{ {
if (!isOpen()) { if (!isOpen())
{
qWarning("QtLockedFile::unlock(): file is not opened"); qWarning("QtLockedFile::unlock(): file is not opened");
return false; return false;
} }
@ -208,21 +230,24 @@ bool QtLockedFile::unlock()
if (!isLocked()) if (!isLocked())
return true; return true;
if (m_lock_mode == ReadLock) { if (m_lockMode == ReadLock)
ReleaseMutex(rmutex); {
CloseHandle(rmutex); ::ReleaseMutex(m_readMutex);
rmutex = 0; ::CloseHandle(m_readMutex);
m_readMutex = nullptr;
} }
else { else
foreach(Qt::HANDLE mutex, rmutexes) { {
ReleaseMutex(mutex); for (const Qt::HANDLE &mutex : asConst(m_readMutexes))
CloseHandle(mutex); {
::ReleaseMutex(mutex);
::CloseHandle(mutex);
} }
rmutexes.clear(); m_readMutexes.clear();
ReleaseMutex(wmutex); ::ReleaseMutex(m_writeMutex);
} }
m_lock_mode = QtLockedFile::NoLock; m_lockMode = QtLockedFile::NoLock;
return true; return true;
} }
@ -230,6 +255,6 @@ QtLockedFile::~QtLockedFile()
{ {
if (isOpen()) if (isOpen())
unlock(); unlock();
if (wmutex) if (m_writeMutex)
CloseHandle(wmutex); ::CloseHandle(m_writeMutex);
} }

4
src/base/bittorrent/torrentimpl.cpp

@ -33,10 +33,6 @@
#include <memory> #include <memory>
#include <type_traits> #include <type_traits>
#ifdef Q_OS_WIN
#include <Windows.h>
#endif
#include <libtorrent/address.hpp> #include <libtorrent/address.hpp>
#include <libtorrent/alert_types.hpp> #include <libtorrent/alert_types.hpp>
#include <libtorrent/magnet_uri.hpp> #include <libtorrent/magnet_uri.hpp>

72
src/base/preferences.cpp

@ -1265,12 +1265,20 @@ void Preferences::setMainGeometry(const QByteArray &geometry)
QByteArray Preferences::getMainVSplitterState() const QByteArray Preferences::getMainVSplitterState() const
{ {
#if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0))
return value("GUI/Qt6/MainWindow/VSplitterState").toByteArray();
#else
return value("MainWindow/qt5/vsplitterState").toByteArray(); return value("MainWindow/qt5/vsplitterState").toByteArray();
#endif
} }
void Preferences::setMainVSplitterState(const QByteArray &state) void Preferences::setMainVSplitterState(const QByteArray &state)
{ {
#if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0))
setValue("GUI/Qt6/MainWindow/VSplitterState", state);
#else
setValue("MainWindow/qt5/vsplitterState", state); setValue("MainWindow/qt5/vsplitterState", state);
#endif
} }
QString Preferences::getMainLastDir() const QString Preferences::getMainLastDir() const
@ -1285,12 +1293,20 @@ void Preferences::setMainLastDir(const QString &path)
QByteArray Preferences::getPeerListState() const QByteArray Preferences::getPeerListState() const
{ {
#if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0))
return value("GUI/Qt6/TorrentProperties/PeerListState").toByteArray();
#else
return value("TorrentProperties/Peers/qt5/PeerListState").toByteArray(); return value("TorrentProperties/Peers/qt5/PeerListState").toByteArray();
#endif
} }
void Preferences::setPeerListState(const QByteArray &state) void Preferences::setPeerListState(const QByteArray &state)
{ {
#if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0))
setValue("GUI/Qt6/TorrentProperties/PeerListState", state);
#else
setValue("TorrentProperties/Peers/qt5/PeerListState", state); setValue("TorrentProperties/Peers/qt5/PeerListState", state);
#endif
} }
QString Preferences::getPropSplitterSizes() const QString Preferences::getPropSplitterSizes() const
@ -1305,12 +1321,20 @@ void Preferences::setPropSplitterSizes(const QString &sizes)
QByteArray Preferences::getPropFileListState() const QByteArray Preferences::getPropFileListState() const
{ {
#if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0))
return value("GUI/Qt6/TorrentProperties/FilesListState").toByteArray();
#else
return value("TorrentProperties/qt5/FilesListState").toByteArray(); return value("TorrentProperties/qt5/FilesListState").toByteArray();
#endif
} }
void Preferences::setPropFileListState(const QByteArray &state) void Preferences::setPropFileListState(const QByteArray &state)
{ {
#if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0))
setValue("GUI/Qt6/TorrentProperties/FilesListState", state);
#else
setValue("TorrentProperties/qt5/FilesListState", state); setValue("TorrentProperties/qt5/FilesListState", state);
#endif
} }
int Preferences::getPropCurTab() const int Preferences::getPropCurTab() const
@ -1335,12 +1359,20 @@ void Preferences::setPropVisible(const bool visible)
QByteArray Preferences::getPropTrackerListState() const QByteArray Preferences::getPropTrackerListState() const
{ {
#if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0))
return value("GUI/Qt6/TorrentProperties/TrackerListState").toByteArray();
#else
return value("TorrentProperties/Trackers/qt5/TrackerListState").toByteArray(); return value("TorrentProperties/Trackers/qt5/TrackerListState").toByteArray();
#endif
} }
void Preferences::setPropTrackerListState(const QByteArray &state) void Preferences::setPropTrackerListState(const QByteArray &state)
{ {
#if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0))
setValue("GUI/Qt6/TorrentProperties/TrackerListState", state);
#else
setValue("TorrentProperties/Trackers/qt5/TrackerListState", state); setValue("TorrentProperties/Trackers/qt5/TrackerListState", state);
#endif
} }
QSize Preferences::getRssGeometrySize() const QSize Preferences::getRssGeometrySize() const
@ -1355,12 +1387,20 @@ void Preferences::setRssGeometrySize(const QSize &geometry)
QByteArray Preferences::getRssHSplitterSizes() const QByteArray Preferences::getRssHSplitterSizes() const
{ {
#if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0))
return value("GUI/Qt6/RSSFeedDownloader/HSplitterSizes").toByteArray();
#else
return value("RssFeedDownloader/qt5/hsplitterSizes").toByteArray(); return value("RssFeedDownloader/qt5/hsplitterSizes").toByteArray();
#endif
} }
void Preferences::setRssHSplitterSizes(const QByteArray &sizes) void Preferences::setRssHSplitterSizes(const QByteArray &sizes)
{ {
#if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0))
setValue("GUI/Qt6/RSSFeedDownloader/HSplitterSizes", sizes);
#else
setValue("RssFeedDownloader/qt5/hsplitterSizes", sizes); setValue("RssFeedDownloader/qt5/hsplitterSizes", sizes);
#endif
} }
QStringList Preferences::getRssOpenFolders() const QStringList Preferences::getRssOpenFolders() const
@ -1375,32 +1415,56 @@ void Preferences::setRssOpenFolders(const QStringList &folders)
QByteArray Preferences::getRssSideSplitterState() const QByteArray Preferences::getRssSideSplitterState() const
{ {
#if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0))
return value("GUI/Qt6/RSSWidget/SideSplitterState").toByteArray();
#else
return value("GUI/RSSWidget/qt5/splitter_h").toByteArray(); return value("GUI/RSSWidget/qt5/splitter_h").toByteArray();
#endif
} }
void Preferences::setRssSideSplitterState(const QByteArray &state) void Preferences::setRssSideSplitterState(const QByteArray &state)
{ {
#if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0))
setValue("GUI/Qt6/RSSWidget/SideSplitterState", state);
#else
setValue("GUI/RSSWidget/qt5/splitter_h", state); setValue("GUI/RSSWidget/qt5/splitter_h", state);
#endif
} }
QByteArray Preferences::getRssMainSplitterState() const QByteArray Preferences::getRssMainSplitterState() const
{ {
#if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0))
return value("GUI/Qt6/RSSWidget/MainSplitterState").toByteArray();
#else
return value("GUI/RSSWidget/qt5/splitterMain").toByteArray(); return value("GUI/RSSWidget/qt5/splitterMain").toByteArray();
#endif
} }
void Preferences::setRssMainSplitterState(const QByteArray &state) void Preferences::setRssMainSplitterState(const QByteArray &state)
{ {
#if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0))
setValue("GUI/Qt6/RSSWidget/MainSplitterState", state);
#else
setValue("GUI/RSSWidget/qt5/splitterMain", state); setValue("GUI/RSSWidget/qt5/splitterMain", state);
#endif
} }
QByteArray Preferences::getSearchTabHeaderState() const QByteArray Preferences::getSearchTabHeaderState() const
{ {
#if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0))
return value("GUI/Qt6/SearchTab/HeaderState").toByteArray();
#else
return value("SearchTab/qt5/HeaderState").toByteArray(); return value("SearchTab/qt5/HeaderState").toByteArray();
#endif
} }
void Preferences::setSearchTabHeaderState(const QByteArray &state) void Preferences::setSearchTabHeaderState(const QByteArray &state)
{ {
#if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0))
setValue("GUI/Qt6/SearchTab/HeaderState", state);
#else
setValue("SearchTab/qt5/HeaderState", state); setValue("SearchTab/qt5/HeaderState", state);
#endif
} }
bool Preferences::getRegexAsFilteringPatternForSearchJob() const bool Preferences::getRegexAsFilteringPatternForSearchJob() const
@ -1495,12 +1559,20 @@ void Preferences::setTransSelFilter(const int index)
QByteArray Preferences::getTransHeaderState() const QByteArray Preferences::getTransHeaderState() const
{ {
#if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0))
return value("GUI/Qt6/TransferList/HeaderState").toByteArray();
#else
return value("TransferList/qt5/HeaderState").toByteArray(); return value("TransferList/qt5/HeaderState").toByteArray();
#endif
} }
void Preferences::setTransHeaderState(const QByteArray &state) void Preferences::setTransHeaderState(const QByteArray &state)
{ {
#if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0))
setValue("GUI/Qt6/TransferList/HeaderState", state);
#else
setValue("TransferList/qt5/HeaderState", state); setValue("TransferList/qt5/HeaderState", state);
#endif
} }
bool Preferences::getRegexAsFilteringPatternForTransferList() const bool Preferences::getRegexAsFilteringPatternForTransferList() const

6
src/base/utils/misc.cpp

@ -133,18 +133,18 @@ void Utils::Misc::shutdownComputer(const ShutdownDialogAction &action)
if (action == ShutdownDialogAction::Suspend) if (action == ShutdownDialogAction::Suspend)
{ {
::SetSuspendState(false, false, false); ::SetSuspendState(FALSE, FALSE, FALSE);
} }
else if (action == ShutdownDialogAction::Hibernate) else if (action == ShutdownDialogAction::Hibernate)
{ {
::SetSuspendState(true, false, false); ::SetSuspendState(TRUE, FALSE, FALSE);
} }
else else
{ {
const QString msg = QCoreApplication::translate("misc", "qBittorrent will shutdown the computer now because all downloads are complete."); const QString msg = QCoreApplication::translate("misc", "qBittorrent will shutdown the computer now because all downloads are complete.");
auto msgWchar = std::make_unique<wchar_t[]>(msg.length() + 1); auto msgWchar = std::make_unique<wchar_t[]>(msg.length() + 1);
msg.toWCharArray(msgWchar.get()); msg.toWCharArray(msgWchar.get());
::InitiateSystemShutdownW(nullptr, msgWchar.get(), 10, true, false); ::InitiateSystemShutdownW(nullptr, msgWchar.get(), 10, TRUE, FALSE);
} }
// Disable shutdown privilege. // Disable shutdown privilege.

10
src/gui/addnewtorrentdialog.cpp

@ -82,10 +82,14 @@ AddNewTorrentDialog::AddNewTorrentDialog(const BitTorrent::AddTorrentParams &inP
, m_ui(new Ui::AddNewTorrentDialog) , m_ui(new Ui::AddNewTorrentDialog)
, m_torrentParams(inParams) , m_torrentParams(inParams)
, m_storeDialogSize(SETTINGS_KEY("DialogSize")) , m_storeDialogSize(SETTINGS_KEY("DialogSize"))
, m_storeSplitterState(SETTINGS_KEY("SplitterState"))
, m_storeDefaultCategory(SETTINGS_KEY("DefaultCategory")) , m_storeDefaultCategory(SETTINGS_KEY("DefaultCategory"))
, m_storeRememberLastSavePath(SETTINGS_KEY("RememberLastSavePath")) , m_storeRememberLastSavePath(SETTINGS_KEY("RememberLastSavePath"))
, m_storeTreeHeaderState(SETTINGS_KEY("TreeHeaderState")) , m_storeTreeHeaderState(SETTINGS_KEY("TreeHeaderState"))
#if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0))
, m_storeSplitterState("GUI/Qt6/" SETTINGS_KEY("SplitterState"))
#else
, m_storeSplitterState(SETTINGS_KEY("SplitterState"))
#endif
{ {
// TODO: set dialog file properties using m_torrentParams.filePriorities // TODO: set dialog file properties using m_torrentParams.filePriorities
m_ui->setupUi(this); m_ui->setupUi(this);
@ -715,8 +719,8 @@ void AddNewTorrentDialog::setupTreeview()
// List files in torrent // List files in torrent
m_contentModel->model()->setupModelData(m_torrentInfo); m_contentModel->model()->setupModelData(m_torrentInfo);
if (!m_storeTreeHeaderState.get().isEmpty()) if (const QByteArray state = m_storeTreeHeaderState; !state.isEmpty())
m_ui->contentTreeView->header()->restoreState(m_storeTreeHeaderState); m_ui->contentTreeView->header()->restoreState(state);
// Hide useless columns after loading the header state // Hide useless columns after loading the header state
m_ui->contentTreeView->hideColumn(PROGRESS); m_ui->contentTreeView->hideColumn(PROGRESS);

4
src/gui/addnewtorrentdialog.h

@ -118,8 +118,8 @@ private:
BitTorrent::AddTorrentParams m_torrentParams; BitTorrent::AddTorrentParams m_torrentParams;
SettingValue<QSize> m_storeDialogSize; SettingValue<QSize> m_storeDialogSize;
SettingValue<QByteArray> m_storeSplitterState;
SettingValue<QString> m_storeDefaultCategory; SettingValue<QString> m_storeDefaultCategory;
SettingValue<bool> m_storeRememberLastSavePath; SettingValue<bool> m_storeRememberLastSavePath;
CachedSettingValue<QByteArray> m_storeTreeHeaderState; SettingValue<QByteArray> m_storeTreeHeaderState;
SettingValue<QByteArray> m_storeSplitterState;
}; };

21
src/gui/cookiesdialog.cpp

@ -32,20 +32,23 @@
#include "base/global.h" #include "base/global.h"
#include "base/net/downloadmanager.h" #include "base/net/downloadmanager.h"
#include "base/settingsstorage.h"
#include "cookiesmodel.h" #include "cookiesmodel.h"
#include "ui_cookiesdialog.h" #include "ui_cookiesdialog.h"
#include "uithememanager.h" #include "uithememanager.h"
#include "utils.h" #include "utils.h"
#define SETTINGS_KEY(name) QStringLiteral("CookiesDialog/" name) #define SETTINGS_KEY(name) "CookiesDialog/" name
const QString KEY_SIZE = SETTINGS_KEY("Size");
const QString KEY_COOKIESVIEWSTATE = SETTINGS_KEY("CookiesViewState");
CookiesDialog::CookiesDialog(QWidget *parent) CookiesDialog::CookiesDialog(QWidget *parent)
: QDialog(parent) : QDialog(parent)
, m_ui(new Ui::CookiesDialog) , m_ui(new Ui::CookiesDialog)
, m_cookiesModel(new CookiesModel(Net::DownloadManager::instance()->allCookies(), this)) , m_cookiesModel(new CookiesModel(Net::DownloadManager::instance()->allCookies(), this))
, m_storeDialogSize(SETTINGS_KEY("Size"))
#if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0))
, m_storeViewState("GUI/Qt6/" SETTINGS_KEY("ViewState"))
#else
, m_storeViewState(SETTINGS_KEY("CookiesViewState"))
#endif
{ {
m_ui->setupUi(this); m_ui->setupUi(this);
@ -61,16 +64,14 @@ CookiesDialog::CookiesDialog(QWidget *parent)
m_cookiesModel->index(0, 0), m_cookiesModel->index(0, 0),
QItemSelectionModel::ClearAndSelect | QItemSelectionModel::Rows); QItemSelectionModel::ClearAndSelect | QItemSelectionModel::Rows);
Utils::Gui::resize(this, SettingsStorage::instance()->loadValue<QSize>(KEY_SIZE)); Utils::Gui::resize(this, m_storeDialogSize);
m_ui->treeView->header()->restoreState( m_ui->treeView->header()->restoreState(m_storeViewState);
SettingsStorage::instance()->loadValue<QByteArray>(KEY_COOKIESVIEWSTATE));
} }
CookiesDialog::~CookiesDialog() CookiesDialog::~CookiesDialog()
{ {
SettingsStorage::instance()->storeValue(KEY_SIZE, size()); m_storeDialogSize = size();
SettingsStorage::instance()->storeValue( m_storeViewState = m_ui->treeView->header()->saveState();
KEY_COOKIESVIEWSTATE, m_ui->treeView->header()->saveState());
delete m_ui; delete m_ui;
} }

5
src/gui/cookiesdialog.h

@ -30,6 +30,8 @@
#include <QDialog> #include <QDialog>
#include "base/settingvalue.h"
class CookiesModel; class CookiesModel;
namespace Ui namespace Ui
@ -55,4 +57,7 @@ private slots:
private: private:
Ui::CookiesDialog *m_ui; Ui::CookiesDialog *m_ui;
CookiesModel *m_cookiesModel; CookiesModel *m_cookiesModel;
SettingValue<QSize> m_storeDialogSize;
SettingValue<QByteArray> m_storeViewState;
}; };

4
src/gui/previewselectdialog.cpp

@ -52,7 +52,11 @@ PreviewSelectDialog::PreviewSelectDialog(QWidget *parent, const BitTorrent::Torr
, m_ui(new Ui::PreviewSelectDialog) , m_ui(new Ui::PreviewSelectDialog)
, m_torrent(torrent) , m_torrent(torrent)
, m_storeDialogSize(SETTINGS_KEY("Size")) , m_storeDialogSize(SETTINGS_KEY("Size"))
#if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0))
, m_storeTreeHeaderState("GUI/Qt6/" SETTINGS_KEY("HeaderState"))
#else
, m_storeTreeHeaderState(SETTINGS_KEY("HeaderState")) , m_storeTreeHeaderState(SETTINGS_KEY("HeaderState"))
#endif
{ {
m_ui->setupUi(this); m_ui->setupUi(this);

Loading…
Cancel
Save