Ver código fonte

Intercept the completion popup being closed without Kate telling us anything.

git-svn-id: file:///var/svn/tigccpp/trunk@841 9552661e-59e3-4036-b4f2-dbe53926924f
kevinkofler 18 anos atrás
pai
commit
13e5b62aba
2 arquivos alterados com 49 adições e 6 exclusões
  1. 40 5
      ktigcc/completion.cpp
  2. 9 1
      ktigcc/completion.h

+ 40 - 5
ktigcc/completion.cpp

@@ -25,6 +25,10 @@
 #include <qregexp.h>
 #include <qfileinfo.h>
 #include <qdir.h>
+#include <qapplication.h>
+#include <qwidget.h>
+#include <qwidgetlist.h>
+#include <qevent.h>
 #include <kmessagebox.h>
 #include <kate/view.h>
 #include <kate/document.h>
@@ -340,7 +344,7 @@ void TemplatePopup::QPopupMenu_activated(int id)
 
 CompletionPopup::CompletionPopup(Kate::View *parent, const QString &fileName,
                                  MainForm *mainForm, QObject *receiver)
-  : QObject(parent)
+  : QObject(parent), done(false), completionPopup(0)
 {
   connect(this,SIGNAL(closed()),receiver,SLOT(completionPopup_closed()));
   QValueList<KTextEditor::CompletionEntry> entries;
@@ -361,9 +365,40 @@ CompletionPopup::CompletionPopup(Kate::View *parent, const QString &fileName,
         offset++;
     }
   }
-  connect(parent,SIGNAL(completionAborted()),this,SLOT(deleteLater()));
-  connect(parent,SIGNAL(completionAborted()),this,SIGNAL(closed()));
-  connect(parent,SIGNAL(completionDone()),this,SLOT(deleteLater()));
-  connect(parent,SIGNAL(completionDone()),this,SIGNAL(closed()));
+  connect(parent,SIGNAL(completionAborted()),this,SLOT(slotDone()));
+  connect(parent,SIGNAL(completionDone()),this,SLOT(slotDone()));
   parent->showCompletionBox(entries,offset);
+  // Unfortunately, Kate doesn't always send the completionAborted or
+  // completionDone event when it closes its popup. Work around that.
+  QWidgetList *list=QApplication::topLevelWidgets();
+  QWidgetListIt it(*list);
+  while (QWidget *w=it.current()) {
+    ++it;
+    if (w->isVisible() && w->testWFlags(Qt::WType_Popup)) {
+      completionPopup=w;
+      break;      
+    }
+  }
+  delete list;
+  if (completionPopup)
+    completionPopup->installEventFilter(this);
+}
+
+void CompletionPopup::slotDone()
+{
+  if (!done) {
+    done=true;
+    emit closed();
+    deleteLater();
+  }
+}
+
+bool CompletionPopup::eventFilter(QObject *o, QEvent *e)
+{
+  if (!done && o==completionPopup && e->type()==QEvent::Hide) {
+    done=true;
+    emit closed();
+    deleteLater();
+  }
+  return false;
 }

+ 9 - 1
ktigcc/completion.h

@@ -75,6 +75,8 @@ class TemplatePopup : public QPopupMenu {
     Kate::View *view;
 };
 
+class QEvent;
+class QWidget;
 class CompletionPopup : public QObject {
   Q_OBJECT
 
@@ -82,7 +84,13 @@ class CompletionPopup : public QObject {
     CompletionPopup(Kate::View *parent, const QString &fileName,
                     MainForm *mainForm, QObject *receiver);
     virtual ~CompletionPopup() {}
-
+  private slots:
+    void slotDone();
   signals:
     void closed();
+  protected:
+    bool eventFilter(QObject *o, QEvent *e);
+  private:
+    bool done;
+    QWidget *completionPopup;
 };