diff libgui/src/workspace-model.cc @ 16502:45ae1038ee89

allow renaming of variables in workspace viewer * main-window.h, main-window.cc (main_window::handle_rename_variable_request): New function. (main_window::construct_octave_qt_link): Connect _workspace_model::rename_variable to main_window::handle_rename_variable_request. (main_window::rename_variable_callback): New function. * octave-qt-link.h, octave-qt-link.cc (octave_qt_link::do_set_workspace, octave_qt_link::set_workspace_signal): New argument, top_level. Change all uses. * octave-link.h, octave-link.cc (octave_link::post_event): Provide two-argument version. (octave_link::set_workspace, octave_link::do_set_workspace): New argument, top_level. Change all uses. * workspace-model.h, workspace-model.cc (workspace_model::flags): Conditionally add Qt::ItemIsEditable to flags. (workspace_model::data): Also return value for column 0 if it is editable. (workspace_model::setData): Handle setting new values. (workspace_model::_top_level): New data member. (workspace_model::set_workspace): New argument, top_level. (workspace_model::rename_variable): New signal. * workspace-view.h, workspace-view.cc (variable_name_editor): New class. (workspace_view::var_name_editor): New data member. (workspace_view::workspace_view): Initialize it. Set var_name_editor as delegate for column 0. (workspace_view::~workspace_view): Delete var_name_editor. (workspace_view::item_double_clicked): Delete. * symtab.h (symbol_table::rename, symbol_table::do_rename, symbol_table::symbol_record::rename): New functions.
author John W. Eaton <jwe@octave.org>
date Fri, 12 Apr 2013 14:50:56 -0400
parents 079ec7ce60e0
children dbc7018be4be
line wrap: on
line diff
--- a/libgui/src/workspace-model.cc	Fri Apr 12 19:10:32 2013 +0200
+++ b/libgui/src/workspace-model.cc	Fri Apr 12 14:50:56 2013 -0400
@@ -27,8 +27,7 @@
 
 #include <QTreeWidget>
 
-#include "symtab.h"
-#include "variables.h"
+#include "utils.h"
 
 #include "workspace-model.h"
 
@@ -56,10 +55,15 @@
 Qt::ItemFlags
 workspace_model::flags (const QModelIndex& idx) const
 {
-  if (! idx.isValid ())
-    return 0;
+  Qt::ItemFlags retval = 0;
+
+  if (idx.isValid ())
+    retval |= Qt::ItemIsEnabled | Qt::ItemIsSelectable;
 
-  return Qt::ItemIsEnabled | Qt::ItemIsSelectable;
+  if (idx.column () == 0)
+    retval |= Qt::ItemIsEditable;
+
+  return retval;
 }
 
 QVariant
@@ -75,37 +79,73 @@
 QVariant
 workspace_model::data (const QModelIndex& idx, int role) const
 {
-  if (!idx.isValid())
-    return QVariant();
+  QVariant retval;
 
-  if (role != Qt::DisplayRole)
-    return QVariant ();
-
-  switch (idx.column ())
+  if (idx.isValid ()
+      && (role == Qt::DisplayRole
+          || (idx.column () == 0 && role == Qt::EditRole)))
     {
-    case 0:
-      return QVariant(_symbols[idx.row()]);
+      switch (idx.column ())
+        {
+        case 0:
+          retval = QVariant (_symbols[idx.row()]);
+          break;
 
-    case 1:
-      return QVariant(_class_names[idx.row()]);
+        case 1:
+          retval = QVariant (_class_names[idx.row()]);
+          break;
 
-    case 2:
-      return QVariant(_dimensions[idx.row()]);
+        case 2:
+          retval = QVariant (_dimensions[idx.row()]);
+          break;
 
-    case 3:
-      return QVariant(_values[idx.row()]);
+        case 3:
+          retval = QVariant (_values[idx.row()]);
+          break;
+
+        default:
+          break;
+        }
     }
 
-  return QVariant ();
+  return retval;
 }
 
+bool
+workspace_model::setData (const QModelIndex& idx, const QVariant& value,
+                          int role)
+{
+  bool retval = false;
+
+  if (idx.column () == 0 && role == Qt::EditRole)
+    {
+      QString qold_name = _symbols[idx.row()];
+
+      QString qnew_name = value.toString ();
+
+      std::string new_name = qnew_name.toStdString ();
+
+      if (valid_identifier (new_name))
+        {
+          emit rename_variable (qold_name, qnew_name);
+
+          retval = true;
+        }
+    }
+
+  return retval;
+}
+
+
 void
-workspace_model::set_workspace (const QString& scopes,
+workspace_model::set_workspace (bool top_level,
+                                const QString& scopes,
                                 const QStringList& symbols,
                                 const QStringList& class_names,
                                 const QStringList& dimensions,
                                 const QStringList& values)
 {
+  _top_level = top_level;
   _scopes = scopes;
   _symbols = symbols;
   _class_names = class_names;
@@ -129,6 +169,7 @@
 void
 workspace_model::clear_data (void)
 {
+  _top_level = false;
   _scopes = QString ();
   _symbols = QStringList ();
   _class_names = QStringList ();