]> git.sur5r.net Git - minitube/blobdiff - src/autocomplete.cpp
2.5.2
[minitube] / src / autocomplete.cpp
index cb0773a1cb85ee355e02bc711c9f805282286ade..8ef4d317d7e910766abbd7b07edfc6ce12864896 100644 (file)
@@ -19,24 +19,42 @@ along with Minitube.  If not, see <http://www.gnu.org/licenses/>.
 $END_LICENSE */
 #include "autocomplete.h"
 #include "suggester.h"
-#ifdef APP_MAC
+#ifdef APP_MAC_SEARCHFIELD
 #include "searchlineedit_mac.h"
-#include "macutils.h"
 #else
 #include "searchlineedit.h"
 #endif
 
-AutoComplete::AutoComplete(SearchLineEdit *buddy, QLineEdit *lineEdit):
-    QObject(buddy), buddy(buddy), lineEdit(lineEdit), enabled(true), suggester(0) {
+#ifdef APP_MAC
+#include "macutils.h"
+#endif
+
+#include <QListWidget>
+
+#ifndef QT_NO_DEBUG_OUTPUT
+/// Gives human-readable event type information.
+QDebug operator<<(QDebug str, const QEvent * ev) {
+    static int eventEnumIndex = QEvent::staticMetaObject.indexOfEnumerator("Type");
+    str << "QEvent";
+    if (ev) {
+        QString name = QEvent::staticMetaObject.enumerator(eventEnumIndex).valueToKey(ev->type());
+        if (!name.isEmpty()) str << name; else str << ev->type();
+    } else {
+        str << (void*)ev;
+    }
+    return str.maybeSpace();
+}
+#endif
+
+AutoComplete::AutoComplete(SearchWidget *buddy, QLineEdit *lineEdit):
+    QObject(lineEdit), buddy(buddy), lineEdit(lineEdit), enabled(true), suggester(0), itemHovering(false) {
 
     popup = new QListWidget();
-    popup->setMouseTracking(true);
     popup->setWindowFlags(Qt::Popup);
-    popup->setAttribute(Qt::WA_ShowWithoutActivating);
-    popup->setFocusPolicy(Qt::NoFocus);
-    popup->setFocusProxy(buddy);
+    popup->setFocusProxy(buddy->toWidget());
     popup->installEventFilter(this);
-    buddy->window()->installEventFilter(this);
+    buddy->toWidget()->window()->installEventFilter(this);
+    popup->setMouseTracking(true);
 
     // style
     popup->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
@@ -53,14 +71,11 @@ AutoComplete::AutoComplete(SearchLineEdit *buddy, QLineEdit *lineEdit):
     timer->setSingleShot(true);
     timer->setInterval(500);
     connect(timer, SIGNAL(timeout()), SLOT(suggest()));
-    connect(buddy, SIGNAL(textEdited(QString)), timer, SLOT(start()));
-}
-
-AutoComplete::~AutoComplete() {
-    delete popup;
+    connect(buddy->toWidget(), SIGNAL(textEdited(QString)), timer, SLOT(start()));
 }
 
 bool AutoComplete::eventFilter(QObject *obj, QEvent *ev) {
+
     if (obj != popup) {
         switch (ev->type()) {
         case QEvent::Move:
@@ -73,6 +88,8 @@ bool AutoComplete::eventFilter(QObject *obj, QEvent *ev) {
         return false;
     }
 
+    // qDebug() << ev;
+
     if (ev->type() == QEvent::Leave) {
         popup->setCurrentItem(0);
         popup->clearSelection();
@@ -111,7 +128,7 @@ bool AutoComplete::eventFilter(QObject *obj, QEvent *ev) {
                 popup->setCurrentItem(0);
                 popup->clearSelection();
                 buddy->setText(originalText);
-                buddy->setFocus();
+                buddy->toWidget()->setFocus();
                 consumed = true;
             }
             break;
@@ -137,7 +154,7 @@ bool AutoComplete::eventFilter(QObject *obj, QEvent *ev) {
     return false;
 }
 
-void AutoComplete::showCompletion(const QList<Suggestion *> &suggestions) {
+void AutoComplete::showSuggestions(const QList<Suggestion *> &suggestions) {
     if (suggestions.isEmpty()) {
         hideSuggestions();
         return;
@@ -152,16 +169,18 @@ void AutoComplete::showCompletion(const QList<Suggestion *> &suggestions) {
             item->setIcon(QIcon(":/images/" + s->type + ".png"));
     }
     popup->setCurrentItem(0);
-    int h = 0;
+    int h = popup->frameWidth() * 2;
     for (int i = 0; i < suggestions.count(); ++i)
         h += popup->sizeHintForRow(i);
-    popup->resize(buddy->width(), h);
+
+    popup->resize(buddy->toWidget()->width(), h);
     adjustPosition();
     popup->setUpdatesEnabled(true);
 
     if (popup->isHidden()) {
-        popup->show();
-        popup->setFocus();
+        itemHovering = false;
+        popup->showNormal();
+        QTimer::singleShot(100, this, SLOT(enableItemHovering()));
     }
 }
 
@@ -212,16 +231,21 @@ void AutoComplete::suggestionsReady(const QList<Suggestion *> &suggestions) {
     qDeleteAll(this->suggestions);
     this->suggestions = suggestions;
     if (!enabled) return;
-    if (!buddy->hasFocus()) return;
-    showCompletion(suggestions);
+    if (!buddy->toWidget()->hasFocus() && buddy->toWidget()->isVisible()) return;
+    showSuggestions(suggestions);
 }
 
 void AutoComplete::adjustPosition() {
-    popup->move(buddy->mapToGlobal(QPoint(0, buddy->height())));
+    popup->move(buddy->toWidget()->mapToGlobal(QPoint(0, buddy->toWidget()->height())));
+}
+
+void AutoComplete::enableItemHovering() {
+    itemHovering = true;
 }
 
 void AutoComplete::hideSuggestions() {
-#ifdef APP_MAC
+    itemHovering = false;
+#ifdef APP_MAC_NO
     mac::fadeOutWindow(popup);
 #else
     popup->hide();
@@ -231,11 +255,12 @@ void AutoComplete::hideSuggestions() {
         buddy->setText(originalText);
         originalText.clear();
     }
-    buddy->setFocus();
+    buddy->toWidget()->setFocus();
     timer->stop();
 }
 
 void AutoComplete::itemEntered(QListWidgetItem *item) {
+    if (!itemHovering) return;
     if (!item) return;
     item->setSelected(true);
     popup->setCurrentItem(item);
@@ -244,5 +269,5 @@ void AutoComplete::itemEntered(QListWidgetItem *item) {
 void AutoComplete::currentItemChanged(QListWidgetItem *item) {
     if (!item) return;
     buddy->setText(item->text());
-    // lineEdit->setSelection(originalText.length(), editor->text().length());
+    // lineEdit->setSelection(originalText.length(), lineEdit->text().length());
 }