You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
114 lines
2.4 KiB
114 lines
2.4 KiB
/*
|
|
* kaccelmenuwatch.cpp -- Implementation of class KAccelMenuWatch.
|
|
* Author: Sirtaj Singh Kang
|
|
* Generated: Thu Jan 7 15:05:26 EST 1999
|
|
*/
|
|
|
|
#include <assert.h>
|
|
#include <qpopupmenu.h>
|
|
|
|
#include "kaccelmenuwatch.h"
|
|
|
|
KAccelMenuWatch::KAccelMenuWatch( KAccel *accel, QObject *parent )
|
|
: QObject( parent ),
|
|
_accel( accel ),
|
|
_menu ( 0 )
|
|
{
|
|
_accList.setAutoDelete( true );
|
|
_menuList.setAutoDelete( false );
|
|
}
|
|
|
|
void KAccelMenuWatch::setMenu( QPopupMenu *menu )
|
|
{
|
|
assert( menu );
|
|
|
|
// we use _menuList to ensure that the signal is
|
|
// connected only once per menu.
|
|
|
|
if ( !_menuList.findRef( menu ) ) {
|
|
_menuList.append( menu );
|
|
connect( menu, SIGNAL(destroyed()), this, SLOT(removeDeadMenu()) );
|
|
}
|
|
|
|
_menu = menu;
|
|
}
|
|
|
|
void KAccelMenuWatch::connectAccel( int itemId, const char *action )
|
|
{
|
|
AccelItem *item = newAccelItem( _menu, itemId, StringAccel ) ;
|
|
item->action = QString::fromLocal8Bit( action );
|
|
}
|
|
|
|
void KAccelMenuWatch::connectAccel( int itemId, KStdAccel::StdAccel accel )
|
|
{
|
|
AccelItem *item = newAccelItem( _menu, itemId, StdAccel ) ;
|
|
item->stdAction = accel;
|
|
}
|
|
|
|
void KAccelMenuWatch::updateMenus()
|
|
{
|
|
assert( _accel != 0 );
|
|
|
|
QPtrListIterator<AccelItem> iter( _accList );
|
|
AccelItem *item;
|
|
|
|
for( ; (item = iter.current()) ; ++iter ) {
|
|
// These setAccel calls were converted from all changeMenuAccel calls
|
|
// as descibed in KDE3PORTING.html
|
|
switch( item->type ) {
|
|
case StringAccel:
|
|
item->menu->setAccel( _accel->shortcut( item->action ).keyCodeQt(), item->itemId );
|
|
break;
|
|
case StdAccel:
|
|
item->menu->setAccel( KStdAccel::shortcut( item->stdAction ).keyCodeQt(), item->itemId );
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
void KAccelMenuWatch::removeDeadMenu()
|
|
{
|
|
QPopupMenu *sdr = (QPopupMenu *) sender();
|
|
assert( sdr );
|
|
|
|
if ( !_menuList.findRef( sdr ) )
|
|
return;
|
|
|
|
// remove all accels
|
|
|
|
AccelItem *accel;
|
|
for ( accel = _accList.first(); accel; accel = _accList.next() )
|
|
{
|
|
loop:
|
|
if( accel && accel->menu == sdr ) {
|
|
_accList.remove();
|
|
accel = _accList.current();
|
|
goto loop;
|
|
}
|
|
}
|
|
|
|
// remove from menu list
|
|
_menuList.remove( sdr );
|
|
|
|
return;
|
|
}
|
|
|
|
KAccelMenuWatch::AccelItem *KAccelMenuWatch::newAccelItem( QPopupMenu *,
|
|
int itemId, AccelType type )
|
|
{
|
|
AccelItem *item = new AccelItem;
|
|
|
|
item->menu = _menu;
|
|
item->itemId = itemId;
|
|
item->type = type;
|
|
|
|
_accList.append( item );
|
|
|
|
return item;
|
|
}
|
|
|
|
#include "kaccelmenuwatch.moc"
|