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