Move input panel visibility ownership from QInputPanel to QPlatformInputContext

Now QInputPanel::visible() can be set true even when platform doesn't provide
a virtual keyboard. Like keyboard geometry, visibility should be dictated by
the platform plugin and not QInputPanel, whose role is more like that of a mediator.
QInputPanel::show() and ::hide() calls should be treated as requests that may fail.
Changed the QInputPanel's visible property to read-only as a setter that may
fail is not really a setter, show() and hide() should be used instead.

Enabling the new functionality cannot be activated immediatelly without breaking
existing keyboards, added a temporary function handlesInputPanelVisibility that
handovers the responsiblity of updating input panel visibility to QInputContextPlatform
only once QInputContextPlatform says that it is able to handle it.

Change-Id: Ideecaf7225cc3971f33a0ac976bd92cf7767475b
Reviewed-on: http://codereview.qt-project.org/6429
Sanity-Review: Qt Sanity Bot <qt_sanity_bot@ovi.com>
Reviewed-by: Pekka Vuorela <pekka.ta.vuorela@nokia.com>
Reviewed-by: Lars Knoll <lars.knoll@nokia.com>
This commit is contained in:
Joona Petrell 2011-10-11 13:10:50 +03:00 committed by Qt by Nokia
parent 0e6a401028
commit e941b37fcc
7 changed files with 100 additions and 25 deletions

View File

@ -118,29 +118,42 @@ QRectF QInputPanel::keyboardRectangle()
void QInputPanel::show()
{
setVisible(true);
Q_D(QInputPanel);
QPlatformInputContext *ic = d->platformInputContext();
if (ic && ic->handlesInputPanelVisibility())
ic->showInputPanel();
else if (!d->visible) {
d->visible = true;
emit visibleChanged();
}
}
void QInputPanel::hide()
{
setVisible(false);
Q_D(QInputPanel);
QPlatformInputContext *ic = d->platformInputContext();
if (ic && ic->handlesInputPanelVisibility())
ic->hideInputPanel();
else if (d->visible) {
d->visible = false;
emit visibleChanged();
}
}
bool QInputPanel::visible() const
{
Q_D(const QInputPanel);
return d->visible;
QPlatformInputContext *ic = d->platformInputContext();
if (ic && ic->handlesInputPanelVisibility())
return ic->isInputPanelVisible();
else
return d->visible;
return false;
}
void QInputPanel::setVisible(bool visible)
{
Q_D(QInputPanel);
if (d->visible == visible)
return;
d->visible = visible;
emit visibleChanged();
visible ? show() : hide();
}
bool QInputPanel::isAnimating() const
@ -152,7 +165,6 @@ bool QInputPanel::isAnimating() const
return false;
}
void QInputPanel::update(Qt::InputMethodQueries queries)
{
Q_D(QInputPanel);

View File

@ -62,7 +62,7 @@ class Q_GUI_EXPORT QInputPanel : public QObject
Q_PROPERTY(QObject *inputItem READ inputItem WRITE setInputItem NOTIFY inputItemChanged)
Q_PROPERTY(QRectF cursorRectangle READ cursorRectangle NOTIFY cursorRectangleChanged)
Q_PROPERTY(QRectF keyboardRectangle READ keyboardRectangle NOTIFY keyboardRectangleChanged)
Q_PROPERTY(bool visible READ visible WRITE setVisible NOTIFY visibleChanged)
Q_PROPERTY(bool visible READ visible NOTIFY visibleChanged)
Q_PROPERTY(bool animating READ isAnimating NOTIFY animatingChanged)
Q_ENUMS(Action)

View File

@ -90,12 +90,12 @@ QRectF QPlatformInputContext::keyboardRect() const
return QRectF();
}
void QPlatformInputContext::emitKeyboardRectChanged() const
void QPlatformInputContext::emitKeyboardRectChanged()
{
emit qApp->inputPanel()->keyboardRectangleChanged();
}
bool QPlatformInputContext::isAnimating()
bool QPlatformInputContext::isAnimating() const
{
return false;
}
@ -105,5 +105,28 @@ void QPlatformInputContext::emitAnimatingChanged()
emit qApp->inputPanel()->animatingChanged();
}
void QPlatformInputContext::showInputPanel()
{
}
void QPlatformInputContext::hideInputPanel()
{
}
bool QPlatformInputContext::isInputPanelVisible() const
{
return false;
}
void QPlatformInputContext::emitInputPanelVisibleChanged()
{
emit qApp->inputPanel()->visibleChanged();
}
// temporary function added to retain compatibility to old functionality, will be deprecated
bool QPlatformInputContext::handlesInputPanelVisibility() const
{
return false;
}
QT_END_NAMESPACE

