code moved to QskInputPanelBox

This commit is contained in:
Uwe Rathmann 2025-01-21 15:17:32 +01:00
parent 301b8b0250
commit 925016bbc0
5 changed files with 104 additions and 156 deletions

View File

@ -157,51 +157,5 @@ void QskTextEdit::setTabStopDistance( qreal distance )
m_data->wrappedEdit->setTabStopDistance( distance );
}
void QskTextEdit::setupFrom( const QQuickItem* item )
{
if ( item == nullptr )
return;
// finding attributes from the input hints of item
int maxCharacters = 32767;
Qt::InputMethodQueries queries = Qt::ImQueryAll;
queries &= ~Qt::ImEnabled;
QInputMethodQueryEvent event( queries );
QCoreApplication::sendEvent( const_cast< QQuickItem* >( item ), &event );
if ( event.queries() & Qt::ImMaximumTextLength )
{
// needs to be handled before Qt::ImCursorPosition !
const auto max = event.value( Qt::ImMaximumTextLength ).toInt();
maxCharacters = qBound( 0, max, maxCharacters );
}
if ( event.queries() & Qt::ImSurroundingText )
{
const auto text = event.value( Qt::ImSurroundingText ).toString();
setText( text );
}
if ( event.queries() & Qt::ImCursorPosition )
{
const auto pos = event.value( Qt::ImCursorPosition ).toInt();
setCursorPosition( pos );
}
if ( event.queries() & Qt::ImCurrentSelection )
{
#if 0
const auto text = event.value( Qt::ImCurrentSelection ).toString();
if ( !text.isEmpty() )
{
}
#endif
}
}
#include "QskTextEdit.moc"
#include "moc_QskTextEdit.cpp"

View File

@ -29,8 +29,6 @@ class QSK_EXPORT QskTextEdit : public QskAbstractTextInput
QskTextEdit( QQuickItem* parent = nullptr );
~QskTextEdit() override;
void setupFrom( const QQuickItem* );
void setTextFormat( QskTextOptions::TextFormat );
QskTextOptions::TextFormat textFormat() const;
@ -40,12 +38,9 @@ class QSK_EXPORT QskTextEdit : public QskAbstractTextInput
void setTabStopDistance( qreal );
Q_SIGNALS:
void panelChanged( bool );
void placeholderTextChanged( const QString& );
void lineCountChanged( int );
void textFormatChanged( QskTextOptions::TextFormat );
void textFormatChanged( QskTextOptions::TextFormat );
void tabStopDistanceChanged( qreal );
private:

View File

@ -252,106 +252,5 @@ bool QskTextInput::acceptInput()
return hasAcceptableInput() || fixup();
}
void QskTextInput::setupFrom( const QQuickItem* item )
{
if ( item == nullptr )
return;
// finding attributes from the input hints of item
int maxCharacters = 32767;
QskTextInput::EchoMode echoMode = QskTextInput::Normal;
Qt::InputMethodQueries queries = Qt::ImQueryAll;
queries &= ~Qt::ImEnabled;
QInputMethodQueryEvent event( queries );
QCoreApplication::sendEvent( const_cast< QQuickItem* >( item ), &event );
if ( event.queries() & Qt::ImHints )
{
const auto hints = static_cast< Qt::InputMethodHints >(
event.value( Qt::ImHints ).toInt() );
if ( hints & Qt::ImhHiddenText )
echoMode = QskTextInput::NoEcho;
}
if ( event.queries() & Qt::ImMaximumTextLength )
{
// needs to be handled before Qt::ImCursorPosition !
const auto max = event.value( Qt::ImMaximumTextLength ).toInt();
maxCharacters = qBound( 0, max, maxCharacters );
}
setMaxLength( maxCharacters );
if ( event.queries() & Qt::ImSurroundingText )
{
const auto text = event.value( Qt::ImSurroundingText ).toString();
setText( text );
}
if ( event.queries() & Qt::ImCursorPosition )
{
const auto pos = event.value( Qt::ImCursorPosition ).toInt();
setCursorPosition( pos );
}
if ( event.queries() & Qt::ImCurrentSelection )
{
#if 0
const auto text = event.value( Qt::ImCurrentSelection ).toString();
if ( !text.isEmpty() )
{
}
#endif
}
int passwordMaskDelay = -1;
QString passwordCharacter;
if ( echoMode == QskTextInput::NoEcho )
{
/*
Qt::ImhHiddenText does not provide information
to decide between NoEcho/Password, or provides
more details about how to deal with hidden inputs.
So we try to find out more from trying some properties.
*/
QVariant value;
value = item->property( "passwordMaskDelay" );
if ( value.canConvert< int >() )
passwordMaskDelay = value.toInt();
value = item->property( "passwordCharacter" );
if ( value.canConvert< QString >() )
passwordCharacter = value.toString();
value = item->property( "echoMode" );
if ( value.canConvert< int >() )
{
const auto mode = value.toInt();
if ( mode == QskTextInput::Password )
echoMode = QskTextInput::Password;
}
}
if ( passwordMaskDelay >= 0 )
setPasswordMaskDelay( passwordMaskDelay );
else
resetPasswordMaskDelay();
if ( !passwordCharacter.isEmpty() )
setPasswordCharacter( passwordCharacter );
else
resetPasswordCharacter();
setEchoMode( echoMode );
}
#include "QskTextInput.moc"
#include "moc_QskTextInput.cpp"

