fading implemented

This commit is contained in:
Uwe Rathmann 2023-11-03 10:12:35 +01:00
parent 615fcffe44
commit 4102276f79
13 changed files with 99 additions and 58 deletions

View File

@ -620,6 +620,10 @@ void Editor::setupDialogButtonBoxColors(
void Editor::setupDrawerMetrics()
{
using Q = QskDrawer;
using A = QskAspect;
setAnimation( Q::Panel | A::Position, 300, QEasingCurve::OutCubic );
}
void Editor::setupDrawerColors( QskAspect::Section, const QskFluent2Theme& )
@ -738,6 +742,7 @@ void Editor::setupListViewColors(
void Editor::setupMenuMetrics()
{
using Q = QskMenu;
using A = QskAspect;
setPadding( Q::Panel, { 4, 6, 4, 6 } );
setBoxBorderMetrics( Q::Panel, 1 );
@ -751,6 +756,8 @@ void Editor::setupMenuMetrics()
setStrutSize( Q::Icon, 12, 12 );
setPadding( Q::Icon, { 8, 8, 0, 8 } );
setAnimation( Q::Panel | A::Position, 100 );
}
void Editor::setupMenuColors(
@ -867,8 +874,6 @@ void Editor::setupPopup( const QskFluent2Theme& theme )
setHint( Q::Overlay | A::Style, true );
setGradient( Q::Overlay, pal.background.overlay.defaultColor );
setAnimation( Q::Popup, 150 );
}
void Editor::setupProgressBarMetrics()
@ -1874,6 +1879,8 @@ void Editor::setupSwitchButtonColors(
void Editor::setupSubWindow( const QskFluent2Theme& theme )
{
using Q = QskSubWindow;
using A = QskAspect;
const auto& pal = theme.palette;
setPadding( Q::Panel, { 0, 31, 0, 0 } );
@ -1891,6 +1898,8 @@ void Editor::setupSubWindow( const QskFluent2Theme& theme )
setColor( Q::TitleBarText, pal.fillColor.text.primary );
setAlignment( Q::TitleBarText, Qt::AlignLeft );
setTextOptions( Q::TitleBarText, Qt::ElideRight, QskTextOptions::NoWrap );
setAnimation( Q::Panel | A::Position, 300, QEasingCurve::OutCubic );
}
void Editor::setupVirtualKeyboardMetrics()

View File

@ -331,8 +331,6 @@ void Editor::setupPopup()
setHint( Q::Overlay | A::Style, true );
setGradient( Q::Overlay, stateLayerColor( m_pal.outline, 0.8 ) );
setAnimation( Q::Popup, qskDuration );
}
void Editor::setupMenu()
@ -381,6 +379,8 @@ void Editor::setupMenu()
setFontRole( Q::Text, QskMaterial3Skin::M3BodyMedium );
setAnimation( Q::Cursor | A::Position | A::Metric, 75, QEasingCurve::OutCubic );
setAnimation( Q::Panel | A::Position, 75 );
}
void Editor::setupTextLabel()
@ -806,6 +806,10 @@ void Editor::setupDialogButtonBox()
void Editor::setupDrawer()
{
using Q = QskDrawer;
using A = QskAspect;
setAnimation( Q::Panel | A::Position, 300, QEasingCurve::OutCubic );
}
void Editor::setupSlider()
@ -1255,6 +1259,7 @@ void Editor::setupSubWindow()
for ( auto subControl : { Q::Panel, Q::TitleBarPanel, Q::TitleBarText } )
setAnimation( subControl | A::Color, qskDuration );
setAnimation( Q::Panel | A::Position, qskDuration, QEasingCurve::OutCubic );
}
QskMaterial3Theme::QskMaterial3Theme( QskSkin::ColorScheme colorScheme )

View File

@ -410,8 +410,6 @@ void Editor::setupPopup()
setHint( Q::Overlay | A::Style, true );
setGradient( Q::Overlay, qRgba( 220, 220, 220, 150 ) );
setAnimation( Q::Popup, 200 );
}
void Editor::setupMenu()
@ -449,6 +447,7 @@ void Editor::setupMenu()
setGraphicRole( Q::Icon | Q::Selected, CursorSymbol );
setAnimation( Q::Cursor | A::Position | A::Metric, 75, QEasingCurve::OutCubic );
setAnimation( Q::Panel | A::Position, 100 );
}
void Editor::setupTextLabel()
@ -759,6 +758,10 @@ void Editor::setupDialogButtonBox()
void Editor::setupDrawer()
{
using Q = QskDrawer;
using A = QskAspect;
setAnimation( Q::Panel | A::Position, 300, QEasingCurve::OutCubic );
}
void Editor::setupTabButton()
@ -1120,8 +1123,12 @@ void Editor::setupSubWindow()
setAlignment( Q::TitleBarText, Qt::AlignLeft | Qt::AlignVCenter );
#if 1
for ( auto subControl : { Q::Panel, Q::TitleBarPanel, Q::TitleBarText } )
setAnimation( subControl | A::Color, qskDuration );
#endif
setAnimation( Q::Panel | A::Position, qskDuration, QEasingCurve::OutCubic );
}
void Editor::setupSpinBox()

