From 092b8d7d47fee94cdb320d959bb9eafb9fdadb0c Mon Sep 17 00:00:00 2001 From: Louis St-Amour Date: Sun, 12 Apr 2020 02:59:54 -0400 Subject: [PATCH] Fixing Qt 5.15 deprecations - part 2 --- src/lib_gui/qt/element/QtStatusBar.cpp | 2 +- src/lib_gui/qt/element/code/QtCodeArea.cpp | 2 +- .../qt/element/dialog/QtNewsWidget.cpp | 2 +- .../qt/element/search/QtSmartSearchBox.cpp | 4 +- .../qt/graphics/base/QtCountCircleItem.cpp | 2 +- .../content/QtProjectWizardContentSelect.cpp | 4 +- .../cxx_header/CxxVs15HeaderPathDetector.cpp | 9 ++- .../cxx_header/utilityCxxHeaderDetection.cpp | 5 +- src/lib_gui/utility/utilityApp.cpp | 65 +++++++++---------- src/lib_gui/utility/utilityApp.h | 34 ++++++++-- 10 files changed, 75 insertions(+), 54 deletions(-) diff --git a/src/lib_gui/qt/element/QtStatusBar.cpp b/src/lib_gui/qt/element/QtStatusBar.cpp index d2d0bbb62..327ca58e5 100644 --- a/src/lib_gui/qt/element/QtStatusBar.cpp +++ b/src/lib_gui/qt/element/QtStatusBar.cpp @@ -134,7 +134,7 @@ void QtStatusBar::setErrorCount(ErrorCountInfo errorCount) : QLatin1String(""))); m_errorButton.setMinimumWidth( - m_errorButton.fontMetrics().width(QString(m_errorButton.text().size(), 'a'))); + m_errorButton.fontMetrics().boundingRect(QString(m_errorButton.text().size(), 'a')).width()); if (errorCount.fatal > 0) { diff --git a/src/lib_gui/qt/element/code/QtCodeArea.cpp b/src/lib_gui/qt/element/code/QtCodeArea.cpp index 786027e67..b4f67e152 100644 --- a/src/lib_gui/qt/element/code/QtCodeArea.cpp +++ b/src/lib_gui/qt/element/code/QtCodeArea.cpp @@ -40,7 +40,7 @@ bool MouseWheelOverScrollbarFilter::eventFilter(QObject* obj, QEvent* event) if (event->type() == QEvent::Wheel && scrollbar) { QRect scrollbarArea(scrollbar->pos(), scrollbar->size()); - QPoint globalMousePos = dynamic_cast(event)->globalPosition(); + QPoint globalMousePos = dynamic_cast(event)->globalPosition().toPoint(); QPoint localMousePos = scrollbar->mapFromGlobal(globalMousePos); // instead of "scrollbar->underMouse()" we need this check implemented here because diff --git a/src/lib_gui/qt/element/dialog/QtNewsWidget.cpp b/src/lib_gui/qt/element/dialog/QtNewsWidget.cpp index 554963ab7..5535e7330 100644 --- a/src/lib_gui/qt/element/dialog/QtNewsWidget.cpp +++ b/src/lib_gui/qt/element/dialog/QtNewsWidget.cpp @@ -22,7 +22,7 @@ QtNewsWidget::QtNewsWidget(QWidget* parent): QWidget(parent) m_text = new QtTextEdit(); m_text->setObjectName(QStringLiteral("textField")); m_text->setReadOnly(true); - m_text->setTabStopWidth(8 * m_text->fontMetrics().width('9')); + m_text->setTabStopDistance(8 * m_text->fontMetrics().boundingRect('9').width()); m_text->setViewportMargins(6, 4, 16, 4); m_text->setOpenExternalLinks(true); layout->addWidget(m_text); diff --git a/src/lib_gui/qt/element/search/QtSmartSearchBox.cpp b/src/lib_gui/qt/element/search/QtSmartSearchBox.cpp index e4bbc83ca..acc9ac999 100644 --- a/src/lib_gui/qt/element/search/QtSmartSearchBox.cpp +++ b/src/lib_gui/qt/element/search/QtSmartSearchBox.cpp @@ -901,7 +901,7 @@ void QtSmartSearchBox::layoutElements() if (!hasSelected && i == m_cursorIndex) { editX = x - 5; - x += fontMetrics().width(text()); + x += fontMetrics().horizontalAdvance(text()); } if (i < m_elements.size()) @@ -923,7 +923,7 @@ void QtSmartSearchBox::layoutElements() } } - int cursorX = fontMetrics().width(text().left(cursorPosition())); + int cursorX = fontMetrics().horizontalAdvance(text().left(cursorPosition())); int offsetX = m_oldLayoutOffset; if (x < width()) diff --git a/src/lib_gui/qt/graphics/base/QtCountCircleItem.cpp b/src/lib_gui/qt/graphics/base/QtCountCircleItem.cpp index ac3d329d4..89250a1f2 100644 --- a/src/lib_gui/qt/graphics/base/QtCountCircleItem.cpp +++ b/src/lib_gui/qt/graphics/base/QtCountCircleItem.cpp @@ -24,7 +24,7 @@ QtCountCircleItem::~QtCountCircleItem() {} void QtCountCircleItem::setPosition(const Vec2f& pos) { - qreal width = QFontMetrics(m_number->font()).width(m_number->text()); + qreal width = QFontMetrics(m_number->font()).boundingRect(m_number->text()).width(); qreal height = QFontMetrics(m_number->font()).height(); this->setRadius(height / 2 + 1); diff --git a/src/lib_gui/qt/project_wizard/content/QtProjectWizardContentSelect.cpp b/src/lib_gui/qt/project_wizard/content/QtProjectWizardContentSelect.cpp index 1dc9f5ff9..02b6eb0e3 100644 --- a/src/lib_gui/qt/project_wizard/content/QtProjectWizardContentSelect.cpp +++ b/src/lib_gui/qt/project_wizard/content/QtProjectWizardContentSelect.cpp @@ -25,8 +25,8 @@ void QtProjectWizardContentSelect::populate(QGridLayout* layout, int& row) std::string pythonIndexerVersion = " "; { std::string str = utility::executeProcess( - "\"" + ResourcePaths::getPythonPath().str() + - "SourcetrailPythonIndexer\" --version", + ResourcePaths::getPythonPath().wstr().append(L"SourcetrailPythonIndexer"), + std::vector{L"--version"}, FilePath(), 5000) .second; diff --git a/src/lib_gui/utility/path_detector/cxx_header/CxxVs15HeaderPathDetector.cpp b/src/lib_gui/utility/path_detector/cxx_header/CxxVs15HeaderPathDetector.cpp index 0ad9eb751..894599173 100644 --- a/src/lib_gui/utility/path_detector/cxx_header/CxxVs15HeaderPathDetector.cpp +++ b/src/lib_gui/utility/path_detector/cxx_header/CxxVs15HeaderPathDetector.cpp @@ -20,11 +20,10 @@ std::vector CxxVs15HeaderPathDetector::doGetPaths() const .expandEnvironmentVariables(); if (!expandedPaths.empty()) { - const std::string command = "\"" + expandedPaths[0].str() + - "\" -latest -property installationPath"; - const std::string command2 = - "\"C:/Program Files (x86)/Microsoft Visual Studio/Installer/vswhere.exe\""; - const std::string output = utility::executeProcess(command, FilePath(), 10000).second; + const std::string output = + utility::executeProcess( + expandedPaths[0].wstr(), std::vector {L"-latest", L"-property installationPath"}, FilePath(), 10000) + .second; const FilePath vsInstallPath(output); if (vsInstallPath.exists()) diff --git a/src/lib_gui/utility/path_detector/cxx_header/utilityCxxHeaderDetection.cpp b/src/lib_gui/utility/path_detector/cxx_header/utilityCxxHeaderDetection.cpp index bc8512051..7f1d36c12 100644 --- a/src/lib_gui/utility/path_detector/cxx_header/utilityCxxHeaderDetection.cpp +++ b/src/lib_gui/utility/path_detector/cxx_header/utilityCxxHeaderDetection.cpp @@ -12,7 +12,10 @@ namespace utility std::vector getCxxHeaderPaths(const std::string& compilerName) { std::string command = compilerName + " -x c++ -v -E /dev/null"; - std::string clangOutput = utility::executeProcess(command.c_str()).second; + std::string clangOutput = utility::executeProcess( + utility::decodeFromUtf8(compilerName), + std::vector {L"-x c++", L"-v", L"-E /dev/null"}) + .second; std::string standardHeaders = utility::substrBetween( clangOutput, "#include <...> search starts here:\n", "\nEnd of search list"); std::vector paths; diff --git a/src/lib_gui/utility/utilityApp.cpp b/src/lib_gui/utility/utilityApp.cpp index af515f006..c2ec3caa7 100644 --- a/src/lib_gui/utility/utilityApp.cpp +++ b/src/lib_gui/utility/utilityApp.cpp @@ -57,7 +57,10 @@ std::set s_runningProcesses; } // namespace utility std::pair utility::executeProcess( - const std::string& command, const FilePath& workingDirectory, const int timeout) + const std::wstring& commandPath, + const std::vector& commandArguments, + const FilePath& workingDirectory, + const int timeout) { QProcess process; process.setProcessChannelMode(QProcess::MergedChannels); @@ -67,6 +70,13 @@ std::pair utility::executeProcess( process.setWorkingDirectory(QString::fromStdWString(workingDirectory.wstr())); } + QString command = QString::fromStdWString(commandPath); + QStringList arguments; + for (auto commandArgument: commandArguments) + { + arguments << QString::fromStdWString(commandArgument); + } + QProcessEnvironment env = QProcessEnvironment::systemEnvironment(); QStringList envlist = env.toStringList(); envlist.replaceInStrings( @@ -76,7 +86,7 @@ std::pair utility::executeProcess( { std::lock_guard lock(s_runningProcessesMutex); - process.start(command.c_str()); + process.start(command, arguments); s_runningProcesses.insert(&process); } @@ -96,7 +106,10 @@ std::pair utility::executeProcess( } std::string utility::executeProcessUntilNoOutput( - const std::string& command, const FilePath& workingDirectory, const int waitTime) + const std::wstring& commandPath, + const std::vector& commandArguments, + const FilePath& workingDirectory, + const int waitTime) { QProcess process; process.setProcessChannelMode(QProcess::MergedChannels); @@ -106,6 +119,13 @@ std::string utility::executeProcessUntilNoOutput( process.setWorkingDirectory(QString::fromStdWString(workingDirectory.wstr())); } + QString command = QString::fromStdWString(commandPath); + QStringList arguments; + for (auto commandArgument: commandArguments) + { + arguments << QString::fromStdWString(commandArgument); + } + QProcessEnvironment env = QProcessEnvironment::systemEnvironment(); QStringList envlist = env.toStringList(); envlist.replaceInStrings( @@ -115,7 +135,7 @@ std::string utility::executeProcessUntilNoOutput( { std::lock_guard lock(s_runningProcessesMutex); - process.start(command.c_str()); + process.start(command, arguments); s_runningProcesses.insert(&process); } @@ -203,9 +223,10 @@ int utility::executeProcessAndGetExitCode( } QString command = QString::fromStdWString(commandPath); - for (const std::wstring& commandArgument: commandArguments) + QStringList arguments; + for (auto commandArgument: commandArguments) { - command += " " + QString::fromStdWString(commandArgument); + arguments << QString::fromStdWString(commandArgument); } QProcessEnvironment env = QProcessEnvironment::systemEnvironment(); @@ -217,7 +238,7 @@ int utility::executeProcessAndGetExitCode( { std::lock_guard lock(s_runningProcessesMutex); - process.start(command); + process.start(command, arguments); s_runningProcesses.insert(&process); } @@ -276,23 +297,6 @@ int utility::getIdealThreadCount() return std::max(1, threadCount); } -OsType utility::getOsType() -{ - if (QSysInfo::windowsVersion() != QSysInfo::WV_None) - { - return OS_WINDOWS; - } - else if (QSysInfo::macVersion() != QSysInfo::MV_None) - { - return OS_MAC; - } - else - { - return OS_LINUX; - } - return OS_UNKNOWN; -} - std::string utility::getOsTypeString() { // WARNING: Don't change these string. The server API relies on them. @@ -308,15 +312,4 @@ std::string utility::getOsTypeString() break; } return "unknown"; -} - -ApplicationArchitectureType utility::getApplicationArchitectureType() -{ -#if defined(__x86_64) || defined(__x86_64__) || defined(__amd64) || defined(_M_X64) || \ - defined(WIN64) - return APPLICATION_ARCHITECTURE_X86_64; -#else - return APPLICATION_ARCHITECTURE_X86_32; -#endif - return APPLICATION_ARCHITECTURE_UNKNOWN; -} +} \ No newline at end of file diff --git a/src/lib_gui/utility/utilityApp.h b/src/lib_gui/utility/utilityApp.h index 52060a345..9835b814f 100644 --- a/src/lib_gui/utility/utilityApp.h +++ b/src/lib_gui/utility/utilityApp.h @@ -10,11 +10,15 @@ namespace utility { std::pair executeProcess( - const std::string& command, + const std::wstring& commandPath, + const std::vector& commandArguments, const FilePath& workingDirectory = FilePath(), const int timeout = 30000); std::string executeProcessUntilNoOutput( - const std::string& command, const FilePath& workingDirectory, int waitTime = 10000); + const std::wstring& commandPath, + const std::vector& commandArguments, + const FilePath& workingDirectory, + int waitTime = 10000); int executeProcessAndGetExitCode( const std::wstring& commandPath, const std::vector& commandArguments, @@ -26,9 +30,31 @@ int executeProcessAndGetExitCode( void killRunningProcesses(); int getIdealThreadCount(); -OsType getOsType(); +constexpr OsType getOsType() +{ +#if defined(_WIN32) || defined(__WIN32__) || defined(WIN32) + return OS_WINDOWS; +#elif defined(__APPLE__) + return OS_MAC; +#elif defined(__linux) || defined(__linux__) || defined(linux) + return OS_LINUX; +#else + return OS_UNKNOWN; +#endif +} + std::string getOsTypeString(); -ApplicationArchitectureType getApplicationArchitectureType(); + +constexpr ApplicationArchitectureType getApplicationArchitectureType() +{ +#if defined(__x86_64) || defined(__x86_64__) || defined(__amd64) || defined(_M_X64) || \ + defined(WIN64) + return APPLICATION_ARCHITECTURE_X86_64; +#else + return APPLICATION_ARCHITECTURE_X86_32; +#endif + return APPLICATION_ARCHITECTURE_UNKNOWN; +} } // namespace utility #endif // UTILITY_APP_H