From 91e256f2c81a2bb26bef21ad008d7d02f31d0e38 Mon Sep 17 00:00:00 2001 From: vsv Date: Tue, 21 Jan 2020 17:18:07 +0300 Subject: [PATCH] Set scroll area for B-Spline widgets --- src/PartSet/PartSet_BSplineWidget.cpp | 46 +++++++------ src/PartSet/PartSet_BSplineWidget.h | 5 +- src/PartSet/PartSet_WidgetBSplinePoints.cpp | 71 +++++++++++++-------- src/PartSet/PartSet_WidgetBSplinePoints.h | 5 +- 4 files changed, 77 insertions(+), 50 deletions(-) diff --git a/src/PartSet/PartSet_BSplineWidget.cpp b/src/PartSet/PartSet_BSplineWidget.cpp index 7093c28fd..893306dc1 100644 --- a/src/PartSet/PartSet_BSplineWidget.cpp +++ b/src/PartSet/PartSet_BSplineWidget.cpp @@ -33,6 +33,7 @@ #include #include #include +#include PartSet_BSplineWidget::PartSet_BSplineWidget( @@ -41,18 +42,36 @@ PartSet_BSplineWidget::PartSet_BSplineWidget( : ModuleBase_ModelWidget(theParent, theData) { QVBoxLayout* aMainLayout = new QVBoxLayout(this); - ModuleBase_Tools::adjustMargins(aMainLayout); + aMainLayout->setContentsMargins(0, 0, 0, 0); // GroupBox to keep widgets for B-spline poles and weights - myPolesGroupBox = new QGroupBox(tr("Poles and weights"), theParent); + myPolesGroupBox = new QGroupBox(tr("Poles and weights"), this); aMainLayout->addWidget(myPolesGroupBox); + + QVBoxLayout* aLayout = new QVBoxLayout(myPolesGroupBox); + ModuleBase_Tools::adjustMargins(aLayout); + + myScrollArea = new QScrollArea(myPolesGroupBox); + myScrollArea->setWidgetResizable(true); + myScrollArea->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); + myScrollArea->setFrameStyle(QFrame::NoFrame); + aLayout->addWidget(myScrollArea); + + QWidget* aContainer = new QWidget(myScrollArea); + QVBoxLayout* aBoxLay = new QVBoxLayout(aContainer); + aBoxLay->setContentsMargins(0, 0, 0, 0); + // layout of GroupBox - QGridLayout* aGroupLayout = new QGridLayout(myPolesGroupBox); + myPolesWgt = new QWidget(aContainer); + QGridLayout* aGroupLayout = new QGridLayout(myPolesWgt); aGroupLayout->setSpacing(4); aGroupLayout->setColumnStretch(1, 1); ModuleBase_Tools::adjustMargins(aGroupLayout); restoreValueCustom(); + aBoxLay->addWidget(myPolesWgt); + aBoxLay->addStretch(1); + myScrollArea->setWidget(aContainer); } void PartSet_BSplineWidget::setFeature(const FeaturePtr& theFeature, @@ -73,26 +92,17 @@ void PartSet_BSplineWidget::deactivate() QList PartSet_BSplineWidget::getControls() const { QList aControls; - std::list::const_iterator anIt = myPoles.begin(); - for (; anIt != myPoles.end(); ++anIt) { - aControls.append(anIt->myWeight); - } + aControls.append(myScrollArea); return aControls; } void PartSet_BSplineWidget::storePolesAndWeights() const { std::shared_ptr aData = myFeature->data(); - //AttributePoint2DArrayPtr aPointArray = std::dynamic_pointer_cast( - // aData->attribute(SketchPlugin_BSpline::POLES_ID())); AttributeDoubleArrayPtr aWeightsArray = aData->realArray(SketchPlugin_BSpline::WEIGHTS_ID()); - //aPointArray->setSize((int)myPoles.size()); - //aWeightsArray->setSize((int)myPoles.size()); - std::list::const_iterator anIt = myPoles.begin(); for (int anIndex = 0; anIt != myPoles.end(); ++anIndex, ++anIt) { - //aPointArray->setPnt(anIndex, anIt->myX->value(), anIt->myY->value()); aWeightsArray->setValue(anIndex, anIt->myWeight->value()); } } @@ -103,17 +113,11 @@ bool PartSet_BSplineWidget::storeValueCustom() if (!aData || !aData->isValid()) // can be on abort of sketcher element return false; - //AttributePoint2DArrayPtr aPoles = std::dynamic_pointer_cast( - // aData->attribute(SketchPlugin_BSpline::POLES_ID())); AttributeDoubleArrayPtr aWeights = aData->realArray(SketchPlugin_BSpline::WEIGHTS_ID()); bool isBlocked = blockSignals(true); - //bool isImmutable = aPoles->setImmutable(true); - storePolesAndWeights(); ModuleBase_Tools::flushUpdated(myFeature); - - //aPoles->setImmutable(isImmutable); blockSignals(isBlocked); updateObject(myFeature); @@ -149,7 +153,7 @@ bool PartSet_BSplineWidget::restoreValueCustom() void PartSet_BSplineWidget::addPoleWidget() { - QGridLayout* aGroupLay = dynamic_cast(myPolesGroupBox->layout()); + QGridLayout* aGroupLay = dynamic_cast(myPolesWgt->layout()); ModuleBase_Tools::adjustMargins(aGroupLay); int aNbPoles = (int)myPoles.size(); @@ -157,7 +161,7 @@ void PartSet_BSplineWidget::addPoleWidget() QString aPoleStr = tr("Pole %1"); aPoleStr = aPoleStr.arg(aNbPoles + 1); - QGroupBox* aPoleGroupBox = new QGroupBox(aPoleStr, myPolesGroupBox); + QGroupBox* aPoleGroupBox = new QGroupBox(aPoleStr, myPolesWgt); QFormLayout* aPoleLay = new QFormLayout(aPoleGroupBox); ModuleBase_Tools::adjustMargins(aPoleLay); aPoleLay->setSpacing(2); diff --git a/src/PartSet/PartSet_BSplineWidget.h b/src/PartSet/PartSet_BSplineWidget.h index 29a5fea88..ee2030894 100644 --- a/src/PartSet/PartSet_BSplineWidget.h +++ b/src/PartSet/PartSet_BSplineWidget.h @@ -30,6 +30,7 @@ #include class QGroupBox; +class QScrollArea; /** \brief Represent a content of the property panel to show/modify parameters of B-spline curve. @@ -82,7 +83,9 @@ private: ModuleBase_ParamSpinBox* myWeight; }; - QGroupBox* myPolesGroupBox; ///< widget to show poles and weights of B-spline curve + QWidget* myPolesWgt; ///< widget to show poles and weights of B-spline curve + QGroupBox* myPolesGroupBox; + QScrollArea* myScrollArea; std::list myPoles; ///< list of B-spline poles and their weights }; diff --git a/src/PartSet/PartSet_WidgetBSplinePoints.cpp b/src/PartSet/PartSet_WidgetBSplinePoints.cpp index 6a18e7e5b..5ccc381e1 100644 --- a/src/PartSet/PartSet_WidgetBSplinePoints.cpp +++ b/src/PartSet/PartSet_WidgetBSplinePoints.cpp @@ -60,9 +60,13 @@ #include #include #include +#include static const double MaxCoordinate = 1e12; +static bool IsPointCreated = false; + + PartSet_WidgetBSplinePoints::PartSet_WidgetBSplinePoints(QWidget* theParent, ModuleBase_IWorkshop* theWorkshop, const Config_WidgetAPI* theData) @@ -72,28 +76,45 @@ PartSet_WidgetBSplinePoints::PartSet_WidgetBSplinePoints(QWidget* theParent, myPointIndex(0), myFinished(false) { myRefAttribute = theData->getProperty("reference_attribute"); + QVBoxLayout* aMainLayout = new QVBoxLayout(this); + ModuleBase_Tools::zeroMargins(aMainLayout); // the control should accept the focus, so the boolean flag is corrected to be true myIsObligatory = true; QString aPageName = translate(theData->getProperty(CONTAINER_PAGE_NAME)); - myGroupBox = new QGroupBox(aPageName, theParent); - myGroupBox->setFlat(false); + myBox = new QGroupBox(aPageName, theParent); + myBox->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); + myBox->setFlat(false); + aMainLayout->addWidget(myBox); bool aAcceptVariables = theData->getBooleanAttribute(DOUBLE_WDG_ACCEPT_EXPRESSIONS, true); // B-spline weights attribute myWeightsAttr = theData->getProperty("weights"); + QVBoxLayout* aLayout = new QVBoxLayout(myBox); + ModuleBase_Tools::adjustMargins(aLayout); + + myScrollArea = new QScrollArea(myBox); + myScrollArea->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); + myScrollArea->setWidgetResizable(true); + myScrollArea->setFrameStyle(QFrame::NoFrame); + aLayout->addWidget(myScrollArea); + + QWidget* aContainer = new QWidget(myScrollArea); + QVBoxLayout* aBoxLay = new QVBoxLayout(aContainer); + aBoxLay->setContentsMargins(0, 0, 0, 0); + + myGroupBox = new QWidget(aContainer); QGridLayout* aGroupLay = new QGridLayout(myGroupBox); ModuleBase_Tools::adjustMargins(aGroupLay); aGroupLay->setSpacing(4); aGroupLay->setColumnStretch(1, 1); createNextPoint(); + aBoxLay->addWidget(myGroupBox); + aBoxLay->addStretch(1); - QVBoxLayout* aLayout = new QVBoxLayout(this); - ModuleBase_Tools::zeroMargins(aLayout); - aLayout->addWidget(myGroupBox); - setLayout(aLayout); + myScrollArea->setWidget(aContainer); myWidgetValidator = new ModuleBase_WidgetValidator(this, myWorkshop); myExternalObjectMgr = new PartSet_ExternalObjectsMgr(theData->getProperty("use_external"), @@ -122,19 +143,24 @@ void PartSet_WidgetBSplinePoints::createNextPoint() aPoleLay->addWidget(myYSpin.back(), 1, 1); aGroupLay->addWidget(aPoleGroupBox, row, 1); - - setHighlighted(true); + IsPointCreated = true; } void PartSet_WidgetBSplinePoints::removeLastPoint() { QGridLayout* aGroupLay = dynamic_cast(myGroupBox->layout()); - aGroupLay->removeWidget(myYSpin.back()); - aGroupLay->removeWidget(myXSpin.back()); - aGroupLay->removeWidget(myXSpin.back()->parentWidget()); + QWidget* aXSpin = myXSpin.back(); + QWidget* aYSpin = myYSpin.back(); + QWidget* aBox = myXSpin.back()->parentWidget(); myYSpin.pop_back(); myXSpin.pop_back(); + aGroupLay->removeWidget(aXSpin); + aGroupLay->removeWidget(aYSpin); + aGroupLay->removeWidget(aBox); + + aBox->deleteLater(); + // update B-spline feature attributes storeValueCustom(); } @@ -417,22 +443,7 @@ bool PartSet_WidgetBSplinePoints::restoreCurentValue() QList PartSet_WidgetBSplinePoints::getControls() const { QList aControls; - std::vector::const_iterator aXIt = myXSpin.begin(); - std::vector::const_iterator aYIt = myYSpin.begin(); - for (; (*aXIt) != myXSpin.back() && (*aYIt) != myYSpin.back(); ++aXIt, ++aYIt) { - //aControls.append(*aXIt); - //aControls.append(*aYIt); - QGraphicsEffect* anEffect = (*aXIt)->graphicsEffect(); - if (anEffect) - anEffect->deleteLater(); - anEffect = (*aYIt)->graphicsEffect(); - if (anEffect) - anEffect->deleteLater(); - (*aXIt)->setGraphicsEffect(0); - (*aYIt)->setGraphicsEffect(0); - } - aControls.append(myXSpin.back()); - aControls.append(myYSpin.back()); + aControls.append(myScrollArea); return aControls; } @@ -558,6 +569,12 @@ void PartSet_WidgetBSplinePoints::mouseMoved(ModuleBase_IViewWindow* theWindow, setPoint(aX, aY); blockValueState(isBlocked); setValueState(ModifiedInViewer); + + if (IsPointCreated) { + QPoint aPnt = myGroupBox->geometry().bottomLeft(); + myScrollArea->ensureVisible(aPnt.x(), aPnt.y()); + IsPointCreated = false; + } } bool PartSet_WidgetBSplinePoints::processEscape() diff --git a/src/PartSet/PartSet_WidgetBSplinePoints.h b/src/PartSet/PartSet_WidgetBSplinePoints.h index 360af3580..8285ab9a4 100644 --- a/src/PartSet/PartSet_WidgetBSplinePoints.h +++ b/src/PartSet/PartSet_WidgetBSplinePoints.h @@ -32,6 +32,7 @@ class ModelAPI_CompositeFeature; class ModuleBase_LabelValue; class PartSet_ExternalObjectsMgr; class QGroupBox; +class QScrollArea; /**\class PartSet_WidgetBSplinePoints * \ingroup Modules @@ -158,7 +159,9 @@ protected: ModuleBase_IWorkshop* myWorkshop; ///< workshop private: - QGroupBox* myGroupBox; ///< the parent group box for all intenal widgets + QGroupBox* myBox; + QWidget* myGroupBox; ///< the parent group box for all intenal widgets + QScrollArea* myScrollArea; std::vector myXSpin; ///< the label for the X coordinate std::vector myYSpin; ///< the label for the Y coordinate PartSet_ExternalObjectsMgr* myExternalObjectMgr; ///< reference to external objects manager -- 2.39.2