From 37753c6c06b9a05a7092de565b46150794d881aa Mon Sep 17 00:00:00 2001 From: Andrea Diamantini Date: Fri, 30 Jul 2010 16:02:30 +0200 Subject: Editable urlbar :D --- src/urlbar/completionwidget.cpp | 97 +++++++++++++++++++++++++++-------------- src/urlbar/completionwidget.h | 6 +++ 2 files changed, 70 insertions(+), 33 deletions(-) (limited to 'src') diff --git a/src/urlbar/completionwidget.cpp b/src/urlbar/completionwidget.cpp index 1062681b..62eb72a6 100644 --- a/src/urlbar/completionwidget.cpp +++ b/src/urlbar/completionwidget.cpp @@ -91,7 +91,7 @@ void CompletionWidget::sizeAndPosition() { setFixedWidth(_parent->width()); - int h=0; + int h = 0; for (int i = 0; i < layout()->count(); i++) { QWidget *widget = layout()->itemAt(i)->widget(); @@ -107,7 +107,6 @@ void CompletionWidget::sizeAndPosition() void CompletionWidget::popup() { - down(); sizeAndPosition(); if (!isVisible()) show(); @@ -123,14 +122,27 @@ void CompletionWidget::up() widget->deactivate(); } - if (_currentIndex > 0) + if (_currentIndex >= 0) _currentIndex--; else _currentIndex = layout()->count() - 1; - // activate "new" current - ListItem *widget = findChild(QString::number(_currentIndex)); - widget->activate(); + kDebug() << _currentIndex; + kDebug() << _typedString; + UrlBar *bar = qobject_cast(_parent); + if(_currentIndex != -1) + { + // activate "new" current + ListItem *widget = findChild(QString::number(_currentIndex)); + widget->activate(); + bar->setQUrl( widget->url() ); + } + else + { + bar->setText(_typedString); + } + bar->setFocus(); + bar->setCursorPosition( bar->text().length() ); } @@ -146,11 +158,25 @@ void CompletionWidget::down() if (_currentIndex < _list.count() - 1) _currentIndex++; else - _currentIndex = 0; + _currentIndex = -1; - // activate "new" current - ListItem *widget = findChild(QString::number(_currentIndex)); - widget->activate(); + + kDebug() << _currentIndex; + kDebug() << _typedString; + UrlBar *bar = qobject_cast(_parent); + if(_currentIndex != -1) + { + // activate "new" current + ListItem *widget = findChild(QString::number(_currentIndex)); + widget->activate(); + bar->setQUrl( widget->url() ); + } + else + { + bar->setText(_typedString); + } + bar->setFocus(); + bar->setCursorPosition( bar->text().length() ); } @@ -166,23 +192,22 @@ void CompletionWidget::clear() } -bool CompletionWidget::eventFilter(QObject *o, QEvent *e) +bool CompletionWidget::eventFilter(QObject *obj, QEvent *ev) { - int type = e->type(); - QWidget *wid = qobject_cast(o); + int type = ev->type(); + QWidget *wid = qobject_cast(obj); - if (o == this) + if (obj == this) { return false; } - //hide conditions of the CompletionWidget + // hide conditions of the CompletionWidget if (wid - && ((wid == _parent && (type == QEvent::Move || type == QEvent::Resize)) - || ((wid->windowFlags() & Qt::Window) - && (type == QEvent::Move || type == QEvent::Hide || type == QEvent::WindowDeactivate) - && wid == _parent->window()) - || (type == QEvent::MouseButtonPress && !isAncestorOf(wid))) + && ((wid == _parent + && (type == QEvent::Move || type == QEvent::Resize)) || ((wid->windowFlags() & Qt::Window) + && (type == QEvent::Move || type == QEvent::Hide || type == QEvent::WindowDeactivate) + && wid == _parent->window()) || (type == QEvent::MouseButtonPress && !isAncestorOf(wid))) ) { hide(); @@ -197,41 +222,43 @@ bool CompletionWidget::eventFilter(QObject *o, QEvent *e) if (type == QEvent::KeyPress) { - QKeyEvent *ev = static_cast(e); - switch (ev->key()) + QKeyEvent *kev = static_cast(ev); + switch (kev->key()) { case Qt::Key_Up: case Qt::Key_Backtab: - if (ev->modifiers() == Qt::NoButton || (ev->modifiers() & Qt::ShiftModifier)) + if (kev->modifiers() == Qt::NoButton || (kev->modifiers() & Qt::ShiftModifier)) { up(); - ev->accept(); + kev->accept(); return true; } break; case Qt::Key_Down: case Qt::Key_Tab: - if (ev->modifiers() == Qt::NoButton) + if (kev->modifiers() == Qt::NoButton) { down(); - ev->accept(); + kev->accept(); return true; } - if (ev->modifiers() & Qt::ControlModifier) + if (kev->modifiers() & Qt::ControlModifier) { emit nextItemSubChoice(); - ev->accept(); + kev->accept(); return true; } break; case Qt::Key_Enter: case Qt::Key_Return: - w = qobject_cast(parent()); - if(w->text() == _typedString) + w = qobject_cast(parent()); + if( _currentIndex == -1) + _currentIndex = 0; + child = findChild(QString::number(_currentIndex)); + if(child && _typedString == w->text()) { - child = findChild(QString::number(_currentIndex)); emit chosenUrl(child->url(), Rekonq::CurrentTab); } else @@ -239,7 +266,7 @@ bool CompletionWidget::eventFilter(QObject *o, QEvent *e) // this will be used just on fast typing.. emit chosenUrl(KUrl(w->text()), Rekonq::CurrentTab); } - ev->accept(); + kev->accept(); hide(); return true; @@ -250,7 +277,7 @@ bool CompletionWidget::eventFilter(QObject *o, QEvent *e) } } - return QFrame::eventFilter(o, e); + return QFrame::eventFilter(obj, ev); } @@ -282,6 +309,10 @@ void CompletionWidget::itemChosen(ListItem *item, Qt::MouseButton button, Qt::Ke void CompletionWidget::suggestUrls(const QString &text) { + if(_currentIndex != -1) + return; + + kDebug() << "suggesting..."; _typedString = text; QWidget *w = qobject_cast(parent()); diff --git a/src/urlbar/completionwidget.h b/src/urlbar/completionwidget.h index 18212d0f..fbca5b81 100644 --- a/src/urlbar/completionwidget.h +++ b/src/urlbar/completionwidget.h @@ -82,6 +82,12 @@ private: QWidget *_parent; UrlSearchList _list; + + /** + * The current index of the pointed out item + * + * -1 means no item, so the actual typed text is considered + */ int _currentIndex; KService::Ptr _searchEngine; -- cgit v1.2.1