qskinny/src/controls/QskControl.h

318 lines
9.1 KiB
C
Raw Normal View History

2017-07-21 18:21:34 +02:00
/******************************************************************************
* QSkinny - Copyright (C) 2016 Uwe Rathmann
* This file may be used under the terms of the QSkinny License, Version 1.0
*****************************************************************************/
#ifndef QSK_CONTROL_H
#define QSK_CONTROL_H 1
2018-08-03 08:15:28 +02:00
#include "QskAspect.h"
#include "QskGradient.h"
#include "QskSizePolicy.h"
2018-08-03 08:15:28 +02:00
#include "QskSkinnable.h"
2017-07-21 18:21:34 +02:00
2018-07-19 14:10:48 +02:00
#include <qlocale.h>
2018-08-03 08:15:28 +02:00
#include <qquickitem.h>
2017-07-21 18:21:34 +02:00
#include <memory>
class QskControlPrivate;
class QskGeometryChangeEvent;
class QskWindowChangeEvent;
class QskGestureEvent;
2018-07-15 09:46:21 +02:00
template <typename T> class QVector;
2017-07-21 18:21:34 +02:00
class QSK_EXPORT QskControl : public QQuickItem, public QskSkinnable
2017-07-21 18:21:34 +02:00
{
Q_OBJECT
Q_PROPERTY( QLocale locale READ locale
WRITE setLocale RESET resetLocale NOTIFY localeChanged FINAL )
Q_PROPERTY( bool autoFillBackground READ autoFillBackground
WRITE setAutoFillBackground NOTIFY controlFlagsChanged FINAL )
Q_PROPERTY( bool autoLayoutChildren READ autoLayoutChildren
WRITE setAutoLayoutChildren NOTIFY controlFlagsChanged FINAL )
Q_PROPERTY( bool polishOnResize READ polishOnResize
WRITE setPolishOnResize NOTIFY controlFlagsChanged FINAL )
Q_PROPERTY( bool transparentForPositioners READ isTransparentForPositioner
WRITE setTransparentForPositioner NOTIFY controlFlagsChanged FINAL )
Q_PROPERTY( Qt::FocusPolicy focusPolicy READ focusPolicy
WRITE setFocusPolicy NOTIFY focusPolicyChanged FINAL )
Q_PROPERTY( bool wheelEnabled READ isWheelEnabled
WRITE setWheelEnabled NOTIFY wheelEnabledChanged FINAL )
2017-07-21 18:21:34 +02:00
Q_PROPERTY( bool tabFence READ isTabFence
WRITE setTabFence NOTIFY controlFlagsChanged FINAL )
2017-10-30 08:48:49 +01:00
Q_PROPERTY( QMarginsF margins READ margins
WRITE setMargins RESET resetMargins NOTIFY marginsChanged )
Q_PROPERTY( QskGradient background READ background
2017-10-30 12:06:19 +01:00
WRITE setBackground RESET resetBackground NOTIFY backgroundChanged )
2017-07-21 18:21:34 +02:00
Q_PROPERTY( QskSizePolicy sizePolicy READ sizePolicy WRITE setSizePolicy )
2018-08-03 08:15:28 +02:00
2017-07-21 18:21:34 +02:00
Q_PROPERTY( QSizeF minimumSize READ minimumSize WRITE setMinimumSize )
2018-08-03 08:15:28 +02:00
2017-07-21 18:21:34 +02:00
Q_PROPERTY( QSizeF maximumSize READ maximumSize WRITE setMaximumSize )
2018-08-03 08:15:28 +02:00
2017-07-21 18:21:34 +02:00
Q_PROPERTY( QSizeF preferredSize READ preferredSize WRITE setPreferredSize )
Q_PROPERTY( QRectF geometry READ geometry WRITE setGeometry )
2017-07-21 18:21:34 +02:00
using Inherited = QQuickItem;
2018-08-03 08:15:28 +02:00
public:
2017-07-21 18:21:34 +02:00
QSK_STATES( Disabled, Hovered, Focused )
enum Flag
{
DeferredUpdate = 1 << 0,
DeferredPolish = 1 << 1,
DeferredLayout = 1 << 2,
CleanupOnVisibility = 1 << 3,
PreferRasterForTextures = 1 << 4,
DebugForceBackground = 1 << 7,
LastFlag = DebugForceBackground
};
Q_ENUM( Flag )
Q_DECLARE_FLAGS( Flags, Flag )
QskControl( QQuickItem* parent = nullptr );
2018-07-31 17:32:25 +02:00
~QskControl() override;
2017-07-21 18:21:34 +02:00
const char* className() const;
void setMargins( qreal );
void setMargins( const QMarginsF& );
void resetMargins();
QMarginsF margins() const;
void setBackgroundColor( const QColor& );
void setBackground( const QskGradient& );
void resetBackground();
QskGradient background() const;
2017-07-21 18:21:34 +02:00
QRectF geometry() const;
QRectF rect() const;
2017-07-21 18:21:34 +02:00
QRectF contentsRect() const;
virtual QRectF layoutRect() const;
virtual QRectF gestureRect() const;
virtual QRectF focusIndicatorRect() const;
2017-07-21 18:21:34 +02:00
void setAutoFillBackground( bool );
bool autoFillBackground() const;
void setPolishOnResize( bool );
bool polishOnResize() const;
void setAutoLayoutChildren( bool );
bool autoLayoutChildren() const;
void setTransparentForPositioner( bool );
bool isTransparentForPositioner() const;
void setWheelEnabled( bool );
bool isWheelEnabled() const;
void setFocusPolicy( Qt::FocusPolicy );
Qt::FocusPolicy focusPolicy() const;
2017-07-21 18:21:34 +02:00
void setTabFence( bool );
bool isTabFence() const;
void setControlFlags( Flags );
void resetControlFlags();
Flags controlFlags() const;
Q_INVOKABLE void setControlFlag( Flag, bool on = true );
Q_INVOKABLE void resetControlFlag( Flag );
Q_INVOKABLE bool testControlFlag( Flag ) const;
void setSizePolicy( QskSizePolicy::Policy, QskSizePolicy::Policy );
void setSizePolicy( const QskSizePolicy& );
void setSizePolicy( Qt::Orientation, QskSizePolicy::Policy );
const QskSizePolicy& sizePolicy() const;
QskSizePolicy::Policy sizePolicy( Qt::Orientation ) const;
void setMinimumSize( const QSizeF& );
void setMinimumSize( qreal width, qreal height );
void setMinimumWidth( qreal width );
void setMinimumHeight( qreal height );
void setMaximumSize( const QSizeF& );
void setMaximumSize( qreal width, qreal height );
void setMaximumWidth( qreal width );
void setMaximumHeight( qreal height );
void setPreferredSize( const QSizeF& );
void setPreferredSize( qreal width, qreal height );
void setPreferredWidth( qreal width );
void setPreferredHeight( qreal height );
void setFixedSize( const QSizeF& );
void setFixedSize( qreal width, qreal height );
void setFixedWidth( qreal width );
void setFixedHeight( qreal height );
void setExplicitSizeHint( Qt::SizeHint, const QSizeF& );
void setExplicitSizeHint( Qt::SizeHint, qreal width, qreal height );
void resetExplicitSizeHint( Qt::SizeHint );
QSizeF minimumSize() const;
QSizeF maximumSize() const;
QSizeF preferredSize() const;
QSizeF explicitSizeHint( Qt::SizeHint ) const;
2017-07-21 18:21:34 +02:00
QSizeF sizeHint() const;
QSizeF effectiveSizeHint( Qt::SizeHint ) const;
virtual qreal heightForWidth( qreal width ) const;
virtual qreal widthForHeight( qreal height ) const;
2017-07-21 18:21:34 +02:00
virtual QSizeF contentsSizeHint() const;
2018-06-26 11:10:44 +02:00
bool isVisibleTo( const QQuickItem* ) const;
2017-07-21 18:21:34 +02:00
QLocale locale() const;
void resetLocale();
void setLayoutMirroring( bool on, bool recursive = false );
void resetLayoutMirroring();
bool layoutMirroring() const;
QSizeF size() const;
QSizeF implicitSize() const;
void setGeometry( qreal x, qreal y, qreal width, qreal height );
bool isPolishScheduled() const;
bool isUpdateNodeScheduled() const;
bool isInitiallyPainted() const;
QVector< QskAspect::Subcontrol > subControls() const;
2018-08-03 08:15:28 +02:00
Q_SIGNALS:
2017-10-30 12:06:19 +01:00
void backgroundChanged();
2017-10-30 08:53:34 +01:00
void marginsChanged();
void focusIndicatorRectChanged();
2017-07-21 18:21:34 +02:00
void localeChanged( const QLocale& );
void controlFlagsChanged();
void focusPolicyChanged();
void wheelEnabledChanged();
2017-07-21 18:21:34 +02:00
2018-08-03 08:15:28 +02:00
public Q_SLOTS:
2017-07-21 18:21:34 +02:00
void setGeometry( const QRectF& );
void setLocale( const QLocale& );
void show();
void hide();
void setVisible( bool );
void resetImplicitSize();
2018-08-03 08:15:28 +02:00
protected:
2018-07-31 17:32:25 +02:00
bool event( QEvent* ) override;
2017-07-21 18:21:34 +02:00
virtual void changeEvent( QEvent* );
virtual void geometryChangeEvent( QskGeometryChangeEvent* );
virtual void windowChangeEvent( QskWindowChangeEvent* );
virtual void gestureEvent( QskGestureEvent* );
2018-07-31 17:32:25 +02:00
void hoverEnterEvent( QHoverEvent* ) override;
void hoverLeaveEvent( QHoverEvent* ) override;
2017-07-21 18:21:34 +02:00
2018-07-31 17:32:25 +02:00
bool childMouseEventFilter( QQuickItem*, QEvent* ) override;
2017-07-21 18:21:34 +02:00
virtual bool gestureFilter( QQuickItem*, QEvent* );
2018-07-31 17:32:25 +02:00
void itemChange( ItemChange, const ItemChangeData& ) override;
void geometryChanged( const QRectF&, const QRectF& ) override;
void windowDeactivateEvent() override;
2018-07-31 17:32:25 +02:00
void classBegin() override;
void componentComplete() override;
void releaseResources() override;
2017-07-21 18:21:34 +02:00
void initSizePolicy( QskSizePolicy::Policy, QskSizePolicy::Policy );
2017-07-21 18:21:34 +02:00
void cleanupNodes();
2018-08-03 08:15:28 +02:00
virtual void aboutToShow(); // called in updatePolish
2017-07-21 18:21:34 +02:00
virtual void updateLayout(); // called in updatePolish
2018-08-03 08:15:28 +02:00
private:
// don't use boundingRect - it seems to be deprecated
2018-07-31 17:32:25 +02:00
QRectF boundingRect() const override final { return rect(); }
2018-08-03 08:15:28 +02:00
void setActiveFocusOnTab( bool ) = delete; // use setFocusPolicy
void updateInputMethod( Qt::InputMethodQueries ) = delete; // use qskUpdateInputMethod
2018-07-31 17:32:25 +02:00
QSGNode* updatePaintNode( QSGNode*, UpdatePaintNodeData* ) override final;
void updatePolish() override final;
2017-07-21 18:21:34 +02:00
2018-07-31 17:32:25 +02:00
QskControl* owningControl() const override final;
2017-07-21 18:21:34 +02:00
void layoutConstraintChanged();
2017-07-21 18:21:34 +02:00
void updateControlFlag( uint flag, bool on );
2018-08-03 08:15:28 +02:00
private:
2017-07-21 18:21:34 +02:00
Q_DECLARE_PRIVATE( QskControl )
};
inline void QskControl::setGeometry( const QRectF& rect )
{
setGeometry( rect.x(), rect.y(), rect.width(), rect.height() );
}
inline QSizeF QskControl::size() const
{
return QSizeF( width(), height() );
}
inline QSizeF QskControl::implicitSize() const
{
return QSizeF( implicitWidth(), implicitHeight() );
}
inline QSizeF QskControl::sizeHint() const
{
return effectiveSizeHint( Qt::PreferredSize );
2017-07-21 18:21:34 +02:00
}
inline QSizeF QskControl::minimumSize() const
{
return explicitSizeHint( Qt::MinimumSize );
}
inline QSizeF QskControl::maximumSize() const
{
return explicitSizeHint( Qt::MaximumSize );
}
inline QSizeF QskControl::preferredSize() const
{
return explicitSizeHint( Qt::PreferredSize );
}
2017-07-21 18:21:34 +02:00
Q_DECLARE_OPERATORS_FOR_FLAGS( QskControl::Flags )
Q_DECLARE_METATYPE( QskControl::Flags )
#endif