4 Commits

Author SHA1 Message Date
Kalle
99b35e131d Replace include guards with #pragma once
All checks were successful
Build Skui / Build on ubuntu-latest (pull_request) Successful in 2m58s
Validate format using clang / Formatting Check (pull_request) Successful in 1m23s
2026-05-03 17:15:59 +02:00
Kalle Bracht
a42cf60f30 Merge pull request 'Nodeeditor' (#31) from nodeditor into main
Reviewed-on: #31
2026-05-03 14:56:43 +00:00
Kalle
7a03fbca8f Adds roadmap, image and secondary info to README.md
All checks were successful
Build Skui / Build on ubuntu-latest (pull_request) Successful in 1m20s
Validate format using clang / Formatting Check (pull_request) Successful in 47s
2026-04-24 20:58:16 +02:00
Kalle
0a5bb3a246 Updating method name in docstring 2026-04-23 22:33:12 +02:00
24 changed files with 117 additions and 98 deletions

View File

@@ -1,3 +1,95 @@
# Skui
# SKUI - Custom user interfaces with all levels of logic
![build badge](https://dev.skui.eu/SKUI/SKUI/actions/workflows/build-skui.yml/badge.svg)
Build fast and easy to use control software with Skui.
![SKUI NodeEditor](/docs/images/SKUI_NodeEditor_Screenshot1.png)
## Roadmap
Since SKUI is it's early developing stage the actual application is not usable for production.
Therefore the most important thing to look at is the roadmap, where you see the progress and the direction of the project.
The developing is split up into [milestones](https://dev.skui.eu/SKUI/SKUI/milestones) that include specific task issues.
A [milestones](https://dev.skui.eu/SKUI/SKUI/milestones) has a rought topic, but might also include issues that aren't
related to that topic. The [milestones](https://dev.skui.eu/SKUI/SKUI/milestones) have rather than in most roadmaps
no deadline. So that the developing can happen without pressure and botched jobs.
The current planing considers the following [milestones](https://dev.skui.eu/SKUI/SKUI/milestones):
### 1. ~~Jufo Comptition~~
For the jugend forscht compedition there needs to be a minimal version to show to the judge.
It inludes only Nodes and Visuals to send an string via serial connection to stear a servo.
### 2. [GUI Phase](https://dev.skui.eu/SKUI/SKUI/milestone/2)
The GUI phase includes a usable GUI that the User can intuitive use without major bugs.
It does not aim to to reinvent the nodes itself, but to provide enhancements and new features with the existing node system.
One major part of this milestone is the introduction of a working NodeEditor.
Serialization is not planed for this phase.
### 3. [Python embedding](https://dev.skui.eu/SKUI/SKUI/milestone/3)
Python will be a big part of SKUI. Therefore the embedding of Python is requiered.
This milestone yet again rethinks the Node as an Python function.
This solves a lot of problems regarding the connection of Nodes.
The tasks in this milestone can be distributed into the following topics:
- Type System
- Serialization
- Python API
### 4. [Standard library](https://dev.skui.eu/SKUI/SKUI/milestone/4)
For SKUI a standard library is indispensable. It is the requirement to build first hardware demonstrators.
The standard library should at least include:
- Arithmetic
- String manipulation
- Drivers
- TCP
- HTTP
- Serial
- File IO
- Visuals
- QML subclass
- Progressbar
- Gauge
- Text field
- ...
## Build (Windows)
SKUI has no release at the moment, therefore you have to build it yourself.
SKUI is written in C++ and heavily depends on Qt. It uses CMake as it's build system.
The following steps help you to compile the application:
### 1. Installing required toools
First of all you need a working C++ compiler. We use MSCV 2022 as a compiler,
but you can use any that is comatible to Qt and works on your system.
The easiest way to install MSCV is via Viusal Studio. You can install it by clicking [here](https://visualstudio.microsoft.com/de/downloads/).
Choose the "Desktop developing with C++" installation kit to be on the safe side.
Next up is Qt, we use version 6.5. To install it use one of Qt's installation methods.
A link to the installation guide of Qt can be found [here](https://doc.qt.io/qt-6/get-and-install-qt.html)
You can install CMake with various techniques. Ship it with Visual Studio, ship it with Qt or
install it manually from CMake itself. [Link](https://cmake.org/download/) to CMake download page.
To download and work on the project you need to install git. A link to download it can be found [here](https://git-scm.com/install/windows).
Great know you have all the tools you need to build SKUI!
### 2. Download SKUI sources
To build SKUI you first have to copy the sources to a directory of your choice.
Go into a directory you want to use and clone the project via:
```shell
git clone https://dev.skui.eu/SKUI/SKUI.git
```
Go into the downloaded directory:
```shell
cd SKUI
```
Now you are good to go to build SKUI yourself.
### 3. Build SKUI
⚠️ Under unstruction ⚠️
## Contribution
There are several ways you can help to contribute to the project.
If its writting code, giving feedback or just spreading the idea.
A complete guide of how you can contriblte to SKUI can be found at [CONTRIBUTING.md](/CONTRIBUTING.md)
## Licence
SKUI is licenced under GNU GPL v3. The complete licence can be found at [LICENSE](/LICENSE).

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

View File

@@ -1,5 +1,4 @@
#ifndef CONTEXT_MENU_H
#define CONTEXT_MENU_H
#pragma once
#include <QMenu>
@@ -25,5 +24,3 @@ private:
const QPoint m_spawn_position;
Node *m_node = nullptr;
};
#endif // CONTEXT_MENU_H

View File

@@ -1,5 +1,4 @@
#ifndef DOCUMENT_H
#define DOCUMENT_H
#pragma once
#include <functional>
#include <QJsonObject>
@@ -87,5 +86,3 @@ private:
NodeEditor *m_nodeeditor = nullptr;
static Document *s_active_document;
};
#endif // DOCUMENT_H

View File

@@ -1,5 +1,4 @@
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#pragma once
#include <QDir>
#include <QMainWindow>
@@ -47,4 +46,3 @@ private:
DisplayMode m_display_mode = DisplayMode::Run;
};
#endif // MAINWINDOW_H

View File

@@ -1,5 +1,4 @@
#ifndef PROPERTYWINDOW_H
#define PROPERTYWINDOW_H
#pragma once
#include <QFormLayout>
#include <QLabel>
@@ -14,5 +13,3 @@ class PropertyWindow : public QWidget
public:
explicit PropertyWindow(QWidget *parent, const QObject *object);
};
#endif // PROPERTYWINDOW_H

View File

@@ -1,5 +1,4 @@
#ifndef RENAME_NODE_DIALOG_H
#define RENAME_NODE_DIALOG_H
#pragma once
#include <QDialog>
@@ -23,5 +22,3 @@ private:
QLineEdit *m_name_edit = nullptr;
QDialogButtonBox *m_button_box = nullptr;
};
#endif // RENAME_NODE_DIALOG_H

View File

@@ -1,5 +1,4 @@
#ifndef SKUI_H
#define SKUI_H
#pragma once
#include <QApplication>
#include <QDebug>
@@ -12,5 +11,3 @@ public:
bool notify(QObject *, QEvent *) override;
};
#endif // SKUI_H

View File

@@ -1,5 +1,4 @@
#ifndef INTERFACE_H
#define INTERFACE_H
#pragma once
#include <QDebug>
#include <QVariant>
@@ -29,5 +28,3 @@ private:
QList<Interface *> m_routed_interfaces;
std::function<void()> m_callback;
};
#endif // INTERFACE_H

View File

@@ -1,5 +1,4 @@
#ifndef NODE_H
#define NODE_H
#pragma once
#include <QHash>
#include <QObject>
@@ -102,5 +101,3 @@ private:
QList<Interface> m_interfaces;
static QMap<QString, int> instance_counter;
};
#endif // NODE_H

View File

@@ -1,5 +1,4 @@
#ifndef LABEL_H
#define LABEL_H
#pragma once
#include <QLabel>
@@ -18,5 +17,3 @@ private:
QLabel *m_label;
};
#endif // LABEL_H

View File

@@ -1,5 +1,4 @@
#ifndef LINEEDIT_H
#define LINEEDIT_H
#pragma once
#include <QLineEdit>
@@ -18,5 +17,3 @@ private slots:
private:
QWidget *paintWidget(VisualContainer *) override;
};
#endif // LINEEDIT_H

