18 #include "qgssettings.h" 
   24   , mSettingsPath( settingsRoot )
 
   38     QList< QAction * > actions = 
object->findChildren< QAction * >();
 
   39     const auto constActions = actions;
 
   40     for ( QAction *a : constActions )
 
   42       registerAction( a, a->shortcut().toString( QKeySequence::NativeText ) );
 
   47     const auto constChildren = 
object->children();
 
   48     for ( QObject *child : constChildren )
 
   50       if ( QAction *a = qobject_cast<QAction *>( child ) )
 
   52         registerAction( a, a->shortcut().toString( QKeySequence::NativeText ) );
 
   62     QList< QShortcut * > shortcuts = 
object->findChildren< QShortcut * >();
 
   63     const auto constShortcuts = shortcuts;
 
   64     for ( QShortcut *s : constShortcuts )
 
   71     const auto constChildren = 
object->children();
 
   72     for ( QObject *child : constChildren )
 
   74       if ( QShortcut *s = qobject_cast<QShortcut *>( child ) )
 
   84   if ( mActions.contains( action ) )
 
   90     QgsLogger::warning( QStringLiteral( 
"Duplicate shortcut registered: %1" ).arg( action->text() ) );
 
   93   mActions.insert( action, defaultSequence );
 
   94   connect( action, &QObject::destroyed, 
this, &QgsShortcutsManager::actionDestroyed );
 
   96   QString actionText = action->text();
 
   97   actionText.remove( 
'&' ); 
 
  100   QgsSettings settings;
 
  101   QString sequence = settings.value( mSettingsPath + actionText, defaultSequence ).toString();
 
  103   action->setShortcut( sequence );
 
  104   if ( !action->toolTip().isEmpty() )
 
  106     const QStringList parts = action->toolTip().split( 
'\n' );
 
  107     QString formatted = QStringLiteral( 
"<b>%1</b>" ).arg( parts.at( 0 ) );
 
  108     if ( parts.count() > 1 )
 
  110       for ( 
int i = 1; i < parts.count(); ++i )
 
  111         formatted += QStringLiteral( 
"<p>%1</p>" ).arg( parts.at( i ) );
 
  114     action->setToolTip( formatted );
 
  115     updateActionToolTip( action, sequence );
 
  126     QgsLogger::warning( QStringLiteral( 
"Duplicate shortcut registered: %1" ).arg( shortcut->objectName() ) );
 
  129   mShortcuts.insert( shortcut, defaultSequence );
 
  130   connect( shortcut, &QObject::destroyed, 
this, &QgsShortcutsManager::shortcutDestroyed );
 
  132   QString shortcutName = shortcut->objectName();
 
  135   QgsSettings settings;
 
  136   QString keySequence = settings.value( mSettingsPath + shortcutName, defaultSequence ).toString();
 
  138   shortcut->setKey( keySequence );
 
  145   if ( !mActions.contains( action ) )
 
  148   mActions.remove( action );
 
  154   if ( !mShortcuts.contains( shortcut ) )
 
  157   mShortcuts.remove( shortcut );
 
  163   return mActions.keys();
 
  168   return mShortcuts.keys();
 
  173   QList< QObject * > list;
 
  174   ActionsHash::const_iterator actionIt = mActions.constBegin();
 
  175   for ( ; actionIt != mActions.constEnd(); ++actionIt )
 
  177     list << actionIt.key();
 
  179   ShortcutsHash::const_iterator shortcutIt = mShortcuts.constBegin();
 
  180   for ( ; shortcutIt != mShortcuts.constEnd(); ++shortcutIt )
 
  182     list << shortcutIt.key();
 
  189   if ( QAction *action = qobject_cast< QAction * >( 
object ) )
 
  191   else if ( QShortcut *shortcut = qobject_cast< QShortcut * >( 
object ) )
 
  199   return mActions.value( action, QString() );
 
  204   return mShortcuts.value( shortcut, QString() );
 
  219   if ( QAction *action = qobject_cast< QAction * >( 
object ) )
 
  221   else if ( QShortcut *shortcut = qobject_cast< QShortcut * >( 
object ) )
 
  229   action->setShortcut( sequence );
 
  230   this->updateActionToolTip( action, sequence );
 
  232   QString actionText = action->text();
 
  233   actionText.remove( 
'&' ); 
 
  236   QgsSettings settings;
 
  237   settings.setValue( mSettingsPath + actionText, sequence );
 
  243   shortcut->setKey( sequence );
 
  245   QString shortcutText = shortcut->objectName();
 
  248   QgsSettings settings;
 
  249   settings.setValue( mSettingsPath + shortcutText, sequence );
 
  265   if ( sequence.isEmpty() )
 
  268   for ( ActionsHash::const_iterator it = mActions.constBegin(); it != mActions.constEnd(); ++it )
 
  270     if ( it.key()->shortcut() == sequence )
 
  279   if ( sequence.isEmpty() )
 
  282   for ( ShortcutsHash::const_iterator it = mShortcuts.constBegin(); it != mShortcuts.constEnd(); ++it )
 
  284     if ( it.key()->key() == sequence )
 
  293   for ( ActionsHash::const_iterator it = mActions.constBegin(); it != mActions.constEnd(); ++it )
 
  295     if ( it.key()->text() == name )
 
  304   for ( ShortcutsHash::const_iterator it = mShortcuts.constBegin(); it != mShortcuts.constEnd(); ++it )
 
  306     if ( it.key()->objectName() == name )
 
  313 void QgsShortcutsManager::actionDestroyed()
 
  315   mActions.remove( qobject_cast<QAction *>( sender() ) );
 
  318 void QgsShortcutsManager::shortcutDestroyed()
 
  320   mShortcuts.remove( qobject_cast<QShortcut *>( sender() ) );
 
  323 void QgsShortcutsManager::updateActionToolTip( QAction *action, 
const QString &sequence )
 
  325   QString current = action->toolTip();
 
  327   QRegExp rx( 
"\\(.*\\)" );
 
  328   current.replace( rx, QString() );
 
  330   if ( !sequence.isEmpty() )
 
  332     action->setToolTip( current + 
" (" + sequence + 
")" );
 
  336     action->setToolTip( current );
 