View File

@ -46,8 +46,6 @@ class QSK_EXPORT QskTextInput : public QskAbstractTextInput
QskTextInput( QQuickItem* parent = nullptr );
~QskTextInput() override;
void setupFrom( const QQuickItem* );
int maxLength() const;
void setMaxLength( int );

View File

@ -13,6 +13,108 @@
#include <qpointer.h>
#include <qstring.h>
static void qskSetupInput( const QQuickItem* item, QskTextInput* textInput )
{
if ( item == nullptr )
return;
// finding attributes from the input hints of item
int maxCharacters = 32767;
QskTextInput::EchoMode echoMode = QskTextInput::Normal;
Qt::InputMethodQueries queries = Qt::ImQueryAll;
queries &= ~Qt::ImEnabled;
QInputMethodQueryEvent event( queries );
QCoreApplication::sendEvent( const_cast< QQuickItem* >( item ), &event );
if ( event.queries() & Qt::ImHints )
{
const auto hints = static_cast< Qt::InputMethodHints >(
event.value( Qt::ImHints ).toInt() );
if ( hints & Qt::ImhHiddenText )
echoMode = QskTextInput::NoEcho;
}
if ( event.queries() & Qt::ImMaximumTextLength )
{
// needs to be handled before Qt::ImCursorPosition !
const auto value = event.value( Qt::ImMaximumTextLength );
if ( value.isValid() )
maxCharacters = qBound( 0, value.toInt(), maxCharacters );
}
textInput->setMaxLength( maxCharacters );
if ( event.queries() & Qt::ImSurroundingText )
{
const auto text = event.value( Qt::ImSurroundingText ).toString();
textInput->setText( text );
}
if ( event.queries() & Qt::ImCursorPosition )
{
const auto pos = event.value( Qt::ImCursorPosition ).toInt();
textInput->setCursorPosition( pos );
}
if ( event.queries() & Qt::ImCurrentSelection )
{
#if 0
const auto text = event.value( Qt::ImCurrentSelection ).toString();
if ( !text.isEmpty() )
{
}
#endif
}
int passwordMaskDelay = -1;
QString passwordCharacter;
if ( echoMode == QskTextInput::NoEcho )
{
/*
Qt::ImhHiddenText does not provide information
to decide between NoEcho/Password, or provides
more details about how to deal with hidden inputs.
So we try to find out more from trying some properties.
*/
QVariant value;
value = item->property( "passwordMaskDelay" );
if ( value.canConvert< int >() )
passwordMaskDelay = value.toInt();
value = item->property( "passwordCharacter" );
if ( value.canConvert< QString >() )
passwordCharacter = value.toString();
value = item->property( "echoMode" );
if ( value.canConvert< int >() )
{
const auto mode = value.toInt();
if ( mode == QskTextInput::Password )
echoMode = QskTextInput::Password;
}
}
if ( passwordMaskDelay >= 0 )
textInput->setPasswordMaskDelay( passwordMaskDelay );
else
textInput->resetPasswordMaskDelay();
if ( !passwordCharacter.isEmpty() )
textInput->setPasswordCharacter( passwordCharacter );
else
textInput->resetPasswordCharacter();
textInput->setEchoMode( echoMode );
}
namespace
{
class TextFieldProxy final : public QskTextField
@ -156,7 +258,7 @@ void QskInputPanelBox::attachInputItem( QQuickItem* item )
{
if ( m_data->panelHints & QskInputPanelBox::InputProxy )
{
m_data->inputProxy->setupFrom( item );
qskSetupInput( item, m_data->inputProxy );
m_data->inputProxy->setEditing( true );
}
}