Source Code (Use browser search to find items of interest.)
Class Index
kview'KAccelMenuWatch (./kdegraphics/kview/kaccelmenuwatch.h:34)
class KAccelMenuWatch : public QObject
{
Q_OBJECT
private:
enum AccelType { StdAccel, StringAccel };
typedef struct AccelItem {
QPopupMenu *menu;
int itemId;
AccelType type;
// only one of these is used at a time
QString action;
KStdAccel::StdAccel stdAction;
} AccelItem;
KAccel *_accel;
QList<AccelItem> _accList;
QList<QPopupMenu> _menuList;
QPopupMenu *_menu;
KAccelMenuWatch::AccelItem *newAccelItem( QPopupMenu *menu,
int itemId, AccelType type );
public:
/**
* KAccelMenuWatch Constructor
*/
KAccelMenuWatch( KAccel *accel, QObject *parent = 0 );
/**
* KAccelMenuWatch Destructor
*/
virtual ~KAccelMenuWatch() {}
/**
* Set the menu on which connectAccel calls will operate.
* All subsequent calls to connectAccel will be associated
* with this menu. You can call this function any number of
* times, so multiple menus can be handled.
*/
void setMenu( QPopupMenu *menu );
/**
* Return the last menu set with @ref ::setMenu, or 0 if none
* has been set.
*/
QPopupMenu *currentMenu() const { return _menu; }
/**
* Connect the menu item identified to currentMenu()/id to
* the accelerator action.
*/
void connectAccel( int itemId, const char *action );
/**
* Same as above, but connects to standard accelerators.
*/
void connectAccel( int itemId, KStdAccel::StdAccel );
public slots:
/**
* Updates all menu accelerators. Call this after all accelerators
* have been connected or the kaccel object has been updated.
*/
void updateMenus();
private slots:
void removeDeadMenu();
private:
KAccelMenuWatch& operator=( const KAccelMenuWatch& );
KAccelMenuWatch( const KAccelMenuWatch& );
};
kview'KAccelMenuWatch::KAccelMenuWatch() (./kdegraphics/kview/kaccelmenuwatch.cpp:11)
KAccelMenuWatch::KAccelMenuWatch( KAccel *accel, QObject *parent )
: QObject( parent ),
_accel( accel ),
_menu ( 0 )
{
_accList.setAutoDelete( true );
_menuList.setAutoDelete( false );
}
kview'KAccelMenuWatch::setMenu() (./kdegraphics/kview/kaccelmenuwatch.cpp:20)
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;
}
kview'KAccelMenuWatch::connectAccel() (./kdegraphics/kview/kaccelmenuwatch.cpp:36)
void KAccelMenuWatch::connectAccel( int itemId, const char *action )
{
AccelItem *item = newAccelItem( _menu, itemId, StringAccel ) ;
item->action = action;
}
kview'KAccelMenuWatch::connectAccel() (./kdegraphics/kview/kaccelmenuwatch.cpp:42)
void KAccelMenuWatch::connectAccel( int itemId, KStdAccel::StdAccel accel )
{
AccelItem *item = newAccelItem( _menu, itemId, StdAccel ) ;
item->stdAction = accel;
}
kview'KAccelMenuWatch::updateMenus() (./kdegraphics/kview/kaccelmenuwatch.cpp:48)
void KAccelMenuWatch::updateMenus()
{
assert( _accel != 0 );
QListIterator<AccelItem> iter( _accList );
AccelItem *item;
for( ; (item = iter.current()); ++iter ) {
switch( item->type ) {
case StringAccel:
_accel->changeMenuAccel( item->menu,
item->itemId,
item->action );
break;
case StdAccel:
_accel->changeMenuAccel( item->menu,
item->itemId,
item->stdAction );
break;
default:
break;
}
}
}
kview'KAccelMenuWatch::removeDeadMenu() (./kdegraphics/kview/kaccelmenuwatch.cpp:74)
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;
}