Skip to content

Commit c1ef8f0

Browse files
authoredFeb 23, 2018
Merge pull request #6430 from signedav/uxduplication
Only enable duplication when layer editable
2 parents 70c68df + 555cdf0 commit c1ef8f0

23 files changed

+311
-69
lines changed
 

‎src/app/qgisapp.cpp

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6464,6 +6464,9 @@ void QgisApp::refreshFeatureActions()
64646464
QList<QgsAction> actions = vlayer->actions()->actions( QStringLiteral( "Canvas" ) );
64656465
Q_FOREACH ( const QgsAction &action, actions )
64666466
{
6467+
if ( !vlayer->isEditable() && action.isEnabledOnlyWhenEditable() )
6468+
continue;
6469+
64676470
QString actionTitle = !action.shortTitle().isEmpty() ? action.shortTitle() : action.icon().isNull() ? action.name() : QStringLiteral( "" );
64686471
QAction *qAction = new QAction( action.icon(), actionTitle, mFeatureActionMenu );
64696472
qAction->setData( QVariant::fromValue<QgsAction>( action ) );
@@ -6485,6 +6488,9 @@ void QgisApp::refreshFeatureActions()
64856488

64866489
for ( int i = 0; i < registeredActions.size(); i++ )
64876490
{
6491+
if ( !vlayer->isEditable() && registeredActions.at( i )->isEnabledOnlyWhenEditable() )
6492+
continue;
6493+
64886494
mFeatureActionMenu->addAction( registeredActions.at( i ) );
64896495
if ( registeredActions.at( i ) == QgsGui::mapLayerActionRegistry()->defaultActionForLayer( vlayer ) )
64906496
{
@@ -7497,7 +7503,7 @@ void QgisApp::setupDuplicateFeaturesAction()
74977503
{
74987504
mDuplicateFeatureAction.reset( new QgsMapLayerAction( tr( "Duplicate feature" ),
74997505
nullptr, QgsMapLayerAction::SingleFeature,
7500-
QgsApplication::getThemeIcon( QStringLiteral( "/mActionDuplicateFeature.svg" ) ) ) );
7506+
QgsApplication::getThemeIcon( QStringLiteral( "/mActionDuplicateFeature.svg" ) ), true ) );
75017507

75027508
QgsGui::mapLayerActionRegistry()->addMapLayerAction( mDuplicateFeatureAction.get() );
75037509
connect( mDuplicateFeatureAction.get(), &QgsMapLayerAction::triggeredForFeature, this, [this]( QgsMapLayer * layer, const QgsFeature & feat )
@@ -7508,7 +7514,7 @@ void QgisApp::setupDuplicateFeaturesAction()
75087514

75097515
mDuplicateFeatureDigitizeAction.reset( new QgsMapLayerAction( tr( "Duplicate feature and digitize" ),
75107516
nullptr, QgsMapLayerAction::SingleFeature,
7511-
QgsApplication::getThemeIcon( QStringLiteral( "/mActionDuplicateFeatureDigitized.svg" ) ) ) );
7517+
QgsApplication::getThemeIcon( QStringLiteral( "/mActionDuplicateFeatureDigitized.svg" ) ), true ) );
75127518

75137519
QgsGui::mapLayerActionRegistry()->addMapLayerAction( mDuplicateFeatureDigitizeAction.get() );
75147520
connect( mDuplicateFeatureDigitizeAction.get(), &QgsMapLayerAction::triggeredForFeature, this, [this]( QgsMapLayer * layer, const QgsFeature & feat )
@@ -13204,7 +13210,13 @@ QgsFeature QgisApp::duplicateFeatures( QgsMapLayer *mlayer, const QgsFeature &fe
1320413210

1320513211
QgsVectorLayer *layer = qobject_cast<QgsVectorLayer *>( mlayer );
1320613212

13207-
layer->startEditing();
13213+
if ( !layer->isEditable() )
13214+
{
13215+
//should never happen because the action should be disabled
13216+
QString msg = tr( "Cannot duplicate feature in not editable mode on layer %1" ).arg( layer->name() );
13217+
messageBar()->pushMessage( msg, Qgis::Warning, 3 );
13218+
return QgsFeature();
13219+
}
1320813220

1320913221
QgsFeatureList featureList;
1321013222

@@ -13252,7 +13264,13 @@ QgsFeature QgisApp::duplicateFeatureDigitized( QgsMapLayer *mlayer, const QgsFea
1325213264

1325313265
QgsVectorLayer *layer = qobject_cast<QgsVectorLayer *>( mlayer );
1325413266

13255-
layer->startEditing();
13267+
if ( !layer->isEditable() )
13268+
{
13269+
//should never happen because the action should be disabled
13270+
QString msg = tr( "Cannot duplicate feature in not editable mode on layer %1" ).arg( layer->name() );
13271+
messageBar()->pushMessage( msg, Qgis::Warning, 3 );
13272+
return QgsFeature();
13273+
}
1325613274

1325713275
QgsMapToolDigitizeFeature *digitizeFeature = new QgsMapToolDigitizeFeature( mMapCanvas, mlayer, QgsMapToolCapture::CaptureNone );
1325813276

‎src/app/qgsattributeactiondialog.cpp

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -148,13 +148,19 @@ void QgsAttributeActionDialog::insertRow( int row, const QgsAction &action )
148148
// Notification message
149149
mAttributeActionTable->setItem( row, NotificationMessage, new QTableWidgetItem( action.notificationMessage() ) );
150150

151+
// EnabledOnlyWhenEditable
152+
item = new QTableWidgetItem();
153+
item->setFlags( item->flags() & ~( Qt::ItemIsEditable ) );
154+
item->setCheckState( action.isEnabledOnlyWhenEditable() ? Qt::Checked : Qt::Unchecked );
155+
mAttributeActionTable->setItem( row, EnabledOnlyWhenEditable, item );
156+
151157
updateButtons();
152158
}
153159

154-
void QgsAttributeActionDialog::insertRow( int row, QgsAction::ActionType type, const QString &name, const QString &actionText, const QString &iconPath, bool capture, const QString &shortTitle, const QSet<QString> &actionScopes, const QString &notificationMessage )
160+
void QgsAttributeActionDialog::insertRow( int row, QgsAction::ActionType type, const QString &name, const QString &actionText, const QString &iconPath, bool capture, const QString &shortTitle, const QSet<QString> &actionScopes, const QString &notificationMessage, bool isEnabledOnlyWhenEditable )
155161
{
156162
if ( uniqueName( name ) == name )
157-
insertRow( row, QgsAction( type, name, actionText, iconPath, capture, shortTitle, actionScopes, notificationMessage ) );
163+
insertRow( row, QgsAction( type, name, actionText, iconPath, capture, shortTitle, actionScopes, notificationMessage, isEnabledOnlyWhenEditable ) );
158164
}
159165

160166
void QgsAttributeActionDialog::moveUp()
@@ -223,7 +229,8 @@ QgsAction QgsAttributeActionDialog::rowToAction( int row ) const
223229
mAttributeActionTable->item( row, Capture )->checkState() == Qt::Checked,
224230
mAttributeActionTable->item( row, ShortTitle )->text(),
225231
mAttributeActionTable->item( row, ActionScopes )->data( Qt::UserRole ).value<QSet<QString>>(),
226-
mAttributeActionTable->item( row, NotificationMessage )->text()
232+
mAttributeActionTable->item( row, NotificationMessage )->text(),
233+
mAttributeActionTable->item( row, EnabledOnlyWhenEditable )->checkState() == Qt::Checked
227234
);
228235
return action;
229236
}
@@ -278,7 +285,7 @@ void QgsAttributeActionDialog::insert()
278285
{
279286
QString name = uniqueName( dlg.description() );
280287

281-
insertRow( pos, dlg.type(), name, dlg.actionText(), dlg.iconPath(), dlg.capture(), dlg.shortTitle(), dlg.actionScopes(), dlg.notificationMessage() );
288+
insertRow( pos, dlg.type(), name, dlg.actionText(), dlg.iconPath(), dlg.capture(), dlg.shortTitle(), dlg.actionScopes(), dlg.notificationMessage(), dlg.isEnabledOnlyWhenEditable() );
282289
}
283290
}
284291

@@ -313,7 +320,7 @@ void QgsAttributeActionDialog::addDefaultActions()
313320
insertRow( pos++, QgsAction::OpenUrl, tr( "Open file" ), QStringLiteral( "[% \"PATH\" %]" ), QLatin1String( "" ), false, tr( "Open file" ), QSet<QString>() << QStringLiteral( "Feature" ) << QStringLiteral( "Canvas" ), QString() );
314321
insertRow( pos++, QgsAction::OpenUrl, tr( "Search on web based on attribute's value" ), QStringLiteral( "http://www.google.com/search?q=[% \"ATTRIBUTE\" %]" ), QLatin1String( "" ), false, tr( "Search Web" ), QSet<QString>() << QStringLiteral( "Field" ), QString() );
315322
insertRow( pos++, QgsAction::GenericPython, tr( "List feature ids" ), QStringLiteral( "from qgis.PyQt import QtWidgets\n\nlayer = QgsProject.instance().mapLayer('[% @layer_id %]')\nif layer.selectedFeatureCount():\n ids = layer.selectedFeatureIds()\nelse:\n ids = [f.id() for f in layer.getFeatures()]\n\nQtWidgets.QMessageBox.information(None, \"Feature ids\", ', '.join([str(id) for id in ids]))" ), QLatin1String( "" ), false, tr( "List feature ids" ), QSet<QString>() << QStringLiteral( "Layer" ), QString() );
316-
insertRow( pos++, QgsAction::GenericPython, tr( "Duplicate selected features" ), QStringLiteral( "project = QgsProject.instance()\nlayer = QgsProject.instance().mapLayer('[% @layer_id %]')\nlayer.startEditing()\nfeatures=[]\nif len('[% $id %]')>0:\n features.append( layer.getFeature( [% $id %] ) )\nelse:\n for x in layer.selectedFeatures():\n features.append( x )\nfeature_count=0\nchildren_info=''\nfeatureids=[]\nfor f in features:\n result=QgsVectorLayerUtils.duplicateFeature(layer, f, project, 0 )\n featureids.append( result[0].id() )\n feature_count+=1\n for ch_layer in result[1].layers():\n children_info+='{number_of_children} children on layer {children_layer}\\n'.format( number_of_children=str( len( result[1].duplicatedFeatures(ch_layer) ) ), children_layer=ch_layer.name() )\n ch_layer.selectByIds( result[1].duplicatedFeatures(ch_layer) )\nlayer.selectByIds( featureids )\nqgis.utils.iface.messageBar().pushMessage( '{number_of_features} features on layer {layer} duplicated with\\n{children_info}'.format( number_of_features=str( feature_count ), layer=layer.name(), children_info=children_info ) )" ), QLatin1String( "" ), false, tr( "Duplicate selected" ), QSet<QString>() << QStringLiteral( "Layer" ), QString() );
323+
insertRow( pos++, QgsAction::GenericPython, tr( "Duplicate selected features" ), QStringLiteral( "project = QgsProject.instance()\nlayer = QgsProject.instance().mapLayer('[% @layer_id %]')\nif not layer.isEditable():\n qgis.utils.iface.messageBar().pushMessage( 'Cannot duplicate feature in not editable mode on layer {layer}'.format( layer=layer.name() ) )\nelse:\n features=[]\n if len('[% $id %]')>0:\n features.append( layer.getFeature( [% $id %] ) )\n else:\n for x in layer.selectedFeatures():\n features.append( x )\n feature_count=0\n children_info=''\n featureids=[]\n for f in features:\n result=QgsVectorLayerUtils.duplicateFeature(layer, f, project, 0 )\n featureids.append( result[0].id() )\n feature_count+=1\n for ch_layer in result[1].layers():\n children_info+='{number_of_children} children on layer {children_layer}\\n'.format( number_of_children=str( len( result[1].duplicatedFeatures(ch_layer) ) ), children_layer=ch_layer.name() )\n ch_layer.selectByIds( result[1].duplicatedFeatures(ch_layer) )\n layer.selectByIds( featureids )\n qgis.utils.iface.messageBar().pushMessage( '{number_of_features} features on layer {layer} duplicated with\\n{children_info}'.format( number_of_features=str( feature_count ), layer=layer.name(), children_info=children_info ) )" ), QLatin1String( "" ), false, tr( "Duplicate selected" ), QSet<QString>() << QStringLiteral( "Layer" ), QString(), true );
317324

