Add Qt6 Support (#7339)
* Rebase against master Co-authored-by: michaelgregorius <michael.gregorius.git@arcor.de> Co-authored-by: Rossmaxx <74815851+Rossmaxx@users.noreply.github.com> * Fix Qt6 DMG on Apple (#7240) - Fix linking issues with Qt Framework files - Fix qmake detection * Fixes after rebase * Fix embed.cpp compilation Fix implicit conversion from int when using QString.arg(...) * Fix Qt6 signature change for nativeEventFilter (#7254) * Adds win32EventFilter a wrapper for nativeEventFilter on Windows * win32EventFilter is currently used to intercept top-level Window events (currently, to avoid VSTs setting transparency of the parent application) * fix broken signal slot connections (#7274) QComboBox activated() replaced with textActivated() since Qt 5.14 * Enabled VSTs on Qt 6 (#7273) * enabled VST support for Qt 6 builds * Note : Embedding on QT6 will be buggy on linux as a result of using qt embedding, which unfortunately is a qt bug which hasn't been resolved. * Changed bar lines to follow snap size (#7034) * Added lines in between bars * Changed bar lines to follow snap size * Changed default zoom and quantization value * Added constants for line widths * Added QSS configuration for new grid line colors * Tied line widths to QSS properties * Changed default quantization to 1/4 * Removed clear() from destructor model * Removed destructor in ComboBoxModel.h * Changed member set/get functions to pass by value * Updated signal connection with newer syntax * Fix compilation * Fix MSVC builds * fix nullptr deref in AudioFileProcessor (qt6 branch) (#7532) * ensured mouse event != nullptr before deref * separation of concerns: AFP WaveView updateCursor extract check to pointerCloseToStartEndOrLoop() * marked some function parameters as const * Remove Core5Compat usage * Fix bad merge * Fixes after rebase * Simplify QTX_WRAP_CPP call * Remove comments that are obvious to a developer * Whitespace * Try using Qt 6 for MSVC CI I chose Qt 6.5 because it's the last Qt LTS release with declared support for Visual Studio 2019. Once we upgrade to Visual Studio 2022, we could upgrade Qt as well. * Fix MSVC build Also fixes two memory leaks in MidiWinMM * Fix GuiApplication on MSVC * Fix interpolateInRgb * Try building with patched Calf * Fix submodule * Fix OpulenZ build * Try to fix zyn * Fix comment * Ty to fix zyn (again) * Ty to fix RemotePluginBase * Revert "Ty to fix RemotePluginBase" This reverts commit 92dac44ffb11e19d1d5a21d9155369f017bd59e9. * Update plugins/ZynAddSubFx/CMakeLists.txt Co-authored-by: Dalton Messmer <messmer.dalton@gmail.com> * Fix vertical & horizontal scroll wheel in SongEditor * AppImage: Fix finding of Qt6 libs * Fix implicit QString --> QFileInfo conversion * Point submodule to lmms * Fix multiple deprecation warnings * Fix for Clang compiler * Build with latest Qt LTS version now that we use MSVC 2022 * Update jurplel/install-qt-action to v4.3.0 * Bump minimum Qt6 version for MSVC * Fix incorrect Qt version checks Some comparisons were using ">" rather than ">=" * `QSize()` != `QSize(0, 0)` * Fix more deprecation warnings * Fix style * Simplify Spectrum Analyzer mouse events The Qt bug that used to be present appears to have been fixed, so the workaround can be removed * Minor changes * Fix deprecated QCheckBox signal * Fix setContent helper functions * Remove QMultiMap usage from ControlLayout * Remove SIGNAL and SLOT macros * Revert TrackView.cpp changes * Remove Q_DISABLE_MOVE usage since it does not seem to be available in Qt6 --------- Co-authored-by: michaelgregorius <michael.gregorius.git@arcor.de> Co-authored-by: Rossmaxx <74815851+Rossmaxx@users.noreply.github.com> Co-authored-by: BoredGuy1 <66702733+BoredGuy1@users.noreply.github.com> Co-authored-by: Hyunjin Song <tteu.ingog@gmail.com> Co-authored-by: Lisa Magdalena Riedler <git@riedler.wien> Co-authored-by: Dalton Messmer <messmer.dalton@gmail.com>
This commit is contained in:
@@ -26,9 +26,11 @@
|
||||
|
||||
#include "Sample.h"
|
||||
#include "ConfigManager.h"
|
||||
#include "DeprecationHelper.h"
|
||||
#include "SampleThumbnail.h"
|
||||
#include "FontHelper.h"
|
||||
|
||||
|
||||
#include <QPainter>
|
||||
#include <QMouseEvent>
|
||||
|
||||
@@ -114,10 +116,12 @@ void AudioFileProcessorWaveView::leaveEvent(QEvent * e)
|
||||
|
||||
void AudioFileProcessorWaveView::mousePressEvent(QMouseEvent * me)
|
||||
{
|
||||
m_isDragging = true;
|
||||
m_draggingLastPoint = me->pos();
|
||||
const auto pos = position(me);
|
||||
|
||||
const int x = me->x();
|
||||
m_isDragging = true;
|
||||
m_draggingLastPoint = pos;
|
||||
|
||||
const int x = pos.x();
|
||||
|
||||
const int start_dist = qAbs(m_startFrameX - x);
|
||||
const int end_dist = qAbs(m_endFrameX - x);
|
||||
@@ -155,7 +159,9 @@ void AudioFileProcessorWaveView::mouseMoveEvent(QMouseEvent * me)
|
||||
return;
|
||||
}
|
||||
|
||||
const int step = me->x() - m_draggingLastPoint.x();
|
||||
const auto pos = position(me);
|
||||
|
||||
const int step = pos.x() - m_draggingLastPoint.x();
|
||||
switch(m_draggingType)
|
||||
{
|
||||
case DraggingType::SampleStart:
|
||||
@@ -171,12 +177,12 @@ void AudioFileProcessorWaveView::mouseMoveEvent(QMouseEvent * me)
|
||||
slide(step);
|
||||
break;
|
||||
case DraggingType::ZoomWave:
|
||||
zoom(me->y() < m_draggingLastPoint.y());
|
||||
zoom(pos.y() < m_draggingLastPoint.y());
|
||||
break;
|
||||
case DraggingType::Wave:
|
||||
default:
|
||||
if (qAbs(me->y() - m_draggingLastPoint.y())
|
||||
< 2 * qAbs(me->x() - m_draggingLastPoint.x()))
|
||||
if (qAbs(pos.y() - m_draggingLastPoint.y())
|
||||
< 2 * qAbs(pos.x() - m_draggingLastPoint.x()))
|
||||
{
|
||||
m_draggingType = DraggingType::SlideWave;
|
||||
}
|
||||
@@ -186,7 +192,7 @@ void AudioFileProcessorWaveView::mouseMoveEvent(QMouseEvent * me)
|
||||
}
|
||||
}
|
||||
|
||||
m_draggingLastPoint = me->pos();
|
||||
m_draggingLastPoint = pos;
|
||||
update();
|
||||
}
|
||||
|
||||
@@ -483,20 +489,30 @@ void AudioFileProcessorWaveView::reverse()
|
||||
m_reversed = ! m_reversed;
|
||||
}
|
||||
|
||||
void AudioFileProcessorWaveView::updateCursor(QMouseEvent * me)
|
||||
void AudioFileProcessorWaveView::updateCursor(const QMouseEvent* me)
|
||||
{
|
||||
bool const waveIsDragged = m_isDragging && (m_draggingType == DraggingType::Wave);
|
||||
bool const pointerCloseToStartEndOrLoop = (me != nullptr) &&
|
||||
(isCloseTo(me->x(), m_startFrameX) ||
|
||||
isCloseTo(me->x(), m_endFrameX) ||
|
||||
isCloseTo(me->x(), m_loopFrameX));
|
||||
|
||||
if (!m_isDragging && pointerCloseToStartEndOrLoop)
|
||||
if (!m_isDragging && pointerCloseToStartEndOrLoop(me))
|
||||
{
|
||||
setCursor(Qt::SizeHorCursor);
|
||||
}
|
||||
else if (waveIsDragged)
|
||||
{
|
||||
setCursor(Qt::ClosedHandCursor);
|
||||
}
|
||||
else
|
||||
{
|
||||
setCursor(Qt::OpenHandCursor);
|
||||
}
|
||||
}
|
||||
|
||||
bool AudioFileProcessorWaveView::pointerCloseToStartEndOrLoop(const QMouseEvent* me) const
|
||||
{
|
||||
if (!me) { return false; }
|
||||
|
||||
const QPoint pos = position(me);
|
||||
return isCloseTo(pos.x(), m_startFrameX) || isCloseTo(pos.x(), m_endFrameX) || isCloseTo(pos.x(), m_loopFrameX);
|
||||
}
|
||||
|
||||
void AudioFileProcessorWaveView::configureKnobRelationsAndWaveViews()
|
||||
|
||||
@@ -169,7 +169,8 @@ private:
|
||||
|
||||
void updateGraph();
|
||||
void reverse();
|
||||
void updateCursor(QMouseEvent* me = nullptr);
|
||||
void updateCursor(const QMouseEvent* me = nullptr);
|
||||
bool pointerCloseToStartEndOrLoop(const QMouseEvent* me) const;
|
||||
|
||||
void configureKnobRelationsAndWaveViews();
|
||||
|
||||
|
||||
@@ -25,6 +25,7 @@
|
||||
#include "AutomatableModel.h"
|
||||
#include "DelayControlsDialog.h"
|
||||
#include "DelayControls.h"
|
||||
#include "DeprecationHelper.h"
|
||||
#include "embed.h"
|
||||
#include "TempoSyncKnob.h"
|
||||
#include "../Eq/EqFader.h"
|
||||
@@ -135,18 +136,20 @@ void XyPad::mouseReleaseEvent(QMouseEvent *event)
|
||||
|
||||
void XyPad::mouseMoveEvent(QMouseEvent *event)
|
||||
{
|
||||
if( m_acceptInput && (event->x() >= 0) && ( event->x() < width() )
|
||||
&& ( event->y() >= 0) && ( event->y() < height() ) )
|
||||
const auto pos = position(event);
|
||||
|
||||
if (m_acceptInput && (pos.x() >= 0) && (pos.x() < width())
|
||||
&& (pos.y() >= 0) && (pos.y() < height()))
|
||||
{
|
||||
//set xmodel
|
||||
float xRange = m_xModel->maxValue() - m_xModel->minValue();
|
||||
float xInc = xRange / width();
|
||||
m_xModel->setValue( m_xModel->minValue() + ( event->x() * xInc ) );
|
||||
m_xModel->setValue(m_xModel->minValue() + (pos.x() * xInc));
|
||||
|
||||
//set ymodel
|
||||
float yRange = m_yModel->maxValue() - m_yModel->minValue();
|
||||
float yInc = yRange / height();
|
||||
m_yModel->setValue( m_yModel->minValue() + ( event->y() * yInc ) );
|
||||
m_yModel->setValue(m_yModel->minValue() + (pos.y() * yInc));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -178,7 +178,7 @@ QWidget * LadspaMatrixControlDialog::createMatrixWidget()
|
||||
{
|
||||
QWidget *widget = new QWidget(this);
|
||||
QGridLayout *gridLayout = new QGridLayout(widget);
|
||||
gridLayout->setMargin(0);
|
||||
gridLayout->setContentsMargins(0, 0, 0, 0);
|
||||
widget->setLayout(gridLayout);
|
||||
|
||||
arrangeControls(widget, gridLayout);
|
||||
|
||||
@@ -590,7 +590,7 @@ void OpulenzInstrument::loadFile( const QString& file ) {
|
||||
return;
|
||||
}
|
||||
if( sbidata.size() != 52 ) {
|
||||
printf("SBI size error: expected 52, got %d\n",sbidata.size() );
|
||||
printf("SBI size error: expected 52, got %d\n", static_cast<int>(sbidata.size()));
|
||||
}
|
||||
|
||||
// Minimum size of SBI if we ignore "reserved" bytes at end
|
||||
|
||||
@@ -29,6 +29,7 @@
|
||||
#include <QPainter>
|
||||
#include <QPainterPath>
|
||||
|
||||
#include "DeprecationHelper.h"
|
||||
#include "SampleThumbnail.h"
|
||||
#include "SlicerT.h"
|
||||
#include "SlicerTView.h"
|
||||
@@ -297,13 +298,15 @@ void SlicerTWaveform::updateUI()
|
||||
// updates the closest object and changes the cursor respectivly
|
||||
void SlicerTWaveform::updateClosest(QMouseEvent* me)
|
||||
{
|
||||
float normalizedClickSeeker = static_cast<float>(me->x() - s_seekerHorMargin) / m_seekerWidth;
|
||||
float normalizedClickEditor = static_cast<float>(me->x()) / m_editorWidth;
|
||||
const auto pos = position(me);
|
||||
|
||||
float normalizedClickSeeker = static_cast<float>(pos.x() - s_seekerHorMargin) / m_seekerWidth;
|
||||
float normalizedClickEditor = static_cast<float>(pos.x()) / m_editorWidth;
|
||||
|
||||
m_closestObject = UIObjects::Nothing;
|
||||
m_closestSlice = -1;
|
||||
|
||||
if (me->y() < m_seekerHeight)
|
||||
if (pos.y() < m_seekerHeight)
|
||||
{
|
||||
if (std::abs(normalizedClickSeeker - m_seekerStart) < s_distanceForClick)
|
||||
{
|
||||
@@ -358,6 +361,8 @@ void SlicerTWaveform::updateCursor()
|
||||
// handles deletion, reset and middles seeker
|
||||
void SlicerTWaveform::mousePressEvent(QMouseEvent* me)
|
||||
{
|
||||
const auto pos = position(me);
|
||||
|
||||
switch (me->button())
|
||||
{
|
||||
case Qt::MouseButton::MiddleButton:
|
||||
@@ -369,7 +374,7 @@ void SlicerTWaveform::mousePressEvent(QMouseEvent* me)
|
||||
case Qt::MouseButton::LeftButton:
|
||||
if (m_slicerTParent->m_originalSample.sampleSize() <= 1) { static_cast<SlicerTView*>(parent())->openFiles(); }
|
||||
// update seeker middle for correct movement
|
||||
m_seekerMiddle = static_cast<float>(me->x() - s_seekerHorMargin) / m_seekerWidth;
|
||||
m_seekerMiddle = static_cast<float>(pos.x() - s_seekerHorMargin) / m_seekerWidth;
|
||||
break;
|
||||
case Qt::MouseButton::RightButton:
|
||||
if (m_slicerTParent->m_slicePoints.size() > 2 && m_closestObject == UIObjects::SlicePoint)
|
||||
@@ -400,8 +405,10 @@ void SlicerTWaveform::mouseMoveEvent(QMouseEvent* me)
|
||||
return;
|
||||
}
|
||||
|
||||
float normalizedClickSeeker = static_cast<float>(me->x() - s_seekerHorMargin) / m_seekerWidth;
|
||||
float normalizedClickEditor = static_cast<float>(me->x()) / m_editorWidth;
|
||||
const auto pos = position(me);
|
||||
|
||||
float normalizedClickSeeker = static_cast<float>(pos.x() - s_seekerHorMargin) / m_seekerWidth;
|
||||
float normalizedClickEditor = static_cast<float>(pos.x()) / m_editorWidth;
|
||||
|
||||
float distStart = m_seekerStart - m_seekerMiddle;
|
||||
float distEnd = m_seekerEnd - m_seekerMiddle;
|
||||
@@ -449,9 +456,11 @@ void SlicerTWaveform::mouseMoveEvent(QMouseEvent* me)
|
||||
|
||||
void SlicerTWaveform::mouseDoubleClickEvent(QMouseEvent* me)
|
||||
{
|
||||
if (me->button() != Qt::MouseButton::LeftButton || me->y() < m_seekerHeight) { return; }
|
||||
const auto pos = position(me);
|
||||
|
||||
float normalizedClickEditor = static_cast<float>(me->x()) / m_editorWidth;
|
||||
if (me->button() != Qt::MouseButton::LeftButton || pos.y() < m_seekerHeight) { return; }
|
||||
|
||||
float normalizedClickEditor = static_cast<float>(pos.x()) / m_editorWidth;
|
||||
float startFrame = m_seekerStart;
|
||||
float endFrame = m_seekerEnd;
|
||||
float slicePosition = startFrame + normalizedClickEditor * (endFrame - startFrame);
|
||||
|
||||
@@ -33,6 +33,7 @@
|
||||
#include <QPainterPath>
|
||||
#include <QString>
|
||||
|
||||
#include "DeprecationHelper.h"
|
||||
#include "fft_helpers.h"
|
||||
#include "GuiApplication.h"
|
||||
#include "MainWindow.h"
|
||||
@@ -819,18 +820,14 @@ void SaSpectrumView::periodicUpdate()
|
||||
|
||||
|
||||
// Handle mouse input: set new cursor position.
|
||||
// For some reason (a bug?), localPos() only returns integers. As a workaround
|
||||
// the fractional part is taken from windowPos() (which works correctly).
|
||||
void SaSpectrumView::mouseMoveEvent(QMouseEvent *event)
|
||||
void SaSpectrumView::mouseMoveEvent(QMouseEvent* event)
|
||||
{
|
||||
m_cursor = QPointF( event->localPos().x() - (event->windowPos().x() - (long)event->windowPos().x()),
|
||||
event->localPos().y() - (event->windowPos().y() - (long)event->windowPos().y()));
|
||||
m_cursor = positionF(event);
|
||||
}
|
||||
|
||||
void SaSpectrumView::mousePressEvent(QMouseEvent *event)
|
||||
void SaSpectrumView::mousePressEvent(QMouseEvent* event)
|
||||
{
|
||||
m_cursor = QPointF( event->localPos().x() - (event->windowPos().x() - (long)event->windowPos().x()),
|
||||
event->localPos().y() - (event->windowPos().y() - (long)event->windowPos().y()));
|
||||
m_cursor = positionF(event);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -33,6 +33,7 @@
|
||||
#include <QPainter>
|
||||
#include <QString>
|
||||
|
||||
#include "DeprecationHelper.h"
|
||||
#include "EffectControlDialog.h"
|
||||
#include "GuiApplication.h"
|
||||
#include "MainWindow.h"
|
||||
@@ -324,18 +325,14 @@ void SaWaterfallView::drawCursor(QPainter &painter)
|
||||
|
||||
|
||||
// Handle mouse input: set new cursor position.
|
||||
// For some reason (a bug?), localPos() only returns integers. As a workaround
|
||||
// the fractional part is taken from windowPos() (which works correctly).
|
||||
void SaWaterfallView::mouseMoveEvent(QMouseEvent *event)
|
||||
void SaWaterfallView::mouseMoveEvent(QMouseEvent* event)
|
||||
{
|
||||
m_cursor = QPointF( event->localPos().x() - (event->windowPos().x() - (long)event->windowPos().x()),
|
||||
event->localPos().y() - (event->windowPos().y() - (long)event->windowPos().y()));
|
||||
m_cursor = positionF(event);
|
||||
}
|
||||
|
||||
void SaWaterfallView::mousePressEvent(QMouseEvent *event)
|
||||
void SaWaterfallView::mousePressEvent(QMouseEvent* event)
|
||||
{
|
||||
m_cursor = QPointF( event->localPos().x() - (event->windowPos().x() - (long)event->windowPos().x()),
|
||||
event->localPos().y() - (event->windowPos().y() - (long)event->windowPos().y()));
|
||||
m_cursor = positionF(event);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -34,7 +34,7 @@
|
||||
#include <QLocale>
|
||||
#include <QTemporaryFile>
|
||||
|
||||
#ifdef LMMS_BUILD_LINUX
|
||||
#if defined(LMMS_BUILD_LINUX) && (QT_VERSION < QT_VERSION_CHECK(6,0,0))
|
||||
# include <QX11Info>
|
||||
# include <X11EmbedContainer.h>
|
||||
#endif
|
||||
@@ -415,7 +415,7 @@ bool VstPlugin::processMessage( const message & _m )
|
||||
(LONG_PTR) gui::getGUI()->mainWindow()->winId() );
|
||||
#endif
|
||||
|
||||
#ifdef LMMS_BUILD_LINUX
|
||||
#if defined(LMMS_BUILD_LINUX) && (QT_VERSION < QT_VERSION_CHECK(6,0,0))
|
||||
XSetTransientForHint( QX11Info::display(),
|
||||
m_pluginWindowID,
|
||||
gui::getGUI()->mainWindow()->winId() );
|
||||
@@ -772,7 +772,7 @@ void VstPlugin::createUI( QWidget * parent )
|
||||
} else
|
||||
#endif
|
||||
|
||||
#ifdef LMMS_BUILD_LINUX
|
||||
#if defined(LMMS_BUILD_LINUX) && (QT_VERSION < QT_VERSION_CHECK(6,0,0))
|
||||
if (m_embedMethod == "xembed" )
|
||||
{
|
||||
if (parent)
|
||||
|
||||
@@ -15,6 +15,6 @@ TARGET_INCLUDE_DIRECTORIES(vstbase
|
||||
PUBLIC ../
|
||||
)
|
||||
|
||||
IF(LMMS_BUILD_LINUX)
|
||||
IF(LMMS_BUILD_LINUX AND NOT WANT_QT6)
|
||||
TARGET_LINK_LIBRARIES(vstbase qx11embedcontainer)
|
||||
ENDIF()
|
||||
|
||||
@@ -23,8 +23,13 @@ if(NOT MSVC AND (LMMS_HOST_X86 OR LMMS_HOST_X86_64))
|
||||
ADD_DEFINITIONS(-DASM_F2I_YES)
|
||||
endif()
|
||||
|
||||
# build ZynAddSubFX with full optimizations
|
||||
if(NOT MSVC)
|
||||
if(MSVC)
|
||||
# enable updated C++ language standards, disable certain permissive behavior
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /Zc:__cplusplus /permissive-")
|
||||
# workaround _WIN32 vs WIN32 differences
|
||||
add_compile_definitions(WIN32)
|
||||
else()
|
||||
# build ZynAddSubFX with full optimizations, treat nonconformant code as warnings
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O2 -fpermissive")
|
||||
endif()
|
||||
|
||||
@@ -126,8 +131,8 @@ target_static_libraries(ZynAddSubFxCore PUBLIC
|
||||
target_link_libraries(ZynAddSubFxCore INTERFACE
|
||||
${FFTW3F_LIBRARIES}
|
||||
${QT_LIBRARIES}
|
||||
Qt5::Widgets
|
||||
Qt5::Xml
|
||||
Qt${QT_VERSION_MAJOR}::Widgets
|
||||
Qt${QT_VERSION_MAJOR}::Xml
|
||||
Threads::Threads
|
||||
ZLIB::ZLIB
|
||||
)
|
||||
@@ -192,7 +197,7 @@ if(LMMS_HAVE_LIBRT)
|
||||
endif()
|
||||
|
||||
# Support qt_version_tag in Qt 5.6
|
||||
TARGET_LINK_LIBRARIES(RemoteZynAddSubFx Qt5::Core)
|
||||
TARGET_LINK_LIBRARIES(RemoteZynAddSubFx Qt${QT_VERSION_MAJOR}::Core)
|
||||
|
||||
# link Qt libraries when on win32
|
||||
IF(LMMS_BUILD_WIN32)
|
||||
|
||||
Reference in New Issue
Block a user