summaryrefslogtreecommitdiff
path: root/tikzit
diff options
context:
space:
mode:
authorAleks Kissinger <aleks0@gmail.com>2017-02-03 16:11:29 +0100
committerAleks Kissinger <aleks0@gmail.com>2017-02-03 16:11:29 +0100
commite1756ba69dd626073e22fd0a4f4c5fda42c88829 (patch)
treed79f72a648f89ca9201681b4c5443fceeb8faad9 /tikzit
parentb392859bb192a2e02aec09f2eacf5ecdf44fdfe4 (diff)
drawing grid
Diffstat (limited to 'tikzit')
-rw-r--r--tikzit/src/gui/mainwindow.cpp89
-rw-r--r--tikzit/src/gui/mainwindow.h12
-rw-r--r--tikzit/src/gui/mainwindow.ui184
-rw-r--r--tikzit/src/gui/nodeitem.cpp17
-rw-r--r--tikzit/src/gui/nodeitem.h18
-rw-r--r--tikzit/src/gui/propertypalette.cpp10
-rw-r--r--tikzit/src/gui/tikzscene.cpp78
-rw-r--r--tikzit/src/gui/tikzscene.h21
-rw-r--r--tikzit/src/gui/tikzview.cpp20
-rw-r--r--tikzit/src/gui/tikzview.h22
-rw-r--r--tikzit/src/gui/toolpalette.cpp2
-rw-r--r--tikzit/src/main.cpp6
-rw-r--r--tikzit/tikzit.pro8
-rw-r--r--tikzit/tikzit.pro.user4
14 files changed, 472 insertions, 19 deletions
diff --git a/tikzit/src/gui/mainwindow.cpp b/tikzit/src/gui/mainwindow.cpp
index ef73a20..f7357ec 100644
--- a/tikzit/src/gui/mainwindow.cpp
+++ b/tikzit/src/gui/mainwindow.cpp
@@ -1,23 +1,100 @@
#include "mainwindow.h"
#include "ui_mainwindow.h"
+#include "tikzgraphassembler.h"
#include <QDebug>
+#include <QFile>
+#include <QList>
+#include <QSettings>
+#include <QMessageBox>
+#include <QFileDialog>
+
+int MainWindow::_numWindows = 0;
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
+ _numWindows++;
ui->setupUi(this);
setAttribute(Qt::WA_DeleteOnClose);
- tikzScene = new TikzScene(this);
+ _graph = new Graph(this);
+ tikzScene = new TikzScene(_graph, this);
ui->tikzView->setScene(tikzScene);
- //tikzView = new QGraphicsView(tikzScene);
- //setCentralWidget(tikzView);
- //resize(700, 500);
- // badger?
+ _fileName = "";
+ _pristine = true;
+
+ // initially, the source view should be collapsed
+ QList<int> sz = ui->splitter->sizes();
+ sz[0] = sz[0] + sz[1];
+ sz[1] = 0;
+ ui->splitter->setSizes(sz);
}
MainWindow::~MainWindow()
{
- qDebug() << "~MainWindow";
+ //qDebug() << "~MainWindow";
+}
+
+void MainWindow::open(QString fileName)
+{
+ _fileName = fileName;
+ _pristine = false;
+ QFile file(fileName);
+ QFileInfo fi(file);
+ QSettings settings("tikzit", "tikzit");
+ settings.setValue("previous-file-path", fi.absolutePath());
+
+ if (!file.open(QIODevice::ReadOnly)) {
+ QMessageBox::critical(this, tr("Error"),
+ tr("Could not open file"));
+ return;
+ }
+
+ QTextStream in(&file);
+ QString tikz = in.readAll();
+ file.close();
+
+ ui->tikzSource->setText(tikz);
+
+ Graph *newGraph = new Graph(this);
+ TikzGraphAssembler ass(newGraph);
+ if (ass.parse(tikz)) {
+ statusBar()->showMessage("TiKZ parsed successfully", 2000);
+ tikzScene->setGraph(newGraph);
+ delete _graph;
+ _graph = newGraph;
+ } else {
+ statusBar()->showMessage("Cannot read TiKZ source");
+ delete newGraph;
+ }
+
}
+
+void MainWindow::closeEvent(QCloseEvent *event)
+{
+ //qDebug() << "got close event";
+ QMainWindow::closeEvent(event);
+}
+
+void MainWindow::on_actionOpen_triggered()
+{
+ QSettings settings("tikzit", "tikzit");
+ QString fileName = QFileDialog::getOpenFileName(
+ this,
+ tr("Open File"),
+ settings.value("previous-file-path").toString(),
+ tr("TiKZ Files (*.tikz)"));
+
+ if (!fileName.isEmpty()) {
+ if (_pristine) {
+ open(fileName);
+ } else {
+ MainWindow *w = new MainWindow();
+ w->show();
+ w->open(fileName);
+ }
+ }
+}
+
+
diff --git a/tikzit/src/gui/mainwindow.h b/tikzit/src/gui/mainwindow.h
index d33a89d..f48fd64 100644
--- a/tikzit/src/gui/mainwindow.h
+++ b/tikzit/src/gui/mainwindow.h
@@ -2,6 +2,7 @@
#define MAINWINDOW_H
#include "tikzscene.h"
+#include "graph.h"
#include <QMainWindow>
#include <QGraphicsView>
@@ -17,9 +18,20 @@ class MainWindow : public QMainWindow
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
+
+ void open(QString fileName);
+
+protected:
+ void closeEvent(QCloseEvent *event);
private:
TikzScene *tikzScene;
Ui::MainWindow *ui;
+ Graph *_graph;
+ QString _fileName;
+ bool _pristine;
+ static int _numWindows;
+public slots:
+ void on_actionOpen_triggered();
};
#endif // MAINWINDOW_H
diff --git a/tikzit/src/gui/mainwindow.ui b/tikzit/src/gui/mainwindow.ui
index 6439ee8..a2655e6 100644
--- a/tikzit/src/gui/mainwindow.ui
+++ b/tikzit/src/gui/mainwindow.ui
@@ -32,14 +32,26 @@
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
- <widget class="QGraphicsView" name="tikzView"/>
+ <widget class="TikzView" name="tikzView"/>
<widget class="QTextEdit" name="tikzSource">
+ <property name="font">
+ <font>
+ <family>Courier New</family>
+ <pointsize>10</pointsize>
+ </font>
+ </property>
+ <property name="lineWrapMode">
+ <enum>QTextEdit::NoWrap</enum>
+ </property>
<property name="html">
<string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
-&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'.SF NS Text'; font-size:13pt; font-weight:400; font-style:normal;&quot;&gt;
-&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;Stuff written here&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'Courier New'; font-size:10pt; font-weight:400; font-style:normal;&quot;&gt;
+&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'.SF NS Text'; font-size:13pt;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ </property>
+ <property name="tabStopWidth">
+ <number>20</number>
</property>
</widget>
</widget>
@@ -60,8 +72,44 @@ p, li { white-space: pre-wrap; }
<string>File</string>
</property>
<addaction name="actionNew"/>
+ <addaction name="actionOpen"/>
+ <addaction name="separator"/>
+ <addaction name="actionClose"/>
+ <addaction name="actionSave"/>
+ <addaction name="actionSave_As"/>
+ </widget>
+ <widget class="QMenu" name="menuEdit">
+ <property name="title">
+ <string>Edit</string>
+ </property>
+ <addaction name="actionUndo"/>
+ <addaction name="actionRedo"/>
+ <addaction name="separator"/>
+ <addaction name="actionCut"/>
+ <addaction name="actionCopy"/>
+ <addaction name="actionPase"/>
+ <addaction name="actionDelete"/>
+ <addaction name="separator"/>
+ <addaction name="actionSelect_All"/>
+ <addaction name="actionDeselect_All"/>
+ </widget>
+ <widget class="QMenu" name="menuTikz">
+ <property name="title">
+ <string>Tikz</string>
+ </property>
+ <addaction name="actionParse"/>
+ </widget>
+ <widget class="QMenu" name="menuView">
+ <property name="title">
+ <string>View</string>
+ </property>
+ <addaction name="actionZoom_In"/>
+ <addaction name="actionZoom_Out"/>
</widget>
<addaction name="menuFile"/>
+ <addaction name="menuEdit"/>
+ <addaction name="menuView"/>
+ <addaction name="menuTikz"/>
</widget>
<widget class="QStatusBar" name="statusBar"/>
<action name="actionNew">
@@ -69,8 +117,136 @@ p, li { white-space: pre-wrap; }
<string>New...</string>
</property>
</action>
+ <action name="actionOpen">
+ <property name="text">
+ <string>Open...</string>
+ </property>
+ </action>
+ <action name="actionClose">
+ <property name="text">
+ <string>Close</string>
+ </property>
+ </action>
+ <action name="actionSave">
+ <property name="text">
+ <string>Save</string>
+ </property>
+ </action>
+ <action name="actionSave_As">
+ <property name="text">
+ <string>Save As...</string>
+ </property>
+ </action>
+ <action name="actionUndo">
+ <property name="text">
+ <string>Undo</string>
+ </property>
+ </action>
+ <action name="actionRedo">
+ <property name="text">
+ <string>Redo</string>
+ </property>
+ </action>
+ <action name="actionCut">
+ <property name="text">
+ <string>Cut</string>
+ </property>
+ </action>
+ <action name="actionCopy">
+ <property name="text">
+ <string>Copy</string>
+ </property>
+ </action>
+ <action name="actionPase">
+ <property name="text">
+ <string>Paste</string>
+ </property>
+ </action>
+ <action name="actionDelete">
+ <property name="text">
+ <string>Delete</string>
+ </property>
+ </action>
+ <action name="actionSelect_All">
+ <property name="text">
+ <string>Select All</string>
+ </property>
+ </action>
+ <action name="actionDeselect_All">
+ <property name="text">
+ <string>Deselect All</string>
+ </property>
+ </action>
+ <action name="actionParse">
+ <property name="text">
+ <string>Parse</string>
+ </property>
+ <property name="shortcut">
+ <string>Ctrl+T</string>
+ </property>
+ </action>
+ <action name="actionZoom_In">
+ <property name="text">
+ <string>Zoom In</string>
+ </property>
+ <property name="shortcut">
+ <string>Ctrl+=</string>
+ </property>
+ </action>
+ <action name="actionZoom_Out">
+ <property name="text">
+ <string>Zoom Out</string>
+ </property>
+ <property name="shortcut">
+ <string>Ctrl+-</string>
+ </property>
+ </action>
</widget>
<layoutdefault spacing="6" margin="11"/>
+ <customwidgets>
+ <customwidget>
+ <class>TikzView</class>
+ <extends>QGraphicsView</extends>
+ <header>tikzview.h</header>
+ <slots>
+ <slot>zoomIn()</slot>
+ <slot>zoomOut()</slot>
+ </slots>
+ </customwidget>
+ </customwidgets>
<resources/>
- <connections/>
+ <connections>
+ <connection>
+ <sender>actionZoom_In</sender>
+ <signal>triggered()</signal>
+ <receiver>tikzView</receiver>
+ <slot>zoomIn()</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>-1</x>
+ <y>-1</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>237</x>
+ <y>103</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>actionZoom_Out</sender>
+ <signal>triggered()</signal>
+ <receiver>tikzView</receiver>
+ <slot>zoomOut()</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>-1</x>
+ <y>-1</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>237</x>
+ <y>103</y>
+ </hint>
+ </hints>
+ </connection>
+ </connections>
</ui>
diff --git a/tikzit/src/gui/nodeitem.cpp b/tikzit/src/gui/nodeitem.cpp
new file mode 100644
index 0000000..e817d98
--- /dev/null
+++ b/tikzit/src/gui/nodeitem.cpp
@@ -0,0 +1,17 @@
+#include "nodeitem.h"
+
+#include <QPen>
+#include <QBrush>
+
+NodeItem::NodeItem(Node *node)
+{
+ _node = node;
+ setPen(QPen(Qt::black));
+ setBrush(QBrush(Qt::white));
+ syncPos();
+}
+
+void NodeItem::syncPos()
+{
+ setRect(80*_node->point().x() - 8, -80*_node->point().y() - 8, 16, 16);
+}
diff --git a/tikzit/src/gui/nodeitem.h b/tikzit/src/gui/nodeitem.h
new file mode 100644
index 0000000..60b2c05
--- /dev/null
+++ b/tikzit/src/gui/nodeitem.h
@@ -0,0 +1,18 @@
+#ifndef NODEITEM_H
+#define NODEITEM_H
+
+#include "node.h"
+
+#include <QObject>
+#include <QGraphicsEllipseItem>
+
+class NodeItem : public QGraphicsEllipseItem
+{
+public:
+ NodeItem(Node *node);
+ void syncPos();
+private:
+ Node *_node;
+};
+
+#endif // NODEITEM_H
diff --git a/tikzit/src/gui/propertypalette.cpp b/tikzit/src/gui/propertypalette.cpp
index e3eec17..ea0e90e 100644
--- a/tikzit/src/gui/propertypalette.cpp
+++ b/tikzit/src/gui/propertypalette.cpp
@@ -11,6 +11,11 @@ PropertyPalette::PropertyPalette(QWidget *parent) :
QDockWidget(parent),
ui(new Ui::PropertyPalette)
{
+ setWindowFlags(Qt::Window
+ | Qt::WindowStaysOnTopHint
+ | Qt::CustomizeWindowHint
+ | Qt::WindowTitleHint);
+ //setFocusPolicy(Qt::NoFocus);
ui->setupUi(this);
GraphElementData *d = new GraphElementData();
d->setProperty("key 1", "value 1");
@@ -22,7 +27,10 @@ PropertyPalette::PropertyPalette(QWidget *parent) :
ui->treeView->setModel(d);
QSettings settings("tikzit", "tikzit");
- restoreGeometry(settings.value("property-palette-geometry").toByteArray());
+ QVariant geom = settings.value("property-palette-geometry");
+ if (geom != QVariant()) {
+ restoreGeometry(geom.toByteArray());
+ }
}
PropertyPalette::~PropertyPalette()
diff --git a/tikzit/src/gui/tikzscene.cpp b/tikzit/src/gui/tikzscene.cpp
index 60939dd..11d5a72 100644
--- a/tikzit/src/gui/tikzscene.cpp
+++ b/tikzit/src/gui/tikzscene.cpp
@@ -1,6 +1,82 @@
#include "tikzscene.h"
-TikzScene::TikzScene(QObject *parent) : QGraphicsScene(parent)
+#include <QPen>
+#include <QBrush>
+
+TikzScene::TikzScene(Graph *graph, QObject *parent) :
+ QGraphicsScene(parent), _graph(graph)
+{
+
+}
+
+Graph *TikzScene::graph() const
+{
+ return _graph;
+}
+
+void TikzScene::setGraph(Graph *graph)
+{
+ _graph = graph;
+ graphReplaced();
+}
+
+void TikzScene::graphReplaced()
{
+ foreach (NodeItem *ni, nodeItems) {
+ removeItem(ni);
+ delete ni;
+ }
+ nodeItems.clear();
+
+ QPen blackPen(Qt::black);
+ QBrush redBrush(Qt::red);
+
+ foreach (Node *n, _graph->nodes()) {
+ NodeItem *ni = new NodeItem(n);
+ nodeItems << ni;
+ addItem(ni);
+ }
+}
+
+void TikzScene::drawBackground(QPainter *painter, const QRectF &rect)
+{
+ // draw the grid
+ int step = 10;
+
+ QPen pen;
+ pen.setWidth(2);
+ pen.setCosmetic(true);
+ pen.setColor(QColor(245,245,255));
+
+ painter->setPen(pen);
+ for (int x = step; x < rect.right(); x += step) {
+ if (x % (step * 8) != 0) {
+ painter->drawLine(x, rect.top(), x, rect.bottom());
+ painter->drawLine(-x, rect.top(), -x, rect.bottom());
+ }
+ }
+
+ for (int y = step; y < rect.bottom(); y += step) {
+ if (y % (step * 8) != 0) {
+ painter->drawLine(rect.left(), y, rect.right(), y);
+ painter->drawLine(rect.left(), -y, rect.right(), -y);
+ }
+ }
+
+ pen.setColor(QColor(240,240,245));
+ painter->setPen(pen);
+ for (int x = step*8; x < rect.right(); x += step*8) {
+ painter->drawLine(x, rect.top(), x, rect.bottom());
+ painter->drawLine(-x, rect.top(), -x, rect.bottom());
+ }
+
+ for (int y = step*8; y < rect.bottom(); y += step*8) {
+ painter->drawLine(rect.left(), y, rect.right(), y);
+ painter->drawLine(rect.left(), -y, rect.right(), -y);
+ }
+ pen.setColor(QColor(230,230,240));
+ painter->setPen(pen);
+ painter->drawLine(rect.left(), 0, rect.right(), 0);
+ painter->drawLine(0, rect.top(), 0, rect.bottom());
}
diff --git a/tikzit/src/gui/tikzscene.h b/tikzit/src/gui/tikzscene.h
index dd3cba7..c7039e6 100644
--- a/tikzit/src/gui/tikzscene.h
+++ b/tikzit/src/gui/tikzscene.h
@@ -1,13 +1,32 @@
#ifndef TIKZSCENE_H
#define TIKZSCENE_H
+#include "graph.h"
+#include "nodeitem.h"
+
#include <QWidget>
#include <QGraphicsScene>
+#include <QPainter>
+#include <QRectF>
+#include <QVector>
+#include <QGraphicsEllipseItem>
class TikzScene : public QGraphicsScene
{
+ Q_OBJECT
public:
- TikzScene(QObject *parent);
+ TikzScene(Graph *graph, QObject *parent);
+ Graph *graph() const;
+ void setGraph(Graph *graph);
+public slots:
+ void graphReplaced();
+
+private:
+ Graph *_graph;
+ QVector<NodeItem*> nodeItems;
+
+protected:
+ void drawBackground(QPainter *painter, const QRectF &rect);
};
#endif // TIKZSCENE_H
diff --git a/tikzit/src/gui/tikzview.cpp b/tikzit/src/gui/tikzview.cpp
new file mode 100644
index 0000000..d2a769c
--- /dev/null
+++ b/tikzit/src/gui/tikzview.cpp
@@ -0,0 +1,20 @@
+#include "tikzview.h"
+
+#include <QDebug>
+
+TikzView::TikzView(QWidget *parent) : QGraphicsView(parent)
+{
+ setRenderHint(QPainter::Antialiasing);
+ qDebug() << "TikzView()";
+}
+
+void TikzView::zoomIn()
+{
+ scale(1.6,1.6);
+}
+
+void TikzView::zoomOut()
+{
+ scale(0.625,0.625);
+}
+
diff --git a/tikzit/src/gui/tikzview.h b/tikzit/src/gui/tikzview.h
new file mode 100644
index 0000000..032b9c4
--- /dev/null
+++ b/tikzit/src/gui/tikzview.h
@@ -0,0 +1,22 @@
+#ifndef TIKZVIEW_H
+#define TIKZVIEW_H
+
+#include <QObject>
+#include <QWidget>
+#include <QGraphicsView>
+#include <QPainter>
+#include <QGraphicsItem>
+#include <QStyleOptionGraphicsItem>
+#include <QRectF>
+
+class TikzView : public QGraphicsView
+{
+ Q_OBJECT
+public:
+ explicit TikzView(QWidget *parent = 0);
+public slots:
+ void zoomIn();
+ void zoomOut();
+};
+
+#endif // TIKZVIEW_H
diff --git a/tikzit/src/gui/toolpalette.cpp b/tikzit/src/gui/toolpalette.cpp
index fbbc8fd..61b6cbf 100644
--- a/tikzit/src/gui/toolpalette.cpp
+++ b/tikzit/src/gui/toolpalette.cpp
@@ -3,6 +3,7 @@
#include <QVector>
#include <QLayout>
#include <QVBoxLayout>
+#include <QDebug>
ToolPalette::ToolPalette(QWidget *parent) :
QToolBar(parent)
@@ -38,3 +39,4 @@ ToolPalette::ToolPalette(QWidget *parent) :
addAction(edge);
addAction(crop);
}
+
diff --git a/tikzit/src/main.cpp b/tikzit/src/main.cpp
index 0de5fd8..e004529 100644
--- a/tikzit/src/main.cpp
+++ b/tikzit/src/main.cpp
@@ -6,11 +6,10 @@
#include <QApplication>
+
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
- MainWindow *w = new MainWindow();
- w->show();
ToolPalette *tp = new ToolPalette(new QMainWindow());
tp->show();
@@ -19,5 +18,8 @@ int main(int argc, char *argv[])
PropertyPalette *pp = new PropertyPalette;
pp->show();
+ MainWindow *w = new MainWindow();
+ w->show();
+
return a.exec();
}
diff --git a/tikzit/tikzit.pro b/tikzit/tikzit.pro
index 2e7d463..41bc6a3 100644
--- a/tikzit/tikzit.pro
+++ b/tikzit/tikzit.pro
@@ -38,7 +38,9 @@ SOURCES += src/gui/mainwindow.cpp \
src/data/tikzgraphassembler.cpp \
src/data/graphelementdata.cpp \
src/data/graphelementproperty.cpp \
- src/gui/propertypalette.cpp
+ src/gui/propertypalette.cpp \
+ src/gui/tikzview.cpp \
+ src/gui/nodeitem.cpp
HEADERS += src/gui/mainwindow.h \
src/gui/toolpalette.h \
@@ -50,7 +52,9 @@ HEADERS += src/gui/mainwindow.h \
src/data/graphelementdata.h \
src/data/graphelementproperty.h \
src/gui/propertypalette.h \
- src/data/tikzparserdefs.h
+ src/data/tikzparserdefs.h \
+ src/gui/tikzview.h \
+ src/gui/nodeitem.h
FORMS += src/gui/mainwindow.ui \
src/gui/propertypalette.ui
diff --git a/tikzit/tikzit.pro.user b/tikzit/tikzit.pro.user
index 397eee1..6d72c88 100644
--- a/tikzit/tikzit.pro.user
+++ b/tikzit/tikzit.pro.user
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE QtCreatorProject>
-<!-- Written by QtCreator 4.2.0, 2017-01-21T19:04:54. -->
+<!-- Written by QtCreator 4.2.0, 2017-02-02T17:06:07. -->
<qtcreator>
<data>
<variable>EnvironmentId</variable>
@@ -62,7 +62,7 @@
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Desktop Qt 5.7.1 clang 64bit</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Desktop Qt 5.7.1 clang 64bit</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">qt.57.clang_64_kit</value>
- <value type="int" key="ProjectExplorer.Target.ActiveBuildConfiguration">3</value>
+ <value type="int" key="ProjectExplorer.Target.ActiveBuildConfiguration">0</value>
<value type="int" key="ProjectExplorer.Target.ActiveDeployConfiguration">0</value>
<value type="int" key="ProjectExplorer.Target.ActiveRunConfiguration">0</value>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.0">