diff --git a/shell/settings/environmentgroupmodel.h b/shell/settings/environmentgroupmodel.h --- a/shell/settings/environmentgroupmodel.h +++ b/shell/settings/environmentgroupmodel.h @@ -53,6 +53,7 @@ QVariant headerData( int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override; bool setData( const QModelIndex& idx, const QVariant&, int role = Qt::EditRole) override; void setCurrentGroup( const QString& group ); + bool cloneCurrentGroup( const QString& newGroup ); void loadFromConfig( KConfig* ); void saveToConfig( KConfig* ); QModelIndex addVariable( const QString& var, const QString& value ); diff --git a/shell/settings/environmentgroupmodel.cpp b/shell/settings/environmentgroupmodel.cpp --- a/shell/settings/environmentgroupmodel.cpp +++ b/shell/settings/environmentgroupmodel.cpp @@ -184,6 +184,21 @@ endResetModel(); } +bool EnvironmentGroupModel::cloneCurrentGroup( const QString& newGroup ) +{ + if( newGroup.isEmpty() || groups().contains( newGroup ) ) { + return false; + } + + beginResetModel(); + foreach( const QString &key, m_varsByIndex ) { + variables( newGroup ).insert( key, variables( m_currentGroup ).value( key ) ); + } + m_currentGroup = newGroup; + endResetModel(); + return true; +} + void EnvironmentGroupModel::changeDefaultGroup( const QString& grp ) { if( !grp.isEmpty() ) diff --git a/shell/settings/environmentwidget.h b/shell/settings/environmentwidget.h --- a/shell/settings/environmentwidget.h +++ b/shell/settings/environmentwidget.h @@ -60,6 +60,7 @@ void deleteButtonClicked(); void batchModeEditButtonClicked(); void addGroupClicked(); + void cloneGroupClicked(); void removeGroupClicked(); void activeGroupChanged( int ); void enableDeleteButton(); diff --git a/shell/settings/environmentwidget.cpp b/shell/settings/environmentwidget.cpp --- a/shell/settings/environmentwidget.cpp +++ b/shell/settings/environmentwidget.cpp @@ -56,6 +56,7 @@ ui.variableTable->setModel( topProxyModel ); ui.variableTable->horizontalHeader()->setSectionResizeMode( 1, QHeaderView::Stretch ); ui.addgrpBtn->setIcon(QIcon::fromTheme(QStringLiteral("list-add"))); + ui.clonegrpBtn->setIcon(QIcon::fromTheme(QStringLiteral("edit-clone"))); ui.removegrpBtn->setIcon(QIcon::fromTheme(QStringLiteral("list-remove"))); ui.deleteButton->setIcon(QIcon::fromTheme(QStringLiteral("list-remove"))); ui.deleteButton->setShortcut(Qt::Key_Delete); @@ -66,6 +67,7 @@ connect( ui.batchModeEditButton, &QPushButton::clicked, this, &EnvironmentWidget::batchModeEditButtonClicked ); + connect( ui.clonegrpBtn, &QPushButton::clicked, this, &EnvironmentWidget::cloneGroupClicked ); connect( ui.addgrpBtn, &QPushButton::clicked, this, &EnvironmentWidget::addGroupClicked ); connect( ui.addgrpBtn, &QPushButton::clicked, this, &EnvironmentWidget::changed ); connect( ui.removegrpBtn, &QPushButton::clicked, this, &EnvironmentWidget::removeGroupClicked ); @@ -197,6 +199,21 @@ ui.activeCombo->setCurrentItem( curText ); } +void EnvironmentWidget::cloneGroupClicked() +{ + QString newGroup = ui.activeCombo->currentText(); + if( !groupModel->cloneCurrentGroup( newGroup ) ) { + int id = 1; + newGroup = i18nc("a copy of the existing environment was created", "%1 (Cloned %2)", newGroup, id); + while( !groupModel->cloneCurrentGroup( newGroup.arg( id ) ) ) { + ++id; + } + newGroup = newGroup.arg( id ); + } + ui.activeCombo->addItem( newGroup ); + ui.activeCombo->setCurrentItem( newGroup ); +} + void EnvironmentWidget::removeGroupClicked() { int idx = ui.activeCombo->currentIndex(); diff --git a/shell/settings/environmentwidget.ui b/shell/settings/environmentwidget.ui --- a/shell/settings/environmentwidget.ui +++ b/shell/settings/environmentwidget.ui @@ -41,6 +41,13 @@ + + + Clone Group + + + + Remove Group