From 3d63b1b4fe075e5557d452f72e549e84d288095c Mon Sep 17 00:00:00 2001 From: Dan Dennedy Date: Tue, 7 Jul 2026 13:05:12 -0700 Subject: [PATCH 01/10] Add rounding to clips, headings, and more --- src/mainwindow.cpp | 18 ++++++++++ src/qml/views/filter/filterview.qml | 3 ++ src/qml/views/timeline/Clip.qml | 53 ++++++++++++++++++++++++----- src/qmltypes/timelineitems.cpp | 7 +++- src/util.cpp | 33 +++++++++++------- src/widgets/newprojectfolder.cpp | 26 +++++++++----- src/widgets/statuslabelwidget.cpp | 12 ++++++- 7 files changed, 122 insertions(+), 30 deletions(-) diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 9eb9a63b29..1c07dfd699 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -6754,6 +6754,10 @@ void MainWindow::updateLayoutSwitcher() button->setAutoRaise(true); button->setDefaultAction(ui->actionLayoutPlayer); layoutGrid->addWidget(button, 1, 2, Qt::AlignCenter); + layoutSwitcher->setStyleSheet( + "QToolButton { border-radius: 4px; }" + "QToolButton:checked { background-color: palette(highlight);" + " color: palette(highlighted-text); }"); } ui->mainToolBar->removeAction(ui->actionLayoutLogging); ui->mainToolBar->removeAction(ui->actionLayoutEditing); @@ -6775,6 +6779,20 @@ void MainWindow::updateLayoutSwitcher() ui->mainToolBar->insertAction(ui->dummyAction, ui->actionLayoutAudio); ui->mainToolBar->insertAction(ui->dummyAction, ui->actionLayoutPlayer); } + const QString layoutBtnStyle = QStringLiteral( + "QToolButton { border-radius: 4px; }" + "QToolButton:checked { background-color: palette(highlight);" + " color: palette(highlighted-text); }"); + const QList layoutActions{ui->actionLayoutLogging, + ui->actionLayoutEditing, + ui->actionLayoutEffects, + ui->actionLayoutColor, + ui->actionLayoutAudio, + ui->actionLayoutPlayer}; + for (auto *action : layoutActions) { + if (auto *btn = qobject_cast(ui->mainToolBar->widgetForAction(action))) + btn->setStyleSheet(layoutBtnStyle); + } } } diff --git a/src/qml/views/filter/filterview.qml b/src/qml/views/filter/filterview.qml index 3fcdb72cd0..f643de1c78 100644 --- a/src/qml/views/filter/filterview.qml +++ b/src/qml/views/filter/filterview.qml @@ -112,6 +112,7 @@ Rectangle { color: activePalette.highlight visible: attachedfiltersmodel.producerTitle != "" + radius: 4 anchors { top: parent.top @@ -132,6 +133,8 @@ Rectangle { color: activePalette.highlightedText font.bold: true horizontalAlignment: Text.AlignHCenter + topPadding: 3 + bottomPadding: 3 anchors { top: parent.top diff --git a/src/qml/views/timeline/Clip.qml b/src/qml/views/timeline/Clip.qml index 99920b3c41..f2f7a70725 100644 --- a/src/qml/views/timeline/Clip.qml +++ b/src/qml/views/timeline/Clip.qml @@ -49,6 +49,23 @@ Rectangle { property bool isTrackMute: false property bool elided: (width < 15) || (x + width < tracksFlickable.contentX) || (x > tracksFlickable.contentX + tracksFlickable.width) || (y + height < 0) || (y > tracksFlickable.contentY + tracksFlickable.contentHeight) property color clipColor: isBlank ? 'transparent' : isTransition ? 'mediumpurple' : isAudio ? 'darkseagreen' : root.shotcutBlue + readonly property real _cornerRadius: 5 + property bool _roundLeft: { + if (isBlank || !trackRoot || trackRoot.clipCount === 0) + return false; + if (index === 0) + return true; + const prev = trackRoot.clipAt(index - 1); + return prev !== null && prev !== undefined && prev.isBlank; + } + property bool _roundRight: { + if (isBlank || !trackRoot) + return false; + if (index === trackRoot.clipCount - 1) + return true; + const next = trackRoot ? trackRoot.clipAt(index + 1) : null; + return next !== null && next !== undefined && next.isBlank; + } signal clicked(var clip, var mouse) signal clipRightClicked(var clip, var mouse) @@ -116,6 +133,10 @@ Rectangle { border.color: (selected || Drag.active || trackIndex != originalTrackIndex) ? group < 0 ? 'red' : 'white' : 'black' border.width: (isBlank && !selected) ? 0 : 1 + topLeftRadius: _roundLeft ? _cornerRadius : 0 + bottomLeftRadius: _roundLeft ? _cornerRadius : 0 + topRightRadius: _roundRight ? _cornerRadius : 0 + bottomRightRadius: _roundRight ? _cornerRadius : 0 clip: true Drag.active: mouseArea.drag.active Drag.proposedAction: Qt.MoveAction @@ -299,7 +320,7 @@ Rectangle { anchors.right: parent.right anchors.top: parent.top anchors.topMargin: parent.border.width - anchors.rightMargin: parent.border.width + anchors.rightMargin: parent.border.width + clipRoot.topRightRadius / 2 anchors.bottom: parent.bottom anchors.bottomMargin: parent.height / 2 width: height * 16 / 9 @@ -314,7 +335,7 @@ Rectangle { anchors.left: parent.left anchors.top: parent.top anchors.topMargin: parent.border.width - anchors.leftMargin: parent.border.width + anchors.leftMargin: parent.border.width + clipRoot.topLeftRadius / 2 anchors.rightMargin: parent.border.width anchors.bottom: parent.bottom anchors.bottomMargin: parent.height / 2 @@ -337,12 +358,16 @@ Rectangle { id: waveform readonly property int maxWidth: Math.max(application.maxTextureSize / 2, 2048) + readonly property real leftOffset: _roundLeft ? _cornerRadius / 2 : parent.border.width + readonly property real rightOffset: _roundRight ? _cornerRadius / 2 : parent.border.width visible: !elided && !isBlank && settings.timelineShowWaveforms && (parseInt(audioIndex) > -1 || audioIndex === 'all') - height: (isAudio || parent.height <= 20) ? parent.height : parent.height / 2 + height: (isAudio || parent.height <= 20) ? parent.height - (_roundLeft || _roundRight ? _cornerRadius / 2 : 0) : parent.height / 2 anchors.left: parent.left anchors.bottom: parent.bottom - anchors.margins: parent.border.width + anchors.leftMargin: leftOffset + anchors.rightMargin: rightOffset + anchors.bottomMargin: parent.border.width opacity: isTrackMute ? 0.2 : 0.7 Repeater { @@ -355,7 +380,7 @@ Rectangle { trackIndex: clipRoot.trackIndex clipIndex: clipRoot.readonlyClipIndex - width: Math.min(clipRoot.width - 2 * clipRoot.border.width, waveform.maxWidth) + width: Math.min(clipRoot.width - waveform.leftOffset - waveform.rightOffset, waveform.maxWidth) height: waveform.height fillColor: clipColor inPoint: Math.round((clipRoot.inPoint + index * waveform.maxWidth / timeScale) * speed) * channels @@ -419,7 +444,7 @@ Rectangle { anchors.top: parent.top anchors.left: parent.left anchors.topMargin: parent.border.width - anchors.leftMargin: parent.border.width + ((isAudio || !settings.timelineShowThumbnails) ? filtersIcon.enabledWidth : inThumbnail.width + filtersIcon.width) + anchors.leftMargin: parent.border.width + ((isAudio || !settings.timelineShowThumbnails) ? filtersIcon.enabledWidth : inThumbnail.width + filtersIcon.width) + 2 width: label.width + 2 height: label.height } @@ -448,7 +473,7 @@ Rectangle { anchors.top: parent.top anchors.right: parent.right anchors.topMargin: parent.border.width - anchors.rightMargin: parent.border.width + ((isAudio || !settings.timelineShowThumbnails) ? 0 : outThumbnail.width) + 2 + anchors.rightMargin: parent.border.width + ((isAudio || !settings.timelineShowThumbnails) ? (clipRoot.topRightRadius / 2) : outThumbnail.width) width: labelRight.width + 2 height: labelRight.height } @@ -482,7 +507,7 @@ Rectangle { anchors.left: parent.left anchors.top: parent.top anchors.topMargin: parent.border.width - anchors.leftMargin: parent.border.width + ((isAudio || !settings.timelineShowThumbnails) ? (enabled ? width : 0) : inThumbnail.width) + anchors.leftMargin: parent.border.width + ((isAudio || !settings.timelineShowThumbnails) ? (enabled ? width : 0) : inThumbnail.width) + (clipRoot.topLeftRadius / 2) width: visible ? label.height : 0 height: label.height padding: 0 @@ -840,4 +865,16 @@ Rectangle { color: clipColor } } + + Rectangle { + anchors.fill: parent + color: 'transparent' + border.color: clipRoot.border.color + border.width: clipRoot.border.width + topLeftRadius: clipRoot.topLeftRadius + bottomLeftRadius: clipRoot.bottomLeftRadius + topRightRadius: clipRoot.topRightRadius + bottomRightRadius: clipRoot.bottomRightRadius + z: 1 + } } diff --git a/src/qmltypes/timelineitems.cpp b/src/qmltypes/timelineitems.cpp index 886a99b730..744e9afaba 100644 --- a/src/qmltypes/timelineitems.cpp +++ b/src/qmltypes/timelineitems.cpp @@ -180,6 +180,8 @@ class TimelineWaveform : public QQuickPaintedItem QPainterPath path; path.moveTo(-1, height()); + QPainterPath peaksPath; + peaksPath.moveTo(-1, height()); int i = 0; const int dataSize = data->size(); for (; i < width(); ++i) { @@ -191,13 +193,16 @@ class TimelineWaveform : public QQuickPaintedItem static_cast(data->at(idx + 1))) / 256.0; path.lineTo(i, height() - level * height()); + peaksPath.lineTo(i, height() - level * height()); } path.lineTo(i, height()); painter->fillPath(path, m_color.lighter()); + // Stroke only the peaks outline, not the bottom closing line, so + // the dark horizontal edge does not fight the rounded clip corners. QPen pen(painter->pen()); pen.setColor(m_color.darker()); - painter->strokePath(path, pen); + painter->strokePath(peaksPath, pen); if (qmlProducer) qmlProducer->producer().unlock(); diff --git a/src/util.cpp b/src/util.cpp index db8db345d8..5f41cd50e9 100644 --- a/src/util.cpp +++ b/src/util.cpp @@ -90,22 +90,31 @@ void Util::setColorsToHighlight(QWidget *widget, QPalette::ColorRole role) { if (role == QPalette::Base) { widget->setStyleSheet("QLineEdit {" - "font-weight: bold;" - "background-color: palette(highlight);" - "color: palette(highlighted-text);" - "selection-background-color: palette(alternate-base);" - "selection-color: palette(text);" + " font-weight: bold;" + " background-color: palette(highlight);" + " color: palette(highlighted-text);" + " selection-background-color: palette(alternate-base);" + " selection-color: palette(text);" + " padding-top: 2px;" + " padding-bottom: 2px;" + " border-radius: 4px;" "}" "QLineEdit:hover {" - "border: 2px solid palette(button-text);" + " border: 2px solid palette(button-text);" "}"); } else { - QPalette palette = QApplication::palette(); - palette.setColor(role, palette.color(palette.Highlight)); - palette.setColor(role == QPalette::Button ? QPalette::ButtonText : QPalette::WindowText, - palette.color(palette.HighlightedText)); - widget->setPalette(palette); - widget->setAutoFillBackground(true); + const auto highlight = QPalette().color(QPalette::Highlight).name(); + const auto text = QPalette().color(QPalette::HighlightedText).name(); + const QString style = QString("QWidget {" + " background-color: %1;" + " color: %2;" + " font-weight: bold;" + " padding-top: 2px;" + " padding-bottom: 2px;" + " border-radius: 4px;" + "}") + .arg(highlight, text); + widget->setStyleSheet(style); } } diff --git a/src/widgets/newprojectfolder.cpp b/src/widgets/newprojectfolder.cpp index dc9e2bb807..6555e40aba 100644 --- a/src/widgets/newprojectfolder.cpp +++ b/src/widgets/newprojectfolder.cpp @@ -290,18 +290,28 @@ void NewProjectFolder::on_recentListView_clicked(const QModelIndex &index) void NewProjectFolder::setColors() { - QPalette palette = ui->frame->palette(); - - palette.setColor(QPalette::WindowText, QPalette().color(QPalette::Highlight)); - ui->frame->setPalette(palette); - ui->frame_2->setPalette(palette); + const auto highlight = QPalette().color(QPalette::Highlight).name(); + const auto highlightedText = QPalette().color(QPalette::HighlightedText).name(); + const QString frameStyle = QString("QFrame#%1 { border: 4px solid %2; border-radius: 5px; }"); + ui->frame->setStyleSheet(frameStyle.arg("frame", highlight)); + ui->frame_2->setStyleSheet(frameStyle.arg("frame_2", highlight)); + + const QString labelStyle = QString("QLabel {" + " background-color: %1;" + " color: %2;" + " font-weight: bold;" + " margin: -4px -4px 0px -4px;" + " border-top-left-radius: 5px;" + " border-top-right-radius: 5px;" + "}") + .arg(highlight, highlightedText); + ui->newProjectLabel->setStyleSheet(labelStyle); + ui->newProjectLabel_2->setStyleSheet(labelStyle); + QPalette palette = ui->frame->palette(); palette.setColor(QPalette::WindowText, QPalette().color(QPalette::WindowText)); ui->widget->setPalette(palette); ui->widget_2->setPalette(palette); - - Util::setColorsToHighlight(ui->newProjectLabel); - Util::setColorsToHighlight(ui->newProjectLabel_2); } void NewProjectFolder::setProjectFolderButtonText(const QString &text) diff --git a/src/widgets/statuslabelwidget.cpp b/src/widgets/statuslabelwidget.cpp index 2f1e8e37b0..d588ab79d6 100644 --- a/src/widgets/statuslabelwidget.cpp +++ b/src/widgets/statuslabelwidget.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022 Meltytech, LLC + * Copyright (c) 2022-2026 Meltytech, LLC * * 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 @@ -65,6 +65,16 @@ StatusLabelWidget::StatusLabelWidget(QWidget *parent) connect(&m_timer, &QTimer::timeout, this, &StatusLabelWidget::onFadeOutFinished); } setLayout(m_layout); + + const auto highlight = QPalette().color(QPalette::Highlight).name(); + const auto text = QPalette().color(QPalette::HighlightedText).name(); + const QString style = QString("QWidget {" + " background-color: %1;" + " color: %2;" + " border-radius: 4px;" + "}") + .arg(highlight, text); + setStyleSheet(style); } StatusLabelWidget::~StatusLabelWidget() {} From 9f6eaff2fd2103bfd04a34e2003960c347211189 Mon Sep 17 00:00:00 2001 From: Dan Dennedy Date: Tue, 7 Jul 2026 13:07:45 -0700 Subject: [PATCH 02/10] Change playhead color to an orange-red --- src/qml/views/keyframes/keyframes.qml | 2 +- src/qml/views/timeline/timeline.qml | 2 +- src/qmltypes/qmlapplication.h | 2 ++ src/qmltypes/timelineitems.cpp | 3 ++- src/scrubbar.cpp | 7 ++++--- 5 files changed, 10 insertions(+), 6 deletions(-) diff --git a/src/qml/views/keyframes/keyframes.qml b/src/qml/views/keyframes/keyframes.qml index 7fba5d4c67..d74bfef9c0 100644 --- a/src/qml/views/keyframes/keyframes.qml +++ b/src/qml/views/keyframes/keyframes.qml @@ -484,7 +484,7 @@ Rectangle { id: cursor visible: producer.position > -1 && metadata !== null - color: activePalette.text + color: application.playheadColor width: 1 height: root.height - horizontalScrollBar.height x: producer.position * timeScale - tracksFlickable.contentX diff --git a/src/qml/views/timeline/timeline.qml b/src/qml/views/timeline/timeline.qml index fb302eba23..70a5e035fc 100644 --- a/src/qml/views/timeline/timeline.qml +++ b/src/qml/views/timeline/timeline.qml @@ -689,7 +689,7 @@ Rectangle { id: cursor visible: timeline.position > -1 - color: activePalette.text + color: application.playheadColor width: 1 height: root.height - horizontalScrollBar.height x: timeline.position * multitrack.scaleFactor - tracksFlickable.contentX diff --git a/src/qmltypes/qmlapplication.h b/src/qmltypes/qmlapplication.h index 0b44ac3cbe..05ed3e972d 100644 --- a/src/qmltypes/qmlapplication.h +++ b/src/qmltypes/qmlapplication.h @@ -35,6 +35,7 @@ class QmlApplication : public QObject Q_OBJECT Q_PROPERTY(Qt::WindowModality dialogModality READ dialogModality CONSTANT); Q_PROPERTY(QPoint mousePos READ mousePos); + Q_PROPERTY(QColor playheadColor READ playheadColor CONSTANT) Q_PROPERTY(QColor toolTipBaseColor READ toolTipBaseColor NOTIFY paletteChanged) Q_PROPERTY(QColor toolTipTextColor READ toolTipTextColor NOTIFY paletteChanged) Q_PROPERTY(QString OS READ OS CONSTANT) @@ -48,6 +49,7 @@ class QmlApplication : public QObject static QmlApplication &singleton(); static Qt::WindowModality dialogModality(); static QPoint mousePos(); + static QColor playheadColor() { return QColor(0xe0, 0x46, 0x4e); } static QColor toolTipBaseColor(); static QColor toolTipTextColor(); static QString OS(); diff --git a/src/qmltypes/timelineitems.cpp b/src/qmltypes/timelineitems.cpp index 744e9afaba..7e3e5cd6cd 100644 --- a/src/qmltypes/timelineitems.cpp +++ b/src/qmltypes/timelineitems.cpp @@ -20,6 +20,7 @@ #include "Logger.h" #include "mltcontroller.h" #include "models/multitrackmodel.h" +#include "qmltypes/qmlapplication.h" #include "qmltypes/qmlproducer.h" #include "settings.h" @@ -76,7 +77,7 @@ class TimelinePlayhead : public QQuickPaintedItem path.lineTo(width() / 2.0, height()); path.lineTo(0, 0); QPalette p; - painter->fillPath(path, p.color(QPalette::WindowText)); + painter->fillPath(path, QmlApplication::playheadColor()); } }; diff --git a/src/scrubbar.cpp b/src/scrubbar.cpp index 99eec3ca10..7d04365e2c 100644 --- a/src/scrubbar.cpp +++ b/src/scrubbar.cpp @@ -18,6 +18,7 @@ #include "scrubbar.h" #include "mltcontroller.h" +#include "qmltypes/qmlapplication.h" #include "settings.h" #include @@ -202,7 +203,7 @@ bool ScrubBar::onSeek(int value) void ScrubBar::paintEvent(QPaintEvent *e) { - QPen pen(QBrush(palette().text().color()), 2); + QPen pen(QBrush(QmlApplication::playheadColor()), 2); QPainter p(this); QRect r = e->rect(); p.setClipRect(r); @@ -211,12 +212,12 @@ void ScrubBar::paintEvent(QPaintEvent *e) if (!isEnabled()) return; - // draw pointer + // draw playhead QPolygon pa(3); const int x = selectionSize / 2 - 1; int head = m_margin + m_cursorPosition; pa.setPoints(3, head - x - 1, 0, head + x, 0, head, x); - p.setBrush(palette().text().color()); + p.setBrush(QmlApplication::playheadColor()); p.setPen(Qt::NoPen); p.drawPolygon(pa); p.setPen(pen); From 574b05a6f99e89e79030a3a3745186f9ff6fb798 Mon Sep 17 00:00:00 2001 From: Dan Dennedy Date: Tue, 7 Jul 2026 13:52:35 -0700 Subject: [PATCH 03/10] consolidate clip borders --- src/qml/views/timeline/Clip.qml | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/qml/views/timeline/Clip.qml b/src/qml/views/timeline/Clip.qml index f2f7a70725..a56c9ce69e 100644 --- a/src/qml/views/timeline/Clip.qml +++ b/src/qml/views/timeline/Clip.qml @@ -131,8 +131,6 @@ Rectangle { return 'image://thumbnail/' + hash + '/' + mltService + '/' + clipResource + '#' + time; } - border.color: (selected || Drag.active || trackIndex != originalTrackIndex) ? group < 0 ? 'red' : 'white' : 'black' - border.width: (isBlank && !selected) ? 0 : 1 topLeftRadius: _roundLeft ? _cornerRadius : 0 bottomLeftRadius: _roundLeft ? _cornerRadius : 0 topRightRadius: _roundRight ? _cornerRadius : 0 @@ -444,7 +442,7 @@ Rectangle { anchors.top: parent.top anchors.left: parent.left anchors.topMargin: parent.border.width - anchors.leftMargin: parent.border.width + ((isAudio || !settings.timelineShowThumbnails) ? filtersIcon.enabledWidth : inThumbnail.width + filtersIcon.width) + 2 + anchors.leftMargin: parent.border.width + ((isAudio || !settings.timelineShowThumbnails) ? filtersIcon.enabledWidth : inThumbnail.width + filtersIcon.width) width: label.width + 2 height: label.height } @@ -869,8 +867,8 @@ Rectangle { Rectangle { anchors.fill: parent color: 'transparent' - border.color: clipRoot.border.color - border.width: clipRoot.border.width + border.color: (selected || Drag.active || trackIndex != originalTrackIndex) ? group < 0 ? 'red' : 'white' : 'black' + border.width: (isBlank && !selected) ? 0 : 1 topLeftRadius: clipRoot.topLeftRadius bottomLeftRadius: clipRoot.bottomLeftRadius topRightRadius: clipRoot.topRightRadius From a92f4ad7d5e938a0289f73ea8cc12d2ef756f9cf Mon Sep 17 00:00:00 2001 From: Dan Dennedy Date: Tue, 7 Jul 2026 13:57:43 -0700 Subject: [PATCH 04/10] Refactor peaksPath initialization in TimelineWaveform for clarity --- src/qmltypes/timelineitems.cpp | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/qmltypes/timelineitems.cpp b/src/qmltypes/timelineitems.cpp index 7e3e5cd6cd..b4af2e1d49 100644 --- a/src/qmltypes/timelineitems.cpp +++ b/src/qmltypes/timelineitems.cpp @@ -182,7 +182,6 @@ class TimelineWaveform : public QQuickPaintedItem QPainterPath path; path.moveTo(-1, height()); QPainterPath peaksPath; - peaksPath.moveTo(-1, height()); int i = 0; const int dataSize = data->size(); for (; i < width(); ++i) { @@ -193,8 +192,13 @@ class TimelineWaveform : public QQuickPaintedItem qreal level = qMax(static_cast(data->at(idx)), static_cast(data->at(idx + 1))) / 256.0; - path.lineTo(i, height() - level * height()); - peaksPath.lineTo(i, height() - level * height()); + const qreal y = height() - level * height(); + path.lineTo(i, y); + if (peaksPath.elementCount() == 0) { + peaksPath.moveTo(i, y); + } else { + peaksPath.lineTo(i, y); + } } path.lineTo(i, height()); painter->fillPath(path, m_color.lighter()); From 0104e67f329a142aad82e76fba66cda3bf14a943 Mon Sep 17 00:00:00 2001 From: Dan Dennedy Date: Thu, 9 Jul 2026 12:40:34 -0700 Subject: [PATCH 05/10] even more round --- src/mainwindow.cpp | 4 ++-- src/qml/views/filter/filterview.qml | 4 ++-- src/qml/views/timeline/Clip.qml | 2 +- src/util.cpp | 12 ++++++------ src/widgets/newprojectfolder.cpp | 6 +++--- src/widgets/statuslabelwidget.cpp | 2 +- 6 files changed, 15 insertions(+), 15 deletions(-) diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 1c07dfd699..81efc56904 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -6755,7 +6755,7 @@ void MainWindow::updateLayoutSwitcher() button->setDefaultAction(ui->actionLayoutPlayer); layoutGrid->addWidget(button, 1, 2, Qt::AlignCenter); layoutSwitcher->setStyleSheet( - "QToolButton { border-radius: 4px; }" + "QToolButton { border-radius: 12px; }" "QToolButton:checked { background-color: palette(highlight);" " color: palette(highlighted-text); }"); } @@ -6780,7 +6780,7 @@ void MainWindow::updateLayoutSwitcher() ui->mainToolBar->insertAction(ui->dummyAction, ui->actionLayoutPlayer); } const QString layoutBtnStyle = QStringLiteral( - "QToolButton { border-radius: 4px; }" + "QToolButton { border-radius: 12px; }" "QToolButton:checked { background-color: palette(highlight);" " color: palette(highlighted-text); }"); const QList layoutActions{ui->actionLayoutLogging, diff --git a/src/qml/views/filter/filterview.qml b/src/qml/views/filter/filterview.qml index f643de1c78..ae2c02ea44 100644 --- a/src/qml/views/filter/filterview.qml +++ b/src/qml/views/filter/filterview.qml @@ -112,7 +112,7 @@ Rectangle { color: activePalette.highlight visible: attachedfiltersmodel.producerTitle != "" - radius: 4 + radius: 12 anchors { top: parent.top @@ -133,7 +133,7 @@ Rectangle { color: activePalette.highlightedText font.bold: true horizontalAlignment: Text.AlignHCenter - topPadding: 3 + topPadding: 4 bottomPadding: 3 anchors { diff --git a/src/qml/views/timeline/Clip.qml b/src/qml/views/timeline/Clip.qml index a56c9ce69e..6847f4d51c 100644 --- a/src/qml/views/timeline/Clip.qml +++ b/src/qml/views/timeline/Clip.qml @@ -49,7 +49,7 @@ Rectangle { property bool isTrackMute: false property bool elided: (width < 15) || (x + width < tracksFlickable.contentX) || (x > tracksFlickable.contentX + tracksFlickable.width) || (y + height < 0) || (y > tracksFlickable.contentY + tracksFlickable.contentHeight) property color clipColor: isBlank ? 'transparent' : isTransition ? 'mediumpurple' : isAudio ? 'darkseagreen' : root.shotcutBlue - readonly property real _cornerRadius: 5 + readonly property real _cornerRadius: 7.5 property bool _roundLeft: { if (isBlank || !trackRoot || trackRoot.clipCount === 0) return false; diff --git a/src/util.cpp b/src/util.cpp index 5f41cd50e9..4d0fb22676 100644 --- a/src/util.cpp +++ b/src/util.cpp @@ -90,14 +90,14 @@ void Util::setColorsToHighlight(QWidget *widget, QPalette::ColorRole role) { if (role == QPalette::Base) { widget->setStyleSheet("QLineEdit {" - " font-weight: bold;" " background-color: palette(highlight);" " color: palette(highlighted-text);" " selection-background-color: palette(alternate-base);" " selection-color: palette(text);" - " padding-top: 2px;" + " font-weight: bold;" + " padding-top: 3px;" " padding-bottom: 2px;" - " border-radius: 4px;" + " border-radius: 12px;" "}" "QLineEdit:hover {" " border: 2px solid palette(button-text);" @@ -109,9 +109,9 @@ void Util::setColorsToHighlight(QWidget *widget, QPalette::ColorRole role) " background-color: %1;" " color: %2;" " font-weight: bold;" - " padding-top: 2px;" - " padding-bottom: 2px;" - " border-radius: 4px;" + " padding-top: 4px;" + " padding-bottom: 3px;" + " border-radius: 12px;" "}") .arg(highlight, text); widget->setStyleSheet(style); diff --git a/src/widgets/newprojectfolder.cpp b/src/widgets/newprojectfolder.cpp index 6555e40aba..c2bac6950e 100644 --- a/src/widgets/newprojectfolder.cpp +++ b/src/widgets/newprojectfolder.cpp @@ -292,7 +292,7 @@ void NewProjectFolder::setColors() { const auto highlight = QPalette().color(QPalette::Highlight).name(); const auto highlightedText = QPalette().color(QPalette::HighlightedText).name(); - const QString frameStyle = QString("QFrame#%1 { border: 4px solid %2; border-radius: 5px; }"); + const QString frameStyle = QString("QFrame#%1 { border: 4px solid %2; border-radius: 8px; }"); ui->frame->setStyleSheet(frameStyle.arg("frame", highlight)); ui->frame_2->setStyleSheet(frameStyle.arg("frame_2", highlight)); @@ -301,8 +301,8 @@ void NewProjectFolder::setColors() " color: %2;" " font-weight: bold;" " margin: -4px -4px 0px -4px;" - " border-top-left-radius: 5px;" - " border-top-right-radius: 5px;" + " border-top-left-radius: 8px;" + " border-top-right-radius: 8px;" "}") .arg(highlight, highlightedText); ui->newProjectLabel->setStyleSheet(labelStyle); diff --git a/src/widgets/statuslabelwidget.cpp b/src/widgets/statuslabelwidget.cpp index d588ab79d6..b87a7776b6 100644 --- a/src/widgets/statuslabelwidget.cpp +++ b/src/widgets/statuslabelwidget.cpp @@ -71,7 +71,7 @@ StatusLabelWidget::StatusLabelWidget(QWidget *parent) const QString style = QString("QWidget {" " background-color: %1;" " color: %2;" - " border-radius: 4px;" + " border-radius: 14px;" "}") .arg(highlight, text); setStyleSheet(style); From 6c9346e22da260ac3091f5faa2f6aa6696020839 Mon Sep 17 00:00:00 2001 From: Dan Dennedy Date: Fri, 10 Jul 2026 15:41:27 -0700 Subject: [PATCH 06/10] Add rounding to timeline fade triangle --- src/qmltypes/timelineitems.cpp | 42 +++++++++++++++++++++++++++++++--- 1 file changed, 39 insertions(+), 3 deletions(-) diff --git a/src/qmltypes/timelineitems.cpp b/src/qmltypes/timelineitems.cpp index b4af2e1d49..587d433cd4 100644 --- a/src/qmltypes/timelineitems.cpp +++ b/src/qmltypes/timelineitems.cpp @@ -83,16 +83,52 @@ class TimelinePlayhead : public QQuickPaintedItem class TimelineTriangle : public QQuickPaintedItem { + Q_OBJECT + Q_PROPERTY(qreal cornerRadius READ cornerRadius WRITE setCornerRadius NOTIFY cornerRadiusChanged) + public: TimelineTriangle() { setAntialiasing(true); } + + qreal cornerRadius() const { return m_cornerRadius; } + + void setCornerRadius(qreal radius) + { + radius = qMax(0.0, radius); + if (qFuzzyCompare(m_cornerRadius, radius)) + return; + m_cornerRadius = radius; + emit cornerRadiusChanged(); + update(); + } + void paint(QPainter *painter) { + const qreal w = width(); + const qreal h = height(); + if (w <= 0.0 || h <= 0.0) + return; + + const qreal radius = qMin(m_cornerRadius, qMin(w, h)); QPainterPath path; - path.moveTo(0, 0); - path.lineTo(width(), 0); - path.lineTo(0, height()); + if (radius > 0.0) { + path.moveTo(0, h); + path.lineTo(0, radius); + path.quadTo(0, 0, radius, 0); + path.lineTo(w, 0); + } else { + path.moveTo(0, 0); + path.lineTo(w, 0); + path.lineTo(0, h); + } + path.closeSubpath(); painter->fillPath(path, Qt::black); } + +signals: + void cornerRadiusChanged(); + +private: + qreal m_cornerRadius{0.0}; }; class TimelineWaveform : public QQuickPaintedItem From ad068910cbd43017f97595eadc63e42b12a95578 Mon Sep 17 00:00:00 2001 From: Dan Dennedy Date: Fri, 10 Jul 2026 15:42:09 -0700 Subject: [PATCH 07/10] Prevent render outside rounded corners --- src/qml/views/timeline/Clip.qml | 56 +++++++++++++++++++-------------- 1 file changed, 32 insertions(+), 24 deletions(-) diff --git a/src/qml/views/timeline/Clip.qml b/src/qml/views/timeline/Clip.qml index 6847f4d51c..65604dd4c9 100644 --- a/src/qml/views/timeline/Clip.qml +++ b/src/qml/views/timeline/Clip.qml @@ -50,22 +50,24 @@ Rectangle { property bool elided: (width < 15) || (x + width < tracksFlickable.contentX) || (x > tracksFlickable.contentX + tracksFlickable.width) || (y + height < 0) || (y > tracksFlickable.contentY + tracksFlickable.contentHeight) property color clipColor: isBlank ? 'transparent' : isTransition ? 'mediumpurple' : isAudio ? 'darkseagreen' : root.shotcutBlue readonly property real _cornerRadius: 7.5 - property bool _roundLeft: { + property real _roundLeft: { if (isBlank || !trackRoot || trackRoot.clipCount === 0) - return false; + return 0; if (index === 0) - return true; + return _cornerRadius; const prev = trackRoot.clipAt(index - 1); - return prev !== null && prev !== undefined && prev.isBlank; + return (prev && prev.isBlank) ? _cornerRadius : 0; } - property bool _roundRight: { + property real _roundRight: { if (isBlank || !trackRoot) - return false; + return 0; if (index === trackRoot.clipCount - 1) - return true; + return _cornerRadius; const next = trackRoot ? trackRoot.clipAt(index + 1) : null; - return next !== null && next !== undefined && next.isBlank; + return (next && next.isBlank) ? _cornerRadius : 0; } + readonly property real _leftRoundedInset: _roundLeft / 2 + readonly property real _rightRoundedInset: _roundRight / 2 signal clicked(var clip, var mouse) signal clipRightClicked(var clip, var mouse) @@ -131,10 +133,10 @@ Rectangle { return 'image://thumbnail/' + hash + '/' + mltService + '/' + clipResource + '#' + time; } - topLeftRadius: _roundLeft ? _cornerRadius : 0 - bottomLeftRadius: _roundLeft ? _cornerRadius : 0 - topRightRadius: _roundRight ? _cornerRadius : 0 - bottomRightRadius: _roundRight ? _cornerRadius : 0 + topLeftRadius: _roundLeft + bottomLeftRadius: _roundLeft + topRightRadius: _roundRight + bottomRightRadius: _roundRight clip: true Drag.active: mouseArea.drag.active Drag.proposedAction: Qt.MoveAction @@ -318,7 +320,7 @@ Rectangle { anchors.right: parent.right anchors.top: parent.top anchors.topMargin: parent.border.width - anchors.rightMargin: parent.border.width + clipRoot.topRightRadius / 2 + anchors.rightMargin: parent.border.width + _rightRoundedInset anchors.bottom: parent.bottom anchors.bottomMargin: parent.height / 2 width: height * 16 / 9 @@ -333,7 +335,7 @@ Rectangle { anchors.left: parent.left anchors.top: parent.top anchors.topMargin: parent.border.width - anchors.leftMargin: parent.border.width + clipRoot.topLeftRadius / 2 + anchors.leftMargin: parent.border.width + _leftRoundedInset anchors.rightMargin: parent.border.width anchors.bottom: parent.bottom anchors.bottomMargin: parent.height / 2 @@ -356,11 +358,12 @@ Rectangle { id: waveform readonly property int maxWidth: Math.max(application.maxTextureSize / 2, 2048) - readonly property real leftOffset: _roundLeft ? _cornerRadius / 2 : parent.border.width - readonly property real rightOffset: _roundRight ? _cornerRadius / 2 : parent.border.width + readonly property real leftOffset: Math.max(_leftRoundedInset, parent.border.width) + readonly property real rightOffset: Math.max(_rightRoundedInset, parent.border.width) + readonly property real availableWidth: Math.max(0, clipRoot.width - leftOffset - rightOffset) visible: !elided && !isBlank && settings.timelineShowWaveforms && (parseInt(audioIndex) > -1 || audioIndex === 'all') - height: (isAudio || parent.height <= 20) ? parent.height - (_roundLeft || _roundRight ? _cornerRadius / 2 : 0) : parent.height / 2 + height: (isAudio || parent.height <= 20) ? parent.height - (_cornerRadius / 2) : parent.height / 2 anchors.left: parent.left anchors.bottom: parent.bottom anchors.leftMargin: leftOffset @@ -378,7 +381,7 @@ Rectangle { trackIndex: clipRoot.trackIndex clipIndex: clipRoot.readonlyClipIndex - width: Math.min(clipRoot.width - waveform.leftOffset - waveform.rightOffset, waveform.maxWidth) + width: Math.min(waveform.maxWidth, Math.max(0, waveform.availableWidth - index * waveform.maxWidth)) height: waveform.height fillColor: clipColor inPoint: Math.round((clipRoot.inPoint + index * waveform.maxWidth / timeScale) * speed) * channels @@ -442,7 +445,7 @@ Rectangle { anchors.top: parent.top anchors.left: parent.left anchors.topMargin: parent.border.width - anchors.leftMargin: parent.border.width + ((isAudio || !settings.timelineShowThumbnails) ? filtersIcon.enabledWidth : inThumbnail.width + filtersIcon.width) + anchors.leftMargin: parent.border.width + _leftRoundedInset + ((isAudio || !settings.timelineShowThumbnails) ? filtersIcon.enabledWidth : (inThumbnail.width + filtersIcon.width)) width: label.width + 2 height: label.height } @@ -452,6 +455,7 @@ Rectangle { text: clipName visible: !elided && !isBlank && !isTransition + width: Math.min(implicitWidth, parent.width - leftLabelBackground.anchors.leftMargin - _rightRoundedInset - 2 * parent.border.width) font.pointSize: 8 color: 'black' @@ -471,7 +475,7 @@ Rectangle { anchors.top: parent.top anchors.right: parent.right anchors.topMargin: parent.border.width - anchors.rightMargin: parent.border.width + ((isAudio || !settings.timelineShowThumbnails) ? (clipRoot.topRightRadius / 2) : outThumbnail.width) + anchors.rightMargin: parent.border.width + _rightRoundedInset + ((isAudio || !settings.timelineShowThumbnails) ? 0 : outThumbnail.width) width: labelRight.width + 2 height: labelRight.height } @@ -505,7 +509,7 @@ Rectangle { anchors.left: parent.left anchors.top: parent.top anchors.topMargin: parent.border.width - anchors.leftMargin: parent.border.width + ((isAudio || !settings.timelineShowThumbnails) ? (enabled ? width : 0) : inThumbnail.width) + (clipRoot.topLeftRadius / 2) + anchors.leftMargin: parent.border.width + _leftRoundedInset + ((isAudio || !settings.timelineShowThumbnails) ? (enabled ? width : 0) : inThumbnail.width) width: visible ? label.height : 0 height: label.height padding: 0 @@ -529,9 +533,11 @@ Rectangle { visible: !elided && !isBlank && !isTransition width: parent.fadeIn * timeScale height: parent.height - parent.border.width * 2 + cornerRadius: _roundLeft anchors.left: parent.left anchors.top: parent.top - anchors.margins: parent.border.width + anchors.leftMargin: parent.border.width + anchors.topMargin: parent.border.width opacity: 0.5 } @@ -626,9 +632,11 @@ Rectangle { visible: !elided && !isBlank && !isTransition width: parent.fadeOut * timeScale height: parent.height - parent.border.width * 2 + cornerRadius: _roundRight anchors.right: parent.right anchors.top: parent.top - anchors.margins: parent.border.width + anchors.rightMargin: parent.border.width + anchors.topMargin: parent.border.width opacity: 0.5 transform: Scale { @@ -873,6 +881,6 @@ Rectangle { bottomLeftRadius: clipRoot.bottomLeftRadius topRightRadius: clipRoot.topRightRadius bottomRightRadius: clipRoot.bottomRightRadius - z: 1 + z: 10 } } From b1cfa0acf3442c00ea7744ea7537492511501849 Mon Sep 17 00:00:00 2001 From: Dan Dennedy Date: Fri, 10 Jul 2026 15:48:56 -0700 Subject: [PATCH 08/10] Fix some rounding broken on different DPI --- src/mainwindow.cpp | 4 ++-- src/util.cpp | 4 ++-- src/widgets/statuslabelwidget.cpp | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 81efc56904..3df82123b8 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -6755,7 +6755,7 @@ void MainWindow::updateLayoutSwitcher() button->setDefaultAction(ui->actionLayoutPlayer); layoutGrid->addWidget(button, 1, 2, Qt::AlignCenter); layoutSwitcher->setStyleSheet( - "QToolButton { border-radius: 12px; }" + "QToolButton { border-radius: 8px; }" "QToolButton:checked { background-color: palette(highlight);" " color: palette(highlighted-text); }"); } @@ -6780,7 +6780,7 @@ void MainWindow::updateLayoutSwitcher() ui->mainToolBar->insertAction(ui->dummyAction, ui->actionLayoutPlayer); } const QString layoutBtnStyle = QStringLiteral( - "QToolButton { border-radius: 12px; }" + "QToolButton { border-radius: 8px; }" "QToolButton:checked { background-color: palette(highlight);" " color: palette(highlighted-text); }"); const QList layoutActions{ui->actionLayoutLogging, diff --git a/src/util.cpp b/src/util.cpp index 4d0fb22676..64d77d7d39 100644 --- a/src/util.cpp +++ b/src/util.cpp @@ -97,7 +97,7 @@ void Util::setColorsToHighlight(QWidget *widget, QPalette::ColorRole role) " font-weight: bold;" " padding-top: 3px;" " padding-bottom: 2px;" - " border-radius: 12px;" + " border-radius: 11px;" "}" "QLineEdit:hover {" " border: 2px solid palette(button-text);" @@ -111,7 +111,7 @@ void Util::setColorsToHighlight(QWidget *widget, QPalette::ColorRole role) " font-weight: bold;" " padding-top: 4px;" " padding-bottom: 3px;" - " border-radius: 12px;" + " border-radius: 11px;" "}") .arg(highlight, text); widget->setStyleSheet(style); diff --git a/src/widgets/statuslabelwidget.cpp b/src/widgets/statuslabelwidget.cpp index b87a7776b6..a6ba06fb58 100644 --- a/src/widgets/statuslabelwidget.cpp +++ b/src/widgets/statuslabelwidget.cpp @@ -71,7 +71,7 @@ StatusLabelWidget::StatusLabelWidget(QWidget *parent) const QString style = QString("QWidget {" " background-color: %1;" " color: %2;" - " border-radius: 14px;" + " border-radius: 12px;" "}") .arg(highlight, text); setStyleSheet(style); From bfbdcb73f16055ee343c67f6b1172acb5ad46117 Mon Sep 17 00:00:00 2001 From: Dan Dennedy Date: Thu, 13 Aug 2026 15:17:32 -0700 Subject: [PATCH 09/10] Change selection color to same as playhead --- src/models/playlistmodel.cpp | 3 ++- src/qml/views/keyframes/Keyframe.qml | 4 ++-- src/qml/views/keyframes/KeyframeClip.qml | 2 +- src/qml/views/keyframes/ParameterHead.qml | 2 +- src/qml/views/timeline/Clip.qml | 2 +- src/qml/views/timeline/SubtitleBar.qml | 2 +- src/qml/views/timeline/TrackHead.qml | 2 +- src/qml/views/timeline/timeline.qml | 4 ++-- src/scrubbar.cpp | 10 ++++++---- 9 files changed, 17 insertions(+), 14 deletions(-) diff --git a/src/models/playlistmodel.cpp b/src/models/playlistmodel.cpp index ebeaabd530..b9653b6e25 100644 --- a/src/models/playlistmodel.cpp +++ b/src/models/playlistmodel.cpp @@ -21,6 +21,7 @@ #include "database.h" #include "mainwindow.h" #include "proxymanager.h" +#include "qmltypes/qmlapplication.h" #include "settings.h" #include "shotcut_mlt_properties.h" #include "util.h" @@ -372,7 +373,7 @@ QVariant PlaylistModel::data(const QModelIndex &index, int role) const painter.drawImage(rect, *thumb); } if (parent.is_valid() && parent.get_int(kPlaylistIndexProperty) == index.row() + 1) { - QPen pen(Qt::red); + QPen pen(QmlApplication::playheadColor()); pen.setWidthF(1.5 * MAIN.devicePixelRatioF()); painter.setPen(pen); rect.setX(0); diff --git a/src/qml/views/keyframes/Keyframe.qml b/src/qml/views/keyframes/Keyframe.qml index a21c4fa044..29c0815a03 100644 --- a/src/qml/views/keyframes/Keyframe.qml +++ b/src/qml/views/keyframes/Keyframe.qml @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018-2025 Meltytech, LLC + * Copyright (c) 2018-2026 Meltytech, LLC * * 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 @@ -170,7 +170,7 @@ Rectangle { onPaint: { var ctx = getContext("2d"); if (isSelected) { - ctx.fillStyle = 'red'; + ctx.fillStyle = application.playheadColor; } else { ctx.fillStyle = activePalette.buttonText; } diff --git a/src/qml/views/keyframes/KeyframeClip.qml b/src/qml/views/keyframes/KeyframeClip.qml index 299a0d47cd..7ef088f660 100644 --- a/src/qml/views/keyframes/KeyframeClip.qml +++ b/src/qml/views/keyframes/KeyframeClip.qml @@ -70,7 +70,7 @@ Rectangle { } width: clipDuration * timeScale - border.color: selected ? 'red' : 'black' + border.color: selected ? application.playheadColor : 'black' border.width: 1 clip: true opacity: isBlank ? 0.5 : 1 diff --git a/src/qml/views/keyframes/ParameterHead.qml b/src/qml/views/keyframes/ParameterHead.qml index 3da7320b0d..53f7eeae6b 100644 --- a/src/qml/views/keyframes/ParameterHead.qml +++ b/src/qml/views/keyframes/ParameterHead.qml @@ -35,7 +35,7 @@ Rectangle { signal rightClicked color: selected ? selectedTrackColor : (delegateIndex % 2) ? activePalette.alternateBase : activePalette.base - border.color: selected ? 'red' : 'transparent' + border.color: selected ? application.playheadColor : 'transparent' border.width: selected ? 1 : 0 clip: true state: 'normal' diff --git a/src/qml/views/timeline/Clip.qml b/src/qml/views/timeline/Clip.qml index dcdc04a485..106a99ef6d 100644 --- a/src/qml/views/timeline/Clip.qml +++ b/src/qml/views/timeline/Clip.qml @@ -919,7 +919,7 @@ Rectangle { Rectangle { anchors.fill: parent color: 'transparent' - border.color: (selected || Drag.active || trackIndex != originalTrackIndex) ? group < 0 ? 'red' : 'white' : 'black' + border.color: (selected || Drag.active || trackIndex != originalTrackIndex) ? group < 0 ? application.playheadColor : 'white' : 'black' border.width: (isBlank && !selected) ? 0 : 1 topLeftRadius: clipRoot.topLeftRadius bottomLeftRadius: clipRoot.bottomLeftRadius diff --git a/src/qml/views/timeline/SubtitleBar.qml b/src/qml/views/timeline/SubtitleBar.qml index d5a5b66788..aff0db3996 100644 --- a/src/qml/views/timeline/SubtitleBar.qml +++ b/src/qml/views/timeline/SubtitleBar.qml @@ -124,7 +124,7 @@ Item { width: subtitle ? subtitle.width : 0 height: subtitle ? subtitle.height : 0 color: 'transparent' - border.color: 'red' + border.color: application.playheadColor } } } diff --git a/src/qml/views/timeline/TrackHead.qml b/src/qml/views/timeline/TrackHead.qml index 8883ac3452..5145a6161c 100644 --- a/src/qml/views/timeline/TrackHead.qml +++ b/src/qml/views/timeline/TrackHead.qml @@ -246,7 +246,7 @@ Rectangle { Component.onCompleted: _syncTrackGain() color: selected ? selectedTrackColor : (index % 2) ? activePalette.alternateBase : activePalette.base - border.color: selected ? 'red' : 'transparent' + border.color: selected ? application.playheadColor : 'transparent' border.width: selected ? 1 : 0 clip: true state: 'normal' diff --git a/src/qml/views/timeline/timeline.qml b/src/qml/views/timeline/timeline.qml index 994488c767..642302aef2 100644 --- a/src/qml/views/timeline/timeline.qml +++ b/src/qml/views/timeline/timeline.qml @@ -189,7 +189,7 @@ Rectangle { width: headerWidth height: rulerFlickable.height color: selected ? shotcutBlue : activePalette.window - border.color: selected ? 'red' : 'transparent' + border.color: selected ? application.playheadColor : 'transparent' border.width: selected ? 1 : 0 visible: trackHeaderRepeater.count z: 1 @@ -621,7 +621,7 @@ Rectangle { width: clipN ? clipN.width : 0 height: track ? track.height : 0 color: 'transparent' - border.color: (clipN && clipN.group < 0) ? 'red' : 'white' + border.color: (clipN && clipN.group < 0) ? application.playheadColor : 'white' visible: clipN && !clipN.Drag.active && clipN.trackIndex === clipN.originalTrackIndex } } diff --git a/src/scrubbar.cpp b/src/scrubbar.cpp index 7d04365e2c..3070133cd4 100644 --- a/src/scrubbar.cpp +++ b/src/scrubbar.cpp @@ -203,7 +203,8 @@ bool ScrubBar::onSeek(int value) void ScrubBar::paintEvent(QPaintEvent *e) { - QPen pen(QBrush(QmlApplication::playheadColor()), 2); + QPen pen(QBrush(palette().text().color()), 2); + // QPen pen(QBrush(QmlApplication::playheadColor()), 2); QPainter p(this); QRect r = e->rect(); p.setClipRect(r); @@ -221,6 +222,7 @@ void ScrubBar::paintEvent(QPaintEvent *e) p.setPen(Qt::NoPen); p.drawPolygon(pa); p.setPen(pen); + p.setPen(QPen(QBrush(QmlApplication::playheadColor()), 2)); if (m_head >= 0) { head = m_margin + m_head * m_scale; p.drawLine(head, 0, head, height() - 1); @@ -240,7 +242,7 @@ void ScrubBar::paintEvent(QPaintEvent *e) p.setPen(Qt::NoPen); p.drawPolygon(pa); p.setPen(pen); - p.drawLine(in, 0, in, selectionSize - 1); + p.drawLine(in, 0, in, selectionSize - 2); } // draw out point @@ -257,7 +259,7 @@ void ScrubBar::paintEvent(QPaintEvent *e) p.setPen(Qt::NoPen); p.drawPolygon(pa); p.setPen(pen); - p.drawLine(out, 0, out, selectionSize - 1); + p.drawLine(out, 0, out, selectionSize - 2); } } @@ -304,7 +306,7 @@ void ScrubBar::updatePixmap() if (m_in > -1 && m_out > m_in) { const int in = m_in * m_scale * ratio; const int out = m_out * m_scale * ratio; - p.fillRect(l_margin + in, 0, out - in, l_selectionSize, Qt::red); + p.fillRect(l_margin + in, 0, out - in, l_selectionSize, QmlApplication::playheadColor()); p.fillRect(l_margin + in + (2 + ratio), ratio, // 2 for the in point line out - in - 2 * (2 + ratio) - qFloor(0.5 * ratio), From 1162cdf1f701776c5fde58565b7f12174ac380da Mon Sep 17 00:00:00 2001 From: Dan Dennedy Date: Thu, 20 Aug 2026 14:48:30 -0700 Subject: [PATCH 10/10] change color of header divider --- src/qml/views/timeline/timeline.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/qml/views/timeline/timeline.qml b/src/qml/views/timeline/timeline.qml index 642302aef2..b5ddeba6d9 100644 --- a/src/qml/views/timeline/timeline.qml +++ b/src/qml/views/timeline/timeline.qml @@ -404,7 +404,7 @@ Rectangle { Rectangle { // thin dividing line between headers and tracks - color: activePalette.windowText + color: activePalette.base width: 1 x: parent.x + parent.width anchors.top: parent.top