View File

@ -68,10 +68,18 @@ public:
virtual void invokeAction(QInputPanel::Action, int cursorPosition);
virtual bool filterEvent(const QEvent *event);
virtual QRectF keyboardRect() const;
void emitKeyboardRectChanged() const;
void emitKeyboardRectChanged();
virtual bool isAnimating();
virtual bool isAnimating() const;
void emitAnimatingChanged();
virtual void showInputPanel();
virtual void hideInputPanel();
virtual bool isInputPanelVisible() const;
void emitInputPanelVisibleChanged();
// temporary function added to retain compatibility to old functionality, will be deprecated
virtual bool handlesInputPanelVisibility() const;
};
QT_END_NAMESPACE

View File

@ -155,6 +155,11 @@ void QIBusPlatformInputContext::inputItemChanged()
d->context->FocusOut();
}
// temporary function added to retain compatibility to old functionality, will be deprecated
bool QIBusPlatformInputContext::handlesInputPanelVisibility() const
{
return true;
}
void QIBusPlatformInputContext::commitText(const QDBusVariant &text)
{

View File

@ -63,6 +63,8 @@ public:
Q_INVOKABLE bool x11FilterEvent(uint keyval, uint keycode, uint state, bool press);
virtual bool handlesInputPanelVisibility() const;
public Q_SLOTS:
void commitText(const QDBusVariant &text);
void updatePreeditText(const QDBusVariant &text, uint cursor_pos, bool visible);

View File

@ -50,6 +50,8 @@ class PlatformInputContext : public QPlatformInputContext
public:
PlatformInputContext() :
m_animating(false),
m_visible(false),
m_handlesInputPanelVisibility(false),
m_updateCallCount(0),
m_resetCallCount(0),
m_commitCallCount(0),
@ -60,7 +62,7 @@ public:
{}
virtual QRectF keyboardRect() const { return m_keyboardRect; }
virtual bool isAnimating() { return m_animating; }
virtual bool isAnimating() const { return m_animating; }
virtual void reset() { m_resetCallCount++; }
virtual void commit() { m_commitCallCount++; }
@ -78,8 +80,26 @@ public:
{
m_lastEventType = event->type(); return false;
}
virtual void showInputPanel()
{
m_visible = true;
}
virtual void hideInputPanel()
{
m_visible = false;
}
virtual bool isInputPanelVisible() const
{
return m_visible;
}
virtual bool handlesInputPanelVisibility() const
{
return m_handlesInputPanelVisibility;
}
bool m_animating;
bool m_visible;
bool m_handlesInputPanelVisibility;
int m_updateCallCount;
int m_resetCallCount;
int m_commitCallCount;
@ -143,17 +163,22 @@ void tst_qinputpanel::initTestCase()
void tst_qinputpanel::visible()
{
qApp->inputPanel()->show();
QCOMPARE(qApp->inputPanel()->visible(), true);
QCOMPARE(m_platformInputContext.m_handlesInputPanelVisibility, false);
for (int index = 0; index < 2; index++) {
m_platformInputContext.m_handlesInputPanelVisibility = index;
QCOMPARE(qApp->inputPanel()->visible(), false);
qApp->inputPanel()->show();
QCOMPARE(qApp->inputPanel()->visible(), true);
qApp->inputPanel()->hide();
QCOMPARE(qApp->inputPanel()->visible(), false);
qApp->inputPanel()->hide();
QCOMPARE(qApp->inputPanel()->visible(), false);
qApp->inputPanel()->setVisible(true);
QCOMPARE(qApp->inputPanel()->visible(), true);
qApp->inputPanel()->setVisible(true);
QCOMPARE(qApp->inputPanel()->visible(), true);
qApp->inputPanel()->setVisible(false);
QCOMPARE(qApp->inputPanel()->visible(), false);
qApp->inputPanel()->setVisible(false);
QCOMPARE(qApp->inputPanel()->visible(), false);
}
}
void tst_qinputpanel::animating()