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;
 
 };
 

Attachment: msg02014/pgp00000.pgp
Description: signature

Reply via email to