From 2ed9b22123c0f01ffde3e54e534af54abe1dba68 Mon Sep 17 00:00:00 2001
From: Jan Grewe <jan.grewe@g-node.org>
Date: Fri, 24 Nov 2023 15:42:07 +0100
Subject: [PATCH] [camerasetup] setup uis for single or dual camera use

---
 camerasetup.cpp | 93 ++++++++++++++++++++++++++++++++++++++++++++++++
 camerasetup.h   | 94 +++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 187 insertions(+)
 create mode 100644 camerasetup.cpp
 create mode 100644 camerasetup.h

diff --git a/camerasetup.cpp b/camerasetup.cpp
new file mode 100644
index 0000000..aca7885
--- /dev/null
+++ b/camerasetup.cpp
@@ -0,0 +1,93 @@
+#include <QVBoxLayout>
+#include "camerasetup.h"
+
+
+SingleCamera::SingleCamera (QWidget *parent) : 
+    CameraSetup(parent),
+    camera1Preview(nullptr) {
+        this->setLayout(new QVBoxLayout(this));
+        camera1Preview = new CameraPreview();
+        this->layout()->addWidget(camera1Preview);
+}
+
+CameraLayout SingleCamera::cameraLayout(){ 
+    CameraLayout l;
+    qDebug() << "Request layout";
+    l.mode = CameraMode::single;
+    l.layout = Layout::horizontal;
+    l.devices.push_back(camera1Preview->device().toStdString());
+    l.rois.push_back(camera1Preview->getRoi());
+    return l;
+}
+
+SingleCamera::~SingleCamera(){
+    if (camera1Preview != nullptr) {
+        delete camera1Preview;
+        camera1Preview = nullptr;
+    }
+}
+
+
+DualCamera::DualCamera (QWidget *parent) : 
+    CameraSetup(parent),
+    camera1Preview(nullptr),
+    camera2Preview(nullptr),
+    primary_device("") {
+        qDebug() << "DualCamera View ... ";
+        this->setLayout(new QHBoxLayout(this));
+        camera1Preview = new CameraPreview();
+        camera2Preview = new CameraPreview();
+        this->layout()->addWidget(camera1Preview);
+        this->layout()->addWidget(camera2Preview);
+        connect(camera1Preview, SIGNAL(roiUpdated(int, int, int, int)), this, SLOT(updateROI1(int, int, int, int)));
+        connect(camera2Preview, SIGNAL(roiUpdated(int, int, int, int)), SLOT(updateROI2(int, int, int, int)));
+        qDebug() << "... created";
+}
+
+
+void DualCamera::updateROI1(int x, int y, int w, int h) {
+    camera2Preview->setSize(w, h);
+}
+
+void DualCamera::updateROI2(int x, int y, int w, int h) {
+    camera1Preview->setSize(w, h);
+}
+
+void DualCamera::switchArrangement() {
+        qDebug() << "switch camera arrangement";
+        QHBoxLayout *hbox = (QHBoxLayout*)this->layout();
+        if (hbox->direction() == QBoxLayout::LeftToRight) {
+            hbox->setDirection(QBoxLayout::RightToLeft);
+            primary_device = camera2Preview->device();
+        } else {
+            hbox->setDirection(QBoxLayout::LeftToRight);
+            primary_device = camera1Preview->device();
+        }
+    }
+
+CameraLayout DualCamera::cameraLayout() {
+    CameraLayout l;
+    qDebug() << "Request layout";
+    l.mode = CameraMode::dual;
+    l.layout = Layout::horizontal;
+    if (camera1Preview->device() == primary_device) {
+        l.rois.push_back(camera1Preview->getRoi());
+        l.rois.push_back(camera2Preview->getRoi());
+    } else {
+        l.rois.push_back(camera2Preview->getRoi());
+        l.rois.push_back(camera1Preview->getRoi());
+    }
+    return l;
+}
+
+
+DualCamera::~DualCamera(){
+    if (camera1Preview != nullptr) {
+        delete camera1Preview;
+        camera1Preview = nullptr;
+    }
+    if (camera2Preview != nullptr) {
+        delete camera2Preview;
+        camera2Preview = nullptr;
+    }
+}
diff --git a/camerasetup.h b/camerasetup.h
new file mode 100644
index 0000000..de39834
--- /dev/null
+++ b/camerasetup.h
@@ -0,0 +1,94 @@
+#ifndef CAMERASETUP_H
+#define CAMERASETUP_H
+
+#include <QWidget>
+#include "camerapreview.h"
+#include "mylogger.h"
+
+
+namespace Ui {
+    class SingleCamera;
+}
+
+
+class CameraSetup : public QWidget {
+    Q_OBJECT
+
+public:
+    CameraSetup(QWidget *parent=0): QWidget(parent){};
+    // virtual ROI getRoi() = 0;
+    virtual CameraLayout cameraLayout() = 0;
+    virtual void setPrimaryCamera(QString &device) = 0;
+    virtual void setSecondaryCamera(QString &device) = 0;
+    virtual void switchArrangement() = 0;
+};
+
+
+class SingleCamera : public CameraSetup {
+    Q_OBJECT
+
+public:
+    explicit SingleCamera(QWidget *parent = 0);
+    ~SingleCamera();
+
+
+    void setPrimaryCamera(QString &devive) {
+        qDebug() << "Update primary camera";
+        camera1Preview->setCamera(devive);
+    }
+
+
+    void setSecondaryCamera(QString &devive) {
+        qDebug()<< "Update secondary camera not supported on SingleCamera";
+    }
+
+    CameraLayout cameraLayout();
+
+    void switchArrangement() {
+        qDebug() << "switch orientation does nothing on SingleCamera";
+    }
+
+private:
+    CameraPreview *camera1Preview;
+};
+
+
+class DualCamera : public CameraSetup {
+    Q_OBJECT
+
+public:
+    explicit DualCamera(QWidget *parent = 0);
+    ~DualCamera();
+
+
+    void setPrimaryCamera(QString &device) {
+        qDebug() << "Update primary camera";
+        if (camera1Preview != nullptr) {
+            camera1Preview->setCamera(device);
+            primary_device = device;
+        }
+    }
+
+
+    void setSecondaryCamera(QString &device) {
+        qDebug()<< "Update secondary camera";
+        if (camera2Preview != nullptr) {
+            camera2Preview->setCamera(device);
+        }
+    }
+
+    CameraLayout cameraLayout();
+    void switchArrangement();
+
+
+public slots:
+    void updateROI1(int x, int y, int width, int height);
+    void updateROI2(int x, int y, int width, int height);
+
+private:
+    QString primary_device;
+    CameraPreview *camera1Preview;
+    CameraPreview *camera2Preview;
+};
+
+#endif //CAMERASETUP_H
\ No newline at end of file