[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    [kdevelop/5.3] plugins/externalscript: Fix removal of external scripts
From:       Amish Naidu <null () kde ! org>
Date:       2018-09-28 14:58:46
Message-ID: E1g5uEA-0007Tt-1c () code ! kde ! org
[Download RAW message or body]

Git commit cef296113612ae72e561a1300d0622a46fcf1906 by Amish Naidu.
Committed on 28/09/2018 at 14:58.
Pushed by anaidu into branch '5.3'.

Fix removal of external scripts

Summary:
Previously, deleting a script which is in the middle of the config would \
invalidate indices of the scripts that come after it in the config, this \
would mean deleting anything later deletes the wrong script.

The config labels are now stored in the model itself and is no longer based \
on just the index, but on the name of the script. Thus, deleting/updating \
one script does not interfere with the other scripts.

BUG: 385298

Test Plan:
* Before applying the patch:
 - Delete "Google Selection"
 - Restart
 - Delete "Quick Compile"
 - Restart and check list of external scripts

* Apply the patch and repeat.

Reviewers: #kdevelop, flherne

Reviewed By: #kdevelop, flherne

Subscribers: flherne, kdevelop-devel

Tags: #kdevelop

Differential Revision: https://phabricator.kde.org/D15743

M  +11   -0    plugins/externalscript/externalscriptitem.cpp
M  +11   -0    plugins/externalscript/externalscriptitem.h
M  +34   -9    plugins/externalscript/externalscriptplugin.cpp
M  +12   -2    plugins/externalscript/externalscriptplugin.h

https://commits.kde.org/kdevelop/cef296113612ae72e561a1300d0622a46fcf1906

diff --git a/plugins/externalscript/externalscriptitem.cpp \
b/plugins/externalscript/externalscriptitem.cpp index \
                aa1ea3a691..3224e50441 100644
--- a/plugins/externalscript/externalscriptitem.cpp
+++ b/plugins/externalscript/externalscriptitem.cpp
@@ -34,6 +34,17 @@ ExternalScriptItem::ExternalScriptItem()
 {
 }
 
+QString ExternalScriptItem::key() const
+{
+  return m_key;
+}
+
+void ExternalScriptItem::setKey(const QString& key)
+{
+  m_key = key;
+}
+
+
 QString ExternalScriptItem::command() const
 {
   return m_command;
diff --git a/plugins/externalscript/externalscriptitem.h \
b/plugins/externalscript/externalscriptitem.h index 192d7c679a..edfafe7e0a \
                100644
--- a/plugins/externalscript/externalscriptitem.h
+++ b/plugins/externalscript/externalscriptitem.h
@@ -33,6 +33,16 @@ class ExternalScriptItem : public QStandardItem
 public:
   ExternalScriptItem();
 
+  /**
+   * The key is supposed to be unique inside the model
+   * @return The key of this script item
+   */
+  QString key() const;
+  /**
+   * Sets the label
+   */
+  void setKey( const QString& key );
+
   /**
    * @return The command to execute.
    */
@@ -198,6 +208,7 @@ public:
    */
   void save() const;
 private:
+  QString m_key;
   QString m_command;
   QString m_workingDirectory;
   SaveMode m_saveMode = SaveNone;
diff --git a/plugins/externalscript/externalscriptplugin.cpp \
b/plugins/externalscript/externalscriptplugin.cpp index \
                d0389586e1..89b70eb7f4 100644
--- a/plugins/externalscript/externalscriptplugin.cpp
+++ b/plugins/externalscript/externalscriptplugin.cpp
@@ -108,6 +108,7 @@ ExternalScriptPlugin::ExternalScriptPlugin( QObject* \
parent, const QVariantList&  KConfigGroup script = config.group( group );
     if ( script.hasKey( "name" ) && script.hasKey( "command" ) ) {
       ExternalScriptItem* item = new ExternalScriptItem;
+      item->setKey( script.name() );
       item->setText( script.readEntry( "name" ) );
       item->setCommand( script.readEntry( "command" ));
       item->setInputMode( static_cast<ExternalScriptItem::InputMode>( \
script.readEntry( "inputMode", 0u ) ) ); @@ -124,8 +125,8 @@ \
ExternalScriptPlugin::ExternalScriptPlugin( QObject* parent, const \
QVariantList&  
   core()->uiController()->addToolView( i18n( "External Scripts" ), \
m_factory );  
-  connect( m_model, &QStandardItemModel::rowsRemoved,
-           this, &ExternalScriptPlugin::rowsRemoved );
+  connect( m_model, &QStandardItemModel::rowsAboutToBeRemoved,
+           this, &ExternalScriptPlugin::rowsAboutToBeRemoved );
   connect( m_model, &QStandardItemModel::rowsInserted,
            this, &ExternalScriptPlugin::rowsInserted );
 
@@ -335,16 +336,18 @@ void \
ExternalScriptPlugin::executeScriptFromContextMenu() const  
 void ExternalScriptPlugin::rowsInserted( const QModelIndex& /*parent*/, \
int start, int end )  {
-  for ( int i = start; i <= end; ++i ) {
-    saveItemForRow( i );
+  setupKeys( start, end );
+  for ( int row = start; row <= end; ++row ) {
+    saveItemForRow( row );
   }
 }
 
-void ExternalScriptPlugin::rowsRemoved( const QModelIndex& /*parent*/, int \
start, int end ) +void ExternalScriptPlugin::rowsAboutToBeRemoved( const \
QModelIndex& /*parent*/, int start, int end )  {
   KConfigGroup config = getConfig();
-  for ( int i = start; i <= end; ++i ) {
-    KConfigGroup child = config.group( QStringLiteral("script %1").arg(i) \
); +  for ( int row = start; row <= end; ++row ) {
+    const ExternalScriptItem* const item = \
static_cast<ExternalScriptItem*>( m_model->item( row ) ); +    KConfigGroup \
                child = config.group( item->key() );
     qCDebug(PLUGIN_EXTERNALSCRIPT) << "removing config group:" << \
child.name();  child.deleteGroup();
   }
@@ -355,7 +358,10 @@ void ExternalScriptPlugin::saveItem( const \
ExternalScriptItem* item )  {
   const QModelIndex index = m_model->indexFromItem( item );
   Q_ASSERT( index.isValid() );
-  saveItemForRow( index.row() );
+
+  getConfig().group( item->key() ).deleteGroup(); // delete the previous \
group +  setupKeys( index.row(), index.row() );
+  saveItemForRow( index.row() ); // save the new group
 }
 
 void ExternalScriptPlugin::saveItemForRow( int row )
@@ -367,7 +373,7 @@ void ExternalScriptPlugin::saveItemForRow( int row )
   Q_ASSERT( item );
 
   qCDebug(PLUGIN_EXTERNALSCRIPT) << "save extern script:" << item << idx;
-  KConfigGroup config = getConfig().group( QStringLiteral("script \
%1").arg( row ) ); +  KConfigGroup config = getConfig().group( item->key() \
);  config.writeEntry( "name", item->text() );
   config.writeEntry( "command", item->command() );
   config.writeEntry( "inputMode", (uint) item->inputMode() );
@@ -380,6 +386,25 @@ void ExternalScriptPlugin::saveItemForRow( int row )
   config.sync();
 }
 
+void ExternalScriptPlugin::setupKeys(int start, int end)
+{
+  QStringList keys = getConfig().groupList();
+
+  for ( int row = start; row <= end; ++row ) {
+    ExternalScriptItem* const item = static_cast<ExternalScriptItem*>( \
m_model->item( row ) ); +
+    int nextSuffix = 2;
+    QString keyCandidate = item->text();
+    for (; keys.contains( keyCandidate ); ++nextSuffix) {
+      keyCandidate = item->text() + QString::number( nextSuffix );
+    }
+
+    qCDebug(PLUGIN_EXTERNALSCRIPT) << "set key" << keyCandidate << "for" \
<< item << item->command(); +    item->setKey(keyCandidate);
+    keys.push_back(keyCandidate);
+  }
+}
+
 #include "externalscriptplugin.moc"
 
 // kate: indent-mode cstyle; space-indent on; indent-width 2; replace-tabs \
                on;
diff --git a/plugins/externalscript/externalscriptplugin.h \
b/plugins/externalscript/externalscriptplugin.h index \
                9276395364..e5ad8c4818 100644
--- a/plugins/externalscript/externalscriptplugin.h
+++ b/plugins/externalscript/externalscriptplugin.h
@@ -68,6 +68,9 @@ public:
    */
   KConfigGroup getConfig() const;
 
+  /**
+   * Saves the @p script to the config and updates the key
+   */
   void saveItem(const ExternalScriptItem* item);
 
 public Q_SLOTS:
@@ -82,9 +85,9 @@ public Q_SLOTS:
    * Executes the command synchronously and returns the output text (Used \
                by the shell-integration)
    * */
   Q_SCRIPTABLE QString executeCommandSync(const QString& command, const \
                QString& workingDirectory) const;
-  
+
 private Q_SLOTS:
-  void rowsRemoved( const QModelIndex& parent, int start, int end );
+  void rowsAboutToBeRemoved( const QModelIndex& parent, int start, int end \
);  void rowsInserted( const QModelIndex& parent, int start, int end );
   void executeScriptFromContextMenu() const;
 
@@ -92,6 +95,13 @@ private:
   /// @param row row in the model for the item to save
   void saveItemForRow( int row );
 
+  /**
+   * Sets up unique keys for items in the range [start, end]
+   * @param start start of the range
+   * @param end end of the range
+   */
+  void setupKeys( int start, int end );
+
   QStandardItemModel* m_model;
   QList<QUrl> m_urls;
   static ExternalScriptPlugin* m_self;


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic