diff options
Diffstat (limited to 'tdecore/kshortcutmenu.cpp')
-rw-r--r-- | tdecore/kshortcutmenu.cpp | 161 |
1 files changed, 161 insertions, 0 deletions
diff --git a/tdecore/kshortcutmenu.cpp b/tdecore/kshortcutmenu.cpp new file mode 100644 index 000000000..3df389f07 --- /dev/null +++ b/tdecore/kshortcutmenu.cpp @@ -0,0 +1,161 @@ +/* + Copyright (c) 2002 Ellis Whitehead <ellis@kde.org> + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#include <tqkeysequence.h> +#include <tqlabel.h> +#include <tqpopupmenu.h> + +#include "kaccelaction.h" +#include <kdebug.h> +#include <kglobalsettings.h> +#include "kshortcutmenu.h" +//#include <kkeynative.h> + +KShortcutMenu::KShortcutMenu( TQWidget* pParent, KAccelActions* pActions, KKeySequence seq ) +: TQPopupMenu( pParent ), + m_pActions( pActions ), + m_seq( seq ) +{ + kdDebug() << seq.toStringInternal() << endl; + + TQFont fontTitle = KGlobalSettings::menuFont(); + fontTitle.setBold( true ); + + pTitle = new TQLabel( "", (TQWidget*)0 ); + pTitle->setFont( fontTitle ); + pTitle->setFrameShape( TQFrame::Panel ); + + insertItem( pTitle ); +} + +bool KShortcutMenu::insertAction( uint iAction, KKeySequence seq ) +{ + KAccelAction* pAction = m_pActions->actionPtr( iAction ); + + if( pAction ) { + insertItem( "", iAction ); + m_seqs[indexOf(iAction)] = seq; + return true; + } else + return false; +} + + +void KShortcutMenu::updateShortcuts() +{ + pTitle->setText( m_seq.toString() + ",..." ); + + for( uint iItem = 1; iItem < count(); iItem++ ) { + int iAction = idAt( iItem ); + if( iAction >= 0 ) { + KAccelAction* pAction = m_pActions->actionPtr( iAction ); + if( pAction ) { + KKeySequence seq = m_seqs[iItem]; + TQString sSeq = seq.key(m_seq.count()).toString(); + for( uint iKey = m_seq.count() + 1; iKey < seq.count(); iKey++ ) + sSeq += TQString(",") + seq.key(iKey).toString(); + + kdDebug(125) << "seq = " << seq.toStringInternal() << " sSeq = " << sSeq << endl; + changeItem( iAction, pAction->label() + "\t" + sSeq ); + } + } + } +} + +void KShortcutMenu::keyPressEvent( TQKeyEvent* pEvent ) +{ + kdDebug() << "keypress; " << pEvent->key() << endl; + KKey key( pEvent ); + + switch( pEvent->key() ) { + case TQ_Key_Shift: + case TQ_Key_Control: + case TQ_Key_Alt: + case TQ_Key_Meta: + case TQ_Key_Super_L: + case TQ_Key_Super_R: + case TQ_Key_Hyper_L: + case TQ_Key_Hyper_R: + break; + default: + int iItem = searchForKey( key ); + // If key not found, look for unmodified version. + if( iItem == -1 ) { + key = pEvent->key(); + iItem = searchForKey( key ); + } + + if( iItem == -1 ) { + // Let Up and Down keys navigate menu, + // And permit Enter, Return to select the item. + if( pEvent->key() == Qt::Key_Up || pEvent->key() == Qt::Key_Down || + pEvent->key() == Qt::Key_Enter || pEvent->key() == Qt::Key_Return ) + TQPopupMenu::keyPressEvent( pEvent ); + else + close(); + } + else if( iItem == 0 ) + keepItemsMatching( key ); + else + activateItemAt( iItem ); + } +} + +int KShortcutMenu::searchForKey( KKey key ) +{ + int iItemFound = -1; // -1 indicates no match + uint iKey = m_seq.count(); + + for( uint iItem = 1; iItem < count(); iItem++ ) { + if( m_seqs.contains( iItem ) ) { + KKey keyItem = m_seqs[iItem].key( iKey ); + //kdDebug(125) << "iItem = " << iItem << " key = " << key.toStringInternal() << " keyItem = " << keyItem.toStringInternal() << endl; + if( key == keyItem ) { + if( iItemFound == -1 ) + iItemFound = iItem; + else + return 0; // 0 indicates duplicate matches + } + } + } + + return iItemFound; +} + +void KShortcutMenu::keepItemsMatching( KKey key ) +{ + kdDebug(125) << "MyAccel::keepItemsMatching( " << key.toStringInternal() << " )" << endl; + + uint iKey = m_seq.count(); + m_seq.setKey( iKey, key ); + + for( uint iItem = 1; iItem < count(); iItem++ ) { + if( m_seqs.contains( iItem ) ) { + KKey keyItem = m_seqs[iItem].key( iKey ); + if( key != keyItem ) { + m_seqs.remove( iItem ); + removeItemAt( iItem-- ); + } + } + } + + updateShortcuts(); +} + +#include "kshortcutmenu.moc" |