aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--OrbitingYeti.pro16
-rw-r--r--forms/mainwindow.ui12
-rw-r--r--forms/painter.ui21
-rw-r--r--forms/statementdialog.ui106
-rw-r--r--include/debugtools.h4
-rw-r--r--include/diagram/branch.h (renamed from include/diagram/branchstatement.h)6
-rw-r--r--include/diagram/iterator.h (renamed from include/diagram/iteratorstatement.h)4
-rw-r--r--include/diagram/scope.h11
-rw-r--r--include/diagram/statement.h6
-rw-r--r--include/io/serializer.h4
-rw-r--r--include/ui/painter.h26
-rw-r--r--include/ui/statementdialog.h22
-rw-r--r--src/diagram/branch.cpp (renamed from src/diagram/branchstatement.cpp)4
-rw-r--r--src/diagram/iterator.cpp (renamed from src/diagram/iteratorstatement.cpp)4
-rw-r--r--src/diagram/scope.cpp47
-rw-r--r--src/diagram/statement.cpp41
-rw-r--r--src/io/serializer.cpp31
-rw-r--r--src/ui/mainwindow.cpp22
-rw-r--r--src/ui/painter.cpp60
-rw-r--r--src/ui/statementdialog.cpp14
20 files changed, 391 insertions, 70 deletions
diff --git a/OrbitingYeti.pro b/OrbitingYeti.pro
index 7351c0c..1821c44 100644
--- a/OrbitingYeti.pro
+++ b/OrbitingYeti.pro
@@ -27,28 +27,30 @@ INCLUDEPATH += include
SOURCES += \
src/main.cpp \
src/ui/mainwindow.cpp \
- src/diagram/branchstatement.cpp \
- src/diagram/iteratorstatement.cpp \
src/diagram/scope.cpp \
src/diagram/statement.cpp \
src/diagram/structogram.cpp \
src/ui/metadatadialog.cpp \
src/ui/painter.cpp \
- src/io/serializer.cpp
+ src/io/serializer.cpp \
+ src/ui/statementdialog.cpp \
+ src/diagram/branch.cpp \
+ src/diagram/iterator.cpp
HEADERS += \
include/ui/mainwindow.h \
include/diagram/structogram.h \
include/diagram/statement.h \
include/diagram/scope.h \
- include/diagram/iteratorstatement.h \
- include/diagram/branchstatement.h \
include/ui/metadatadialog.h \
include/ui/painter.h \
include/debugtools.h \
- include/io/serializer.h
+ include/io/serializer.h \
+ include/ui/statementdialog.h \
+ include/diagram/branch.h \
+ include/diagram/iterator.h
FORMS += \
forms/mainwindow.ui \
forms/metadatadialog.ui \
- forms/painter.ui
+ forms/statementdialog.ui
diff --git a/forms/mainwindow.ui b/forms/mainwindow.ui
index 23125a1..816ae01 100644
--- a/forms/mainwindow.ui
+++ b/forms/mainwindow.ui
@@ -130,7 +130,7 @@
</layout>
</item>
<item>
- <widget class="QWidget" name="widget" native="true">
+ <widget class="Painter" name="painter" native="true">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
<horstretch>0</horstretch>
@@ -149,7 +149,7 @@
<x>0</x>
<y>0</y>
<width>824</width>
- <height>28</height>
+ <height>29</height>
</rect>
</property>
<widget class="QMenu" name="menuFIle">
@@ -335,6 +335,14 @@
</property>
</action>
</widget>
+ <customwidgets>
+ <customwidget>
+ <class>Painter</class>
+ <extends>QWidget</extends>
+ <header>ui/painter.h</header>
+ <container>1</container>
+ </customwidget>
+ </customwidgets>
<resources/>
<connections>
<connection>
diff --git a/forms/painter.ui b/forms/painter.ui
deleted file mode 100644
index 1978a7c..0000000
--- a/forms/painter.ui
+++ /dev/null
@@ -1,21 +0,0 @@
-<ui version="4.0">
- <author/>
- <comment/>
- <exportmacro/>
- <class>Painter</class>
- <widget name="Painter" class="QWidget">
- <property name="geometry">
- <rect>
- <x>0</x>
- <y>0</y>
- <width>400</width>
- <height>300</height>
- </rect>
- </property>
- <property name="windowTitle">
- <string>Form</string>
- </property>
- </widget>
- <pixmapfunction/>
- <connections/>
-</ui>
diff --git a/forms/statementdialog.ui b/forms/statementdialog.ui
new file mode 100644
index 0000000..d4e4fd9
--- /dev/null
+++ b/forms/statementdialog.ui
@@ -0,0 +1,106 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>StatementDialog</class>
+ <widget class="QDialog" name="StatementDialog">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>400</width>
+ <height>300</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>Dialog</string>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout">
+ <item>
+ <widget class="QLabel" name="statementLabel">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Statement Type</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QComboBox" name="comboBox">
+ <item>
+ <property name="text">
+ <string>Process</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Decision</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Switch</string>
+ </property>
+ </item>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="textLabel">
+ <property name="text">
+ <string>Text</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPlainTextEdit" name="plainTextEdit"/>
+ </item>
+ <item>
+ <widget class="QDialogButtonBox" name="buttonBox">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="standardButtons">
+ <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <resources/>
+ <connections>
+ <connection>
+ <sender>buttonBox</sender>
+ <signal>accepted()</signal>
+ <receiver>StatementDialog</receiver>
+ <slot>accept()</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>248</x>
+ <y>254</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>157</x>
+ <y>274</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>buttonBox</sender>
+ <signal>rejected()</signal>
+ <receiver>StatementDialog</receiver>
+ <slot>reject()</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>316</x>
+ <y>260</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>286</x>
+ <y>274</y>
+ </hint>
+ </hints>
+ </connection>
+ </connections>
+</ui>
diff --git a/include/debugtools.h b/include/debugtools.h
index cd6940b..1b34a2e 100644
--- a/include/debugtools.h
+++ b/include/debugtools.h
@@ -3,8 +3,8 @@
#ifdef QT_NO_DEBUG
-void debug_msg(...) {}
-void debug_err(...) {}
+#define debug_msg(msg)
+#define debug_err(msg)
#else
#include <iostream>
diff --git a/include/diagram/branchstatement.h b/include/diagram/branch.h
index 3d8c385..2024d78 100644
--- a/include/diagram/branchstatement.h
+++ b/include/diagram/branch.h
@@ -10,14 +10,14 @@ namespace samb {
/* Implementation for Statement::DECISION, Statement::SWITCH
*/
-class BranchStatement : public Statement
+class Branch : public Statement
{
public:
- BranchStatement(Type t, const QString &condition, pointer next);
+ Branch(Type t, const QString &condition, pointer next);
/* accessors */
std::map<QString, pointer>& branches() { return _branches; }
- std::size_t branches_count() const { return _branchesCount; }
+ std::size_t branchesCount() const { return _branchesCount; }
inline const QString& condition() const { return text(); }
inline void condition(const QString &condition) { return text(condition); }
diff --git a/include/diagram/iteratorstatement.h b/include/diagram/iterator.h
index e7fbba0..71c6a34 100644
--- a/include/diagram/iteratorstatement.h
+++ b/include/diagram/iterator.h
@@ -10,10 +10,10 @@ namespace samb {
/* Implementation for Statement::WHILE Statement::UNTIL
*/
-class IteratorStatement : public Statement
+class Iterator : public Statement
{
public:
- IteratorStatement(Type t, const QString &condition, pointer next);
+ Iterator(Type t, const QString &condition, pointer next);
/* accessors */
Scope& inner() { return _inner; }
diff --git a/include/diagram/scope.h b/include/diagram/scope.h
index 63698dd..8ae7e79 100644
--- a/include/diagram/scope.h
+++ b/include/diagram/scope.h
@@ -22,6 +22,9 @@ public:
explicit iterator(pointer statement);
~iterator();
+ bool operator==(const iterator &other) const;
+ bool operator!=(const iterator &other) const;
+
iterator& operator++();
iterator& operator++(int);
@@ -32,7 +35,7 @@ public:
Statement::pointer _current;
};
- explicit Scope(const QString &label);
+ Scope(const QString &label);
Scope(const QString &label, Statement::pointer first);
virtual ~Scope();
@@ -43,8 +46,10 @@ public:
std::size_t size() const { return _size; }
/* iterator */
- iterator begin() { return iterator(_head); }
- iterator end() { return iterator(_tail); }
+ iterator begin();
+ const iterator begin() const;
+ iterator end();
+ const iterator end() const;
private:
Statement::pointer _head;
diff --git a/include/diagram/statement.h b/include/diagram/statement.h
index 5cce908..1d44d6a 100644
--- a/include/diagram/statement.h
+++ b/include/diagram/statement.h
@@ -26,7 +26,8 @@ namespace samb {
class Statement
{
public:
- using pointer = std::shared_ptr<Statement>;
+// using pointer = std::shared_ptr<Statement>;
+ using pointer = Statement*;
enum Type {
PROCESS,
@@ -40,6 +41,9 @@ public:
const Type type;
+ template<class... Args>
+ static pointer make(Type t, Args&& ...args);
+
Statement(Type t, const QString &text);
Statement(Type t, const QString &text, pointer next);
virtual ~Statement();
diff --git a/include/io/serializer.h b/include/io/serializer.h
index 901d913..e6a9b32 100644
--- a/include/io/serializer.h
+++ b/include/io/serializer.h
@@ -11,8 +11,8 @@ public:
explicit Serializer();
virtual ~Serializer();
- bool write(const samb::Structogram &structogram, QFileInfo into);
- bool load(samb::Structogram &structogram, QFileInfo from);
+ bool write(const samb::Structogram &structogram, const QFileInfo &into);
+ bool load(samb::Structogram &structogram, const QFileInfo &from);
};
#endif // SERIALIZER_H
diff --git a/include/ui/painter.h b/include/ui/painter.h
index df62776..0a2accc 100644
--- a/include/ui/painter.h
+++ b/include/ui/painter.h
@@ -1,11 +1,15 @@
#ifndef PAINTER_H
#define PAINTER_H
-#include <QWidget>
+#include "diagram/statement.h"
+#include "diagram/structogram.h"
-namespace Ui {
-class Painter;
-}
+#include <QWidget>
+#include <QFont>
+#include <QFontMetrics>
+#include <QPaintEvent>
+#include <QPainter>
+#include <QRect>
class Painter : public QWidget
{
@@ -15,8 +19,20 @@ public:
explicit Painter(QWidget *parent = 0);
~Painter();
+ void structogram(samb::Structogram **structogram) { _structogram = structogram; }
+ const samb::Structogram structogram() const { return **_structogram; }
+
+protected:
+ void paintEvent(QPaintEvent *event);
+
private:
- Ui::Painter *_ui;
+ samb::Structogram **_structogram = nullptr;
+ QFont _font;
+ QFontMetrics _fontMetrics;
+
+ int _margin = 10;
+
+ void drawStatement(QPainter &qp, samb::Statement &statement, const QRect &rect);
};
#endif // PAINTER_H
diff --git a/include/ui/statementdialog.h b/include/ui/statementdialog.h
new file mode 100644
index 0000000..658ea53
--- /dev/null
+++ b/include/ui/statementdialog.h
@@ -0,0 +1,22 @@
+#ifndef STATEMENTDIALOG_H
+#define STATEMENTDIALOG_H
+
+#include <QDialog>
+
+namespace Ui {
+class StatementDialog;
+}
+
+class StatementDialog : public QDialog
+{
+ Q_OBJECT
+
+public:
+ explicit StatementDialog(QWidget *parent = 0);
+ ~StatementDialog();
+
+private:
+ Ui::StatementDialog *ui;
+};
+
+#endif // STATEMENTDIALOG_H
diff --git a/src/diagram/branchstatement.cpp b/src/diagram/branch.cpp
index 6511c6c..ccb17de 100644
--- a/src/diagram/branchstatement.cpp
+++ b/src/diagram/branch.cpp
@@ -1,8 +1,8 @@
-#include "diagram/branchstatement.h"
+#include "diagram/branch.h"
using namespace samb;
-BranchStatement::BranchStatement(Type t, const QString &condition, pointer next) :
+Branch::Branch(Type t, const QString &condition, pointer next) :
Statement(t, condition, next)
{
switch (t) {
diff --git a/src/diagram/iteratorstatement.cpp b/src/diagram/iterator.cpp
index a68234b..43085b4 100644
--- a/src/diagram/iteratorstatement.cpp
+++ b/src/diagram/iterator.cpp
@@ -1,8 +1,8 @@
-#include "diagram/iteratorstatement.h"
+#include "diagram/iterator.h"
using namespace samb;
-IteratorStatement::IteratorStatement(Statement::Type t, const QString &condition, Statement::pointer next) :
+Iterator::Iterator(Statement::Type t, const QString &condition, Statement::pointer next) :
Statement(t, condition, next),
_inner("")
{
diff --git a/src/diagram/scope.cpp b/src/diagram/scope.cpp
index b0f56cf..7f64a0d 100644
--- a/src/diagram/scope.cpp
+++ b/src/diagram/scope.cpp
@@ -1,4 +1,5 @@
#include "diagram/scope.h"
+#include "debugtools.h"
using namespace samb;
@@ -7,6 +8,9 @@ using namespace samb;
Scope::iterator::iterator(Statement::pointer statement) :
_current(statement)
{
+ if (_current == nullptr) {
+ debug_err("invalid iterator interating nullptr");
+ }
}
@@ -15,15 +19,24 @@ Scope::iterator::~iterator()
}
+bool Scope::iterator::operator==(const iterator &other) const
+{
+ return *_current == *other;
+}
+
+bool Scope::iterator::operator!=(const iterator &other) const
+{
+ return !(*_current == *other);
+}
+
Scope::iterator& Scope::iterator::operator++()
{
- if (_current->next() == nullptr) {
- // TODO: remove throw
- throw std::logic_error("Statement::iterator::operator++() m_current->next() is nullptr");
+ if (_current->next() != nullptr) {
+ _current = _current->next();
+ } else {
+ // throw std::logic_error("Statement::iterator::operator++() m_current->next() is nullptr");
}
- _current = _current->next();
-
return *this;
}
@@ -39,7 +52,7 @@ Scope::iterator& Scope::iterator::operator++(int)
Statement& Scope::iterator::operator*() const
{
if (_current == nullptr)
- throw std::logic_error("Statement::iterator::operator*() m_current is nullptr");
+ throw std::logic_error("Scope::iterator::operator*() m_current is nullptr");
return *_current;
}
@@ -56,7 +69,7 @@ Scope::Scope(const QString &label) :
Statement(Statement::Type::SCOPE, label, nullptr),
_head(nullptr), _tail(nullptr)
{
-
+ _head = _tail = new Statement(Statement::PROCESS, "");
}
Scope::Scope(const QString &label, Statement::pointer first) :
@@ -92,3 +105,23 @@ Scope::iterator Scope::erase_after(Scope::iterator it)
return it;
}
+
+Scope::iterator Scope::begin()
+{
+ return iterator(_head);
+}
+
+const Scope::iterator Scope::begin() const
+{
+ return begin();
+}
+
+Scope::iterator Scope::end()
+{
+ return iterator(_tail);
+}
+
+const Scope::iterator Scope::end() const
+{
+ return end();
+}
diff --git a/src/diagram/statement.cpp b/src/diagram/statement.cpp
index eae5cd3..7f1109b 100644
--- a/src/diagram/statement.cpp
+++ b/src/diagram/statement.cpp
@@ -1,9 +1,48 @@
#include "diagram/statement.h"
+#include "diagram/branch.h"
+#include "diagram/iterator.h"
+#include "diagram/scope.h"
+
+#include "debugtools.h"
+
using namespace samb;
/* Statement */
+template<class... Args>
+static Statement::pointer make(Statement::Type t, Args&& ...args)
+{
+ Statement::pointer stat;
+
+ switch (t) {
+ case Statement::Type::PROCESS:
+ stat = new Statement(t, args...);
+ break;
+
+ case Statement::Type::DECISION:
+ case Statement::Type::PARALLEL:
+ case Statement::Type::SWITCH:
+ stat = new Branch(t, args...);
+ break;
+
+ case Statement::Type::WHILE:
+ case Statement::Type::UNTIL:
+ stat = new Iterator(t, args...);
+ break;
+
+ case Statement::Type::SCOPE:
+ stat = new Scope(t, args...);
+ break;
+
+ default:
+ debug_err("invalid type");
+ break;
+ }
+
+ return stat;
+}
+
Statement::Statement(Type t, const QString &text) :
type(t), _text(text), _next(nullptr)
{
@@ -21,7 +60,7 @@ Statement::~Statement()
}
-bool Statement::operator==(const Statement& other) const {
+bool Statement::operator==(const Statement &other) const {
// comparison by pointers
return (this == &other);
}
diff --git a/src/io/serializer.cpp b/src/io/serializer.cpp
index 6ebfa44..82e0f5a 100644
--- a/src/io/serializer.cpp
+++ b/src/io/serializer.cpp
@@ -1,4 +1,7 @@
#include "io/serializer.h"
+#include "diagram/statement.h"
+
+#include "debugtools.h"
Serializer::Serializer()
{
@@ -9,3 +12,31 @@ Serializer::~Serializer()
{
}
+
+bool Serializer::write(const samb::Structogram &structogram, const QFileInfo &into)
+{
+ for (auto it = structogram.begin(); it != structogram.end(); ++it) {
+ switch (it->type) {
+ case samb::Statement::Type::PROCESS:
+ break;
+
+ case samb::Statement::Type::DECISION:
+ case samb::Statement::Type::SWITCH:
+ case samb::Statement::Type::PARALLEL:
+ break;
+
+ case samb::Statement::Type::WHILE:
+ case samb::Statement::Type::UNTIL:
+ break;
+
+ case samb::Statement::Type::SCOPE:
+ break;
+
+ default:
+ debug_err("invalid statement type");
+ break;
+ }
+ }
+
+ return true;
+}
diff --git a/src/ui/mainwindow.cpp b/src/ui/mainwindow.cpp
index 5776db7..8b40c1b 100644
--- a/src/ui/mainwindow.cpp
+++ b/src/ui/mainwindow.cpp
@@ -1,9 +1,12 @@
#include "debugtools.h"
#include "ui/metadatadialog.h"
+#include "ui/statementdialog.h"
#include "ui/mainwindow.h"
#include "ui_mainwindow.h"
+#include "diagram/statement.h"
+
#include <iostream>
#include <QMessageBox>
@@ -15,6 +18,7 @@ MainWindow::MainWindow(samb::Structogram *structogram, QWidget *parent) :
_structogram(structogram)
{
_ui->setupUi(this);
+ _ui->painter->structogram(&_structogram);
toolButtonsEnabled((_structogram != nullptr));
}
@@ -53,7 +57,7 @@ void MainWindow::on_openButton_clicked()
return;
QString fileName = QFileDialog::getOpenFileName(this,
- tr("Load diagram"), "", "NS Diagram (*.nsdg);;All Files (*)");
+ tr("Load diagram"), "", tr("NS Diagram (*.nsdg);;All Files (*)"));
if (fileName.isEmpty())
return;
@@ -86,18 +90,24 @@ void MainWindow::on_metadataButton_clicked()
if (_structogram == nullptr)
return;
- MetadataDialog *dialog = new MetadataDialog(this);
- dialog->setMetadata(_structogram->title(), _structogram->author());
+ MetadataDialog dialog(this);
+ dialog.setMetadata(_structogram->title(), _structogram->author());
- if (dialog->exec() == QDialog::Accepted) {
- _structogram->title(dialog->title());
- _structogram->author(dialog->author());
+ if (dialog.exec() == QDialog::Accepted) {
+ _structogram->title(dialog.title());
+ _structogram->author(dialog.author());
}
}
void MainWindow::on_newStatementButton_clicked()
{
+ if (_structogram == nullptr)
+ return;
+
+ StatementDialog dialog(this);
+ if (dialog.exec() == QDialog::Accepted) {
+ }
}
/**** private methods ****/
diff --git a/src/ui/painter.cpp b/src/ui/painter.cpp
index b04e389..74f140e 100644
--- a/src/ui/painter.cpp
+++ b/src/ui/painter.cpp
@@ -1,14 +1,66 @@
#include "ui/painter.h"
-#include "ui_painter.h"
+
+#include "debugtools.h"
+
+#include <cmath>
+
Painter::Painter(QWidget *parent) :
QWidget(parent),
- _ui(new Ui::Painter)
+ _font("Latin Modern Roman"),
+ _fontMetrics(_font)
{
- _ui->setupUi(this);
+ // default font size
+ _font.setPixelSize(15);
}
Painter::~Painter()
{
- delete _ui;
+
+}
+
+void Painter::paintEvent(QPaintEvent *event)
+{
+ Q_UNUSED(event);
+
+ if (_structogram == nullptr) {
+ return;
+ }
+
+ if (*_structogram == nullptr) {
+ return;
+ }
+
+ QPainter qp(this);
+ qp.setFont(_font);
+
+ // TODO default values should not be magic numbers
+ QRect rect(50, 50, 600, 00);
+ for (auto it = (*_structogram)->begin(); it != (*_structogram)->end(); ++it) {
+ drawStatement(qp, *it, rect);
+ rect.setY(rect.y() + rect.height());
+ }
+}
+
+void Painter::drawStatement(QPainter &qp, samb::Statement &statement, const QRect &rect)
+{
+ QRect textRect(rect.x() + _margin,
+ rect.y() + _margin,
+ rect.width() - 2*_margin,
+ rect.height() - 2*_margin);
+
+ int textHeight;
+ if (textRect.width() < _fontMetrics.width(statement.text())) {
+ textHeight = (_fontMetrics.height() + _fontMetrics.lineSpacing()) *
+ (int) ceil(_fontMetrics.width(statement.text()) / (double) textRect.width());
+ } else {
+ textHeight = _fontMetrics.height();
+ }
+
+ if (textRect.height() < textHeight) {
+ debug_msg("painter error, textRect.height() < height");
+ }
+
+ qp.drawRect(rect);
+ qp.drawText(textRect, Qt::AlignVCenter, statement.text());
}
diff --git a/src/ui/statementdialog.cpp b/src/ui/statementdialog.cpp
new file mode 100644
index 0000000..a543f95
--- /dev/null
+++ b/src/ui/statementdialog.cpp
@@ -0,0 +1,14 @@
+#include "include/ui/statementdialog.h"
+#include "ui_statementdialog.h"
+
+StatementDialog::StatementDialog(QWidget *parent) :
+ QDialog(parent),
+ ui(new Ui::StatementDialog)
+{
+ ui->setupUi(this);
+}
+
+StatementDialog::~StatementDialog()
+{
+ delete ui;
+}