Skip to content

Commit e19085e

Browse files
committed
fix: update compositing and AE workflow behavior
1 parent d7f5146 commit e19085e

344 files changed

Lines changed: 1293 additions & 1286 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

‎.reasonix/truncated-results/1780931864499-9218b4e4-wait_for_job.txt‎

Lines changed: 1 addition & 0 deletions
Large diffs are not rendered by default.

‎.reasonix/truncated-results/1780934913279-3f9354ce-wait_for_job.txt‎

Lines changed: 1 addition & 0 deletions
Large diffs are not rendered by default.

‎src/app/GUI/BoxesList/boxsinglewidget.cpp‎

Lines changed: 12 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -598,23 +598,12 @@ BoxSingleWidget::BoxSingleWidget(BoxScroller * const parent)
598598
}
599599
});
600600

601-
mCollapseToggle = new QPushButton(this);
602-
mCollapseToggle->setObjectName(QStringLiteral("AeTimelineToggleButton"));
603-
mCollapseToggle->setCheckable(true);
604-
mCollapseToggle->setFlat(true);
605-
mCollapseToggle->setFocusPolicy(Qt::NoFocus);
606-
mCollapseToggle->setToolTip(tr("Collapse transformations"));
607-
mCollapseToggle->setFixedSize(qRound(eSizesUI::widget * 0.95), qRound(eSizesUI::widget * 0.95));
608-
mCollapseToggle->setIconSize(QSize(qRound(eSizesUI::widget * 0.8), qRound(eSizesUI::widget * 0.8)));
609-
mCollapseToggle->hide();
610-
mMainLayout->addWidget(mCollapseToggle);
611-
612601
mPromoteDemoteToggle = new QPushButton(this);
613602
mPromoteDemoteToggle->setObjectName(QStringLiteral("AeTimelineToggleButton"));
614603
mPromoteDemoteToggle->setCheckable(true);
615604
mPromoteDemoteToggle->setFlat(true);
616605
mPromoteDemoteToggle->setFocusPolicy(Qt::NoFocus);
617-
mPromoteDemoteToggle->setToolTip(tr("Promote to Layer / Demote to Group"));
606+
mPromoteDemoteToggle->setToolTip(tr("Collapse Transformations"));
618607
mPromoteDemoteToggle->setFixedSize(qRound(eSizesUI::widget * 0.95), qRound(eSizesUI::widget * 0.95));
619608
mPromoteDemoteToggle->setIconSize(QSize(qRound(eSizesUI::widget * 0.8), qRound(eSizesUI::widget * 0.8)));
620609
mPromoteDemoteToggle->hide();
@@ -697,34 +686,20 @@ BoxSingleWidget::BoxSingleWidget(BoxScroller * const parent)
697686
mSoloButton->setIcon(QIcon(soloOff));
698687
mSoloButton->setProperty("iconOn", QVariant::fromValue(QIcon(soloOn)));
699688
mSoloButton->setProperty("iconOff", QVariant::fromValue(QIcon(soloOff)));
700-
mCollapseToggle->setIcon(QIcon(collapseOff));
701-
mCollapseToggle->setProperty("iconOn", QVariant::fromValue(QIcon(collapseOn)));
702-
mCollapseToggle->setProperty("iconOff", QVariant::fromValue(QIcon(collapseOff)));
703689
mPromoteDemoteToggle->setIcon(QIcon(promoteOff));
704690
mPromoteDemoteToggle->setProperty("iconOn", QVariant::fromValue(QIcon(promoteOn)));
705691
mPromoteDemoteToggle->setProperty("iconOff", QVariant::fromValue(QIcon(promoteOff)));
706692
mMotionBlurToggle->setIcon(QIcon(mbOff));
707693
mMotionBlurToggle->setProperty("iconOn", QVariant::fromValue(QIcon(mbOn)));
708694
mMotionBlurToggle->setProperty("iconOff", QVariant::fromValue(QIcon(mbOff)));
709695

