comparison gui/src/VariablesDockWidget.cpp @ 13501:86d6c3b90ad7

Added new gui files.
author Jacob Dawid <jacob.dawid@googlemail.com>
date Sun, 17 Jul 2011 17:45:05 +0200
parents
children 13e3d60aff2d
comparison
equal deleted inserted replaced
13500:40bd465b6c79 13501:86d6c3b90ad7
1 /* Quint - A graphical user interface for Octave
2 * Copyright (C) 2011 Jacob Dawid
3 * jacob.dawid@googlemail.com
4 *
5 * This program is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation, either version 3 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program. If not, see <http://www.gnu.org/licenses/>.
17 */
18
19 #include "VariablesDockWidget.h"
20 #include <QHBoxLayout>
21 #include <QVBoxLayout>
22 #include <QPushButton>
23
24 VariablesDockWidget::VariablesDockWidget(QWidget *parent)
25 : QDockWidget(parent) {
26 setObjectName("VariablesDockWidget");
27 construct();
28 }
29
30 void VariablesDockWidget::construct() {
31 m_updateSemaphore = new QSemaphore(1);
32 QStringList headerLabels;
33 headerLabels << tr("Name") << tr("Type") << tr("Value");
34 m_variablesTreeWidget = new QTreeWidget(this);
35 m_variablesTreeWidget->setHeaderHidden(false);
36 m_variablesTreeWidget->setHeaderLabels(headerLabels);
37 QVBoxLayout *layout = new QVBoxLayout();
38
39 setWindowTitle(tr("Workspace"));
40 setWidget(new QWidget());
41
42 layout->addWidget(m_variablesTreeWidget);
43 QWidget *buttonBar = new QWidget(this);
44 layout->addWidget(buttonBar);
45
46 QHBoxLayout *buttonBarLayout = new QHBoxLayout();
47 QPushButton *saveWorkspaceButton = new QPushButton(tr("Save"), buttonBar);
48 QPushButton *loadWorkspaceButton = new QPushButton(tr("Load"), buttonBar);
49 QPushButton *clearWorkspaceButton = new QPushButton(tr("Clear"), buttonBar);
50 buttonBarLayout->addWidget(saveWorkspaceButton);
51 buttonBarLayout->addWidget(loadWorkspaceButton);
52 buttonBarLayout->addWidget(clearWorkspaceButton);
53 buttonBarLayout->setMargin(2);
54 buttonBar->setLayout(buttonBarLayout);
55
56 layout->setMargin(2);
57 widget()->setLayout(layout);
58
59 connect(saveWorkspaceButton, SIGNAL(clicked()), this, SLOT(emitSaveWorkspace()));
60 connect(loadWorkspaceButton, SIGNAL(clicked()), this, SLOT(emitLoadWorkspace()));
61 connect(clearWorkspaceButton, SIGNAL(clicked()), this, SLOT(emitClearWorkspace()));
62
63 QTreeWidgetItem *treeWidgetItem = new QTreeWidgetItem();
64 treeWidgetItem->setData(0, 0, QString(tr("Local")));
65 m_variablesTreeWidget->insertTopLevelItem(0, treeWidgetItem);
66
67 treeWidgetItem = new QTreeWidgetItem();
68 treeWidgetItem->setData(0, 0, QString(tr("Global")));
69 m_variablesTreeWidget->insertTopLevelItem(1, treeWidgetItem);
70
71 treeWidgetItem = new QTreeWidgetItem();
72 treeWidgetItem->setData(0, 0, QString(tr("Persistent")));
73 m_variablesTreeWidget->insertTopLevelItem(2, treeWidgetItem);
74
75 treeWidgetItem = new QTreeWidgetItem();
76 treeWidgetItem->setData(0, 0, QString(tr("Hidden")));
77 m_variablesTreeWidget->insertTopLevelItem(3, treeWidgetItem);
78
79 m_variablesTreeWidget->expandAll();
80 m_variablesTreeWidget->setAlternatingRowColors(true);
81 m_variablesTreeWidget->setAnimated(true);
82 }
83
84 void VariablesDockWidget::updateTreeEntry(QTreeWidgetItem *treeItem, SymbolRecord symbolRecord) {
85 treeItem->setData(0, 0, QString(symbolRecord.name().c_str()));
86 treeItem->setData(1, 0, QString(symbolRecord.varval().type_name().c_str()));
87 treeItem->setData(2, 0, OctaveLink::octaveValueAsQString(symbolRecord.varval()));
88 }
89
90 void VariablesDockWidget::setVariablesList(QList<SymbolRecord> symbolTable) {
91 m_updateSemaphore->acquire();
92 // Split the symbol table into its different scopes.
93 QList<SymbolRecord> localSymbolTable;
94 QList<SymbolRecord> globalSymbolTable;
95 QList<SymbolRecord> persistentSymbolTable;
96 QList<SymbolRecord> hiddenSymbolTable;
97
98 foreach(SymbolRecord symbolRecord, symbolTable) {
99 // It's true that being global or hidden includes it's can mean it's also locally visible,
100 // but we want to distinguish that here.
101 if(symbolRecord.is_local() && !symbolRecord.is_global() && !symbolRecord.is_hidden()) {
102 localSymbolTable.append(symbolRecord);
103 }
104
105 if(symbolRecord.is_global()) {
106 globalSymbolTable.append(symbolRecord);
107 }
108
109 if(symbolRecord.is_persistent()) {
110 persistentSymbolTable.append(symbolRecord);
111 }
112
113 if(symbolRecord.is_hidden()) {
114 hiddenSymbolTable.append(symbolRecord);
115 }
116 }
117
118 updateScope(0, localSymbolTable);
119 updateScope(1, globalSymbolTable);
120 updateScope(2, persistentSymbolTable);
121 updateScope(3, hiddenSymbolTable);
122 m_updateSemaphore->release();
123 }
124
125 void VariablesDockWidget::updateScope(int topLevelItemIndex, QList<SymbolRecord> symbolTable) {
126 // This method may be a little bit confusing; variablesList is a complete list of all
127 // variables that are in the workspace currently.
128 QTreeWidgetItem *topLevelItem = m_variablesTreeWidget->topLevelItem(topLevelItemIndex);
129
130 // First we check, if any variables that exist in the model tree have to be updated
131 // or created. So we walk the variablesList check against the tree.
132 foreach(SymbolRecord symbolRecord, symbolTable) {
133 int childCount = topLevelItem->childCount();
134 bool alreadyExists = false;
135 QTreeWidgetItem *child;
136
137 // Search for the corresponding item in the tree. If it has been found, child
138 // will contain the appropriate QTreeWidgetItem* pointing at it.
139 for(int i = 0; i < childCount; i++) {
140 child = topLevelItem->child(i);
141 if(child->data(0, 0).toString() == QString(symbolRecord.name().c_str())) {
142 alreadyExists = true;
143 break;
144 }
145 }
146
147 // If it already exists, just update it.
148 if(alreadyExists) {
149 updateTreeEntry(child, symbolRecord);
150 } else {
151 // It does not exist, so create a new one and set the right values.
152 child = new QTreeWidgetItem();
153 updateTreeEntry(child, symbolRecord);
154 topLevelItem->addChild(child);
155 }
156 }
157
158 // Check the tree against the list for deleted variables.
159 for(int i = 0; i < topLevelItem->childCount(); i++) {
160 bool existsInVariableList = false;
161 QTreeWidgetItem *child = topLevelItem->child(i);
162 foreach(SymbolRecord symbolRecord, symbolTable) {
163 if(QString(symbolRecord.name().c_str()) == child->data(0, 0).toString()) {
164 existsInVariableList = true;
165 }
166 }
167
168 if(!existsInVariableList) {
169 topLevelItem->removeChild(child);
170 delete child;
171 i--;
172 }
173 }
174 }
175
176 void VariablesDockWidget::emitSaveWorkspace() {
177 emit saveWorkspace();
178 }
179
180 void VariablesDockWidget::emitLoadWorkspace() {
181 emit loadWorkspace();
182 }
183
184 void VariablesDockWidget::emitClearWorkspace() {
185 emit clearWorkspace();
186 }