improving the input context

This commit is contained in:
Uwe Rathmann 2018-04-04 12:05:01 +02:00
parent 12a938e653
commit 26f8e1b936
9 changed files with 86 additions and 24 deletions

View File

@ -10,8 +10,8 @@ public:
QVector< QString > candidates; QVector< QString > candidates;
}; };
QskHunspellCompositionModel::QskHunspellCompositionModel() : QskHunspellCompositionModel::QskHunspellCompositionModel( QObject* parent ):
QskInputCompositionModel(), Inherited( parent ),
m_data( new PrivateData() ) m_data( new PrivateData() )
{ {
#if 1 #if 1

View File

@ -10,8 +10,10 @@
class QskHunspellCompositionModel : public QskInputCompositionModel class QskHunspellCompositionModel : public QskInputCompositionModel
{ {
using Inherited = QskInputCompositionModel;
public: public:
QskHunspellCompositionModel(); QskHunspellCompositionModel( QObject* parent = nullptr );
virtual ~QskHunspellCompositionModel() override; virtual ~QskHunspellCompositionModel() override;
virtual bool supportsSuggestions() const override final; virtual bool supportsSuggestions() const override final;

View File

@ -62,7 +62,8 @@ public:
int groupIndex; int groupIndex;
}; };
QskInputCompositionModel::QskInputCompositionModel(): QskInputCompositionModel::QskInputCompositionModel( QObject* parent ):
QObject( parent ),
m_data( new PrivateData ) m_data( new PrivateData )
{ {
m_data->groupIndex = 0; m_data->groupIndex = 0;

View File

@ -20,7 +20,7 @@ class QskInputCompositionModel : public QObject
Q_PROPERTY( QVector< Qt::Key > groups READ groups NOTIFY groupsChanged ) Q_PROPERTY( QVector< Qt::Key > groups READ groups NOTIFY groupsChanged )
public: public:
QskInputCompositionModel(); QskInputCompositionModel( QObject* parent = nullptr );
virtual ~QskInputCompositionModel(); virtual ~QskInputCompositionModel();
// to determine whether to show the suggestion bar: // to determine whether to show the suggestion bar:

View File

@ -31,7 +31,7 @@ QskInputContext::QskInputContext() :
{ {
setObjectName( "InputContext" ); setObjectName( "InputContext" );
m_data->compositionModel = new QskInputCompositionModel(); m_data->compositionModel = new QskInputCompositionModel( this );
connect( m_data->compositionModel, &QskInputCompositionModel::candidatesChanged, connect( m_data->compositionModel, &QskInputCompositionModel::candidatesChanged,
this, &QskInputContext::handleCandidatesChanged ); this, &QskInputContext::handleCandidatesChanged );
@ -40,7 +40,7 @@ QskInputContext::QskInputContext() :
this, &QskInputContext::setInputPanel ); this, &QskInputContext::setInputPanel );
#if 1 #if 1
setCompositionModel( QLocale::Chinese, new QskPinyinCompositionModel() ); setCompositionModel( QLocale::Chinese, new QskPinyinCompositionModel( this ) );
#endif #endif
setInputPanel( qskSetup->inputPanel() ); setInputPanel( qskSetup->inputPanel() );
@ -48,11 +48,10 @@ QskInputContext::QskInputContext() :
QskInputContext::~QskInputContext() QskInputContext::~QskInputContext()
{ {
#if 1
if ( m_data->inputPanel ) if ( m_data->inputPanel )
delete m_data->inputPanel; delete m_data->inputPanel;
#endif
qDeleteAll( m_data->compositionModels );
delete m_data->compositionModel;
} }
bool QskInputContext::isValid() const bool QskInputContext::isValid() const
@ -60,14 +59,19 @@ bool QskInputContext::isValid() const
return true; return true;
} }
bool QskInputContext::hasCapability( Capability ) const
{
// what is QPlatformInputContext::HiddenTextCapability ???
return true;
}
void QskInputContext::update( Qt::InputMethodQueries queries ) void QskInputContext::update( Qt::InputMethodQueries queries )
{ {
if ( !m_data->inputItem ) if ( m_data->inputItem == nullptr )
return; return;
QInputMethodQueryEvent queryEvent( queries ); QInputMethodQueryEvent queryEvent( queries );
if ( !QCoreApplication::sendEvent( m_data->inputItem, &queryEvent ) ) QCoreApplication::sendEvent( m_data->inputItem, &queryEvent );
return;
// Qt::ImCursorRectangle // Qt::ImCursorRectangle
// Qt::ImFont // Qt::ImFont
@ -219,6 +223,11 @@ QLocale QskInputContext::locale() const
return m_data->inputPanel ? m_data->inputPanel->locale() : QLocale(); return m_data->inputPanel ? m_data->inputPanel->locale() : QLocale();
} }
Qt::LayoutDirection QskInputContext::inputDirection() const
{
return Inherited::inputDirection();
}
void QskInputContext::setFocusObject( QObject* focusObject ) void QskInputContext::setFocusObject( QObject* focusObject )
{ {
if ( focusObject == nullptr ) if ( focusObject == nullptr )
@ -245,8 +254,7 @@ void QskInputContext::setFocusObject( QObject* focusObject )
if( inputItemChanged ) if( inputItemChanged )
{ {
QInputMethodQueryEvent queryEvent( Qt::ImEnabled ); QInputMethodQueryEvent queryEvent( Qt::ImEnabled );
if ( !QCoreApplication::sendEvent( m_data->inputItem, &queryEvent ) ) QCoreApplication::sendEvent( m_data->inputItem, &queryEvent );
return;
if ( !queryEvent.value( Qt::ImEnabled ).toBool() ) if ( !queryEvent.value( Qt::ImEnabled ).toBool() )
{ {
@ -302,7 +310,7 @@ void QskInputContext::invokeAction( QInputMethod::Action action, int cursorPosit
{ {
auto model = compositionModel(); auto model = compositionModel();
switch ( static_cast< QskVirtualKeyboard::Action >( action ) ) switch ( static_cast< int >( action ) )
{ {
case QskVirtualKeyboard::Compose: case QskVirtualKeyboard::Compose:
{ {
@ -323,6 +331,11 @@ void QskInputContext::invokeAction( QInputMethod::Action action, int cursorPosit
break; break;
} }
case QInputMethod::Click:
case QInputMethod::ContextMenu:
{
break;
}
} }
} }
@ -382,4 +395,25 @@ void QskInputContext::setInputPanel( QskVirtualKeyboard* inputPanel )
} }
} }
void QskInputContext::reset()
{
}
void QskInputContext::commit()
{
}
bool QskInputContext::eventFilter( QObject* object, QEvent* event )
{
if ( object == m_data->inputItem )
return filterEvent( event );
return false;
}
bool QskInputContext::filterEvent( const QEvent* )
{
return false;
}
#include "moc_QskInputContext.cpp" #include "moc_QskInputContext.cpp"

View File

@ -24,6 +24,7 @@ public:
virtual ~QskInputContext(); virtual ~QskInputContext();
virtual bool isValid() const override; virtual bool isValid() const override;
virtual bool hasCapability( Capability ) const override;
virtual void update( Qt::InputMethodQueries ) override; virtual void update( Qt::InputMethodQueries ) override;
virtual void invokeAction( QInputMethod::Action, int ) override; virtual void invokeAction( QInputMethod::Action, int ) override;
@ -35,14 +36,21 @@ public:
virtual void hideInputPanel() override; virtual void hideInputPanel() override;
virtual bool isInputPanelVisible() const override; virtual bool isInputPanelVisible() const override;
virtual void reset() override;
virtual void commit() override;
virtual void setFocusObject( QObject* ) override; virtual void setFocusObject( QObject* ) override;
virtual QLocale locale() const override; virtual QLocale locale() const override;
virtual Qt::LayoutDirection inputDirection() const override;
void setCompositionModel( const QLocale&, QskInputCompositionModel* ); void setCompositionModel( const QLocale&, QskInputCompositionModel* );
Q_INVOKABLE QQuickItem* inputItem(); Q_INVOKABLE QQuickItem* inputItem();
virtual bool eventFilter( QObject*, QEvent * ) override;
virtual bool filterEvent( const QEvent* ) override;
private Q_SLOTS: private Q_SLOTS:
void handleCandidatesChanged(); void handleCandidatesChanged();
void setInputPanel( QskVirtualKeyboard* ); void setInputPanel( QskVirtualKeyboard* );

View File

@ -18,8 +18,8 @@ public:
QVector< Qt::Key > groups; QVector< Qt::Key > groups;
}; };
QskPinyinCompositionModel::QskPinyinCompositionModel(): QskPinyinCompositionModel::QskPinyinCompositionModel( QObject* parent ):
QskInputCompositionModel(), Inherited( parent ),
m_data( new PrivateData ) m_data( new PrivateData )
{ {
#if 1 #if 1
@ -124,5 +124,3 @@ void QskPinyinCompositionModel::handleGroupIndexChanged()
{ {
// ### implement // ### implement
} }
#include "moc_QskPinyinCompositionModel.cpp"

View File

@ -10,10 +10,10 @@
class QskPinyinCompositionModel : public QskInputCompositionModel class QskPinyinCompositionModel : public QskInputCompositionModel
{ {
Q_OBJECT using Inherited = QskInputCompositionModel;
public: public:
QskPinyinCompositionModel(); QskPinyinCompositionModel( QObject* parent = nullptr );
virtual ~QskPinyinCompositionModel() override; virtual ~QskPinyinCompositionModel() override;
virtual bool supportsSuggestions() const override final; virtual bool supportsSuggestions() const override final;

View File

@ -24,8 +24,10 @@ static inline void qskBindSignals( const QQuickTextInput* wrappedInput,
QObject::connect( wrappedInput, &QQuickTextInput::textChanged, QObject::connect( wrappedInput, &QQuickTextInput::textChanged,
input, [ input ] { input->Q_EMIT textChanged( input->text() ); } ); input, [ input ] { input->Q_EMIT textChanged( input->text() ); } );
#if QT_VERSION >= QT_VERSION_CHECK(5, 9, 0)
QObject::connect( wrappedInput, &QQuickTextInput::textEdited, QObject::connect( wrappedInput, &QQuickTextInput::textEdited,
input, [ input ] { input->Q_EMIT textEdited( input->text() ); } ); input, [ input ] { input->Q_EMIT textEdited( input->text() ); } );
#endif
QObject::connect( wrappedInput, &QQuickTextInput::textChanged, QObject::connect( wrappedInput, &QQuickTextInput::textChanged,
input, [ input ] { input->Q_EMIT textChanged( input->text() ); } ); input, [ input ] { input->Q_EMIT textChanged( input->text() ); } );
@ -42,8 +44,10 @@ static inline void qskBindSignals( const QQuickTextInput* wrappedInput,
QObject::connect( wrappedInput, &QQuickTextInput::readOnlyChanged, QObject::connect( wrappedInput, &QQuickTextInput::readOnlyChanged,
input, &QskTextInput::readOnlyChanged ); input, &QskTextInput::readOnlyChanged );
#if QT_VERSION >= QT_VERSION_CHECK(5, 8, 0)
QObject::connect( wrappedInput, &QQuickTextInput::overwriteModeChanged, QObject::connect( wrappedInput, &QQuickTextInput::overwriteModeChanged,
input, &QskTextInput::overwriteModeChanged ); input, &QskTextInput::overwriteModeChanged );
#endif
QObject::connect( wrappedInput, &QQuickTextInput::maximumLengthChanged, QObject::connect( wrappedInput, &QQuickTextInput::maximumLengthChanged,
input, &QskTextInput::maximumLengthChanged ); input, &QskTextInput::maximumLengthChanged );
@ -232,9 +236,12 @@ void QskTextInput::setFontRole( int role )
polish(); polish();
resetImplicitSize(); resetImplicitSize();
qskUpdateInputMethod( this, Qt::InputMethodQueries queries = Qt::ImCursorRectangle | Qt::ImFont;
Qt::ImCursorRectangle | Qt::ImFont | Qt::ImAnchorRectangle ); #if QT_VERSION >= QT_VERSION_CHECK(5, 7, 0)
queries |= Qt::ImAnchorRectangle;
#endif
qskUpdateInputMethod( this, queries );
Q_EMIT fontRoleChanged(); Q_EMIT fontRoleChanged();
} }
} }
@ -374,17 +381,29 @@ QString QskTextInput::displayText() const
QString QskTextInput::preeditText() const QString QskTextInput::preeditText() const
{ {
#if QT_VERSION >= QT_VERSION_CHECK(5, 7, 0)
return m_data->textInput->preeditText(); return m_data->textInput->preeditText();
#else
return QString();
#endif
} }
bool QskTextInput::overwriteMode() const bool QskTextInput::overwriteMode() const
{ {
#if QT_VERSION >= QT_VERSION_CHECK(5, 8, 0)
return m_data->textInput->overwriteMode(); return m_data->textInput->overwriteMode();
#else
return false;
#endif
} }
void QskTextInput::setOverwriteMode( bool overwrite ) void QskTextInput::setOverwriteMode( bool overwrite )
{ {
#if QT_VERSION >= QT_VERSION_CHECK(5, 8, 0)
m_data->textInput->setOverwriteMode( overwrite ); m_data->textInput->setOverwriteMode( overwrite );
#else
Q_UNUSED( overwrite )
#endif
} }
bool QskTextInput::autoScroll() const bool QskTextInput::autoScroll() const