static void warning(const QString &msg)
Goes to qWarning.
bool setKeySequence(const QString &name, const QString &sequence)
Modifies an action or shortcut's key sequence.
QList< QObject * > listAll() const
Returns a list of both actions and shortcuts in the manager.
QgsShortcutsManager(QObject *parent=nullptr, const QString &settingsRoot="/shortcuts/")
Constructor for QgsShortcutsManager.
QString objectDefaultKeySequence(QObject *object) const
Returns the default sequence for an object (either a QAction or QShortcut).
QList< QShortcut * > listShortcuts() const
Returns a list of shortcuts in the manager.
bool unregisterShortcut(QShortcut *shortcut)
Removes a shortcut from the manager.
bool registerShortcut(QShortcut *shortcut, const QString &defaultSequence=QString())
Registers a QShortcut with the manager so the shortcut can be configured in GUI.
QString defaultKeySequence(QAction *action) const
Returns the default sequence for an action.
bool setObjectKeySequence(QObject *object, const QString &sequence)
Modifies an object's (either a QAction or a QShortcut) key sequence.
bool registerAction(QAction *action, const QString &defaultShortcut=QString())
Registers an action with the manager so the shortcut can be configured in GUI.
void registerAllChildren(QObject *object, bool recursive=false)
Automatically registers all QActions and QShortcuts which are children of the passed object.
QShortcut * shortcutByName(const QString &name) const
Returns a shortcut by its name, or nullptr if nothing found.
void registerAllChildShortcuts(QObject *object, bool recursive=false)
Automatically registers all QShortcuts which are children of the passed object.
QAction * actionByName(const QString &name) const
Returns an action by its name, or nullptr if nothing found.
QShortcut * shortcutForSequence(const QKeySequence &sequence) const
Returns the shortcut which is associated for a key sequence, or nullptr if no shortcut is associated.
QList< QAction * > listActions() const
Returns a list of all actions in the manager.
QAction * actionForSequence(const QKeySequence &sequence) const
Returns the action which is associated for a shortcut sequence, or nullptr if no action is associated...
void registerAllChildActions(QObject *object, bool recursive=false)
Automatically registers all QActions which are children of the passed object.
bool unregisterAction(QAction *action)
Removes an action from the manager.
QObject * objectForSequence(const QKeySequence &sequence) const
Returns the object (QAction or QShortcut) matching the specified key sequence,.