diff --git a/.github/workflows/linux.yml b/.github/workflows/linux.yml index b1b0d136f..b07d7b8ee 100644 --- a/.github/workflows/linux.yml +++ b/.github/workflows/linux.yml @@ -1,6 +1,20 @@ name: Linux -on: [push, pull_request] +on: + push: + branches: + - main + - v1.0 + - v1.1 + pull_request: + branches: + - main + - v1.0 + - v1.1 + +concurrency: + group: ${{ github.workflow }}-${{ github.head_ref || github.ref_name }} + cancel-in-progress: true jobs: release: diff --git a/.github/workflows/macos.yml b/.github/workflows/macos.yml index 6e306f5b8..ed1225a2c 100644 --- a/.github/workflows/macos.yml +++ b/.github/workflows/macos.yml @@ -1,6 +1,20 @@ name: macOS -on: [push, pull_request] +on: + push: + branches: + - main + - v1.0 + - v1.1 + pull_request: + branches: + - main + - v1.0 + - v1.1 + +concurrency: + group: ${{ github.workflow }}-${{ github.head_ref || github.ref_name }} + cancel-in-progress: true jobs: release: diff --git a/.github/workflows/ubuntu.yml b/.github/workflows/ubuntu.yml index efff7bf74..33c5d2ca7 100644 --- a/.github/workflows/ubuntu.yml +++ b/.github/workflows/ubuntu.yml @@ -1,17 +1,37 @@ name: Ubuntu -on: workflow_dispatch +on: + push: + branches: + - main + - v1.0 + - v1.1 + pull_request: + branches: + - main + - v1.0 + - v1.1 + +concurrency: + group: ${{ github.workflow }}-${{ github.head_ref || github.ref_name }} + cancel-in-progress: true jobs: - jammy: - runs-on: ubuntu-22.04 + qt5_15_arm: + runs-on: ubuntu-24.04-arm steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Build - run: APT=1 CI=1 MKJOBS=2 ./src/scripts/ci.sh - noble: + run: APT=1 CI=1 CPU=aarch64 MKJOBS=2 ./src/scripts/ci.sh + qt6_4: runs-on: ubuntu-24.04 steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 + - name: Build + run: APT=1 QT6="ON" FFMPEG=1 CI=1 MKJOBS=2 ./src/scripts/ci.sh + qt6_10: + runs-on: ubuntu-26.04 + steps: + - uses: actions/checkout@v4 - name: Build - run: APT=1 CI=1 MKJOBS=2 ./src/scripts/ci.sh + run: APT=1 QT6="ON" FFMPEG=1 CI=1 MKJOBS=2 ./src/scripts/ci.sh diff --git a/.github/workflows/windows.yml b/.github/workflows/windows.yml index 537954c0f..466c30e59 100644 --- a/.github/workflows/windows.yml +++ b/.github/workflows/windows.yml @@ -1,12 +1,26 @@ name: Windows -on: [push, pull_request] +on: + push: + branches: + - main + - v1.0 + - v1.1 + pull_request: + branches: + - main + - v1.0 + - v1.1 + +concurrency: + group: ${{ github.workflow }}-${{ github.head_ref || github.ref_name }} + cancel-in-progress: true jobs: release: runs-on: windows-2022 steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Build shell: cmd run: .\src\scripts\build.bat ci diff --git a/src/app/GUI/BoxesList/boolpropertywidget.cpp b/src/app/GUI/BoxesList/boolpropertywidget.cpp index 69d2f9b1b..a9b4e6623 100644 --- a/src/app/GUI/BoxesList/boolpropertywidget.cpp +++ b/src/app/GUI/BoxesList/boolpropertywidget.cpp @@ -89,7 +89,7 @@ void BoolPropertyWidget::paintEvent(QPaintEvent *) { p.end(); } -void BoolPropertyWidget::enterEvent(QEvent *) { +void BoolPropertyWidget::enterEvent(QtEnterEvent *) { mHovered = true; update(); } diff --git a/src/app/GUI/BoxesList/boolpropertywidget.h b/src/app/GUI/BoxesList/boolpropertywidget.h index 9961084c1..8083bc6c2 100644 --- a/src/app/GUI/BoxesList/boolpropertywidget.h +++ b/src/app/GUI/BoxesList/boolpropertywidget.h @@ -29,6 +29,7 @@ #include #include "Properties/boolproperty.h" #include "Properties/boolpropertycontainer.h" +#include "../ui/enterevent.h" class BoolPropertyWidget : public QWidget { Q_OBJECT @@ -40,7 +41,7 @@ class BoolPropertyWidget : public QWidget { protected: void mousePressEvent(QMouseEvent *); void paintEvent(QPaintEvent *); - void enterEvent(QEvent *); + void enterEvent(QtEnterEvent *); void leaveEvent(QEvent *); private: bool mHovered = false; diff --git a/src/app/GUI/BoxesList/boxscroller.cpp b/src/app/GUI/BoxesList/boxscroller.cpp index 931046cf0..2c5f51057 100644 --- a/src/app/GUI/BoxesList/boxscroller.cpp +++ b/src/app/GUI/BoxesList/boxscroller.cpp @@ -180,17 +180,18 @@ void BoxScroller::stopScrolling() { } } -void BoxScroller::dropEvent(QDropEvent *event) { +void BoxScroller::dropEvent(QDropEvent *event) +{ stopScrolling(); mCurrentMimeData = event->mimeData(); - mLastDragMoveY = event->pos().y(); + mLastDragMoveY = AppSupport::getDropPos(event).y(); updateDropTarget(); - if(mDropTarget.isValid()) { + if (mDropTarget.isValid()) { const auto targetAbs = mDropTarget.fTargetParent; const auto target = targetAbs->getTarget(); - if(mDropTarget.fDropType == DropType::on) { + if (mDropTarget.fDropType == DropType::on) { target->SWT_drop(mCurrentMimeData); - } else if(mDropTarget.fDropType == DropType::into) { + } else if (mDropTarget.fDropType == DropType::into) { target->SWT_dropInto(mDropTarget.fTargetId, mCurrentMimeData); } planScheduleUpdateVisibleWidgetsContent(); @@ -200,13 +201,14 @@ void BoxScroller::dropEvent(QDropEvent *event) { mDropTarget.reset(); } -void BoxScroller::dragEnterEvent(QDragEnterEvent *event) { +void BoxScroller::dragEnterEvent(QDragEnterEvent *event) +{ const auto mimeData = event->mimeData(); - mLastDragMoveY = event->pos().y(); + mLastDragMoveY = AppSupport::getDropPos(event).y(); mCurrentMimeData = mimeData; updateDropTarget(); //mDragging = true; - if(mCurrentMimeData) event->acceptProposedAction(); + if (mCurrentMimeData) { event->acceptProposedAction(); } update(); } @@ -218,18 +220,19 @@ void BoxScroller::dragLeaveEvent(QDragLeaveEvent *event) { update(); } -void BoxScroller::dragMoveEvent(QDragMoveEvent *event) { +void BoxScroller::dragMoveEvent(QDragMoveEvent *event) +{ event->acceptProposedAction(); - const int yPos = event->pos().y(); + const int yPos = AppSupport::getDropPos(event).y(); - if(yPos < 30) { - if(!mScrollTimer->isActive()) { + if (yPos < 30) { + if (!mScrollTimer->isActive()) { connect(mScrollTimer, &QTimer::timeout, this, &BoxScroller::scrollUp); mScrollTimer->start(300); } - } else if(yPos > height() - 30) { - if(!mScrollTimer->isActive()) { + } else if (yPos > height() - 30) { + if (!mScrollTimer->isActive()) { connect(mScrollTimer, &QTimer::timeout, this, &BoxScroller::scrollDown); mScrollTimer->start(300); diff --git a/src/app/GUI/BoxesList/boxsinglewidget.cpp b/src/app/GUI/BoxesList/boxsinglewidget.cpp index 8c53bd7b6..fe2d83590 100644 --- a/src/app/GUI/BoxesList/boxsinglewidget.cpp +++ b/src/app/GUI/BoxesList/boxsinglewidget.cpp @@ -654,8 +654,10 @@ void BoxSingleWidget::clearStaticPixmaps() void BoxSingleWidget::mousePressEvent(QMouseEvent *event) { if(!mTarget) return; - if(event->x() < mFillWidget->x() || - event->x() > mFillWidget->x() + mFillWidget->width()) return; + const auto mouseX = AppSupport::getMouseX(event); + if (mouseX < mFillWidget->x() || + mouseX > mFillWidget->x() + mFillWidget->width()) return; + const auto target = mTarget->getTarget(); if(event->button() == Qt::RightButton) { setSelected(true); @@ -672,7 +674,7 @@ void BoxSingleWidget::mousePressEvent(QMouseEvent *event) { PropertyMenu pMenu(&menu, mParent->currentScene(), MainWindow::sGetInstance()); pTarget->prp_setupTreeViewMenu(&pMenu); } - menu.exec(event->globalPos()); + menu.exec(AppSupport::getMouseGlobalPos(event)); setSelected(false); } else { mDragPressPos = event->pos().x() > mFillWidget->x(); @@ -691,7 +693,8 @@ void BoxSingleWidget::mouseMoveEvent(QMouseEvent *event) { { const auto prop = static_cast(mTarget->getTarget()); const QString name = prop->prp_getName(); - const int nameWidth = QApplication::fontMetrics().horizontalAdvance(name); + QFontMetricsF fmf(QApplication::font()); + const int nameWidth = static_cast(fmf.horizontalAdvance(name)); QPixmap pixmap(mFillWidget->x() + nameWidth + eSizesUI::widget, height()); render(&pixmap); drag->setPixmap(pixmap); @@ -713,13 +716,14 @@ void BoxSingleWidget::mouseReleaseEvent(QMouseEvent *event) const auto target = mTarget->getTarget(); const auto bbox = enve_cast(target); - if (event->button() == Qt::MidButton && bbox) { + if (event->button() == Qt::MiddleButton && bbox) { PropertyNameDialog::sRenameBox(bbox, this); return; } - if (event->x() < mFillWidget->x() || - event->x() > mFillWidget->x() + mFillWidget->width()) { return; } + const auto mouseX = AppSupport::getMouseX(event); + if (mouseX < mFillWidget->x() || + mouseX > mFillWidget->x() + mFillWidget->width()) { return; } setSelected(false); if (pointToLen(event->pos() - mDragStartPos) > eSizesUI::widget/2) { return; } @@ -734,7 +738,7 @@ void BoxSingleWidget::mouseReleaseEvent(QMouseEvent *event) } } -void BoxSingleWidget::enterEvent(QEvent *) +void BoxSingleWidget::enterEvent(QtEnterEvent *) { #ifdef Q_OS_MAC setFocus(); diff --git a/src/app/GUI/BoxesList/boxsinglewidget.h b/src/app/GUI/BoxesList/boxsinglewidget.h index 11fac85ee..b6a8e179e 100644 --- a/src/app/GUI/BoxesList/boxsinglewidget.h +++ b/src/app/GUI/BoxesList/boxsinglewidget.h @@ -37,6 +37,8 @@ #include "smartPointers/ememory.h" #include "framerange.h" #include "Animators/SmartPath/smartpathanimator.h" +#include "../ui/enterevent.h" + class QrealAnimatorValueSlider; class TimelineMovable; class Key; @@ -101,7 +103,7 @@ class BoxSingleWidget : public SingleWidget { void mouseMoveEvent(QMouseEvent *event); void mouseReleaseEvent(QMouseEvent *event); - void enterEvent(QEvent *); + void enterEvent(QtEnterEvent *); void leaveEvent(QEvent *); #ifdef Q_OS_MAC diff --git a/src/app/GUI/Dialogs/dialogsinterfaceimpl.cpp b/src/app/GUI/Dialogs/dialogsinterfaceimpl.cpp index ae8befc68..37ee6d8c5 100644 --- a/src/app/GUI/Dialogs/dialogsinterfaceimpl.cpp +++ b/src/app/GUI/Dialogs/dialogsinterfaceimpl.cpp @@ -60,8 +60,8 @@ class ShaderChoiceDialog : public QDialog { const auto textTriggerGetter = [this, &options, &homePath](const int id) { const auto& shader = options.at(id); QString ttPath = shader->fGrePath; - if(ttPath.left(homePath.count()) == homePath) { - ttPath = "~" + ttPath.mid(homePath.count()); + if(ttPath.left(homePath.size()) == homePath) { + ttPath = "~" + ttPath.mid(homePath.size()); } return ButtonsList::TextTrigger{ ttPath, [this, ttPath, id, &options]() { diff --git a/src/app/GUI/Expressions/expressiondialog.cpp b/src/app/GUI/Expressions/expressiondialog.cpp index 894014485..ab1005f23 100644 --- a/src/app/GUI/Expressions/expressiondialog.cpp +++ b/src/app/GUI/Expressions/expressiondialog.cpp @@ -554,35 +554,42 @@ void ExpressionDialog::updateScriptDefinitions() } { - QRegExp funcDefs("(class|function)\\s+([a-zA-Z_][a-zA-Z0-9_]*)\\s*(\\([a-zA-Z0-9_, ]*\\))"); - int pos = 0; - while ((pos = funcDefs.indexIn(scriptContext, pos)) != -1) { - QStringList funcs = funcDefs.capturedTexts(); - for (int i = 2; i < funcs.count() - 1; i += 3) { - const auto& func = funcs.at(i); - const auto& funcArgs = funcs.at(i + 1); - if (func.isEmpty()) { continue; } - mScriptApi->add(func + funcArgs); - mScriptLexer->addDefinition(func); - mDefsLexer->addDefinition(func); - } - pos += funcDefs.matchedLength(); + QRegularExpression funcDefs("(class|function)\\s+([a-zA-Z_][a-zA-Z0-9_]*)\\s*(\\([a-zA-Z0-9_, ]*\\))"); + auto matchIterator = funcDefs.globalMatch(scriptContext); + + while (matchIterator.hasNext()) { + QRegularExpressionMatch match = matchIterator.next(); + QStringList funcs = match.capturedTexts(); + + for (int i = 2; i < funcs.count() - 1; i += 3) { + const auto& func = funcs.at(i); + const auto& funcArgs = funcs.at(i + 1); + if (func.isEmpty()) { continue; } + + mScriptApi->add(func + funcArgs); + mScriptLexer->addDefinition(func); + mDefsLexer->addDefinition(func); + } } } { - QRegExp varDefs("([a-zA-Z_][a-zA-Z0-9_]*)\\s*=\\s*(?!=)"); - int pos = 0; - while ((pos = varDefs.indexIn(scriptContext, pos)) != -1) { - QStringList vars = varDefs.capturedTexts(); - for (int i = 1; i < vars.count(); i++) { - const auto& var = vars.at(i); - if (var.isEmpty()) { continue; } - mScriptApi->add(var); - mScriptLexer->addDefinition(var); - mDefsLexer->addDefinition(var); - } - pos += varDefs.matchedLength(); + QRegularExpression varDefs("([a-zA-Z_][a-zA-Z0-9_]*)\\s*=\\s*(?!=)"); + + auto matchIterator = varDefs.globalMatch(scriptContext); + + while (matchIterator.hasNext()) { + QRegularExpressionMatch match = matchIterator.next(); + QStringList vars = match.capturedTexts(); + + for (int i = 1; i < vars.count(); i++) { + const auto& var = vars.at(i); + if (var.isEmpty()) { continue; } + + mScriptApi->add(var); + mScriptLexer->addDefinition(var); + mDefsLexer->addDefinition(var); + } } } } diff --git a/src/app/GUI/Expressions/expressioneditor.cpp b/src/app/GUI/Expressions/expressioneditor.cpp index 6cc2b9e4b..202151bb3 100644 --- a/src/app/GUI/Expressions/expressioneditor.cpp +++ b/src/app/GUI/Expressions/expressioneditor.cpp @@ -87,7 +87,7 @@ void ExpressionEditor::keyPressEvent(QKeyEvent *e) { } else if(key == Qt::Key_Tab) { return QWidget::keyPressEvent(e); } else QTextEdit::keyPressEvent(e); - const bool input = e->text().contains(QRegExp("[A-Za-z0-9_ \\.\\$]")); + const bool input = e->text().contains(QRegularExpression("[A-Za-z0-9_ \\.\\$]")); const bool deletion = key == Qt::Key_Delete || key == Qt::Key_Backspace; const bool arrows = key == Qt::Key_Right || diff --git a/src/app/GUI/Expressions/expressionhighlighter.cpp b/src/app/GUI/Expressions/expressionhighlighter.cpp index 5e4534f1c..9e6d9fa2c 100644 --- a/src/app/GUI/Expressions/expressionhighlighter.cpp +++ b/src/app/GUI/Expressions/expressionhighlighter.cpp @@ -142,10 +142,10 @@ void ExpressionHighlighter::highlightBlock(const QString &text) { int min = match.capturedStart(2); for(int j = 0; j < subPath.count() - 1; j++) { const auto& jObj = subPath.at(j); - min += jObj.count() + 1; + min += jObj.size() + 1; } const auto& lastObjPath = subPath.last(); - const int max = min + lastObjPath.count(); + const int max = min + lastObjPath.size(); const bool autocomplete = mCursorPos >= min && mCursorPos <= max; const auto obj = mSearchCtxt->ca_findPropertyWithPathRec( 0, subPath, autocomplete ? &completions : nullptr); diff --git a/src/app/GUI/RenderWidgets/closablecontainer.cpp b/src/app/GUI/RenderWidgets/closablecontainer.cpp index 35ecb91b7..ef0d77c4b 100644 --- a/src/app/GUI/RenderWidgets/closablecontainer.cpp +++ b/src/app/GUI/RenderWidgets/closablecontainer.cpp @@ -47,12 +47,10 @@ ClosableContainer::ClosableContainer(QWidget *parent) : QWidget(parent) { mVLayout->addWidget(mContWidget); mContWidget->setContentsMargins(0, 0, 0, 0); mContWidget->setLayout(mContLayout); - //mContLayout->setMargin(0); mContLayout->setAlignment(Qt::AlignTop); mContLayout->setContentsMargins(0, 0, 0, 0); mContLayout->setSpacing(0); mVLayout->setSpacing(0); - mVLayout->setMargin(0); mVLayout->setContentsMargins(0, 0, 0, 0); setContentVisible(false); } diff --git a/src/app/GUI/RenderWidgets/outputsettingsdialog.cpp b/src/app/GUI/RenderWidgets/outputsettingsdialog.cpp index 00235275c..51456a490 100644 --- a/src/app/GUI/RenderWidgets/outputsettingsdialog.cpp +++ b/src/app/GUI/RenderWidgets/outputsettingsdialog.cpp @@ -362,11 +362,11 @@ void OutputSettingsDialog::setupFormatOptionsTree() container->setContentsMargins(10, 0, 10, 0); container->setMinimumHeight(150); - containerLayout->setMargin(0); + containerLayout->setContentsMargins(0, 0, 0, 0); containerLayout->addWidget(area); containerInner->setContentsMargins(0, 0, 0, 0); - containerInnerLayout->setMargin(0); + containerInnerLayout->setContentsMargins(0, 0, 0, 0); mFormatOptionsTree->setHeaderLabels(QStringList() << tr("Type") @@ -436,7 +436,7 @@ void OutputSettingsDialog::setupFormatOptionsTree() }); showHideWidget->setContentsMargins(0, 0, 10, 0); - showHideLayout->setMargin(0); + showHideLayout->setContentsMargins(0, 0, 0, 0); showHideLayout->addStretch(); showHideLayout->addWidget(showHideButton); diff --git a/src/app/GUI/RenderWidgets/renderinstancewidget.cpp b/src/app/GUI/RenderWidgets/renderinstancewidget.cpp index 174d74584..5947bf107 100644 --- a/src/app/GUI/RenderWidgets/renderinstancewidget.cpp +++ b/src/app/GUI/RenderWidgets/renderinstancewidget.cpp @@ -31,7 +31,6 @@ #include "outputsettingsprofilesdialog.h" #include "outputsettingsdisplaywidget.h" #include "rendersettingsdisplaywidget.h" -#include "Private/esettings.h" #include "GUI/edialogs.h" #include "appsupport.h" @@ -142,7 +141,7 @@ void RenderInstanceWidget::iniGUI() QWidget *outputSettingsOptWidget = new QWidget(this); outputSettingsOptWidget->setContentsMargins(0, 0, 0, 0); const auto outputSettingsOptLayout = new QHBoxLayout(outputSettingsOptWidget); - outputSettingsOptLayout->setMargin(0); + outputSettingsOptLayout->setContentsMargins(0, 0, 0, 0); outputSettingsOptLayout->addWidget(mOutputSettingsProfilesButton); outputSettingsOptLayout->addWidget(mOutputSettingsButton); @@ -193,7 +192,7 @@ void RenderInstanceWidget::iniGUI() QWidget *outputDestinationWidget = new QWidget(this); outputDestinationWidget->setContentsMargins(0, 0, 0, 0); const auto outputDesinationLayout = new QHBoxLayout(outputDestinationWidget); - outputDesinationLayout->setMargin(0); + outputDesinationLayout->setContentsMargins(0, 0, 0, 0); outputDesinationLayout->addWidget(mOutputDestinationButton); outputDesinationLayout->addWidget(mOutputDestinationLineEdit); @@ -203,7 +202,6 @@ void RenderInstanceWidget::iniGUI() mContentLayout->addWidget(outputSettingsLabelWidget); - mContentLayout->setMargin(0); mContentLayout->setSpacing(0); mContentLayout->setContentsMargins(0, 0, 0, 0); } @@ -284,7 +282,7 @@ void RenderInstanceWidget::mousePressEvent(QMouseEvent *e) delAct->setData(1); delAct->setEnabled(deletable); - const auto act = menu.exec(e->globalPos()); + const auto act = menu.exec(AppSupport::getMouseGlobalPos(e)); if (act) { switch (act->data().toInt()) { case 0: @@ -343,7 +341,7 @@ void RenderInstanceWidget::updateOutputDestinationFromCurrentFormat() { QString currExt; if(dividedName.count() > 1) { QString namePart = dividedName.at(dividedName.count() - 2); - if(namePart.count() > 0) { + if(namePart.size() > 0) { currExt = dividedName.last(); } } @@ -352,11 +350,11 @@ void RenderInstanceWidget::updateOutputDestinationFromCurrentFormat() { if(!firstSupported.isEmpty()) { if(currExt.isEmpty()) { if(outputDst.right(1) == ".") { - outputDst = outputDst.left(outputDst.count() - 1); + outputDst = outputDst.left(outputDst.size() - 1); } } else { int extId = outputDst.lastIndexOf("." + currExt); - outputDst.remove(extId, 1 + currExt.count()); + outputDst.remove(extId, 1 + currExt.size()); } outputDst += "." + firstSupported; } @@ -489,7 +487,6 @@ void RenderInstanceWidget::updateRenderSettings() updateFromSettings(); } -#include "Private/esettings.h" OutputProfilesListButton::OutputProfilesListButton(RenderInstanceWidget *parent) : QPushButton(parent) { mParentWidget = parent; diff --git a/src/app/GUI/RenderWidgets/renderwidget.cpp b/src/app/GUI/RenderWidgets/renderwidget.cpp index ecd688854..3a23606f0 100644 --- a/src/app/GUI/RenderWidgets/renderwidget.cpp +++ b/src/app/GUI/RenderWidgets/renderwidget.cpp @@ -50,7 +50,7 @@ RenderWidget::RenderWidget(QWidget *parent) , mState(RenderState::none) { mMainLayout = new QVBoxLayout(this); - mMainLayout->setMargin(0); + mMainLayout->setContentsMargins(0, 0, 0, 0); mMainLayout->setSpacing(0); setLayout(mMainLayout); @@ -131,7 +131,7 @@ RenderWidget::RenderWidget(QWidget *parent) mContWidget->setContentsMargins(0, 0, 0, 0); mContLayout = new QVBoxLayout(mContWidget); mContLayout->setAlignment(Qt::AlignTop); - mContLayout->setMargin(0); + mContLayout->setContentsMargins(0, 0, 0, 0); mContLayout->setSpacing(0); mContWidget->setLayout(mContLayout); mScrollArea = new ScrollArea(this); diff --git a/src/app/GUI/Settings/generalsettingswidget.cpp b/src/app/GUI/Settings/generalsettingswidget.cpp index f8bfa221f..ec8c482ff 100644 --- a/src/app/GUI/Settings/generalsettingswidget.cpp +++ b/src/app/GUI/Settings/generalsettingswidget.cpp @@ -74,7 +74,7 @@ GeneralSettingsWidget::GeneralSettingsWidget(QWidget *parent) mAutoSaveWidget->setContentsMargins(0, 0, 0, 0); const auto mAutoSaveLayout = new QHBoxLayout(mAutoSaveWidget); mAutoSaveLayout->setContentsMargins(0, 0, 0, 0); - mAutoSaveLayout->setMargin(0); + mAutoSaveLayout->setContentsMargins(0, 0, 0, 0); mAutoSave = new QCheckBox(tr("Enable Auto Save"), this); mAutoSave->setCheckable(true); @@ -154,7 +154,6 @@ GeneralSettingsWidget::GeneralSettingsWidget(QWidget *parent) mImportFileWidget->setContentsMargins(0, 0, 0, 0); const auto mImportFileLayout = new QHBoxLayout(mImportFileWidget); mImportFileLayout->setContentsMargins(0, 0, 0, 0); - mImportFileLayout->setMargin(0); const auto mImportFileLabel = new QLabel(tr("Default import directory"), this); mImportFileDir = new QComboBox(this); diff --git a/src/app/GUI/canvaswindow.cpp b/src/app/GUI/canvaswindow.cpp index f1d782b9a..46d944ea6 100644 --- a/src/app/GUI/canvaswindow.cpp +++ b/src/app/GUI/canvaswindow.cpp @@ -733,7 +733,7 @@ int CanvasWindow::getMaxFrame() void CanvasWindow::dropEvent(QDropEvent *event) { - const QPointF pos = mapToCanvasCoord(event->posF()); + const QPointF pos = mapToCanvasCoord(AppSupport::getDropPosF(event)); mActions.handleDropEvent(event, pos); } diff --git a/src/app/GUI/canvaswindow.h b/src/app/GUI/canvaswindow.h index 3e2b64011..b4899b36f 100644 --- a/src/app/GUI/canvaswindow.h +++ b/src/app/GUI/canvaswindow.h @@ -64,7 +64,7 @@ class CanvasWindow : public GLWindow, public KeyFocusTarget QWidget * const parent = nullptr); ~CanvasWindow(); Canvas *getCurrentCanvas(); - const QMatrix& getViewTransform() const + const QTransform& getViewTransform() const { return mViewTransform; } void setCurrentCanvas(Canvas * const canvas); @@ -132,7 +132,7 @@ class CanvasWindow : public GLWindow, public KeyFocusTarget Actions& mActions; QSize mOldSize{-1, -1}; - QMatrix mViewTransform; + QTransform mViewTransform; QPointF mPrevMousePos; QPointF mPrevPressPos; //bool mValidPaintTarget = false; diff --git a/src/app/GUI/graphboxeslist.cpp b/src/app/GUI/graphboxeslist.cpp index ade62e0a8..ae7ad1b8d 100644 --- a/src/app/GUI/graphboxeslist.cpp +++ b/src/app/GUI/graphboxeslist.cpp @@ -262,7 +262,7 @@ void KeysView::graphPaint(QPainter *p) { p->setRenderHint(QPainter::Antialiasing); - QMatrix transform; + QTransform transform; transform.translate(-mPixelsPerFrame*(mMinViewedFrame - 0.5), height() + mPixelsPerValUnit*mMinShownVal); transform.scale(mPixelsPerFrame, -mPixelsPerValUnit); diff --git a/src/app/GUI/keysview.cpp b/src/app/GUI/keysview.cpp index 81e61815e..97c27c063 100644 --- a/src/app/GUI/keysview.cpp +++ b/src/app/GUI/keysview.cpp @@ -67,7 +67,7 @@ TimelineHighlightWidget *KeysView::requestHighlighter() { } void KeysView::dropEvent(QDropEvent *event) { - const int frame = qRound(xToFrame(event->posF().x())); + const int frame = qRound(xToFrame(AppSupport::getDropPosF(event).x())); Actions::sInstance->handleDropEvent(event, QPointF(0, 0), frame); } @@ -242,7 +242,7 @@ void KeysView::wheelEvent(QWheelEvent *e) } #endif - const QPoint pos = e->pos(); + const QPoint pos = e->position().toPoint(); const QPoint posU = pos + QPoint(-eSizesUI::widget/2, 0); const qreal currentHoverFrame = static_cast(posU.x()) / mPixelsPerFrame + mMinViewedFrame; // qDebug() << "currentHoverFrame" << currentHoverFrame; @@ -373,7 +373,7 @@ void KeysView::mousePressEvent(QMouseEvent *e) { const QString splitStr = tr("Split Clip"); menu.addAction(QIcon::fromTheme("sequence"), editStr); menu.addAction(QIcon::fromTheme("cut"), splitStr); - const auto selectedAction = menu.exec(e->globalPos()); + const auto selectedAction = menu.exec(AppSupport::getMouseGlobalPos(e)); if (selectedAction) { if (selectedAction->text() == editStr) { const auto durRect = static_cast(movable); diff --git a/src/app/GUI/menu.cpp b/src/app/GUI/menu.cpp index 59f5858bb..a250ba920 100644 --- a/src/app/GUI/menu.cpp +++ b/src/app/GUI/menu.cpp @@ -46,7 +46,7 @@ void MainWindow::setupMenuBar() const auto newAct = mFileMenu->addAction(QIcon::fromTheme("file_blank"), tr("New", "MenuBar_File"), this, &MainWindow::newFile, - Qt::CTRL + Qt::Key_N); + QStringLiteral("Ctrl+N")); newAct->setData(tr("New Project")); newAct->setObjectName("NewProjectAct"); @@ -55,7 +55,7 @@ void MainWindow::setupMenuBar() const auto openAct = mFileMenu->addAction(QIcon::fromTheme("file_folder"), tr("Open", "MenuBar_File"), this, qOverload<>(&MainWindow::openFile), - Qt::CTRL + Qt::Key_O); + QStringLiteral("Ctrl+O")); openAct->setData(tr("Open Project")); openAct->setObjectName("OpenProjectAct"); @@ -66,7 +66,7 @@ void MainWindow::setupMenuBar() mLinkedAct = mFileMenu->addAction(QIcon::fromTheme("linked"), tr("Link"), this, &MainWindow::linkFile, - Qt::CTRL + Qt::Key_L); + QStringLiteral("Ctrl+L")); mLinkedAct->setEnabled(false); mLinkedAct->setData(tr("Link File")); mLinkedAct->setObjectName("LinkFileAct"); @@ -76,7 +76,7 @@ void MainWindow::setupMenuBar() mImportAct = mFileMenu->addAction(QIcon::fromTheme("file_import"), tr("Import", "MenuBar_File"), this, qOverload<>(&MainWindow::importFile), - Qt::CTRL + Qt::Key_I); + QStringLiteral("Ctrl+L")); mImportAct->setEnabled(false); mImportAct->setObjectName("ImportFileAct"); cmdAddAction(mImportAct); @@ -99,7 +99,7 @@ void MainWindow::setupMenuBar() mSaveAct = mFileMenu->addAction(QIcon::fromTheme("disk_drive"), tr("Save", "MenuBar_File"), this, qOverload<>(&MainWindow::saveFile), - Qt::CTRL + Qt::Key_S); + QStringLiteral("Ctrl+S")); mSaveAct->setEnabled(false); mSaveAct->setData(tr("Save Project")); mSaveAct->setObjectName("SaveProjectAct"); @@ -108,7 +108,7 @@ void MainWindow::setupMenuBar() mSaveAsAct = mFileMenu->addAction(QIcon::fromTheme("disk_drive"), tr("Save As", "MenuBar_File"), this, [this]() { saveFileAs(); }, - Qt::CTRL + Qt::SHIFT + Qt::Key_S); + QStringLiteral("Ctrl+Shift+S")); mSaveAsAct->setEnabled(false); mSaveAsAct->setData(tr("Save Project As ...")); cmdAddAction(mSaveAsAct); @@ -178,7 +178,7 @@ void MainWindow::setupMenuBar() const auto redoQAct = mEditMenu->addAction(QIcon::fromTheme("loop_forwards"), tr("Redo", "MenuBar_Edit")); - redoQAct->setShortcut(Qt::CTRL + Qt::SHIFT + Qt::Key_Z); + redoQAct->setShortcut(QStringLiteral("Ctrl+Shift+Z")); mActions.redoAction->connect(redoQAct); cmdAddAction(redoQAct); @@ -199,7 +199,7 @@ void MainWindow::setupMenuBar() qAct->setIcon(QIcon::fromTheme("copy")); mEditMenu->addAction(qAct); #ifndef Q_OS_MAC - qAct->setShortcut(Qt::CTRL + Qt::Key_C); + qAct->setShortcut(QStringLiteral("Ctrl+C")); #endif mActions.copyAction->connect(qAct); cmdAddAction(qAct); @@ -210,7 +210,7 @@ void MainWindow::setupMenuBar() qAct->setIcon(QIcon::fromTheme("cut")); mEditMenu->addAction(qAct); #ifndef Q_OS_MAC - qAct->setShortcut(Qt::CTRL + Qt::Key_X); + qAct->setShortcut(QStringLiteral("Ctrl+X")); #endif mActions.cutAction->connect(qAct); cmdAddAction(qAct); @@ -221,7 +221,7 @@ void MainWindow::setupMenuBar() qAct->setIcon(QIcon::fromTheme("paste")); mEditMenu->addAction(qAct); #ifndef Q_OS_MAC - qAct->setShortcut(Qt::CTRL + Qt::Key_V); + qAct->setShortcut(QStringLiteral("Ctrl+V")); #endif mActions.pasteAction->connect(qAct); cmdAddAction(qAct); @@ -244,7 +244,7 @@ void MainWindow::setupMenuBar() mEditMenu->addAction(qAct); qAct->setIcon(QIcon::fromTheme("duplicate")); #ifndef Q_OS_MAC - qAct->setShortcut(Qt::CTRL + Qt::Key_D); + qAct->setShortcut(QStringLiteral("Ctrl+D")); #endif mActions.duplicateAction->connect(qAct); cmdAddAction(qAct); @@ -279,7 +279,7 @@ void MainWindow::setupMenuBar() "MenuBar_Edit"), &mActions, &Actions::invertSelectionAction, - Qt::SHIFT + Qt::Key_A, + QStringLiteral("Shift+A"), mEditMenu); mInvertSelAct->setIcon(QIcon::fromTheme("select")); mInvertSelAct->setEnabled(false); @@ -292,7 +292,7 @@ void MainWindow::setupMenuBar() "MenuBar_Edit"), &mActions, &Actions::clearSelectionAction, - Qt::ALT + Qt::Key_A, + QStringLiteral("Alt+A"), mEditMenu); mClearSelAct->setIcon(QIcon::fromTheme("select")); mClearSelAct->setEnabled(false); @@ -410,7 +410,7 @@ void MainWindow::setupMenuBar() const auto groupQAct = mObjectMenu->addAction( tr("Group", "MenuBar_Object")); groupQAct->setIcon(QIcon::fromTheme("group")); - groupQAct->setShortcut(Qt::CTRL + Qt::Key_G); + groupQAct->setShortcut(QStringLiteral("Ctrl+G")); mActions.groupAction->connect(groupQAct); groupQAct->setData(tr("Group Selected")); cmdAddAction(groupQAct); @@ -418,7 +418,7 @@ void MainWindow::setupMenuBar() const auto ungroupQAct = mObjectMenu->addAction( tr("Ungroup", "MenuBar_Object")); ungroupQAct->setIcon(QIcon::fromTheme("group")); - ungroupQAct->setShortcut(Qt::CTRL + Qt::SHIFT + Qt::Key_G); + ungroupQAct->setShortcut(QStringLiteral("Ctrl+Shift+G")); mActions.ungroupAction->connect(ungroupQAct); cmdAddAction(ungroupQAct); @@ -426,13 +426,13 @@ void MainWindow::setupMenuBar() const auto otpQAct = mPathMenu->addAction( tr("Object to Path", "MenuBar_Path")); - otpQAct->setShortcut(Qt::SHIFT + Qt::CTRL + Qt::Key_C); + otpQAct->setShortcut(QStringLiteral("Shift+Ctrl+C")); mActions.objectsToPathAction->connect(otpQAct); cmdAddAction(otpQAct); const auto stpQAct = mPathMenu->addAction( tr("Stroke to Path", "MenuBar_Path")); - stpQAct->setShortcut(Qt::CTRL + Qt::ALT + Qt::Key_C); + stpQAct->setShortcut(QStringLiteral("Ctrl+Alt+C")); mActions.strokeToPathAction->connect(stpQAct); cmdAddAction(stpQAct); @@ -498,7 +498,7 @@ void MainWindow::setupMenuBar() const auto qAct = mPathMenu->addAction( tr("Break Apart", "MenuBar_Path")); qAct->setIcon(QIcon::fromTheme("booleans_break_apart")); - qAct->setShortcut(Qt::CTRL + Qt::SHIFT + Qt::Key_K); + qAct->setShortcut(QStringLiteral("Ctrl+Shift+K")); mActions.pathsBreakApartAction->connect(qAct); cmdAddAction(qAct); } diff --git a/src/app/GUI/timelinedockwidget.cpp b/src/app/GUI/timelinedockwidget.cpp index eb32b1484..e2577d8a6 100644 --- a/src/app/GUI/timelinedockwidget.cpp +++ b/src/app/GUI/timelinedockwidget.cpp @@ -82,7 +82,7 @@ TimelineDockWidget::TimelineDockWidget(Document& document, mMainLayout = new QVBoxLayout(this); setLayout(mMainLayout); mMainLayout->setSpacing(0); - mMainLayout->setMargin(0); + mMainLayout->setContentsMargins(0, 0, 0, 0); mFrameRewindAct = new QAction(QIcon::fromTheme("rewind"), tr("Rewind"), diff --git a/src/app/GUI/timelinehighlightwidget.cpp b/src/app/GUI/timelinehighlightwidget.cpp index 631f4d38b..5e3f6a9c0 100644 --- a/src/app/GUI/timelinehighlightwidget.cpp +++ b/src/app/GUI/timelinehighlightwidget.cpp @@ -46,7 +46,7 @@ void TimelineHighlightWidget::setOther(TimelineHighlightWidget * const other) { mOther = other; } void TimelineHighlightWidget::mouseMoveEvent(QMouseEvent *event) { - setHoverRow(event->y()/eSizesUI::widget); + setHoverRow(AppSupport::getMouseY(event) / eSizesUI::widget); event->ignore(); } diff --git a/src/app/GUI/timelinewidget.cpp b/src/app/GUI/timelinewidget.cpp index 06a976866..c87d696d3 100644 --- a/src/app/GUI/timelinewidget.cpp +++ b/src/app/GUI/timelinewidget.cpp @@ -25,8 +25,8 @@ #include #include -#include #include +#include #include "timelinewidget.h" #include "widgets/framescrollbar.h" @@ -58,11 +58,11 @@ TimelineWidget::TimelineWidget(Document &document, mMainLayout = new QGridLayout(this); mMainLayout->setSpacing(0); - mMainLayout->setMargin(0); + mMainLayout->setContentsMargins(0, 0, 0, 0); mMenuLayout = new QHBoxLayout(); //mMenuLayout->setSpacing(0); - mMenuLayout->setMargin(0); + mMenuLayout->setContentsMargins(0, 0 ,0, 0); mBoxesListMenuBar = new FakeMenuBar(this); mBoxesListMenuBar->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Preferred); @@ -260,7 +260,7 @@ TimelineWidget::TimelineWidget(Document &document, mFrameScrollBar->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Preferred); - const qreal dpi = QApplication::desktop()->logicalDpiX() / 96.0; + const qreal dpi = this->screen()->logicalDotsPerInchX() / 96.0; mFrameScrollBar->setFixedHeight(40 * dpi); // connect(MemoryHandler::sGetInstance(), &MemoryHandler::memoryFreed, @@ -447,7 +447,7 @@ void TimelineWidget::readStateXEV(XevReadBoxesHandler& boxReadHandler, const auto frameRangeStr = ele.attribute("frameRange"); const auto frameStr = ele.attribute("frame"); - const auto frameRangeValStrs = frameRangeStr.splitRef(' '); + const auto frameRangeValStrs = frameRangeStr.split(' '); if(frameRangeValStrs.count() != 2) RuntimeThrow("Invalid frame range value " + frameRangeStr); diff --git a/src/app/GUI/window.cpp b/src/app/GUI/window.cpp index 601cbdfbe..b5bd2b60b 100644 --- a/src/app/GUI/window.cpp +++ b/src/app/GUI/window.cpp @@ -52,7 +52,7 @@ Window::Window(QWidget *parent, setContentsMargins(0, 0, 0, 0); mLayout = new QVBoxLayout(this); - mLayout->setMargin(0); + mLayout->setContentsMargins(0, 0, 0, 0); mLayout->addWidget(child); loadState(visible); diff --git a/src/app/main.cpp b/src/app/main.cpp index 1473a9255..f1f58143b 100644 --- a/src/app/main.cpp +++ b/src/app/main.cpp @@ -24,7 +24,6 @@ #include #include #include -#include #include "hardwareinfo.h" #include "Private/esettings.h" diff --git a/src/app/renderhandler.cpp b/src/app/renderhandler.cpp index 50166ce83..35647ced5 100644 --- a/src/app/renderhandler.cpp +++ b/src/app/renderhandler.cpp @@ -54,8 +54,11 @@ RenderHandler::RenderHandler(Document &document, this, &RenderHandler::nextPreviewFrame); connect(mPreviewFPSTimer, &QTimer::timeout, this, &RenderHandler::audioPushTimerExpired); + +#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) connect(audioHandler.audioOutput(), &QAudioOutput::notify, this, &RenderHandler::audioPushTimerExpired); +#endif const auto vidEmitter = videoEncoder.getEmitter(); // connect(vidEmitter, &VideoEncoderEmitter::encodingStarted, diff --git a/src/cmake/friction-common.cmake b/src/cmake/friction-common.cmake index 12bc5a870..05638164f 100644 --- a/src/cmake/friction-common.cmake +++ b/src/cmake/friction-common.cmake @@ -71,20 +71,33 @@ if(MSVC) endif() find_package(PkgConfig QUIET) -find_package(QT NAMES Qt5 COMPONENTS Core REQUIRED) -find_package( - Qt${QT_VERSION_MAJOR} - 5.15.13 - COMPONENTS - Gui - Widgets - OpenGL - Multimedia - Qml - Xml - #Svg - REQUIRED -) + +option(USE_QT6 "Use Qt6 (experimental)" OFF) +if(USE_QT6) + set(QT_VERSION_MAJOR 6) + find_package(Qt6 6.4.2 REQUIRED COMPONENTS + Core + Gui + Widgets + OpenGLWidgets + OpenGL + Multimedia + Qml + Xml + ) +else() + set(QT_VERSION_MAJOR 5) + find_package(Qt5 5.15.13 REQUIRED COMPONENTS + Core + Gui + Widgets + OpenGL + Multimedia + Qml + Xml + ) +endif() + set(QT_LIBRARIES Qt${QT_VERSION_MAJOR}::Core Qt${QT_VERSION_MAJOR}::Gui @@ -95,6 +108,9 @@ set(QT_LIBRARIES Qt${QT_VERSION_MAJOR}::Xml #Qt${QT_VERSION_MAJOR}::Svg ) +if(USE_QT6) + list(APPEND QT_LIBRARIES Qt${QT_VERSION_MAJOR}::OpenGLWidgets) +endif() if(WIN32) set(SKIA_LIBRARIES diff --git a/src/core/Animators/SmartPath/listofnodes.cpp b/src/core/Animators/SmartPath/listofnodes.cpp index 9a6d6d559..ad2bdf837 100644 --- a/src/core/Animators/SmartPath/listofnodes.cpp +++ b/src/core/Animators/SmartPath/listofnodes.cpp @@ -114,7 +114,7 @@ void ListOfNodes::prependNodes(ListOfNodes &&src) { updateNodeIds(); } -void ListOfNodes::applyTransform(const QMatrix &transform) { +void ListOfNodes::applyTransform(const QTransform &transform) { for(const auto& node : mList) node->applyTransform(transform); } diff --git a/src/core/Animators/SmartPath/listofnodes.h b/src/core/Animators/SmartPath/listofnodes.h index 63497908a..539d080aa 100644 --- a/src/core/Animators/SmartPath/listofnodes.h +++ b/src/core/Animators/SmartPath/listofnodes.h @@ -88,7 +88,7 @@ class CORE_EXPORT ListOfNodes { void appendNodes(ListOfNodes&& src); void prependNodes(ListOfNodes&& src); - void applyTransform(const QMatrix &transform); + void applyTransform(const QTransform &transform); typedef QList>::const_iterator const_iterator; typedef QList>::iterator iterator; diff --git a/src/core/Animators/SmartPath/node.cpp b/src/core/Animators/SmartPath/node.cpp index f3fb8663e..7b4220464 100644 --- a/src/core/Animators/SmartPath/node.cpp +++ b/src/core/Animators/SmartPath/node.cpp @@ -109,7 +109,7 @@ NormalNodeData Node::normalData() const { mCtrlsMode, mC0, mP1, mC2}; } -void Node::applyTransform(const QMatrix &transform) { +void Node::applyTransform(const QTransform &transform) { mC0 = transform.map(mC0); mP1 = transform.map(mP1); mC2 = transform.map(mC2); diff --git a/src/core/Animators/SmartPath/node.h b/src/core/Animators/SmartPath/node.h index 35b70d57c..fb526004c 100644 --- a/src/core/Animators/SmartPath/node.h +++ b/src/core/Animators/SmartPath/node.h @@ -106,7 +106,7 @@ struct CORE_EXPORT Node { NormalNodeData normalData() const; - void applyTransform(const QMatrix &transform); + void applyTransform(const QTransform &transform); void disableUnnecessaryCtrls(); diff --git a/src/core/Animators/SmartPath/nodelist.h b/src/core/Animators/SmartPath/nodelist.h index 8a14d60fe..035ed8d85 100644 --- a/src/core/Animators/SmartPath/nodelist.h +++ b/src/core/Animators/SmartPath/nodelist.h @@ -117,7 +117,7 @@ class CORE_EXPORT NodeList { void updateDissolvedNodePosition(const int nodeId); void updateDissolvedNodePosition(const int nodeId, Node * const node); - void applyTransform(const QMatrix &transform) + void applyTransform(const QTransform &transform) { mNodes.applyTransform(transform); } bool read(eReadStream& src); diff --git a/src/core/Animators/SmartPath/smartpath.cpp b/src/core/Animators/SmartPath/smartpath.cpp index 9707eacb5..6a25a885f 100644 --- a/src/core/Animators/SmartPath/smartpath.cpp +++ b/src/core/Animators/SmartPath/smartpath.cpp @@ -392,7 +392,7 @@ QString SmartPath::toXEV() const { return result; } -void SmartPath::loadXEV(const QStringRef& xev) { +void SmartPath::loadXEV(const QStringView& xev) { ListOfNodes listOfNodes; const auto nodes = xev.split(',', Qt::SkipEmptyParts); diff --git a/src/core/Animators/SmartPath/smartpath.h b/src/core/Animators/SmartPath/smartpath.h index edb5b18e6..a65528e72 100644 --- a/src/core/Animators/SmartPath/smartpath.h +++ b/src/core/Animators/SmartPath/smartpath.h @@ -146,7 +146,7 @@ class CORE_EXPORT SmartPath { NodeList getAndClearLastDetached(); - void applyTransform(const QMatrix &transform) + void applyTransform(const QTransform &transform) { mNodesList.applyTransform(transform); } bool read(eReadStream& src) @@ -155,7 +155,7 @@ class CORE_EXPORT SmartPath { { return mNodesList.write(dst); } QString toXEV() const; - void loadXEV(const QStringRef& xev); + void loadXEV(const QStringView& xev); const NodeList& getNodesRef() const { return mNodesList; } diff --git a/src/core/Animators/SmartPath/smartpathanimator.cpp b/src/core/Animators/SmartPath/smartpathanimator.cpp index db93da6fe..be1b4b3c0 100644 --- a/src/core/Animators/SmartPath/smartpathanimator.cpp +++ b/src/core/Animators/SmartPath/smartpathanimator.cpp @@ -127,7 +127,7 @@ void SmartPathAnimator::prp_readPropertyXEV_impl( const int modeInt = XmlExportHelpers::stringToInt(modeStr); mMode = static_cast(modeInt); - readValuesXEV(ele, [closed](SmartPath& path, const QStringRef& str) { + readValuesXEV(ele, [closed](SmartPath& path, const QStringView& str) { path.loadXEV(str); path.setClosed(closed); }); @@ -226,7 +226,7 @@ qsptr SmartPathAnimator::createFromDetached() { return newAnim; } -void SmartPathAnimator::applyTransform(const QMatrix &transform) { +void SmartPathAnimator::applyTransform(const QTransform &transform) { const auto& keys = anim_getKeys(); for(const auto &key : keys) { const auto spKey = static_cast(key); diff --git a/src/core/Animators/SmartPath/smartpathanimator.h b/src/core/Animators/SmartPath/smartpathanimator.h index efaad8b8e..f138d5eff 100644 --- a/src/core/Animators/SmartPath/smartpathanimator.h +++ b/src/core/Animators/SmartPath/smartpathanimator.h @@ -112,7 +112,7 @@ class CORE_EXPORT SmartPathAnimator : public SmartPathAnimatorBase { qsptr createFromDetached(); - void applyTransform(const QMatrix &transform); + void applyTransform(const QTransform &transform); const SkPath& getCurrentPath(); diff --git a/src/core/Animators/SmartPath/smartpathcollection.cpp b/src/core/Animators/SmartPath/smartpathcollection.cpp index dd20617ec..64fd02c14 100644 --- a/src/core/Animators/SmartPath/smartpathcollection.cpp +++ b/src/core/Animators/SmartPath/smartpathcollection.cpp @@ -157,7 +157,7 @@ SkPath SmartPathCollection::getPathAtRelFrame(const qreal relFrame) const { return result; } -void SmartPathCollection::applyTransform(const QMatrix &transform) const { +void SmartPathCollection::applyTransform(const QTransform &transform) const { const int iMax = ca_getNumberOfChildren() - 1; for(int i = 0; i <= iMax; i++) { const auto path = ca_getChildAt(i); diff --git a/src/core/Animators/SmartPath/smartpathcollection.h b/src/core/Animators/SmartPath/smartpathcollection.h index 4afbf2aa2..c523e07a4 100644 --- a/src/core/Animators/SmartPath/smartpathcollection.h +++ b/src/core/Animators/SmartPath/smartpathcollection.h @@ -57,7 +57,7 @@ class CORE_EXPORT SmartPathCollection : public SmartPathCollectionBase { SkPath getPathAtRelFrame(const qreal relFrame) const; - void applyTransform(const QMatrix &transform) const; + void applyTransform(const QTransform &transform) const; void loadSkPath(const SkPath& path); diff --git a/src/core/Animators/animatort.h b/src/core/Animators/animatort.h index e113905d4..6ae05b9c1 100644 --- a/src/core/Animators/animatort.h +++ b/src/core/Animators/animatort.h @@ -39,7 +39,7 @@ class AnimatorT : public BasedAnimatorT, T> { AnimatorT(const QString& name) : BasedAnimatorT, T>(name) {} - using StringToValue = std::function; + using StringToValue = std::function; void readValuesXEV(const QDomElement& ele, const StringToValue& strToVal); using ValueToString = std::function; void writeValuesXEV(QDomElement& ele, const ValueToString& valToStr) const; @@ -55,8 +55,8 @@ void AnimatorT::readValuesXEV( const QString valueStrs = ele.attribute("values"); const QString frameStrs = ele.attribute("frames"); - const auto values = valueStrs.splitRef(';'); - const auto framess = frameStrs.splitRef(';'); + const auto values = valueStrs.split(';'); + const auto framess = frameStrs.split(';'); if(values.count() != framess.count()) RuntimeThrow("The values count does not match the frames count"); const int iMax = values.count(); @@ -64,7 +64,7 @@ void AnimatorT::readValuesXEV( const auto& value = values[i]; const auto frames = framess[i].split(' '); if(frames.count() != 3) { - RuntimeThrow("Invalid frames count " + framess[i].toString()); + RuntimeThrow("Invalid frames count " + framess[i]); } const int frame = XmlExportHelpers::stringToInt(frames[1]); @@ -75,7 +75,7 @@ void AnimatorT::readValuesXEV( } } else if(ele.hasAttribute("value")) { const QString value = ele.attribute("value"); - strToVal(this->mCurrentValue, &value); + strToVal(this->mCurrentValue, value); } else RuntimeThrow("No values/frames and no value provided"); } diff --git a/src/core/Animators/gradientpoints.cpp b/src/core/Animators/gradientpoints.cpp index 449a60574..86c4c5462 100644 --- a/src/core/Animators/gradientpoints.cpp +++ b/src/core/Animators/gradientpoints.cpp @@ -51,7 +51,7 @@ void GradientPoints::enable() { mEnabled = true; } -void GradientPoints::applyTransform(const QMatrix &transform) { +void GradientPoints::applyTransform(const QTransform &transform) { mStartAnimator->applyTransform(transform); mEndAnimator->applyTransform(transform); } diff --git a/src/core/Animators/gradientpoints.h b/src/core/Animators/gradientpoints.h index 71cb3d24f..e9b87ffd9 100644 --- a/src/core/Animators/gradientpoints.h +++ b/src/core/Animators/gradientpoints.h @@ -47,7 +47,7 @@ class CORE_EXPORT GradientPoints : public StaticComplexAnimator { void setColors(const QColor &startColor, const QColor &endColor); void setPositions(const QPointF &startPos, const QPointF &endPos); - void applyTransform(const QMatrix &transform);; + void applyTransform(const QTransform &transform);; QPointF getStartPointAtRelFrame(const int relFrame); QPointF getEndPointAtRelFrame(const int relFrame); diff --git a/src/core/Animators/interoptimalanimatort.h b/src/core/Animators/interoptimalanimatort.h index 89b5576d1..4b7bc08c8 100644 --- a/src/core/Animators/interoptimalanimatort.h +++ b/src/core/Animators/interoptimalanimatort.h @@ -74,7 +74,7 @@ class InterOptimalAnimatorT : public GraphAnimator { bool resultUpToDate() const { return mResultUpToDate; } void setResultUpToDate(const bool upToDate) { mResultUpToDate = upToDate; } - using StringToValue = std::function; + using StringToValue = std::function; void readValuesXEV(const QDomElement& ele, const StringToValue& strToVal); using ValueToString = std::function; void writeValuesXEV(QDomElement& ele, const ValueToString& valToStr) const; @@ -224,10 +224,10 @@ void InterOptimalAnimatorT::readValuesXEV( const QString ctrlModeStrs = ele.attribute("ctrlModes"); const QString ctrlValueStrs = ele.attribute("ctrlValues"); - const auto values = valueStrs.splitRef(';'); - const auto framess = frameStrs.splitRef(';'); - const auto ctrlModes = ctrlModeStrs.splitRef(';'); - const auto ctrlValuess = ctrlValueStrs.splitRef(';'); + const auto values = valueStrs.split(';'); + const auto framess = frameStrs.split(';'); + const auto ctrlModes = ctrlModeStrs.split(';'); + const auto ctrlValuess = ctrlValueStrs.split(';'); if(values.count() != framess.count()) RuntimeThrow("The values count does not match the frames count"); if(ctrlModes.count() != framess.count()) @@ -239,11 +239,11 @@ void InterOptimalAnimatorT::readValuesXEV( const auto& value = values[i]; const auto frames = framess[i].split(' '); if(frames.count() != 3) { - RuntimeThrow("Invalid frames count " + framess[i].toString()); + RuntimeThrow("Invalid frames count " + framess[i]); } const auto ctrlValues = ctrlValuess[i].split(' '); if(ctrlValues.count() != 2) { - RuntimeThrow("Invalid ctrlValues count " + ctrlValuess[i].toString()); + RuntimeThrow("Invalid ctrlValues count " + ctrlValuess[i]); } const auto ctrlModeStr = ctrlModes[i]; const auto ctrlMode = XmlExportHelpers::stringToEnum( @@ -280,7 +280,7 @@ void InterOptimalAnimatorT::readValuesXEV( } else if(ele.hasAttribute("value")) { const QString value = ele.attribute("value"); auto& baseValue = this->baseValue(); - strToVal(baseValue, &value); + strToVal(baseValue, value); } else RuntimeThrow("No values/frames and no value provided"); prp_afterWholeInfluenceRangeChanged(); diff --git a/src/core/Animators/interpolationanimatort.h b/src/core/Animators/interpolationanimatort.h index e0a4b5395..d3845ffe3 100644 --- a/src/core/Animators/interpolationanimatort.h +++ b/src/core/Animators/interpolationanimatort.h @@ -54,7 +54,7 @@ class InterpolationAnimatorT : const K * const prevKey, const K * const nextKey) const override; - using StringToValue = std::function; + using StringToValue = std::function; void readValuesXEV(const QDomElement& ele, const StringToValue& strToVal); using ValueToString = std::function; void writeValuesXEV(QDomElement& ele, const ValueToString& valToStr) const; @@ -94,10 +94,10 @@ void InterpolationAnimatorT::readValuesXEV( const QString ctrlModeStrs = ele.attribute("ctrlModes"); const QString ctrlValueStrs = ele.attribute("ctrlValues"); - const auto values = valueStrs.splitRef(';'); - const auto framess = frameStrs.splitRef(';'); - const auto ctrlModes = ctrlModeStrs.splitRef(';'); - const auto ctrlValuess = ctrlValueStrs.splitRef(';'); + const auto values = valueStrs.split(';'); + const auto framess = frameStrs.split(';'); + const auto ctrlModes = ctrlModeStrs.split(';'); + const auto ctrlValuess = ctrlValueStrs.split(';'); if(values.count() != framess.count()) RuntimeThrow("The values count does not match the frames count"); @@ -110,11 +110,11 @@ void InterpolationAnimatorT::readValuesXEV( const auto& value = values[i]; const auto frames = framess[i].split(' '); if(frames.count() != 3) { - RuntimeThrow("Invalid frames count " + framess[i].toString()); + RuntimeThrow("Invalid frames count " + framess[i]); } const auto ctrlValues = ctrlValuess[i].split(' '); if(ctrlValues.count() != 2) { - RuntimeThrow("Invalid ctrlValues count " + ctrlValuess[i].toString()); + RuntimeThrow("Invalid ctrlValues count " + ctrlValuess[i]); } const auto ctrlModeStr = ctrlModes[i]; const auto ctrlMode = XmlExportHelpers::stringToEnum( @@ -150,7 +150,7 @@ void InterpolationAnimatorT::readValuesXEV( } } else if(ele.hasAttribute("value")) { const QString value = ele.attribute("value"); - strToVal(this->mCurrentValue, &value); + strToVal(this->mCurrentValue, value); } else RuntimeThrow("No values/frames and no value provided"); } diff --git a/src/core/Animators/paintsettingsanimator.cpp b/src/core/Animators/paintsettingsanimator.cpp index e6079eb04..2acdea9f2 100644 --- a/src/core/Animators/paintsettingsanimator.cpp +++ b/src/core/Animators/paintsettingsanimator.cpp @@ -228,7 +228,7 @@ void PaintSettingsAnimator::setGradientType(const GradientType type) { prp_afterWholeInfluenceRangeChanged(); } -QMatrix PaintSettingsAnimator::getGradientTransform(const qreal relFrame) const { +QTransform PaintSettingsAnimator::getGradientTransform(const qreal relFrame) const { return mGradientTransform->getRelativeTransformAtFrame(relFrame); } @@ -269,7 +269,7 @@ void PaintSettingsAnimator::duplicatePaintSettingsNotAnim( } } -void PaintSettingsAnimator::applyTransform(const QMatrix &transform) { +void PaintSettingsAnimator::applyTransform(const QTransform &transform) { mGradientPoints->applyTransform(transform); } @@ -475,13 +475,13 @@ void UpdatePaintSettings::updateGradient(const QGradientStops &stops, const QPointF &start, const QPointF &finalStop, const GradientType gradientType, - const QMatrix& transform) { + const QTransform& transform) { const int nStops = stops.count(); QVector gradPoints(nStops); QVector gradColors(nStops); QVector gradPos(nStops); - const QMatrix invertedTransform = transform.inverted(); + const QTransform invertedTransform = transform.inverted(); const QPointF mappedStart = invertedTransform.map(start); const QPointF mappedEnd = invertedTransform.map(finalStop); diff --git a/src/core/Animators/paintsettingsanimator.h b/src/core/Animators/paintsettingsanimator.h index eca22019b..8a51ee3cd 100644 --- a/src/core/Animators/paintsettingsanimator.h +++ b/src/core/Animators/paintsettingsanimator.h @@ -77,7 +77,7 @@ class CORE_EXPORT PaintSettingsAnimator : public ComplexAnimator { GradientType getGradientType() { return mGradientType; } void setGradientType(const GradientType type); - QMatrix getGradientTransform(const qreal relFrame) const; + QTransform getGradientTransform(const qreal relFrame) const; void setGradientTransform(const TransformValues& transform); GradientPoints* getGradientPoints() const @@ -86,7 +86,7 @@ class CORE_EXPORT PaintSettingsAnimator : public ComplexAnimator { void setupPaintSettings(const qreal relFrame, UpdatePaintSettings& settings); void duplicatePaintSettingsNotAnim(PaintSettingsAnimator * const settings); - void applyTransform(const QMatrix& transform); + void applyTransform(const QTransform& transform); signals: void paintTypeChanged(const PaintType &type); @@ -141,7 +141,7 @@ struct CORE_EXPORT UpdatePaintSettings { const QPointF &start, const QPointF &finalStop, const GradientType gradientType, - const QMatrix &transform); + const QTransform &transform); PaintType fPaintType; QColor fPaintColor; sk_sp fGradient; diff --git a/src/core/Animators/qcubicsegment1danimator.cpp b/src/core/Animators/qcubicsegment1danimator.cpp index 5a3a57562..56cf0ccf1 100644 --- a/src/core/Animators/qcubicsegment1danimator.cpp +++ b/src/core/Animators/qcubicsegment1danimator.cpp @@ -32,7 +32,7 @@ qCubicSegment1DAnimator::qCubicSegment1DAnimator(const QString &name) : void qCubicSegment1DAnimator::prp_readPropertyXEV_impl( const QDomElement& ele, const XevImporter& imp) { Q_UNUSED(imp) - readValuesXEV(ele, [](qCubicSegment1D& seg, const QStringRef& str) { + readValuesXEV(ele, [](qCubicSegment1D& seg, const QStringView& str) { const auto valueStrs = str.split(' ', Qt::SkipEmptyParts); if(valueStrs.count() == 4) { const qreal p0 = XmlExportHelpers::stringToDouble(valueStrs[0]); diff --git a/src/core/Animators/qpointfanimator.cpp b/src/core/Animators/qpointfanimator.cpp index c006d3b79..4f513e17b 100644 --- a/src/core/Animators/qpointfanimator.cpp +++ b/src/core/Animators/qpointfanimator.cpp @@ -211,7 +211,7 @@ qreal QPointFAnimator::getSavedYValue() { return mYAnimator->getSavedBaseValue(); } -void QPointFAnimator::applyTransform(const QMatrix &transform) { +void QPointFAnimator::applyTransform(const QTransform &transform) { mXAnimator->anim_coordinateKeysWith(mYAnimator.get()); const auto& xKeys = mXAnimator->anim_getKeys(); const auto& yKeys = mYAnimator->anim_getKeys(); diff --git a/src/core/Animators/qpointfanimator.h b/src/core/Animators/qpointfanimator.h index e9eb50eb5..6e19d175c 100644 --- a/src/core/Animators/qpointfanimator.h +++ b/src/core/Animators/qpointfanimator.h @@ -94,7 +94,7 @@ class CORE_EXPORT QPointFAnimator : public StaticComplexAnimator { qreal getEffectiveYValue(); qreal getEffectiveYValue(const qreal relFrame); - void applyTransform(const QMatrix &transform); + void applyTransform(const QTransform &transform); void saveQPointFSVG(SvgExporter& exp, QDomElement& parent, diff --git a/src/core/Animators/qrealanimator.cpp b/src/core/Animators/qrealanimator.cpp index e6380ba60..f07252776 100644 --- a/src/core/Animators/qrealanimator.cpp +++ b/src/core/Animators/qrealanimator.cpp @@ -935,9 +935,9 @@ void QrealAnimator::prp_readPropertyXEV_impl( if(!values.isEmpty()) { const auto allFrames = ele.attribute("frames"); const auto ctrlModes = ele.attribute("ctrlModes"); - const auto keysValues = values.splitRef(';'); - const auto keysFrames = allFrames.splitRef(';'); - const auto keysCtrlModes = ctrlModes.splitRef(';'); + const auto keysValues = values.split(';'); + const auto keysFrames = allFrames.split(';'); + const auto keysCtrlModes = ctrlModes.split(';'); if(keysValues.count() != keysFrames.count()) RuntimeThrow("The values count does not match the frames count"); if(keysCtrlModes.count() != keysFrames.count()) @@ -946,11 +946,11 @@ void QrealAnimator::prp_readPropertyXEV_impl( for(int i = 0; i < iMax; i++) { const auto values = keysValues[i].split(' '); if(values.count() != 3) { - RuntimeThrow("Invalid values count " + values[i].toString()); + RuntimeThrow("Invalid values count " + values[i]); } const auto frames = keysFrames[i].split(' '); if(frames.count() != 3) { - RuntimeThrow("Invalid frames count " + frames[i].toString()); + RuntimeThrow("Invalid frames count " + frames[i]); } const auto ctrlModeStr = keysCtrlModes[i]; const auto ctrlMode = XmlExportHelpers::stringToEnum( diff --git a/src/core/Animators/qstringanimator.cpp b/src/core/Animators/qstringanimator.cpp index 0d506eefa..601091880 100644 --- a/src/core/Animators/qstringanimator.cpp +++ b/src/core/Animators/qstringanimator.cpp @@ -36,7 +36,7 @@ QStringAnimator::QStringAnimator(const QString &name) : QDomElement createTextElement(SvgExporter& exp, const QString& text) { auto textEle = exp.createElement("text"); - const QStringList lines = text.split(QRegExp("\n|\r\n|\r")); + const QStringList lines = text.split(QRegularExpression("\n|\r\n|\r")); for(int i = 0; i < lines.count(); i++) { const auto& line = lines.at(i); auto tspan = exp.createElement("tspan"); @@ -79,9 +79,9 @@ void QStringAnimator::prp_readPropertyXEV_impl( const QDomElement& ele, const XevImporter& imp) { if(ele.hasAttribute("frames")) { const auto framesStr = ele.attribute("frames"); - const auto frameStrs = framesStr.splitRef(' ', Qt::SkipEmptyParts); + const auto frameStrs = framesStr.split(' ', Qt::SkipEmptyParts); - for(const QStringRef& frame : frameStrs) { + for(const QString& frame : frameStrs) { const int iFrame = XmlExportHelpers::stringToInt(frame); imp.processAsset(frame + ".txt", [&](QIODevice* const src) { QString value; diff --git a/src/core/Animators/transformanimator.cpp b/src/core/Animators/transformanimator.cpp index 21d96460b..476e2dfe7 100644 --- a/src/core/Animators/transformanimator.cpp +++ b/src/core/Animators/transformanimator.cpp @@ -178,10 +178,10 @@ SkPoint BasicTransformAnimator::mapFromParent(const SkPoint &parentRelPos) const return toSkPoint(mapFromParent(toQPointF(parentRelPos))); } -QMatrix BasicTransformAnimator::getRelativeTransformAtFrame( - const qreal relFrame, QMatrix* postTransform) const { +QTransform BasicTransformAnimator::getRelativeTransformAtFrame( + const qreal relFrame, QTransform* postTransform) const { Q_UNUSED(postTransform) - QMatrix matrix; + QTransform matrix; matrix.translate(mPosAnimator->getEffectiveXValue(relFrame), mPosAnimator->getEffectiveYValue(relFrame)); @@ -205,7 +205,7 @@ void BasicTransformAnimator::setRelativePos(const QPointF &relPos) { void BasicTransformAnimator::rotateRelativeToSavedValue(const qreal rotRel, const QPointF &pivot) { - QMatrix matrix; + QTransform matrix; matrix.translate(pivot.x(), pivot.y()); matrix.rotate(rotRel); matrix.translate(-pivot.x() + mPosAnimator->getSavedXValue(), @@ -250,15 +250,15 @@ bool BasicTransformAnimator::rotationFlipped() const { return mInheritedTransform.m11() * mInheritedTransform.m22() < 0.; } -const QMatrix &BasicTransformAnimator::getInheritedTransform() const { +const QTransform &BasicTransformAnimator::getInheritedTransform() const { return mInheritedTransform; } -const QMatrix &BasicTransformAnimator::getTotalTransform() const { +const QTransform &BasicTransformAnimator::getTotalTransform() const { return mTotalTransform; } -const QMatrix &BasicTransformAnimator::getRelativeTransform() const { +const QTransform &BasicTransformAnimator::getRelativeTransform() const { return mRelTransform; } @@ -275,7 +275,7 @@ void BasicTransformAnimator::setParentTransformAnimator( void BasicTransformAnimator::scaleRelativeToSavedValue(const qreal sx, const qreal sy, const QPointF &pivot) { - QMatrix matrix; + QTransform matrix; matrix.translate(pivot.x(), pivot.y()); matrix.rotate(mRotAnimator->getEffectiveValue()); matrix.scale(sx, sy); @@ -299,7 +299,7 @@ QrealAnimator *BasicTransformAnimator::getRotAnimator() const { return mRotAnimator.get(); } -QMatrix BasicTransformAnimator::getInheritedTransformAtFrame( +QTransform BasicTransformAnimator::getInheritedTransformAtFrame( const qreal relFrame) const { if(mParentTransform) { const qreal absFrame = prp_relFrameToAbsFrameF(relFrame); @@ -307,11 +307,11 @@ QMatrix BasicTransformAnimator::getInheritedTransformAtFrame( mParentTransform->prp_absFrameToRelFrameF(absFrame); return mParentTransform->getTotalTransformAtFrame(parentRelFrame); } else { - return QMatrix(); + return QTransform(); } } -QMatrix BasicTransformAnimator::getTotalTransformAtFrame( +QTransform BasicTransformAnimator::getTotalTransformAtFrame( const qreal relFrame) const { if(mParentTransform) { const qreal absFrame = prp_relFrameToAbsFrameF(relFrame); @@ -494,7 +494,7 @@ void AdvancedTransformAnimator::shearRelativeToSavedValue(const qreal shearXBy, const qreal shearYBy, const QPointF &pivot) { - QMatrix matrix; + QTransform matrix; matrix.translate(pivot.x(), pivot.y()); matrix.rotate(mRotAnimator->getEffectiveValue()); matrix.scale(mScaleAnimator->getEffectiveXValue(), mScaleAnimator->getEffectiveYValue()); @@ -519,12 +519,12 @@ void AdvancedTransformAnimator::startTransformSkipOpacity() { startShearTransform(); } -QMatrix valuesToMatrix(const qreal pivotX, const qreal pivotY, +QTransform valuesToMatrix(const qreal pivotX, const qreal pivotY, const qreal posX, const qreal posY, const qreal rot, const qreal scaleX, const qreal scaleY, const qreal shearX, const qreal shearY) { - QMatrix matrix; + QTransform matrix; matrix.translate(pivotX + posX, pivotY + posY); matrix.rotate(rot); matrix.scale(scaleX, scaleY); @@ -541,7 +541,7 @@ void AdvancedTransformAnimator::applyTransformEffects( qreal& rot, qreal& scaleX, qreal& scaleY, qreal& shearX, qreal& shearY, - QMatrix& postTransform) const { + QTransform& postTransform) const { const auto parent = getFirstAncestor(); if(!parent) return; parent->applyTransformEffects(relFrame, @@ -561,7 +561,7 @@ void AdvancedTransformAnimator::setValues(const TransformValues &values) { setShear(values.fShearX, values.fShearY); } -QMatrix AdvancedTransformAnimator::getRotScaleShearTransform() { +QTransform AdvancedTransformAnimator::getRotScaleShearTransform() { qreal pivotX = mPivotAnimator->getEffectiveXValue(); qreal pivotY = mPivotAnimator->getEffectiveYValue(); @@ -577,7 +577,7 @@ QMatrix AdvancedTransformAnimator::getRotScaleShearTransform() { qreal shearY = mShearAnimator->getEffectiveYValue(); - QMatrix matrix = valuesToMatrix(pivotX, pivotY, + QTransform matrix = valuesToMatrix(pivotX, pivotY, posX, posY, rot, scaleX, scaleY, @@ -586,8 +586,8 @@ QMatrix AdvancedTransformAnimator::getRotScaleShearTransform() { return matrix; } -QMatrix AdvancedTransformAnimator::getRelativeTransformAtFrame( - const qreal relFrame, QMatrix* postTransform) const { +QTransform AdvancedTransformAnimator::getRelativeTransformAtFrame( + const qreal relFrame, QTransform* postTransform) const { qreal pivotX = mPivotAnimator->getEffectiveXValue(relFrame); qreal pivotY = mPivotAnimator->getEffectiveYValue(relFrame); @@ -602,7 +602,7 @@ QMatrix AdvancedTransformAnimator::getRelativeTransformAtFrame( qreal shearX = mShearAnimator->getEffectiveXValue(relFrame); qreal shearY = mShearAnimator->getEffectiveYValue(relFrame); - QMatrix postTransformT; + QTransform postTransformT; applyTransformEffects(relFrame, pivotX, pivotY, diff --git a/src/core/Animators/transformanimator.h b/src/core/Animators/transformanimator.h index ee662a615..c0359b35e 100644 --- a/src/core/Animators/transformanimator.h +++ b/src/core/Animators/transformanimator.h @@ -30,7 +30,7 @@ #include "../skia/skiaincludes.h" #include "transformvalues.h" -#include +#include class TransformUpdater; class BoxPathPoint; @@ -44,10 +44,10 @@ class CORE_EXPORT BasicTransformAnimator : public StaticComplexAnimator { BasicTransformAnimator(); public: virtual void reset(); - virtual QMatrix getRelativeTransformAtFrame( - const qreal relFrame, QMatrix* postTransform = nullptr) const; - virtual QMatrix getInheritedTransformAtFrame(const qreal relFrame) const; - virtual QMatrix getTotalTransformAtFrame(const qreal relFrame) const; + virtual QTransform getRelativeTransformAtFrame( + const qreal relFrame, QTransform* postTransform = nullptr) const; + virtual QTransform getInheritedTransformAtFrame(const qreal relFrame) const; + virtual QTransform getTotalTransformAtFrame(const qreal relFrame) const; FrameRange prp_getIdenticalRelRange(const int relFrame) const; @@ -96,9 +96,9 @@ class CORE_EXPORT BasicTransformAnimator : public StaticComplexAnimator { void updateRelativeTransform(const UpdateReason reason); void updateInheritedTransform(const UpdateReason reason); - const QMatrix &getInheritedTransform() const; - const QMatrix &getTotalTransform() const; - const QMatrix &getRelativeTransform() const; + const QTransform &getInheritedTransform() const; + const QTransform &getTotalTransform() const; + const QTransform &getRelativeTransform() const; void setParentTransformAnimator(BasicTransformAnimator *parent); @@ -112,10 +112,10 @@ class CORE_EXPORT BasicTransformAnimator : public StaticComplexAnimator { protected: QList> mChildBoxes; - QMatrix mRelTransform; - QMatrix mPostTransform; - QMatrix mInheritedTransform; - QMatrix mTotalTransform; + QTransform mRelTransform; + QTransform mPostTransform; + QTransform mInheritedTransform; + QTransform mTotalTransform; ConnContextQPtr mParentTransform; @@ -138,8 +138,8 @@ class CORE_EXPORT AdvancedTransformAnimator : public BasicTransformAnimator { AdvancedTransformAnimator(); public: void reset(); - QMatrix getRelativeTransformAtFrame( - const qreal relFrame, QMatrix* postTransform = nullptr) const; + QTransform getRelativeTransformAtFrame( + const qreal relFrame, QTransform* postTransform = nullptr) const; void applyTransformEffects(const qreal relFrame, qreal& pivotX, qreal& pivotY, @@ -147,11 +147,11 @@ class CORE_EXPORT AdvancedTransformAnimator : public BasicTransformAnimator { qreal& rot, qreal& scaleX, qreal& scaleY, qreal& shearX, qreal& shearY, - QMatrix& postTransform) const; + QTransform& postTransform) const; void setValues(const TransformValues& values); - QMatrix getRotScaleShearTransform(); + QTransform getRotScaleShearTransform(); void startRotScaleShearTransform(); void resetRotScaleShear(); diff --git a/src/core/Boxes/animationbox.cpp b/src/core/Boxes/animationbox.cpp index 478850b3f..93716cb63 100644 --- a/src/core/Boxes/animationbox.cpp +++ b/src/core/Boxes/animationbox.cpp @@ -304,7 +304,7 @@ void AnimationBox::setupCanvasMenu(PropertyMenu * const menu) //} void AnimationBox::setupRenderData(const qreal relFrame, - const QMatrix& parentM, + const QTransform& parentM, BoxRenderData * const data, Canvas* const scene) { BoundingBox::setupRenderData(relFrame, parentM, data, scene); diff --git a/src/core/Boxes/animationbox.h b/src/core/Boxes/animationbox.h index 4434fcd6f..cb1980503 100644 --- a/src/core/Boxes/animationbox.h +++ b/src/core/Boxes/animationbox.h @@ -49,7 +49,7 @@ class CORE_EXPORT AnimationBox : public BoundingBox { void setupCanvasMenu(PropertyMenu * const menu); void setupRenderData(const qreal relFrame, - const QMatrix& parentM, + const QTransform& parentM, BoxRenderData * const data, Canvas * const scene); stdsptr createRenderData(); diff --git a/src/core/Boxes/boundingbox.cpp b/src/core/Boxes/boundingbox.cpp index e02d28762..489d2227a 100644 --- a/src/core/Boxes/boundingbox.cpp +++ b/src/core/Boxes/boundingbox.cpp @@ -345,7 +345,7 @@ void BoundingBox::applyTransformEffects( qreal& rot, qreal& scaleX, qreal& scaleY, qreal& shearX, qreal& shearY, - QMatrix& postTransform) { + QTransform& postTransform) { mTransformEffectCollection->applyEffects(relFrame, pivotX, pivotY, posX, posY, @@ -585,7 +585,7 @@ stdsptr BoundingBox::queExternalRender( } stdsptr BoundingBox::queRender( - const qreal relFrame, const QMatrix& parentM) { + const qreal relFrame, const QTransform& parentM) { const auto renderData = updateCurrentRenderData(relFrame); if(!renderData) return nullptr; setupRenderData(relFrame, parentM, renderData, getParentScene()); @@ -739,11 +739,11 @@ void BoundingBox::drawBoundingRect(SkCanvas * const canvas, true, eSizesUI::widget*0.25f); } -QMatrix BoundingBox::getTotalTransform() const { +QTransform BoundingBox::getTotalTransform() const { return mTransformAnimator->getTotalTransform(); } -QMatrix BoundingBox::getRelativeTransformAtCurrentFrame() const { +QTransform BoundingBox::getRelativeTransformAtCurrentFrame() const { return getRelativeTransformAtFrame(anim_getCurrentRelFrame()); } @@ -836,15 +836,15 @@ void BoundingBox::setupCanvasMenu(PropertyMenu * const menu) menu->addPlainAction(QIcon::fromTheme("copy"), tr("Copy"), [pScene]() { pScene->copyAction(); - })->setShortcut(Qt::CTRL + Qt::Key_C); + })->setShortcut(QStringLiteral("Ctrl+C")); menu->addPlainAction(QIcon::fromTheme("cut"), tr("Cut"), [pScene]() { pScene->cutAction(); - })->setShortcut(Qt::CTRL + Qt::Key_X); + })->setShortcut(QStringLiteral("Ctrl+X")); menu->addPlainAction(QIcon::fromTheme("duplicate"), tr("Duplicate"), [pScene]() { pScene->duplicateAction(); - })->setShortcut(Qt::CTRL + Qt::Key_D); + })->setShortcut(QStringLiteral("Ctrl+D")); menu->addPlainAction(QIcon::fromTheme("trash"), tr("Delete"), [pScene]() { pScene->removeSelectedBoxesAndClearList(); @@ -854,7 +854,7 @@ void BoundingBox::setupCanvasMenu(PropertyMenu * const menu) menu->addPlainAction(QIcon::fromTheme("group"), tr("Group"), [pScene]() { pScene->groupSelectedBoxes(); - })->setShortcut(Qt::CTRL + Qt::Key_G); + })->setShortcut(QStringLiteral("Ctrl+G")); menu->addSeparator(); @@ -1078,7 +1078,7 @@ void BoundingBox::finishTransform() { } void BoundingBox::setupRenderData(const qreal relFrame, - const QMatrix& parentM, + const QTransform& parentM, BoxRenderData * const data, Canvas* const scene) { setupWithoutRasterEffects(relFrame, parentM, data, scene); @@ -1086,7 +1086,7 @@ void BoundingBox::setupRenderData(const qreal relFrame, } void BoundingBox::setupWithoutRasterEffects(const qreal relFrame, - const QMatrix& parentM, + const QTransform& parentM, BoxRenderData * const data, Canvas* const scene) { //Q_ASSERT(scene); @@ -1230,19 +1230,19 @@ void BoundingBox::addTransformEffect(const qsptr &transformEffe // } //} -QMatrix BoundingBox::getRelativeTransformAtFrame(const qreal relFrame) const { +QTransform BoundingBox::getRelativeTransformAtFrame(const qreal relFrame) const { if(isZero6Dec(relFrame - anim_getCurrentRelFrame())) return mTransformAnimator->getRelativeTransform(); return mTransformAnimator->getRelativeTransformAtFrame(relFrame); } -QMatrix BoundingBox::getInheritedTransformAtFrame(const qreal relFrame) const { +QTransform BoundingBox::getInheritedTransformAtFrame(const qreal relFrame) const { if(isZero6Dec(relFrame - anim_getCurrentRelFrame())) return mTransformAnimator->getInheritedTransform(); return mTransformAnimator->getInheritedTransformAtFrame(relFrame); } -QMatrix BoundingBox::getTotalTransformAtFrame(const qreal relFrame) const { +QTransform BoundingBox::getTotalTransformAtFrame(const qreal relFrame) const { if(isZero6Dec(relFrame - anim_getCurrentRelFrame())) return mTransformAnimator->getTotalTransform(); return mTransformAnimator->getTotalTransformAtFrame(relFrame); diff --git a/src/core/Boxes/boundingbox.h b/src/core/Boxes/boundingbox.h index 44263cd71..1677b523c 100644 --- a/src/core/Boxes/boundingbox.h +++ b/src/core/Boxes/boundingbox.h @@ -188,10 +188,10 @@ class CORE_EXPORT BoundingBox : public eBoxOrSound { virtual void updateAllBoxes(const UpdateReason reason); - virtual QMatrix getRelativeTransformAtCurrentFrame() const; - virtual QMatrix getRelativeTransformAtFrame(const qreal relFrame) const; - virtual QMatrix getInheritedTransformAtFrame(const qreal relFrame) const; - virtual QMatrix getTotalTransformAtFrame(const qreal relFrame) const; + virtual QTransform getRelativeTransformAtCurrentFrame() const; + virtual QTransform getRelativeTransformAtFrame(const qreal relFrame) const; + virtual QTransform getInheritedTransformAtFrame(const qreal relFrame) const; + virtual QTransform getTotalTransformAtFrame(const qreal relFrame) const; virtual QPointF mapAbsPosToRel(const QPointF &absPos); virtual void applyPaintSetting(const PaintSettingsApplier &setting); @@ -206,7 +206,7 @@ class CORE_EXPORT BoundingBox : public eBoxOrSound { virtual void setupCanvasMenu(PropertyMenu * const menu); - virtual void setupRenderData(const qreal relFrame, const QMatrix& parentM, + virtual void setupRenderData(const qreal relFrame, const QTransform& parentM, BoxRenderData * const data, Canvas * const scene); virtual void renderDataFinished(BoxRenderData *renderData); @@ -264,12 +264,12 @@ class CORE_EXPORT BoundingBox : public eBoxOrSound { stdsptr createRenderData(const qreal relFrame); stdsptr queRender(const qreal relFrame, - const QMatrix& parentM); + const QTransform& parentM); stdsptr queExternalRender( const qreal relFrame, const bool forceRasterize); void setupWithoutRasterEffects(const qreal relFrame, - const QMatrix& parentM, + const QTransform& parentM, BoxRenderData * const data, Canvas* const scene); void setupRasterEffects(const qreal relFrame, @@ -309,7 +309,7 @@ class CORE_EXPORT BoundingBox : public eBoxOrSound { const AlignRelativeTo relativeTo, const QPointF lastPivotAbsPos); - QMatrix getTotalTransform() const; + QTransform getTotalTransform() const; MovablePoint *getPointAtAbsPos(const QPointF &absPos, const CanvasMode mode, @@ -444,7 +444,7 @@ class CORE_EXPORT BoundingBox : public eBoxOrSound { qreal& rot, qreal& scaleX, qreal& scaleY, qreal& shearX, qreal& shearY, - QMatrix& postTransform); + QTransform& postTransform); bool hasTransformEffects() const; const QStringList checkTransformEffectsForSVGSupport(); diff --git a/src/core/Boxes/boxrendercontainer.cpp b/src/core/Boxes/boxrendercontainer.cpp index aa191a093..3e609d387 100644 --- a/src/core/Boxes/boxrendercontainer.cpp +++ b/src/core/Boxes/boxrendercontainer.cpp @@ -39,8 +39,8 @@ void RenderContainer::drawSk(SkCanvas * const canvas, } void RenderContainer::updatePaintTransformGivenNewTotalTransform( - const QMatrix &totalTransform) { - QMatrix paintTransform = mTransform.inverted()*totalTransform; + const QTransform &totalTransform) { + QTransform paintTransform = mTransform.inverted()*totalTransform; const qreal invRes = 1/mResolutionFraction; paintTransform.scale(invRes, invRes); mPaintTransform = toSkMatrix(paintTransform); @@ -57,7 +57,7 @@ void RenderContainer::setSrcRenderData(BoxRenderData * const data) { mImageSk = data->fRenderedImage; mGlobalRect = data->fGlobalRect; mAntiAlias = data->fAntiAlias; - QMatrix paintTransform; + QTransform paintTransform; paintTransform.scale(1/mResolutionFraction, 1/mResolutionFraction); mPaintTransform = toSkMatrix(paintTransform); mSrcRenderData = data->ref(); diff --git a/src/core/Boxes/boxrendercontainer.h b/src/core/Boxes/boxrendercontainer.h index 506f14d7f..c61d632d3 100644 --- a/src/core/Boxes/boxrendercontainer.h +++ b/src/core/Boxes/boxrendercontainer.h @@ -41,7 +41,7 @@ class CORE_EXPORT RenderContainer { const SkFilterQuality filter) const; void updatePaintTransformGivenNewTotalTransform( - const QMatrix &totalTransform); + const QTransform &totalTransform); void clear(); void setSrcRenderData(BoxRenderData * const data); @@ -62,7 +62,7 @@ class CORE_EXPORT RenderContainer { bool mAntiAlias = false; qreal mResolutionFraction; QRect mGlobalRect; - QMatrix mTransform; + QTransform mTransform; SkMatrix mPaintTransform; stdsptr mSrcRenderData; sk_sp mImageSk; diff --git a/src/core/Boxes/boxrenderdata.h b/src/core/Boxes/boxrenderdata.h index e42af3073..f600d1e48 100644 --- a/src/core/Boxes/boxrenderdata.h +++ b/src/core/Boxes/boxrenderdata.h @@ -30,7 +30,7 @@ #include #include "Tasks/updatable.h" #include "Animators/animator.h" -#include +#include class BoundingBox; class ShaderProgramCallerBase; #include "smartPointers/ememory.h" @@ -87,12 +87,12 @@ struct CORE_EXPORT BoxRenderData : public eTask { uint fBoxStateId = 0; - QMatrix fResolutionScale; - QMatrix fScaledTransform; - QMatrix fInheritedTransform; - QMatrix fRelTransform; - QMatrix fTotalTransform; - QMatrix fRenderTransform; + QTransform fResolutionScale; + QTransform fScaledTransform; + QTransform fInheritedTransform; + QTransform fRelTransform; + QTransform fTotalTransform; + QTransform fRenderTransform; bool fRelBoundingRectSet = false; QRectF fRelBoundingRect; diff --git a/src/core/Boxes/containerbox.cpp b/src/core/Boxes/containerbox.cpp index e5fbe400d..7640a927a 100644 --- a/src/core/Boxes/containerbox.cpp +++ b/src/core/Boxes/containerbox.cpp @@ -800,7 +800,7 @@ void ContainerBox::setupCanvasMenu(PropertyMenu * const menu) QAction* defaultUngroup; if (areAllChildrenStatic()) { defaultUngroup = ungroupKeepAction; } else { defaultUngroup = ungroupAbandonAction; } - defaultUngroup->setShortcut(Qt::CTRL + Qt::SHIFT + Qt::Key_G); + defaultUngroup->setShortcut(QKeySequence(QStringLiteral("Ctrl+Shift+G"))); menu->addSeparator(); } @@ -977,7 +977,7 @@ void ContainerBox::updateIfUsesProgram( void processChildData(BoundingBox * const child, ContainerBoxRenderData * const parentData, const qreal childRelFrame, - const QMatrix& thisM, + const QTransform& thisM, const qreal absFrame, QList& delayed) { if(!child->isFrameFVisibleAndInDurationRect(childRelFrame)) return; @@ -1015,7 +1015,7 @@ void processChildData(BoundingBox * const child, } void ContainerBox::processChildrenData(const qreal relFrame, - const QMatrix& thisM, + const QTransform& thisM, BoxRenderData * const data, Canvas* const scene) { Q_UNUSED(scene); @@ -1069,7 +1069,7 @@ stdsptr ContainerBox::createRenderData() { } void ContainerBox::setupRenderData(const qreal relFrame, - const QMatrix& parentM, + const QTransform& parentM, BoxRenderData * const data, Canvas* const scene) { BoundingBox::setupRenderData(relFrame, parentM, data, scene); diff --git a/src/core/Boxes/containerbox.h b/src/core/Boxes/containerbox.h index 7f3dec01a..b879e1e47 100644 --- a/src/core/Boxes/containerbox.h +++ b/src/core/Boxes/containerbox.h @@ -68,11 +68,11 @@ class CORE_EXPORT ContainerBox : public BoxWithPathEffects { qsptr createLink(const bool inner); stdsptr createRenderData(); void setupRenderData(const qreal relFrame, - const QMatrix& parentM, + const QTransform& parentM, BoxRenderData * const data, Canvas * const scene); void processChildrenData(const qreal relFrame, - const QMatrix& thisM, + const QTransform& thisM, BoxRenderData* const data, Canvas* const scene); diff --git a/src/core/Boxes/imagebox.cpp b/src/core/Boxes/imagebox.cpp index 5ebf5d39c..8f02c9ce9 100644 --- a/src/core/Boxes/imagebox.cpp +++ b/src/core/Boxes/imagebox.cpp @@ -132,7 +132,7 @@ void ImageBox::changeSourceFile() { if(!importPath.isEmpty()) setFilePath(importPath); } -void ImageBox::setupRenderData(const qreal relFrame, const QMatrix& parentM, +void ImageBox::setupRenderData(const qreal relFrame, const QTransform& parentM, BoxRenderData * const data, Canvas* const scene) { diff --git a/src/core/Boxes/imagebox.h b/src/core/Boxes/imagebox.h index 270c12a15..0ccefa549 100644 --- a/src/core/Boxes/imagebox.h +++ b/src/core/Boxes/imagebox.h @@ -53,7 +53,7 @@ class CORE_EXPORT ImageBox : public BoundingBox { public: void setupCanvasMenu(PropertyMenu * const menu); - void setupRenderData(const qreal relFrame, const QMatrix& parentM, + void setupRenderData(const qreal relFrame, const QTransform& parentM, BoxRenderData * const data, Canvas * const scene); stdsptr createRenderData(); diff --git a/src/core/Boxes/internallinkbox.cpp b/src/core/Boxes/internallinkbox.cpp index 6399c6ced..9bd33c4be 100644 --- a/src/core/Boxes/internallinkbox.cpp +++ b/src/core/Boxes/internallinkbox.cpp @@ -55,7 +55,7 @@ void InternalLinkBox::setLinkTarget(BoundingBox * const linkTarget) { } void InternalLinkBox::setupRenderData(const qreal relFrame, - const QMatrix& parentM, + const QTransform& parentM, BoxRenderData * const data, Canvas* const scene) { const auto linkTarget = getLinkTarget(); diff --git a/src/core/Boxes/internallinkbox.h b/src/core/Boxes/internallinkbox.h index d9d72e296..91a1781d2 100644 --- a/src/core/Boxes/internallinkbox.h +++ b/src/core/Boxes/internallinkbox.h @@ -38,7 +38,7 @@ class CORE_EXPORT InternalLinkBox : public InternalLinkBoxBase { InternalLinkBox(BoundingBox * const linkTarget, const bool innerLink); public: - void setupRenderData(const qreal relFrame, const QMatrix& parentM, + void setupRenderData(const qreal relFrame, const QTransform& parentM, BoxRenderData * const data, Canvas * const scene); diff --git a/src/core/Boxes/internallinkboxbase.h b/src/core/Boxes/internallinkboxbase.h index b4d2b59d5..4bfa87feb 100644 --- a/src/core/Boxes/internallinkboxbase.h +++ b/src/core/Boxes/internallinkboxbase.h @@ -56,9 +56,9 @@ class InternalLinkBoxBase : public BoxT { SkBlendMode getBlendMode() const override; - QMatrix getRelativeTransformAtFrame(const qreal relFrame) const override; - QMatrix getInheritedTransformAtFrame(const qreal relFrame) const override; - QMatrix getTotalTransformAtFrame(const qreal relFrame) const override; + QTransform getRelativeTransformAtFrame(const qreal relFrame) const override; + QTransform getInheritedTransformAtFrame(const qreal relFrame) const override; + QTransform getTotalTransformAtFrame(const qreal relFrame) const override; bool isFrameInDurationRect(const int relFrame) const override; bool isFrameFInDurationRect(const qreal relFrame) const override; @@ -171,10 +171,10 @@ bool ILBB::isFrameFInDurationRect(const qreal relFrame) const { } template -QMatrix ILBB::getRelativeTransformAtFrame(const qreal relFrame) const { +QTransform ILBB::getRelativeTransformAtFrame(const qreal relFrame) const { if(mInnerLink) { const auto linkTarget = getLinkTarget(); - if(!linkTarget) return QMatrix(); + if(!linkTarget) return QTransform(); return linkTarget->getRelativeTransformAtFrame(relFrame); } else { return BoundingBox::getRelativeTransformAtFrame(relFrame); @@ -182,10 +182,10 @@ QMatrix ILBB::getRelativeTransformAtFrame(const qreal relFrame) const { } template -QMatrix ILBB::getInheritedTransformAtFrame(const qreal relFrame) const { +QTransform ILBB::getInheritedTransformAtFrame(const qreal relFrame) const { if(mInnerLink) { const auto parentGroup = this->getParentGroup(); - if(!parentGroup) return QMatrix(); + if(!parentGroup) return QTransform(); return parentGroup->getTotalTransformAtFrame(relFrame); } else { return BoundingBox::getInheritedTransformAtFrame(relFrame); @@ -193,11 +193,11 @@ QMatrix ILBB::getInheritedTransformAtFrame(const qreal relFrame) const { } template -QMatrix ILBB::getTotalTransformAtFrame(const qreal relFrame) const { +QTransform ILBB::getTotalTransformAtFrame(const qreal relFrame) const { if(mInnerLink) { const auto parentGroup = this->getParentGroup(); const auto linkTarget = getLinkTarget(); - if(!linkTarget || !parentGroup) return QMatrix(); + if(!linkTarget || !parentGroup) return QTransform(); return linkTarget->getRelativeTransformAtFrame(relFrame)* parentGroup->getTotalTransformAtFrame(relFrame); } else { diff --git a/src/core/Boxes/internallinkcanvas.cpp b/src/core/Boxes/internallinkcanvas.cpp index aed8753a2..b75ccc8f2 100644 --- a/src/core/Boxes/internallinkcanvas.cpp +++ b/src/core/Boxes/internallinkcanvas.cpp @@ -64,7 +64,7 @@ void InternalLinkCanvas::prp_setupTreeViewMenu(PropertyMenu * const menu) { } void InternalLinkCanvas::setupRenderData(const qreal relFrame, - const QMatrix& parentM, + const QTransform& parentM, BoxRenderData * const data, Canvas* const scene) { if (!scene) { return; } diff --git a/src/core/Boxes/internallinkcanvas.h b/src/core/Boxes/internallinkcanvas.h index 285744b9c..974d5e39f 100644 --- a/src/core/Boxes/internallinkcanvas.h +++ b/src/core/Boxes/internallinkcanvas.h @@ -35,7 +35,7 @@ class CORE_EXPORT InternalLinkCanvas : public InternalLinkGroupBox { InternalLinkCanvas(ContainerBox * const linkTarget, const bool innerLink); public: - void setupRenderData(const qreal relFrame, const QMatrix& parentM, + void setupRenderData(const qreal relFrame, const QTransform& parentM, BoxRenderData * const data, Canvas * const scene); diff --git a/src/core/Boxes/internallinkgroupbox.cpp b/src/core/Boxes/internallinkgroupbox.cpp index afa4d211e..d392c152f 100644 --- a/src/core/Boxes/internallinkgroupbox.cpp +++ b/src/core/Boxes/internallinkgroupbox.cpp @@ -44,7 +44,7 @@ InternalLinkGroupBox::InternalLinkGroupBox(ContainerBox * const linkTarget, } void InternalLinkGroupBox::setupRenderData(const qreal relFrame, - const QMatrix& parentM, + const QTransform& parentM, BoxRenderData * const data, Canvas* const scene) { const auto linkTarget = getLinkTarget(); diff --git a/src/core/Boxes/internallinkgroupbox.h b/src/core/Boxes/internallinkgroupbox.h index 5840ac95d..4920bdc71 100644 --- a/src/core/Boxes/internallinkgroupbox.h +++ b/src/core/Boxes/internallinkgroupbox.h @@ -52,7 +52,7 @@ class CORE_EXPORT InternalLinkGroupBox : public InternalLinkBoxBase createRenderData() { diff --git a/src/core/Boxes/textbox.cpp b/src/core/Boxes/textbox.cpp index d06a22e45..cc39ae609 100644 --- a/src/core/Boxes/textbox.cpp +++ b/src/core/Boxes/textbox.cpp @@ -77,7 +77,6 @@ TextBox::TextBox() } #include -#include void TextBox::openTextEditor(QWidget* dialogParent) { /*bool ok; @@ -212,7 +211,7 @@ stdsptr TextBox::createRenderData() { } else return PathBox::createRenderData(); } -void TextBox::setupRenderData(const qreal relFrame, const QMatrix& parentM, +void TextBox::setupRenderData(const qreal relFrame, const QTransform& parentM, BoxRenderData * const data, Canvas * const scene) { if(!mTextEffects->hasEffects()) { @@ -297,7 +296,7 @@ SkPath TextBox::getRelativePath(const qreal relFrame) const { const qreal lineInc = static_cast(mFont.getSpacing())*lineSpacing; - const QStringList lines = textAtFrame.split(QRegExp("\n|\r\n|\r")); + const QStringList lines = textAtFrame.split(QRegularExpression("\n|\r\n|\r")); qreal maxWidth = 0; QList lineWidths; for(const auto& line : lines) { diff --git a/src/core/Boxes/textbox.h b/src/core/Boxes/textbox.h index ebc3b8851..f8e47d58f 100644 --- a/src/core/Boxes/textbox.h +++ b/src/core/Boxes/textbox.h @@ -60,7 +60,7 @@ class CORE_EXPORT TextBox : public PathBox { const SkFontStyle& style); stdsptr createRenderData(); - void setupRenderData(const qreal relFrame, const QMatrix& parentM, + void setupRenderData(const qreal relFrame, const QTransform& parentM, BoxRenderData * const data, Canvas * const scene); diff --git a/src/core/Boxes/textboxrenderdata.cpp b/src/core/Boxes/textboxrenderdata.cpp index 4ead7f8bf..a4eea2c33 100644 --- a/src/core/Boxes/textboxrenderdata.cpp +++ b/src/core/Boxes/textboxrenderdata.cpp @@ -121,7 +121,7 @@ void LetterRenderData::initialize(const qreal relFrame, } -void LetterRenderData::applyTransform(const QMatrix &transform) { +void LetterRenderData::applyTransform(const QTransform &transform) { fRelTransform = transform*fRelTransform; fTotalTransform = fRelTransform*fInheritedTransform; fLetterPos = transform.map(fLetterPos); @@ -161,7 +161,7 @@ void WordRenderData::initialize(const qreal relFrame, } } -void WordRenderData::applyTransform(const QMatrix &transform) { +void WordRenderData::applyTransform(const QTransform &transform) { fRelTransform = transform*fRelTransform; fTotalTransform = fRelTransform*fInheritedTransform; fWordPos = transform.map(fWordPos); @@ -227,7 +227,7 @@ void LineRenderData::initialize(const qreal relFrame, if(i0 < line.length()) wordFinished(i0, line.length() - 1); } -void LineRenderData::applyTransform(const QMatrix &transform) { +void LineRenderData::applyTransform(const QTransform &transform) { fRelTransform = transform*fRelTransform; fTotalTransform = fRelTransform*fInheritedTransform; fLinePos = transform.map(fLinePos); @@ -257,7 +257,7 @@ void TextBoxRenderData::initialize(const QString &text, const Qt::Alignment vAlignment, TextBox * const parent, Canvas* const scene) { - const QStringList lines = text.split(QRegExp("\n|\r\n|\r")); + const QStringList lines = text.split(QRegularExpression("\n|\r\n|\r")); qreal maxWidth = 0; diff --git a/src/core/Boxes/textboxrenderdata.h b/src/core/Boxes/textboxrenderdata.h index a7755c96a..981b130fd 100644 --- a/src/core/Boxes/textboxrenderdata.h +++ b/src/core/Boxes/textboxrenderdata.h @@ -55,7 +55,7 @@ class CORE_EXPORT LetterRenderData : public PathBoxRenderData { TextBox * const parent, Canvas * const scene); - void applyTransform(const QMatrix& transform); + void applyTransform(const QTransform& transform); QRectF fBoundingRect; QPointF fLetterPos; @@ -79,7 +79,7 @@ class CORE_EXPORT WordRenderData : public ContainerBoxRenderData { TextBox * const parent, Canvas * const scene); - void applyTransform(const QMatrix &transform); + void applyTransform(const QTransform &transform); void queAllLetters(); QRectF fBoundingRect; @@ -101,7 +101,7 @@ class CORE_EXPORT LineRenderData : public ContainerBoxRenderData { TextBox * const parent, Canvas * const scene); - void applyTransform(const QMatrix &transform); + void applyTransform(const QTransform &transform); void queAllWords(); QPointF fLinePos; diff --git a/src/core/Expressions/propertybindingparser.cpp b/src/core/Expressions/propertybindingparser.cpp index 085000dfb..2e5c96dd8 100644 --- a/src/core/Expressions/propertybindingparser.cpp +++ b/src/core/Expressions/propertybindingparser.cpp @@ -32,13 +32,13 @@ #include "appsupport.h" void skipSpaces(const QString& exp, int& position) { - while(position < exp.count() && exp.at(position) == ' ') { + while(position < exp.size() && exp.at(position) == ' ') { position++; } } bool parseBindingAssignment(const QString& exp, int& pos) { - if(pos < exp.count()) { + if(pos < exp.size()) { const auto& character = exp.at(pos); if(character == '=') { pos++; @@ -51,7 +51,7 @@ bool parseBindingAssignment(const QString& exp, int& pos) { bool parseBindingName(const QString& exp, int& pos, QString& name) { int newPos = pos; name.clear(); - while(newPos < exp.count()) { + while(newPos < exp.size()) { const auto& character = exp.at(newPos); if(!character.isLetter() && !character.isDigit() && character != '_') break; @@ -64,7 +64,7 @@ bool parseBindingName(const QString& exp, int& pos, QString& name) { } bool checkComment(const QString& exp, int& pos) { - if(pos + 1 < exp.count()) { + if(pos + 1 < exp.size()) { int newPos = pos; if(exp.at(newPos++) == '/' && exp.at(newPos++) == '/') { pos = newPos; @@ -76,7 +76,7 @@ bool checkComment(const QString& exp, int& pos) { QString parse(const QString& exp, int& pos, const int n) { QString result; - for(int i = 0; i < n && pos < exp.count(); i++) { + for(int i = 0; i < n && pos < exp.size(); i++) { result.append(exp.at(pos++)); } return result; @@ -84,7 +84,7 @@ QString parse(const QString& exp, int& pos, const int n) { bool parse(const QString& exp, int& pos, const QString& test) { int newPos = pos; - const auto value = parse(exp, newPos, test.count()); + const auto value = parse(exp, newPos, test.size()); if(value == test) { pos = newPos; return true; @@ -92,7 +92,7 @@ bool parse(const QString& exp, int& pos, const QString& test) { } int remaining(const QString& exp, int& pos) { - return exp.count() - pos; + return exp.size() - pos; } bool parseValue(const QString& exp, int& pos) { @@ -124,7 +124,7 @@ bool parseSceneRangeMin(const QString& exp, int& pos) { } void parseBinding(const QString& exp, int& pos, QString& binding) { - while(pos < exp.count()) { + while(pos < exp.size()) { const auto& c = exp.at(pos++); if(!c.isLetterOrNumber() && c != ' ' && c != '.' && c != '_') break; binding.append(c); @@ -182,7 +182,7 @@ PropertyBindingMap PropertyBindingParser::parseBindings( QString exp, const PropertyBinding::Validator& validator, const Property* const context) { - const auto lines = exp.split(QRegExp("\n|\r\n|\r|;"), + const auto lines = exp.split(QRegularExpression("\n|\r\n|\r|;"), Qt::SkipEmptyParts); PropertyBindingMap result; for(const auto& line : lines) { diff --git a/src/core/FileCacheHandlers/filecachehandler.cpp b/src/core/FileCacheHandlers/filecachehandler.cpp index 74042b322..30f3b86db 100644 --- a/src/core/FileCacheHandlers/filecachehandler.cpp +++ b/src/core/FileCacheHandlers/filecachehandler.cpp @@ -40,9 +40,9 @@ void FileCacheHandler::reloadAction() { bool FileCacheHandler::deleteAction() { if(mReferenceCount) { const int buttonId = QMessageBox::question( - nullptr, "Delete", QString("Are you sure you want to delete " + nullptr, tr("Delete"), tr("Are you sure you want to delete " "%1 object(s) referencing \"%2\"?").arg(mReferenceCount).arg(mPath), - "Cancel", "Delete"); + QMessageBox::Cancel | QMessageBox::Yes); if(buttonId == 0) return false; } const auto selfRef = ref(); @@ -63,5 +63,5 @@ void FileCacheHandler::setMissing(const bool missing) { } void FileCacheHandler::updateFileMissing() { - mFileMissing = !QFileInfo(mPath).exists(); + mFileMissing = !QFileInfo::exists(mPath); } diff --git a/src/core/GUI/boxeslistactionbutton.cpp b/src/core/GUI/boxeslistactionbutton.cpp index 79ee4dbac..b242b2981 100644 --- a/src/core/GUI/boxeslistactionbutton.cpp +++ b/src/core/GUI/boxeslistactionbutton.cpp @@ -42,7 +42,7 @@ void BoxesListActionButton::mousePressEvent(QMouseEvent *) emit pressed(); } -void BoxesListActionButton::enterEvent(QEvent *) +void BoxesListActionButton::enterEvent(QtEnterEvent *) { mHover = true; update(); diff --git a/src/core/GUI/boxeslistactionbutton.h b/src/core/GUI/boxeslistactionbutton.h index 5c7c1bf12..97e384714 100644 --- a/src/core/GUI/boxeslistactionbutton.h +++ b/src/core/GUI/boxeslistactionbutton.h @@ -28,6 +28,7 @@ #include "../core_global.h" #include "GUI/global.h" +#include "../ui/enterevent.h" #include @@ -41,7 +42,7 @@ class CORE_EXPORT BoxesListActionButton : public QWidget BoxesListActionButton(QWidget * const parent = nullptr); protected: void mousePressEvent(QMouseEvent *); - void enterEvent(QEvent *); + void enterEvent(QtEnterEvent *); void leaveEvent(QEvent *); bool mHover = false; diff --git a/src/core/GUI/valueinput.cpp b/src/core/GUI/valueinput.cpp index e6255a499..38be0169a 100644 --- a/src/core/GUI/valueinput.cpp +++ b/src/core/GUI/valueinput.cpp @@ -27,7 +27,8 @@ #include #include -#include +#include +#include #include "skia/skiaincludes.h" #include "skia/skqtconversions.h" @@ -35,17 +36,21 @@ #include ValueInput::ValueInput() { - const int dpi = QApplication::desktop()->logicalDpiX(); + QScreen *screen = QGuiApplication::primaryScreen(); + qreal dpi = screen ? screen->logicalDotsPerInchX() : 96.0; + qreal dpr = screen ? screen->devicePixelRatio() : 1.0; mFont = toSkFont(QApplication::font(), - dpi * qApp->desktop()->devicePixelRatioF(), + dpi * dpr, 72); } void ValueInput::draw(SkCanvas *canvas, const int y) { SkPaint paint; - const qreal pixelRatio = qApp->desktop()->devicePixelRatioF(); + QScreen *screen = QGuiApplication::primaryScreen(); + const qreal pixelRatio = screen ? screen->devicePixelRatio() : 1.0; const auto transStr = getText(); - const int textWidth = QApplication::fontMetrics().horizontalAdvance(transStr)*pixelRatio; + QFontMetricsF fmf(QApplication::font()); + const int textWidth = static_cast(fmf.horizontalAdvance(transStr) * pixelRatio); const SkRect inputRect = SkRect::MakeXYWH(2*eSizesUI::widget*pixelRatio, y*pixelRatio, textWidth + eSizesUI::widget*pixelRatio, @@ -67,7 +72,8 @@ void ValueInput::draw(SkCanvas *canvas, const int y) { void ValueInput::draw(QPainter *p, const int y) { p->setFont(QApplication::font()); const auto transStr = getText(); - const int textWidth = QApplication::fontMetrics().horizontalAdvance(transStr); + QFontMetricsF fmf(QApplication::font()); + const int textWidth = static_cast(fmf.horizontalAdvance(transStr)); const QRect inputRect(2*eSizesUI::widget, y, textWidth + eSizesUI::widget, eSizesUI::widget); p->fillRect(inputRect, QColor(255, 255, 255, 55)); diff --git a/src/core/MovablePoints/movablepoint.cpp b/src/core/MovablePoints/movablepoint.cpp index 830797481..23b2da023 100644 --- a/src/core/MovablePoints/movablepoint.cpp +++ b/src/core/MovablePoints/movablepoint.cpp @@ -165,7 +165,7 @@ bool MovablePoint::isContainedInRect(const QRectF &absRect) { } void MovablePoint::rotateRelativeToSavedPivot(const qreal rot) { - QMatrix mat; + QTransform mat; mat.translate(mPivot.x(), mPivot.y()); mat.rotate(rot); mat.translate(-mPivot.x(), -mPivot.y()); @@ -175,7 +175,7 @@ void MovablePoint::rotateRelativeToSavedPivot(const qreal rot) { void MovablePoint::scaleRelativeToSavedPivot(const qreal sx, const qreal sy) { - QMatrix mat; + QTransform mat; mat.translate(mPivot.x(), mPivot.y()); mat.scale(sx, sy); mat.translate(-mPivot.x(), -mPivot.y()); @@ -185,7 +185,7 @@ void MovablePoint::scaleRelativeToSavedPivot(const qreal sx, void MovablePoint::shearRelativeToSavedPivot(const qreal shearX, const qreal shearY) { - QMatrix mat; + QTransform mat; mat.translate(mPivot.x(), mPivot.y()); mat.shear(shearX, shearY); mat.translate(-mPivot.x(), -mPivot.y()); @@ -198,7 +198,7 @@ void MovablePoint::saveTransformPivotAbsPos(const QPointF &absPivot) { } void MovablePoint::rotateBy(const qreal rot) { - QMatrix rotMatrix; + QTransform rotMatrix; rotMatrix.translate(-mPivot.x(), -mPivot.y()); rotMatrix.rotate(rot); rotMatrix.translate(mPivot.x(), mPivot.y()); @@ -207,7 +207,7 @@ void MovablePoint::rotateBy(const qreal rot) { void MovablePoint::scale(const qreal scaleXBy, const qreal scaleYBy) { - QMatrix scaleMatrix; + QTransform scaleMatrix; scaleMatrix.translate(-mPivot.x(), -mPivot.y()); scaleMatrix.scale(scaleXBy, scaleYBy); scaleMatrix.translate(mPivot.x(), mPivot.y()); diff --git a/src/core/MovablePoints/movablepoint.h b/src/core/MovablePoints/movablepoint.h index b9ce6611a..3c157813d 100644 --- a/src/core/MovablePoints/movablepoint.h +++ b/src/core/MovablePoints/movablepoint.h @@ -148,7 +148,7 @@ class CORE_EXPORT MovablePoint : public StdSelfRef { void rotateBy(const qreal rot); void scale(const qreal scaleBy); - void applyTransform(const QMatrix &transform) { + void applyTransform(const QTransform &transform) { setRelativePos(transform.map(getRelativePos())); } void setRadius(const qreal radius); diff --git a/src/core/MovablePoints/smartctrlpoint.cpp b/src/core/MovablePoints/smartctrlpoint.cpp index 1a79fb3e5..be448a74b 100644 --- a/src/core/MovablePoints/smartctrlpoint.cpp +++ b/src/core/MovablePoints/smartctrlpoint.cpp @@ -61,14 +61,14 @@ void SmartCtrlPoint::setRelativePos(const QPointF &relPos) { void SmartCtrlPoint::rotateRelativeToSavedPivot(const qreal rotate) { const QPointF savedValue = getSavedRelPos() - mParentPoint_k->getSavedRelPos(); - QMatrix mat; + QTransform mat; mat.rotate(rotate); setRelativePos(mat.map(savedValue) + mParentPoint_k->getRelativePos()); } void SmartCtrlPoint::scale(const qreal sx, const qreal sy) { const QPointF savedValue = getSavedRelPos() - mParentPoint_k->getSavedRelPos(); - QMatrix mat; + QTransform mat; mat.scale(sx, sy); setRelativePos(mat.map(savedValue) + mParentPoint_k->getRelativePos()); } diff --git a/src/core/Private/esettings.cpp b/src/core/Private/esettings.cpp index a35dbfb76..1c1208bf2 100644 --- a/src/core/Private/esettings.cpp +++ b/src/core/Private/esettings.cpp @@ -128,22 +128,25 @@ struct eColorSetting : public eSettingBase const QString oneVal = QStringLiteral("\\s*(\\d+)\\s*"); const QString oneValC = QStringLiteral("\\s*(\\d+)\\s*,"); - QRegExp rx("rgba\\(" - "\\s*(\\d+)\\s*," - "\\s*(\\d+)\\s*," - "\\s*(\\d+)\\s*," - "\\s*(\\d+)\\s*" - "\\)", - Qt::CaseInsensitive); - if(rx.exactMatch(valueStr)) { - rx.indexIn(valueStr); - const QStringList intRGBA = rx.capturedTexts(); + QRegularExpression rx("^rgba\\(" + "\\s*(\\d+)\\s*," + "\\s*(\\d+)\\s*," + "\\s*(\\d+)\\s*," + "\\s*(\\d+)\\s*" + "\\)$", + QRegularExpression::CaseInsensitiveOption); + + QRegularExpressionMatch match = rx.match(valueStr); + if (match.hasMatch()) { + const QStringList intRGBA = match.capturedTexts(); fValue.setRgb(intRGBA.at(1).toInt(), intRGBA.at(2).toInt(), intRGBA.at(3).toInt(), intRGBA.at(4).toInt()); return true; - } else return false; + } else { + return false; + } } void writeValue() const { diff --git a/src/core/Properties/property.cpp b/src/core/Properties/property.cpp index 437a2de69..00bf3ee0b 100644 --- a/src/core/Properties/property.cpp +++ b/src/core/Properties/property.cpp @@ -178,16 +178,16 @@ BasicTransformAnimator *Property::getTransformAnimator() const { return nullptr; } -QMatrix Property::getTransform() const { +QTransform Property::getTransform() const { const auto trans = getTransformAnimator(); if(trans) return trans->getTotalTransform(); - return QMatrix(); + return QTransform(); } -QMatrix Property::getTransform(const qreal relFrame) const { +QTransform Property::getTransform(const qreal relFrame) const { const auto trans = getTransformAnimator(); if(trans) return trans->getTotalTransformAtFrame(relFrame); - return QMatrix(); + return QTransform(); } void Property::prp_setSelected(const bool selected) { @@ -282,7 +282,7 @@ void Property::prp_getFullPath(QStringList& names) const { QString Property::prp_sFixName(const QString &name) { QString result = name.trimmed(); - result.remove(QRegExp("[^A-Za-z0-9 _]")); + result.remove(QRegularExpression("[^A-Za-z0-9 _]")); while(!result.isEmpty() && (result.front() == ' ' || result.front().isDigit())) { @@ -306,8 +306,8 @@ bool Property::prp_sValidateName(const QString &name, *error = "Name cannot end with a space"; return false; } - const int nValid = name.count(QRegExp("[A-Za-z0-9_ ]")); - if(nValid != name.count()) { + const int nValid = name.count(QRegularExpression("[A-Za-z0-9_ ]")); + if(nValid != name.size()) { *error = "Invalid characters used"; return false; } diff --git a/src/core/Properties/property.h b/src/core/Properties/property.h index 7edbd5c8e..ce91cd1a2 100644 --- a/src/core/Properties/property.h +++ b/src/core/Properties/property.h @@ -170,8 +170,8 @@ class CORE_EXPORT Property : public SingleWidgetTarget { QDomElement prp_writeNamedPropertyXEV( const QString& name, const XevExporter& exp) const; - QMatrix getTransform() const; - QMatrix getTransform(const qreal relFrame) const; + QTransform getTransform() const; + QTransform getTransform(const qreal relFrame) const; void prp_setSelected(const bool selected); void prp_afterWholeInfluenceRangeChanged(); diff --git a/src/core/ReadWrite/ereadstream.cpp b/src/core/ReadWrite/ereadstream.cpp index 186a655eb..4badaeed9 100644 --- a/src/core/ReadWrite/ereadstream.cpp +++ b/src/core/ReadWrite/ereadstream.cpp @@ -131,13 +131,54 @@ eReadStream &eReadStream::operator>>(QRectF &val) { return *this; } -eReadStream &eReadStream::operator>>(QMatrix &val) { - read(&val, sizeof(QMatrix)); +eReadStream &eReadStream::operator>>(QTransform &val) +{ + // Get QMatrix (48 bytes) + qreal m[6]; + read(m, sizeof(m)); + + // QMatrix => QTransform (m31=dx, m32=dy, m33=1.0) + val.setMatrix(m[0], m[1], 0.0, + m[2], m[3], 0.0, + m[4], m[5], 1.0); + return *this; } -eReadStream &eReadStream::operator>>(QColor &val) { +eReadStream &eReadStream::operator>>(QColor &val) +{ +#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0)) read(&val, sizeof(QColor)); +#else + struct Qt5QColorLayout { + int32_t spec; + uint16_t alpha; + uint16_t red; + uint16_t green; + uint16_t blue; + uint16_t pad; + uint16_t pad2; + }; + + Qt5QColorLayout oldColor; + read(&oldColor, sizeof(Qt5QColorLayout)); // 16 bytes + + int a = oldColor.alpha >> 8; + int r = oldColor.red >> 8; + int g = oldColor.green >> 8; + int b = oldColor.blue >> 8; + + if (oldColor.spec == 2) { // HSV + val = QColor::fromHsv(r, g, b, a); + } else if (oldColor.spec == 4) { // HSL + val = QColor::fromHsl(r, g, b, a); + } else if (oldColor.spec == 1) { // RGB + val = QColor::fromRgb(r, g, b, a); + } else { + val = QColor(); + } +#endif + return *this; } @@ -145,8 +186,8 @@ eReadStream &eReadStream::operator>>(QString &val) { uint nChars; read(&nChars, sizeof(uint)); if(nChars == 0) val = ""; else { - ushort * const chars = new ushort[nChars]; - read(chars, nChars*sizeof(ushort)); + char16_t * const chars = new char16_t[nChars]; + read(chars, nChars*sizeof(char16_t)); val = QString::fromUtf16(chars, static_cast(nChars)); delete[] chars; } diff --git a/src/core/ReadWrite/ereadstream.h b/src/core/ReadWrite/ereadstream.h index 8aaf8f40d..6b9def67e 100644 --- a/src/core/ReadWrite/ereadstream.h +++ b/src/core/ReadWrite/ereadstream.h @@ -72,7 +72,7 @@ class CORE_EXPORT eReadStream { eReadStream& operator>>(qreal &val); eReadStream& operator>>(QPointF &val); eReadStream& operator>>(QRectF &val); - eReadStream& operator>>(QMatrix &val); + eReadStream& operator>>(QTransform &val); eReadStream& operator>>(QColor& val); eReadStream& operator>>(QString &val); eReadStream& operator>>(QByteArray &val); diff --git a/src/core/ReadWrite/ewritestream.cpp b/src/core/ReadWrite/ewritestream.cpp index 33056a9fb..e3ccb412a 100644 --- a/src/core/ReadWrite/ewritestream.cpp +++ b/src/core/ReadWrite/ewritestream.cpp @@ -98,6 +98,22 @@ eWriteStream &eWriteStream::operator<<(const uint64_t val) { return *this; } +#if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)) +eWriteStream &eWriteStream::operator<<(const int64_t val) +{ + int32_t safeVal = static_cast(val); + write(&safeVal, sizeof(int32_t)); + return *this; +} + +eWriteStream &eWriteStream::operator<<(const long long val) +{ + int32_t safeVal = static_cast(val); + write(&safeVal, sizeof(int32_t)); + return *this; +} +#endif + eWriteStream &eWriteStream::operator<<(const iValueRange val) { write(&val, sizeof(iValueRange)); return *this; @@ -118,13 +134,46 @@ eWriteStream &eWriteStream::operator<<(const QRectF &val) { return *this; } -eWriteStream &eWriteStream::operator<<(const QMatrix &val) { - write(&val, sizeof(QMatrix)); +eWriteStream &eWriteStream::operator<<(const QTransform &val) +{ + // QMatrix (48 bytes) + qreal matrix2d[6] = { + val.m11(), val.m12(), + val.m21(), val.m22(), + val.dx(), val.dy() + }; + + write(matrix2d, sizeof(matrix2d)); return *this; } -eWriteStream &eWriteStream::operator<<(const QColor &val) { +eWriteStream &eWriteStream::operator<<(const QColor &val) +{ +#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0)) write(&val, sizeof(QColor)); +#else + struct Qt5QColorLayout { + int32_t spec; + uint16_t alpha; + uint16_t red; + uint16_t green; + uint16_t blue; + uint16_t pad; + uint16_t pad2; // 16-bytes + }; + + Qt5QColorLayout oldColor; + oldColor.spec = static_cast(val.spec()); + oldColor.alpha = (val.alpha() << 8) | val.alpha(); + oldColor.red = (val.red() << 8) | val.red(); + oldColor.green = (val.green() << 8) | val.green(); + oldColor.blue = (val.blue() << 8) | val.blue(); + oldColor.pad = 0; + oldColor.pad2 = 0; + + write(&oldColor, sizeof(Qt5QColorLayout)); +#endif + return *this; } diff --git a/src/core/ReadWrite/ewritestream.h b/src/core/ReadWrite/ewritestream.h index 7965b39b4..34a548f32 100644 --- a/src/core/ReadWrite/ewritestream.h +++ b/src/core/ReadWrite/ewritestream.h @@ -71,11 +71,15 @@ class CORE_EXPORT eWriteStream { eWriteStream& operator<<(const int val); eWriteStream& operator<<(const uint val); eWriteStream& operator<<(const uint64_t val); +#if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)) + eWriteStream& operator<<(const int64_t val); + eWriteStream& operator<<(const long long val); +#endif eWriteStream& operator<<(const iValueRange val); eWriteStream& operator<<(const qreal val); eWriteStream& operator<<(const QPointF& val); eWriteStream& operator<<(const QRectF& val); - eWriteStream& operator<<(const QMatrix& val); + eWriteStream& operator<<(const QTransform& val); eWriteStream& operator<<(const QColor& val); eWriteStream& operator<<(const QString& val); eWriteStream& operator<<(const QByteArray& val); diff --git a/src/core/Segments/qcubicsegment2d.cpp b/src/core/Segments/qcubicsegment2d.cpp index ebdba5d78..1f2fd1b20 100644 --- a/src/core/Segments/qcubicsegment2d.cpp +++ b/src/core/Segments/qcubicsegment2d.cpp @@ -277,7 +277,7 @@ qCubicSegment2D qCubicSegment2D::rotated(const qreal deg) const { return result; } -void qCubicSegment2D::transform(const QMatrix& transform) { +void qCubicSegment2D::transform(const QTransform& transform) { mP0 = transform.map(p0()); mC1 = transform.map(c1()); mC2 = transform.map(c2()); diff --git a/src/core/Segments/qcubicsegment2d.h b/src/core/Segments/qcubicsegment2d.h index 5b1e216ed..11acf6817 100644 --- a/src/core/Segments/qcubicsegment2d.h +++ b/src/core/Segments/qcubicsegment2d.h @@ -131,7 +131,7 @@ struct CORE_EXPORT qCubicSegment2D { qCubicSegment2D rotated(const qreal deg) const; - void transform(const QMatrix& transform); + void transform(const QTransform& transform); void rotate(const qreal deg); diff --git a/src/core/ShaderEffects/shadereffectcreator.cpp b/src/core/ShaderEffects/shadereffectcreator.cpp index 6011016b1..994ad2f61 100644 --- a/src/core/ShaderEffects/shadereffectcreator.cpp +++ b/src/core/ShaderEffects/shadereffectcreator.cpp @@ -128,7 +128,7 @@ ShaderEffectCreator::Identifier ShaderEffectCreator::sReadIdentifierXEV( const QString name = ele.attribute("name"); const QString grePath = ele.attribute("grePath"); const QString propsStr = ele.attribute("properties"); - const auto propsStrList = propsStr.splitRef(','); + const auto propsStrList = propsStr.split(','); QList props; for(const auto &propStr : propsStrList) { const int propInt = XmlExportHelpers::stringToInt(propStr); @@ -213,10 +213,11 @@ QPointF attrToQPointF(const QDomElement &elem, const QString& def, const bool allowSingleValue) { const QString valS = elem.attribute(attr, def); - const QRegExp rx("\\[" REGEX_TWO_FLOATS "\\]"); - if(rx.exactMatch(valS)) { - rx.indexIn(valS); - const QStringList xy = rx.capturedTexts(); + const QRegularExpression rx("^\\[" REGEX_TWO_FLOATS "\\]$"); + QRegularExpressionMatch match = rx.match(valS); + + if (match.hasMatch()) { + const QStringList xy = match.capturedTexts(); return {xy.at(1).toDouble(), xy.at(2).toDouble()}; } else if(allowSingleValue) { bool ok; @@ -233,19 +234,21 @@ QColor attrToQColor(const QDomElement &elem, const QString& attr, const QString& def) { const QString valS = elem.attribute(attr, def); - const QRegExp rxRGBA("\\[" REGEX_FOUR_FLOATS "\\]"); - if(rxRGBA.exactMatch(valS)) { - rxRGBA.indexIn(valS); - const QStringList rgba = rxRGBA.capturedTexts(); + const QRegularExpression rxRGBA("^\\[" REGEX_FOUR_FLOATS "\\]$"); + QRegularExpressionMatch match = rxRGBA.match(valS); + + if (match.hasMatch()) { + const QStringList rgba = match.capturedTexts(); return QColor::fromRgbF(rgba.at(1).toDouble(), rgba.at(2).toDouble(), rgba.at(3).toDouble(), rgba.at(4).toDouble()); } else { - const QRegExp rxRGB("\\[" REGEX_THREE_FLOATS "\\]"); - if(rxRGB.exactMatch(valS)) { - rxRGB.indexIn(valS); - const QStringList rgb = rxRGB.capturedTexts(); + const QRegularExpression rxRGB("^\\[" REGEX_THREE_FLOATS "\\]$"); + QRegularExpressionMatch match = rxRGB.match(valS); + + if (match.hasMatch()) { + const QStringList rgb = match.capturedTexts(); return QColor::fromRgbF(rgb.at(1).toDouble(), rgb.at(2).toDouble(), rgb.at(3).toDouble()); @@ -360,8 +363,10 @@ void readPropertyCreators(const QDomElement &elem, stdsptr& uniC) { const QString name = elem.attribute("name"); if(name.isEmpty()) RuntimeThrow("Property name not defined."); - const QRegExp rx("[A-Za-z_][A-Za-z0-9_]*"); - if(!rx.exactMatch(name)) RuntimeThrow("Invalid Property name '" + name + "'."); + const QRegularExpression rx("^[A-Za-z_][A-Za-z0-9_]*$"); + if (!rx.match(name).hasMatch()) { + RuntimeThrow("Invalid Property name '" + name + "'."); + } const QString type = elem.attribute("type"); if(type.isEmpty()) RuntimeThrow("Property type not defined for " + name + "."); @@ -508,9 +513,19 @@ stdsptr ShaderEffectCreator::sLoadFromFile( if(!greFile.open(QIODevice::ReadOnly)) RuntimeThrow("ShaderEffect source file could not be opened."); QDomDocument document; + +#if QT_VERSION >= QT_VERSION_CHECK(6, 5, 0) + const auto parseResult = document.setContent(&greFile); + if (!parseResult) { + RuntimeThrow("Error while parsing ShaderEffect source:\n" + parseResult.errorMessage); + } +#else QString errMsg; - if(!document.setContent(&greFile, &errMsg)) + if (!document.setContent(&greFile, &errMsg)) { RuntimeThrow("Error while parsing ShaderEffect source:\n" + errMsg); + } +#endif + greFile.close(); QDomElement root = document.firstChildElement(); diff --git a/src/core/ShaderEffects/shadereffectjs.cpp b/src/core/ShaderEffects/shadereffectjs.cpp index f4fb814b7..1d8253851 100644 --- a/src/core/ShaderEffects/shadereffectjs.cpp +++ b/src/core/ShaderEffects/shadereffectjs.cpp @@ -253,7 +253,7 @@ QStringList extractExternFromScript(QString& calc) const auto match = matchIterator.next(); result << match.captured(1); } - calc.remove(QRegExp("\\bextern\\s+")); + calc.remove(QRegularExpression("\\bextern\\s+")); return result; } diff --git a/src/core/Sound/audiohandler.cpp b/src/core/Sound/audiohandler.cpp index 9d8ffb6ce..a614ec45d 100644 --- a/src/core/Sound/audiohandler.cpp +++ b/src/core/Sound/audiohandler.cpp @@ -37,21 +37,52 @@ AudioHandler::AudioHandler() sInstance = this; } +void AudioHandler::provideData(const DataRequest &request) +{ + if (!request || !mAudioIOOutput) { return; } + mAudioIOOutput->write(request.fData, request.fSize); +} + +AudioHandler::DataRequest AudioHandler::dataRequest() +{ +#if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)) + if (mAudioOutput && mAudioOutput->state() != QAudio::StoppedState) { + int chunkSize = mAudioFormat.bytesPerFrame() * 1024; + + if (chunkSize <= 0 || chunkSize > mAudioBuffer.size()) { + chunkSize = 4096; // fallback (4 KB) + } + + if (mAudioOutput->bytesFree() >= chunkSize) { + return {mAudioBuffer.data(), chunkSize}; + } + } +#else + if (mAudioOutput && mAudioOutput->state() != QAudio::StoppedState) { + if (mAudioOutput->bytesFree() >= mAudioOutput->periodSize()) { + return {mAudioBuffer.data(), mAudioOutput->periodSize()}; + } + } +#endif + + return {nullptr, 0}; +} + const int BufferSize = 32768; -QAudioFormat::SampleType toQtAudioFormat(const AVSampleFormat avFormat) +QtAudioSampleFormat toQtAudioFormat(const AVSampleFormat avFormat) { if (avFormat == AV_SAMPLE_FMT_S32) { - return QAudioFormat::SignedInt; + return AUDIO_SAMPLE_FORMAT; } else if (avFormat == AV_SAMPLE_FMT_FLT) { return QAudioFormat::Float; } else { RuntimeThrow("Unsupported sample format " + av_get_sample_fmt_name(avFormat)); } } -AVSampleFormat toAVAudioFormat(const QAudioFormat::SampleType qFormat) +AVSampleFormat toAVAudioFormat(const QtAudioSampleFormat qFormat) { - if (qFormat == QAudioFormat::SignedInt) { + if (qFormat == AUDIO_SAMPLE_FORMAT) { return AV_SAMPLE_FMT_S32; } else if (qFormat == QAudioFormat::Float) { return AV_SAMPLE_FMT_FLT; @@ -67,10 +98,17 @@ void AudioHandler::initializeAudio(eSoundSettingsData& soundSettings, mAudioBuffer = QByteArray(BufferSize, 0); mAudioDevice = findDevice(deviceName); + +#if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)) + qDebug() << "Using audio device" << mAudioDevice.description(); +#else qDebug() << "Using audio device" << mAudioDevice.deviceName(); +#endif mAudioFormat.setSampleRate(soundSettings.fSampleRate); mAudioFormat.setChannelCount(soundSettings.channelCount()); + +#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0)) mAudioFormat.setSampleSize(8*soundSettings.bytesPerSample()); mAudioFormat.setCodec("audio/pcm"); mAudioFormat.setByteOrder(QAudioFormat::LittleEndian); @@ -93,6 +131,20 @@ void AudioHandler::initializeAudio(eSoundSettingsData& soundSettings, mAudioOutput = new QAudioOutput(mAudioDevice, mAudioFormat, this); mAudioOutput->setNotifyInterval(128); +#else + mAudioFormat.setSampleFormat(toQtAudioFormat(soundSettings.fSampleFormat)); + + if (!mAudioDevice.isFormatSupported(mAudioFormat)) { + mAudioFormat = mAudioDevice.preferredFormat(); + soundSettings.fSampleRate = mAudioFormat.sampleRate(); + soundSettings.fSampleFormat = toAVAudioFormat(mAudioFormat.sampleFormat()); + } + + qDebug() << mAudioFormat; + + mAudioOutput = new QAudioSink(mAudioDevice, mAudioFormat, this); +#endif + emit deviceChanged(); } @@ -104,41 +156,58 @@ void AudioHandler::initializeAudio(const QString &deviceName, mAudioBuffer = QByteArray(BufferSize, 0); mAudioDevice = findDevice(deviceName); +#if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)) + qDebug() << "Using audio device" << mAudioDevice.description(); +#else qDebug() << "Using audio device" << mAudioDevice.deviceName(); +#endif if (save) { AppSupport::setSettings(QString::fromUtf8("audio"), QString::fromUtf8("output"), +#if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)) + mAudioDevice.id()); +#else mAudioDevice.deviceName()); +#endif } +#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0)) QAudioDeviceInfo info(mAudioDevice); if (!info.isFormatSupported(mAudioFormat)) { mAudioFormat = info.nearestFormat(mAudioFormat); } +#else + if (!mAudioDevice.isFormatSupported(mAudioFormat)) { + mAudioFormat = mAudioDevice.preferredFormat(); + } +#endif - mAudioOutput = new QAudioOutput(mAudioDevice, mAudioFormat, this); + mAudioOutput = new QtAudioOutput(mAudioDevice, mAudioFormat, this); +#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0)) mAudioOutput->setNotifyInterval(128); +#endif + emit deviceChanged(); } void AudioHandler::startAudio() { - //if (!QAudioDeviceInfo::availableDevices(QAudio::AudioOutput) - //.contains(mAudioDevice)) { initializeAudio(); } + if (!mAudioOutput) { return; } mAudioIOOutput = mAudioOutput->start(); } void AudioHandler::pauseAudio() { - mAudioOutput->suspend(); + if (mAudioOutput) { mAudioOutput->suspend(); } } void AudioHandler::resumeAudio() { - mAudioOutput->resume(); + if (mAudioOutput) { mAudioOutput->resume(); } } void AudioHandler::stopAudio() { + if (!mAudioOutput) { return; } mAudioIOOutput = nullptr; mAudioOutput->stop(); mAudioOutput->reset(); @@ -158,25 +227,46 @@ qreal AudioHandler::getVolume() const QString AudioHandler::getDeviceName() { +#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0)) return mAudioDevice.deviceName(); +#else + return mAudioDevice.description(); +#endif } -QAudioDeviceInfo AudioHandler::findDevice(const QString &deviceName) +QtAudioDevice AudioHandler::findDevice(const QString &deviceName) { +#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0)) if (deviceName.isEmpty()) { return QAudioDeviceInfo::defaultOutputDevice(); } const auto deviceInfos = QAudioDeviceInfo::availableDevices(QAudio::AudioOutput); for (const QAudioDeviceInfo &deviceInfo : deviceInfos) { if (deviceInfo.deviceName() == deviceName) { return deviceInfo; } } return QAudioDeviceInfo::defaultOutputDevice(); +#else + if (deviceName.isEmpty()) { return QMediaDevices::defaultAudioOutput(); } + const auto deviceInfos = QMediaDevices::audioOutputs(); + for (const QAudioDevice &deviceInfo : deviceInfos) { + if (deviceInfo.id() == deviceName || + deviceInfo.description() == deviceName) { return deviceInfo; } + } + return QMediaDevices::defaultAudioOutput(); +#endif } const QStringList AudioHandler::listDevices() { QStringList devices; +#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0)) const auto deviceInfos = QAudioDeviceInfo::availableDevices(QAudio::AudioOutput); for (const QAudioDeviceInfo &deviceInfo : deviceInfos) { devices << deviceInfo.deviceName(); } +#else + const auto deviceInfos = QMediaDevices::audioOutputs(); + for (const QAudioDevice &deviceInfo : deviceInfos) { + devices << deviceInfo.description(); + } +#endif return devices; } diff --git a/src/core/Sound/audiohandler.h b/src/core/Sound/audiohandler.h index 6408ae791..5d0a273b6 100644 --- a/src/core/Sound/audiohandler.h +++ b/src/core/Sound/audiohandler.h @@ -28,8 +28,25 @@ #include "core_global.h" -#include +#include #include +#include + +#if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)) +#include +#include +#include +using QtAudioDevice = QAudioDevice; +using QtAudioOutput = QAudioSink; +using QtAudioSampleFormat = QAudioFormat::SampleFormat; +#define AUDIO_SAMPLE_FORMAT QAudioFormat::Int32 +#else +#include +using QtAudioDevice = QAudioDeviceInfo; +using QtAudioOutput = QAudioOutput; +using QtAudioSampleFormat = QAudioFormat::SampleType; +#define AUDIO_SAMPLE_FORMAT QAudioFormat::SignedInt +#endif struct CORE_EXPORT eSoundSettingsData; @@ -51,21 +68,9 @@ class CORE_EXPORT AudioHandler : public QObject } }; - DataRequest dataRequest() - { - if (mAudioOutput && mAudioOutput->state() != QAudio::StoppedState) { - if (mAudioOutput->bytesFree() >= mAudioOutput->periodSize()) { - return {mAudioBuffer.data(), mAudioOutput->periodSize()}; - } - } - return {nullptr, 0}; - } + DataRequest dataRequest(); - void provideData(const DataRequest& request) - { - if (!request || !mAudioIOOutput) { return; } - mAudioIOOutput->write(request.fData, request.fSize); - } + void provideData(const DataRequest& request); void initializeAudio(eSoundSettingsData &soundSettings, const QString &deviceName = QString()); @@ -78,17 +83,17 @@ class CORE_EXPORT AudioHandler : public QObject void setVolume(const int value); qreal getVolume(); const QString getDeviceName(); - QAudioDeviceInfo findDevice(const QString &deviceName); + QtAudioDevice findDevice(const QString &deviceName); const QStringList listDevices(); - QAudioOutput* audioOutput() const { return mAudioOutput; } + QtAudioOutput* audioOutput() const { return mAudioOutput; } signals: void deviceChanged(); private: - QAudioDeviceInfo mAudioDevice; - QAudioOutput *mAudioOutput = nullptr; + QtAudioDevice mAudioDevice; + QtAudioOutput *mAudioOutput = nullptr; QIODevice *mAudioIOOutput = nullptr; // not owned QAudioFormat mAudioFormat; diff --git a/src/core/TransformEffects/followobjecteffect.cpp b/src/core/TransformEffects/followobjecteffect.cpp index b8bfa5f0a..13265afc8 100644 --- a/src/core/TransformEffects/followobjecteffect.cpp +++ b/src/core/TransformEffects/followobjecteffect.cpp @@ -39,7 +39,7 @@ void FollowObjectEffect::applyEffect(const qreal relFrame, qreal& rot, qreal& scaleX, qreal& scaleY, qreal& shearX, qreal& shearY, - QMatrix& postTransform, + QTransform& postTransform, BoundingBox* const parent) { Q_UNUSED(pivotX) Q_UNUSED(pivotY) diff --git a/src/core/TransformEffects/followobjecteffect.h b/src/core/TransformEffects/followobjecteffect.h index a37c51e32..f1ec5a5d1 100644 --- a/src/core/TransformEffects/followobjecteffect.h +++ b/src/core/TransformEffects/followobjecteffect.h @@ -38,7 +38,7 @@ class FollowObjectEffect : public FollowObjectEffectBase { qreal &rot, qreal &scaleX, qreal &scaleY, qreal &shearX, qreal &shearY, - QMatrix& postTransform, + QTransform& postTransform, BoundingBox* const parent) override; }; diff --git a/src/core/TransformEffects/followobjecteffectbase.cpp b/src/core/TransformEffects/followobjecteffectbase.cpp index 44bc15c30..fad5df178 100644 --- a/src/core/TransformEffects/followobjecteffectbase.cpp +++ b/src/core/TransformEffects/followobjecteffectbase.cpp @@ -55,7 +55,7 @@ void FollowObjectEffectBase::applyEffectWithTransform( qreal& scaleX, qreal& scaleY, qreal& shearX, qreal& shearY, BoundingBox* const parent, - const QMatrix& transform) { + const QTransform& transform) { Q_UNUSED(pivotX); Q_UNUSED(pivotY); Q_UNUSED(shearX); diff --git a/src/core/TransformEffects/followobjecteffectbase.h b/src/core/TransformEffects/followobjecteffectbase.h index 3c63f5bbd..77ca6aa90 100644 --- a/src/core/TransformEffects/followobjecteffectbase.h +++ b/src/core/TransformEffects/followobjecteffectbase.h @@ -44,7 +44,7 @@ class FollowObjectEffectBase : public TargetTransformEffect { qreal &scaleX, qreal &scaleY, qreal &shearX, qreal &shearY, BoundingBox* const parent, - const QMatrix& transform); + const QTransform& transform); protected: void setRotScaleAfterTargetChange( BoundingBox* const oldTarget, diff --git a/src/core/TransformEffects/followobjectrelativeeffect.cpp b/src/core/TransformEffects/followobjectrelativeeffect.cpp index 511972cf5..e5bc5497c 100644 --- a/src/core/TransformEffects/followobjectrelativeeffect.cpp +++ b/src/core/TransformEffects/followobjectrelativeeffect.cpp @@ -41,7 +41,7 @@ void FollowObjectRelativeEffect::applyEffect( qreal& rot, qreal& scaleX, qreal& scaleY, qreal& shearX, qreal& shearY, - QMatrix& postTransform, + QTransform& postTransform, BoundingBox* const parent) { Q_UNUSED(pivotX) Q_UNUSED(pivotY) diff --git a/src/core/TransformEffects/followobjectrelativeeffect.h b/src/core/TransformEffects/followobjectrelativeeffect.h index 53cd6a7b4..eb4642817 100644 --- a/src/core/TransformEffects/followobjectrelativeeffect.h +++ b/src/core/TransformEffects/followobjectrelativeeffect.h @@ -39,7 +39,7 @@ class FollowObjectRelativeEffect : qreal &rot, qreal &scaleX, qreal &scaleY, qreal &shearX, qreal &shearY, - QMatrix& postTransform, + QTransform& postTransform, BoundingBox* const parent) override; }; diff --git a/src/core/TransformEffects/followpatheffect.cpp b/src/core/TransformEffects/followpatheffect.cpp index 7b629f396..ab11b4733 100644 --- a/src/core/TransformEffects/followpatheffect.cpp +++ b/src/core/TransformEffects/followpatheffect.cpp @@ -47,7 +47,7 @@ FollowPathEffect::FollowPathEffect() : void calculateFollowRotPosChange( const SkPath relPath, - const QMatrix transform, + const QTransform transform, const bool lengthBased, const bool rotate, const qreal infl, @@ -140,7 +140,7 @@ void FollowPathEffect::applyEffect(const qreal relFrame, qreal& rot, qreal& scaleX, qreal& scaleY, qreal& shearX, qreal& shearY, - QMatrix& postTransform, + QTransform& postTransform, BoundingBox* const parent) { Q_UNUSED(pivotX) Q_UNUSED(pivotY) diff --git a/src/core/TransformEffects/followpatheffect.h b/src/core/TransformEffects/followpatheffect.h index 0a87927c9..5ce3912e2 100644 --- a/src/core/TransformEffects/followpatheffect.h +++ b/src/core/TransformEffects/followpatheffect.h @@ -40,7 +40,7 @@ class FollowPathEffect : public TargetTransformEffect { qreal &rot, qreal &scaleX, qreal &scaleY, qreal &shearX, qreal &shearY, - QMatrix& postTransform, + QTransform& postTransform, BoundingBox* const parent) override; QDomElement saveFollowPathSVG(SvgExporter& exp, diff --git a/src/core/TransformEffects/parenteffect.cpp b/src/core/TransformEffects/parenteffect.cpp index 0b9c3a0b1..8b86c2873 100644 --- a/src/core/TransformEffects/parenteffect.cpp +++ b/src/core/TransformEffects/parenteffect.cpp @@ -108,7 +108,7 @@ void ParentEffect::applyEffect(const qreal relFrame, qreal& scaleY, qreal& shearX, qreal& shearY, - QMatrix& postTransform, + QTransform& postTransform, BoundingBox* const parent) { Q_UNUSED(parent) @@ -176,7 +176,7 @@ bool ParentEffect::computeEffectTransform(const qreal relFrame, const qreal scaleXInfl, const qreal scaleYInfl, const qreal rotInfl, - QMatrix& outPostTransform, + QTransform& outPostTransform, const bool updateState) { if (!isVisible()) { return false; } @@ -198,9 +198,9 @@ bool ParentEffect::computeEffectTransform(const qreal relFrame, if (!ensureBindState(relFrame)) { return false; } - const QMatrix targetRel = target->getRelativeTransformAtFrame(targetRelFrame); - const QMatrix targetInParentSpace = targetRel*mBindTargetParentToParentSpace; - const QMatrix targetLinear(targetInParentSpace.m11(), + const QTransform targetRel = target->getRelativeTransformAtFrame(targetRelFrame); + const QTransform targetInParentSpace = targetRel*mBindTargetParentToParentSpace; + const QTransform targetLinear(targetInParentSpace.m11(), targetInParentSpace.m12(), targetInParentSpace.m21(), targetInParentSpace.m22(), @@ -210,10 +210,10 @@ bool ParentEffect::computeEffectTransform(const qreal relFrame, const QPointF targetPivotInParent = targetInParentSpace.map(targetPivotRel); bool bindLinearInvertible = false; - const QMatrix bindLinearInv = mBindTargetLinearInParent.inverted(&bindLinearInvertible); + const QTransform bindLinearInv = mBindTargetLinearInParent.inverted(&bindLinearInvertible); if (!bindLinearInvertible) { return false; } - const QMatrix deltaLinear = targetLinear*bindLinearInv; + const QTransform deltaLinear = targetLinear*bindLinearInv; const TransformValues deltaValues = MatrixDecomposition::decompose(deltaLinear); const qreal rawDeltaAngle = std::atan2(deltaLinear.m12(), deltaLinear.m11()); @@ -240,7 +240,7 @@ bool ParentEffect::computeEffectTransform(const qreal relFrame, linearValues.fShearX = deltaValues.fShearX*scaleXInfl; linearValues.fShearY = deltaValues.fShearY*scaleYInfl; - const QMatrix linear = linearValues.calculate(); + const QTransform linear = linearValues.calculate(); const QPointF objectPivotLocal(baseValues.fPivotX, baseValues.fPivotY); @@ -289,9 +289,9 @@ bool ParentEffect::computeEffectTransform(const qreal relFrame, QPointF noFollowPivot = mBindObjectPivotInParent; if (mNoFollowStateValid) { bool prevLinearInvertible = false; - const QMatrix prevLinearInv = mNoFollowLinearState.inverted(&prevLinearInvertible); + const QTransform prevLinearInv = mNoFollowLinearState.inverted(&prevLinearInvertible); if (prevLinearInvertible) { - const QMatrix deltaLinearStep = linear*prevLinearInv; + const QTransform deltaLinearStep = linear*prevLinearInv; const QPointF prevRel(mNoFollowPivotState.x() - targetPivotInParent.x(), mNoFollowPivotState.y() - targetPivotInParent.y()); const QPointF nextRel = mapLinear(deltaLinearStep, prevRel); @@ -316,7 +316,7 @@ bool ParentEffect::computeEffectTransform(const qreal relFrame, const QPointF offset(finalPivot.x() - linearAtObjectPivot.x(), finalPivot.y() - linearAtObjectPivot.y()); - outPostTransform = QMatrix(linear.m11(), linear.m12(), + outPostTransform = QTransform(linear.m11(), linear.m12(), linear.m21(), linear.m22(), offset.x(), offset.y()); @@ -340,19 +340,19 @@ void ParentEffect::captureBindState(const qreal relFrame) const qreal absFrame = prp_relFrameToAbsFrameF(relFrame); const qreal targetRelFrame = target->prp_absFrameToRelFrameF(absFrame); - const QMatrix inherited = parent->getInheritedTransformAtFrame(relFrame); + const QTransform inherited = parent->getInheritedTransformAtFrame(relFrame); bool inheritedInvertible = false; - const QMatrix inheritedInv = inherited.inverted(&inheritedInvertible); + const QTransform inheritedInv = inherited.inverted(&inheritedInvertible); if (!inheritedInvertible) { mBindStateValid = false; return; } - const QMatrix targetInherited = target->getInheritedTransformAtFrame(targetRelFrame); + const QTransform targetInherited = target->getInheritedTransformAtFrame(targetRelFrame); mBindTargetParentToParentSpace = targetInherited*inheritedInv; - const QMatrix targetRel = target->getRelativeTransformAtFrame(targetRelFrame); - const QMatrix targetInParentSpace = targetRel*mBindTargetParentToParentSpace; - const QMatrix targetLinear(targetInParentSpace.m11(), + const QTransform targetRel = target->getRelativeTransformAtFrame(targetRelFrame); + const QTransform targetInParentSpace = targetRel*mBindTargetParentToParentSpace; + const QTransform targetLinear(targetInParentSpace.m11(), targetInParentSpace.m12(), targetInParentSpace.m21(), targetInParentSpace.m22(), @@ -370,7 +370,7 @@ void ParentEffect::captureBindState(const qreal relFrame) mAccumDeltaAngleRad = 0.0; mDeltaAngleStateValid = false; mNoFollowPivotState = objectPivotInParent; - mNoFollowLinearState = QMatrix(); + mNoFollowLinearState = QTransform(); mNoFollowStateValid = true; const auto transform = parent->getBoxTransformAnimator(); @@ -445,7 +445,7 @@ void ParentEffect::handleInfluenceChanged() const TransformValues baseValues = getCurrentBaseValues(transform, relFrame); - QMatrix oldPost; + QTransform oldPost; if (!computeEffectTransform(relFrame, baseValues, mPrevPosInfluence.x(), @@ -459,7 +459,7 @@ void ParentEffect::handleInfluenceChanged() return; } - QMatrix newPost; + QTransform newPost; if (!computeEffectTransform(relFrame, baseValues, posXInfl, @@ -474,14 +474,14 @@ void ParentEffect::handleInfluenceChanged() } bool invertible = false; - const QMatrix invNewPost = newPost.inverted(&invertible); + const QTransform invNewPost = newPost.inverted(&invertible); if (!invertible) { updatePrevInfluences(relFrame); return; } - const QMatrix baseRel = baseValues.calculate(); - const QMatrix newBaseRel = baseRel*oldPost*invNewPost; + const QTransform baseRel = baseValues.calculate(); + const QTransform newBaseRel = baseRel*oldPost*invNewPost; TransformValues newValues = MatrixDecomposition::decomposePivoted(newBaseRel, QPointF(baseValues.fPivotX, diff --git a/src/core/TransformEffects/parenteffect.h b/src/core/TransformEffects/parenteffect.h index 4ae1b0b46..1905e4c73 100644 --- a/src/core/TransformEffects/parenteffect.h +++ b/src/core/TransformEffects/parenteffect.h @@ -49,7 +49,7 @@ class ParentEffect : public FollowObjectEffectBase qreal &scaleY, qreal &shearX, qreal &shearY, - QMatrix& postTransform, + QTransform& postTransform, BoundingBox* const parent) override; private: @@ -63,7 +63,7 @@ class ParentEffect : public FollowObjectEffectBase const qreal scaleXInfl, const qreal scaleYInfl, const qreal rotInfl, - QMatrix& outPostTransform, + QTransform& outPostTransform, const bool updateState); void handleInfluenceChanged(); @@ -91,13 +91,13 @@ class ParentEffect : public FollowObjectEffectBase bool mPrevInfluenceValid = false; QPointF mBindTargetPivotInParent; QPointF mBindObjectPivotInParent; - QMatrix mBindTargetParentToParentSpace; - QMatrix mBindTargetLinearInParent; + QTransform mBindTargetParentToParentSpace; + QTransform mBindTargetLinearInParent; bool mBindStateValid = false; qreal mAccumDeltaAngleRad = 0.0; bool mDeltaAngleStateValid = false; QPointF mNoFollowPivotState; - QMatrix mNoFollowLinearState; + QTransform mNoFollowLinearState; bool mNoFollowStateValid = false; QPointF mLastBaseMove; bool mLastBaseMoveValid = false; diff --git a/src/core/TransformEffects/trackeffect.cpp b/src/core/TransformEffects/trackeffect.cpp index 1a0be1b81..d1fc5607d 100644 --- a/src/core/TransformEffects/trackeffect.cpp +++ b/src/core/TransformEffects/trackeffect.cpp @@ -89,7 +89,7 @@ void TrackEffect::applyEffect( qreal& rot, qreal& scaleX, qreal& scaleY, qreal& shearX, qreal& shearY, - QMatrix& postTransform, + QTransform& postTransform, BoundingBox* const parent) { Q_UNUSED(pivotX) Q_UNUSED(pivotY) diff --git a/src/core/TransformEffects/trackeffect.h b/src/core/TransformEffects/trackeffect.h index 80683743d..b6f9207cc 100644 --- a/src/core/TransformEffects/trackeffect.h +++ b/src/core/TransformEffects/trackeffect.h @@ -38,7 +38,7 @@ class TrackEffect : public TargetTransformEffect { qreal &rot, qreal &scaleX, qreal &scaleY, qreal &shearX, qreal &shearY, - QMatrix& postTransform, + QTransform& postTransform, BoundingBox* const parent) override; private: void setRotScaleAfterTargetChange( diff --git a/src/core/TransformEffects/transformeffect.h b/src/core/TransformEffects/transformeffect.h index eb8fc43d3..4ba67d9fe 100644 --- a/src/core/TransformEffects/transformeffect.h +++ b/src/core/TransformEffects/transformeffect.h @@ -47,7 +47,7 @@ class TransformEffect : public eEffect { qreal& rot, qreal& scaleX, qreal& scaleY, qreal& shearX, qreal& shearY, - QMatrix& postTransform, + QTransform& postTransform, BoundingBox* const parent) = 0; void prp_setupTreeViewMenu(PropertyMenu * const menu); diff --git a/src/core/TransformEffects/transformeffectcollection.cpp b/src/core/TransformEffects/transformeffectcollection.cpp index 07f794c08..ffc448c5b 100644 --- a/src/core/TransformEffects/transformeffectcollection.cpp +++ b/src/core/TransformEffects/transformeffectcollection.cpp @@ -127,7 +127,7 @@ void TransformEffectCollection::applyEffects( qreal& rot, qreal& scaleX, qreal& scaleY, qreal& shearX, qreal& shearY, - QMatrix& postTransform, + QTransform& postTransform, BoundingBox* const parent) const { const int iMax = ca_getNumberOfChildren(); for(int i = 0; i < iMax; i++) { diff --git a/src/core/TransformEffects/transformeffectcollection.h b/src/core/TransformEffects/transformeffectcollection.h index 864b02d9a..480108315 100644 --- a/src/core/TransformEffects/transformeffectcollection.h +++ b/src/core/TransformEffects/transformeffectcollection.h @@ -74,7 +74,7 @@ class CORE_EXPORT TransformEffectCollection : qreal& rot, qreal& scaleX, qreal& scaleY, qreal& shearX, qreal& shearY, - QMatrix& postTransform, + QTransform& postTransform, BoundingBox* const parent) const; }; diff --git a/src/core/XML/xmlexporthelpers.cpp b/src/core/XML/xmlexporthelpers.cpp index d0a389fed..b5f16f067 100644 --- a/src/core/XML/xmlexporthelpers.cpp +++ b/src/core/XML/xmlexporthelpers.cpp @@ -104,28 +104,20 @@ QString XmlExportHelpers::blendModeToString(const SkBlendMode blendMode) { } } -qreal XmlExportHelpers::stringToDouble(const QStringRef& string) { +qreal XmlExportHelpers::stringToDouble(const QStringView& string) { bool ok; const qreal value = string.toDouble(&ok); if(!ok) RuntimeThrow("Invalid value " + string.toString()); return value; } -qreal XmlExportHelpers::stringToDouble(const QString& string) { - return stringToDouble(&string); -} - -int XmlExportHelpers::stringToInt(const QStringRef& string) { +int XmlExportHelpers::stringToInt(const QStringView& string) { bool ok; const int value = string.toInt(&ok); if(!ok) RuntimeThrow("Invalid value " + string.toString()); return value; } -int XmlExportHelpers::stringToInt(const QString& string) { - return stringToInt(&string); -} - QDomElement XevExportHelpers::brushToElement( SimpleBrushWrapper* const brush, QDomDocument& doc) { auto ele = doc.createElement("Brush"); @@ -140,7 +132,7 @@ SimpleBrushWrapper* XevExportHelpers::brushFromElement(const QDomElement& ele) { return BrushCollectionData::sGetBrush(coll, name); } -QMatrix XmlExportHelpers::stringToMatrix(const QString& str) { +QTransform XmlExportHelpers::stringToMatrix(const QString& str) { const auto vals = str.split(' ', Qt::SkipEmptyParts); if(vals.count() != 6) RuntimeThrow("Invalid matrix value '" + str + "'"); const qreal m11 = stringToDouble(vals[0]); @@ -149,10 +141,10 @@ QMatrix XmlExportHelpers::stringToMatrix(const QString& str) { const qreal m22 = stringToDouble(vals[3]); const qreal dx = stringToDouble(vals[4]); const qreal dy = stringToDouble(vals[5]); - return QMatrix(m11, m12, m21, m22, dx, dy); + return QTransform(m11, m12, m21, m22, dx, dy); } -QString XmlExportHelpers::matrixToString(const QMatrix& m) { +QString XmlExportHelpers::matrixToString(const QTransform& m) { return QString("%1 %2 %3 %4 %5 %6").arg(m.m11()).arg(m.m12()). arg(m.m21()).arg(m.m22()). arg(m.dx()).arg(m.dy()); @@ -166,14 +158,15 @@ void XevExportHelpers::setAbsAndRelFileSrc(const QString& absSrc, } QString XevExportHelpers::getAbsAndRelFileSrc(const QDomElement& ele, - const XevImporter& imp) { + const XevImporter& imp) +{ const auto relSrc = ele.attribute("relSrc"); const auto absRelSrc = imp.relPathToAbsPath(relSrc); - if(QFileInfo(absRelSrc).exists()) { + if (QFileInfo::exists(absRelSrc)) { return absRelSrc; } else { const auto absSrc = ele.attribute("absSrc"); - if(absSrc.isEmpty()) return absRelSrc; + if (absSrc.isEmpty()) { return absRelSrc; } else return absSrc; } } diff --git a/src/core/XML/xmlexporthelpers.h b/src/core/XML/xmlexporthelpers.h index 34d012711..90200f33b 100644 --- a/src/core/XML/xmlexporthelpers.h +++ b/src/core/XML/xmlexporthelpers.h @@ -45,13 +45,10 @@ namespace XmlExportHelpers { QString blendModeToString(const SkBlendMode blendMode); CORE_EXPORT - qreal stringToDouble(const QStringRef& string); - CORE_EXPORT - qreal stringToDouble(const QString& string); - CORE_EXPORT - int stringToInt(const QStringRef& string); + qreal stringToDouble(const QStringView& string); + CORE_EXPORT - int stringToInt(const QString& string); + int stringToInt(const QStringView& string); template T stringToEnum(const S& string) { @@ -73,9 +70,9 @@ namespace XmlExportHelpers { } CORE_EXPORT - QMatrix stringToMatrix(const QString& str); + QTransform stringToMatrix(const QString& str); CORE_EXPORT - QString matrixToString(const QMatrix& m); + QString matrixToString(const QTransform& m); }; namespace XevExportHelpers { diff --git a/src/core/actions.cpp b/src/core/actions.cpp index 00115c21b..051f6c5de 100644 --- a/src/core/actions.cpp +++ b/src/core/actions.cpp @@ -68,7 +68,7 @@ Actions::Actions(Document &document) : mDocument(document) { tr("Delete %1").arg(sceneName), tr("Are you sure you want to delete " "%1? This action cannot be undone.").arg(sceneName), - tr("Cancel"), tr("Delete")); + QMessageBox::Cancel | QMessageBox::Yes); if (buttonId == 0) { return false; } return mDocument.removeScene(mActiveScene->ref()); }; diff --git a/src/core/appsupport.cpp b/src/core/appsupport.cpp index fa0f7fe40..5bcfb9b28 100644 --- a/src/core/appsupport.cpp +++ b/src/core/appsupport.cpp @@ -130,7 +130,7 @@ void AppSupport::setSettings(QSettings *settings, QVariant result; if (append) { QVariant orig = getSettings(group, key); - QMetaType::Type type = static_cast(orig.type()); + QMetaType::Type type = static_cast(orig.userType()); if (!orig.isNull() && type == QMetaType::QStringList) { QStringList list = orig.toStringList(); list.append(value.toString()); @@ -405,11 +405,12 @@ const QPair AppSupport::getShaderID(const QString &path) if (!greFile.open(QIODevice::ReadOnly)) { return result; } QDomDocument document; - QString errMsg; - if (!document.setContent(&greFile, &errMsg)) { + + if (!document.setContent(&greFile)) { greFile.close(); return result; } + greFile.close(); QDomElement root = document.firstChildElement(); @@ -938,7 +939,7 @@ bool AppSupport::removeXDGDesktopIntegration() QFile fileName(QString("%1/%2").arg(path, file)); if (fileName.exists()) { if (!fileName.remove()) { - qWarning() << "Failed to remove" << fileName; + qWarning() << "Failed to remove" << fileName.fileName(); return false; } } @@ -1040,6 +1041,12 @@ void AppSupport::initEnv(const bool &isRenderer) // GLX not supported! qputenv("QT_XCB_GL_INTEGRATION", "xcb_egl"); #endif + +#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) + qputenv("QT_WIDGETS_RHI", "1"); + qputenv("QT_WIDGETS_RHI_BACKEND", "opengl"); + qputenv("QSG_RHI_BACKEND", "opengl"); +#endif } QPair AppSupport::handleXDGArgs(const bool &isRenderer, @@ -1151,3 +1158,102 @@ QString AppSupport::getOnlineDocs() { return QString("%1/documentation").arg(getAppUrl()); } + +int AppSupport::getMouseX(QMouseEvent *event) +{ +#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) + return qRound(event->position().x()); +#else + return event->x(); +#endif +} + +int AppSupport::getMouseY(QMouseEvent *event) +{ +#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) + return qRound(event->position().y()); +#else + return event->y(); +#endif +} + +int AppSupport::getMouseGlobalX(QMouseEvent *event) +{ +#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) + return qRound(event->globalPosition().x()); +#else + return event->globalX(); +#endif +} + +int AppSupport::getMouseGlobalY(QMouseEvent *event) +{ +#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) + return qRound(event->globalPosition().y()); +#else + return event->globalY(); +#endif +} + +QPoint AppSupport::getMouseGlobalPos(QMouseEvent *event) +{ +#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) + return event->globalPosition().toPoint(); +#else + return event->globalPos(); +#endif +} + +QPoint AppSupport::getMouseGlobalPos(const QMouseEvent *event) +{ +#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) + return event->globalPosition().toPoint(); +#else + return event->globalPos(); +#endif +} + +QPoint AppSupport::getDropPos(QDropEvent *event) +{ +#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) + return event->position().toPoint(); +#else + return event->pos(); +#endif +} + +QPoint AppSupport::getDropPos(QDragEnterEvent *event) +{ +#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) + return event->position().toPoint(); +#else + return event->pos(); +#endif +} + +QPoint AppSupport::getDropPos(QDragMoveEvent *event) +{ +#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) + return event->position().toPoint(); +#else + return event->pos(); +#endif +} + +QPointF AppSupport::getDropPosF(QDropEvent *event) +{ +#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) + return event->position(); +#else + return event->posF(); +#endif +} + +bool AppSupport::isValidColor(const QString &name) +{ +#if QT_VERSION >= QT_VERSION_CHECK(6, 4, 0) + return QColor::isValidColorName(name); +#else + return QColor::isValidColor(name); +#endif +} diff --git a/src/core/appsupport.h b/src/core/appsupport.h index ab078074a..176e7fbb4 100644 --- a/src/core/appsupport.h +++ b/src/core/appsupport.h @@ -31,6 +31,10 @@ #include #include #include +#include +#include +#include +#include #include "hardwareenums.h" @@ -144,6 +148,20 @@ class CORE_EXPORT AppSupport : public QObject static void setFont(const QString &path); static QString getOfflineDocs(); static QString getOnlineDocs(); + + // Qt compat + // should probably be it's own class, but for now this is ok + static int getMouseX(QMouseEvent *event); + static int getMouseY(QMouseEvent *event); + static int getMouseGlobalX(QMouseEvent *event); + static int getMouseGlobalY(QMouseEvent *event); + static QPoint getMouseGlobalPos(QMouseEvent *event); + static QPoint getMouseGlobalPos(const QMouseEvent *event); + static QPoint getDropPos(QDropEvent *event); + static QPoint getDropPos(QDragEnterEvent *event); + static QPoint getDropPos(QDragMoveEvent *event); + static QPointF getDropPosF(QDropEvent *event); + static bool isValidColor(const QString &name); }; #endif // APPSUPPORT_H diff --git a/src/core/canvas.cpp b/src/core/canvas.cpp index 2ee44f5e8..51ebb9b04 100644 --- a/src/core/canvas.cpp +++ b/src/core/canvas.cpp @@ -261,7 +261,7 @@ void drawTransparencyMesh(SkCanvas* const canvas, void Canvas::renderSk(SkCanvas* const canvas, const QRect& drawRect, - const QMatrix& viewTrans, + const QTransform& viewTrans, const bool mouseGrabbing) { mDrawnSinceQue = true; diff --git a/src/core/canvas.h b/src/core/canvas.h index 490818883..6664274fa 100644 --- a/src/core/canvas.h +++ b/src/core/canvas.h @@ -313,14 +313,14 @@ class CORE_EXPORT Canvas : public CanvasBase void updateTotalTransform() {} - QMatrix getTotalTransform() const + QTransform getTotalTransform() const { - return QMatrix(); + return QTransform(); } - QMatrix getRelativeTransformAtCurrentFrame() const + QTransform getRelativeTransformAtCurrentFrame() const { - return QMatrix(); + return QTransform(); } QPointF mapAbsPosToRel(const QPointF &absPos) @@ -335,7 +335,7 @@ class CORE_EXPORT Canvas : public CanvasBase void renderSk(SkCanvas* const canvas, const QRect &drawRect, - const QMatrix &viewTrans, + const QTransform &viewTrans, const bool mouseGrabbing); void renderGizmos(SkCanvas* const canvas, const qreal qInvZoom, @@ -416,7 +416,7 @@ class CORE_EXPORT Canvas : public CanvasBase stdsptr createRenderData(); void setupRenderData(const qreal relFrame, - const QMatrix &parentM, + const QTransform &parentM, BoxRenderData* const data, Canvas* const scene) { diff --git a/src/core/canvasmouseinteractions.cpp b/src/core/canvasmouseinteractions.cpp index 4f5d89e84..52263eb52 100644 --- a/src/core/canvasmouseinteractions.cpp +++ b/src/core/canvasmouseinteractions.cpp @@ -54,7 +54,6 @@ #include "MovablePoints/smartnodepoint.h" #include "MovablePoints/pathpivot.h" -#include #include #include #include @@ -78,7 +77,7 @@ void Canvas::addActionsToMenu(QMenu *const menu) if (clipboard) { QAction * const pasteAct = menu->addAction(tr("Paste"), this, &Canvas::pasteAction); - pasteAct->setShortcut(Qt::CTRL + Qt::Key_V); + pasteAct->setShortcut(QStringLiteral("Ctrl+V")); } const auto sceneIcon = QIcon::fromTheme("sequence"); @@ -551,8 +550,8 @@ const QColor Canvas::pickPixelColor(const QPoint &pos) // Windows and X11 don't care QScreen *screen = QApplication::screenAt(pos); if (!screen) { return QColor(); } - WId wid = QApplication::desktop()->winId(); - const auto pix = screen->grabWindow(wid, pos.x(), pos.y(), 1, 1); + QPoint localPos = pos - screen->geometry().topLeft(); + const auto pix = screen->grabWindow(0, localPos.x(), localPos.y(), 1, 1); return QColor(pix.toImage().pixel(0, 0)); } diff --git a/src/core/canvasselectedboxesactions.cpp b/src/core/canvasselectedboxesactions.cpp index 8968e1d12..4ceb39c7e 100644 --- a/src/core/canvasselectedboxesactions.cpp +++ b/src/core/canvasselectedboxesactions.cpp @@ -758,7 +758,7 @@ SmartVectorPath *Canvas::getPathResultingFromOperation(const SkPathOp& pathOp) for (const auto &box : boxes) { if (const auto pBox = enve_cast(box)) { SkPath boxPath = pBox->getRelativePath(); - const QMatrix boxTrans = box->getRelativeTransformAtCurrentFrame(); + const QTransform boxTrans = box->getRelativeTransformAtCurrentFrame(); boxPath.transform(toSkMatrix(boxTrans)); if (first) { builder.add(boxPath, SkPathOp::kUnion_SkPathOp); @@ -796,11 +796,11 @@ SmartVectorPath *Canvas::getPathResultingFromCombine() { } const auto targetVP = newPath->getPathAnimator(); - const QMatrix firstTranf = newPath->getTotalTransform(); + const QTransform firstTranf = newPath->getTotalTransform(); for(const auto &box : mSelectedBoxes) { if(box == newPath) continue; if(const auto boxPath = enve_cast(box)) { - const QMatrix relTransf = boxPath->getTotalTransform()* + const QTransform relTransf = boxPath->getTotalTransform()* firstTranf.inverted(); const auto srcVP = boxPath->getPathAnimator(); srcVP->applyTransform(relTransf); diff --git a/src/core/conncontextptr.h b/src/core/conncontextptr.h index 127714b96..d8d1fb021 100644 --- a/src/core/conncontextptr.h +++ b/src/core/conncontextptr.h @@ -83,7 +83,7 @@ class ConnContextQSPtr { T* operator->() const { return mPtr.get(); } operator T*() const { return mPtr.get(); } - operator bool() const { return mPtr; } + operator bool() const { return !mPtr.isNull(); } T* operator*() const { return mPtr.get(); } ConnContext& operator<<(const QMetaObject::Connection& connection) { return mConnContext << connection; } diff --git a/src/core/customidentifier.cpp b/src/core/customidentifier.cpp index ce59bced4..7193dc97f 100644 --- a/src/core/customidentifier.cpp +++ b/src/core/customidentifier.cpp @@ -53,8 +53,8 @@ CustomIdentifier CustomIdentifier::sRead(eReadStream& src) { CustomIdentifier CustomIdentifier::sReadXEV(const QDomElement& ele) { CustomIdentifier id; - id.fEffectId = XmlExportHelpers::stringToInt(ele.attribute("id")); - id.fEffectName = XmlExportHelpers::stringToInt(ele.attribute("name")); + id.fEffectId = ele.attribute("id"); + id.fEffectName = ele.attribute("name"); const QString versionStr = ele.attribute("version"); id.fVersion = Version::sFromString(versionStr); return id; diff --git a/src/core/customidentifier.h b/src/core/customidentifier.h index d2f7c98ff..9e8e9ed5c 100644 --- a/src/core/customidentifier.h +++ b/src/core/customidentifier.h @@ -47,7 +47,7 @@ struct CORE_EXPORT CustomIdentifier { } static Version sFromString(const QString& str) { - const auto sep = str.splitRef('.'); + const auto sep = str.split('.'); if(sep.count() != 3) RuntimeThrow("Invalid Version format " + str); return {sep[0].toUInt(), sep[1].toUInt(), sep[2].toUInt()}; } diff --git a/src/core/eevent.cpp b/src/core/eevent.cpp index 5c76f5b8f..5e28aea74 100644 --- a/src/core/eevent.cpp +++ b/src/core/eevent.cpp @@ -25,6 +25,8 @@ #include "eevent.h" +#include "appsupport.h" + eEvent::eEvent(const QPointF& pos, const QPointF& lastPos, const QPointF& lastPressPos, const bool mouseGrabbing, const qreal scale, const QPoint& globalPos, @@ -68,7 +70,7 @@ eMouseEvent::eMouseEvent(const QPointF& pos, const QPointF& lastPos, QWidget* const widget) : eMouseEvent(e->source() != Qt::MouseEventNotSynthesized, pos, lastPos, lastPressPos, mouseGrabbing, - scale, e->globalPos(), e->button(), + scale, AppSupport::getMouseGlobalPos(e), e->button(), e->buttons(), e->modifiers(), e->timestamp(), releaseMouse, grabMouse, widget) {} diff --git a/src/core/matrixdecomposition.cpp b/src/core/matrixdecomposition.cpp index 3ab205368..8dafed940 100644 --- a/src/core/matrixdecomposition.cpp +++ b/src/core/matrixdecomposition.cpp @@ -26,7 +26,7 @@ #include "matrixdecomposition.h" #include "simplemath.h" -TransformValues MatrixDecomposition::decompose(const QMatrix &transform) { +TransformValues MatrixDecomposition::decompose(const QTransform &transform) { TransformValues result; result.fPivotX = 0; result.fPivotY = 0; @@ -69,7 +69,7 @@ TransformValues MatrixDecomposition::decompose(const QMatrix &transform) { } TransformValues MatrixDecomposition::decomposePivoted( - const QMatrix &transform, const QPointF &pivot) { + const QTransform &transform, const QPointF &pivot) { const TransformValues notPivoted = decompose(transform); TransformValues result = setPivotKeepTransform(notPivoted, pivot); return result; @@ -77,7 +77,7 @@ TransformValues MatrixDecomposition::decomposePivoted( TransformValues MatrixDecomposition::setPivotKeepTransform( const TransformValues &transform, const QPointF &newPivot) { - QMatrix newTransform; + QTransform newTransform; newTransform.translate(newPivot.x() + transform.fMoveX, newPivot.y() + transform.fMoveY); diff --git a/src/core/matrixdecomposition.h b/src/core/matrixdecomposition.h index b9ef054d2..74e72f632 100644 --- a/src/core/matrixdecomposition.h +++ b/src/core/matrixdecomposition.h @@ -30,9 +30,9 @@ namespace MatrixDecomposition { CORE_EXPORT - TransformValues decompose(const QMatrix& transform); + TransformValues decompose(const QTransform& transform); CORE_EXPORT - TransformValues decomposePivoted(const QMatrix& transform, + TransformValues decomposePivoted(const QTransform& transform, const QPointF& pivot); CORE_EXPORT TransformValues setPivotKeepTransform(const TransformValues& transform, diff --git a/src/core/namefixer.cpp b/src/core/namefixer.cpp index 61eb8c968..7ecc5f1e8 100644 --- a/src/core/namefixer.cpp +++ b/src/core/namefixer.cpp @@ -28,8 +28,9 @@ #include "Properties/property.h" QString NameFixer::stringScrapEndDigits(const QString &string) { - const QRegExp endNumbers(QStringLiteral("[0-9]+$")); - const int endNumbersIndex = endNumbers.indexIn(string); + const QRegularExpression endNumbers(QStringLiteral("[0-9]+$")); + QRegularExpressionMatch match = endNumbers.match(string); + const int endNumbersIndex = match.capturedStart(); QString trimmedName; if(endNumbersIndex >= 0) { return string.mid(0, endNumbersIndex); diff --git a/src/core/namefixer.h b/src/core/namefixer.h index ac98da19d..8fc898bcf 100644 --- a/src/core/namefixer.h +++ b/src/core/namefixer.h @@ -28,7 +28,7 @@ #include "core_global.h" -#include +#include #include namespace NameFixer { diff --git a/src/core/paintsettingsapplier.h b/src/core/paintsettingsapplier.h index 6a6d1c6c6..c9b24a8d7 100644 --- a/src/core/paintsettingsapplier.h +++ b/src/core/paintsettingsapplier.h @@ -103,7 +103,7 @@ class CORE_EXPORT GradientPtsPosSetting : public PaintSetting { class CORE_EXPORT GradientTransformSetting : public PaintSetting { public: GradientTransformSetting(const Target& target, - const QMatrix& trans) : + const QTransform& trans) : PaintSetting(target), mTransform(trans) {} protected: void applyToPS(PaintSettingsAnimator * const target) const { @@ -111,7 +111,7 @@ class CORE_EXPORT GradientTransformSetting : public PaintSetting { target->setGradientTransform(dec); } private: - const QMatrix mTransform; + const QTransform mTransform; }; class CORE_EXPORT GradientTypePaintSetting : public PaintSetting { diff --git a/src/core/pointhelpers.cpp b/src/core/pointhelpers.cpp index 3a3b2833a..d8ca70b1e 100644 --- a/src/core/pointhelpers.cpp +++ b/src/core/pointhelpers.cpp @@ -29,7 +29,7 @@ #include #include #include -#include +#include #include typedef std::complex cmplx; diff --git a/src/core/renderinstancesettings.cpp b/src/core/renderinstancesettings.cpp index 2a7595acb..a0536c09d 100644 --- a/src/core/renderinstancesettings.cpp +++ b/src/core/renderinstancesettings.cpp @@ -126,7 +126,6 @@ void RenderInstanceSettings::renderingAboutToStart() { mRenderSettings.fFrameInc = mRenderSettings.fBaseFps/mRenderSettings.fFps; } -#include void RenderInstanceSettings::setCurrentState(const RenderState &state, const QString &text) { mState = state; diff --git a/src/core/simplemath.cpp b/src/core/simplemath.cpp index 134d47048..03f2a7f00 100644 --- a/src/core/simplemath.cpp +++ b/src/core/simplemath.cpp @@ -265,7 +265,7 @@ bool nearlyEqual(double lhs, return std::abs(lhs - rhs) <= eps; } -QPointF mapLinear(const QMatrix &m, +QPointF mapLinear(const QTransform &m, const QPointF &p) { return {m.m11()*p.x() + m.m21()*p.y(), diff --git a/src/core/simplemath.h b/src/core/simplemath.h index c6e3847db..0c0214f8d 100644 --- a/src/core/simplemath.h +++ b/src/core/simplemath.h @@ -158,8 +158,10 @@ qreal clamp(const qreal val, const T1 &min, const T2 &max) { template float clamp(const float val, const T1 &min, const T2 &max) { static_assert((std::is_same::value || + std::is_same::value || std::is_same::value) && (std::is_same::value || + std::is_same::value || std::is_same::value), "float can be clamped only with ints and floats"); if(val > max) return max; @@ -204,7 +206,7 @@ extern bool nearlyEqual(double lhs, double rhs); CORE_EXPORT -QPointF mapLinear(const QMatrix& m, +QPointF mapLinear(const QTransform& m, const QPointF& p); #endif // SIMPLEMATH_H diff --git a/src/core/singlewidgettarget.cpp b/src/core/singlewidgettarget.cpp index f586425f2..b12e8fad9 100644 --- a/src/core/singlewidgettarget.cpp +++ b/src/core/singlewidgettarget.cpp @@ -170,7 +170,7 @@ void SingleWidgetTarget::SWT_readAbstractionXEV( const QDomElement& ele, const XevImporter& imp) const { const QString absOpenStr = ele.attribute("open"); if(absOpenStr.isEmpty()) return; - const auto absOpenStrs = absOpenStr.splitRef(' '); + const auto absOpenStrs = absOpenStr.split(' '); QList open; for(const auto& val : absOpenStrs) { open << XmlExportHelpers::stringToInt(val); diff --git a/src/core/skia/skqtconversions.cpp b/src/core/skia/skqtconversions.cpp index ab45376e5..5e3d7d819 100644 --- a/src/core/skia/skqtconversions.cpp +++ b/src/core/skia/skqtconversions.cpp @@ -58,8 +58,8 @@ SkRect toSkRect(const QRectF &rect) { // m12 - skewY // m21 - skewX // m22 - scaleY -QMatrix toQMatrix(const SkMatrix &matrix) { - return QMatrix(toQreal(matrix.getScaleX()), +QTransform toQTransform(const SkMatrix &matrix) { + return QTransform(toQreal(matrix.getScaleX()), toQreal(matrix.getSkewY()), toQreal(matrix.getSkewX()), toQreal(matrix.getScaleY()), @@ -67,7 +67,7 @@ QMatrix toQMatrix(const SkMatrix &matrix) { toQreal(matrix.getTranslateY())); } -SkMatrix toSkMatrix(const QMatrix &matrix) { +SkMatrix toSkMatrix(const QTransform &matrix) { SkMatrix skMatrix; skMatrix.reset(); skMatrix.set(SkMatrix::kMScaleX, toSkScalar(matrix.m11())); @@ -281,7 +281,7 @@ QFont toQFont(const SkFont &skfont, const int skPPI, const int qPPI) { typeface->getFamilyName(&family); qFont.setFamily(family.c_str()); qFont.setStretch(stretch); - qFont.setWeight(weight); + qFont.setWeight(static_cast(weight)); qFont.setStyle(style); qFont.setPointSizeF(skfont.getSize()*skPPI/qPPI); return qFont; diff --git a/src/core/skia/skqtconversions.h b/src/core/skia/skqtconversions.h index 3569563e5..a241c13f3 100644 --- a/src/core/skia/skqtconversions.h +++ b/src/core/skia/skqtconversions.h @@ -27,7 +27,7 @@ #define SKQTCONVERSIONS_H #include -#include +#include #include #include @@ -72,10 +72,10 @@ extern SkRect toSkRect(const QRectF &rect); // m21 - skewX // m22 - scaleY CORE_EXPORT -extern QMatrix toQMatrix(const SkMatrix &matrix); +extern QTransform toQTransform(const SkMatrix &matrix); CORE_EXPORT -extern SkMatrix toSkMatrix(const QMatrix &matrix); +extern SkMatrix toSkMatrix(const QTransform &matrix); extern inline QPointF toQPointF(const SkPoint &point) { return QPointF(toQreal(point.x()), diff --git a/src/core/smartPointers/eobject.h b/src/core/smartPointers/eobject.h index 5f75c4117..1072eea65 100644 --- a/src/core/smartPointers/eobject.h +++ b/src/core/smartPointers/eobject.h @@ -29,10 +29,12 @@ #include "../core_global.h" #define e_PROHIBIT_HEAP \ -private: \ +public: \ + static void* operator new(size_t, void* ptr) noexcept { return ptr; } \ + private: \ static void *operator new (size_t sz) { \ return std::malloc(sz); \ - } +} #define e_OBJECT \ friend class SelfRef; \ diff --git a/src/core/svgimporter.cpp b/src/core/svgimporter.cpp index 9a7d1744f..9f54d4426 100644 --- a/src/core/svgimporter.cpp +++ b/src/core/svgimporter.cpp @@ -95,7 +95,7 @@ struct SvgGradient { qreal fY1; qreal fX2; qreal fY2; - QMatrix fTrans; + QTransform fTrans; GradientType fType; QString fUnits; }; @@ -127,7 +127,7 @@ class FillSvgAttributes { GradientType mGradientType = GradientType::LINEAR; QPointF mGradientP1; QPointF mGradientP2; - QMatrix mGradientTransform; + QTransform mGradientTransform; }; class StrokeSvgAttributes : public FillSvgAttributes { @@ -162,7 +162,7 @@ class BoxSvgAttributes { void setParent(const BoxSvgAttributes &parent); SkPathFillType getFillRule() const; - const QMatrix &getRelTransform() const; + const QTransform &getRelTransform() const; const FillSvgAttributes &getFillAttributes() const; const StrokeSvgAttributes &getStrokeAttributes() const; const TextSvgAttributes &getTextAttributes() const; @@ -181,7 +181,7 @@ class BoxSvgAttributes { qreal mOpacity = 100; - QMatrix mRelTransform; + QTransform mRelTransform; QString mId; QString mLabel; @@ -283,7 +283,7 @@ bool toColor(const QString &colorStr, QColor &color) if (hasAlpha) { color.setAlphaF(a); } } else { return false; } } else { - if (QColor::isValidColor(colorStr.simplified())) { color = QColor(colorStr.simplified()); } + if (AppSupport::isValidColor(colorStr.simplified())) { color = QColor(colorStr.simplified()); } else { return false; } } return true; @@ -414,7 +414,7 @@ bool parsePolylineData(const QString &dataStr, while (str != end) { while(str->isSpace()) ++str; QChar endc = *end; - *const_cast(end) = 0; // parseNumbersArray requires 0-termination that QStringRef cannot guarantee + *const_cast(end) = QChar(); // parseNumbersArray requires 0-termination that QStringRef cannot guarantee QVarLengthArray arg; parseNumbersArray(str, arg); *const_cast(end) = endc; @@ -588,21 +588,23 @@ void loadLine(const QDomElement &pathElement, parentGroup->addContained(vectorPath); } -bool extractTranslation(const QString& str, QMatrix& target) { - const QRegExp rx1(RGXS "translate\\(" REGEX_SINGLE_FLOAT "\\)" RGXS, - Qt::CaseInsensitive); - if(rx1.exactMatch(str)) { - rx1.indexIn(str); - const QStringList capturedTxt = rx1.capturedTexts(); +bool extractTranslation(const QString& str, QTransform& target) { + const QRegularExpression rx1("^" RGXS "translate\\(" REGEX_SINGLE_FLOAT "\\)" RGXS "$", + QRegularExpression::CaseInsensitiveOption); + QRegularExpressionMatch match1 = rx1.match(str); + + if (match1.hasMatch()) { + const QStringList capturedTxt = match1.capturedTexts(); target.translate(capturedTxt.at(1).toDouble(), 0); return true; } - const QRegExp rx2(RGXS "translate\\(" REGEX_TWO_FLOATS "\\)" RGXS, - Qt::CaseInsensitive); - if(rx2.exactMatch(str)) { - rx2.indexIn(str); - const QStringList capturedTxt = rx2.capturedTexts(); + const QRegularExpression rx2("^" RGXS "translate\\(" REGEX_TWO_FLOATS "\\)" RGXS "$", + QRegularExpression::CaseInsensitiveOption); + QRegularExpressionMatch match2 = rx2.match(str); + + if (match2.hasMatch()) { + const QStringList capturedTxt = match2.capturedTexts(); target.translate(capturedTxt.at(1).toDouble(), capturedTxt.at(2).toDouble()); return true; @@ -612,22 +614,24 @@ bool extractTranslation(const QString& str, QMatrix& target) { } -bool extractScale(const QString& str, QMatrix& target) { - const QRegExp rx1(RGXS "scale\\(" REGEX_SINGLE_FLOAT "\\)" RGXS, - Qt::CaseInsensitive); - if(rx1.exactMatch(str)) { - rx1.indexIn(str); - const QStringList capturedTxt = rx1.capturedTexts(); +bool extractScale(const QString& str, QTransform& target) { + const QRegularExpression rx1("^" RGXS "scale\\(" REGEX_SINGLE_FLOAT "\\)" RGXS "$", + QRegularExpression::CaseInsensitiveOption); + QRegularExpressionMatch match1 = rx1.match(str); + + if (match1.hasMatch()) { + const QStringList capturedTxt = match1.capturedTexts(); const qreal scale = capturedTxt.at(1).toDouble(); target.scale(scale, scale); return true; } - const QRegExp rx2(RGXS "scale\\(" REGEX_TWO_FLOATS "\\)" RGXS, - Qt::CaseInsensitive); - if(rx2.exactMatch(str)) { - rx2.indexIn(str); - const QStringList capturedTxt = rx2.capturedTexts(); + const QRegularExpression rx2("^" RGXS "scale\\(" REGEX_TWO_FLOATS "\\)" RGXS "$", + QRegularExpression::CaseInsensitiveOption); + QRegularExpressionMatch match2 = rx2.match(str); + + if (match2.hasMatch()) { + const QStringList capturedTxt = match2.capturedTexts(); target.scale(capturedTxt.at(1).toDouble(), capturedTxt.at(2).toDouble()); return true; @@ -637,14 +641,14 @@ bool extractScale(const QString& str, QMatrix& target) { } bool extractRotate(const QString& str, - QMatrix& target) + QTransform& target) { - const QRegExp rxRotate("rotate\\s*\\(\\s*([^\\s,)]+)(?:[\\s,]+([^\\s,)]+)[\\s,]+([^\\s,)]+))?\\s*\\)", - Qt::CaseInsensitive); + const QRegularExpression rxRotate("rotate\\s*\\(\\s*([^\\s,)]+)(?:[\\s,]+([^\\s,)]+)[\\s,]+([^\\s,)]+))?\\s*\\)", + QRegularExpression::CaseInsensitiveOption); - int pos = rxRotate.indexIn(str); - if (pos != -1) { - const QStringList captured = rxRotate.capturedTexts(); + QRegularExpressionMatch match = rxRotate.match(str); + if (match.hasMatch()) { + const QStringList captured = match.capturedTexts(); bool ok; double angle = captured.at(1).toDouble(&ok); @@ -662,34 +666,39 @@ bool extractRotate(const QString& str, return true; } } + return false; } -bool extractWholeMatrix(const QString& str, QMatrix& target) { - const QRegExp rx(RGXS "matrix\\(" - REGEX_FIRST_FLOAT - REGEX_INNER_FLOAT - REGEX_INNER_FLOAT - REGEX_INNER_FLOAT - REGEX_INNER_FLOAT - REGEX_LAST_FLOAT - "\\)" RGXS, Qt::CaseInsensitive); - if(rx.exactMatch(str)) { - rx.indexIn(str); - const QStringList capturedTxt = rx.capturedTexts(); - target.setMatrix(capturedTxt.at(1).toDouble(), - capturedTxt.at(2).toDouble(), - capturedTxt.at(3).toDouble(), - capturedTxt.at(4).toDouble(), - capturedTxt.at(5).toDouble(), - capturedTxt.at(6).toDouble()); +bool extractWholeMatrix(const QString& str, QTransform& target) { + const QRegularExpression rx("^" RGXS "matrix\\(" + REGEX_FIRST_FLOAT + REGEX_INNER_FLOAT + REGEX_INNER_FLOAT + REGEX_INNER_FLOAT + REGEX_INNER_FLOAT + REGEX_LAST_FLOAT + "\\)" RGXS "$", + QRegularExpression::CaseInsensitiveOption); + + QRegularExpressionMatch match = rx.match(str); + + if (match.hasMatch()) { + const QStringList capturedTxt = match.capturedTexts(); + target = QTransform(capturedTxt.at(1).toDouble(), // m11 (a) + capturedTxt.at(2).toDouble(), // m12 (b) + capturedTxt.at(3).toDouble(), // m21 (c) + capturedTxt.at(4).toDouble(), // m22 (d) + capturedTxt.at(5).toDouble(), // dx (e) + capturedTxt.at(6).toDouble());// dy (f) return true; } + return false; } -QMatrix getMatrixFromString(const QString &str) { - QMatrix matrix; +QTransform getMatrixFromString(const QString &str) { + QTransform matrix; if(str.isEmpty()) return matrix; const bool found = str.isEmpty() || extractWholeMatrix(str, matrix) || @@ -733,7 +742,7 @@ void applyGradientToAttributes(const QDomElement &element, const SvgGradient &templateGrad = gGradients[gradId]; QPointF p1, p2; - QMatrix finalTransform; + QTransform finalTransform; if (templateGrad.fUnits == "objectBoundingBox") { qreal w = element.attribute("width").toDouble(); @@ -750,10 +759,10 @@ void applyGradientToAttributes(const QDomElement &element, p2 = QPointF((templateGrad.fX2 / divX) * w, (templateGrad.fY2 / divY) * h); - QMatrix m = templateGrad.fTrans; - finalTransform.setMatrix(m.m11(), m.m12(), - m.m21(), m.m22(), - m.dx() * w, m.dy() * h); + QTransform m = templateGrad.fTrans; + finalTransform.setMatrix(m.m11(), m.m12(), 0.0, + m.m21(), m.m22(), 0.0, + m.dx() * w, m.dy() * h, 1.0); } else { // userSpaceOnUse QPointF p1_world = templateGrad.fTrans.map(QPointF(templateGrad.fX1, @@ -765,7 +774,7 @@ void applyGradientToAttributes(const QDomElement &element, p2 = p2_world - offset; if (templateGrad.fType == GradientType::RADIAL) { - QMatrix trans = templateGrad.fTrans; + QTransform trans = templateGrad.fTrans; qreal scaleX = qSqrt(trans.m11()*trans.m11() + trans.m12()*trans.m12()); qreal scaleY = qSqrt(trans.m21()*trans.m21() + trans.m22()*trans.m22()); @@ -980,7 +989,7 @@ void loadElement(const QDomElement &element, gradient->addColor(stopColor); } } else { - if(linkId.at(0) == "#") linkId.remove(0, 1); + if (linkId.startsWith('#')) { linkId.remove(0, 1); } const auto it = gGradients.find(linkId); if(it == gGradients.end()) { gUnresolvedGradientLinks[linkId].append(id); @@ -1025,7 +1034,7 @@ void loadElement(const QDomElement &element, QPointF p1, p2; const QString units = element.attribute("gradientUnits"); const QString gradTrans = element.attribute("gradientTransform"); - QMatrix trans = getMatrixFromString(gradTrans); + QTransform trans = getMatrixFromString(gradTrans); if (units == "userSpaceOnUse") { if (type == GradientType::LINEAR) { @@ -1099,10 +1108,13 @@ void loadElement(const QDomElement &element, } bool getUrlId(const QString &urlStr, QString *id) { - const QRegExp rx = QRegExp(RGXS "url\\(\\s*#(.*)\\)" RGXS, Qt::CaseInsensitive); - if(rx.exactMatch(urlStr)) { - rx.indexIn(urlStr); - const QStringList capturedTxt = rx.capturedTexts(); + const QRegularExpression rx("^" RGXS "url\\(\\s*#(.*)\\)" RGXS "$", + QRegularExpression::CaseInsensitiveOption); + + QRegularExpressionMatch match = rx.match(urlStr); + + if (match.hasMatch()) { + const QStringList capturedTxt = match.capturedTexts(); *id = capturedTxt.at(1); return true; } @@ -1112,17 +1124,22 @@ bool getUrlId(const QString &urlStr, QString *id) { bool getGradientFromString(const QString &colorStr, FillSvgAttributes * const target) { - const QRegExp rx = QRegExp(RGXS "url\\(\\s*(.*)\\s*\\)" RGXS, Qt::CaseInsensitive); - if(rx.exactMatch(colorStr)) { - const QStringList capturedTxt = rx.capturedTexts(); + const QRegularExpression rx("^" RGXS "url\\(\\s*(.*)\\s*\\)" RGXS "$", + QRegularExpression::CaseInsensitiveOption); + + QRegularExpressionMatch match = rx.match(colorStr); + + if (match.hasMatch()) { + const QStringList capturedTxt = match.capturedTexts(); QString id = capturedTxt.at(1); - if(id.at(0) == '#') id.remove(0, 1); + if (id.startsWith('#')) id.remove(0, 1); const auto it = gGradients.find(id); - if(it != gGradients.end()) { + if (it != gGradients.end()) { target->setGradient(it.value()); return true; } } + return false; } @@ -1218,7 +1235,7 @@ SkPathFillType BoxSvgAttributes::getFillRule() const { return mFillRule; } -const QMatrix &BoxSvgAttributes::getRelTransform() const { +const QTransform &BoxSvgAttributes::getRelTransform() const { return mRelTransform; } diff --git a/src/core/svgo.cpp b/src/core/svgo.cpp index e0a1da0ca..7fc9e7c57 100644 --- a/src/core/svgo.cpp +++ b/src/core/svgo.cpp @@ -30,12 +30,21 @@ using namespace Friction::Core; QString SVGO::optimize(const QString &svg) { QDomDocument doc; - QString errorMsg; + +#if QT_VERSION >= QT_VERSION_CHECK(6, 5, 0) + const auto parseResult = doc.setContent(svg); + if (!parseResult) { + qWarning() << "Failed to read SVG:" << parseResult.errorMessage; + return svg; + } +#else + QString errorMsg; if (!doc.setContent(svg, &errorMsg)) { qWarning() << "Failed to read SVG:" << errorMsg; return svg; } +#endif removeProcessingInstructions(doc); removeUselessDefs(doc); diff --git a/src/core/texteffect.cpp b/src/core/texteffect.cpp index 586a0770d..f008b07ac 100644 --- a/src/core/texteffect.cpp +++ b/src/core/texteffect.cpp @@ -302,7 +302,7 @@ QMimeData *TextEffect::SWT_createMimeData() { return new eMimeData(QList() << this); } -QMatrix TextEffect::getTransform(const qreal relFrame, +QTransform TextEffect::getTransform(const qreal relFrame, const qreal influence, const QPointF& addPivot) const { const auto pivotAnim = mTransform->getPivotAnimator(); @@ -313,7 +313,7 @@ QMatrix TextEffect::getTransform(const qreal relFrame, const qreal yScale = scaleAnim->getEffectiveYValue(relFrame); const qreal xPivot = pivotAnim->getEffectiveXValue(relFrame) + addPivot.x(); const qreal yPivot = pivotAnim->getEffectiveYValue(relFrame) + addPivot.y(); - QMatrix transform; + QTransform transform; transform.translate(xPivot + posAnim->getEffectiveXValue(relFrame)*influence, yPivot + posAnim->getEffectiveYValue(relFrame)*influence); transform.rotate(rotAnim->getEffectiveValue(relFrame)*influence); diff --git a/src/core/texteffect.h b/src/core/texteffect.h index d8a5d7807..f91e5d7e3 100644 --- a/src/core/texteffect.h +++ b/src/core/texteffect.h @@ -67,7 +67,7 @@ class CORE_EXPORT TextEffect : public eEffect { qreal getGuideLineWidth() const; qreal getGuideLineHeight() const; private: - QMatrix getTransform(const qreal relFrame, + QTransform getTransform(const qreal relFrame, const qreal influence, const QPointF &addPivot) const; diff --git a/src/core/themesupport.cpp b/src/core/themesupport.cpp index 2aa79ed41..cc666ec16 100644 --- a/src/core/themesupport.cpp +++ b/src/core/themesupport.cpp @@ -27,8 +27,8 @@ #include #include #include -#include #include +#include const QString ThemeSupport::getAppIconName(const bool alt) { @@ -231,7 +231,8 @@ const QString ThemeSupport::getThemeStyle(int iconSize) css = stylesheet.readAll(); stylesheet.close(); } - const qreal iconPixelRatio = iconSize * qApp->desktop()->devicePixelRatioF(); + QScreen *screen = QGuiApplication::primaryScreen(); + const qreal iconPixelRatio = iconSize * (screen ? screen->devicePixelRatio() : 1.0); return css.arg(getThemeButtonBaseColor().name(), getThemeButtonBorderColor().name(), getThemeBaseDarkerColor().name(), diff --git a/src/core/transformvalues.cpp b/src/core/transformvalues.cpp index 091877e1a..e24ac5de5 100644 --- a/src/core/transformvalues.cpp +++ b/src/core/transformvalues.cpp @@ -25,8 +25,8 @@ #include "transformvalues.h" -QMatrix TransformValues::calculate() const { - QMatrix result; +QTransform TransformValues::calculate() const { + QTransform result; result.translate(fPivotX + fMoveX, fPivotY + fMoveY); result.rotate(fRotation); result.scale(fScaleX, fScaleY); diff --git a/src/core/transformvalues.h b/src/core/transformvalues.h index b25b6911d..1fe307e3b 100644 --- a/src/core/transformvalues.h +++ b/src/core/transformvalues.h @@ -26,7 +26,7 @@ #ifndef TRANSFORMVALUES_H #define TRANSFORMVALUES_H -#include +#include #include "core_global.h" @@ -41,7 +41,7 @@ struct CORE_EXPORT TransformValues { qreal fShearX = 0; qreal fShearY = 0; - QMatrix calculate() const; + QTransform calculate() const; }; #endif // TRANSFORMVALUES_H diff --git a/src/scripts/ci.sh b/src/scripts/ci.sh index a7061bce6..1cf8e8053 100755 --- a/src/scripts/ci.sh +++ b/src/scripts/ci.sh @@ -6,8 +6,7 @@ # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. +# the Free Software Foundation, version 3. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -18,13 +17,22 @@ # along with this program. If not, see . # -# Friction CI (Ubuntu 22.04) +# Friction Ubuntu CI set -e -x CI=${CI:-0} APT=${APT:-0} PC=${PC:-""} +QT6=${QT6:-"OFF"} +CPU=${CPU:-"x86_64"} # or aarch64 +FFMPEG=${FFMPEG:-0} + +if [ "${QT6}" = "ON" ]; then + QTV=6 +else + QTV=5 +fi if [ "${APT}" = 1 ]; then sudo apt update -y @@ -41,18 +49,9 @@ libfreetype-dev \ libavcodec-dev \ libavformat-dev \ libavutil-dev \ -libqscintilla2-qt5-dev \ -libqt5opengl5-dev \ -libqt5svg5-dev \ libswresample-dev \ libswscale-dev \ libunwind-dev \ -qtbase5-dev-tools \ -qtbase5-dev \ -qtdeclarative5-dev-tools \ -qtdeclarative5-dev \ -qtmultimedia5-dev \ -qttools5-dev-tools \ libexpat1-dev \ libfreetype-dev \ libjpeg-turbo8-dev \ @@ -60,11 +59,39 @@ libpng-dev \ libwebp-dev \ zlib1g-dev \ libicu-dev \ -libharfbuzz-dev +libharfbuzz-dev \ +libgl1-mesa-dev \ +libegl1-mesa-dev \ +libgles2-mesa-dev \ +nasm \ +yasm + +if [ "${QT6}" = "ON" ]; then +sudo apt install -y \ +libqscintilla2-qt6-dev \ +qt6-base-dev-tools \ +qt6-base-dev \ +qt6-declarative-dev-tools \ +qt6-declarative-dev \ +qt6-multimedia-dev \ +qt6-tools-dev-tools \ +qt6-tools-dev +else +sudo apt install -y \ +libqscintilla2-qt5-dev \ +libqt5opengl5-dev \ +qtbase5-dev-tools \ +qtbase5-dev \ +qtdeclarative5-dev-tools \ +qtdeclarative5-dev \ +qtmultimedia5-dev \ +qttools5-dev-tools +fi + fi if [ "${CI}" = 1 ]; then - git submodule update -i --recursive + git submodule update --init --recursive fi if [ "${PC}" != "" ]; then @@ -73,25 +100,44 @@ fi CWD=`pwd` MKJOBS=${MKJOBS:-4} -COMMIT=`git rev-parse --short=8 HEAD` -BRANCH=`git rev-parse --abbrev-ref HEAD` -if [ "${BRANCH}" = "main" ]; then - BRANCH="" -fi +FFMPEG_URL=https://github.com/friction2d/ffmpeg +FFMPEG_COMMIT=44b01dbdbe3a742b5d006a7187b63a8a30293a45 +FFMPEG_INSTALL=${CWD}/build-ci/ffmpeg-install cd ${CWD} rm -rf build-ci || true mkdir build-ci cd build-ci +if [ "${FFMPEG}" = 1 ]; then + git clone ${FFMPEG_URL} ffmpeg-src + cd ffmpeg-src + ./configure \ + --enable-shared \ + --disable-static \ + --prefix=${FFMPEG_INSTALL} \ + --enable-gpl \ + --enable-version3 \ + --disable-programs \ + --disable-debug \ + --disable-doc + make -j${MKJOBS} + make install + export PKG_CONFIG_PATH=${FFMPEG_INSTALL}/lib/pkgconfig:${PKG_CONFIG_PATH} + export LD_LIBRARY_PATH=${FFMPEG_INSTALL}/lib:${LD_LIBRARY_PATH} +fi + +cd ${CWD}/build-ci + cmake -G Ninja \ -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_INSTALL_PREFIX=/usr \ -DCMAKE_CXX_COMPILER=clang++ \ -DCMAKE_C_COMPILER=clang \ --DGIT_COMMIT=${COMMIT} \ --DGIT_BRANCH=${BRANCH} \ +-DQSCINTILLA_INCLUDE_DIRS=/usr/include/${CPU}-linux-gnu/qt${QTV} \ +-DQSCINTILLA_LIBRARIES=qscintilla2_qt${QTV} \ +-DUSE_QT6=${QT6} \ .. cmake --build . -cpack -G DEB +#cpack -G DEB diff --git a/src/ui/CMakeLists.txt b/src/ui/CMakeLists.txt index bbf4461c1..af0b08be4 100644 --- a/src/ui/CMakeLists.txt +++ b/src/ui/CMakeLists.txt @@ -123,6 +123,7 @@ endif() set( HEADERS ui_global.h + enterevent.h dialogs/adjustscenedialog.h dialogs/applyexpressiondialog.h dialogs/commandpalette.h diff --git a/src/ui/dialogs/exportsvgdialog.cpp b/src/ui/dialogs/exportsvgdialog.cpp index 67fbd6543..88d3ea60a 100644 --- a/src/ui/dialogs/exportsvgdialog.cpp +++ b/src/ui/dialogs/exportsvgdialog.cpp @@ -372,26 +372,28 @@ ComplexTask* ExportSvgDialog::exportTo(const QString& file, void ExportSvgDialog::finishedDialog(const QString &fileName) { - const QString askOpenFile = tr("Open File"); - const QString askOpenFolder = tr("Open Folder"); - const QString askClose = tr("Close"); - const int ask = QMessageBox::information(this, - tr("SVG export finished"), - tr("Project exported to %1.").arg(fileName), - askOpenFile, - askOpenFolder, - askClose, - 2, - 2); + QMessageBox msgBox(QMessageBox::Information, + tr("SVG export finished"), + tr("Project exported to %1.").arg(fileName), + QMessageBox::NoButton, + this); + + const auto openFileButton = msgBox.addButton(tr("Open File"), + QMessageBox::ActionRole); + const auto openFolderButton = msgBox.addButton(tr("Open Folder"), + QMessageBox::ActionRole); + const auto closeButton = msgBox.addButton(tr("Close"), + QMessageBox::RejectRole); + + msgBox.setDefaultButton(closeButton); + msgBox.exec(); + QUrl url; - switch (ask) { - case 0: + if (msgBox.clickedButton() == openFileButton) { url = QUrl::fromLocalFile(fileName); - break; - case 1: + } else if (msgBox.clickedButton() == openFolderButton) { url = QUrl::fromLocalFile(QFileInfo(fileName).absolutePath()); - break; - default:; } + if (!url.isEmpty()) { QDesktopServices::openUrl(url); } } diff --git a/src/ui/enterevent.h b/src/ui/enterevent.h new file mode 100644 index 000000000..4219fb827 --- /dev/null +++ b/src/ui/enterevent.h @@ -0,0 +1,36 @@ +/* +# +# Friction - https://friction.graphics +# +# Copyright (c) Ole-André Rodlie and contributors +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, version 3. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# +# See 'README.md' for more information. +# +*/ + +#ifndef UI_ENTEREVENT_H +#define UI_ENTEREVENT_H + +#include + +#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) +#include +using QtEnterEvent = QEnterEvent; +#else +#include +using QtEnterEvent = QEvent; +#endif + +#endif // UI_ENTEREVENT_H diff --git a/src/ui/gradientwidgets/currentgradientwidget.cpp b/src/ui/gradientwidgets/currentgradientwidget.cpp index d28fe2282..fa477f142 100644 --- a/src/ui/gradientwidgets/currentgradientwidget.cpp +++ b/src/ui/gradientwidgets/currentgradientwidget.cpp @@ -159,10 +159,11 @@ void CurrentGradientWidget::colorLeftPress(const int x) { } void CurrentGradientWidget::mousePressEvent(QMouseEvent *event) { - if(event->button() == Qt::RightButton) { - colorRightPress(event->x(), event->globalPos()); - } else if(event->button() == Qt::LeftButton) { - colorLeftPress(event->x()); + if (event->button() == Qt::RightButton) { + colorRightPress(AppSupport::getMouseX(event), + AppSupport::getMouseGlobalPos(event)); + } else if (event->button() == Qt::LeftButton) { + colorLeftPress(AppSupport::getMouseX(event)); } } @@ -213,14 +214,14 @@ void CurrentGradientWidget::mouseMoveEvent(QMouseEvent *event) { mGradient->saveOrder(); } const int nCols = mGradient->ca_getNumberOfChildren(); - const int colorId = clampInt(event->x()*nCols/width(), 0, nCols - 1); + const int colorId = clampInt(AppSupport::getMouseX(event) * nCols/width(), 0, nCols - 1); if(colorId != mColorId) { mGradient->swapChildrenTemporary(mColorId, colorId); setCurrentColorId(colorId); Document::sInstance->updateScenes(); } } - mHoveredX = event->x(); + mHoveredX = AppSupport::getMouseX(event); update(); } diff --git a/src/ui/gradientwidgets/displayedgradientswidget.cpp b/src/ui/gradientwidgets/displayedgradientswidget.cpp index 880bdf51e..3e0f92b5c 100644 --- a/src/ui/gradientwidgets/displayedgradientswidget.cpp +++ b/src/ui/gradientwidgets/displayedgradientswidget.cpp @@ -286,11 +286,11 @@ void DisplayedGradientsWidget::gradientContextMenuReq( } void DisplayedGradientsWidget::mousePressEvent(QMouseEvent *event) { - const int gradientId = event->y()/eSizesUI::widget; + const int gradientId = AppSupport::getMouseY(event) / eSizesUI::widget; if(event->button() == Qt::LeftButton) { gradientLeftPressed(gradientId); } else if(event->button() == Qt::RightButton) { - gradientContextMenuReq(gradientId, event->globalPos()); + gradientContextMenuReq(gradientId, AppSupport::getMouseGlobalPos(event)); const QPoint relCursorPos = mapFromGlobal(QCursor::pos()); if(relCursorPos.x() < 0 || relCursorPos.y() < 0 || relCursorPos.x() > width() || relCursorPos.y() > height()) { @@ -303,7 +303,7 @@ void DisplayedGradientsWidget::mousePressEvent(QMouseEvent *event) { } void DisplayedGradientsWidget::mouseMoveEvent(QMouseEvent *event) { - mHoveredGradientId = event->y()/eSizesUI::widget; + mHoveredGradientId = AppSupport::getMouseY(event) / eSizesUI::widget; update(); } diff --git a/src/ui/gradientwidgets/gradientwidget.cpp b/src/ui/gradientwidgets/gradientwidget.cpp index 63e93da81..f7815af8d 100644 --- a/src/ui/gradientwidgets/gradientwidget.cpp +++ b/src/ui/gradientwidgets/gradientwidget.cpp @@ -50,7 +50,7 @@ GradientWidget::GradientWidget(QWidget * const parent) setContentsMargins(0, 0, 0, 0); const auto mMainLayout = new QVBoxLayout(this); - mMainLayout->setMargin(0); + mMainLayout->setContentsMargins(0, 0, 0, 0); mGradientsListWidget = new GradientsListWidget(this); mCurrentGradientWidget = new CurrentGradientWidget(this); diff --git a/src/ui/widgets/assetswidget.cpp b/src/ui/widgets/assetswidget.cpp index eadd1fb96..86533f82c 100644 --- a/src/ui/widgets/assetswidget.cpp +++ b/src/ui/widgets/assetswidget.cpp @@ -155,7 +155,7 @@ AssetsWidget::AssetsWidget(QWidget *parent) setAutoFillBackground(true); setContentsMargins(0, 10, 0, 0); QVBoxLayout *mLayout = new QVBoxLayout(this); - mLayout->setMargin(0); + mLayout->setContentsMargins(0, 0, 0, 0); mTree = new AssetsTreeWidget(this); mLayout->addWidget(mTree); diff --git a/src/ui/widgets/buttonbase.cpp b/src/ui/widgets/buttonbase.cpp index 6571d5d7a..72ee43eb2 100644 --- a/src/ui/widgets/buttonbase.cpp +++ b/src/ui/widgets/buttonbase.cpp @@ -48,7 +48,7 @@ void ButtonBase::mousePressEvent(QMouseEvent *) { emit pressed(); } -void ButtonBase::enterEvent(QEvent *) { +void ButtonBase::enterEvent(QtEnterEvent *) { mHover = true; update(); } diff --git a/src/ui/widgets/buttonbase.h b/src/ui/widgets/buttonbase.h index 6db0f1b89..82f08507e 100644 --- a/src/ui/widgets/buttonbase.h +++ b/src/ui/widgets/buttonbase.h @@ -27,6 +27,7 @@ #define BUTTONBASE_H #include "ui_global.h" +#include "enterevent.h" #include @@ -40,7 +41,7 @@ class UI_EXPORT ButtonBase : public QWidget protected: void mouseReleaseEvent(QMouseEvent *) final; void mousePressEvent(QMouseEvent *) final; - void enterEvent(QEvent *) final; + void enterEvent(QtEnterEvent *event) final; void leaveEvent(QEvent *) final; void paintEvent(QPaintEvent *) final; diff --git a/src/ui/widgets/buttonslist.cpp b/src/ui/widgets/buttonslist.cpp index 9216e1ceb..387764bf2 100644 --- a/src/ui/widgets/buttonslist.cpp +++ b/src/ui/widgets/buttonslist.cpp @@ -58,8 +58,6 @@ ButtonsList::ButtonsList(const TextTriggerGetter& getter, setLayout(recentLay); - const QFontMetrics fm = QApplication::fontMetrics(); - for (int i = 0; i < count; i++) { const auto textTrigger = getter(i); const auto pathButton = new ElidedButton(textTrigger.first, this); diff --git a/src/ui/widgets/changewidthwidget.cpp b/src/ui/widgets/changewidthwidget.cpp index b9c408eeb..991a09fc1 100644 --- a/src/ui/widgets/changewidthwidget.cpp +++ b/src/ui/widgets/changewidthwidget.cpp @@ -26,6 +26,7 @@ #include "changewidthwidget.h" #include "GUI/global.h" #include "simplemath.h" +#include "appsupport.h" #include #include @@ -54,17 +55,19 @@ void ChangeWidthWidget::paintEvent(QPaintEvent *) { p.end(); } -void ChangeWidthWidget::mouseMoveEvent(QMouseEvent *event) { - const int newWidth = mCurrentWidth + event->x() - mPressX; +void ChangeWidthWidget::mouseMoveEvent(QMouseEvent *event) +{ + const int newWidth = mCurrentWidth + AppSupport::getMouseX(event) - mPressX; mCurrentWidth = clamp(newWidth, 10*eSizesUI::widget, 40*eSizesUI::widget); emit widthSet(mCurrentWidth); //mBoxesList->setFixedWidth(newWidth); updatePos(); } -void ChangeWidthWidget::mousePressEvent(QMouseEvent *event) { +void ChangeWidthWidget::mousePressEvent(QMouseEvent *event) +{ mPressed = true; - mPressX = event->x(); + mPressX = AppSupport::getMouseX(event); update(); } @@ -73,7 +76,7 @@ void ChangeWidthWidget::mouseReleaseEvent(QMouseEvent *) { update(); } -void ChangeWidthWidget::enterEvent(QEvent *) { +void ChangeWidthWidget::enterEvent(QtEnterEvent *) { mHover = true; update(); } diff --git a/src/ui/widgets/changewidthwidget.h b/src/ui/widgets/changewidthwidget.h index 8b2d0aaf7..c9b563fd9 100644 --- a/src/ui/widgets/changewidthwidget.h +++ b/src/ui/widgets/changewidthwidget.h @@ -27,6 +27,7 @@ #define CHANGEWIDTHWIDGET_H #include "ui_global.h" +#include "enterevent.h" #include @@ -45,7 +46,7 @@ class UI_EXPORT ChangeWidthWidget : public QWidget void mousePressEvent(QMouseEvent *event); void mouseReleaseEvent(QMouseEvent *); - void enterEvent(QEvent *); + void enterEvent(QtEnterEvent *); void leaveEvent(QEvent *); int getCurrentWidth() { diff --git a/src/ui/widgets/colorlabel.cpp b/src/ui/widgets/colorlabel.cpp index aaa6fc539..07c338908 100644 --- a/src/ui/widgets/colorlabel.cpp +++ b/src/ui/widgets/colorlabel.cpp @@ -49,7 +49,7 @@ void ColorLabel::mousePressEvent(QMouseEvent *e) } QMenu menu(this); menu.addAction(QIcon::fromTheme("color"), tr("Bookmark Color")); - const auto act = menu.exec(e->globalPos()); + const auto act = menu.exec(AppSupport::getMouseGlobalPos(e)); if (act) { if (act->text() == tr("Bookmark Color")) { const QColor col = QColor::fromHsvF(qreal(mHue), diff --git a/src/ui/widgets/colorsettingswidget.cpp b/src/ui/widgets/colorsettingswidget.cpp index 1c0f3bf15..0e6a41f4d 100644 --- a/src/ui/widgets/colorsettingswidget.cpp +++ b/src/ui/widgets/colorsettingswidget.cpp @@ -305,7 +305,7 @@ ColorSettingsWidget::ColorSettingsWidget(QWidget *parent) : QWidget(parent) { setContentsMargins(0, 0, 0, 0); - mWidgetsLayout->setMargin(0); + mWidgetsLayout->setContentsMargins(0, 0, 0, 0); mTabWidget->setFocusPolicy(Qt::NoFocus); diff --git a/src/ui/widgets/colortoolbutton.cpp b/src/ui/widgets/colortoolbutton.cpp index f85c52bf3..0d4d85bda 100644 --- a/src/ui/widgets/colortoolbutton.cpp +++ b/src/ui/widgets/colortoolbutton.cpp @@ -96,7 +96,6 @@ ColorToolButton::ColorToolButton(Document& document, const auto mainLay = new QVBoxLayout(this); mainLay->setContentsMargins(0, 0, 0, 0); - mainLay->setMargin(0); mainLay->addWidget(mColorLabel); addAction(mColorAct); diff --git a/src/ui/widgets/colorvaluerect.cpp b/src/ui/widgets/colorvaluerect.cpp index 6f59dbd39..252b94a8f 100644 --- a/src/ui/widgets/colorvaluerect.cpp +++ b/src/ui/widgets/colorvaluerect.cpp @@ -71,7 +71,7 @@ void ColorValueRect::paintGL() { } void ColorValueRect::mouseMoveEvent(QMouseEvent *e) { - mouseInteraction(e->x()); + mouseInteraction(AppSupport::getMouseX(e)); Document::sInstance->updateScenes(); } @@ -79,7 +79,7 @@ void ColorValueRect::mousePressEvent(QMouseEvent *e) { if(e->button() == Qt::RightButton) return; Actions::sInstance->startSmoothChange(); emit editingStarted(value()); - mouseInteraction(e->x()); + mouseInteraction(AppSupport::getMouseX(e)); Document::sInstance->updateScenes(); } diff --git a/src/ui/widgets/fillstrokesettings.cpp b/src/ui/widgets/fillstrokesettings.cpp index d75554812..b9cb8a986 100644 --- a/src/ui/widgets/fillstrokesettings.cpp +++ b/src/ui/widgets/fillstrokesettings.cpp @@ -107,7 +107,7 @@ FillStrokeSettingsWidget::FillStrokeSettingsWidget(Document &document, const auto lineLayout = new QHBoxLayout(lineWidget); lineWidget->setContentsMargins(0, 0, 0 ,0); - lineLayout->setMargin(0); + lineLayout->setContentsMargins(0, 0, 0, 0); const auto lineLabel = new QLabel(tr("Width"), this); @@ -143,14 +143,14 @@ FillStrokeSettingsWidget::FillStrokeSettingsWidget(Document &document, const auto mStrokeJoinCapLayout = new QVBoxLayout(mStrokeJoinCapWidget); mStrokeJoinCapWidget->setContentsMargins(0, 0, 0, 0); - mStrokeJoinCapLayout->setMargin(0); + mStrokeJoinCapLayout->setContentsMargins(0, 0, 0, 0); // join const auto mJoinStyleWidget = new QWidget(this); const auto mJoinStyleLayout = new QHBoxLayout(mJoinStyleWidget); mJoinStyleWidget->setContentsMargins(0, 0, 0, 0); - mJoinStyleLayout->setMargin(0); + mJoinStyleLayout->setContentsMargins(0, 0, 0, 0); mBevelJoinStyleButton = new QPushButton(QIcon::fromTheme("joinBevel"), QString(), this); @@ -189,7 +189,7 @@ FillStrokeSettingsWidget::FillStrokeSettingsWidget(Document &document, const auto mCapStyleLayout = new QHBoxLayout(mCapStyleWidget); mCapStyleWidget->setContentsMargins(0, 0, 0, 0); - mCapStyleLayout->setMargin(0); + mCapStyleLayout->setContentsMargins(0, 0, 0, 0); mFlatCapStyleButton = new QPushButton(QIcon::fromTheme("capFlat"), QString(), this); @@ -231,7 +231,7 @@ FillStrokeSettingsWidget::FillStrokeSettingsWidget(Document &document, const auto mGradientTypeLayout = new QHBoxLayout(mGradientTypeWidget); mGradientTypeWidget->setContentsMargins(0, 0, 0, 0); - mGradientTypeLayout->setMargin(0); + mGradientTypeLayout->setContentsMargins(0, 0, 0, 0); mLinearGradientButton = new QPushButton(QIcon::fromTheme("fill_gradient_2"), tr("Linear"), this); mRadialGradientButton = new QPushButton(QIcon::fromTheme("fill_gradient_radial_2"), tr("Radial"), this); @@ -282,7 +282,7 @@ FillStrokeSettingsWidget::FillStrokeSettingsWidget(Document &document, const auto mStrokeSettingsLayout = new QHBoxLayout(mStrokeSettingsWidget); mStrokeSettingsWidget->setContentsMargins(0, 0, 0, 0); - mStrokeSettingsLayout->setMargin(0); + mStrokeSettingsLayout->setContentsMargins(0, 0, 0, 0); mStrokeSettingsLayout->addWidget(lineWidget); mStrokeSettingsLayout->addWidget(mStrokeJoinCapWidget); @@ -291,7 +291,7 @@ FillStrokeSettingsWidget::FillStrokeSettingsWidget(Document &document, const auto mTargetLayout = new QHBoxLayout(mTargetWidget); mTargetWidget->setContentsMargins(0, 0, 0, 0); - mTargetLayout->setMargin(0); + mTargetLayout->setContentsMargins(0, 0, 0, 0); mTargetLayout->addWidget(mFillTargetButton); mTargetLayout->addWidget(mStrokeTargetButton); @@ -300,7 +300,7 @@ FillStrokeSettingsWidget::FillStrokeSettingsWidget(Document &document, const auto mColorTypeLayout = new QHBoxLayout(mColorTypeWidget); mColorTypeWidget->setContentsMargins(0, 0, 0, 0); - mColorTypeLayout->setMargin(0); + mColorTypeLayout->setContentsMargins(0, 0, 0, 0); mColorTypeLayout->addWidget(mFillNoneButton); mColorTypeLayout->addWidget(mFillFlatButton); @@ -321,7 +321,6 @@ FillStrokeSettingsWidget::FillStrokeSettingsWidget(Document &document, const auto mLayout = new QVBoxLayout(this); mLayout->setContentsMargins(0, 0, 0, 0); - mLayout->setMargin(0); mFillAndStrokeWidget->setObjectName("DarkWidget"); if (noScroll) { diff --git a/src/ui/widgets/flowlayout.cpp b/src/ui/widgets/flowlayout.cpp index fa17a785c..1f68ddca2 100644 --- a/src/ui/widgets/flowlayout.cpp +++ b/src/ui/widgets/flowlayout.cpp @@ -108,7 +108,9 @@ QSize FlowLayout::minimumSize() const { for(const auto item : mItemList) size = size.expandedTo(item->minimumSize()); - size += QSize(2*margin(), 2*margin()); + QMargins margins = contentsMargins(); + size += QSize(margins.left() + margins.right(), + margins.top() + margins.bottom()); return size; } diff --git a/src/ui/widgets/fontswidget.cpp b/src/ui/widgets/fontswidget.cpp index 9ca055106..8d385a9f9 100644 --- a/src/ui/widgets/fontswidget.cpp +++ b/src/ui/widgets/fontswidget.cpp @@ -110,7 +110,7 @@ FontsWidget::FontsWidget(QWidget *parent, fontFamilyWidget->setContentsMargins(0, 0, 0, 0); QHBoxLayout *fontFamilyLayout = new QHBoxLayout(fontFamilyWidget); - fontFamilyLayout->setMargin(0); + fontFamilyLayout->setContentsMargins(0, 0, 0, 0); fontFamilyLayout->addWidget(mFontFamilyCombo); fontFamilyLayout->addWidget(mFontStyleCombo); @@ -224,7 +224,14 @@ void FontsWidget::updateStyles() const QString currentStyle = fontStyle(); mFontStyleCombo->clear(); - QStringList styles = mFontDatabase.styles(fontFamily()); + +#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) + QStringList styles = QFontDatabase::styles(fontFamily()); +#else + QFontDatabase db; + QStringList styles = db.styles(fontFamily()); +#endif + mFontStyleCombo->addItems(styles); if (styles.contains(currentStyle)) { @@ -246,7 +253,13 @@ void FontsWidget::afterStyleChange() const QStringList FontsWidget::filterFonts() { - QStringList families = mFontDatabase.families(); +#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) + QStringList families = QFontDatabase::families(); +#else + QFontDatabase db; + QStringList families = db.families(); +#endif + // "if the font family is available from two or more foundries the foundry name is included in the family name" // Yeah, that's not going to work. I get a lot of "family name [Bits]" and "family name [unknown]" from the font database. @@ -258,7 +271,7 @@ const QStringList FontsWidget::filterFonts() QString font = families.at(i); if (font.startsWith(".")) { continue; } // get a lot of .someKindOfFont on macOS, ignore! if (font.contains("[") && font.contains("]")) { - fonts << font.remove(QRegExp("\\[(.*)\\]")).trimmed(); + fonts << font.remove(QRegularExpression("\\[(.*)\\]")).trimmed(); } else { fonts << font; } } fonts.removeDuplicates(); @@ -451,13 +464,21 @@ void FontsWidget::emitFamilyAndStyleChanged() if (mBlockEmit) { return; } const auto family = fontFamily(); const auto style = fontStyle(); - const int qWeight = mFontDatabase.weight(family, style); + +#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) + const int qWeight = QFontDatabase::weight(family, style); + const auto qFont = QFontDatabase::font(family, style, 10); +#else + QFontDatabase db; + const int qWeight = db.weight(family, style); + const auto qFont = db.font(family, style, 10); +#endif + const int weight = QFontWeightToSkFontWeight(qWeight); const int width = SkFontStyle::kNormal_Width; // const bool italic = mFontDatabase.italic(family, style); // const auto slant = italic ? SkFontStyle::kItalic_Slant : // SkFontStyle::kUpright_Slant; - const auto qFont = mFontDatabase.font(family, style, 10); const auto slant = toSkSlant(qFont.style()); const SkFontStyle skStyle(weight, width, slant); emit fontFamilyAndStyleChanged(family, skStyle); diff --git a/src/ui/widgets/fontswidget.h b/src/ui/widgets/fontswidget.h index e3f8087ed..e1c07a443 100644 --- a/src/ui/widgets/fontswidget.h +++ b/src/ui/widgets/fontswidget.h @@ -103,8 +103,6 @@ namespace Friction QPushButton *mAlignVCenter; QPushButton *mAlignBottom; - QFontDatabase mFontDatabase; - QPlainTextEdit *mTextInput; ConnContextQPtr mBoxTarget; diff --git a/src/ui/widgets/framescrollbar.cpp b/src/ui/widgets/framescrollbar.cpp index 74c02bc31..3fe3978e4 100644 --- a/src/ui/widgets/framescrollbar.cpp +++ b/src/ui/widgets/framescrollbar.cpp @@ -367,7 +367,7 @@ void FrameScrollBar::mousePressEvent(QMouseEvent *event) menu.addSeparator(); menu.addAction(splitDurationAct); - QAction* selectedAction = menu.exec(event->globalPos()); + QAction* selectedAction = menu.exec(AppSupport::getMouseGlobalPos(event)); if (selectedAction) { /*if (selectedAction == clampAction) { mClamp = !mClamp; @@ -428,7 +428,7 @@ void FrameScrollBar::mousePressEvent(QMouseEvent *event) return; } mPressed = true; - mLastMousePressFrame = posToFrame(event->x() ); + mLastMousePressFrame = posToFrame(AppSupport::getMouseX(event)); bool hasMarker = mCurrentCanvas ? mCurrentCanvas->hasMarker(mLastMousePressFrame) : false; bool hasMarkerIn = mCurrentCanvas ? mCurrentCanvas->hasMarkerIn(mLastMousePressFrame) : false; bool hasMarkerOut = mCurrentCanvas ? mCurrentCanvas->hasMarkerOut(mLastMousePressFrame) : false; @@ -451,7 +451,7 @@ void FrameScrollBar::mousePressEvent(QMouseEvent *event) void FrameScrollBar::mouseMoveEvent(QMouseEvent *event) { - qreal newFrame = posToFrame(event->x() ); + qreal newFrame = posToFrame(AppSupport::getMouseX(event)); if (mGrabbedMarker.enabled && mCurrentCanvas) { // move grabbed marker if (mGrabbedMarker.in) { if (mCurrentCanvas->hasMarkerIn(newFrame) || diff --git a/src/ui/widgets/performancesettingswidget.cpp b/src/ui/widgets/performancesettingswidget.cpp index e199d600d..985323e5d 100644 --- a/src/ui/widgets/performancesettingswidget.cpp +++ b/src/ui/widgets/performancesettingswidget.cpp @@ -258,7 +258,7 @@ void PerformanceSettingsWidget::setupRasterEffectWidgets() container->setContentsMargins(0, 0, 0, 0); - containerInnerLayout->setMargin(5); + containerInnerLayout->setContentsMargins(0, 0, 0, 0); containerLayout->addWidget(area); @@ -277,7 +277,7 @@ void PerformanceSettingsWidget::setupRasterEffectWidgets() const auto lay = new QHBoxLayout(wid); wid->setContentsMargins(0, 0, 0, 0); - lay->setMargin(0); + lay->setContentsMargins(0, 0, 0, 0); lay->addWidget(label); lay->addWidget(box); diff --git a/src/ui/widgets/presetsettingswidget.cpp b/src/ui/widgets/presetsettingswidget.cpp index 520624bf2..e8acf0652 100644 --- a/src/ui/widgets/presetsettingswidget.cpp +++ b/src/ui/widgets/presetsettingswidget.cpp @@ -84,7 +84,7 @@ void PresetSettingsWidget::setupResolutionPresetWidget() container->setContentsMargins(0, 0, 0, 0); - containerInnerLayout->setMargin(0); + containerInnerLayout->setContentsMargins(0, 0, 0, 0); containerLayout->addWidget(area); @@ -187,7 +187,7 @@ void PresetSettingsWidget::setupFpsPresetWidget() container->setContentsMargins(0, 0, 0, 0); - containerInnerLayout->setMargin(0); + containerInnerLayout->setContentsMargins(0, 0, 0, 0); containerLayout->addWidget(area); diff --git a/src/ui/widgets/qdoubleslider.cpp b/src/ui/widgets/qdoubleslider.cpp index 95c0d7c69..73f4dfcc1 100644 --- a/src/ui/widgets/qdoubleslider.cpp +++ b/src/ui/widgets/qdoubleslider.cpp @@ -385,14 +385,14 @@ void QDoubleSlider::mouseDoubleClickEvent(QMouseEvent *event) { void QDoubleSlider::mousePressEvent(QMouseEvent *event) { if(event->button() == Qt::RightButton) { if(cancelMove()) {} - else openContextMenu(event->globalPos()); + else openContextMenu(AppSupport::getMouseGlobalPos(event)); } else if(event->button() == Qt::LeftButton) { Actions::sInstance->startSmoothChange(); mMouseMoved = false; mMovesCount = 0; mCanceled = false; - mGlobalPressPos = event->globalPos(); - mLastX = event->globalX(); + mGlobalPressPos = AppSupport::getMouseGlobalPos(event); + mLastX = AppSupport::getMouseGlobalX(event); mLastValue = startSlideValue(); } } @@ -439,7 +439,7 @@ void QDoubleSlider::mouseMoveEvent(QMouseEvent *event) { mMouseMoved = true; } - const qreal dValue = getDValueForMouseMove(event->globalX()); + const qreal dValue = getDValueForMouseMove(AppSupport::getMouseGlobalX(event)); mLastValue = clamped(mLastValue + dValue); setValue(mLastValue); @@ -495,7 +495,7 @@ void QDoubleSlider::wheelEvent(QWheelEvent *event) } #endif -void QDoubleSlider::enterEvent(QEvent *) +void QDoubleSlider::enterEvent(QtEnterEvent *) { mHovered = true; setCursor(Qt::SizeHorCursor); diff --git a/src/ui/widgets/qdoubleslider.h b/src/ui/widgets/qdoubleslider.h index 061dccaa4..1405a82b4 100644 --- a/src/ui/widgets/qdoubleslider.h +++ b/src/ui/widgets/qdoubleslider.h @@ -27,6 +27,7 @@ #define QDOUBLESLIDER_H #include "ui_global.h" +#include "enterevent.h" #include #include @@ -119,7 +120,7 @@ class UI_EXPORT QDoubleSlider : public QWidget { void wheelEvent(QWheelEvent *event); #endif - void enterEvent(QEvent *); + void enterEvent(QtEnterEvent *); void leaveEvent(QEvent *); void paint(QPainter *p, diff --git a/src/ui/widgets/savedcolorbutton.cpp b/src/ui/widgets/savedcolorbutton.cpp index f98b86f34..9ef4bef02 100644 --- a/src/ui/widgets/savedcolorbutton.cpp +++ b/src/ui/widgets/savedcolorbutton.cpp @@ -29,6 +29,7 @@ #include #include "GUI/global.h" #include "Private/document.h" +#include "appsupport.h" SavedColorButton::SavedColorButton(const QColor &colorT, QWidget *parent) @@ -53,7 +54,7 @@ void SavedColorButton::mousePressEvent(QMouseEvent *e) QMenu menu(this); menu.addAction(QIcon::fromTheme("minus"), tr("Unbookmark Color")); - const auto act = menu.exec(e->globalPos()); + const auto act = menu.exec(AppSupport::getMouseGlobalPos(e)); if (act) { if (act->text() == tr("Unbookmark Color")) { Document::sInstance->removeBookmarkColor(getColor()); diff --git a/src/ui/widgets/savedcolorbutton.h b/src/ui/widgets/savedcolorbutton.h index 478f4a510..f440fe2eb 100644 --- a/src/ui/widgets/savedcolorbutton.h +++ b/src/ui/widgets/savedcolorbutton.h @@ -27,6 +27,7 @@ #define SAVEDCOLORBUTTON_H #include "ui_global.h" +#include "enterevent.h" #include #include @@ -46,7 +47,7 @@ class UI_EXPORT SavedColorButton : public QWidget protected: void paintEvent(QPaintEvent *); void mousePressEvent(QMouseEvent *e); - void enterEvent(QEvent*) { + void enterEvent(QtEnterEvent*) { mHovered = true; update(); } diff --git a/src/ui/widgets/toolbutton.h b/src/ui/widgets/toolbutton.h index 12ebd3a4d..af92c0358 100644 --- a/src/ui/widgets/toolbutton.h +++ b/src/ui/widgets/toolbutton.h @@ -25,9 +25,9 @@ #define FRICTION_TOOLBUTTON_H #include "ui_global.h" +#include "enterevent.h" #include -#include #include #include #include @@ -64,7 +64,7 @@ namespace Friction bool mAutoPopup; protected: - void enterEvent(QEvent *event) override + void enterEvent(QtEnterEvent *event) override { if (mAutoPopup) { showMenu(); } QToolButton::enterEvent(event); diff --git a/src/ui/widgets/toolinteract.cpp b/src/ui/widgets/toolinteract.cpp index df5d26fc6..4d9fb29d6 100644 --- a/src/ui/widgets/toolinteract.cpp +++ b/src/ui/widgets/toolinteract.cpp @@ -385,7 +385,7 @@ void ToolInteract::setupGridButton() const auto label = new QLabel(tr("Threshold"), wid); wid->setContentsMargins(0, 0, 0, 0); - lay->setMargin(4); + lay->setContentsMargins(4, 4, 4, 4); lay->addWidget(label); lay->addWidget(spin); diff --git a/src/ui/widgets/uilayout.cpp b/src/ui/widgets/uilayout.cpp index d71377dac..dde0a9409 100644 --- a/src/ui/widgets/uilayout.cpp +++ b/src/ui/widgets/uilayout.cpp @@ -58,7 +58,6 @@ UIDock::UIDock(QWidget *parent, setContentsMargins(0, 0, 0, 0); mLayout = new QVBoxLayout(this); mLayout->setContentsMargins(0, 0, 0, 0); - mLayout->setMargin(0); mLayout->setSpacing(0); if (showHeader) { @@ -74,7 +73,6 @@ UIDock::UIDock(QWidget *parent, headerWidget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); headerLayout->setContentsMargins(0, 0, 0, 0); - headerLayout->setMargin(0); headerLayout->setSpacing(0); const auto leftButton = new QPushButton(this); diff --git a/src/ui/widgets/welcomedialog.cpp b/src/ui/widgets/welcomedialog.cpp index 730a0f84e..a571412df 100644 --- a/src/ui/widgets/welcomedialog.cpp +++ b/src/ui/widgets/welcomedialog.cpp @@ -69,7 +69,7 @@ WelcomeDialog::WelcomeDialog(QMenu *recentMenu, const auto buttonWid = new QWidget(this); buttonWid->setContentsMargins(0, 0, 0, 0); const auto buttonLay = new QHBoxLayout(buttonWid); - buttonLay->setMargin(0); + buttonLay->setContentsMargins(0, 0, 0, 0); const auto newButton = new QPushButton(QIcon::fromTheme("file_blank"), tr("New"), diff --git a/src/ui/widgets/widgetstack.h b/src/ui/widgets/widgetstack.h index d82047242..20802dc00 100644 --- a/src/ui/widgets/widgetstack.h +++ b/src/ui/widgets/widgetstack.h @@ -27,6 +27,7 @@ #define WIDGETSTACK_H #include "ui_global.h" +#include "enterevent.h" #include #include @@ -37,23 +38,39 @@ #include "GUI/global.h" #include "XML/xmlexporthelpers.h" +inline int gGetMouseX(const QMouseEvent *event) { +#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) + return qRound(event->position().x()); +#else + return event->x(); +#endif +} + +inline int gGetMouseY(const QMouseEvent *event) { +#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) + return qRound(event->position().y()); +#else + return event->y(); +#endif +} + #define STACK_TMPL_DEFS \ int (QWidget::*DimGetter)() const, void (*DimSetter)(QWidget*, int), \ int (QWidget::*PosGetter)() const, void (*PosSetter)(int, QWidget*), \ int (QWidget::*OtherDimGetter)() const, void (*OtherDimSetter)(QWidget*, int), \ - int (QMouseEvent::*MousePosGetter)() const, class TResizer + int (*MousePosGetter)(const QMouseEvent*), class TResizer #define V_STACK_TMPL \ &QWidget::height, &gResizeH, \ &QWidget::y, &gMoveY, \ &QWidget::width, &gResizeW, \ - &QMouseEvent::y, VStackResizer + &gGetMouseY, VStackResizer #define H_STACK_TMPL \ &QWidget::width, &gResizeW, \ &QWidget::x, &gMoveX, \ &QWidget::height, &gResizeH, \ - &QMouseEvent::x, HStackResizer + &gGetMouseX, HStackResizer void gMoveX(const int x, QWidget * const widget); void gMoveY(const int y, QWidget * const widget); @@ -102,12 +119,12 @@ class UI_EXPORT StackResizerBase { } void mouseMoveEventB(QMouseEvent * const event) { - displace((event->*MousePosGetter)() - mPressDim); + displace(MousePosGetter(event) - mPressDim); } void mousePressEventB(QMouseEvent * const event) { mPressed = true; - mPressDim = (event->*MousePosGetter)(); + mPressDim = MousePosGetter(event); mThis->update(); } @@ -189,7 +206,7 @@ class UI_EXPORT VStackResizer : public QWidget, public StackResizerBaseaddLayout(mMenuLayout); setLayout(mLayout); mLayout->setSpacing(0); - mLayout->setMargin(0); + mLayout->setContentsMargins(0, 0, 0, 0); } void WidgetWrapperNode::setMenuBar(StackWrapperMenu * const menu) { diff --git a/src/ui/widgets/wrappernode.cpp b/src/ui/widgets/wrappernode.cpp index 97555b086..d55c02180 100644 --- a/src/ui/widgets/wrappernode.cpp +++ b/src/ui/widgets/wrappernode.cpp @@ -46,8 +46,10 @@ QDomElement WrapperNode::writeXEV(QDomDocument& doc, WrapperNode* WrapperNode::sRead(eReadStream &src, const WidgetCreator &creator) { - WrapperNodeType type; - src.read(&type, sizeof(WrapperNodeType)); + int typeVal; + src >> typeVal; // 4 bytes for evformat + + WrapperNodeType type = static_cast(typeVal); const auto wid = createForType(type, creator); wid->readData(src); return wid;