summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorAlan Alpert <alan.alpert@nokia.com>2009-07-20 03:15:34 (GMT)
committerAlan Alpert <alan.alpert@nokia.com>2009-07-20 03:15:34 (GMT)
commit139b29f6ac99380a4f6fb47d0eca650c67757005 (patch)
tree03eaf49cca36a24995d147e22f883d41184f6781 /src
parent7c0a59857cf7a74eb16ba4186b10514f159b7aab (diff)
downloadQt-139b29f6ac99380a4f6fb47d0eca650c67757005.zip
Qt-139b29f6ac99380a4f6fb47d0eca650c67757005.tar.gz
Qt-139b29f6ac99380a4f6fb47d0eca650c67757005.tar.bz2
Add selection control to QFxLineEdit
Should behave the same as in QFxTextEdit
Diffstat (limited to 'src')
-rw-r--r--src/declarative/fx/qfxlineedit.cpp164
-rw-r--r--src/declarative/fx/qfxlineedit.h39
-rw-r--r--src/declarative/fx/qfxlineedit_p.h3
3 files changed, 93 insertions, 113 deletions
diff --git a/src/declarative/fx/qfxlineedit.cpp b/src/declarative/fx/qfxlineedit.cpp
index 24cf3fc..a95cad6 100644
--- a/src/declarative/fx/qfxlineedit.cpp
+++ b/src/declarative/fx/qfxlineedit.cpp
@@ -103,32 +103,6 @@ void QFxLineEdit::setColor(const QColor &c)
d->color = c;
}
-/*
-QFxText::TextStyle QFxLineEdit::style() const
-{
- Q_D(const QFxLineEdit);
- return d->style;
-}
-
-void QFxLineEdit::setStyle(QFxText::TextStyle style)
-{
- Q_D(QFxLineEdit);
- d->style = style;
-}
-
-QColor QFxLineEdit::styleColor() const
-{
- Q_D(const QFxLineEdit);
- return d->styleColor;
-}
-
-void QFxLineEdit::setStyleColor(const QColor &c)
-{
- Q_D(QFxLineEdit);
- d->styleColor = c;
-}
-*/
-
QFxText::HAlignment QFxLineEdit::hAlign() const
{
Q_D(const QFxLineEdit);
@@ -141,19 +115,6 @@ void QFxLineEdit::setHAlign(QFxText::HAlignment align)
d->hAlign = align;
}
-QFxText::VAlignment QFxLineEdit::vAlign() const
-{
- Q_D(const QFxLineEdit);
- return d->vAlign;
-}
-
-void QFxLineEdit::setVAlign(QFxText::VAlignment align)
-{
- Q_D(QFxLineEdit);
- d->vAlign = align;
-}
-
-//### Should this also toggle cursor visibility?
bool QFxLineEdit::isReadOnly() const
{
Q_D(const QFxLineEdit);
@@ -189,16 +150,60 @@ void QFxLineEdit::setCursorPosition(int cp)
d->control->moveCursor(cp);
}
-int QFxLineEdit::selectionLength() const
+/*!
+ \qmlproperty int LineEdit::selectionStart
+
+ The cursor position before the first character in the current selection.
+ Setting this and selectionEnd allows you to specify a selection in the
+ text edit.
+
+ Note that if selectionStart == selectionEnd then there is no current
+ selection. If you attempt to set selectionStart to a value outside of
+ the current text, selectionStart will not be changed.
+
+ \sa selectionEnd, cursorPosition, selectedText
+*/
+int QFxLineEdit::selectionStart() const
+{
+ Q_D(const QFxLineEdit);
+ return d->lastSelectionStart;
+}
+
+void QFxLineEdit::setSelectionStart(int s)
+{
+ Q_D(QFxLineEdit);
+ if(d->lastSelectionStart == s || s < 0 || s > text().length())
+ return;
+ d->lastSelectionStart = s;
+ d->control->setSelection(s, d->lastSelectionEnd - s);
+}
+
+/*!
+ \qmlproperty int LineEdit::selectionEnd
+
+ The cursor position after the last character in the current selection.
+ Setting this and selectionStart allows you to specify a selection in the
+ text edit.
+
+ Note that if selectionStart == selectionEnd then there is no current
+ selection. If you attempt to set selectionEnd to a value outside of
+ the current text, selectionEnd will not be changed.
+
+ \sa selectionStart, cursorPosition, selectedText
+*/
+int QFxLineEdit::selectionEnd() const
{
Q_D(const QFxLineEdit);
- return d->control->selectionEnd() - d->control->selectionStart();
+ return d->lastSelectionEnd;
}
-void QFxLineEdit::setSelectionLength(int len)
+void QFxLineEdit::setSelectionEnd(int s)
{
Q_D(QFxLineEdit);
- d->control->setSelection(d->control->cursor(), len);
+ if(d->lastSelectionEnd == s || s < 0 || s > text().length())
+ return;
+ d->lastSelectionEnd = s;
+ d->control->setSelection(d->lastSelectionStart, s - d->lastSelectionStart);
}
QString QFxLineEdit::selectedText() const
@@ -403,41 +408,8 @@ void QFxLineEdit::drawContents(QPainter *p, const QRect &r)
if (d->control->hasSelectedText())
flags |= QLineControl::DrawSelections;
- //TODO: Clean up this cut'n'pasted section from QLineEdit
- QRect lineRect(r);
-
- int cix = qRound(d->control->cursorToX());
-
- // horizontal scrolling. d->hscroll is the left indent from the beginning
- // of the text line to the left edge of lineRect. we update this value
- // depending on the delta from the last paint event; in effect this means
- // the below code handles all scrolling based on the textline (widthUsed,
- // minLB, minRB), the line edit rect (lineRect) and the cursor position
- // (cix).
- QFontMetrics fm = QApplication::fontMetrics();
- int minLB = qMax(0, -fm.minLeftBearing());
- int minRB = qMax(0, -fm.minRightBearing());
- int widthUsed = d->control->width() + minRB;
- if ((minLB + widthUsed) <= lineRect.width()) {
- // text fits in lineRect; use hscroll for alignment
- d->hscroll = 0;
- d->hscroll -= minLB;
- } else if (cix - d->hscroll >= lineRect.width()) {
- // text doesn't fit, cursor is to the right of lineRect (scroll right)
- d->hscroll = cix - lineRect.width() + 1;
- } else if (cix - d->hscroll < 0 && d->hscroll < widthUsed) {
- // text doesn't fit, cursor is to the left of lineRect (scroll left)
- d->hscroll = cix;
- }
- // the y offset is there to keep the baseline constant in case we have script changes in the text.
- QPoint topLeft = lineRect.topLeft() - QPoint(d->hscroll, d->control->ascent() - fm.ascent());
+ d->control->draw(p, QPoint(0,0), r, flags);
- if(d->hscroll != d->oldScroll)
- moveCursor();
-
- d->control->draw(p, topLeft, r, flags);
-
- d->oldScroll = d->hscroll;
p->restore();
}
@@ -447,13 +419,12 @@ void QFxLineEditPrivate::init()
control->setCursorWidth(1);
control->setPasswordCharacter(QLatin1Char('*'));
control->setLayoutDirection(Qt::LeftToRight);
- control->setSelection(0,0);
q->setSmooth(true);
q->setAcceptedMouseButtons(Qt::LeftButton);
q->setOptions(QFxLineEdit::AcceptsInputMethods | QFxLineEdit::SimpleItem
| QFxLineEdit::HasContents | QFxLineEdit::MouseEvents);
q->connect(control, SIGNAL(cursorPositionChanged(int,int)),
- q, SIGNAL(cursorPositionChanged()));
+ q, SLOT(cursorPosChanged()));
q->connect(control, SIGNAL(selectionChanged()),
q, SLOT(selectionChanged()));
q->connect(control, SIGNAL(textChanged(const QString &)),
@@ -471,16 +442,43 @@ void QFxLineEditPrivate::init()
font = new QmlFont();
q->updateSize();
oldValidity = control->hasAcceptableInput();
- oldSelectLength = q->selectionLength();
+ lastSelectionStart = 0;
+ lastSelectionEnd = 0;
+}
+
+void QFxLineEdit::cursorPosChanged()
+{
+ Q_D(QFxLineEdit);
+ emit cursorPositionChanged();
+
+ if(!d->control->hasSelectedText()){
+ if(d->lastSelectionStart != d->control->cursor()){
+ d->lastSelectionStart = d->control->cursor();
+ emit selectionStartChanged();
+ }
+ if(d->lastSelectionEnd != d->control->cursor()){
+ d->lastSelectionEnd = d->control->cursor();
+ emit selectionEndChanged();
+ }
+ }
}
void QFxLineEdit::selectionChanged()
{
Q_D(QFxLineEdit);
emit selectedTextChanged();
- if(selectionLength() != d->oldSelectLength){
- d->oldSelectLength = selectionLength();
- emit selectionLengthChanged();
+
+ if(d->lastSelectionStart != d->control->selectionStart()){
+ d->lastSelectionStart = d->control->selectionStart();
+ if(d->lastSelectionStart == -1)
+ d->lastSelectionStart = d->control->cursor();
+ emit selectionStartChanged();
+ }
+ if(d->lastSelectionEnd != d->control->selectionEnd()){
+ d->lastSelectionEnd = d->control->selectionEnd();
+ if(d->lastSelectionEnd == -1)
+ d->lastSelectionEnd = d->control->cursor();
+ emit selectionEndChanged();
}
}
diff --git a/src/declarative/fx/qfxlineedit.h b/src/declarative/fx/qfxlineedit.h
index e053c54..2c22d4b 100644
--- a/src/declarative/fx/qfxlineedit.h
+++ b/src/declarative/fx/qfxlineedit.h
@@ -62,17 +62,13 @@ class Q_DECLARATIVE_EXPORT QFxLineEdit : public QFxPaintedItem
Q_PROPERTY(QString text READ text WRITE setText NOTIFY textChanged)
Q_PROPERTY(QmlFont *font READ font)
Q_PROPERTY(QColor color READ color WRITE setColor)
- /*
- Q_PROPERTY(QFxText::TextStyle style READ style WRITE setStyle)
- Q_PROPERTY(QColor styleColor READ styleColor WRITE setStyleColor)
Q_PROPERTY(QFxText::HAlignment hAlign READ hAlign WRITE setHAlign)
- Q_PROPERTY(QFxText::VAlignment vAlign READ vAlign WRITE setVAlign)
- */
Q_PROPERTY(bool readOnly READ isReadOnly WRITE setReadOnly);
Q_PROPERTY(int maxLength READ maxLength WRITE setMaxLength);
Q_PROPERTY(int cursorPosition READ cursorPosition WRITE setCursorPosition NOTIFY cursorPositionChanged);
- Q_PROPERTY(int selectionLength READ selectionLength WRITE setSelectionLength NOTIFY selectionLengthChanged);
+ Q_PROPERTY(int selectionStart READ selectionStart WRITE setSelectionStart NOTIFY selectionStartChanged)
+ Q_PROPERTY(int selectionEnd READ selectionEnd WRITE setSelectionEnd NOTIFY selectionEndChanged)
Q_PROPERTY(QString selectedText READ selectedText NOTIFY selectedTextChanged);
Q_PROPERTY(QObject* validator READ validator WRITE setValidator);
@@ -81,10 +77,6 @@ class Q_DECLARATIVE_EXPORT QFxLineEdit : public QFxPaintedItem
Q_PROPERTY(uint echoMode READ echoMode WRITE setEchoMode);
Q_PROPERTY(QmlComponent *cursorDelegate READ cursorDelegate WRITE setCursorDelegate);
- /*
- Q_PROPERTY(int scrollDuration READ scrollDuration SET setScrollDuration NOTIFY scrollDurationChanged);
- */
-
public:
QFxLineEdit(QFxItem* parent=0);
~QFxLineEdit();
@@ -100,20 +92,9 @@ public:
//### Should we have this function or x variants of properties?
Q_INVOKABLE int xToPos(int x);
- /*
- QFxText::TextStyle style() const;
- void setStyle(QFxText::TextStyle style);
-
- QColor styleColor() const;
- void setStyleColor(const QColor &c);
- */
-
QFxText::HAlignment hAlign() const;
void setHAlign(QFxText::HAlignment align);
- QFxText::VAlignment vAlign() const;
- void setVAlign(QFxText::VAlignment align);
-
bool isReadOnly() const;
void setReadOnly(bool);
@@ -123,8 +104,11 @@ public:
int cursorPosition() const;
void setCursorPosition(int cp);
- int selectionLength() const;
- void setSelectionLength(int len);
+ int selectionStart() const;
+ void setSelectionStart(int);
+
+ int selectionEnd() const;
+ void setSelectionEnd(int);
QString selectedText() const;
@@ -140,18 +124,14 @@ public:
QmlComponent* cursorDelegate() const;
void setCursorDelegate(QmlComponent*);
- /*
- int scrollDuration() const;
- void setScrollDuration(int);
- */
-
bool hasAcceptableInput() const;
void drawContents(QPainter *p,const QRect &r);
Q_SIGNALS:
void textChanged();
void cursorPositionChanged();
- void selectionLengthChanged();
+ void selectionStartChanged();
+ void selectionEndChanged();
void selectedTextChanged();
void accepted();
void acceptableInputChanged();
@@ -174,6 +154,7 @@ private slots:
void updateAll();
void createCursor();
void moveCursor();
+ void cursorPosChanged();
private:
Q_DECLARE_PRIVATE_D(QGraphicsItem::d_ptr, QFxLineEdit);
diff --git a/src/declarative/fx/qfxlineedit_p.h b/src/declarative/fx/qfxlineedit_p.h
index a0ab19c..a18dea7 100644
--- a/src/declarative/fx/qfxlineedit_p.h
+++ b/src/declarative/fx/qfxlineedit_p.h
@@ -89,7 +89,8 @@ public:
QPointer<QmlComponent> cursorComponent;
QPointer<QFxItem> cursorItem;
- int oldSelectLength;
+ int lastSelectionStart;
+ int lastSelectionEnd;
int oldHeight;
int oldWidth;
bool oldValidity;