diff --git a/include/autoCalib.h b/include/autoCalib.h index baeb5a48a5ac373e5530f999d1d9411df4399e30..46092b2a9a68e5e9bf20cd888170ff39b96f161d 100644 --- a/include/autoCalib.h +++ b/include/autoCalib.h @@ -27,7 +27,6 @@ #include <optional> class Petrack; -class Control; /** * @brief Class for intrinsic calibration @@ -96,7 +95,6 @@ private: double *reproj_errs); Petrack *mMainWindow; - Control *mControlWidget; QStringList mCalibFiles; int mBoardSizeX, mBoardSizeY; float mSquareSize; diff --git a/include/backgroundItem.h b/include/backgroundItem.h index c12c3e3ce3cdc4b3be053273145a68add7ecf79e..04f513bea1ee12b27bab09c84ffbf206d5f40512 100644 --- a/include/backgroundItem.h +++ b/include/backgroundItem.h @@ -23,6 +23,7 @@ class Petrack; class Control; +class FilterBeforeBox; class Tracker; class BackgroundItem : public QGraphicsItem @@ -32,7 +33,7 @@ private: QImage *mImage; public: - BackgroundItem(QWidget *wParent, QGraphicsItem *parent = nullptr); + BackgroundItem(QWidget *wParent, QGraphicsItem *parent, FilterBeforeBox &filterBefore); QRectF boundingRect() const; void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget); }; diff --git a/include/control.h b/include/control.h index 0ae21e7b4bf8a5fe76e98296ce45f873bc55a3ca..01078b60a318fda41eac3bd88074762eb03ede16 100644 --- a/include/control.h +++ b/include/control.h @@ -31,6 +31,7 @@ class QGraphicsScene; class QDomElement; class IntrinsicBox; +class FilterBeforeBox; namespace Ui { class Control; @@ -47,7 +48,8 @@ public: reco::Recognizer &recognizer, RoiItem &trackRoiItem, RoiItem &recoRoiItem, - MissingFrames &missingFrames); + MissingFrames &missingFrames, + FilterBeforeBox *filterBefore); Control( QWidget &parent, QGraphicsScene &scene, @@ -55,7 +57,8 @@ public: RoiItem &trackRoiItem, RoiItem &recoRoiItem, Ui::Control *ui, - MissingFrames &missingFrames); + MissingFrames &missingFrames, + FilterBeforeBox *filterBefore); void setScene(QGraphicsScene *sc); @@ -547,25 +550,8 @@ private slots: void on_roiShow_stateChanged(int i); void on_roiFix_stateChanged(int i); - void on_filterBrightContrast_stateChanged(int i); - void on_filterContrastParam_valueChanged(int i); - void on_filterBrightParam_valueChanged(int i); - void on_filterBorder_stateChanged(int i); - void on_filterBorderParamSize_valueChanged(int i); - void on_filterBorderParamCol_clicked(); - void on_filterBg_stateChanged(int i); - void on_filterBgShow_stateChanged(int i); - void on_filterBgUpdate_stateChanged(int i); - void on_filterBgReset_clicked(); - void on_filterBgSave_clicked(); - void on_filterBgLoad_clicked(); - void on_filterSwap_stateChanged(int i); - void on_filterSwapH_stateChanged(int i); - void on_filterSwapV_stateChanged(int i); - void on_intrinsicParamsChanged(IntrinsicCameraParams params); - void on_coordShow_stateChanged(int i); void on_coordFix_stateChanged(int i); void on_coordRotate_valueChanged(int i); @@ -645,11 +631,12 @@ signals: void userChangedRecoMethod(reco::RecognitionMethod method); private: - Petrack *mMainWindow; - Ui::Control *mUi; - IntrinsicBox *mIntr; - QGraphicsScene *mScene; - bool mColorChanging; + Petrack *mMainWindow; + Ui::Control *mUi; + IntrinsicBox *mIntr; + FilterBeforeBox *mFilterBefore; + QGraphicsScene *mScene; + bool mColorChanging; bool mIndexChanging; // shows, if the index of the color model is really changing; nor while constructor (initialer // durchlauf) and may be while loading xml file bool mLoading; // shows, if new project is just loading diff --git a/include/filterBeforeBox.h b/include/filterBeforeBox.h index 12fa50f88ae17e44de82704c07d0b9cb411e279d..384d849eda428cc111f5412f435c8dc6855dfed5 100644 --- a/include/filterBeforeBox.h +++ b/include/filterBeforeBox.h @@ -26,6 +26,11 @@ namespace Ui class FilterBeforeBox; } class QDomElement; +class BackgroundFilter; +class BrightContrastFilter; +class BorderFilter; +class SwapFilter; +class BackgroundItem; struct FilterSettings { @@ -42,13 +47,21 @@ class FilterBeforeBox : public QGroupBox Q_OBJECT public: - explicit FilterBeforeBox(QWidget *parent); + explicit FilterBeforeBox( + QWidget *parent, + BackgroundFilter &bgFilter, + BrightContrastFilter &brightContrastFilter, + BorderFilter &borderFilter, + SwapFilter &swapFilter, + std::function<void()> updateImageCallback); FilterBeforeBox(const FilterBeforeBox &) = delete; FilterBeforeBox(FilterBeforeBox &&) = delete; FilterBeforeBox &operator=(const FilterBeforeBox &) = delete; FilterBeforeBox &operator=(FilterBeforeBox &&) = delete; ~FilterBeforeBox() override; + void setBackgroundItem(BackgroundItem *item); + int getFilterBorderSize() const; void setFilterBorderSizeMin(int i); void setFilterBorderSizeMax(int i); @@ -63,9 +76,32 @@ public: bool getXmlSub(QDomElement &subSubElem); void setXml(QDomElement &subElem, QColor bgColor, const QString &bgFilename) const; +private slots: + void on_filterBrightContrast_stateChanged(int i); + void on_filterContrastParam_valueChanged(int i); + void on_filterBrightParam_valueChanged(int i); + void on_filterBorder_stateChanged(int i); + void on_filterBorderParamSize_valueChanged(int i); + void on_filterBorderParamCol_clicked(); + void on_filterBg_stateChanged(int i); + void on_filterBgShow_stateChanged(int i); + void on_filterBgUpdate_stateChanged(int i); + void on_filterBgReset_clicked(); + void on_filterBgSave_clicked(); + void on_filterBgLoad_clicked(); + void on_filterSwap_stateChanged(int i); + void on_filterSwapH_stateChanged(int i); + void on_filterSwapV_stateChanged(int i); + private: - Ui::FilterBeforeBox *mUi; - bool mShowBackgroundCache; + Ui::FilterBeforeBox *mUi; + bool mShowBackgroundCache; + std::function<void()> mUpdateImageCallback; + BackgroundFilter &mBgFilter; + BrightContrastFilter &mBrightContrastFilter; + BorderFilter &mBorderFilter; + SwapFilter &mSwapFilter; + BackgroundItem *mBgItem; }; #endif // FILTERBEFOREBOX_H diff --git a/src/autoCalib.cpp b/src/autoCalib.cpp index e113b6e56899ef6232600f89606495fbd66a2888..6acfd674fbbc36285411b5381e8b8db221f02ecd 100644 --- a/src/autoCalib.cpp +++ b/src/autoCalib.cpp @@ -18,7 +18,6 @@ #include "autoCalib.h" -#include "control.h" #include "logger.h" #include "pMessageBox.h" #include "petrack.h" @@ -35,8 +34,7 @@ AutoCalib::AutoCalib() { - mMainWindow = nullptr; - mControlWidget = nullptr; + mMainWindow = nullptr; // 6x8 und 4.6cm passen zu dem Schachbrettmuster auf der Eisenplatte mit Griff mBoardSizeX = 6; @@ -48,8 +46,7 @@ AutoCalib::~AutoCalib() {} void AutoCalib::setMainWindow(Petrack *mw) { - mMainWindow = mw; - mControlWidget = mw->getControlWidget(); + mMainWindow = mw; } bool AutoCalib::isEmptyCalibFiles() diff --git a/src/backgroundItem.cpp b/src/backgroundItem.cpp index 7cd55d983f127397579d802f7ddf8e574cf59a72..e2eda03bada152181b3d9115e069127cc7d5e9d3 100644 --- a/src/backgroundItem.cpp +++ b/src/backgroundItem.cpp @@ -18,6 +18,7 @@ #include "backgroundItem.h" +#include "filterBeforeBox.h" #include "petrack.h" #include "view.h" @@ -26,10 +27,12 @@ // in x und y gleichermassen skaliertes koordinatensystem, // da von einer vorherigen intrinsischen kamerakalibrierung ausgegenagen wird, // so dass pixel quadratisch -BackgroundItem::BackgroundItem(QWidget *wParent, QGraphicsItem *parent) : QGraphicsItem(parent) +BackgroundItem::BackgroundItem(QWidget *wParent, QGraphicsItem *parent, FilterBeforeBox &filterBefore) : + QGraphicsItem(parent) { mMainWindow = (class Petrack *) wParent; mImage = nullptr; + filterBefore.setBackgroundItem(this); // setEnabled(false); // all mouse events cannot access this item, but it will be seen // einzig move koennte interessant sein, um grid zu verschieben?! } diff --git a/src/control.cpp b/src/control.cpp index e735be855eac3e9ce15b0273f0fb3766ac729cc4..8c0061d7034ef80034461a9153ba808f0462e9a5 100644 --- a/src/control.cpp +++ b/src/control.cpp @@ -26,6 +26,7 @@ #include "colorMarkerWidget.h" #include "colorPlot.h" #include "colorRangeWidget.h" +#include "filterBeforeBox.h" #include "imageItem.h" #include "intrinsicBox.h" #include "logger.h" @@ -51,8 +52,9 @@ Control::Control( reco::Recognizer &recognizer, RoiItem &trackRoiItem, RoiItem &recoRoiItem, - MissingFrames &missingFrames) : - Control(parent, scene, recognizer, trackRoiItem, recoRoiItem, new Ui::Control(), missingFrames) + MissingFrames &missingFrames, + FilterBeforeBox *filterBefore) : + Control(parent, scene, recognizer, trackRoiItem, recoRoiItem, new Ui::Control(), missingFrames, filterBefore) { } @@ -63,8 +65,9 @@ Control::Control( RoiItem &trackRoiItem, RoiItem &recoRoiItem, Ui::Control *ui, - MissingFrames &missingFrames) : - QWidget(&parent), mUi(ui) + MissingFrames &missingFrames, + FilterBeforeBox *filterBefore) : + QWidget(&parent), mUi(ui), mFilterBefore(filterBefore) { setAccessibleName("Control"); mMainWindow = (class Petrack *) &parent; @@ -90,20 +93,17 @@ Control::Control( QObject::connect( &missingFrames, &MissingFrames::executeChanged, mUi->missingFramesCalculated, &QCheckBox::setChecked); - mIntr = new IntrinsicBox( - this, - *mMainWindow->getAutoCalib(), - *mMainWindow->getCalibFilter(), - [this]() + auto updateImageCallback = [this]() + { + if(!mMainWindow->isLoading()) { - if(!mMainWindow->isLoading()) - { - mMainWindow->updateImage(); - } - }); - mIntr->setObjectName(QString::fromUtf8("intr")); + mMainWindow->updateImage(); + } + }; - ui->verticalLayout_13->insertWidget(1, mIntr); + // layout reparents widget + ui->verticalLayout_13->insertWidget(0, mFilterBefore); + mFilterBefore->setObjectName("filterBeforeBox"); FilterSettings filterSettings; filterSettings.useBrightContrast = mMainWindow->getBrightContrastFilter()->getEnabled(); @@ -113,7 +113,17 @@ Control::Control( filterSettings.useSwap = mMainWindow->getSwapFilter()->getEnabled(); filterSettings.useSwapH = mMainWindow->getSwapFilter()->getSwapHorizontally().getValue(); filterSettings.useSwapV = mMainWindow->getSwapFilter()->getSwapVertically().getValue(); - mUi->filterBeforeBox->setFilterSettings(filterSettings); + mFilterBefore->setFilterSettings(filterSettings); + + mIntr = new IntrinsicBox(this, *mMainWindow->getAutoCalib(), *mMainWindow->getCalibFilter(), updateImageCallback); + mIntr->setObjectName(QString::fromUtf8("intr")); + + ui->verticalLayout_13->insertWidget(1, mIntr); + + // integrate new widgets in tabbing order + ui->calib->setFocusProxy(ui->rot1); + QWidget::setTabOrder(mFilterBefore, mIntr); + QWidget::setTabOrder(mIntr, ui->calib); connect(mIntr, &IntrinsicBox::paramsChanged, this, &Control::on_intrinsicParamsChanged); @@ -611,30 +621,30 @@ bool Control::getAdaptiveLevel() const int Control::getFilterBorderSize() const { - return mUi->filterBeforeBox->getFilterBorderSize(); + return mFilterBefore->getFilterBorderSize(); } void Control::setFilterBorderSizeMin(int i) { - mUi->filterBeforeBox->setFilterBorderSizeMin(i); + mFilterBefore->setFilterBorderSizeMin(i); } void Control::setFilterBorderSizeMax(int i) { - mUi->filterBeforeBox->setFilterBorderSizeMax(i); + mFilterBefore->setFilterBorderSizeMax(i); } bool Control::isFilterBgChecked() const { - return mUi->filterBeforeBox->isFilterBgChecked(); + return mFilterBefore->isFilterBgChecked(); } bool Control::isFilterBgDeleteTrjChecked() const { - return mUi->filterBeforeBox->isFilterBgDeleteTrjChecked(); + return mFilterBefore->isFilterBgDeleteTrjChecked(); } int Control::getFilterBgDeleteNumber() const { - return mUi->filterBeforeBox->getFilterBgDeleteNumber(); + return mFilterBefore->getFilterBgDeleteNumber(); } void Control::imageSizeChanged(int width, int height, int borderDiff) @@ -1903,173 +1913,6 @@ void Control::on_trackRoiFix_stateChanged(int i) } //---------------------- calibration -void Control::on_filterBrightContrast_stateChanged(int i) -{ - if(i == Qt::Checked) - { - mMainWindow->getBrightContrastFilter()->enable(); - } - else if(i == Qt::Unchecked) - { - mMainWindow->getBrightContrastFilter()->disable(); - } - if(!mMainWindow->isLoading()) - { - mMainWindow->updateImage(); - } -} - -void Control::on_filterContrastParam_valueChanged(int i) -{ - mMainWindow->getBrightContrastFilter()->getContrast().setValue(i); - if(!mMainWindow->isLoading()) - { - mMainWindow->updateImage(); - } -} - -void Control::on_filterBrightParam_valueChanged(int i) -{ - mMainWindow->getBrightContrastFilter()->getBrightness().setValue(i); - if(!mMainWindow->isLoading()) - { - mMainWindow->updateImage(); - } -} - -void Control::on_filterBorder_stateChanged(int i) -{ - if(i == Qt::Checked) - { - mMainWindow->getBorderFilter()->enable(); - } - else if(i == Qt::Unchecked) - { - mMainWindow->getBorderFilter()->disable(); - } - if(!mMainWindow->isLoading()) - { - mMainWindow->updateImage(); - } -} - -void Control::on_filterBorderParamSize_valueChanged(int i) -{ - mMainWindow->setImageBorderSize(2 * i); // 2* because undistored has problem with sizes not dividable of 4 - if(!mMainWindow->isLoading()) - { - mMainWindow->updateImage(); - } -} - -void Control::on_filterBorderParamCol_clicked() -{ - BorderFilter *bf = mMainWindow->getBorderFilter(); - QColor color = QColorDialog::getColor( - QColor(bf->getBorderColR().getValue(), bf->getBorderColG().getValue(), bf->getBorderColB().getValue()), this); - bf->getBorderColR().setValue(color.red()); - bf->getBorderColG().setValue(color.green()); - bf->getBorderColB().setValue(color.blue()); - if(!mMainWindow->isLoading()) - { - mMainWindow->updateImage(); - } -} - -void Control::on_filterSwap_stateChanged(int i) -{ - if(i == Qt::Checked) - { - mMainWindow->getSwapFilter()->enable(); - } - else if(i == Qt::Unchecked) - { - mMainWindow->getSwapFilter()->disable(); - } - if(!mMainWindow->isLoading()) - { - mMainWindow->updateImage(); - } -} - -void Control::on_filterSwapH_stateChanged(int i) -{ - mMainWindow->getSwapFilter()->getSwapHorizontally().setValue(i == Qt::Checked); - - if(!mMainWindow->isLoading()) - { - mMainWindow->updateImage(); - } -} - -void Control::on_filterSwapV_stateChanged(int i) -{ - mMainWindow->getSwapFilter()->getSwapVertically().setValue(i == Qt::Checked); - - if(!mMainWindow->isLoading()) - { - mMainWindow->updateImage(); - } -} - -void Control::on_filterBg_stateChanged(int i) -{ - mUi->filterBeforeBox->toggleBackgroundUi(static_cast<Qt::CheckState>(i)); - if(i == Qt::Checked) - { - mMainWindow->getBackgroundFilter()->enable(); - } - else - { - mMainWindow->getBackgroundFilter()->disable(); - } - if(!mMainWindow->isLoading()) - { - mMainWindow->updateImage( - true); // true, da auch bei stehendem bild neue berechnungen durchgefuehrt werden sollen - } -} - -void Control::on_filterBgUpdate_stateChanged(int i) -{ - if(i == Qt::Checked) - { - mMainWindow->getBackgroundFilter()->setUpdate(true); // enable(); - } - else if(i == Qt::Unchecked) - { - mMainWindow->getBackgroundFilter()->setUpdate(false); //->disable(); - } -} - -void Control::on_filterBgReset_clicked() -{ - mMainWindow->getBackgroundFilter()->reset(); - if(!mMainWindow->isLoading()) - { - mMainWindow->updateImage(); - } -} - -void Control::on_filterBgShow_stateChanged(int i) -{ - mMainWindow->getBackgroundItem()->setVisible(i); - mScene->update(); -} - -void Control::on_filterBgSave_clicked() -{ - mMainWindow->getBackgroundFilter()->save(); -} - -void Control::on_filterBgLoad_clicked() -{ - mMainWindow->getBackgroundFilter()->load(); - if(!mMainWindow->isLoading()) - { - mMainWindow->updateImage(); - } -} void Control::on_intrinsicParamsChanged(IntrinsicCameraParams params) @@ -2530,7 +2373,7 @@ void Control::setXml(QDomElement &elem) { fn = getFileList(fn, mMainWindow->getProFileName()); } - mUi->filterBeforeBox->setXml(subElem, col, fn); + mFilterBefore->setXml(subElem, col, fn); // PATTERN and INTRINSIC_PARAMETERS elements mIntr->setXml(subElem); @@ -2860,7 +2703,7 @@ void Control::getXml(QDomElement &elem) for(subSubElem = subElem.firstChildElement(); !subSubElem.isNull(); subSubElem = subSubElem.nextSiblingElement()) { - if(mUi->filterBeforeBox->getXmlSub(subSubElem)) + if(mFilterBefore->getXmlSub(subSubElem)) { // intentionally left blank } diff --git a/src/filterBeforeBox.cpp b/src/filterBeforeBox.cpp index 231b8b2b112d133c623868e6b513e572d192a007..052218418487f59760a5081e7203458bf14b7be4 100644 --- a/src/filterBeforeBox.cpp +++ b/src/filterBeforeBox.cpp @@ -18,17 +18,39 @@ #include "filterBeforeBox.h" +#include "backgroundFilter.h" +#include "backgroundItem.h" +#include "borderFilter.h" +#include "brightContrastFilter.h" #include "helper.h" #include "pMessageBox.h" +#include "swapFilter.h" #include "ui_filterBeforeBox.h" +#include <QColorDialog> #include <QDomElement> -FilterBeforeBox::FilterBeforeBox(QWidget *parent) : QGroupBox(parent), mUi(new Ui::FilterBeforeBox) +FilterBeforeBox::FilterBeforeBox( + QWidget *parent, + BackgroundFilter &bgFilter, + BrightContrastFilter &brightContrastFilter, + BorderFilter &borderFilter, + SwapFilter &swapFilter, + std::function<void()> updateImageCallback) : + QGroupBox(parent), + mUi(new Ui::FilterBeforeBox), + mUpdateImageCallback(std::move(updateImageCallback)), + mBgFilter(bgFilter), + mBrightContrastFilter(brightContrastFilter), + mBorderFilter(borderFilter), + mSwapFilter(swapFilter) { mUi->setupUi(this); mShowBackgroundCache = mUi->filterBgShow->checkState(); toggleBackgroundUi(mUi->filterBg->checkState()); + + // FocusPolicy: TabFocus and first ui-element as proxy are needed for tab order + setFocusProxy(mUi->filterBrightContrast); } FilterBeforeBox::~FilterBeforeBox() @@ -36,6 +58,14 @@ FilterBeforeBox::~FilterBeforeBox() delete mUi; } +/// BackgroundItem is created after Control, but some Items need Control to work +/// Since we do not want to separate the initializations too much, we use a non-owning +/// pointer and setter approach +void FilterBeforeBox::setBackgroundItem(BackgroundItem *item) +{ + mBgItem = item; +} + void FilterBeforeBox::setFilterSettings(const FilterSettings &settings) { mUi->filterBrightContrast->setChecked(settings.useBrightContrast); @@ -240,3 +270,141 @@ void FilterBeforeBox::toggleBackgroundUi(Qt::CheckState state) mUi->label_65->setEnabled(false); } } + +void FilterBeforeBox::on_filterBrightContrast_stateChanged(int i) +{ + if(i == Qt::Checked) + { + mBrightContrastFilter.enable(); + } + else if(i == Qt::Unchecked) + { + mBrightContrastFilter.disable(); + } + mUpdateImageCallback(); +} + +void FilterBeforeBox::on_filterContrastParam_valueChanged(int i) +{ + mBrightContrastFilter.getContrast().setValue(i); + mUpdateImageCallback(); +} + +void FilterBeforeBox::on_filterBrightParam_valueChanged(int i) +{ + mBrightContrastFilter.getBrightness().setValue(i); + mUpdateImageCallback(); +} + +void FilterBeforeBox::on_filterBorder_stateChanged(int i) +{ + if(i == Qt::Checked) + { + mBorderFilter.enable(); + } + else if(i == Qt::Unchecked) + { + mBorderFilter.disable(); + } + mUpdateImageCallback(); +} + +void FilterBeforeBox::on_filterBorderParamSize_valueChanged(int i) +{ + // 2* because undistored has problem with sizes not dividable of 4 + mBorderFilter.getBorderSize().setValue(2 * i); + mUpdateImageCallback(); +} + +void FilterBeforeBox::on_filterBorderParamCol_clicked() +{ + QColor color = QColorDialog::getColor( + QColor( + mBorderFilter.getBorderColR().getValue(), + mBorderFilter.getBorderColG().getValue(), + mBorderFilter.getBorderColB().getValue()), + this); + mBorderFilter.getBorderColR().setValue(color.red()); + mBorderFilter.getBorderColG().setValue(color.green()); + mBorderFilter.getBorderColB().setValue(color.blue()); + mUpdateImageCallback(); +} + +void FilterBeforeBox::on_filterSwap_stateChanged(int i) +{ + if(i == Qt::Checked) + { + mSwapFilter.enable(); + } + else if(i == Qt::Unchecked) + { + mSwapFilter.disable(); + } + mUpdateImageCallback(); +} + +void FilterBeforeBox::on_filterSwapH_stateChanged(int i) +{ + mSwapFilter.getSwapHorizontally().setValue(i == Qt::Checked); + + mUpdateImageCallback(); +} + +void FilterBeforeBox::on_filterSwapV_stateChanged(int i) +{ + mSwapFilter.getSwapVertically().setValue(i == Qt::Checked); + + mUpdateImageCallback(); +} + +void FilterBeforeBox::on_filterBg_stateChanged(int i) +{ + toggleBackgroundUi(static_cast<Qt::CheckState>(i)); + if(i == Qt::Checked) + { + mBgFilter.enable(); + } + else + { + mBgFilter.disable(); + } + mUpdateImageCallback(); +} + +void FilterBeforeBox::on_filterBgUpdate_stateChanged(int i) +{ + if(i == Qt::Checked) + { + mBgFilter.setUpdate(true); + } + else if(i == Qt::Unchecked) + { + mBgFilter.setUpdate(false); + } +} + +void FilterBeforeBox::on_filterBgReset_clicked() +{ + mBgFilter.reset(); + mUpdateImageCallback(); +} + +void FilterBeforeBox::on_filterBgShow_stateChanged(int i) +{ + if(mBgItem) + { + mBgItem->setVisible(i); + mUpdateImageCallback(); + } +} + +void FilterBeforeBox::on_filterBgSave_clicked() +{ + mBgFilter.save(); +} + +void FilterBeforeBox::on_filterBgLoad_clicked() +{ + mBgFilter.load(); + mUpdateImageCallback(); +} diff --git a/src/intrinsicBox.cpp b/src/intrinsicBox.cpp index b7c523bffd4a9eb27b07ccc0f2c14afa1a073a4c..f3faaa8e093915d2ef30a7b4a5de1b42b73e8528 100644 --- a/src/intrinsicBox.cpp +++ b/src/intrinsicBox.cpp @@ -55,6 +55,9 @@ IntrinsicBox::IntrinsicBox( mUi->apply->setCheckState(mCalibFilter.getEnabled() ? Qt::Checked : Qt::Unchecked); setIntrinsicCameraParams(mCalibFilter.getCamParams().getValue()); + + // FocusPolicy: TabFocus and first ui-element as proxy are needed for tab order + setFocusProxy(mUi->apply); } IntrinsicBox::~IntrinsicBox() diff --git a/src/petrack.cpp b/src/petrack.cpp index 8dc88f8d72b543954a1d7e823c84402ff1d87f9b..c71e5c01dbcb483c9a926a4aa4fecedda98bc6e5 100644 --- a/src/petrack.cpp +++ b/src/petrack.cpp @@ -32,6 +32,7 @@ #include "colorMarkerWidget.h" #include "colorRangeWidget.h" #include "control.h" +#include "filterBeforeBox.h" #include "gridItem.h" #include "helper.h" #include "imageItem.h" @@ -110,7 +111,29 @@ Petrack::Petrack(QString petrackVersion) : connect(mRecognitionRoiItem, &RoiItem::changed, this, [=]() { this->setRecognitionChanged(true); }); mRecognitionRoiItem->setZValue(5); // groesser heisst weiter oben - mControlWidget = new Control(*this, *mScene, mReco, *mTrackingRoiItem, *mRecognitionRoiItem, mMissingFrames); + + // setup control + + auto updateImageCallback = [this]() + { + if(!isLoading()) + { + updateImage(); + } + }; + + auto *filterBeforeBox = new FilterBeforeBox( + nullptr, // reparented when added to layout + *getBackgroundFilter(), + *getBrightContrastFilter(), + *getBorderFilter(), + *getSwapFilter(), + updateImageCallback); + + mControlWidget = + new Control(*this, *mScene, mReco, *mTrackingRoiItem, *mRecognitionRoiItem, mMissingFrames, filterBeforeBox); + + // end setup control mStereoWidget = new StereoWidget(this); mStereoWidget->setWindowFlags(Qt::Window); @@ -210,7 +233,7 @@ Petrack::Petrack(QString petrackVersion) : //--------------------------- - mBackgroundItem = new BackgroundItem(this); + mBackgroundItem = new BackgroundItem(this, nullptr, *filterBeforeBox); mBackgroundItem->setZValue(2.2); // um so groesser um so hoeher um so eher zu sehen mBackgroundItem->setVisible(false); diff --git a/ui/control.ui b/ui/control.ui index f6bfb84ebf2b64a87ce78ee4cd1be036d9e41129..a502857e4dd62d228b84dd14ef37e0597d3b9d57 100644 --- a/ui/control.ui +++ b/ui/control.ui @@ -89,6 +89,9 @@ <verstretch>0</verstretch> </sizepolicy> </property> + <property name="focusPolicy"> + <enum>Qt::TabFocus</enum> + </property> <attribute name="title"> <string>calibration</string> </attribute> @@ -137,7 +140,7 @@ <x>0</x> <y>0</y> <width>477</width> - <height>641</height> + <height>619</height> </rect> </property> <property name="sizePolicy"> @@ -147,13 +150,6 @@ </sizepolicy> </property> <layout class="QVBoxLayout" name="verticalLayout_13"> - <item> - <widget class="FilterBeforeBox" name="filterBeforeBox"> - <property name="title"> - <string>filter before</string> - </property> - </widget> - </item> <item> <widget class="QGroupBox" name="extr"> <property name="sizePolicy"> @@ -6446,16 +6442,9 @@ </widget> <customwidgets> <customwidget> - <class>AnalysePlot</class> - <extends>QFrame</extends> - <header>analysePlot.h</header> - <container>1</container> - </customwidget> - <customwidget> - <class>ColorPlot</class> - <extends>QFrame</extends> - <header>colorPlot.h</header> - <container>1</container> + <class>PSpinBox</class> + <extends>QSpinBox</extends> + <header>pspinbox.h</header> </customwidget> <customwidget> <class>PDoubleSpinBox</class> @@ -6463,14 +6452,15 @@ <header>pdoublespinbox.h</header> </customwidget> <customwidget> - <class>PSpinBox</class> - <extends>QSpinBox</extends> - <header>pspinbox.h</header> + <class>AnalysePlot</class> + <extends>QFrame</extends> + <header>analysePlot.h</header> + <container>1</container> </customwidget> <customwidget> - <class>FilterBeforeBox</class> - <extends>QGroupBox</extends> - <header>filterBeforeBox.h</header> + <class>ColorPlot</class> + <extends>QFrame</extends> + <header>colorPlot.h</header> <container>1</container> </customwidget> </customwidgets> diff --git a/ui/filterBeforeBox.ui b/ui/filterBeforeBox.ui index fb59fae5c602715f6652cca5e2746429d0423f06..dcea60d0b22c3a8da51d3fddb84753f187d08e41 100644 --- a/ui/filterBeforeBox.ui +++ b/ui/filterBeforeBox.ui @@ -28,6 +28,9 @@ <height>16777215</height> </size> </property> + <property name="focusPolicy"> + <enum>Qt::TabFocus</enum> + </property> <property name="windowTitle"> <string>GroupBox</string> </property> @@ -399,6 +402,16 @@ </widget> </item> </layout> + <zorder>filterBorder</zorder> + <zorder>line_2</zorder> + <zorder>filterBg</zorder> + <zorder>filterBrightParam</zorder> + <zorder>line</zorder> + <zorder>filterSwap</zorder> + <zorder>filterContrastParam</zorder> + <zorder>label_20</zorder> + <zorder>line_3</zorder> + <zorder>filterBrightContrast</zorder> </widget> <customwidgets> <customwidget> @@ -407,6 +420,23 @@ <header>pspinbox.h</header> </customwidget> </customwidgets> + <tabstops> + <tabstop>filterBrightContrast</tabstop> + <tabstop>filterBorder</tabstop> + <tabstop>filterBorderParamSize_spin</tabstop> + <tabstop>filterBorderParamCol</tabstop> + <tabstop>filterBg</tabstop> + <tabstop>filterBgShow</tabstop> + <tabstop>filterBgUpdate</tabstop> + <tabstop>filterBgReset</tabstop> + <tabstop>filterBgLoad</tabstop> + <tabstop>filterBgSave</tabstop> + <tabstop>filterBgDeleteTrj</tabstop> + <tabstop>filterBgDeleteNumber</tabstop> + <tabstop>filterSwap</tabstop> + <tabstop>filterSwapH</tabstop> + <tabstop>filterSwapV</tabstop> + </tabstops> <resources/> <connections> <connection> diff --git a/ui/intrinsicBox.ui b/ui/intrinsicBox.ui index 3f0dbff8c39970d56857af34ffd2beb06d1993f8..326720641640fe308a2c88bdd24b0d670be879be 100644 --- a/ui/intrinsicBox.ui +++ b/ui/intrinsicBox.ui @@ -28,6 +28,9 @@ <height>16777215</height> </size> </property> + <property name="focusPolicy"> + <enum>Qt::TabFocus</enum> + </property> <property name="windowTitle"> <string>GroupBox</string> </property> @@ -797,17 +800,47 @@ </layout> </widget> <customwidgets> - <customwidget> - <class>PDoubleSpinBox</class> - <extends>QDoubleSpinBox</extends> - <header>pdoublespinbox.h</header> - </customwidget> <customwidget> <class>PSpinBox</class> <extends>QSpinBox</extends> <header>pspinbox.h</header> </customwidget> + <customwidget> + <class>PDoubleSpinBox</class> + <extends>QDoubleSpinBox</extends> + <header>pdoublespinbox.h</header> + </customwidget> </customwidgets> + <tabstops> + <tabstop>apply</tabstop> + <tabstop>fx</tabstop> + <tabstop>fy</tabstop> + <tabstop>cx</tabstop> + <tabstop>cy</tabstop> + <tabstop>r2</tabstop> + <tabstop>r4</tabstop> + <tabstop>r6</tabstop> + <tabstop>tx</tabstop> + <tabstop>ty</tabstop> + <tabstop>k4</tabstop> + <tabstop>k5</tabstop> + <tabstop>k6</tabstop> + <tabstop>s1</tabstop> + <tabstop>s2</tabstop> + <tabstop>s3</tabstop> + <tabstop>s4</tabstop> + <tabstop>taux</tabstop> + <tabstop>tauy</tabstop> + <tabstop>quadAspectRatio</tabstop> + <tabstop>fixCenter</tabstop> + <tabstop>tangDist</tabstop> + <tabstop>extModelCheckBox</tabstop> + <tabstop>boardSizeX</tabstop> + <tabstop>boardSizeY</tabstop> + <tabstop>squareSize</tabstop> + <tabstop>autoCalib</tabstop> + <tabstop>calibFiles</tabstop> + </tabstops> <resources/> <connections/> </ui>