changeset 13683:25dc40d24a44

Renamed VariablesDockWidget to WorkspaceView and optimized memory footprint for 30%.
author Jacob Dawid <jacob.dawid@googlemail.com>
date Fri, 30 Sep 2011 12:34:37 +0200
parents c0e0625ffd13
children 4eb1247acf8f
files gui/octave-gui.pro gui/src/MainWindow.cpp gui/src/MainWindow.h gui/src/VariablesDockWidget.cpp gui/src/VariablesDockWidget.h gui/src/WorkspaceView.cpp gui/src/WorkspaceView.h gui/src/backend/OctaveCallbackThread.cpp gui/src/backend/OctaveLink.cpp gui/src/backend/OctaveLink.h
diffstat 8 files changed, 61 insertions(+), 89 deletions(-) [+]
line wrap: on
line diff
--- a/gui/octave-gui.pro
+++ b/gui/octave-gui.pro
@@ -67,7 +67,7 @@
 SOURCES +=\
     src/lexer/lexeroctavegui.cpp \
     src/MainWindow.cpp \
-    src/VariablesDockWidget.cpp \
+    src/WorkspaceView.cpp \
     src/HistoryDockWidget.cpp \
     src/FilesDockWidget.cpp \
     src/FileEditorMdiSubWindow.cpp \
@@ -98,7 +98,7 @@
 HEADERS += \
     src/lexer/lexeroctavegui.h \
     src/MainWindow.h \
-    src/VariablesDockWidget.h \
+    src/WorkspaceView.h \
     src/HistoryDockWidget.h \
     src/FilesDockWidget.h \
     src/FileEditorMdiSubWindow.h \
--- a/gui/src/MainWindow.cpp
+++ b/gui/src/MainWindow.cpp
@@ -26,9 +26,8 @@
 #include "FileEditorMdiSubWindow.h"
 #include "ImageViewerMdiSubWindow.h"
 #include "SettingsDialog.h"
-#include "cmd-edit.h"
 
