diff options
| author | 2010-05-17 09:11:46 +0000 | |
|---|---|---|
| committer | 2010-05-17 09:11:46 +0000 | |
| commit | d2c71047e92a5e2e1eb761a76a111d827c2a113f (patch) | |
| tree | 67faae23467686274572704583ff43c723493085 | |
| parent | Antother fix + code cleaning in classeditor (diff) | |
| download | KVIrc-d2c71047e92a5e2e1eb761a76a111d827c2a113f.tar.gz KVIrc-d2c71047e92a5e2e1eb761a76a111d827c2a113f.tar.bz2 KVIrc-d2c71047e92a5e2e1eb761a76a111d827c2a113f.zip | |
fix for #770
git-svn-id: https://svn.kvirc.de/svn/trunk/kvirc@4331 17fca916-40b9-46aa-a4ea-0a15b648b75c
| -rw-r--r-- | src/kvirc/ui/kvi_customtoolbar.cpp | 90 | ||||
| -rw-r--r-- | src/kvirc/ui/kvi_customtoolbar.h | 5 |
2 files changed, 95 insertions, 0 deletions
diff --git a/src/kvirc/ui/kvi_customtoolbar.cpp b/src/kvirc/ui/kvi_customtoolbar.cpp index 0563dcdcb..c60afdf10 100644 --- a/src/kvirc/ui/kvi_customtoolbar.cpp +++ b/src/kvirc/ui/kvi_customtoolbar.cpp @@ -49,6 +49,7 @@ KviCustomToolBar::KviCustomToolBar(KviCustomToolBarDescriptor * pDesc, const QSt m_pMovedChild = 0; m_pMovedAction = 0; m_pDraggedChild = 0; + m_pFilteredChildren = 0; setAcceptDrops(true); connect(KviActionManager::instance(),SIGNAL(beginCustomizeToolBars()),this,SLOT(beginCustomize())); connect(KviActionManager::instance(),SIGNAL(endCustomizeToolBars()),this,SLOT(endCustomize())); @@ -70,6 +71,8 @@ KviCustomToolBar::~KviCustomToolBar() KviActionManager::instance()->setCurrentToolBar(0); } + if(m_pFilteredChildren) + delete m_pFilteredChildren; } void KviCustomToolBar::paintEvent(QPaintEvent * e) @@ -87,12 +90,73 @@ void KviCustomToolBar::paintEvent(QPaintEvent * e) } } +void KviCustomToolBar::filteredChildDestroyed() +{ + if(!m_pFilteredChildren) + return; + const QObject * o = sender(); + m_pFilteredChildren->remove((void *)o); +} + +void KviCustomToolBar::filterChild(QObject * o) +{ + bool * pBool = new bool(((QWidget *)o)->isEnabled()); + if(m_pFilteredChildren) + m_pFilteredChildren->insert(o,pBool); + if(!*pBool) + ((QWidget *)o)->setEnabled(true); + o->installEventFilter(this); + connect(o,SIGNAL(destroyed()),this,SLOT(filteredChildDestroyed())); +} + +void KviCustomToolBar::unfilterChild(QObject * o) +{ + if(m_pFilteredChildren) + { + bool * pBool = m_pFilteredChildren->find(o); + if(pBool) + { + if(!*pBool) + ((QWidget *)o)->setEnabled(false); + o->removeEventFilter(this); + disconnect(o,SIGNAL(destroyed()),this,SLOT(filteredChildDestroyed())); + } + } +} + void KviCustomToolBar::beginCustomize() { + if(m_pFilteredChildren) + delete m_pFilteredChildren; + + m_pFilteredChildren = new KviPointerHashTable<void *,bool>; + m_pFilteredChildren->setAutoDelete(true); + // filter the events for all the children + QList<QObject *> list = children(); + for(QList<QObject *>::Iterator it = list.begin(); it != list.end(); ++it) + { + if((*it)->isWidgetType()) + filterChild(*it); + } } void KviCustomToolBar::endCustomize() { + // stop filtering events + QList<QObject *> list = children(); + for(QList<QObject *>::Iterator it = list.begin(); it != list.end(); ++it) + { + if((*it)->isWidgetType()) + unfilterChild(*it); + } + + // FIXME: We SHOULD MAKE SURE that the children are re-enabled... + // this could be done by calling setEnabled(isEnabled()) on each action ? + if(m_pFilteredChildren) + { + delete m_pFilteredChildren; + m_pFilteredChildren = 0; + } syncDescriptor(); } @@ -109,6 +173,29 @@ void KviCustomToolBar::syncDescriptor() } } +void KviCustomToolBar::childEvent(QChildEvent * e) +{ + if(KviActionManager::customizingToolBars()) + { + // this is useful for droppped and dragged-out children + if(e->type() == QEvent::ChildAdded) + { + if(e->child()->isWidgetType()) + filterChild(e->child()); + goto done; + } + + if(e->type() == QEvent::ChildRemoved) + { + if(e->child()->isWidgetType()) + unfilterChild(e->child()); + goto done; + } + } +done: + KviToolBar::childEvent(e); +} + void KviCustomToolBar::dragEnterEvent(QDragEnterEvent * e) { if(!KviActionManager::customizingToolBars()) @@ -182,6 +269,8 @@ void KviCustomToolBar::dragLeaveEvent(QDragLeaveEvent *) { if(m_pDraggedChild) { + if(m_pFilteredChildren) + m_pFilteredChildren->remove(m_pDraggedChild); // just to be sure delete m_pDraggedChild; m_pDraggedChild = 0; } @@ -362,6 +451,7 @@ bool KviCustomToolBar::eventFilter(QObject * o,QEvent * e) if(e->type() == QEvent::MouseButtonPress) { + qDebug(""); KviActionManager::instance()->setCurrentToolBar(this); QMouseEvent * pEvent = (QMouseEvent *)e; if(pEvent->button() & Qt::LeftButton) diff --git a/src/kvirc/ui/kvi_customtoolbar.h b/src/kvirc/ui/kvi_customtoolbar.h index bb482cc9c..2c7a5d31b 100644 --- a/src/kvirc/ui/kvi_customtoolbar.h +++ b/src/kvirc/ui/kvi_customtoolbar.h @@ -47,6 +47,7 @@ protected: QWidget * m_pMovedChild; QAction * m_pMovedAction; QWidget * m_pDraggedChild; + KviPointerHashTable<void *,bool> * m_pFilteredChildren; public: KviCustomToolBarDescriptor * descriptor(){ return m_pDescriptor; }; protected: @@ -55,16 +56,20 @@ protected: virtual void dragMoveEvent(QDragMoveEvent * e); virtual void dragLeaveEvent(QDragLeaveEvent * e); virtual void dropEvent(QDropEvent * e); + virtual void childEvent(QChildEvent * e); virtual bool eventFilter(QObject * o, QEvent * e); int dropIndexAt(const QPoint & pnt, QWidget * pExclude, int * piExcludeIdx); QWidget * widgetAt(int iIndex); QAction * actionForWidget(QWidget * pWidget); void drag(QWidget * pChild, const QPoint & pnt); + void filterChild(QObject * o); + void unfilterChild(QObject * o); virtual void paintEvent(QPaintEvent * e); void syncDescriptor(); protected slots: void beginCustomize(); void endCustomize(); + void filteredChildDestroyed(); }; class KviCustomToolBarSeparator : public QWidget |
