kshortcutmenu.cpp
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include <qkeysequence.h>
00021 #include <qlabel.h>
00022 #include <qpopupmenu.h>
00023
00024 #include "kaccelaction.h"
00025 #include <kdebug.h>
00026 #include <kglobalsettings.h>
00027 #include "kshortcutmenu.h"
00028
00029
00030 KShortcutMenu::KShortcutMenu( QWidget* pParent, KAccelActions* pActions, KKeySequence seq )
00031 : QPopupMenu( pParent ),
00032 m_pActions( pActions ),
00033 m_seq( seq )
00034 {
00035 kdDebug() << seq.toStringInternal() << endl;
00036
00037 QFont fontTitle = KGlobalSettings::menuFont();
00038 fontTitle.setBold( true );
00039
00040 pTitle = new QLabel( "", (QWidget*)0 );
00041 pTitle->setFont( fontTitle );
00042 pTitle->setFrameShape( QFrame::Panel );
00043
00044 insertItem( pTitle );
00045 }
00046
00047 bool KShortcutMenu::insertAction( uint iAction, KKeySequence seq )
00048 {
00049 KAccelAction* pAction = m_pActions->actionPtr( iAction );
00050
00051 if( pAction ) {
00052 insertItem( "", iAction );
00053 m_seqs[indexOf(iAction)] = seq;
00054 return true;
00055 } else
00056 return false;
00057 }
00058
00059
00060 void KShortcutMenu::updateShortcuts()
00061 {
00062 pTitle->setText( m_seq.toString() + ",..." );
00063
00064 for( uint iItem = 1; iItem < count(); iItem++ ) {
00065 int iAction = idAt( iItem );
00066 if( iAction >= 0 ) {
00067 KAccelAction* pAction = m_pActions->actionPtr( iAction );
00068 if( pAction ) {
00069 KKeySequence seq = m_seqs[iItem];
00070 QString sSeq = seq.key(m_seq.count()).toString();
00071 for( uint iKey = m_seq.count() + 1; iKey < seq.count(); iKey++ )
00072 sSeq += QString(",") + seq.key(iKey).toString();
00073
00074 kdDebug(125) << "seq = " << seq.toStringInternal() << " sSeq = " << sSeq << endl;
00075 changeItem( iAction, pAction->label() + "\t" + sSeq );
00076 }
00077 }
00078 }
00079 }
00080
00081 void KShortcutMenu::keyPressEvent( QKeyEvent* pEvent )
00082 {
00083 kdDebug() << "keypress; " << pEvent->key() << endl;
00084 KKey key( pEvent );
00085
00086 switch( pEvent->key() ) {
00087 case Key_Shift:
00088 case Key_Control:
00089 case Key_Alt:
00090 case Key_Meta:
00091 case Key_Super_L:
00092 case Key_Super_R:
00093 case Key_Hyper_L:
00094 case Key_Hyper_R:
00095 break;
00096 default:
00097 int iItem = searchForKey( key );
00098
00099 if( iItem == -1 ) {
00100 key = pEvent->key();
00101 iItem = searchForKey( key );
00102 }
00103
00104 if( iItem == -1 ) {
00105
00106 if( pEvent->key() == Qt::Key_Up || pEvent->key() == Qt::Key_Down )
00107 QPopupMenu::keyPressEvent( pEvent );
00108 else
00109 close();
00110 }
00111 else if( iItem == 0 )
00112 keepItemsMatching( key );
00113 else
00114 activateItemAt( iItem );
00115 }
00116 }
00117
00118 int KShortcutMenu::searchForKey( KKey key )
00119 {
00120 int iItemFound = -1;
00121 uint iKey = m_seq.count();
00122
00123 for( uint iItem = 1; iItem < count(); iItem++ ) {
00124 if( m_seqs.contains( iItem ) ) {
00125 KKey keyItem = m_seqs[iItem].key( iKey );
00126
00127 if( key == keyItem ) {
00128 if( iItemFound == -1 )
00129 iItemFound = iItem;
00130 else
00131 return 0;
00132 }
00133 }
00134 }
00135
00136 return iItemFound;
00137 }
00138
00139 void KShortcutMenu::keepItemsMatching( KKey key )
00140 {
00141 kdDebug(125) << "MyAccel::keepItemsMatching( " << key.toStringInternal() << " )" << endl;
00142
00143 uint iKey = m_seq.count();
00144 m_seq.setKey( iKey, key );
00145
00146 for( uint iItem = 1; iItem < count(); iItem++ ) {
00147 if( m_seqs.contains( iItem ) ) {
00148 KKey keyItem = m_seqs[iItem].key( iKey );
00149 if( key != keyItem ) {
00150 m_seqs.remove( iItem );
00151 removeItemAt( iItem-- );
00152 }
00153 }
00154 }
00155
00156 updateShortcuts();
00157 }
00158
00159 #include "kshortcutmenu.moc"
This file is part of the documentation for kdelibs Version 3.1.0.