diff --git a/CMakeLists.txt.user b/CMakeLists.txt.user
new file mode 100644
index 0000000..cbd8378
--- /dev/null
+++ b/CMakeLists.txt.user
@@ -0,0 +1,386 @@
+
+
+
+
+
+ EnvironmentId
+ {f96bfb42-258c-4376-a358-d39255821a90}
+
+
+ ProjectExplorer.Project.ActiveTarget
+ 0
+
+
+ ProjectExplorer.Project.EditorSettings
+
+ true
+ false
+ true
+
+ Cpp
+
+ CppGlobal
+
+
+
+ QmlJS
+
+ QmlJSGlobal
+
+
+ 2
+ UTF-8
+ false
+ 4
+ false
+ 80
+ true
+ true
+ 1
+ true
+ false
+ 0
+ true
+ true
+ 0
+ 8
+ true
+ 1
+ true
+ true
+ true
+ *.md, *.MD, Makefile
+ false
+ true
+
+
+
+ ProjectExplorer.Project.PluginSettings
+
+
+ true
+ true
+ true
+ true
+ true
+
+
+ 0
+ true
+
+ -fno-delayed-template-parsing
+
+ true
+ Builtin.Questionable
+
+ true
+ Builtin.DefaultTidyAndClazy
+ 6
+
+
+
+ true
+
+
+
+
+ ProjectExplorer.Project.Target.0
+
+ Desktop
+ Desktop (x86-windows-msvc2019-pe-64bit)
+ Desktop (x86-windows-msvc2019-pe-64bit)
+ {e7564e53-19bf-462d-a58b-2034502371d2}
+ 0
+ 0
+ 0
+
+ -GNinja
+-DCMAKE_BUILD_TYPE:String=Debug
+-DQT_QMAKE_EXECUTABLE:STRING=%{Qt:qmakeExecutable}
+-DCMAKE_PREFIX_PATH:STRING=%{Qt:QT_INSTALL_PREFIX}
+-DCMAKE_C_COMPILER:STRING=%{Compiler:Executable:C}
+-DCMAKE_CXX_COMPILER:STRING=%{Compiler:Executable:Cxx}
+ 2
+ C:\Users\Robert\source\repos\GraviSim\..\build-GraviSim-Desktop_x86_windows_msvc2019_pe_64bit-Debug
+
+
+
+
+ all
+
+
+ true
+ CMakeProjectManager.MakeStep
+
+ 1
+ Erstellen
+ Erstellen
+ ProjectExplorer.BuildSteps.Build
+
+
+
+
+
+ clean
+
+
+ true
+ CMakeProjectManager.MakeStep
+
+ 1
+ Bereinigen
+ Bereinigen
+ ProjectExplorer.BuildSteps.Clean
+
+ 2
+ false
+
+
+ Debug
+ CMakeProjectManager.CMakeBuildConfiguration
+
+
+ -GNinja
+-DCMAKE_BUILD_TYPE:String=Release
+-DQT_QMAKE_EXECUTABLE:STRING=%{Qt:qmakeExecutable}
+-DCMAKE_PREFIX_PATH:STRING=%{Qt:QT_INSTALL_PREFIX}
+-DCMAKE_C_COMPILER:STRING=%{Compiler:Executable:C}
+-DCMAKE_CXX_COMPILER:STRING=%{Compiler:Executable:Cxx}
+ 2
+ C:\Users\Robert\source\repos\GraviSim\..\build-GraviSim-Desktop_x86_windows_msvc2019_pe_64bit-Release
+
+
+
+
+ all
+
+
+ true
+ CMakeProjectManager.MakeStep
+
+ 1
+ Erstellen
+ Erstellen
+ ProjectExplorer.BuildSteps.Build
+
+
+
+
+
+ clean
+
+
+ true
+ CMakeProjectManager.MakeStep
+
+ 1
+ Bereinigen
+ Bereinigen
+ ProjectExplorer.BuildSteps.Clean
+
+ 2
+ false
+
+
+ Release
+ CMakeProjectManager.CMakeBuildConfiguration
+
+
+ -GNinja
+-DCMAKE_BUILD_TYPE:String=RelWithDebInfo
+-DQT_QMAKE_EXECUTABLE:STRING=%{Qt:qmakeExecutable}
+-DCMAKE_PREFIX_PATH:STRING=%{Qt:QT_INSTALL_PREFIX}
+-DCMAKE_C_COMPILER:STRING=%{Compiler:Executable:C}
+-DCMAKE_CXX_COMPILER:STRING=%{Compiler:Executable:Cxx}
+ 2
+ C:\Users\Robert\source\repos\GraviSim\..\build-GraviSim-Desktop_x86_windows_msvc2019_pe_64bit-RelWithDebInfo
+
+
+
+
+ all
+
+
+ true
+ CMakeProjectManager.MakeStep
+
+ 1
+ Erstellen
+ Erstellen
+ ProjectExplorer.BuildSteps.Build
+
+
+
+
+
+ clean
+
+
+ true
+ CMakeProjectManager.MakeStep
+
+ 1
+ Bereinigen
+ Bereinigen
+ ProjectExplorer.BuildSteps.Clean
+
+ 2
+ false
+
+
+ Release mit Debuginformationen
+ CMakeProjectManager.CMakeBuildConfiguration
+
+
+ -GNinja
+-DCMAKE_BUILD_TYPE:String=MinSizeRel
+-DQT_QMAKE_EXECUTABLE:STRING=%{Qt:qmakeExecutable}
+-DCMAKE_PREFIX_PATH:STRING=%{Qt:QT_INSTALL_PREFIX}
+-DCMAKE_C_COMPILER:STRING=%{Compiler:Executable:C}
+-DCMAKE_CXX_COMPILER:STRING=%{Compiler:Executable:Cxx}
+ 2
+ C:\Users\Robert\source\repos\GraviSim\..\build-GraviSim-Desktop_x86_windows_msvc2019_pe_64bit-MinSizeRel
+
+
+
+
+ all
+
+
+ true
+ CMakeProjectManager.MakeStep
+
+ 1
+ Erstellen
+ Erstellen
+ ProjectExplorer.BuildSteps.Build
+
+
+
+
+
+ clean
+
+
+ true
+ CMakeProjectManager.MakeStep
+
+ 1
+ Bereinigen
+ Bereinigen
+ ProjectExplorer.BuildSteps.Clean
+
+ 2
+ false
+
+
+ Release (kleinstmöglich)
+ CMakeProjectManager.CMakeBuildConfiguration
+
+ 4
+
+
+ 0
+ Deployment
+ Deployment
+ ProjectExplorer.BuildSteps.Deploy
+
+ 1
+
+ false
+ ProjectExplorer.DefaultDeployConfiguration
+
+ 1
+
+
+ dwarf
+
+ cpu-cycles
+
+
+ 250
+
+ -e
+ cpu-cycles
+ --call-graph
+ dwarf,4096
+ -F
+ 250
+
+ -F
+ true
+ 4096
+ false
+ false
+ 1000
+
+ true
+
+ false
+ false
+ false
+ false
+ true
+ 0.01
+ 10
+ true
+ kcachegrind
+ 1
+ 25
+
+ 1
+ true
+ false
+ true
+ valgrind
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+ 10
+ 11
+ 12
+ 13
+ 14
+
+
+ 2
+
+ GraviSim
+ CMakeProjectManager.CMakeRunConfiguration.GraviSim
+ GraviSim
+
+ false
+
+ false
+ true
+ true
+ false
+ false
+ true
+
+ C:/Users/Robert/AppData/Local/Temp/QtCreator-omMIkE/qtc-cmake-FTzHLhyM/src
+
+ 1
+
+
+
+ ProjectExplorer.Project.TargetCount
+ 1
+
+
+ ProjectExplorer.Project.Updater.FileVersion
+ 22
+
+
+ Version
+ 22
+
+
diff --git a/src/Planet.cpp b/src/Planet.cpp
index 80b3dbc..f2ae0d3 100644
--- a/src/Planet.cpp
+++ b/src/Planet.cpp
@@ -3,17 +3,43 @@
Planet::Planet(float xPos, float yPos, float radius, QColor color) :
position{ xPos, yPos }, radius(radius)
{
- circle = QBrush(color);
+ Initialize(color);
}
Planet::Planet(QPointF pos, float radius, QColor color) :
position(pos), radius(radius)
{
- circle = QBrush(color);
+ Initialize(color);
+}
+
+void Planet::Select(bool select)
+{
+ if (select)
+ outline.setColor(selectionColor);
+ else
+ outline.setColor(Qt::transparent);
}
void Planet::Draw(QPainter* painter)
{
painter->setBrush(circle);
+ painter->setPen(outline);
painter->drawEllipse(position, radius, radius);
}
+
+bool Planet::IsInside(QPointF point) const
+{
+ QPointF distance = point - position;
+ return (distance.x() * distance.x() + distance.y() * distance.y() < radius * radius);
+}
+
+void Planet::Initialize(QColor color)
+{
+ circle = QBrush(color);
+ outline = QPen(Qt::transparent);
+ outline.setWidthF(4.f);
+
+ int h, s, v, a;
+ color.getHsv(&h, &s, &v, &a);
+ selectionColor = QColor::fromHsv((h + 180) % 360, s, v, a);
+}
diff --git a/src/Planet.hpp b/src/Planet.hpp
index 5b832af..4dbfa98 100644
--- a/src/Planet.hpp
+++ b/src/Planet.hpp
@@ -11,12 +11,21 @@ public:
Planet(QPointF pos, float radius, QColor color);
void Resize(float newRadius) { radius = newRadius; }
+ void Select(bool select);
void Draw(QPainter* painter);
+ bool IsInside(QPointF point) const;
+
+private:
+ void Initialize(QColor color);
+
private:
QPointF position;
float radius;
+ QColor selectionColor;
+
QBrush circle;
+ QPen outline;
};
\ No newline at end of file
diff --git a/src/Screen.cpp b/src/Screen.cpp
index 8ee2e80..3720e99 100644
--- a/src/Screen.cpp
+++ b/src/Screen.cpp
@@ -8,9 +8,14 @@
#include
#include
+#define BIND_LMB(f) (lmbAction = std::bind(&Screen::f, this, std::placeholders::_1))
+
Screen::Screen(QWidget* parent) :
QOpenGLWidget(parent)
{
+ setMouseTracking(true);
+ BIND_LMB(lmb_MakePlanet);
+
srand(time(NULL));
background = QBrush(Qt::black);
@@ -25,23 +30,39 @@ Screen::Screen(QWidget* parent) :
void Screen::mouseMoveEvent(QMouseEvent* event)
{
- if (mouseDown)
+ if (mouseDown && hovered == nullptr)
{
Planet* planet = planets.back();
QPointF distance = event->localPos() - mouseClickPos;
planet->Resize(qSqrt(distance.x()*distance.x() + distance.y() *distance.y()));
}
+ else
+ {
+ hovered = nullptr;
+ for (unsigned i = planets.size(); i-- > 0; )
+ {
+ if (planets[i]->IsInside(event->localPos()))
+ {
+ setCursor(Qt::OpenHandCursor);
+ BIND_LMB(lmb_SelectPlanet);
+ hovered = planets[i];
+ break;
+ }
+ }
+
+ if (hovered == nullptr)
+ {
+ setCursor(Qt::ArrowCursor);
+ BIND_LMB(lmb_MakePlanet);
+ }
+ }
}
void Screen::mousePressEvent(QMouseEvent* event)
{
if (event->button() == Qt::MouseButton::LeftButton)
{
- planets.push_back(new Planet(event->localPos(), 0,
- QColor(rand() % 256, rand() % 256, rand() % 256)
- ));
- mouseClickPos = event->localPos();
- mouseDown = true;
+ lmbAction(event);
}
if (event->button() == Qt::MouseButton::RightButton)
@@ -65,6 +86,28 @@ void Screen::Render()
update();
}
+void Screen::lmb_MakePlanet(QMouseEvent* event)
+{
+ planets.push_back(new Planet(event->localPos(), 0,
+ QColor(rand() % 256, rand() % 256, rand() % 256)
+ ));
+ mouseClickPos = event->localPos();
+ mouseDown = true;
+}
+
+void Screen::lmb_SelectPlanet(QMouseEvent* event)
+{
+ if (hovered != nullptr)
+ {
+ if (selected != nullptr)
+ selected->Select(false);
+
+ hovered->Select(true);
+ }
+
+ selected = hovered;
+}
+
void Screen::paintEvent(QPaintEvent* event)
{
QPainter painter;
diff --git a/src/Screen.hpp b/src/Screen.hpp
index 2e7fc4f..65890b5 100644
--- a/src/Screen.hpp
+++ b/src/Screen.hpp
@@ -1,6 +1,7 @@
#pragma once
#include
+#include
#include
@@ -18,15 +19,24 @@ public:
private slots:
void Render();
+private:
+ void lmb_MakePlanet(QMouseEvent* event);
+ void lmb_SelectPlanet(QMouseEvent* event);
+
protected:
void paintEvent(QPaintEvent* event) override;
private:
bool mouseDown = false;
+
+ std::function lmbAction;
+
QPointF mouseClickPos;
QBrush background;
QTimer* renderTimer;
std::vector planets;
+ Planet* selected = nullptr;
+ Planet* hovered = nullptr;
};
\ No newline at end of file