diff options
author | Liang Qi <liang.qi@qt.io> | 2016-05-03 15:49:15 +0200 |
---|---|---|
committer | Liang Qi <liang.qi@qt.io> | 2016-05-03 15:49:15 +0200 |
commit | 6357813207c866c99aadfd91af8fb3affe891f1d (patch) | |
tree | 69464d415b12ebaa3e57d88d7b5cd113878be988 /src/widgets/widgets | |
parent | 5a76a3fb03f8d1dc8cb367de1a1dc6a37048376a (diff) | |
parent | b3fcaea5f2b97d3f562add97aee48cbb469c875a (diff) |
Merge remote-tracking branch 'origin/5.7' into dev
Conflicts:
configure
src/3rdparty/double-conversion/include/double-conversion/utils.h
src/corelib/global/qnamespace.qdoc
src/corelib/tools/qsimd_p.h
tests/auto/corelib/io/qfile/tst_qfile.cpp
Change-Id: I3ca1007bab5355d251c13002a18e93d81c254d34
Diffstat (limited to 'src/widgets/widgets')
-rw-r--r-- | src/widgets/widgets/qcombobox.cpp | 8 | ||||
-rw-r--r-- | src/widgets/widgets/qcombobox.h | 1 | ||||
-rw-r--r-- | src/widgets/widgets/qdatetimeedit.cpp | 17 | ||||
-rw-r--r-- | src/widgets/widgets/qdatetimeedit.h | 2 | ||||
-rw-r--r-- | src/widgets/widgets/qdatetimeedit_p.h | 27 | ||||
-rw-r--r-- | src/widgets/widgets/qlineedit.cpp | 16 | ||||
-rw-r--r-- | src/widgets/widgets/qlineedit.h | 1 | ||||
-rw-r--r-- | src/widgets/widgets/qplaintextedit.cpp | 21 | ||||
-rw-r--r-- | src/widgets/widgets/qtextedit.cpp | 21 | ||||
-rw-r--r-- | src/widgets/widgets/qwidgetlinecontrol.cpp | 33 | ||||
-rw-r--r-- | src/widgets/widgets/qwidgetlinecontrol_p.h | 2 | ||||
-rw-r--r-- | src/widgets/widgets/qwidgettextcontrol.cpp | 16 |
12 files changed, 126 insertions, 39 deletions
diff --git a/src/widgets/widgets/qcombobox.cpp b/src/widgets/widgets/qcombobox.cpp index 08c8117e0b..7992409265 100644 --- a/src/widgets/widgets/qcombobox.cpp +++ b/src/widgets/widgets/qcombobox.cpp @@ -3352,6 +3352,14 @@ QVariant QComboBox::inputMethodQuery(Qt::InputMethodQuery query) const return QWidget::inputMethodQuery(query); } +QVariant QComboBox::inputMethodQuery(Qt::InputMethodQuery query, const QVariant &argument) const +{ + Q_D(const QComboBox); + if (d->lineEdit) + return d->lineEdit->inputMethodQuery(query, argument); + return QWidget::inputMethodQuery(query); +} + /*! \fn void QComboBox::addItem(const QString &text, const QVariant &userData) diff --git a/src/widgets/widgets/qcombobox.h b/src/widgets/widgets/qcombobox.h index ed967e94f7..095a06fe31 100644 --- a/src/widgets/widgets/qcombobox.h +++ b/src/widgets/widgets/qcombobox.h @@ -202,6 +202,7 @@ public: bool event(QEvent *event) Q_DECL_OVERRIDE; QVariant inputMethodQuery(Qt::InputMethodQuery) const Q_DECL_OVERRIDE; + Q_INVOKABLE QVariant inputMethodQuery(Qt::InputMethodQuery query, const QVariant &argument) const; public Q_SLOTS: void clear(); diff --git a/src/widgets/widgets/qdatetimeedit.cpp b/src/widgets/widgets/qdatetimeedit.cpp index f72dc088da..cfba2cc87f 100644 --- a/src/widgets/widgets/qdatetimeedit.cpp +++ b/src/widgets/widgets/qdatetimeedit.cpp @@ -1674,12 +1674,7 @@ QDateTimeEditPrivate::QDateTimeEditPrivate() cachedDay = -1; currentSectionIndex = FirstSectionIndex; - first.type = FirstSection; - last.type = LastSection; - none.type = NoSection; first.pos = 0; - last.pos = -1; - none.pos = -1; sections = 0; calendarPopup = false; minimum = QDATETIMEEDIT_COMPAT_DATETIME_MIN; @@ -2053,7 +2048,7 @@ QDateTime QDateTimeEditPrivate::stepBy(int sectionIndex, int steps, bool test) c // doesn't mean that we hit the floor in the other if (steps > 0) { setDigit(v, sectionIndex, min); - if (!(sn.type & (DaySection|DayOfWeekSectionShort|DayOfWeekSectionLong)) && sections & DateSectionMask) { + if (!(sn.type & DaySectionMask) && sections & DateSectionMask) { const int daysInMonth = v.date().daysInMonth(); if (v.date().day() < oldDay && v.date().day() < daysInMonth) { const int adds = qMin(oldDay, daysInMonth); @@ -2068,7 +2063,7 @@ QDateTime QDateTimeEditPrivate::stepBy(int sectionIndex, int steps, bool test) c } } else { setDigit(v, sectionIndex, max); - if (!(sn.type & (DaySection|DayOfWeekSectionShort|DayOfWeekSectionLong)) && sections & DateSectionMask) { + if (!(sn.type & DaySectionMask) && sections & DateSectionMask) { const int daysInMonth = v.date().daysInMonth(); if (v.date().day() < oldDay && v.date().day() < daysInMonth) { const int adds = qMin(oldDay, daysInMonth); @@ -2086,7 +2081,7 @@ QDateTime QDateTimeEditPrivate::stepBy(int sectionIndex, int steps, bool test) c setDigit(v, sectionIndex, (steps > 0 ? localmax : localmin)); } } - if (!test && oldDay != v.date().day() && !(sn.type & (DaySection|DayOfWeekSectionShort|DayOfWeekSectionLong))) { + if (!test && oldDay != v.date().day() && !(sn.type & DaySectionMask)) { // this should not happen when called from stepEnabled cachedDay = qMax<int>(oldDay, cachedDay); } @@ -2278,15 +2273,15 @@ QDateTimeEdit::Sections QDateTimeEditPrivate::convertSections(QDateTimeParser::S ret |= QDateTimeEdit::SecondSection; if (s & QDateTimeParser::MinuteSection) ret |= QDateTimeEdit::MinuteSection; - if (s & (QDateTimeParser::Hour24Section|QDateTimeParser::Hour12Section)) + if (s & (QDateTimeParser::HourSectionMask)) ret |= QDateTimeEdit::HourSection; if (s & QDateTimeParser::AmPmSection) ret |= QDateTimeEdit::AmPmSection; - if (s & (QDateTimeParser::DaySection|QDateTimeParser::DayOfWeekSectionShort|QDateTimeParser::DayOfWeekSectionLong)) + if (s & (QDateTimeParser::DaySectionMask)) ret |= QDateTimeEdit::DaySection; if (s & QDateTimeParser::MonthSection) ret |= QDateTimeEdit::MonthSection; - if (s & (QDateTimeParser::YearSection|QDateTimeParser::YearSection2Digits)) + if (s & (QDateTimeParser::YearSectionMask)) ret |= QDateTimeEdit::YearSection; return ret; diff --git a/src/widgets/widgets/qdatetimeedit.h b/src/widgets/widgets/qdatetimeedit.h index 420ce82f1c..f050061dea 100644 --- a/src/widgets/widgets/qdatetimeedit.h +++ b/src/widgets/widgets/qdatetimeedit.h @@ -75,7 +75,7 @@ class Q_WIDGETS_EXPORT QDateTimeEdit : public QAbstractSpinBox Q_PROPERTY(int sectionCount READ sectionCount) Q_PROPERTY(Qt::TimeSpec timeSpec READ timeSpec WRITE setTimeSpec) public: - enum Section { + enum Section { // a sub-type of QDateTimeParser's like-named enum. NoSection = 0x0000, AmPmSection = 0x0001, MSecSection = 0x0002, diff --git a/src/widgets/widgets/qdatetimeedit_p.h b/src/widgets/widgets/qdatetimeedit_p.h index e8e0749623..6abb3cd9a3 100644 --- a/src/widgets/widgets/qdatetimeedit_p.h +++ b/src/widgets/widgets/qdatetimeedit_p.h @@ -81,14 +81,25 @@ public: void emitSignals(EmitPolicy ep, const QVariant &old); QString textFromValue(const QVariant &f) const; QVariant valueFromText(const QString &f) const; - virtual void _q_editorCursorPositionChanged(int oldpos, int newpos); - virtual void interpret(EmitPolicy ep); - virtual void clearCache() const; QDateTime validateAndInterpret(QString &input, int &, QValidator::State &state, bool fixup = false) const; void clearSection(int index); - virtual QString displayText() const { return edit->text(); } // this is from QDateTimeParser + + // Override QAbstractSpinBoxPrivate: + void _q_editorCursorPositionChanged(int oldpos, int newpos) Q_DECL_OVERRIDE; + void interpret(EmitPolicy ep) Q_DECL_OVERRIDE; + void clearCache() const Q_DECL_OVERRIDE; + QStyle::SubControl newHoverControl(const QPoint &pos) Q_DECL_OVERRIDE; + void updateEditFieldGeometry() Q_DECL_OVERRIDE; + QVariant getZeroVariant() const Q_DECL_OVERRIDE; + void setRange(const QVariant &min, const QVariant &max) Q_DECL_OVERRIDE; + + // Override QDateTimePraser: + QString displayText() const Q_DECL_OVERRIDE { return edit->text(); } + QDateTime getMinimum() const Q_DECL_OVERRIDE { return minimum.toDateTime(); } + QDateTime getMaximum() const Q_DECL_OVERRIDE { return maximum.toDateTime(); } + QLocale locale() const Q_DECL_OVERRIDE { return q_func()->locale(); } int absoluteIndex(QDateTimeEdit::Section s, int index) const; int absoluteIndex(const SectionNode &s) const; @@ -102,18 +113,10 @@ public: void updateCache(const QVariant &val, const QString &str) const; void updateTimeSpec(); - virtual QDateTime getMinimum() const { return minimum.toDateTime(); } - virtual QDateTime getMaximum() const { return maximum.toDateTime(); } - virtual QLocale locale() const { return q_func()->locale(); } QString valueToText(const QVariant &var) const { return textFromValue(var); } QString getAmPmText(AmPm ap, Case cs) const; int cursorPosition() const { return edit ? edit->cursorPosition() : -1; } - virtual QStyle::SubControl newHoverControl(const QPoint &pos); - virtual void updateEditFieldGeometry(); - virtual QVariant getZeroVariant() const; - virtual void setRange(const QVariant &min, const QVariant &max); - void _q_resetButton(); void updateArrow(QStyle::StateFlag state); bool calendarPopupEnabled() const; diff --git a/src/widgets/widgets/qlineedit.cpp b/src/widgets/widgets/qlineedit.cpp index 9e489fad14..9be20ebb74 100644 --- a/src/widgets/widgets/qlineedit.cpp +++ b/src/widgets/widgets/qlineedit.cpp @@ -1743,18 +1743,28 @@ void QLineEdit::inputMethodEvent(QInputMethodEvent *e) #endif } +QVariant QLineEdit::inputMethodQuery(Qt::InputMethodQuery property) const +{ + return inputMethodQuery(property, QVariant()); +} + /*!\reimp */ -QVariant QLineEdit::inputMethodQuery(Qt::InputMethodQuery property) const +QVariant QLineEdit::inputMethodQuery(Qt::InputMethodQuery property, QVariant argument) const { Q_D(const QLineEdit); switch(property) { case Qt::ImCursorRectangle: return d->cursorRect(); + case Qt::ImAnchorRectangle: + return d->adjustedControlRect(d->control->anchorRect()); case Qt::ImFont: return font(); - case Qt::ImCursorPosition: - return QVariant(d->control->cursor()); + case Qt::ImCursorPosition: { + const QPointF pt = argument.toPointF(); + if (!pt.isNull()) + return QVariant(d->xToPos(pt.x(), QTextLine::CursorBetweenCharacters)); + return QVariant(d->control->cursor()); } case Qt::ImSurroundingText: return QVariant(d->control->text()); case Qt::ImCurrentSelection: diff --git a/src/widgets/widgets/qlineedit.h b/src/widgets/widgets/qlineedit.h index 6a24daa873..12fd998c45 100644 --- a/src/widgets/widgets/qlineedit.h +++ b/src/widgets/widgets/qlineedit.h @@ -228,6 +228,7 @@ protected: void initStyleOption(QStyleOptionFrame *option) const; public: QVariant inputMethodQuery(Qt::InputMethodQuery) const Q_DECL_OVERRIDE; + Q_INVOKABLE QVariant inputMethodQuery(Qt::InputMethodQuery property, QVariant argument) const; bool event(QEvent *) Q_DECL_OVERRIDE; protected: QRect cursorRect() const; diff --git a/src/widgets/widgets/qplaintextedit.cpp b/src/widgets/widgets/qplaintextedit.cpp index 17eac9db58..1da8028efb 100644 --- a/src/widgets/widgets/qplaintextedit.cpp +++ b/src/widgets/widgets/qplaintextedit.cpp @@ -667,6 +667,7 @@ void QPlainTextEditPrivate::setTopBlock(int blockNumber, int lineNumber, int dx) if (dx || dy) { viewport->scroll(q->isRightToLeft() ? -dx : dx, dy); + QGuiApplication::inputMethod()->update(Qt::ImCursorRectangle | Qt::ImAnchorRectangle); } else { viewport->update(); topLineFracture = 0; @@ -2199,8 +2200,26 @@ QVariant QPlainTextEdit::inputMethodQuery(Qt::InputMethodQuery query, QVariant a Q_D(const QPlainTextEdit); if (query == Qt::ImHints) return QWidget::inputMethodQuery(query); - const QVariant v = d->control->inputMethodQuery(query, argument); + const QPointF offset = contentOffset(); + switch (argument.type()) { + case QVariant::RectF: + argument = argument.toRectF().translated(-offset); + break; + case QVariant::PointF: + argument = argument.toPointF() - offset; + break; + case QVariant::Rect: + argument = argument.toRect().translated(-offset.toPoint()); + break; + case QVariant::Point: + argument = argument.toPoint() - offset; + break; + default: + break; + } + + const QVariant v = d->control->inputMethodQuery(query, argument); switch (v.type()) { case QVariant::RectF: return v.toRectF().translated(offset); diff --git a/src/widgets/widgets/qtextedit.cpp b/src/widgets/widgets/qtextedit.cpp index 1dd774cf7a..a81781bd4d 100644 --- a/src/widgets/widgets/qtextedit.cpp +++ b/src/widgets/widgets/qtextedit.cpp @@ -1713,6 +1713,7 @@ void QTextEdit::scrollContentsBy(int dx, int dy) if (isRightToLeft()) dx = -dx; d->viewport->scroll(dx, dy); + QGuiApplication::inputMethod()->update(Qt::ImCursorRectangle | Qt::ImAnchorRectangle); } /*!\reimp @@ -1729,8 +1730,26 @@ QVariant QTextEdit::inputMethodQuery(Qt::InputMethodQuery query, QVariant argume Q_D(const QTextEdit); if (query == Qt::ImHints) return QWidget::inputMethodQuery(query); - const QVariant v = d->control->inputMethodQuery(query, argument); + const QPointF offset(-d->horizontalOffset(), -d->verticalOffset()); + switch (argument.type()) { + case QVariant::RectF: + argument = argument.toRectF().translated(-offset); + break; + case QVariant::PointF: + argument = argument.toPointF() - offset; + break; + case QVariant::Rect: + argument = argument.toRect().translated(-offset.toPoint()); + break; + case QVariant::Point: + argument = argument.toPoint() - offset; + break; + default: + break; + } + + const QVariant v = d->control->inputMethodQuery(query, argument); switch (v.type()) { case QVariant::RectF: return v.toRectF().translated(offset); diff --git a/src/widgets/widgets/qwidgetlinecontrol.cpp b/src/widgets/widgets/qwidgetlinecontrol.cpp index af8e5a8b42..24edca172b 100644 --- a/src/widgets/widgets/qwidgetlinecontrol.cpp +++ b/src/widgets/widgets/qwidgetlinecontrol.cpp @@ -407,16 +407,14 @@ int QWidgetLineControl::xToPos(int x, QTextLine::CursorPosition betweenOrOn) con /*! \internal - Returns the bounds of the current cursor, as defined as a - between characters cursor. + Returns the bounds of the given text position. */ -QRect QWidgetLineControl::cursorRect() const +QRect QWidgetLineControl::rectForPos(int pos) const { QTextLine l = textLayout()->lineAt(0); - int c = m_cursor; if (m_preeditCursor != -1) - c += m_preeditCursor; - int cix = qRound(l.cursorToX(c)); + pos += m_preeditCursor; + int cix = qRound(l.cursorToX(pos)); int w = m_cursorWidth; int ch = l.height() + 1; @@ -426,6 +424,29 @@ QRect QWidgetLineControl::cursorRect() const /*! \internal + Returns the bounds of the current cursor, as defined as a + between characters cursor. +*/ +QRect QWidgetLineControl::cursorRect() const +{ + return rectForPos(m_cursor); +} + +/*! + \internal + + Returns the bounds of the current anchor +*/ +QRect QWidgetLineControl::anchorRect() const +{ + if (!hasSelectedText()) + return cursorRect(); + return rectForPos(m_selstart < m_selend ? m_selstart : m_selend); +} + +/*! + \internal + Fixes the current text so that it is valid given any set validators. Returns \c true if the text was changed. Otherwise returns \c false. diff --git a/src/widgets/widgets/qwidgetlinecontrol_p.h b/src/widgets/widgets/qwidgetlinecontrol_p.h index 6fadb64e0c..8b723b0224 100644 --- a/src/widgets/widgets/qwidgetlinecontrol_p.h +++ b/src/widgets/widgets/qwidgetlinecontrol_p.h @@ -212,7 +212,9 @@ public: void end(bool mark) { moveCursor(text().length(), mark); } int xToPos(int x, QTextLine::CursorPosition = QTextLine::CursorBetweenCharacters) const; + QRect rectForPos(int pos) const; QRect cursorRect() const; + QRect anchorRect() const; qreal cursorToX(int cursor) const { return m_textLayout.lineAt(0).cursorToX(cursor); } qreal cursorToX() const diff --git a/src/widgets/widgets/qwidgettextcontrol.cpp b/src/widgets/widgets/qwidgettextcontrol.cpp index af6d879661..cc1726c362 100644 --- a/src/widgets/widgets/qwidgettextcontrol.cpp +++ b/src/widgets/widgets/qwidgettextcontrol.cpp @@ -2073,10 +2073,15 @@ QVariant QWidgetTextControl::inputMethodQuery(Qt::InputMethodQuery property, QVa switch(property) { case Qt::ImCursorRectangle: return cursorRect(); + case Qt::ImAnchorRectangle: + return d->rectForPosition(d->cursor.anchor()); case Qt::ImFont: return QVariant(d->cursor.charFormat().font()); - case Qt::ImCursorPosition: - return QVariant(d->cursor.position() - block.position()); + case Qt::ImCursorPosition: { + const QPointF pt = argument.toPointF(); + if (!pt.isNull()) + return QVariant(cursorForPosition(pt).position() - block.position()); + return QVariant(d->cursor.position() - block.position()); } case Qt::ImSurroundingText: return QVariant(block.text()); case Qt::ImCurrentSelection: @@ -2085,8 +2090,11 @@ QVariant QWidgetTextControl::inputMethodQuery(Qt::InputMethodQuery property, QVa return QVariant(); // No limit. case Qt::ImAnchorPosition: return QVariant(d->cursor.anchor() - block.position()); - case Qt::ImAbsolutePosition: - return QVariant(d->cursor.position()); + case Qt::ImAbsolutePosition: { + const QPointF pt = argument.toPointF(); + if (!pt.isNull()) + return QVariant(cursorForPosition(pt).position()); + return QVariant(d->cursor.position()); } case Qt::ImTextAfterCursor: { int maxLength = argument.isValid() ? argument.toInt() : 1024; |