Hi, I'm currently changing qt-gui to use QActions instead of manually managing menus. This is my first patch which converts the mnuStatus menu to use the QAction framework. The goal is to make usage of menus easier to developers. the user will (hopefully) see no much change.
Let's test this small change before converting all the other things, some parts are really tricky, i canot guarantee that i did not miss a detail... The first positive improvement this patch introduces is, that the status menu now shows the connected global keyboard shortcuts even if the skin does not use a menubar. before applying the patch the shortcuts were usable, but not visible in the menu. Thomas
Index: plugins/qt-gui/src/mainwin.cpp =================================================================== RCS file: /cvsroot/licq/qt-gui/src/mainwin.cpp,v retrieving revision 1.268 diff -u -3 -p -r1.268 mainwin.cpp --- plugins/qt-gui/src/mainwin.cpp 31 Jan 2003 21:10:05 -0000 1.268 +++ plugins/qt-gui/src/mainwin.cpp 5 Feb 2003 21:47:30 -0000 @@ -31,7 +31,7 @@ #endif #include <qtextcodec.h> -#include <qaccel.h> +#include <qiconset.h> #include <qimage.h> #include <qwindowsstyle.h> #include <qdatetime.h> @@ -477,7 +477,8 @@ CMainWindow::CMainWindow(CICQDaemon *the #endif ApplyIcons(szIcons, true); ApplyExtendedIcons(szExtendedIcons, true); - initMenu(); + setupActions(); + initMenu(); ApplySkin(szSkin, true); skin->frame.frameStyle = nFrameStyle; skin->frame.transparent = bFrameTransparent; @@ -593,7 +594,7 @@ CMainWindow::CMainWindow(CICQDaemon *the if (m_nAutoLogon > 0) { if (m_nAutoLogon >= 10) - mnuStatus->setItemChecked(ICQ_STATUS_FxPRIVATE, true); + aChangeStatusPrivate->setOn(true); switch (m_nAutoLogon % 10) { @@ -1597,7 +1598,7 @@ void CMainWindow::updateStatus() break; } if (status != ICQ_STATUS_OFFLINE) - mnuStatus->setItemChecked(mnuStatus->idAt(MNUxITEM_STATUSxINVISIBLE), o->StatusInvisible()); + aChangeStatusPrivate->setOn(o->StatusInvisible()); lblStatus->setText(o->StatusStr()); lblStatus->setPrependPixmap(CMainWindow::iconForStatus(o->StatusFull())); @@ -1654,6 +1655,45 @@ void CMainWindow::changeStatusManual(int changeStatus(id); } +void CMainWindow::changeStatusManualOnline() +{ + changeStatusManual(ICQ_STATUS_ONLINE); +} + +void CMainWindow::changeStatusManualAway() +{ + changeStatusManual(ICQ_STATUS_AWAY); +} + +void CMainWindow::changeStatusManualNa() +{ + changeStatusManual(ICQ_STATUS_NA); +} + +void CMainWindow::changeStatusManualOccupied() +{ + changeStatusManual(ICQ_STATUS_OCCUPIED); +} + +void CMainWindow::changeStatusManualDnd() +{ + changeStatusManual(ICQ_STATUS_DND); +} + +void CMainWindow::changeStatusManualFFC() +{ + changeStatusManual(ICQ_STATUS_FREEFORCHAT); +} + +void CMainWindow::changeStatusManualOffline() +{ + changeStatusManual(ICQ_STATUS_OFFLINE); +} + +void CMainWindow::changeStatusManualPrivate(bool b) +{ + changeStatusManual(ICQ_STATUS_FxPRIVATE); +} //----CMainWindow::changeStatus------------------------------------------------- void CMainWindow::changeStatus(int id) @@ -1669,14 +1709,12 @@ void CMainWindow::changeStatus(int id) } else if (id == (int)ICQ_STATUS_FxPRIVATE) // toggle invisible status { - mnuStatus->setItemChecked(ICQ_STATUS_FxPRIVATE, - !mnuStatus->isItemChecked(ICQ_STATUS_FxPRIVATE)); if (o->StatusOffline()) { gUserManager.DropOwner(); return; } - if (mnuStatus->isItemChecked(ICQ_STATUS_FxPRIVATE)) + if (aChangeStatusPrivate->isOn()) newStatus = o->StatusFull() | ICQ_STATUS_FxPRIVATE; else newStatus = o->StatusFull() & (~ICQ_STATUS_FxPRIVATE); @@ -1687,12 +1725,9 @@ void CMainWindow::changeStatus(int id) } // we may have been offline and gone online with invisible toggled - if (mnuStatus->isItemChecked(ICQ_STATUS_FxPRIVATE)) + if (aChangeStatusPrivate->isOn()) newStatus |= ICQ_STATUS_FxPRIVATE; - // disable combo box, flip pixmap... - //lblStatus->setEnabled(false); - // call the right function bool b = o->StatusOffline(); gUserManager.DropOwner(); @@ -3154,16 +3189,18 @@ void CMainWindow::ApplyIcons(const char pmInfo.load(sFilepath); if(pmInfo.isNull()) pmInfo = pmMessage; - if (!_bInitial) - { - mnuStatus->changeItem(pmOnline, tr("&Online"), ICQ_STATUS_ONLINE); - mnuStatus->changeItem(pmAway, tr("&Away"), ICQ_STATUS_AWAY); - mnuStatus->changeItem(pmNa, tr("&Not Available"), ICQ_STATUS_NA); - mnuStatus->changeItem(pmOccupied, tr("O&ccupied"), ICQ_STATUS_OCCUPIED); - mnuStatus->changeItem(pmDnd, tr("&Do Not Disturb"), ICQ_STATUS_DND); - mnuStatus->changeItem(pmFFC, tr("Free for C&hat"), ICQ_STATUS_FREEFORCHAT); - mnuStatus->changeItem(pmOffline, tr("O&ffline"), ICQ_STATUS_OFFLINE); - mnuStatus->changeItem(pmPrivate, tr("&Invisible"), ICQ_STATUS_FxPRIVATE); + if (!_bInitial) + { + mnuStatus->changeItem(pmOnline, tr("&Online"), ICQ_STATUS_ONLINE); + aChangeStatusOnline->setIconSet(QIconSet(pmOnline)); + aChangeStatusAway->setIconSet(QIconSet(pmAway)); + aChangeStatusNa->setIconSet(QIconSet(pmNa)); + aChangeStatusOccupied->setIconSet(QIconSet(pmOccupied)); + aChangeStatusDnd->setIconSet(QIconSet(pmDnd)); + aChangeStatusFFC->setIconSet(QIconSet(pmFFC)); + aChangeStatusOffline->setIconSet(QIconSet(pmOffline)); + aChangeStatusPrivate->setIconSet(QIconSet(pmPrivate)); + mnuUser->changeItem(pmMessage, tr("Send &Message"), mnuUserSendMsg); mnuUser->changeItem(pmUrl, tr("Send &URL"), mnuUserSendUrl); mnuUser->changeItem(pmChat, tr("Send &Chat Request"), mnuUserSendChat); @@ -3187,43 +3224,16 @@ void CMainWindow::ApplyIcons(const char //-----CMainWindow::initMenu-------------------------------------------------- void CMainWindow::initMenu() { - // Skins without a menubar (frame.hasMenuBar = 0) cannot use - // QMenuData accelerators, so we need a accel that is available - // even without a menubar: - QAccel *a = new QAccel(this, "CMainWindow change Status Accel"); - a->insertItem(ALT + Key_O, ICQ_STATUS_ONLINE); - a->insertItem(ALT + Key_A, ICQ_STATUS_AWAY); - a->insertItem(ALT + Key_N, ICQ_STATUS_NA); - a->insertItem(ALT + Key_C, ICQ_STATUS_OCCUPIED); - a->insertItem(ALT + Key_D, ICQ_STATUS_DND); - a->insertItem(ALT + Key_H, ICQ_STATUS_FREEFORCHAT); - a->insertItem(ALT + Key_F, ICQ_STATUS_OFFLINE); - a->insertItem(ALT + Key_I, ICQ_STATUS_FxPRIVATE); - connect(a, SIGNAL(activated(int)), this, SLOT(changeStatusManual(int))); -#if QT_VERSION > 0x030006 - connect(a, SIGNAL(activatedAmbiguously(int)), this, SLOT(changeStatusManual(int))); -#endif - - mnuStatus = new QPopupMenu(NULL); - mnuStatus->insertItem(pmOnline, tr("&Online"), ICQ_STATUS_ONLINE); - mnuStatus->insertItem(pmAway, tr("&Away"), ICQ_STATUS_AWAY); - mnuStatus->insertItem(pmNa, tr("&Not Available"), ICQ_STATUS_NA); - mnuStatus->insertItem(pmOccupied, tr("O&ccupied"), ICQ_STATUS_OCCUPIED); - mnuStatus->insertItem(pmDnd, tr("&Do Not Disturb"), ICQ_STATUS_DND); - mnuStatus->insertItem(pmFFC, tr("Free for C&hat"), ICQ_STATUS_FREEFORCHAT); - mnuStatus->insertItem(pmOffline, tr("O&ffline"), ICQ_STATUS_OFFLINE); - mnuStatus->insertSeparator(); - mnuStatus->insertItem(pmPrivate, tr("&Invisible"), ICQ_STATUS_FxPRIVATE); - mnuStatus->setAccel(a->key(ICQ_STATUS_ONLINE), ICQ_STATUS_ONLINE); - mnuStatus->setAccel(a->key(ICQ_STATUS_AWAY), ICQ_STATUS_AWAY); - mnuStatus->setAccel(a->key(ICQ_STATUS_NA), ICQ_STATUS_NA); - mnuStatus->setAccel(a->key(ICQ_STATUS_OCCUPIED), ICQ_STATUS_OCCUPIED); - mnuStatus->setAccel(a->key(ICQ_STATUS_DND), ICQ_STATUS_DND); - mnuStatus->setAccel(a->key(ICQ_STATUS_FREEFORCHAT), ICQ_STATUS_FREEFORCHAT); - mnuStatus->setAccel(a->key(ICQ_STATUS_OFFLINE), ICQ_STATUS_OFFLINE); - mnuStatus->setAccel(a->key(ICQ_STATUS_FxPRIVATE), ICQ_STATUS_FxPRIVATE); - - connect(mnuStatus, SIGNAL(activated(int)), this, SLOT(changeStatusManual(int))); + mnuStatus = new QPopupMenu(NULL); + aChangeStatusOnline->addTo(mnuStatus); + aChangeStatusAway->addTo(mnuStatus); + aChangeStatusNa->addTo(mnuStatus); + aChangeStatusOccupied->addTo(mnuStatus); + aChangeStatusDnd->addTo(mnuStatus); + aChangeStatusFFC->addTo(mnuStatus); + aChangeStatusOffline->addTo(mnuStatus); + mnuStatus->insertSeparator(); + aChangeStatusPrivate->addTo(mnuStatus); mnuUserGroups = new QPopupMenu(NULL); connect(mnuUserGroups, SIGNAL(activated(int)), this, SLOT(setCurrentGroupMenu(int))); @@ -3627,6 +3637,27 @@ void CMainWindow::slot_hints() "<hr><p> For more information, see the Licq webpage (<tt>http://www.licq.org</tt>).</p>"); (void) new HintsDlg(hints); +} + +void CMainWindow::setupActions() +{ + aChangeStatusOnline = new QAction(tr("&Online"), QIconSet(pmOnline), tr("&Online"), ALT + Key_O, this); + aChangeStatusAway = new QAction(tr("&Away"), QIconSet(pmAway), tr("&Away"), ALT + Key_A, this); + aChangeStatusNa = new QAction(tr("&Not Available"), QIconSet(pmNa), tr("&Not Available"), ALT + Key_N, this); + aChangeStatusOccupied = new QAction(tr("O&ccupied"), QIconSet(pmOccupied), tr("O&ccupied"), ALT + Key_C, this); + aChangeStatusDnd = new QAction(tr("&Do Not Disturb"), QIconSet(pmDnd), tr("&Do Not Disturb"), ALT + Key_D, this); + aChangeStatusFFC = new QAction(tr("Free for C&hat"), QIconSet(pmFFC), tr("Free for C&hat"), ALT + Key_H, this); + aChangeStatusOffline = new QAction(tr("O&ffline"), QIconSet(pmOffline), tr("O&ffline"), ALT + Key_F, this); + aChangeStatusPrivate = new QAction(tr("&Invisible"), QIconSet(pmPrivate), tr("&Invisible"), ALT + Key_I, this, "aChangeStatusPrivate", true); + + connect(aChangeStatusOnline, SIGNAL(activated()), this, SLOT(changeStatusManualOnline())); + connect(aChangeStatusAway, SIGNAL(activated()), this, SLOT(changeStatusManualAway())); + connect(aChangeStatusNa, SIGNAL(activated()), this, SLOT(changeStatusManualNa())); + connect(aChangeStatusOccupied, SIGNAL(activated()), this, SLOT(changeStatusManualOccupied())); + connect(aChangeStatusDnd, SIGNAL(activated()), this, SLOT(changeStatusManualDnd())); + connect(aChangeStatusFFC, SIGNAL(activated()), this, SLOT(changeStatusManualFFC())); + connect(aChangeStatusOffline, SIGNAL(activated()), this, SLOT(changeStatusManualOffline())); + connect(aChangeStatusPrivate, SIGNAL(toggled(bool)), this, SLOT(changeStatusManualPrivate(bool))); } Index: plugins/qt-gui/src/mainwin.h =================================================================== RCS file: /cvsroot/licq/qt-gui/src/mainwin.h,v retrieving revision 1.98 diff -u -3 -p -r1.98 mainwin.h --- plugins/qt-gui/src/mainwin.h 18 Jan 2003 02:16:51 -0000 1.98 +++ plugins/qt-gui/src/mainwin.h 5 Feb 2003 21:47:30 -0000 @@ -16,6 +16,7 @@ #else #include <qptrlist.h> #endif +#include <qaction.h> #include <qwidget.h> #include <qtimer.h> #include <qbitmap.h> @@ -240,6 +241,15 @@ protected slots: void updateGroups(); void changeStatus(int index); void changeStatusManual(int index); + void changeStatusManualOnline(); + void changeStatusManualAway(); + void changeStatusManualNa(); + void changeStatusManualOccupied(); + void changeStatusManualDnd(); + void changeStatusManualFFC(); + void changeStatusManualOffline(); + void changeStatusManualPrivate(bool); + void setCurrentGroupMenu(int id); void setCurrentGroup(int); void callDefaultFunction(QListViewItem *); @@ -292,6 +302,17 @@ protected slots: signals: void changeDockStatus(unsigned short); void signal_sentevent(ICQEvent *e); + +private: + void setupActions(); + QAction *aChangeStatusOnline; + QAction *aChangeStatusAway; + QAction *aChangeStatusNa; + QAction *aChangeStatusOccupied; + QAction *aChangeStatusDnd; + QAction *aChangeStatusFFC; + QAction *aChangeStatusOffline; + QAction *aChangeStatusPrivate; };
msg02014/pgp00000.pgp
Description: signature