318325
}
319326

@@ -330,6 +337,7 @@ void QgsAttributeActionDialog::itemDoubleClicked( QTableWidgetItem *item )
330337
mAttributeActionTable->item( row, Capture )->checkState() == Qt::Checked,
331338
mAttributeActionTable->item( row, ActionScopes )->data( Qt::UserRole ).value<QSet<QString>>(),
332339
mAttributeActionTable->item( row, NotificationMessage )->text(),
340+
mAttributeActionTable->item( row, EnabledOnlyWhenEditable )->checkState() == Qt::Checked,
333341
mLayer
334342
);
335343

@@ -344,6 +352,7 @@ void QgsAttributeActionDialog::itemDoubleClicked( QTableWidgetItem *item )
344352
mAttributeActionTable->item( row, ActionText )->setText( actionProperties.actionText() );
345353
mAttributeActionTable->item( row, Capture )->setCheckState( actionProperties.capture() ? Qt::Checked : Qt::Unchecked );
346354
mAttributeActionTable->item( row, NotificationMessage )->setText( actionProperties.notificationMessage() );
355+
mAttributeActionTable->item( row, EnabledOnlyWhenEditable )->setCheckState( actionProperties.isEnabledOnlyWhenEditable() ? Qt::Checked : Qt::Unchecked );
347356

