Can now edit planets

This commit is contained in:
Robert 2020-09-25 13:55:35 +02:00
parent 2a4df119ac
commit 6248f70bb7
11 changed files with 395 additions and 20 deletions

View file

@ -7,7 +7,7 @@ cmake_minimum_required (VERSION 3.8)
add_executable (GraviSim add_executable (GraviSim
"main.cpp" "main.cpp"
"MainWindow.cpp" "MainWindow.cpp"
"Screen.hpp" "Screen.cpp" "Planet.hpp" "Planet.cpp") "Screen.hpp" "Screen.cpp" "Planet.hpp" "Planet.cpp" "PlanetConfig.cpp")
target_link_libraries(GraviSim target_link_libraries(GraviSim
Qt5::Widgets Qt5::Widgets

View file

@ -2,11 +2,68 @@
#include "Screen.hpp" #include "Screen.hpp"
MainWindow::MainWindow(QWidget* parent) : MainWindow* MainWindow::instance = nullptr;
QMainWindow(parent)
MainWindow* MainWindow::Instance()
{
if (instance == nullptr)
{
instance = new MainWindow();
instance->Setup();
}
return instance;
}
MainWindow::MainWindow() :
QMainWindow(Q_NULLPTR), activePlanet(nullptr)
{
}
void MainWindow::Setup()
{ {
ui.setupUi(this); ui.setupUi(this);
ClosePlanetDialog();
Screen* screen = new Screen(this); }
ui.layout->addWidget(screen, 0, 0);
void MainWindow::OpenPlanetDialog(Planet* planet)
{
activePlanet = nullptr;
ui.config->Enable();
ui.config->SetTitle("Planets don't have names yet");
ui.config->SetRadius(planet->radius);
ui.config->SetX(planet->position.rx());
ui.config->SetY(planet->position.ry());
activePlanet = planet;
}
void MainWindow::ClosePlanetDialog()
{
activePlanet = nullptr;
ui.config->SetTitle("No planet selected");
ui.config->Disable();
ui.config->SetRadius(0.f);
ui.config->SetX(0.f);
ui.config->SetY(0.f);
}
void MainWindow::OnRadiusChanged(double radius)
{
if(activePlanet != nullptr)
activePlanet->radius = radius;
}
void MainWindow::OnXChanged(double x)
{
if (activePlanet != nullptr)
activePlanet->position.rx() = x;
}
void MainWindow::OnYChanged(double y)
{
if (activePlanet != nullptr)
activePlanet->position.ry() = y;
} }

View file

@ -3,13 +3,32 @@
#include <QMainWindow> #include <QMainWindow>
#include "ui_MainWindow.h" #include "ui_MainWindow.h"
#include "Planet.hpp"
#include "PlanetConfig.hpp"
class MainWindow : public QMainWindow class MainWindow : public QMainWindow
{ {
Q_OBJECT Q_OBJECT
public: public:
MainWindow(QWidget* parent = Q_NULLPTR); static MainWindow* Instance();
public:
void OpenPlanetDialog(Planet* planet);
void ClosePlanetDialog();
public slots:
void OnRadiusChanged(double radius);
void OnXChanged(double x);
void OnYChanged(double y);
private:
MainWindow();
void Setup();
private: private:
Ui::MainWindow ui; Ui::MainWindow ui;
Planet* activePlanet;
static MainWindow* instance;
}; };

View file

@ -20,10 +20,12 @@ public:
private: private:
void Initialize(QColor color); void Initialize(QColor color);
private: public:
QPointF position; QPointF position;
float radius; float radius;
private:
QColor selectionColor; QColor selectionColor;
QBrush circle; QBrush circle;

58
src/PlanetConfig.cpp Normal file
View file

@ -0,0 +1,58 @@
#include "PlanetConfig.hpp"
#include <qcolordialog.h>
#include "MainWindow.hpp"
PlanetConfig::PlanetConfig(QWidget* parent) :
QWidget(parent)
{
ui.setupUi(this);
ui.color = new QColorDialog(this);
MainWindow* instance = MainWindow::Instance();
connect(ui.radius, QOverload<double>::of(&QDoubleSpinBox::valueChanged),
instance, [instance](double d) { instance->OnRadiusChanged(d); });
connect(ui.xPos, QOverload<double>::of(&QDoubleSpinBox::valueChanged),
instance, [instance](double d) { instance->OnXChanged(d); });
connect(ui.yPos, QOverload<double>::of(&QDoubleSpinBox::valueChanged),
instance, [instance](double d) { instance->OnYChanged(d); });
}
void PlanetConfig::Disable()
{
ui.radius->setDisabled(true);
ui.xPos->setDisabled(true);
ui.yPos->setDisabled(true);
}
void PlanetConfig::Enable()
{
ui.radius->setDisabled(false);
ui.xPos->setDisabled(false);
ui.yPos->setDisabled(false);
}
void PlanetConfig::SetTitle(const QString& title)
{
ui.name->setText(title);
}
void PlanetConfig::SetRadius(double radius)
{
ui.radius->setValue(radius);
}
void PlanetConfig::SetX(double x)
{
ui.xPos->setValue(x);
}
void PlanetConfig::SetY(double y)
{
ui.yPos->setValue(y);
}

22
src/PlanetConfig.hpp Normal file
View file

@ -0,0 +1,22 @@
#pragma once
#include <QWidget>
#include "ui_PlanetConfig.h"
class PlanetConfig : public QWidget
{
public:
PlanetConfig(QWidget* parent);
void Disable();
void Enable();
void SetTitle(const QString& title);
void SetRadius(double radius);
void SetX(double x);
void SetY(double y);
private:
Ui::Form ui;
};

View file

@ -8,6 +8,8 @@
#include <QTimer> #include <QTimer>
#include <QtMath> #include <QtMath>
#include "MainWindow.hpp"
#define BIND_LMB(f) (lmbAction = std::bind(&Screen::f, this, std::placeholders::_1)) #define BIND_LMB(f) (lmbAction = std::bind(&Screen::f, this, std::placeholders::_1))
Screen::Screen(QWidget* parent) : Screen::Screen(QWidget* parent) :
@ -53,6 +55,7 @@ void Screen::mouseMoveEvent(QMouseEvent* event)
if (hovered == nullptr) if (hovered == nullptr)
{ {
setCursor(Qt::ArrowCursor); setCursor(Qt::ArrowCursor);
if(selected == nullptr)
BIND_LMB(lmb_MakePlanet); BIND_LMB(lmb_MakePlanet);
} }
} }
@ -103,9 +106,17 @@ void Screen::lmb_SelectPlanet(QMouseEvent* event)
selected->Select(false); selected->Select(false);
hovered->Select(true); hovered->Select(true);
}
selected = hovered; selected = hovered;
MainWindow::Instance()->OpenPlanetDialog(selected);
}
else
{
BIND_LMB(lmb_MakePlanet);
selected->Select(false);
selected = nullptr;
MainWindow::Instance()->ClosePlanetDialog();
return;
}
} }
void Screen::paintEvent(QPaintEvent* event) void Screen::paintEvent(QPaintEvent* event)