710-
connect(mCollapseToggle, &QPushButton::clicked, this, [this]() {
711-
if(!mTarget) return;
712-
const auto box = enve_cast<BoundingBox*>(mTarget->getTarget());
713-
const auto linkCanvas = enve_cast<InternalLinkCanvas*>(box);
714-
if(!linkCanvas) return;
715-
auto prop = linkCanvas->clipToCanvasProperty();
716-
if(prop) prop->setValue(!prop->getValue());
717-
Document::sInstance->actionFinished();
718-
});
719-
720696
auto wireToggle = [this](QPushButton *btn) {
721697
connect(btn, &QPushButton::toggled, this, [btn](bool on) {
722698
if(on) btn->setIcon(btn->property("iconOn").value<QIcon>());
723699
else btn->setIcon(btn->property("iconOff").value<QIcon>());
724700
});
725701
};
726702
wireToggle(mSoloButton);
727-
wireToggle(mCollapseToggle);
728703
wireToggle(mPromoteDemoteToggle);
729704
wireToggle(mMotionBlurToggle);
730705
}
@@ -942,8 +917,16 @@ void BoxSingleWidget::togglePromoteDemote()
942917
if(!targetGroup) return;
943918
if(targetGroup->isLayer()) {
944919
targetGroup->demoteToGroup();
920+
// AE: Collapse ON = Group mode + no clip
921+
if(const auto linkCanvas = enve_cast<InternalLinkCanvas*>(targetGroup)) {
922+
linkCanvas->clipToCanvasProperty()->setValue(false);
923+
}
945924
} else if(targetGroup->isGroup()) {
946925
targetGroup->promoteToLayer();
926+
// AE: Collapse OFF = Layer mode + clip to canvas
927+
if(const auto linkCanvas = enve_cast<InternalLinkCanvas*>(targetGroup)) {
928+
linkCanvas->clipToCanvasProperty()->setValue(true);
929+
}
947930
}
948931
Document::sInstance->actionFinished();
949932
}
@@ -1256,7 +1239,7 @@ void BoxSingleWidget::setTargetAbstraction(SWT_Abstraction *abs) {
12561239
this, [this](const eBoxType type) {
12571240
mBlendModeCombo->setEnabled(type != eBoxType::group);
12581241
mPromoteDemoteToggle->blockSignals(true);
1259-
mPromoteDemoteToggle->setChecked(type != eBoxType::group);
1242+
mPromoteDemoteToggle->setChecked(type == eBoxType::group);
12601243
mPromoteDemoteToggle->blockSignals(false);
12611244
});
12621245
}
@@ -1274,7 +1257,6 @@ void BoxSingleWidget::setTargetAbstraction(SWT_Abstraction *abs) {
12741257
mTimelineCollapseVisible = false;
12751258
mParentPickWhipButton->hide();
12761259
mMattePickWhipButton->hide();
1277-
mCollapseToggle->hide();
12781260
mPromoteDemoteToggle->hide();
12791261
mMotionBlurToggle->hide();
12801262
mSoloButton->hide();
@@ -1299,26 +1281,13 @@ void BoxSingleWidget::setTargetAbstraction(SWT_Abstraction *abs) {
12991281
mTimelineMatteVisible = true;
13001282
mTimelineCollapseVisible = true;
13011283
mSoloButton->show();
1302-
mCollapseToggle->show();
13031284
mPromoteDemoteToggle->show();
13041285
mMotionBlurToggle->show();
1305-
{
1306-
const auto linkCanvas2 = enve_cast<InternalLinkCanvas*>(boundingBox);
1307-
mCollapseToggle->setEnabled(linkCanvas2 != nullptr);
1308-
mCollapseToggle->blockSignals(true);
1309-
if(linkCanvas2) {
1310-
auto prop = linkCanvas2->clipToCanvasProperty();
1311-
mCollapseToggle->setChecked(prop ? prop->getValue() : false);
1312-
} else {
1313-
mCollapseToggle->setChecked(false);
1314-
}
1315-
mCollapseToggle->blockSignals(false);
1316-
}
13171286
{
13181287
const auto tg = getPromoteTargetGroup();
13191288
mPromoteDemoteToggle->setEnabled(tg != nullptr);
13201289
mPromoteDemoteToggle->blockSignals(true);
1321-
mPromoteDemoteToggle->setChecked(tg ? tg->isLayer() : false);
1290+
mPromoteDemoteToggle->setChecked(tg ? tg->isGroup() : false);
13221291
mPromoteDemoteToggle->blockSignals(false);
13231292
}
13241293
{
@@ -2300,9 +2269,7 @@ void BoxSingleWidget::updateTimelineRelationCombosVisible() {
23002269
mTrackMatteCombo->hide();
23012270
}
23022271
if (mTimelineCollapseVisible && canShowCollapse) {
2303-
mCollapseToggle->show();
2304-
} else {
2305-
mCollapseToggle->hide();
2272+
// Collapse is now unified with Promote/Demote toggle
23062273
}
23072274
}
23082275

‎src/app/GUI/BoxesList/boxsinglewidget.h‎

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -194,7 +194,6 @@ class BoxSingleWidget : public SingleWidget {
194194

195195
QPushButton *mPromoteDemoteToggle = nullptr;
196196
QPushButton *mMotionBlurToggle = nullptr;
197-
QPushButton *mCollapseToggle = nullptr;
198197
eComboBox *mPropertyComboBox;
199198
eComboBox *mBlendModeCombo;
200199
eComboBox *mPathBlendModeCombo;

‎src/app/GUI/aeshortcutcontroller.cpp‎

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -193,21 +193,21 @@ bool AeShortcutController::handleGlobalShortcut(QKeyEvent *event)
193193

194194
if (matches(event, QStringLiteral("aeCenterPivot"), QStringLiteral("Ctrl+Home"))) {
195195
if (scene) {
196-
scene->centerPivotForSelected();
197-
showStatusMessage(tr("AE: Center Pivot"));
196+
scene->alignSelectedBoxes(Qt::AlignHCenter,
197+
AlignPivot::pivot,
198+
AlignRelativeTo::scene);
199+
scene->alignSelectedBoxes(Qt::AlignVCenter,
200+
AlignPivot::pivot,
201+
AlignRelativeTo::scene);
202+
showStatusMessage(tr("AE: Align to Composition Center"));
198203
return true;
199204
}
200205
}
201206

202207
if (matches(event, QStringLiteral("aeAlignCenter"), QStringLiteral("Ctrl+Alt+Home"))) {
203208
if (scene) {
204-
scene->alignSelectedBoxes(Qt::AlignHCenter,
205-
AlignPivot::geometry,
206-
AlignRelativeTo::scene);
207-
scene->alignSelectedBoxes(Qt::AlignVCenter,
208-
AlignPivot::geometry,
209-
AlignRelativeTo::scene);
210-
showStatusMessage(tr("AE: Align to Composition Center"));
209+
scene->centerPivotForSelected();
210+
showStatusMessage(tr("AE: Center Pivot"));
211211
return true;
212212
}
213213
}

‎src/app/GUI/aeshortcutdefaults.cpp‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@ QList<AeShortcutDefinition> aeShortcutDefinitions()
2121
{QStringLiteral("aeRevealOpacity"), QStringLiteral("Reveal"), QObject::tr("Reveal Opacity"), QObject::tr("Expand opacity property."), QStringLiteral("T")},
2222
{QStringLiteral("aeRevealMasks"), QStringLiteral("Reveal"), QObject::tr("Reveal Masks"), QObject::tr("Expand mask properties on selected layer(s)."), QStringLiteral("M")},
2323
{QStringLiteral("aeRevealAnimated"), QStringLiteral("Reveal"), QObject::tr("Reveal Animated / Modified"), QObject::tr("Single press shows keyed properties; double press shows modified properties."), QStringLiteral("U")},
24-
{QStringLiteral("aeCenterPivot"), QStringLiteral("Transform"), QObject::tr("Center Pivot"), QObject::tr("Move the anchor / pivot of the selected layer(s) to the visual center."), QStringLiteral("Ctrl+Home")},
25-
{QStringLiteral("aeAlignCenter"), QStringLiteral("Transform"), QObject::tr("Align to Composition Center"), QObject::tr("Align selected layer(s) horizontally and vertically to the composition center."), QStringLiteral("Ctrl+Alt+Home")},
24+
{QStringLiteral("aeCenterPivot"), QStringLiteral("Transform"), QObject::tr("Align to Composition Center"), QObject::tr("Align selected layer(s) horizontally and vertically to the composition center."), QStringLiteral("Ctrl+Home")},
25+
{QStringLiteral("aeAlignCenter"), QStringLiteral("Transform"), QObject::tr("Center Pivot"), QObject::tr("Move the anchor / pivot of the selected layer(s) to the visual center."), QStringLiteral("Ctrl+Alt+Home")},
2626
{QStringLiteral("aeCompSettings"), QStringLiteral("Composition"), QObject::tr("Composition Settings"), QObject::tr("Open composition settings."), QStringLiteral("Ctrl+K")},
2727
{QStringLiteral("aeAddRenderQueue"), QStringLiteral("Composition"), QObject::tr("Add to Render Queue"), QObject::tr("Send active composition to render queue."), QStringLiteral("Ctrl+M")},
2828
{QStringLiteral("aeTimeRemap"), QStringLiteral("Timeline"), QObject::tr("Toggle Time Remapping"), QObject::tr("Enable or disable time remapping on selected footage layers."), QStringLiteral("Ctrl+Alt+T")},

‎src/app/GUI/canvaswindow.cpp‎

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -753,13 +753,17 @@ bool CanvasWindow::handleZValueKeyPress(QKeyEvent *event)
753753
} else if (!altPressed && !metaPressed && ctrlPressed &&
754754
event->key() == Qt::Key_BracketRight) {
755755
mCurrentCanvas->raiseSelectedBoxes();
756-
} else if (event->key() == Qt::Key_PageUp) {
756+
} else if (!altPressed && !metaPressed && !ctrlPressed &&
757+
event->key() == Qt::Key_PageUp) {
757758
mCurrentCanvas->raiseSelectedBoxes();
758-
} else if (event->key() == Qt::Key_PageDown) {
759+
} else if (!altPressed && !metaPressed && !ctrlPressed &&
760+
event->key() == Qt::Key_PageDown) {
759761
mCurrentCanvas->lowerSelectedBoxes();
760-
} else if (event->key() == Qt::Key_End) {
762+
} else if (!altPressed && !metaPressed && !ctrlPressed &&
763+
event->key() == Qt::Key_End) {
761764
mCurrentCanvas->lowerSelectedBoxesToBottom();
762-
} else if (event->key() == Qt::Key_Home) {
765+
} else if (!altPressed && !metaPressed && !ctrlPressed &&
766+
event->key() == Qt::Key_Home) {
763767
mCurrentCanvas->raiseSelectedBoxesToTop();
764768
} else { return false; }
765769
return true;
@@ -991,10 +995,24 @@ bool CanvasWindow::KFT_keyPressEvent(QKeyEvent *event)
991995
return true;
992996
}
993997

998+
void CanvasWindow::toggleTransparencyGrid()
999+
{
1000+
if (!mCurrentCanvas) { return; }
1001+
mCurrentCanvas->toggleTransparencyGrid();
1002+
finishAction();
1003+
}
1004+
1005+
bool CanvasWindow::isTransparencyGridOn() const
1006+
{
1007+
if (!mCurrentCanvas) { return false; }
1008+
return mCurrentCanvas->isTransparencyGridOn();
1009+
}
1010+
9941011
void CanvasWindow::setResolution(const qreal fraction)
9951012
{
9961013
if (!mCurrentCanvas) { return; }
997-
if (isZero6Dec(mCurrentCanvas->getResolution() - fraction)) {
1014+
// Auto mode (-1.0) is always accepted; compare stored value for manual
1015+
if (fraction >= 0.0 && isZero6Dec(mCurrentCanvas->getResolution() - fraction)) {
9981016
return;
9991017
}
10001018
if (RenderHandler::sInstance) {

‎src/app/GUI/canvaswindow.h‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,8 @@ class CanvasWindow : public GLWindow, public KeyFocusTarget
8484
bool KFT_keyPressEvent(QKeyEvent *event);
8585

8686
void setResolution(const qreal fraction);
87+
void toggleTransparencyGrid();
88+
bool isTransparencyGridOn() const;
8789
void updatePivotIfNeeded();
8890
void schedulePivotUpdate();
8991

‎src/app/GUI/canvaswrappernode.cpp‎

Lines changed: 53 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
#include "widgets/editablecombobox.h"
2929
#include "widgets/toolinteract.h"
3030
#include "Private/document.h"
31+
#include "Private/esettings.h"
3132
#include "mainwindow.h"
3233

3334
#include <QHBoxLayout>
@@ -104,10 +105,7 @@ class CanvasWrapperFooter : public QWidget {
104105
layout->addWidget(resolutionLabel);
105106

106107
mResolutionCombo = new EditableComboBox(this);
107-
mResolutionCombo->addItem(QStringLiteral("500 %"));
108-
mResolutionCombo->addItem(QStringLiteral("400 %"));
109-
mResolutionCombo->addItem(QStringLiteral("300 %"));
110-
mResolutionCombo->addItem(QStringLiteral("200 %"));
108+
mResolutionCombo->addItem(QStringLiteral("Auto"));
111109
mResolutionCombo->addItem(QStringLiteral("100 %"));
112110
mResolutionCombo->addItem(QStringLiteral("75 %"));
113111
mResolutionCombo->addItem(QStringLiteral("50 %"));
@@ -143,6 +141,15 @@ class CanvasWrapperFooter : public QWidget {
143141
mRecallButton->setFixedHeight(22);
144142
layout->addWidget(mRecallButton);
145143

144+
mTransparencyGridButton = new QToolButton(this);
145+
mTransparencyGridButton->setIcon(QIcon(QStringLiteral(":/icons/hicolor/scalable/actions/transparency-grid.svg")));
146+
mTransparencyGridButton->setToolTip(tr("Toggle transparency grid (checkerboard background)."));
147+
mTransparencyGridButton->setCheckable(true);
148+
mTransparencyGridButton->setAutoRaise(true);
149+
mTransparencyGridButton->setFixedHeight(22);
150+
mTransparencyGridButton->setIconSize(QSize(18, 18));
151+
layout->addWidget(mTransparencyGridButton);
152+
146153
layout->addStretch();
147154

148155
{
@@ -219,6 +226,14 @@ class CanvasWrapperFooter : public QWidget {
219226
connect(mWindow, &CanvasWindow::currentSceneChanged,
220227
this, [this](Canvas *) {
221228
syncResolutionFromScene();
229+
syncTransparencyGridButton();
230+
});
231+
232+
connect(mTransparencyGridButton, &QToolButton::toggled,
233+
this, [this](bool checked) {
234+
if (!mWindow) { return; }
235+
Q_UNUSED(checked)
236+
mWindow->toggleTransparencyGrid();
222237
});
223238
}
224239

@@ -228,31 +243,44 @@ class CanvasWrapperFooter : public QWidget {
228243
if (!mResolutionCombo) {
229244
return;
230245
}
231-
const auto *scene = mWindow ? mWindow->getCurrentCanvas() : nullptr;
232-
const QString text = scene ?
233-
QStringLiteral("%1 %").arg(qRound(scene->getResolution() * 100.0)) :
234-
QStringLiteral("100 %");
246+
const qreal globalRes = eSettings::sPreviewResolution();
235247
mResolutionCombo->blockSignals(true);
236-
mResolutionCombo->setCurrentText(text);
248+
if (globalRes < 0.0) {
249+
mResolutionCombo->setCurrentText(QStringLiteral("Auto"));
250+
} else {
251+
mResolutionCombo->setCurrentText(
252+
QStringLiteral("%1 %").arg(qRound(globalRes * 100.0)));
253+
}
237254
mResolutionCombo->blockSignals(false);
238255
}
239256

240-
void applyResolutionText(QString text)
257+
void applyResolutionText(const QString &text)
241258
{
242259
if (!mWindow) {
243260
return;
244261
}
245-
const qreal resolution = qBound<qreal>(1.0,
246-
text.remove('%').simplified().toDouble(),
247-
1000.0) / 100.0;
262+
qreal resolution = 0.0;
263+
if (text.trimmed().compare(QStringLiteral("Auto"), Qt::CaseInsensitive) == 0) {
264+
resolution = -1.0;
265+
} else {
266+
QString cleaned = text;
267+
cleaned.remove('%');
268+
cleaned = cleaned.simplified();
269+
bool ok = false;
270+
const int pct = cleaned.toInt(&ok);
271+
if (!ok || pct <= 0) { return; }
272+
resolution = qBound<qreal>(0.01, qreal(pct) / 100.0, 1.0);
273+
}
274+
eSettings::setPreviewResolution(resolution);
248275
mWindow->setResolution(resolution);
249276
syncResolutionFromScene();
250277

251278
if (auto *mw = MainWindow::sGetInstance()) {
252279
if (mw->statusBar()) {
253280
mw->statusBar()->showMessage(
254281
tr("AE: Preview Resolution %1")
255-
.arg(QStringLiteral("%1 %").arg(qRound(resolution * 100.0))),
282+
.arg(resolution < 0.0 ? QStringLiteral("Auto")
283+
: QStringLiteral("%1 %").arg(qRound(resolution * 100.0))),
256284
2000);
257285
}
258286
}
@@ -263,6 +291,17 @@ class CanvasWrapperFooter : public QWidget {
263291
QToolButton *mSnapshotButton = nullptr;
264292
QToolButton *mCropButton = nullptr;
265293
QToolButton *mRecallButton = nullptr;
294+
QToolButton *mTransparencyGridButton = nullptr;
295+
296+
void syncTransparencyGridButton()
297+
{
298+
if (!mTransparencyGridButton || !mWindow) { return; }
299+
const auto *canvas = mWindow->getCurrentCanvas();
300+
const bool on = canvas ? canvas->isTransparencyGridOn() : false;
301+
mTransparencyGridButton->blockSignals(true);
302+
mTransparencyGridButton->setChecked(on);
303+
mTransparencyGridButton->blockSignals(false);
304+
}
266305
};
267306

268307
CanvasWrapperNode::CanvasWrapperNode(Canvas* const scene) :

0 commit comments

Comments
 (0)