348357
QTableWidgetItem *item = mAttributeActionTable->item( row, ActionScopes );
349358
QStringList actionScopes = actionProperties.actionScopes().toList();

‎src/app/qgsattributeactiondialog.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,8 @@ class APP_EXPORT QgsAttributeActionDialog: public QWidget, private Ui::QgsAttrib
4444
ActionText,
4545
Capture,
4646
ActionScopes,
47-
NotificationMessage
47+
NotificationMessage,
48+
EnabledOnlyWhenEditable
4849
};
4950

5051
public:
@@ -70,7 +71,7 @@ class APP_EXPORT QgsAttributeActionDialog: public QWidget, private Ui::QgsAttrib
7071

7172
private:
7273
void insertRow( int row, const QgsAction &action );
73-
void insertRow( int row, QgsAction::ActionType type, const QString &name, const QString &actionText, const QString &iconPath, bool capture, const QString &shortTitle, const QSet<QString> &actionScopes, const QString &notificationMessage );
74+
void insertRow( int row, QgsAction::ActionType type, const QString &name, const QString &actionText, const QString &iconPath, bool capture, const QString &shortTitle, const QSet<QString> &actionScopes, const QString &notificationMessage, const bool isEnabledOnlyWhenEditable = false );
7475
void swapRows( int row1, int row2 );
7576
QgsAction rowToAction( int row ) const;
7677

‎src/app/qgsattributeactionpropertiesdialog.cpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
#include <QFileDialog>
3232
#include <QImageWriter>
3333

34-
QgsAttributeActionPropertiesDialog::QgsAttributeActionPropertiesDialog( QgsAction::ActionType type, const QString &description, const QString &shortTitle, const QString &iconPath, const QString &actionText, bool capture, const QSet<QString> &actionScopes, const QString &notificationMessage, QgsVectorLayer *layer, QWidget *parent )
34+
QgsAttributeActionPropertiesDialog::QgsAttributeActionPropertiesDialog( QgsAction::ActionType type, const QString &description, const QString &shortTitle, const QString &iconPath, const QString &actionText, bool capture, const QSet<QString> &actionScopes, const QString &notificationMessage, bool isEnabledOnlyWhenEditable, QgsVectorLayer *layer, QWidget *parent )
3535
: QDialog( parent )
3636
, mLayer( layer )
3737
{
@@ -45,6 +45,7 @@ QgsAttributeActionPropertiesDialog::QgsAttributeActionPropertiesDialog( QgsActio
4545
mActionText->setText( actionText );
4646
mCaptureOutput->setChecked( capture );
4747
mNotificationMessage->setText( notificationMessage );
48+
mIsEnabledOnlyWhenEditable->setChecked( isEnabledOnlyWhenEditable );
4849

4950
init( actionScopes );
5051
}
@@ -107,6 +108,10 @@ QString QgsAttributeActionPropertiesDialog::notificationMessage() const
107108
return mNotificationMessage->text();
108109
}
109110