View File

@@ -1,5 +1,4 @@
#ifndef SERIALSEND_H
#define SERIALSEND_H
#pragma once
#include <QComboBox>
#include <QLabel>
@@ -22,5 +21,3 @@ private:
QComboBox *m_combo_box;
QSerialPort m_serial_port;
};
#endif // SERIALSEND_H

View File

@@ -1,5 +1,4 @@
#ifndef SLIDER_H
#define SLIDER_H
#pragma once
#include <QDebug>
#include <QSlider>
@@ -18,5 +17,3 @@ private slots:
private:
QWidget *paintWidget(VisualContainer *) override;
};
#endif // SLIDER_H

View File

@@ -1,5 +1,4 @@
#ifndef TEXTCOMBINE_H
#define TEXTCOMBINE_H
#pragma once
#include "../node.h"
@@ -12,5 +11,3 @@ public:
private:
void valueChanged();
};
#endif // TEXTCOMBINE_H

View File

@@ -1,5 +1,4 @@
#ifndef VISUAL_H
#define VISUAL_H
#pragma once
#include <QLoggingCategory>
@@ -72,5 +71,3 @@ signals:
private:
QWidget *m_widget = nullptr;
};
#endif // VISUAL_H

View File

@@ -1,5 +1,4 @@
#ifndef CABLE_H
#define CABLE_H
#pragma once
#include <QCursor>
#include <QGraphicsObject>
@@ -33,14 +32,6 @@ class Cable : public QGraphicsObject
public:
explicit Cable(QGraphicsItem *parent, const Pad *start_pad);
//void abortCable();
//deleteCable / ~Cable()
//Pad *startPad();
//QList<Pad *> endPads();
//bool isActive() { return m_is_active; }
//getCablePath() -> QList<QPoint> or QList<CableSegment> depending on
//dynamic bounding rect, on edit is scene rect or bounding rect of the cable, on finished cable bounding rect
void paint(QPainter *, const QStyleOptionGraphicsItem *, QWidget *) override;
QRectF boundingRect() const override;
@@ -79,7 +70,7 @@ protected:
* the preview decides if it uses a horizontal or vertical based on
* the angle to the latest corner.
*
* To enter a position, use setCorner(QPoint).
* To enter a position, use corner(QPoint).
*
* @param point The position to render the preview, normally the current mouse position.
*
@@ -127,5 +118,3 @@ private:
// Do not access directly, use updateBoundingRect() to update repaint.
QRectF m_bounding_rect;
};
#endif // CABLE_H

