--Boundary-00=_CR2k9duPUcNh242 Content-Type: Text/Plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable Content-Description: clearsigned data Content-Disposition: inline =2D----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Hi... ksystemtray puts two items in its menu: quit and restore/minimize ...=20 however, since they are manually inserted the only way for subclasses to=20 access these items is to perform ugly hacks like iterating through the menu= =20 and comparing the text used... kmix was doing this, for instance, to find t= he=20 quit item. attached is a patch that changes ksystemtray to use kactions and keep them = in=20 an action collection. this allows easy and standard access to the items it= =20 adds and allows for future flexibility. i'd like to commit this for 3.1 to address a usability issue identified wit= h=20 the kmix system tray icon: users don't connect "restore" with "open up the= =20 mixer window". attached is a patch that shows how, with kactions, this woul= d=20 be easily addressed. is this ok to commit? =2D --=20 Aaron J. Seigo GPG Fingerprint: 8B8B 2209 0C6F 7C47 B1EA EE75 D6B7 2EB1 A7F1 DB43 "Everything should be made as simple as possible, but not simpler" - Albert Einstein =2D----BEGIN PGP SIGNATURE----- Version: GnuPG v1.0.7 (GNU/Linux) iD8DBQE9k2RD1rcusafx20MRAowNAKCCyDwSHb4N3Uyt5xmeqjYL0s9rMACfWCvm ZDVi9bfdjfQO3kz9zCV3y4Y=3D =3DDiEO =2D----END PGP SIGNATURE----- --Boundary-00=_CR2k9duPUcNh242 Content-Type: text/x-diff; charset="us-ascii"; name="ksystray_actions.diff" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="ksystray_actions.diff" ? kmessagebox.patch ? notifyStdAction.diff ? ksystray_actions.diff ? kaction_isPlugged_widget.diff Index: ksystemtray.cpp =================================================================== RCS file: /home/kde/kdelibs/kdeui/ksystemtray.cpp,v retrieving revision 1.21 diff -u -3 -d -p -r1.21 ksystemtray.cpp --- ksystemtray.cpp 2002/06/24 08:11:18 1.21 +++ ksystemtray.cpp 2002/09/26 19:07:38 @@ -17,6 +17,9 @@ the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +#include "kaction.h" +#include "kshortcut.h" #include "ksystemtray.h" #include "kpopupmenu.h" #include "kapplication.h" @@ -39,9 +42,28 @@ const int XFocusIn = FocusIn; extern Time qt_x_time; #endif +class KSystemTrayPrivate +{ +public: + KSystemTrayPrivate() + { + actionCollection = 0; + } + + ~KSystemTrayPrivate() + { + delete actionCollection; + } + + KActionCollection* actionCollection; +}; + KSystemTray::KSystemTray( QWidget* parent, const char* name ) : QLabel( parent, name, WType_TopLevel ) { + d = new KSystemTrayPrivate; + d->actionCollection = new KActionCollection(this); + #ifndef Q_WS_QWS // FIXME(E): Talk with QWS KWin::setSystemTrayWindowFor( winId(), parent?parent->topLevelWidget()->winId(): qt_xrootwin() ); @@ -51,11 +73,24 @@ KSystemTray::KSystemTray( QWidget* paren menu = new KPopupMenu( this ); menu->insertTitle( kapp->miniIcon(), kapp->caption() ); move( -1000, -1000 ); + KAction* quitAction = KStdAction::quit(this, SIGNAL(quitSelected()), d->actionCollection); + + if (parentWidget()) + { + connect(quitAction, SIGNAL(activated()), parentWidget(), SLOT(close())); + new KAction(i18n("Minimize"), KShortcut(), + this, SLOT( toggleMinimizeRestore() ), + d->actionCollection, "minimizeRestore"); + } + else + { + connect(quitAction, SIGNAL(activated()), qApp, SLOT(closeAllWindows())); + } } KSystemTray::~KSystemTray() { - + delete d; } @@ -63,16 +98,15 @@ void KSystemTray::showEvent( QShowEvent { if ( !hasQuit ) { menu->insertSeparator(); - int quitID; - if ( parentWidget() ) { - minimizeRestoreId = menu->insertItem(i18n("Minimize"), this, SLOT( toggleMinimizeRestore() ) ); - quitID=menu->insertItem(SmallIcon("exit"), i18n("&Quit"), parentWidget(), SLOT(close() ) ); - } - else { - minimizeRestoreId = -1; - quitID=menu->insertItem(SmallIcon("exit"), i18n("&Quit"), qApp, SLOT(closeAllWindows() ) ); - } - menu->connectItem(quitID,this,SIGNAL(quitSelected())); + KAction* action = d->actionCollection->action("minimizeRestore"); + + if (action) + { + action->plug(menu); + } + + action = d->actionCollection->action(KStdAction::name(KStdAction::Quit)); + action->plug(menu); hasQuit = 1; } } @@ -116,10 +150,11 @@ void KSystemTray::mousePressEvent( QMous // fall through case RightButton: if ( parentWidget() ) { + KAction* action = d->actionCollection->action("minimizeRestore"); if ( parentWidget()->isVisible() ) - menu->changeItem( minimizeRestoreId, i18n("Minimize") ); + action->setText( i18n("Minimize") ); else - menu->changeItem( minimizeRestoreId, i18n("Restore") ); + action->setText( i18n("Restore") ); } contextMenuAboutToShow( menu ); menu->popup( e->globalPos() ); @@ -160,6 +195,11 @@ void KSystemTray::toggleMinimizeRestore( } else { parentWidget()->hide(); } +} + +KAction* KSystemTray::action(const char* name) +{ + return d->actionCollection->action(name); } void KSystemTray::virtual_hook( int, void* ) Index: ksystemtray.h =================================================================== RCS file: /home/kde/kdelibs/kdeui/ksystemtray.h,v retrieving revision 1.6 diff -u -3 -d -p -r1.6 ksystemtray.h --- ksystemtray.h 2002/06/24 08:11:18 1.6 +++ ksystemtray.h 2002/09/26 19:07:38 @@ -20,6 +20,7 @@ #include +class KAction; class KPopupMenu; class KSystemTrayPrivate; @@ -115,6 +116,13 @@ protected: context menu becomes visible. */ virtual void contextMenuAboutToShow( KPopupMenu* menu ); + + + /** + Easy access to the actions in the context menu + Currently includes KStdAction::quit and minimizeRestore + */ + KAction* action(const char* name); /** Reimplemented for internal reasons. --Boundary-00=_CR2k9duPUcNh242 Content-Type: text/x-diff; charset="us-ascii"; name="kmix_systrayactions.diff" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="kmix_systrayactions.diff" ? ann ? kmix_systrayactions.diff Index: kmixdockwidget.cpp =================================================================== RCS file: /home/kde/kdemultimedia/kmix/kmixdockwidget.cpp,v retrieving revision 1.21 diff -u -3 -d -p -r1.21 kmixdockwidget.cpp --- kmixdockwidget.cpp 2002/09/26 17:49:30 1.21 +++ kmixdockwidget.cpp 2002/09/26 19:07:59 @@ -20,6 +20,7 @@ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ +#include #include #include #include @@ -178,6 +179,18 @@ void KMixDockWidget::wheelEvent(QWheelEv void KMixDockWidget::contextMenuAboutToShow( KPopupMenu* menu ) { + KAction* showAction = action("minimizeRestore"); + if ( parentWidget() && showAction ) + { + if ( parentWidget()->isVisible() ) + { + showAction->setText( i18n("Hide Mixer Window") ); + } + else + { + showAction->setText( i18n("Show Mixer Window") ); + } + } } #include "kmixdockwidget.moc" --Boundary-00=_CR2k9duPUcNh242--