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