111+
bool QgsAttributeActionPropertiesDialog::isEnabledOnlyWhenEditable() const
112+
{
113+
return mIsEnabledOnlyWhenEditable->isChecked();
114+
}
110115

111116
bool QgsAttributeActionPropertiesDialog::capture() const
112117
{

‎src/app/qgsattributeactionpropertiesdialog.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ class QgsAttributeActionPropertiesDialog: public QDialog, private Ui::QgsAttribu
2828
Q_OBJECT
2929

3030
public:
31-
QgsAttributeActionPropertiesDialog( QgsAction::ActionType type, const QString &description, const QString &shortTitle, const QString &iconPath, const QString &actionText, bool capture, const QSet<QString> &actionScopes, const QString &notificationMessage, QgsVectorLayer *layer, QWidget *parent = nullptr );
31+
QgsAttributeActionPropertiesDialog( QgsAction::ActionType type, const QString &description, const QString &shortTitle, const QString &iconPath, const QString &actionText, bool capture, const QSet<QString> &actionScopes, const QString &notificationMessage, bool isEnabledOnlyWhenEditable, QgsVectorLayer *layer, QWidget *parent = nullptr );
3232

3333
QgsAttributeActionPropertiesDialog( QgsVectorLayer *layer, QWidget *parent = nullptr );
3434

@@ -46,6 +46,8 @@ class QgsAttributeActionPropertiesDialog: public QDialog, private Ui::QgsAttribu
4646

4747
QString notificationMessage() const;
4848

49+
bool isEnabledOnlyWhenEditable() const;
50+
4951
bool capture() const;
5052

5153
QgsExpressionContext createExpressionContext() const override;

‎src/app/qgsattributetabledialog.cpp

Lines changed: 23 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -333,25 +333,6 @@ QgsAttributeTableDialog::QgsAttributeTableDialog( QgsVectorLayer *layer, QgsAttr
333333
mActionSearchForm->setToolTip( tr( "Search is not supported when using custom UI forms" ) );
334334
}
335335

336-
QList<QgsAction> actions = mLayer->actions()->actions( QStringLiteral( "Layer" ) );
337-
338-
if ( actions.isEmpty() )
339-
{
340-
mActionFeatureActions->setVisible( false );
341-
}
342-
else
343-
{
344-
QMenu *actionMenu = new QMenu();
345-
Q_FOREACH ( const QgsAction &action, actions )
346-
{
347-
QAction *qAction = actionMenu->addAction( action.icon(), action.shortTitle() );
348-
qAction->setToolTip( action.name() );
349-
qAction->setData( QVariant::fromValue<QgsAction>( action ) );
350-
connect( qAction, &QAction::triggered, this, &QgsAttributeTableDialog::layerActionTriggered );
351-
}
352-
mActionFeatureActions->setMenu( actionMenu );
353-
}
354-
355336
editingToggled();
356337
// Close and delete if the layer has been destroyed
357338
connect( mLayer, &QObject::destroyed, this, &QWidget::close );
@@ -857,6 +838,29 @@ void QgsAttributeTableDialog::editingToggled()
857838
}
858839
// not necessary to set table read only if layer is not editable
859840
// because model always reflects actual state when returning item flags
841+
842+
QList<QgsAction> actions = mLayer->actions()->actions( QStringLiteral( "Layer" ) );
843+
844+
if ( actions.isEmpty() )
845+
{
846+
mActionFeatureActions->setVisible( false );
847+
}
848+
else
849+
{
850+
QMenu *actionMenu = new QMenu();
851+
Q_FOREACH ( const QgsAction &action, actions )
852+
{
853+
if ( !mLayer->isEditable() && action.isEnabledOnlyWhenEditable() )
854+
continue;
855+
856+
QAction *qAction = actionMenu->addAction( action.icon(), action.shortTitle() );
857+
qAction->setToolTip( action.name() );
858+
qAction->setData( QVariant::fromValue<QgsAction>( action ) );
859+
connect( qAction, &QAction::triggered, this, &QgsAttributeTableDialog::layerActionTriggered );
860+
}
861+
mActionFeatureActions->setMenu( actionMenu );
862+
}
863+
860864
}
861865

