goldendict-ng/src/ui/groupcombobox.cc

132 lines
3 KiB
C++

/* This file is (c) 2008-2012 Konstantin Isakov <ikm@goldendict.org>
* Part of GoldenDict. Licensed under GPLv3 or later, see the LICENSE file */
#include "groupcombobox.hh"
#include <QEvent>
#include <QShortcutEvent>
GroupComboBox::GroupComboBox( QWidget * parent ):
QComboBox( parent ),
popupAction( this ),
selectNextAction( this ),
selectPreviousAction( this )
{
setSizeAdjustPolicy( AdjustToContents );
setToolTip( tr( "Choose a Group (Alt+G)" ) );
popupAction.setShortcut( QKeySequence( "Alt+G" ) );
connect( &popupAction, &QAction::triggered, this, &GroupComboBox::popupGroups );
addAction( &popupAction );
selectNextAction.setShortcut( QKeySequence( "Alt+PgDown" ) );
connect( &selectNextAction, &QAction::triggered, this, &GroupComboBox::selectNextGroup );
addAction( &selectNextAction );
selectPreviousAction.setShortcut( QKeySequence( "Alt+PgUp" ) );
connect( &selectPreviousAction, &QAction::triggered, this, &GroupComboBox::selectPreviousGroup );
addAction( &selectPreviousAction );
setMaxVisibleItems( 30 );
}
void GroupComboBox::fill( Instances::Groups const & groups )
{
unsigned prevId = 0;
if ( count() )
prevId = itemData( currentIndex() ).toUInt();
clear();
for ( QMap< int, int >::iterator i = shortcuts.begin(); i != shortcuts.end(); ++i )
releaseShortcut( i.key() );
shortcuts.clear();
for ( unsigned x = 0; x < groups.size(); ++x ) {
addItem( groups[ x ].makeIcon(), groups[ x ].name, groups[ x ].id );
if ( prevId == groups[ x ].id )
setCurrentIndex( x );
// Create a shortcut
if ( !groups[ x ].shortcut.isEmpty() ) {
int id = grabShortcut( groups[ x ].shortcut );
setShortcutEnabled( id );
shortcuts.insert( id, x );
}
}
}
bool GroupComboBox::event( QEvent * event )
{
if ( event->type() == QEvent::Shortcut ) {
QShortcutEvent * ev = (QShortcutEvent *)event;
QMap< int, int >::const_iterator i = shortcuts.find( ev->shortcutId() );
if ( i != shortcuts.end() ) {
ev->accept();
setCurrentIndex( i.value() );
return true;
}
}
return QComboBox::event( event );
}
QList< QAction * > GroupComboBox::getExternActions()
{
QList< QAction * > list;
list.append( &popupAction );
list.append( &selectNextAction );
list.append( &selectPreviousAction );
return list;
}
void GroupComboBox::setCurrentGroup( unsigned id )
{
for ( int x = 0; x < count(); ++x ) {
if ( itemData( x ).toUInt() == id ) {
setCurrentIndex( x );
break;
}
}
}
unsigned GroupComboBox::getCurrentGroup() const
{
if ( !count() )
return 0;
return itemData( currentIndex() ).toUInt();
}
void GroupComboBox::popupGroups()
{
showPopup();
}
void GroupComboBox::selectNextGroup()
{
if ( count() <= 1 )
return;
int n = currentIndex() + 1;
if ( n >= count() )
n = 0;
setCurrentIndex( n );
}
void GroupComboBox::selectPreviousGroup()
{
if ( count() <= 1 )
return;
int n = currentIndex() - 1;
if ( n < 0 )
n = count() - 1;
setCurrentIndex( n );
}