Source Code (Use browser search to find items of interest.)

Class Index

karm'KAccelMenuWatch (./kdeutils/karm/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& );
};

karm'KAccelMenuWatch::KAccelMenuWatch() (./kdeutils/karm/kaccelmenuwatch.cpp:11)

KAccelMenuWatch::KAccelMenuWatch( KAccel *accel, QObject *parent )
	: QObject( parent ),
	_accel( accel ),
	_menu ( 0 )
{
	_accList.setAutoDelete( true );
	_menuList.setAutoDelete( false );
}


karm'KAccelMenuWatch::setMenu() (./kdeutils/karm/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;
}


karm'KAccelMenuWatch::connectAccel() (./kdeutils/karm/kaccelmenuwatch.cpp:36)

void KAccelMenuWatch::connectAccel( int itemId, const char *action )
{
	AccelItem *item = newAccelItem( _menu, itemId, StringAccel ) ;
	item->action	= action;
}


karm'KAccelMenuWatch::connectAccel() (./kdeutils/karm/kaccelmenuwatch.cpp:42)

void KAccelMenuWatch::connectAccel( int itemId, KStdAccel::StdAccel accel )
{
	AccelItem *item = newAccelItem( _menu, itemId, StdAccel ) ;
	item->stdAction	= accel;
}


karm'KAccelMenuWatch::updateMenus() (./kdeutils/karm/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;
		}
	}

}


karm'KAccelMenuWatch::removeDeadMenu() (./kdeutils/karm/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;
}