--Boundary-00=_dEjD+fHYgz+jc5s Content-Type: Text/Plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Content-Description: clearsigned data Content-Disposition: inline =2D----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 =2D -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 hi, my name is Christophe Devriese I have written a patch to kdelibs to give one the option of right-clicking = on a bookmark and selecting "delete" (implemented), or "add" (to be added to t= he patch, this one is a proof of concept), etc. This patch works without requiring any modifications to konqueror itself. I miss this feature a lot in konqueror. I have a number of options to proceed =2D - -> make kbookmark an abstract class, and force anyone wanting to use = it to create a subclass, then include the events on them as pure virtuals in the abstract class pro : -> this is, imho, the way it should be done -> it uses OO to accomplish the task, an the responsability for bookmarks is with the bookmarks -> it allows us to use the objects without further modifications in the future (to for example include drag-and-drop to a .url file ...) -> it is faster than the other options (in terms of execution, not in terms of developer time) (by a few nanosecs ;-) ) con : -> requires (complicated) changes to both konqueror and other apps using bookmarks -> that means it will take developer time, and a lot more commits -> not binary compatible (but I don't know any app other than konq that uses bookmarks) =2D - -> add a routine (or signal) to kbookmarkowner =E0 la MouseEvent(QMou= seEvent qm, KBookmark bm) pro : -> "the quick hack", doesn't require changes to any other app (that is kdelibs and konq need some changes) -> one more commit will do it -> binary compatible -> I can (but it would be even uglier) avoid making any changes at all to konqueror con : -> slower -> not extensible -> complicated semantics without a very good reason (like having to call QPopupMenu::exec and not QPopupMenu::popup) =2D -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.0.7 (GNU/Linux) iD8DBQE+DjDGJFU6C5Uo8MgRAveHAKCmQTczcQORHGuufEEvzNoNk1FcgQCePMpL ql75oOAceoqIQaV3InadvVY=3D =3Dox1M =2D -----END PGP SIGNATURE----- =2D----BEGIN PGP SIGNATURE----- Version: GnuPG v1.0.7 (GNU/Linux) iD8DBQE+DjEdJFU6C5Uo8MgRAtE8AJ9G3DNccLvpWvO9fvbHDAod+aINwACfVwJJ WPlqO63IGkC4fzdWgYy5WY0=3D =3DS27w =2D----END PGP SIGNATURE----- --Boundary-00=_dEjD+fHYgz+jc5s Content-Type: text/x-diff; charset="us-ascii"; name="konqbookmarkipe.diff" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="konqbookmarkipe.diff" ? kipebookmarkmenu.h Index: kbookmarkbar.cc =================================================================== RCS file: /home/kde/kdelibs/kio/bookmarks/kbookmarkbar.cc,v retrieving revision 1.35 diff -u -3 -p -r1.35 kbookmarkbar.cc --- kbookmarkbar.cc 17 Nov 2002 02:16:26 -0000 1.35 +++ kbookmarkbar.cc 28 Dec 2002 23:00:22 -0000 @@ -83,46 +83,20 @@ void KBookmarkBar::slotBookmarksChanged( void KBookmarkBar::fillBookmarkBar(KBookmarkGroup & parent) { - if (parent.isNull()) - return; + if (parent.isNull()) + return; - for (KBookmark bm = parent.first(); !bm.isNull(); bm = parent.next(bm)) + for (KBookmark bm = parent.first(); !bm.isNull(); bm = parent.next(bm)) + { + QString text = bm.text(); + text.replace( '&', "&&" ); + if ( bm.isSeparator() ) + m_toolBar->insertLineSeparator(); + else { - QString text = bm.text(); - text.replace( '&', "&&" ); - if (!bm.isGroup()) - { - if ( bm.isSeparator() ) - m_toolBar->insertLineSeparator(); - else - { - KAction *action; - // create a normal URL item, with ID as a name - action = new KAction(text, bm.icon(), 0, - this, SLOT(slotBookmarkSelected()), - m_actionCollection, - bm.url().url().utf8()); - action->plug(m_toolBar); - } - } - else - { - KActionMenu *action = new KActionMenu(text, bm.icon(), - m_actionCollection, "bookmarkbar-actionmenu"); - action->setDelayed(false); - - // this flag doesn't have any UI yet - KGlobal::config()->setGroup( "Settings" ); - bool addEntriesBookmarkBar = KGlobal::config()->readBoolEntry("AddEntriesBookmarkBar",true); - - KBookmarkMenu *menu = new KBookmarkMenu(m_pManager, m_pOwner, action->popupMenu(), - m_actionCollection, false, addEntriesBookmarkBar, - bm.address()); - //menu->fillBookmarkMenu(); - action->plug(m_toolBar); - m_lstSubMenus.append( menu ); - } + m_toolBar->insertWidget( 0, 25, new KIPEToolBarButton( m_toolBar, bm, m_pOwner ) ); } + } } void KBookmarkBar::slotBookmarkSelected() Index: kbookmarkbar.h =================================================================== RCS file: /home/kde/kdelibs/kio/bookmarks/kbookmarkbar.h,v retrieving revision 1.14 diff -u -3 -p -r1.14 kbookmarkbar.h --- kbookmarkbar.h 4 Mar 2002 13:40:28 -0000 1.14 +++ kbookmarkbar.h 28 Dec 2002 23:00:22 -0000 @@ -24,7 +24,12 @@ #include #include -class KToolBar; +#include +#include +#include +#include +#include +#include class KBookmarkMenu; class KBookmarkOwner; class KActionCollection; @@ -40,12 +45,7 @@ class KBookmarkBar : public QObject Q_OBJECT public: /** - * Fills a bookmark toolbar - * - * @param owner implementation of the KBookmarkOwner interface (callbacks) - * @param toolBar toolbar to fill - * @param collec parent for the KActions OBSOLETE - * @param manager the bookmark manager + * Is a bookmark toolbar */ KBookmarkBar( KBookmarkManager* mgr, KBookmarkOwner *owner, KToolBar *toolBar, @@ -68,6 +68,150 @@ private: KActionCollection *m_actionCollection; KBookmarkManager *m_pManager; QPtrList m_lstSubMenus; +}; + +class KBookmarkPopup : public QPopupMenu +{ + Q_OBJECT + public: + KBookmarkPopup(QPoint start, KBookmarkGroup & bm, KBookmarkOwner * owner) : QPopupMenu(), _owner(owner), _bm(bm) + { + // kdDebug() << k_funcinfo << endl; + + bookmarkOptions.insertItem( QString("delete"), this, SLOT( deleteBookmark() ) ); + + insertItems(); + popup( start ); + } + + bool isCheckable() + { + return false; + } + + private: + KBookmarkOwner * _owner; + + int selecteditem; + KBookmarkGroup & _bm; + + protected: + QPopupMenu bookmarkOptions; + + void insertItems() + { + clear(); + + int i = 0; + for (KBookmark bm = _bm.first(); !bm.isNull(); bm = _bm.next(bm)) + { + QPixmap pm = KGlobal::iconLoader()->loadIcon( bm.icon() , KIcon::Toolbar); + insertItem( pm, bm.text(), this, SLOT( doNothing() ), i++ ); + } + } + + virtual void mousePressEvent( QMouseEvent * e ) + { + // kdDebug() << k_funcinfo << endl << "e->button()" << " = " << e->button() << endl; + // kdDebug() << "Qt::RightButton" << " = " << Qt::RightButton << endl; + // kdDebug() << "Qt::LeftButton" << " = " << Qt::LeftButton << endl; + + int item = itemAtPos( e->pos() ); + switch ( e->button() ) + { + case Qt::LeftButton: + // FIXME + _owner->openBookmarkURL( bookmarkFromItem(item).url().url() ); + break; + case Qt::RightButton: + selecteditem = item; + bookmarkOptions.exec(e->globalPos()); + break; + case Qt::MidButton: + break; + } + return; + } + + KBookmark bookmarkFromItem(int item) + { + KBookmark bm; + int i = 0; + for (bm = _bm.first(); !bm.isNull(); bm = _bm.next(bm)) + { + if (i == item) break; + i++; + } + assert(i == item); + return bm; + } + + public slots: + void deleteBookmark() + { + //kdDebug() << k_funcinfo << endl; + int i = 0; + KBookmark bm; + for (bm = _bm.first(); !bm.isNull(); bm = _bm.next(bm)) + { + if (i == selecteditem) break; + i++; + } + if (i == selecteditem) bm.parentGroup().deleteBookmark( bm ); + + close(true); + }; +}; + +class KIPEToolBarButton : public KToolBarButton +{ + Q_OBJECT + public: + KIPEToolBarButton(QWidget* w, KBookmark bm, KBookmarkOwner * owner) + : KToolBarButton( bm.icon(), 0, w, NULL, bm.text()) ,_bm(bm), _owner(owner) + { + //kdDebug() << k_funcinfo << endl; + } + + private: + KBookmark _bm; + KBookmarkOwner * _owner; + + protected: + void drawButton( QPainter *p) + { + KToolBarButton::drawButton(p); + if (! _bm.isNull()) + if (_bm.isGroup()) + { + QStyle::SFlags arrowFlags = QStyle::Style_Default; + + if (isDown()) arrowFlags |= QStyle::Style_Down; + if (isEnabled()) arrowFlags |= QStyle::Style_Enabled; + + style().drawPrimitive(QStyle::PE_ArrowDown, p, + QRect(width()-7, height()-7, 7, 7), colorGroup(), + arrowFlags, QStyleOption() ); + } + } + + virtual void mousePressEvent( QMouseEvent * me ) + { + //kdDebug() << k_funcinfo << endl; + + if (me->button() == Qt::RightButton) + { + return; + } + + if (me->button() == Qt::LeftButton && _bm.isGroup() ) + { + new KBookmarkPopup( QPoint( mapToGlobal( QPoint(0, height() ) ).x(), mapToGlobal( QPoint(0, height() ) ).y() ), (KBookmarkGroup&) _bm, _owner); + return; + } + + KToolBarButton::mousePressEvent( me ); + } }; #endif // KBOOKMARKBAR_H --Boundary-00=_dEjD+fHYgz+jc5s-- >> Visit http://mail.kde.org/mailman/listinfo/kde-devel#unsub to unsubscribe <<