6#include "QskInputPanelBox.h"
7#include "QskInputPredictionBar.h"
8#include "QskLinearBox.h"
9#include "QskTextField.h"
10#include "QskTextLabel.h"
11#include "QskVirtualKeyboard.h"
16static void qskSetupInput(
const QQuickItem* item,
QskTextInput* textInput )
18 if ( item ==
nullptr )
23 int maxCharacters = 32767;
24 QskTextInput::EchoMode echoMode = QskTextInput::Normal;
26 Qt::InputMethodQueries queries = Qt::ImQueryAll;
27 queries &= ~Qt::ImEnabled;
29 QInputMethodQueryEvent event( queries );
30 QCoreApplication::sendEvent(
const_cast< QQuickItem*
>( item ), &event );
32 if ( event.queries() & Qt::ImHints )
34 const auto hints =
static_cast< Qt::InputMethodHints
>(
35 event.value( Qt::ImHints ).toInt() );
37 if ( hints & Qt::ImhHiddenText )
38 echoMode = QskTextInput::NoEcho;
41 if ( event.queries() & Qt::ImMaximumTextLength )
45 const auto value =
event.value( Qt::ImMaximumTextLength );
46 if ( value.isValid() )
47 maxCharacters = qBound( 0, value.toInt(), maxCharacters );
50 textInput->setMaxLength( maxCharacters );
52 if ( event.queries() & Qt::ImSurroundingText )
54 const auto text =
event.value( Qt::ImSurroundingText ).toString();
55 textInput->setText( text );
58 if ( event.queries() & Qt::ImCursorPosition )
60 const auto pos =
event.value( Qt::ImCursorPosition ).toInt();
61 textInput->setCursorPosition( pos );
64 if ( event.queries() & Qt::ImCurrentSelection )
67 const auto text =
event.value( Qt::ImCurrentSelection ).toString();
68 if ( !text.isEmpty() )
74 int passwordMaskDelay = -1;
75 QString passwordCharacter;
77 if ( echoMode == QskTextInput::NoEcho )
88 value = item->property(
"passwordMaskDelay" );
89 if ( value.canConvert<
int >() )
90 passwordMaskDelay = value.toInt();
92 value = item->property(
"passwordCharacter" );
93 if ( value.canConvert< QString >() )
94 passwordCharacter = value.toString();
96 value = item->property(
"echoMode" );
97 if ( value.canConvert<
int >() )
99 const auto mode = value.toInt();
100 if ( mode == QskTextInput::Password )
101 echoMode = QskTextInput::Password;
105 if ( passwordMaskDelay >= 0 )
106 textInput->setPasswordMaskDelay( passwordMaskDelay );
108 textInput->resetPasswordMaskDelay();
110 if ( !passwordCharacter.isEmpty() )
111 textInput->setPasswordCharacter( passwordCharacter );
113 textInput->resetPasswordCharacter();
115 textInput->setEchoMode( echoMode );
123 TextFieldProxy(
QskInputPanelBox* panelBox, QQuickItem* parentItem =
nullptr )
125 , m_panelBox( panelBox )
127 setObjectName( QStringLiteral(
"InputBoxProxy" ) );
129 setFocusPolicy( Qt::NoFocus );
137 if ( subControl == QskTextField::TextPanel )
138 return m_panelBox->effectiveSubcontrol( QskInputPanelBox::ProxyPanel );
140 if ( subControl == QskTextField::Text )
141 return m_panelBox->effectiveSubcontrol( QskInputPanelBox::ProxyText );
146 void focusInEvent( QFocusEvent* )
override
150 void focusOutEvent( QFocusEvent* )
override
163class QskInputPanelBox::PrivateData
166 QPointer< QQuickItem > inputItem;
170 TextFieldProxy* inputProxy;
174 QskInputPanelBox::PanelHints panelHints = QskInputPanelBox::InputProxy;
177QskInputPanelBox::QskInputPanelBox( QQuickItem* parent )
178 : Inherited( parent )
179 , m_data( new PrivateData() )
181 setAutoLayoutChildren(
true );
184 m_data->prompt->setVisible(
false );
186 m_data->inputProxy =
new TextFieldProxy(
this,
nullptr );
187 m_data->inputProxy->setVisible(
188 m_data->panelHints & QskInputPanelBox::InputProxy );
191 m_data->predictionBar->setVisible(
192 m_data->panelHints & QskInputPanelBox::Prediction );
197 layout->setDefaultAlignment( Qt::AlignLeft | Qt::AlignHCenter );
198 layout->setSpacing( 0 );
200 layout->addItem( m_data->prompt );
201 layout->addItem( m_data->inputProxy );
202 layout->addStretch( 10 );
203 layout->addItem( m_data->predictionBar );
204 layout->addItem( m_data->keyboard );
206 m_data->layout = layout;
208 connect( m_data->predictionBar, &QskInputPredictionBar::predictiveTextSelected,
209 this, &QskInputPanelBox::predictiveTextSelected );
211 connect( m_data->keyboard, &QskVirtualKeyboard::keySelected,
212 this, &QskInputPanelBox::keySelected );
215QskInputPanelBox::~QskInputPanelBox()
219void QskInputPanelBox::setPanelHint( PanelHint hint,
bool on )
222 setPanelHints( m_data->panelHints | hint );
224 setPanelHints( m_data->panelHints & ~hint );
227void QskInputPanelBox::setPanelHints( PanelHints hints )
229 if ( hints == m_data->panelHints )
232 m_data->panelHints = hints;
234 m_data->inputProxy->setVisible( hints & QskInputPanelBox::InputProxy );
235 m_data->predictionBar->setVisible( hints & QskInputPanelBox::Prediction );
237 const bool showPrompt = ( hints & QskInputPanelBox::InputProxy ) &&
238 !m_data->prompt->text().isEmpty();
240 m_data->prompt->setVisible( showPrompt );
242 Q_EMIT panelHintsChanged();
245QskInputPanelBox::PanelHints QskInputPanelBox::panelHints()
const
247 return m_data->panelHints;
250void QskInputPanelBox::attachInputItem( QQuickItem* item )
252 if ( item == m_data->inputItem )
255 m_data->inputItem = item;
259 if ( m_data->panelHints & QskInputPanelBox::InputProxy )
261 qskSetupInput( item, m_data->inputProxy );
262 m_data->inputProxy->setEditing(
true );
267QQuickItem* QskInputPanelBox::attachedInputItem()
const
269 return m_data->inputItem;
272QQuickItem* QskInputPanelBox::inputProxy()
const
274 if ( m_data->panelHints & QskInputPanelBox::InputProxy )
275 return m_data->inputProxy;
283 if ( subControl == QskBox::Panel )
284 return QskInputPanelBox::Panel;
288 if ( subControl == QskInputPanelBox::ProxyPanel )
289 return QskTextField::TextPanel;
291 if ( subControl == QskInputPanelBox::ProxyText )
292 return QskTextField::Text;
298QString QskInputPanelBox::inputPrompt()
const
300 return m_data->prompt->text();
303void QskInputPanelBox::setInputPrompt(
const QString& text )
305 auto prompt = m_data->prompt;
307 if ( text != prompt->text() )
309 prompt->setText( text );
311 if ( m_data->panelHints & QskInputPanelBox::InputProxy )
312 prompt->setVisible( !text.isEmpty() );
314 Q_EMIT inputPromptChanged( text );
318void QskInputPanelBox::setPrediction(
const QStringList& prediction )
320 m_data->predictionBar->setPrediction( prediction );
325 if( m_data->keyboard )
327 m_data->keyboard->deleteLater();
330 m_data->keyboard = keyboard;
331 m_data->layout->addItem( m_data->keyboard );
333 connect( m_data->keyboard, &QskVirtualKeyboard::keySelected,
334 this, &QskInputPanelBox::keySelected );
337void QskInputPanelBox::keyPressEvent( QKeyEvent* event )
341 switch ( event->key() )
346 Q_EMIT keySelected( event->key() );
352 const auto text =
event->text();
354 if ( !text.isEmpty() )
355 keyCode = text[ 0 ].unicode();
357 keyCode =
event->key();
359 if ( m_data->keyboard->hasKey( keyCode ) )
362 Q_EMIT keySelected( keyCode );
368#include "moc_QskInputPanelBox.cpp"
Subcontrol
For use within the rendering or lay-outing of a specific QskSkinnable.
void initSizePolicy(QskSizePolicy::Policy, QskSizePolicy::Policy)
Layout stringing items in rows and columns.