wip
This commit is contained in:
parent
7f324d2d48
commit
476b969d7d
|
@ -0,0 +1,321 @@
|
||||||
|
/******************************************************************************
|
||||||
|
* QSkinny - Copyright (C) The authors
|
||||||
|
* SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
#include "QskTextInput.h"
|
||||||
|
#include "QskQuick.h"
|
||||||
|
#include "QskInternalMacros.h"
|
||||||
|
|
||||||
|
QSK_QT_PRIVATE_BEGIN
|
||||||
|
#include <private/qquicktextinput_p.h>
|
||||||
|
#include <private/qquicktextinput_p_p.h>
|
||||||
|
QSK_QT_PRIVATE_END
|
||||||
|
|
||||||
|
QSK_SUBCONTROL( QskTextInput, Text )
|
||||||
|
QSK_SUBCONTROL( QskTextInput, TextPanel )
|
||||||
|
QSK_SYSTEM_STATE( QskTextInput, Error, QskAspect::FirstSystemState << 4 )
|
||||||
|
|
||||||
|
/*
|
||||||
|
Other properties offered from QQuickTextInput:
|
||||||
|
|
||||||
|
- accepted();
|
||||||
|
|
||||||
|
What is this one good for ?
|
||||||
|
|
||||||
|
- textEdited();
|
||||||
|
|
||||||
|
TODO ...
|
||||||
|
|
||||||
|
- passwordCharacterChanged();
|
||||||
|
- passwordMaskDelayChanged(int delay);
|
||||||
|
|
||||||
|
Maybe we will have a QskPasswordField class, where we export
|
||||||
|
these properties.
|
||||||
|
*/
|
||||||
|
namespace
|
||||||
|
{
|
||||||
|
class QuickTextInput final : public QQuickTextInput
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
using Inherited = QQuickTextInput;
|
||||||
|
|
||||||
|
public:
|
||||||
|
QuickTextInput( QskTextInput* );
|
||||||
|
|
||||||
|
inline void setAlignment( Qt::Alignment alignment )
|
||||||
|
{
|
||||||
|
setHAlign( ( HAlignment ) ( int( alignment ) & 0x0f ) );
|
||||||
|
setVAlign( ( VAlignment ) ( int( alignment ) & 0xf0 ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
Q_INVOKABLE bool fixup();
|
||||||
|
Q_INVOKABLE void updateColors();
|
||||||
|
Q_INVOKABLE void updateMetrics();
|
||||||
|
Q_INVOKABLE void setEditing( bool );
|
||||||
|
Q_INVOKABLE void handleEvent( QEvent* );
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
#if QT_VERSION >= QT_VERSION_CHECK( 6, 0, 0 )
|
||||||
|
void geometryChange(
|
||||||
|
const QRectF& newGeometry, const QRectF& oldGeometry ) override
|
||||||
|
{
|
||||||
|
Inherited::geometryChange( newGeometry, oldGeometry );
|
||||||
|
updateClip();
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
void geometryChanged(
|
||||||
|
const QRectF& newGeometry, const QRectF& oldGeometry ) override
|
||||||
|
{
|
||||||
|
Inherited::geometryChanged( newGeometry, oldGeometry );
|
||||||
|
updateClip();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void updateClip()
|
||||||
|
{
|
||||||
|
setClip( ( contentWidth() > width() ) ||
|
||||||
|
( contentHeight() > height() ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
QSGNode* updatePaintNode(
|
||||||
|
QSGNode* oldNode, UpdatePaintNodeData* data ) override
|
||||||
|
{
|
||||||
|
updateColors();
|
||||||
|
return Inherited::updatePaintNode( oldNode, data );
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
QuickTextInput::QuickTextInput( QskTextInput* textInput )
|
||||||
|
: QQuickTextInput( textInput )
|
||||||
|
{
|
||||||
|
classBegin();
|
||||||
|
|
||||||
|
setActiveFocusOnTab( false );
|
||||||
|
setFlag( ItemAcceptsInputMethod, false );
|
||||||
|
setFocusOnPress( false );
|
||||||
|
setSelectByMouse( true );
|
||||||
|
|
||||||
|
componentComplete();
|
||||||
|
|
||||||
|
connect( this, &QQuickTextInput::contentSizeChanged,
|
||||||
|
this, &QuickTextInput::updateClip );
|
||||||
|
}
|
||||||
|
|
||||||
|
void QuickTextInput::setEditing( bool on )
|
||||||
|
{
|
||||||
|
Q_ASSERT( focusOnPress() == false );
|
||||||
|
|
||||||
|
QFocusEvent event( on ? QEvent::FocusIn : QEvent::FocusOut );
|
||||||
|
QQuickTextInputPrivate::get( this )->handleFocusEvent( &event );
|
||||||
|
}
|
||||||
|
|
||||||
|
bool QuickTextInput::fixup()
|
||||||
|
{
|
||||||
|
return QQuickTextInputPrivate::get( this )->fixup();
|
||||||
|
}
|
||||||
|
|
||||||
|
void QuickTextInput::updateMetrics()
|
||||||
|
{
|
||||||
|
auto textInput = static_cast< const QskTextInput* >( parentItem() );
|
||||||
|
|
||||||
|
setAlignment( textInput->alignment() );
|
||||||
|
setFont( textInput->font() );
|
||||||
|
}
|
||||||
|
|
||||||
|
void QuickTextInput::updateColors()
|
||||||
|
{
|
||||||
|
using Q = QskTextInput;
|
||||||
|
|
||||||
|
auto input = static_cast< const QskTextInput* >( parentItem() );
|
||||||
|
|
||||||
|
setColor( input->color( Q::Text ) );
|
||||||
|
|
||||||
|
const auto state = QskTextInput::Selected;
|
||||||
|
|
||||||
|
setSelectionColor( input->color( Q::TextPanel | state ) );
|
||||||
|
setSelectedTextColor( input->color( Q::Text | state ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
void QuickTextInput::handleEvent( QEvent* ev )
|
||||||
|
{
|
||||||
|
event( ev );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class QskTextInput::PrivateData
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
QuickTextInput* wrappedInput;
|
||||||
|
};
|
||||||
|
|
||||||
|
QskTextInput::QskTextInput( QQuickItem* parent )
|
||||||
|
: Inherited( parent )
|
||||||
|
, m_data( new PrivateData() )
|
||||||
|
{
|
||||||
|
m_data->wrappedInput = new QuickTextInput( this );
|
||||||
|
auto wrappedInput = m_data->wrappedInput;
|
||||||
|
|
||||||
|
setAcceptedMouseButtons( wrappedInput->acceptedMouseButtons() );
|
||||||
|
wrappedInput->setAcceptedMouseButtons( Qt::NoButton );
|
||||||
|
|
||||||
|
initSizePolicy( QskSizePolicy::Expanding, QskSizePolicy::Fixed );
|
||||||
|
|
||||||
|
setup( wrappedInput );
|
||||||
|
|
||||||
|
connect( wrappedInput, &QQuickTextInput::maximumLengthChanged,
|
||||||
|
this, &QskTextInput::maximumLengthChanged );
|
||||||
|
|
||||||
|
connect( wrappedInput, &QQuickTextInput::displayTextChanged,
|
||||||
|
this, &QskTextInput::displayTextChanged );
|
||||||
|
|
||||||
|
connect( wrappedInput, &QQuickTextInput::inputMaskChanged,
|
||||||
|
this, &QskTextInput::inputMaskChanged );
|
||||||
|
|
||||||
|
connect( wrappedInput, &QQuickTextInput::acceptableInputChanged,
|
||||||
|
this, [this]() { Q_EMIT acceptableInputChanged( hasAcceptableInput() ); } );
|
||||||
|
}
|
||||||
|
|
||||||
|
QskTextInput::~QskTextInput()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
QskAspect::Subcontrol QskTextInput::substitutedSubcontrol(
|
||||||
|
QskAspect::Subcontrol subControl ) const
|
||||||
|
{
|
||||||
|
if ( subControl == Inherited::Text )
|
||||||
|
return Text;
|
||||||
|
|
||||||
|
if ( subControl == Inherited::TextPanel )
|
||||||
|
return TextPanel;
|
||||||
|
|
||||||
|
return Inherited::substitutedSubcontrol( subControl );
|
||||||
|
}
|
||||||
|
|
||||||
|
void QskTextInput::ensureVisible( int position )
|
||||||
|
{
|
||||||
|
m_data->wrappedInput->ensureVisible( position );
|
||||||
|
}
|
||||||
|
|
||||||
|
int QskTextInput::maxLength() const
|
||||||
|
{
|
||||||
|
return m_data->wrappedInput->maxLength();
|
||||||
|
}
|
||||||
|
|
||||||
|
void QskTextInput::setMaxLength( int length )
|
||||||
|
{
|
||||||
|
m_data->wrappedInput->setMaxLength( length );
|
||||||
|
}
|
||||||
|
|
||||||
|
QValidator* QskTextInput::validator() const
|
||||||
|
{
|
||||||
|
return m_data->wrappedInput->validator();
|
||||||
|
}
|
||||||
|
|
||||||
|
void QskTextInput::setValidator( QValidator* validator )
|
||||||
|
{
|
||||||
|
if ( validator != m_data->wrappedInput->validator() )
|
||||||
|
{
|
||||||
|
m_data->wrappedInput->setValidator( validator );
|
||||||
|
Q_EMIT validatorChanged( validator );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
QString QskTextInput::inputMask() const
|
||||||
|
{
|
||||||
|
return m_data->wrappedInput->inputMask();
|
||||||
|
}
|
||||||
|
|
||||||
|
void QskTextInput::setInputMask( const QString& mask )
|
||||||
|
{
|
||||||
|
m_data->wrappedInput->setInputMask( mask );
|
||||||
|
}
|
||||||
|
|
||||||
|
bool QskTextInput::autoScroll() const
|
||||||
|
{
|
||||||
|
return m_data->wrappedInput->autoScroll();
|
||||||
|
}
|
||||||
|
|
||||||
|
void QskTextInput::setAutoScroll( bool on )
|
||||||
|
{
|
||||||
|
if ( m_data->wrappedInput->autoScroll() != on )
|
||||||
|
{
|
||||||
|
m_data->wrappedInput->setAutoScroll( on );
|
||||||
|
Q_EMIT autoScrollChanged( on );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
QskTextInput::EchoMode QskTextInput::echoMode() const
|
||||||
|
{
|
||||||
|
const auto mode = m_data->wrappedInput->echoMode();
|
||||||
|
return static_cast< QskTextInput::EchoMode >( mode );
|
||||||
|
}
|
||||||
|
|
||||||
|
void QskTextInput::setEchoMode( EchoMode mode )
|
||||||
|
{
|
||||||
|
if ( mode != echoMode() )
|
||||||
|
{
|
||||||
|
m_data->wrappedInput->setEchoMode(
|
||||||
|
static_cast< QQuickTextInput::EchoMode >( mode ) );
|
||||||
|
|
||||||
|
qskUpdateInputMethod( this, Qt::ImHints );
|
||||||
|
|
||||||
|
Q_EMIT echoModeChanged( mode );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
QString QskTextInput::passwordCharacter() const
|
||||||
|
{
|
||||||
|
return m_data->wrappedInput->passwordCharacter();
|
||||||
|
}
|
||||||
|
|
||||||
|
void QskTextInput::setPasswordCharacter( const QString& text )
|
||||||
|
{
|
||||||
|
m_data->wrappedInput->setPasswordCharacter( text );
|
||||||
|
}
|
||||||
|
|
||||||
|
void QskTextInput::resetPasswordCharacter()
|
||||||
|
{
|
||||||
|
m_data->wrappedInput->setPasswordCharacter(
|
||||||
|
QGuiApplication::styleHints()->passwordMaskCharacter() );
|
||||||
|
}
|
||||||
|
|
||||||
|
int QskTextInput::passwordMaskDelay() const
|
||||||
|
{
|
||||||
|
return m_data->wrappedInput->passwordMaskDelay();
|
||||||
|
}
|
||||||
|
|
||||||
|
void QskTextInput::setPasswordMaskDelay( int ms )
|
||||||
|
{
|
||||||
|
m_data->wrappedInput->setPasswordMaskDelay( ms );
|
||||||
|
}
|
||||||
|
|
||||||
|
void QskTextInput::resetPasswordMaskDelay()
|
||||||
|
{
|
||||||
|
m_data->wrappedInput->resetPasswordMaskDelay();
|
||||||
|
}
|
||||||
|
|
||||||
|
QString QskTextInput::displayText() const
|
||||||
|
{
|
||||||
|
return m_data->wrappedInput->displayText();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool QskTextInput::hasAcceptableInput() const
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
We might want to make visual adjustments while having
|
||||||
|
an "invalid" text. Don't we need a QSkinny state
|
||||||
|
for this: TODO ...
|
||||||
|
*/
|
||||||
|
return m_data->wrappedInput->hasAcceptableInput();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool QskTextInput::fixup()
|
||||||
|
{
|
||||||
|
return m_data->wrappedInput->fixup();
|
||||||
|
}
|
||||||
|
|
||||||
|
#include "QskTextInput.moc"
|
||||||
|
#include "moc_QskTextInput.cpp"
|
|
@ -0,0 +1,119 @@
|
||||||
|
/******************************************************************************
|
||||||
|
* QSkinny - Copyright (C) The authors
|
||||||
|
* SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
#ifndef QSK_TEXT_INPUT_H
|
||||||
|
#define QSK_TEXT_INPUT_H
|
||||||
|
|
||||||
|
#include "QskAbstractTextInput.h"
|
||||||
|
#include "QskTextOptions.h"
|
||||||
|
|
||||||
|
class QValidator;
|
||||||
|
|
||||||
|
class QSK_EXPORT QskTextInput : public QskAbstractTextInput
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
Q_PROPERTY( QString displayText READ displayText NOTIFY displayTextChanged )
|
||||||
|
|
||||||
|
Q_PROPERTY( int maximumLength READ maxLength
|
||||||
|
WRITE setMaxLength NOTIFY maximumLengthChanged )
|
||||||
|
|
||||||
|
Q_PROPERTY( QString inputMask READ inputMask
|
||||||
|
WRITE setInputMask NOTIFY inputMaskChanged )
|
||||||
|
|
||||||
|
Q_PROPERTY( bool acceptableInput READ hasAcceptableInput
|
||||||
|
NOTIFY acceptableInputChanged)
|
||||||
|
|
||||||
|
Q_PROPERTY( bool autoScroll READ autoScroll
|
||||||
|
WRITE setAutoScroll NOTIFY autoScrollChanged )
|
||||||
|
|
||||||
|
Q_PROPERTY( EchoMode echoMode READ echoMode
|
||||||
|
WRITE setEchoMode NOTIFY echoModeChanged )
|
||||||
|
|
||||||
|
Q_PROPERTY( QString passwordCharacter READ passwordCharacter
|
||||||
|
WRITE setPasswordCharacter RESET resetPasswordCharacter
|
||||||
|
NOTIFY passwordCharacterChanged )
|
||||||
|
|
||||||
|
Q_PROPERTY( int passwordMaskDelay READ passwordMaskDelay
|
||||||
|
WRITE setPasswordMaskDelay RESET resetPasswordMaskDelay
|
||||||
|
NOTIFY passwordMaskDelayChanged )
|
||||||
|
|
||||||
|
Q_PROPERTY( QValidator* validator READ validator
|
||||||
|
WRITE setValidator NOTIFY validatorChanged )
|
||||||
|
|
||||||
|
using Inherited = QskAbstractTextInput;
|
||||||
|
|
||||||
|
public:
|
||||||
|
QSK_SUBCONTROLS( Text, TextPanel )
|
||||||
|
QSK_STATES( Error )
|
||||||
|
|
||||||
|
enum EchoMode : quint8
|
||||||
|
{
|
||||||
|
Normal,
|
||||||
|
NoEcho,
|
||||||
|
Password,
|
||||||
|
PasswordEchoOnEdit
|
||||||
|
};
|
||||||
|
|
||||||
|
Q_ENUM( EchoMode )
|
||||||
|
|
||||||
|
QskTextInput( QQuickItem* parent = nullptr );
|
||||||
|
~QskTextInput() override;
|
||||||
|
|
||||||
|
int maxLength() const;
|
||||||
|
void setMaxLength( int );
|
||||||
|
|
||||||
|
QValidator* validator() const;
|
||||||
|
void setValidator( QValidator* );
|
||||||
|
|
||||||
|
QString inputMask() const;
|
||||||
|
void setInputMask( const QString& );
|
||||||
|
|
||||||
|
bool autoScroll() const;
|
||||||
|
void setAutoScroll( bool );
|
||||||
|
|
||||||
|
EchoMode echoMode() const;
|
||||||
|
void setEchoMode( EchoMode );
|
||||||
|
|
||||||
|
QString passwordCharacter() const;
|
||||||
|
void setPasswordCharacter( const QString& );
|
||||||
|
void resetPasswordCharacter();
|
||||||
|
|
||||||
|
int passwordMaskDelay() const;
|
||||||
|
void setPasswordMaskDelay( int );
|
||||||
|
void resetPasswordMaskDelay();
|
||||||
|
|
||||||
|
QString displayText() const;
|
||||||
|
|
||||||
|
bool hasAcceptableInput() const;
|
||||||
|
bool fixup();
|
||||||
|
|
||||||
|
void ensureVisible( int position );
|
||||||
|
|
||||||
|
Q_SIGNALS:
|
||||||
|
void maximumLengthChanged( int );
|
||||||
|
|
||||||
|
void autoScrollChanged( bool );
|
||||||
|
|
||||||
|
void echoModeChanged( EchoMode );
|
||||||
|
void passwordMaskDelayChanged();
|
||||||
|
void passwordCharacterChanged();
|
||||||
|
|
||||||
|
void validatorChanged( const QValidator* );
|
||||||
|
void inputMaskChanged( const QString& );
|
||||||
|
void acceptableInputChanged( bool );
|
||||||
|
|
||||||
|
void displayTextChanged();
|
||||||
|
|
||||||
|
protected:
|
||||||
|
QskAspect::Subcontrol substitutedSubcontrol(
|
||||||
|
QskAspect::Subcontrol ) const override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
class PrivateData;
|
||||||
|
std::unique_ptr< PrivateData > m_data;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
Loading…
Reference in New Issue