View file

@ -7,6 +7,8 @@
#include "Planet.hpp" #include "Planet.hpp"
class MainWindow;
class Screen : public QOpenGLWidget class Screen : public QOpenGLWidget
{ {
public: public:

View file

@ -5,8 +5,8 @@ int main(int argc, char** argv)
{ {
QApplication app(argc, argv); QApplication app(argc, argv);
MainWindow window; MainWindow* window = MainWindow::Instance();
window.show(); window->show();
return app.exec(); return app.exec();
} }

View file

@ -6,10 +6,16 @@
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>726</width> <width>1000</width>
<height>643</height> <height>800</height>
</rect> </rect>
</property> </property>
<property name="minimumSize">
<size>
<width>1000</width>
<height>800</height>
</size>
</property>
<property name="windowTitle"> <property name="windowTitle">
<string>MainWindow</string> <string>MainWindow</string>
</property> </property>
@ -27,16 +33,44 @@
<property name="bottomMargin"> <property name="bottomMargin">
<number>0</number> <number>0</number>
</property> </property>
<item row="0" column="0"> <property name="spacing">
<layout class="QGridLayout" name="layout"> <number>0</number>
<property name="sizeConstraint">
<enum>QLayout::SetDefaultConstraint</enum>
</property> </property>
</layout> <item row="1" column="0">
<widget class="Screen" name="screen"/>
</item>
<item row="1" column="1">
<widget class="PlanetConfig" name="config" native="true">
<property name="sizePolicy">
<sizepolicy hsizetype="Maximum" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maximumSize">
<size>
<width>200</width>
<height>16777215</height>
</size>
</property>
</widget>
</item> </item>
</layout> </layout>
</widget> </widget>
</widget> </widget>
<customwidgets>
<customwidget>
<class>Screen</class>
<extends>QOpenGLWidget</extends>
<header>Screen.hpp</header>
</customwidget>
<customwidget>
<class>PlanetConfig</class>
<extends>QWidget</extends>
<header>PlanetConfig.hpp</header>
<container>1</container>
</customwidget>
</customwidgets>
<resources/> <resources/>
<connections/> <connections/>
</ui> </ui>

170
ui/PlanetConfig.ui Normal file
View file

@ -0,0 +1,170 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>Form</class>
<widget class="QWidget" name="Form">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>436</width>
<height>567</height>
</rect>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
<property name="autoFillBackground">
<bool>false</bool>
</property>
<property name="styleSheet">
<string notr="true">background-color: rgb(222, 222, 222);</string>
</property>
<layout class="QGridLayout" name="gridLayout_2">
<item row="0" column="0">
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QLabel" name="name">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="font">
<font>
<family>Arial</family>
<pointsize>12</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>TextLabel</string>
</property>
<property name="textFormat">
<enum>Qt::AutoText</enum>
</property>
<property name="alignment">
<set>Qt::AlignHCenter|Qt::AlignTop</set>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QLabel" name="label">
<property name="font">
<font>
<family>Courier New</family>
<pointsize>12</pointsize>
</font>
</property>
<property name="text">
<string>Radius</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item>
<widget class="QDoubleSpinBox" name="radius">
<property name="maximum">
<double>1000.000000000000000</double>
</property>
<property name="singleStep">
<double>0.100000000000000</double>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="QLabel" name="label_2">
<property name="font">
<font>
<family>Courier New</family>
<pointsize>12</pointsize>
</font>
</property>
<property name="text">
<string>Colour</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item>
<widget class="QWidget" name="color" native="true"/>
</item>
</layout>
</item>
<item>
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0">
<widget class="QLabel" name="label_3">
<property name="font">
<font>
<family>Courier New</family>
<pointsize>12</pointsize>
</font>
</property>
<property name="text">
<string>X</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_4">
<property name="font">
<font>
<family>Courier New</family>
<pointsize>12</pointsize>
</font>
</property>
<property name="text">
<string>Y</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QDoubleSpinBox" name="xPos">
<property name="maximum">
<double>1000.000000000000000</double>
</property>
<property name="singleStep">
<double>0.100000000000000</double>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QDoubleSpinBox" name="yPos">
<property name="maximum">
<double>10000.000000000000000</double>
</property>
<property name="singleStep">
<double>0.100000000000000</double>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>