karm
kaccelmenuwatch.cpp00001
00002
00003
00004
00005
00006
00007 #include <assert.h>
00008 #include <qpopupmenu.h>
00009
00010 #include "kaccelmenuwatch.h"
00011
00012 KAccelMenuWatch::KAccelMenuWatch( KAccel *accel, QObject *parent )
00013 : QObject( parent ),
00014 _accel( accel ),
00015 _menu ( 0 )
00016 {
00017 _accList.setAutoDelete( true );
00018 _menuList.setAutoDelete( false );
00019 }
00020
00021 void KAccelMenuWatch::setMenu( QPopupMenu *menu )
00022 {
00023 assert( menu );
00024
00025
00026
00027
00028 if ( !_menuList.findRef( menu ) ) {
00029 _menuList.append( menu );
00030 connect( menu, SIGNAL(destroyed()), this, SLOT(removeDeadMenu()) );
00031 }
00032
00033 _menu = menu;
00034 }
00035
00036 void KAccelMenuWatch::connectAccel( int itemId, const char *action )
00037 {
00038 AccelItem *item = newAccelItem( _menu, itemId, StringAccel ) ;
00039 item->action = QString::fromLocal8Bit( action );
00040 }
00041
00042 void KAccelMenuWatch::connectAccel( int itemId, KStdAccel::StdAccel accel )
00043 {
00044 AccelItem *item = newAccelItem( _menu, itemId, StdAccel ) ;
00045 item->stdAction = accel;
00046 }
00047
00048 void KAccelMenuWatch::updateMenus()
00049 {
00050 assert( _accel != 0 );
00051
00052 QPtrListIterator<AccelItem> iter( _accList );
00053 AccelItem *item;
00054
00055 for( ; (item = iter.current()) ; ++iter ) {
00056
00057
00058 switch( item->type ) {
00059 case StringAccel:
00060 item->menu->setAccel( _accel->shortcut( item->action ).keyCodeQt(), item->itemId );
00061 break;
00062 case StdAccel:
00063 item->menu->setAccel( KStdAccel::shortcut( item->stdAction ).keyCodeQt(), item->itemId );
00064 break;
00065 default:
00066 break;
00067 }
00068 }
00069
00070 }
00071
00072 void KAccelMenuWatch::removeDeadMenu()
00073 {
00074 QPopupMenu *sdr = (QPopupMenu *) sender();
00075 assert( sdr );
00076
00077 if ( !_menuList.findRef( sdr ) )
00078 return;
00079
00080
00081
00082 AccelItem *accel;
00083 for ( accel = _accList.first(); accel; accel = _accList.next() )
00084 {
00085 loop:
00086 if( accel && accel->menu == sdr ) {
00087 _accList.remove();
00088 accel = _accList.current();
00089 goto loop;
00090 }
00091 }
00092
00093
00094 _menuList.remove( sdr );
00095
00096 return;
00097 }
00098
00099 KAccelMenuWatch::AccelItem *KAccelMenuWatch::newAccelItem( QPopupMenu *,
00100 int itemId, AccelType type )
00101 {
00102 AccelItem *item = new AccelItem;
00103
00104 item->menu = _menu;
00105 item->itemId = itemId;
00106 item->type = type;
00107
00108 _accList.append( item );
00109
00110 return item;
00111 }
00112
00113 #include "kaccelmenuwatch.moc"
|