diff options
-rw-r--r-- | OrbitingYeti.pro | 16 | ||||
-rw-r--r-- | forms/mainwindow.ui | 12 | ||||
-rw-r--r-- | forms/painter.ui | 21 | ||||
-rw-r--r-- | forms/statementdialog.ui | 106 | ||||
-rw-r--r-- | include/debugtools.h | 4 | ||||
-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.h | 11 | ||||
-rw-r--r-- | include/diagram/statement.h | 6 | ||||
-rw-r--r-- | include/io/serializer.h | 4 | ||||
-rw-r--r-- | include/ui/painter.h | 26 | ||||
-rw-r--r-- | include/ui/statementdialog.h | 22 | ||||
-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.cpp | 47 | ||||
-rw-r--r-- | src/diagram/statement.cpp | 41 | ||||
-rw-r--r-- | src/io/serializer.cpp | 31 | ||||
-rw-r--r-- | src/ui/mainwindow.cpp | 22 | ||||
-rw-r--r-- | src/ui/painter.cpp | 60 | ||||
-rw-r--r-- | src/ui/statementdialog.cpp | 14 |
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; +} |