diff gui/src/WorkspaceModel.h @ 14664:664f54233c98 gui

Extracted model code from the WorkspaceView and rearranged it in a new model class. * WorkspaceModel.cpp/.h (new class): Model class for the workspace. * WorkspaceView.cpp/.h: Replaced QTreeWidget with QTreeView and removed model code. * OctaveLink.cpp/.h: Removed symbol table semaphore and methods to access the copy of the symbol table, removed copying the symbol table. * src.pro: Added new files to Qt project.
author Jacob Dawid <jacob.dawid@googlemail.com>
date Sun, 20 May 2012 22:05:49 +0200 (2012-05-20)
parents
children 6a6733a55982
line wrap: on
line diff
new file mode 100644
--- /dev/null
+++ b/gui/src/WorkspaceModel.h
@@ -0,0 +1,164 @@
+/* OctaveGUI - A graphical user interface for Octave
+ * Copyright (C) 2011 Jacob Dawid (jacob.dawid@googlemail.com)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef WORKSPACEMODEL_H
+#define WORKSPACEMODEL_H
+
+// Octave includes
+#undef PACKAGE_BUGREPORT
+#undef PACKAGE_NAME
+#undef PACKAGE_STRING
+#undef PACKAGE_TARNAME
+#undef PACKAGE_VERSION
+#undef PACKAGE_URL
+#include "octave/config.h"
+#include "octave/cmd-edit.h"
+#include "octave/error.h"
+#include "octave/file-io.h"
+#include "octave/input.h"
+#include "octave/lex.h"
+#include "octave/load-path.h"
+#include "octave/octave.h"
+#include "octave/oct-hist.h"
+#include "octave/oct-map.h"
+#include "octave/oct-obj.h"
+#include "octave/ops.h"
+#include "octave/ov.h"
+#include "octave/ov-usr-fcn.h"
+#include "octave/symtab.h"
+#include "octave/pt.h"
+#include "octave/pt-eval.h"
+#include "octave/config.h"
+#include "octave/Range.h"
+#include "octave/toplev.h"
+#include "octave/procstream.h"
+#include "octave/sighandlers.h"
+#include "octave/debug.h"
+#include "octave/sysdep.h"
+#include "octave/ov.h"
+#include "octave/unwind-prot.h"
+#include "octave/utils.h"
+#include "octave/variables.h"
+
+// Qt includes
+#include <QAbstractItemModel>
+
+class TreeItem
+{
+public:
+  TreeItem(const QList<QVariant> &data, TreeItem *parent = 0) {
+    _parentItem = parent;
+    _itemData = data;
+  }
+
+  TreeItem(QVariant data = QVariant(), TreeItem *parent = 0) {
+    QList<QVariant> variantList;
+    variantList << data << QVariant() << QVariant();
+    _parentItem = parent;
+    _itemData = variantList;
+  }
+
+  ~TreeItem() {
+    qDeleteAll(_childItems);
+  }
+
+  void insertChildItem(int at, TreeItem *item) {
+    item->_parentItem = this;
+    _childItems.insert(at, item);
+  }
+
+  void addChild(TreeItem *item) {
+    item->_parentItem = this;
+    _childItems.append(item);
+  }
+
+  void removeChild(TreeItem *item) {
+    _childItems.removeAll(item);
+  }
+
+  QVariant data(int column) const
+  {
+    return _itemData.value(column);
+  }
+
+  void setData(int column, QVariant data)
+  {
+    _itemData[column] = data;
+  }
+
+  TreeItem *child(int row) {
+    return _childItems.value(row);
+  }
+
+  int childCount() const {
+    return _childItems.count();
+  }
+
+  int columnCount() const
+  {
+    return _itemData.count();
+  }
+
+  int row() const {
+    if (_parentItem)
+      return _parentItem->_childItems.indexOf(const_cast<TreeItem*>(this));
+
+    return 0;
+  }
+
+  TreeItem *parent()
+  {
+    return _parentItem;
+  }
+
+private:
+  QList<TreeItem*> _childItems;
+  QList<QVariant> _itemData;
+  TreeItem *_parentItem;
+};
+
+class WorkspaceModel : public QAbstractItemModel
+{
+  Q_OBJECT
+
+public:
+  WorkspaceModel(QObject *parent = 0);
+  ~WorkspaceModel();
+
+  QVariant data(const QModelIndex &index, int role) const;
+  Qt::ItemFlags flags(const QModelIndex &index) const;
+  QVariant headerData(int section, Qt::Orientation orientation,
+                      int role = Qt::DisplayRole) const;
+  QModelIndex index(int row, int column,
+                    const QModelIndex &parent = QModelIndex()) const;
+  QModelIndex parent(const QModelIndex &index) const;
+  int rowCount(const QModelIndex &parent = QModelIndex()) const;
+  int columnCount(const QModelIndex &parent = QModelIndex()) const;
+
+  void insertTopLevelItem (int at, TreeItem *treeItem);
+  TreeItem *topLevelItem (int at);
+
+  void updateFromSymbolTable ();
+  void updateTreeEntry (TreeItem * treeItem, symbol_table::symbol_record symbolRecord);
+  void updateCategory (int topLevelItemIndex, QList < symbol_table::symbol_record > symbolTable);
+  QString octaveValueAsQString (octave_value octaveValue);
+
+private:
+  TreeItem *_rootItem;
+};
+
+#endif // WORKSPACEMODEL_H