From a23067c1811576654bc8482748c8b1e3c6247dc2 Mon Sep 17 00:00:00 2001 From: ccolin Date: Sat, 2 Jan 2021 01:51:52 +0100 Subject: [PATCH] add clicking to a collision to seek to it --- src/drone.cc | 1 + src/main_window.cc | 22 ++++++++++++++++++---- src/settings_pane.cc | 7 +++++-- src/settings_pane.hh | 13 +++++++++++++ 4 files changed, 37 insertions(+), 6 deletions(-) diff --git a/src/drone.cc b/src/drone.cc index b7e4007..0be11a6 100644 --- a/src/drone.cc +++ b/src/drone.cc @@ -29,6 +29,7 @@ Drone::Drone(const QJsonObject &json) for (const QJsonValue &o : ja) { waypoints.append(Waypoint(o.toObject())); } + setTo(0); } diff --git a/src/main_window.cc b/src/main_window.cc index e63bf0e..26d9601 100644 --- a/src/main_window.cc +++ b/src/main_window.cc @@ -30,6 +30,7 @@ MainWindow::MainWindow(QWidget *parent) { QDockWidget *dock = new QDockWidget("Outils", this); dock->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea); settings_pane = new SettingsPane(); + settings_pane->setEnabled(false); dock->setWidget(settings_pane); addDockWidget(Qt::RightDockWidgetArea, dock); } @@ -62,9 +63,13 @@ void MainWindow::open(const QString &path) { if (dc) delete dc; glw.meshes.clear(); dc = new DroneController(json_doc.object()); - playpause_action->setEnabled(true); + + // Play/Pause button connect(dc, &DroneController::playing, this, &MainWindow::play); connect(dc, &DroneController::pausing, this, &MainWindow::pause); + playpause_action->setEnabled(true); + + // Seekbar slider slider->setMinimum(0); slider->setMaximum(dc->getDuration()); slider->setValue(0); @@ -72,10 +77,19 @@ void MainWindow::open(const QString &path) { connect(slider, &QSlider::sliderReleased, dc, &DroneController::resume); connect(slider, &QSlider::valueChanged, dc, &DroneController::seek); connect(dc, &DroneController::frameChanged, slider, &QSlider::setValue); - connect(dc, &DroneController::collision, settings_pane, &SettingsPane::addCollision); - dc->computeCollisions(10); - pause(); + connect(settings_pane, &SettingsPane::collisionClicked, + slider, &QSlider::setValue); slider->setEnabled(true); + + connect(dc, &DroneController::collision, settings_pane, &SettingsPane::addCollision); + connect(settings_pane, &SettingsPane::sphereRadiusChanged, + [&](double _) { settings_pane->clearCollisions(); }); + connect(settings_pane, &SettingsPane::sphereRadiusChanged, + dc, &DroneController::computeCollisions); + settings_pane->setEnabled(true); + + dc->computeCollisions(.1); + pause(); } diff --git a/src/settings_pane.cc b/src/settings_pane.cc index f37c14c..4e52d55 100644 --- a/src/settings_pane.cc +++ b/src/settings_pane.cc @@ -18,6 +18,8 @@ SettingsPane::SettingsPane(QWidget *parent) this, &SettingsPane::toggledTrajectories); connect(show_support_lines, &QCheckBox::stateChanged, this, &SettingsPane::toggledSupportLines); + connect(collisions, &QListWidget::itemClicked, + [&](QListWidgetItem *item) { emit collisionClicked(((CollisionItem *) item)->getFrame()); }); QFormLayout *layout = new QFormLayout; layout->addRow("Taille de la sphère de collision", sphere_radius); @@ -29,8 +31,9 @@ SettingsPane::SettingsPane(QWidget *parent) void SettingsPane::addCollision(int idA, int idB, int frame) { - QListWidgetItem *item = new QListWidgetItem(QString::number(frame) + ": " - + QString::number(idA) + " / " + QString::number(idB)); + CollisionItem *item = new CollisionItem(QString::number(frame) + ": " + + QString::number(idA) + " / " + QString::number(idB), + frame); item->setFlags(Qt::ItemIsEnabled | Qt::ItemNeverHasChildren); collisions->addItem(item); } diff --git a/src/settings_pane.hh b/src/settings_pane.hh index 434f3f7..25cdf6f 100644 --- a/src/settings_pane.hh +++ b/src/settings_pane.hh @@ -5,6 +5,18 @@ #include +class CollisionItem : public QListWidgetItem { + const int frame; + +public: + CollisionItem(QString text, int frame) + :QListWidgetItem(text), + frame(frame) {} + + int getFrame() const { return frame; } +}; + + class SettingsPane : public QWidget { Q_OBJECT @@ -21,6 +33,7 @@ signals: void sphereRadiusChanged(double sqRadius); void toggledTrajectories(int shown); void toggledSupportLines(int shown); + void collisionClicked(int frame); };