-#define VERSION_STRING "Octave GUI (0.8.4)"
+#define VERSION_STRING "Octave GUI (0.8.5)"
 
 MainWindow::MainWindow (QWidget * parent):QMainWindow (parent)
 {
@@ -278,8 +277,8 @@
   m_centralMdiArea->setViewMode (QMdiArea::TabbedView);
 
   // Setup dockable widgets and the status bar.
-  m_variablesDockWidget = new VariablesDockWidget (this);
-  m_variablesDockWidget->setStatusTip (tr ("View the variables in the active workspace."));
+  m_workspaceView = new WorkspaceView (this);
+  m_workspaceView->setStatusTip (tr ("View the variables in the active workspace."));
   m_historyDockWidget = new HistoryDockWidget (this);
   m_historyDockWidget->setStatusTip (tr ("Browse and search the command history."));
   m_filesDockWidget = new FilesDockWidget (this);
@@ -378,14 +377,14 @@
   connect (aboutOctaveAction, SIGNAL (triggered ()), this, SLOT (showAboutOctave ()));
   connect (aboutQt, SIGNAL (triggered ()), this, SLOT (showAboutQt ()));
 
-  connect (showWorkspaceAction, SIGNAL (toggled (bool)), m_variablesDockWidget, SLOT (setShown (bool)));
-  connect (m_variablesDockWidget, SIGNAL (activeChanged (bool)), showWorkspaceAction, SLOT (setChecked (bool)));
+  connect (showWorkspaceAction, SIGNAL (toggled (bool)), m_workspaceView, SLOT (setShown (bool)));
+  connect (m_workspaceView, SIGNAL (activeChanged (bool)), showWorkspaceAction, SLOT (setChecked (bool)));
   connect (showHistoryAction, SIGNAL (toggled (bool)), m_historyDockWidget, SLOT (setShown (bool)));
   connect (m_historyDockWidget, SIGNAL (activeChanged (bool)), showHistoryAction, SLOT (setChecked (bool)));
   connect (showFileBrowserAction, SIGNAL (toggled (bool)), m_filesDockWidget, SLOT (setShown (bool)));
   connect (m_filesDockWidget, SIGNAL (activeChanged (bool)), showFileBrowserAction, SLOT (setChecked (bool)));
 
-  connect (this, SIGNAL (settingsChanged ()), m_variablesDockWidget, SLOT (noticeSettings ()));
+  connect (this, SIGNAL (settingsChanged ()), m_workspaceView, SLOT (noticeSettings ()));
   connect (this, SIGNAL (settingsChanged ()), m_historyDockWidget, SLOT (noticeSettings ()));
   connect (this, SIGNAL (settingsChanged ()), m_filesDockWidget, SLOT (noticeSettings ()));
 
@@ -399,7 +398,7 @@
   setWindowTitle (QString (VERSION_STRING));
 
   setCentralWidget (m_centralMdiArea);
-  addDockWidget (Qt::LeftDockWidgetArea, m_variablesDockWidget);
+  addDockWidget (Qt::LeftDockWidgetArea, m_workspaceView);
   addDockWidget (Qt::LeftDockWidgetArea, m_historyDockWidget);
   addDockWidget (Qt::RightDockWidgetArea, m_filesDockWidget);
   setStatusBar (m_statusBar);
--- a/gui/src/MainWindow.h
+++ b/gui/src/MainWindow.h
@@ -30,7 +30,7 @@
 #include "ResourceManager.h"
 #include "TerminalView.h"
 #include "OctaveLink.h"
-#include "VariablesDockWidget.h"
+#include "WorkspaceView.h"
 #include "HistoryDockWidget.h"
 #include "FilesDockWidget.h"
 #include "BrowserWidget.h"
@@ -66,10 +66,7 @@
   {
     return m_terminalView;
   }
-  VariablesDockWidget *variablesDockWidget ()
-  {
-    return m_variablesDockWidget;
-  }
+
   HistoryDockWidget *historyDockWidget ()
   {
     return m_historyDockWidget;
@@ -125,7 +122,7 @@
   NonClosableMdiSubWindow *m_ircWidgetSubWindow;
 
   // Dock widgets.
-  VariablesDockWidget *m_variablesDockWidget;
+  WorkspaceView *m_workspaceView;
   HistoryDockWidget *m_historyDockWidget;
   FilesDockWidget *m_filesDockWidget;
 
rename from gui/src/VariablesDockWidget.cpp
rename to gui/src/WorkspaceView.cpp
--- a/gui/src/VariablesDockWidget.cpp
+++ b/gui/src/WorkspaceView.cpp
@@ -15,23 +15,15 @@
  * along with this program. If not, see <http://www.gnu.org/licenses/>.
  */
 
-#include "VariablesDockWidget.h"
+#include "WorkspaceView.h"
 #include <QHBoxLayout>
 #include <QVBoxLayout>
 #include <QPushButton>
 
-VariablesDockWidget::VariablesDockWidget (QWidget * parent):QDockWidget
+WorkspaceView::WorkspaceView (QWidget * parent) : QDockWidget
   (parent)
 {
-  setObjectName ("VariablesDockWidget");
-  construct ();
-
-  connect (OctaveLink::instance(), SIGNAL (symbolTableChanged()), this, SLOT (fetchSymbolTable()));
-}
-
-void
-VariablesDockWidget::construct ()
-{
+  setObjectName ("WorkspaceView");
   setWindowTitle (tr ("Workspace"));
 
   m_updateSemaphore = new QSemaphore (1);
@@ -79,11 +71,12 @@
       "   stop:0.780424 rgba(255, 215, 215, 255)); "
       " } "
       );
+
+  connect (OctaveLink::instance(), SIGNAL (symbolTableChanged()), this, SLOT (fetchSymbolTable()));
 }
 
 void
-VariablesDockWidget::updateTreeEntry (QTreeWidgetItem * treeItem,
-				      SymbolRecord symbolRecord)
+WorkspaceView::updateTreeEntry (QTreeWidgetItem * treeItem, SymbolRecord symbolRecord)
 {
   treeItem->setData (0, 0, QString (symbolRecord.name ().c_str ()));
   treeItem->setData (1, 0,
@@ -94,7 +87,7 @@
 }
 
 void
-VariablesDockWidget::setVariablesList (QList < SymbolRecord > symbolTable)
+WorkspaceView::updateFromSymbolTable (QList < SymbolRecord > symbolTable)
 {
   m_updateSemaphore->acquire ();
   // Split the symbol table into its different scopes.
@@ -108,24 +101,24 @@
     // It's true that being global or hidden includes it's can mean it's also locally visible,
     // but we want to distinguish that here.
     if (symbolRecord.is_local () && !symbolRecord.is_global ()
-	&& !symbolRecord.is_hidden ())
+        && !symbolRecord.is_hidden ())
       {
-	localSymbolTable.append (symbolRecord);
+        localSymbolTable.append (symbolRecord);
       }
 
     if (symbolRecord.is_global ())
       {
-	globalSymbolTable.append (symbolRecord);
+        globalSymbolTable.append (symbolRecord);
       }
 
     if (symbolRecord.is_persistent ())
       {
-	persistentSymbolTable.append (symbolRecord);
+        persistentSymbolTable.append (symbolRecord);
       }
 
     if (symbolRecord.is_hidden ())
       {
-	hiddenSymbolTable.append (symbolRecord);
+        hiddenSymbolTable.append (symbolRecord);
       }
   }
 
@@ -137,8 +130,7 @@
 }
 
 void