862866
void QgsAttributeTableDialog::mActionAddAttribute_triggered()

‎src/app/qgsfeatureaction.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,9 @@ QgsAttributeDialog *QgsFeatureAction::newDialog( bool cloneFeature )
8282
if ( !action.runable() )
8383
continue;
8484

85+
if ( !mLayer->isEditable() && action.isEnabledOnlyWhenEditable() )
86+
continue;
87+
8588
QgsFeature &feat = const_cast<QgsFeature &>( *dialog->feature() );
8689
QgsFeatureAction *a = new QgsFeatureAction( action.name(), feat, mLayer, action.id(), -1, dialog );
8790
dialog->addAction( a );

‎src/app/qgsidentifyresultsdialog.cpp

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -511,6 +511,9 @@ void QgsIdentifyResultsDialog::addFeature( QgsVectorLayer *vlayer, const QgsFeat
511511
if ( !action.runable() )
512512
continue;
513513

514+
if ( action.isEnabledOnlyWhenEditable() )
515+
continue;
516+
514517
QTreeWidgetItem *twi = new QTreeWidgetItem( QStringList() << QLatin1String( "" ) << action.name() );
515518
twi->setIcon( 0, QgsApplication::getThemeIcon( QStringLiteral( "/mAction.svg" ) ) );
516519
twi->setData( 0, Qt::UserRole, "action" );
@@ -521,6 +524,9 @@ void QgsIdentifyResultsDialog::addFeature( QgsVectorLayer *vlayer, const QgsFeat
521524
//add actions from QgsMapLayerActionRegistry
522525
for ( int i = 0; i < registeredActions.size(); i++ )
523526
{
527+
if ( registeredActions.at( i )->isEnabledOnlyWhenEditable() )
528+
continue;
529+
524530
QgsMapLayerAction *action = registeredActions.at( i );
525531
QTreeWidgetItem *twi = new QTreeWidgetItem( QStringList() << QLatin1String( "" ) << action->text() );
526532
twi->setIcon( 0, QgsApplication::getThemeIcon( QStringLiteral( "/mAction.svg" ) ) );
@@ -1092,6 +1098,9 @@ void QgsIdentifyResultsDialog::contextMenuEvent( QContextMenuEvent *event )
10921098
if ( !action.runable() )
10931099
continue;
10941100

1101+
if ( action.isEnabledOnlyWhenEditable() )
1102+
continue;
1103+
10951104
QgsFeatureAction *a = new QgsFeatureAction( action.name(), mFeatures[ featIdx ], vlayer, action.id(), idx, this );
10961105
mActionPopup->addAction( QgsApplication::getThemeIcon( QStringLiteral( "/mAction.svg" ) ), action.name(), a, SLOT( execute() ) );
10971106
}
@@ -1110,9 +1119,12 @@ void QgsIdentifyResultsDialog::contextMenuEvent( QContextMenuEvent *event )
11101119

11111120
int featIdx = featItem->data( 0, Qt::UserRole + 1 ).toInt();
11121121

1113-
QList<QgsMapLayerAction *>::iterator actionIt;
1122+
QList<QgsMapLayerAction *>::const_iterator actionIt;
11141123
for ( actionIt = registeredActions.begin(); actionIt != registeredActions.end(); ++actionIt )
11151124
{
1125+
if ( ( *actionIt )->isEnabledOnlyWhenEditable() )
1126+
continue;
1127+
11161128
QgsIdentifyResultsDialogMapLayerAction *a = new QgsIdentifyResultsDialogMapLayerAction( ( *actionIt )->text(), this, ( *actionIt ), vlayer, &( mFeatures[ featIdx ] ) );
11171129
mActionPopup->addAction( QgsApplication::getThemeIcon( QStringLiteral( "/mAction.svg" ) ), ( *actionIt )->text(), a, SLOT( execute() ) );
11181130
}

0 commit comments

Comments
 (0)
Please sign in to comment.