View File

@@ -1,5 +1,4 @@
#ifndef NODE_GRAPHICSITEM_H
#define NODE_GRAPHICSITEM_H
#pragma once
#include <QFontMetrics>
#include <QGraphicsItem>
@@ -57,5 +56,3 @@ private:
QString m_object_name;
QList<QMetaObject::Connection> m_node_connections;
};
#endif // NODE_GRAPHICSITEM_H

View File

@@ -1,5 +1,4 @@
#ifndef PAD_H
#define PAD_H
#pragma once
#include <QCursor>
#include <QGraphicsObject>
@@ -67,5 +66,3 @@ private:
const PadSide m_pad_side;
Interface *m_represented_interface;
};
#endif // PAD_H

View File

@@ -1,5 +1,4 @@
#ifndef NodeEditor_H
#define NodeEditor_H
#pragma once
#include <QGraphicsView>
#include <QLoggingCategory>
@@ -29,5 +28,3 @@ private:
bool m_dragging = false;
QPoint m_last_drag_pos;
};
#endif // NodeEditor_H

View File

@@ -1,5 +1,4 @@
#ifndef NODEEDITOR_SCENE_H
#define NODEEDITOR_SCENE_H
#pragma once
#include <QGraphicsScene>
#include <QGuiApplication>
@@ -30,5 +29,3 @@ private:
QCursor m_cursor_before_pad;
QPointer<Cable> m_last_cable = nullptr;
};
#endif // NODEEDITOR_SCENE_H

View File

@@ -1,5 +1,4 @@
#ifndef PANEL_H
#define PANEL_H
#pragma once
#include <QGuiApplication>
#include <QLoggingCategory>
@@ -169,5 +168,3 @@ private:
QList<RbbWidgetPair> m_selection;
};
#endif // PANEL_H

View File

@@ -1,5 +1,4 @@
#ifndef RESIZEBOUNDINGBOX_H
#define RESIZEBOUNDINGBOX_H
#pragma once
#include <QCursor>
#include <QMargins>
@@ -74,5 +73,3 @@ private:
QPointF last_global_position;
QRect last_geometry;
};
#endif // RESIZEBOUNDINGBOX_H

View File

@@ -1,5 +1,4 @@
#ifndef VISUAL_CONTAINER_H
#define VISUAL_CONTAINER_H
#pragma once
#include "../node/node.h"
#include <QChildEvent>
@@ -25,5 +24,3 @@ protected:
private:
Node *m_node = nullptr;
};
#endif // VISUAL_CONTAINER_H