-VariablesDockWidget::updateScope (int topLevelItemIndex,
-				  QList < SymbolRecord > symbolTable)
+WorkspaceView::updateScope (int topLevelItemIndex, QList < SymbolRecord > symbolTable)
 {
   // This method may be a little bit confusing; variablesList is a complete list of all
   // variables that are in the workspace currently.
@@ -204,21 +196,23 @@
 }
 
 void
-VariablesDockWidget::fetchSymbolTable ()
+WorkspaceView::fetchSymbolTable ()
 {
-  QList < SymbolRecord > symbolTable = OctaveLink::instance ()->copyCurrentSymbolTable ();
-  setVariablesList (symbolTable);
+  OctaveLink::instance ()->acquireSymbolTable();
+  QList < SymbolRecord > symbolTable = OctaveLink::instance ()->symbolTable();
+  updateFromSymbolTable (symbolTable);
+  OctaveLink::instance ()->releaseSymbolTable();
 }
 
 void
-VariablesDockWidget::handleVisibilityChanged (bool visible)
+WorkspaceView::handleVisibilityChanged (bool visible)
 {
   if (visible)
-    emit activeChanged (true);
+  emit activeChanged (true);
 }
 
 void
-VariablesDockWidget::closeEvent (QCloseEvent *event)
+WorkspaceView::closeEvent (QCloseEvent *event)
 {
   emit activeChanged (false);
   QDockWidget::closeEvent (event);
rename from gui/src/VariablesDockWidget.h
rename to gui/src/WorkspaceView.h
--- a/gui/src/VariablesDockWidget.h
+++ b/gui/src/WorkspaceView.h
@@ -15,37 +15,38 @@
  * along with this program. If not, see <http://www.gnu.org/licenses/>.
  */
 
-#ifndef VARIABLESDOCKWIDGET_H
-#define VARIABLESDOCKWIDGET_H
+#ifndef WORKSPACEVIEW_H
+#define WORKSPACEVIEW_H
 
 #include <QDockWidget>
 #include <QTreeWidget>
 #include <QSemaphore>
 #include "OctaveLink.h"
 
-class VariablesDockWidget:public QDockWidget
+class WorkspaceView:public QDockWidget
 {
   Q_OBJECT
 public:
-  VariablesDockWidget (QWidget * parent = 0);
-  void setVariablesList (QList < SymbolRecord > symbolTable);
+  WorkspaceView (QWidget * parent = 0);
 
 public slots:
   void fetchSymbolTable ();
   void handleVisibilityChanged (bool visible);
+
 signals:
   /** Custom signal that tells if a user has clicke away that dock widget. */
   void activeChanged (bool active);
+
 protected:
   void closeEvent (QCloseEvent *event);
+
 private:
-  void construct ();
-  void updateTreeEntry (QTreeWidgetItem * treeItem,
-			SymbolRecord symbolRecord);
-  void updateScope (int topLevelItemIndex,
-		    QList < SymbolRecord > symbolTable);
+  void updateFromSymbolTable (QList < SymbolRecord > symbolTable);
+  void updateTreeEntry (QTreeWidgetItem * treeItem, SymbolRecord symbolRecord);
+  void updateScope (int topLevelItemIndex, QList < SymbolRecord > symbolTable);
+
   QTreeWidget *m_variablesTreeWidget;
   QSemaphore *m_updateSemaphore;
 };
 
-#endif // VARIABLESDOCKWIDGET_H
+#endif // WORKSPACEVIEW_H
--- a/gui/src/backend/OctaveCallbackThread.cpp
+++ b/gui/src/backend/OctaveCallbackThread.cpp
@@ -39,7 +39,7 @@
   bool running = true;
   while (running)
     {
-      OctaveLink::instance ()->fetchSymbolTable ();
+      OctaveLink::instance ()->emitSymbolTableChanged();
       OctaveLink::instance ()->updateHistoryModel ();
       usleep (500000);
 
--- a/gui/src/backend/OctaveLink.cpp
+++ b/gui/src/backend/OctaveLink.cpp
@@ -114,34 +114,17 @@
   //m_octaveMainThread->wait();
 }
 
-void
-OctaveLink::fetchSymbolTable ()
+QList < SymbolRecord > OctaveLink::symbolTable ()
 {
-  m_symbolTableSemaphore->acquire ();
   m_symbolTableBuffer.clear ();
   std::list < SymbolRecord > allVariables = symbol_table::all_variables ();
   std::list < SymbolRecord >::iterator iterator;
   for (iterator = allVariables.begin (); iterator != allVariables.end ();
        iterator++)
-    m_symbolTableBuffer.append (iterator->dup ());
-  m_symbolTableSemaphore->release ();
-  emit symbolTableChanged ();
+    m_symbolTableBuffer.append (iterator->dup());
+  return m_symbolTableBuffer;
 }
 
-QList < SymbolRecord > OctaveLink::copyCurrentSymbolTable ()
-{
-  QList < SymbolRecord > m_symbolTableCopy;
-
-  // Generate a deep copy of the current symbol table.
-  m_symbolTableSemaphore->acquire ();
-  foreach (SymbolRecord symbolRecord, m_symbolTableBuffer)
-    m_symbolTableCopy.append (symbolRecord.dup ());
-  m_symbolTableSemaphore->release ();
-
-  return m_symbolTableCopy;
-}
-
-
 void
 OctaveLink::updateHistoryModel ()
 {
--- a/gui/src/backend/OctaveLink.h
+++ b/gui/src/backend/OctaveLink.h
@@ -96,6 +96,14 @@
 
   void launchOctave ();
   void terminateOctave ();
+  void acquireSymbolTable () { m_symbolTableSemaphore->acquire (); }
+  void releaseSymbolTable () { m_symbolTableSemaphore->release (); }
+
+  /**
+    * For performance reasons this is not thread safe. Before you use this,
+    * acquire a lock with acquireSymbolTable and releaseSymbolTable.
+    */
+  QList < SymbolRecord > symbolTable ();
 
   /**
     * Returns a copy of the current symbol table buffer.
@@ -103,22 +111,12 @@
     */
   QList < SymbolRecord > copyCurrentSymbolTable ();
 
-  void
-  updateHistoryModel ();
-
-  QStringListModel *
-  historyModel ();
-
-  /**
-    * Updates the current symbol table with new data
-    * from octave.
-    */
-  void
-  fetchSymbolTable ();
+  void updateHistoryModel ();
+  QStringListModel *historyModel ();
+  void emitSymbolTableChanged() { emit symbolTableChanged(); }
 
 signals:
-  void
-  symbolTableChanged ();
+  void symbolTableChanged ();
 
 private:
   OctaveLink ();