From 4b1862fdb166354f80d48b734d8a7d93781b1f1f Mon Sep 17 00:00:00 2001 From: Ali Kianian Date: Thu, 14 Sep 2023 09:51:41 +0300 Subject: [PATCH] QmlDesigner: Flash transient scrollbars only when they are enabled Visibility has a more complex definition in transient scrollbars since they are transient. Also, it's meaningful when it's disabled, it shouldn't be flashed. So here we use this ability to prevent them from being flashed when they are disabled. Also, the enabled property would be changed instead of the visibility for the cases that transient scrollbars are out of the scroll area. (TimelineWidget and TransitionEditorWidget) Task-number: QDS-10644 Change-Id: If74d71571a216153a2d3aa09694760d7a02026ca Reviewed-by: Thomas Hartmann --- src/libs/utils/transientscroll.cpp | 12 ++++++++++- .../timelineeditor/timelinewidget.cpp | 20 +++++++++++++------ .../transitioneditorwidget.cpp | 20 +++++++++++++------ 3 files changed, 39 insertions(+), 13 deletions(-) diff --git a/src/libs/utils/transientscroll.cpp b/src/libs/utils/transientscroll.cpp index 1d3df1259d8..3a0a9153769 100644 --- a/src/libs/utils/transientscroll.cpp +++ b/src/libs/utils/transientscroll.cpp @@ -365,13 +365,23 @@ ScrollBar::~ScrollBar() void ScrollBar::flash() { - if (!d->flashed && style()->styleHint(QStyle::SH_ScrollBar_Transient, nullptr, this)) { + if (!style()->styleHint(QStyle::SH_ScrollBar_Transient, nullptr, this)) + return; + + if (!isEnabled()) { + d->flashed = false; + hide(); + return; + } + + if (!d->flashed) { d->flashed = true; if (!isVisible()) show(); else update(); } + if (!d->flashTimer) d->flashTimer = startTimer(0); } diff --git a/src/plugins/qmldesigner/components/timelineeditor/timelinewidget.cpp b/src/plugins/qmldesigner/components/timelineeditor/timelinewidget.cpp index f6e9a3ad27c..b05083ff054 100644 --- a/src/plugins/qmldesigner/components/timelineeditor/timelinewidget.cpp +++ b/src/plugins/qmldesigner/components/timelineeditor/timelinewidget.cpp @@ -538,12 +538,17 @@ void TimelineWidget::invalidateTimelinePosition(const QmlTimeline &timeline) void TimelineWidget::setupScrollbar(int min, int max, int current) { - bool b = m_scrollbar->blockSignals(true); - m_scrollbar->setRange(min, max); - m_scrollbar->setValue(current); - m_scrollbar->setSingleStep((max - min) / 10); - m_scrollbar->blockSignals(b); - m_scrollbar->flash(); + int singleStep = (max - min) / 10; + + if (m_scrollbar->minimum() != min || m_scrollbar->maximum() != max + || m_scrollbar->value() != current || m_scrollbar->singleStep() != singleStep) { + bool b = m_scrollbar->blockSignals(true); + m_scrollbar->setRange(min, max); + m_scrollbar->setValue(current); + m_scrollbar->setSingleStep(singleStep); + m_scrollbar->blockSignals(b); + m_scrollbar->flash(); + } } void TimelineWidget::setTimelineId(const QString &id) @@ -575,6 +580,7 @@ void TimelineWidget::setTimelineActive(bool b) m_toolbar->setVisible(true); m_graphicsView->setVisible(true); m_rulerView->setVisible(true); + m_scrollbar->setEnabled(true); // Set the transient scrollbar enabled to be able to flash it. m_scrollbar->setVisible(true); m_addButton->setVisible(false); m_onboardingContainer->setVisible(false); @@ -584,6 +590,8 @@ void TimelineWidget::setTimelineActive(bool b) m_toolbar->setVisible(false); m_graphicsView->setVisible(false); m_rulerView->setVisible(false); + m_scrollbar->setEnabled( + false); // Set the transient scrollbar disabled to prevent it from being flashed. m_scrollbar->setVisible(false); m_statusBar->clear(); m_addButton->setVisible(true); diff --git a/src/plugins/qmldesigner/components/transitioneditor/transitioneditorwidget.cpp b/src/plugins/qmldesigner/components/transitioneditor/transitioneditorwidget.cpp index 6cb9c285be7..235722e4c8f 100644 --- a/src/plugins/qmldesigner/components/transitioneditor/transitioneditorwidget.cpp +++ b/src/plugins/qmldesigner/components/transitioneditor/transitioneditorwidget.cpp @@ -231,6 +231,7 @@ void TransitionEditorWidget::setTransitionActive(bool b) m_toolbar->setVisible(true); m_graphicsView->setVisible(true); m_rulerView->setVisible(true); + m_scrollbar->setEnabled(true); // Set the transient scrollbar enabled to be able to flash it. m_scrollbar->setVisible(true); m_addButton->setVisible(false); m_onboardingContainer->setVisible(false); @@ -240,6 +241,8 @@ void TransitionEditorWidget::setTransitionActive(bool b) m_toolbar->setVisible(false); m_graphicsView->setVisible(false); m_rulerView->setVisible(false); + m_scrollbar->setEnabled( + false); // Set the transient scrollbar disabled to prevent it from being flashed. m_scrollbar->setVisible(false); m_addButton->setVisible(true); m_onboardingContainer->setVisible(true); @@ -378,12 +381,17 @@ TransitionEditorToolBar *TransitionEditorWidget::toolBar() const void TransitionEditorWidget::setupScrollbar(int min, int max, int current) { - bool b = m_scrollbar->blockSignals(true); - m_scrollbar->setMinimum(min); - m_scrollbar->setMaximum(max); - m_scrollbar->setValue(current); - m_scrollbar->setSingleStep((max - min) / 10); - m_scrollbar->blockSignals(b); + int singleStep = (max - min) / 10; + + if (m_scrollbar->minimum() != min || m_scrollbar->maximum() != max + || m_scrollbar->value() != current || m_scrollbar->singleStep() != singleStep) { + bool b = m_scrollbar->blockSignals(true); + m_scrollbar->setRange(min, max); + m_scrollbar->setValue(current); + m_scrollbar->setSingleStep(singleStep); + m_scrollbar->blockSignals(b); + m_scrollbar->flash(); + } } void TransitionEditorWidget::showEvent([[maybe_unused]] QShowEvent *event)