View File

@ -19,6 +19,8 @@ QSK_QT_PRIVATE_BEGIN
#include <private/qquickitemchangelistener_p.h>
QSK_QT_PRIVATE_END
QSK_SUBCONTROL( QskDrawer, Panel )
static inline qreal qskDefaultDragMargin()
{
// a skin hint ???
@ -79,7 +81,7 @@ static inline QRectF qskAlignedToEdge(
static QPointF qskDrawerTranslation( const QskDrawer* drawer, const QSizeF& size )
{
const auto ratio = 1.0 - drawer->transitioningFactor();
const auto ratio = 1.0 - drawer->fadingFactor();
auto dx = 0.0;
auto dy = 0.0;
@ -170,7 +172,7 @@ namespace
bool isAcceptedPos( const QPointF& pos ) const override
{
auto drawer = qobject_cast< const QskDrawer* >( targetItem() );
if ( drawer->isTransitioning() )
if ( drawer->isFading() )
return false;
auto rect = qskItemRect( watchedItem() );
@ -255,8 +257,7 @@ QskDrawer::QskDrawer( Qt::Edge edge, QQuickItem* parentItem )
setAutoLayoutChildren( true );
setInteractive( true );
connect( this, &QskPopup::transitioningChanged,
this, &QQuickItem::setClip );
connect( this, &QskPopup::fadingChanged, this, &QQuickItem::setClip );
}
QskDrawer::~QskDrawer()
@ -393,12 +394,12 @@ void QskDrawer::updateResources()
void QskDrawer::updateNode( QSGNode* node )
{
if ( isTransitioning() && clip() )
if ( isFading() && clip() )
{
if ( auto clipNode = QQuickItemPrivate::get( this )->clipNode() )
{
/*
The clipRect is changing while transitioning. Couldn't
The clipRect is changing while fading. Couldn't
find a way how to trigger updates - maybe be enabling/disabling
the clip. So we do the updates manually. TODO ...
*/
@ -416,7 +417,7 @@ void QskDrawer::updateNode( QSGNode* node )
QRectF QskDrawer::clipRect() const
{
if ( isTransitioning() && parentItem() )
if ( isFading() && parentItem() )
{
/*
We might not fit into our parent and our children not
@ -454,4 +455,9 @@ QRectF QskDrawer::clipRect() const
return Inherited::clipRect();
}
QskAspect QskDrawer::fadingAspect() const
{
return QskDrawer::Panel | QskAspect::Position;
}
#include "moc_QskDrawer.cpp"

View File

@ -23,6 +23,8 @@ class QSK_EXPORT QskDrawer : public QskPopup
WRITE setInteractive NOTIFY interactiveChanged )
public:
QSK_SUBCONTROLS( Panel );
QskDrawer( QQuickItem* = nullptr );
QskDrawer( Qt::Edge, QQuickItem* = nullptr );
@ -39,6 +41,7 @@ class QSK_EXPORT QskDrawer : public QskPopup
qreal dragMargin() const;
QRectF clipRect() const override;
QskAspect fadingAspect() const override;
Q_SIGNALS:
void edgeChanged( Qt::Edge );

View File

@ -22,7 +22,6 @@ QSK_QT_PRIVATE_BEGIN
#include <private/qquickitem_p.h>
QSK_QT_PRIVATE_END
QSK_SUBCONTROL( QskMenu, Overlay )
QSK_SUBCONTROL( QskMenu, Panel )
QSK_SUBCONTROL( QskMenu, Segment )
QSK_SUBCONTROL( QskMenu, Cursor )
@ -72,10 +71,10 @@ QskMenu::QskMenu( QQuickItem* parent )
initSizePolicy( QskSizePolicy::Fixed, QskSizePolicy::Fixed );
// we hide the focus indicator while sliding
connect( this, &QskPopup::transitioningChanged,
connect( this, &QskPopup::fadingChanged,
this, &QskControl::focusIndicatorRectChanged );
connect( this, &QskPopup::transitioningChanged,
connect( this, &QskPopup::fadingChanged,
this, &QQuickItem::setClip );
connect( this, &QskPopup::opened, this,
@ -90,7 +89,7 @@ QskMenu::~QskMenu()
QRectF QskMenu::clipRect() const
{
if ( isTransitioning() )
if ( isFading() )
{
constexpr qreal d = 1e6;
return QRectF( -d, m_data->origin.y() - y(), 2.0 * d, d );
@ -283,23 +282,23 @@ QString QskMenu::triggeredText() const
void QskMenu::updateResources()
{
if ( isTransitioning() )
{
const auto dy = ( 1.0 - transitioningFactor() ) * height();
setPosition( m_data->origin.x(), m_data->origin.y() - dy );
}
qreal dy = 0.0;
if ( isFading() )
dy = ( 1.0 - fadingFactor() ) * height();
setPosition( m_data->origin.x(), m_data->origin.y() - dy );
Inherited::updateResources();
}
void QskMenu::updateNode( QSGNode* node )
{
if ( isTransitioning() && clip() )
if ( isFading() && clip() )
{
if ( auto clipNode = QQuickItemPrivate::get( this )->clipNode() )
{
/*
The clipRect is changing while transitioning. Couldn't
The clipRect is changing while fading. Couldn't
find a way how to trigger updates - maybe be enabling/disabling
the clip. So we do the updates manually. TODO ...
*/
@ -500,7 +499,7 @@ void QskMenu::aboutToShow()
QRectF QskMenu::focusIndicatorRect() const
{
if ( isTransitioning() )
if ( isFading() )
return QRectF();
if( currentIndex() >= 0 )
@ -544,6 +543,11 @@ void QskMenu::trigger( int index )
}
}
QskAspect QskMenu::fadingAspect() const
{
return QskMenu::Panel | QskAspect::Position;
}
int QskMenu::exec()
{
(void) execPopup();

View File

@ -37,7 +37,7 @@ class QSK_EXPORT QskMenu : public QskPopup
using Inherited = QskPopup;
public:
QSK_SUBCONTROLS( Overlay, Panel, Segment, Cursor, Text, Icon, Separator )
QSK_SUBCONTROLS( Panel, Segment, Cursor, Text, Icon, Separator )
QSK_STATES( Selected, Pressed )
QskMenu( QQuickItem* parentItem = nullptr );
@ -82,6 +82,7 @@ class QSK_EXPORT QskMenu : public QskPopup
bool isPressed() const;
QRectF clipRect() const override;
QskAspect fadingAspect() const override;
Q_INVOKABLE int exec();

View File

@ -19,16 +19,10 @@ QSK_QT_PRIVATE_BEGIN
#include <private/qquickitem_p.h>
QSK_QT_PRIVATE_END
QSK_SUBCONTROL( QskPopup, Popup )
QSK_SUBCONTROL( QskPopup, Overlay )
QSK_SYSTEM_STATE( QskPopup, Closed, QskAspect::FirstSystemState << 1 )
static QskAspect qskTransitioningAspect()
{
return QskPopup::Popup | QskAspect::Metric;
}
static void qskSetFocus( QQuickItem* item, bool on )
{
if ( item->window() == nullptr )
@ -83,11 +77,11 @@ static bool qskReplayMousePress()
return false;
}
static void qskStartTransition( QskPopup* popup, bool on )
static void qskStartFading( QskPopup* popup, bool on )
{
const auto aspect = qskTransitioningAspect();
const auto aspect = popup->fadingAspect();
auto hint = popup->animationHint( aspect.subControl() );
auto hint = popup->animationHint( aspect );
if ( hint.isValid() )
{
@ -240,11 +234,11 @@ void QskPopup::setOpen( bool on )
else
Q_EMIT closed();
qskStartTransition( this, on );
qskStartFading( this, on );
if ( isTransitioning() )
if ( isFading() )
{
Q_EMIT transitioningChanged( true );
Q_EMIT fadingChanged( true );
}
else
{
@ -263,14 +257,19 @@ bool QskPopup::isOpen() const
return !hasSkinState( QskPopup::Closed );
}
bool QskPopup::isTransitioning() const
QskAspect QskPopup::fadingAspect() const
{
return runningHintAnimator( qskTransitioningAspect() ) != nullptr;
return QskAspect();
}
qreal QskPopup::transitioningFactor() const
bool QskPopup::isFading() const
{
if ( auto animator = runningHintAnimator( qskTransitioningAspect() ) )
return runningHintAnimator( fadingAspect() ) != nullptr;
}
qreal QskPopup::fadingFactor() const
{
if ( auto animator = runningHintAnimator( fadingAspect() ) )
return animator->currentValue().value< qreal >();
return isOpen() ? 1.0 : 0.0;
@ -336,7 +335,7 @@ bool QskPopup::isTransitionAccepted( QskAspect aspect ) const
if ( ( aspect.value() == 0 ) )
return true;
if ( aspect.subControl() == effectiveSubcontrol( QskPopup::Popup ) )
if ( aspect.subControl() == effectiveSubcontrol( fadingAspect().subControl() ) )
return true;
if ( aspect.subControl() == effectiveSubcontrol( QskPopup::Overlay ) )
@ -487,7 +486,7 @@ bool QskPopup::event( QEvent* event )
const auto animatorEvent = static_cast< QskAnimatorEvent* >( event );
if ( ( animatorEvent->state() == QskAnimatorEvent::Terminated )
&& ( animatorEvent->aspect() == qskTransitioningAspect() ) )
&& ( animatorEvent->aspect() == fadingAspect() ) )
{
if ( !isOpen() )
{
@ -497,7 +496,7 @@ bool QskPopup::event( QEvent* event )
deleteLater();
}
Q_EMIT transitioningChanged( false );
Q_EMIT fadingChanged( false );
}
break;
@ -645,7 +644,7 @@ int QskPopup::execPopup()
*/
connect( popup, &QObject::destroyed, this, &EventLoop::reject );
connect( popup, &QskPopup::transitioningChanged, this, &EventLoop::maybeQuit );
connect( popup, &QskPopup::fadingChanged, this, &EventLoop::maybeQuit );
connect( popup, &QskPopup::openChanged, this, &EventLoop::maybeQuit );
}
@ -660,7 +659,7 @@ int QskPopup::execPopup()
{
if ( auto popup = qobject_cast< const QskPopup* >( parent() ) )
{
if ( popup->isOpen() || popup->isTransitioning() )
if ( popup->isOpen() || popup->isFading() )
return;
}
@ -668,7 +667,7 @@ int QskPopup::execPopup()
}
};
if ( isOpen() || isTransitioning() )
if ( isOpen() || isFading() )
{
qWarning() << "QskPopup::exec: popup is already opened";
return -1;

View File

@ -14,7 +14,7 @@ class QSK_EXPORT QskPopup : public QskControl
Q_PROPERTY( bool open READ isOpen WRITE setOpen NOTIFY openChanged )
Q_PROPERTY( bool modal READ isModal WRITE setModal NOTIFY modalChanged )
Q_PROPERTY( bool transitioning READ isTransitioning NOTIFY transitioningChanged )
Q_PROPERTY( bool fading READ isFading NOTIFY fadingChanged )
Q_PROPERTY( bool overlay READ hasOverlay
WRITE setOverlay RESET resetOverlay NOTIFY overlayChanged )
@ -24,7 +24,7 @@ class QSK_EXPORT QskPopup : public QskControl
using Inherited = QskControl;
public:
QSK_SUBCONTROLS( Popup, Overlay )
QSK_SUBCONTROLS( Overlay )
QSK_STATES( Closed )
enum PopupFlag
@ -56,12 +56,13 @@ class QSK_EXPORT QskPopup : public QskControl
void setPriority( uint );
uint priority() const;
bool isTransitioning() const;
qreal transitioningFactor() const;
bool isOpen() const;
bool isClosed() const;
bool isFading() const;
qreal fadingFactor() const;
virtual QskAspect fadingAspect() const;
virtual QRectF overlayRect() const;
public Q_SLOTS:
@ -75,7 +76,7 @@ class QSK_EXPORT QskPopup : public QskControl
void opened();
void closed();
void openChanged( bool );
void transitioningChanged( bool );
void fadingChanged( bool );
void modalChanged( bool );
void overlayChanged( bool );

View File

@ -50,7 +50,7 @@ QSGNode* QskPopupSkinlet::updateOverlayNode(
{
using Q = QskPopup;
const auto factor = popup->transitioningFactor();
const auto factor = popup->fadingFactor();
if ( factor <= 0.0 )
return nullptr;

View File

@ -255,8 +255,13 @@ void QskSubWindow::itemChange( QQuickItem::ItemChange change,
void QskSubWindow::updateResources()
{
setOpacity( transitioningFactor() );
setOpacity( fadingFactor() );
Inherited::updateResources();
}
QskAspect QskSubWindow::fadingAspect() const
{
return QskSubWindow::Panel | QskAspect::Position;
}
#include "moc_QskSubWindow.cpp"

View File

@ -83,6 +83,7 @@ class QSK_EXPORT QskSubWindow : public QskPopup
QRectF titleBarRect() const;
QRectF layoutRectForSize( const QSizeF& ) const override;
QskAspect fadingAspect() const override;
Q_SIGNALS:
void decorationsChanged( Decorations );

View File

@ -98,10 +98,10 @@ QSGNode* QskSubWindowSkinlet::updateSubNode(
{
/*
Overloading QskPopupSkinlet: as the opacity of the subwindow already
depends on the transitioningFactor we do not want the additional opacity
depends on the fadingFactor we do not want the additional opacity
adjustments for the overlay node.
Maybe we should have a flag that indicates if the popup does
opacity or geometry transitions, when opening/closing TODO ...
opacity or geometry transitions, when fading TODO ...
*/
updateBoxNode( subWindow, node, Q::Overlay );
break;