diff --git a/src/Gui/CMakeLists.txt b/src/Gui/CMakeLists.txt index 3e3c05e4f9..cb7fa1890e 100644 --- a/src/Gui/CMakeLists.txt +++ b/src/Gui/CMakeLists.txt @@ -1146,6 +1146,9 @@ SET(Widget_CPP_SRCS Widgets.cpp Window.cpp WorkbenchSelector.cpp + ElideLabel.cpp + ElideCheckBox.cpp + FontScaledSVG.cpp ) SET(Widget_HPP_SRCS FileDialog.h @@ -1167,6 +1170,9 @@ SET(Widget_HPP_SRCS Widgets.h Window.h WorkbenchSelector.h + ElideLabel.h + ElideCheckBox.h + FontScaledSVG.h ) SET(Widget_SRCS ${Widget_CPP_SRCS} diff --git a/src/Gui/ElideCheckBox.cpp b/src/Gui/ElideCheckBox.cpp new file mode 100644 index 0000000000..8ca88b0d2e --- /dev/null +++ b/src/Gui/ElideCheckBox.cpp @@ -0,0 +1,76 @@ +// SPDX-License-Identifier: LGPL-2.1-or-later +/**************************************************************************** + * * + * Copyright (c) 2025 Alfredo Monclus * + * * + * This file is part of FreeCAD. * + * * + * FreeCAD is free software: you can redistribute it and/or modify it * + * under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 2.1 of the * + * License, or (at your option) any later version. * + * * + * FreeCAD is distributed in the hope that it will be useful, but * + * WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * + * Lesser General Public License for more details. * + * * + * You should have received a copy of the GNU Lesser General Public * + * License along with FreeCAD. If not, see * + * . * + * * + ***************************************************************************/ + +// This custom widget adds the missing ellipsize functionality in QT5 + +#include "PreCompiled.h" + +#include "ElideCheckBox.h" + +namespace Gui { + +const int CheckboxSpacing = 18; + +ElideCheckBox::ElideCheckBox(QWidget *parent) + : QCheckBox(parent) { +} + +void ElideCheckBox::paintEvent(QPaintEvent *event) { + Q_UNUSED(event); + QStyleOptionButton option; + option.initFrom(this); + option.state = (isChecked() ? QStyle::State_On : QStyle::State_Off) | + (isEnabled() ? QStyle::State_Enabled : QStyle::State_ReadOnly); + + QPainter painter(this); + style()->drawControl(QStyle::CE_CheckBox, &option, &painter, this); + + QRect textRect = option.rect; + textRect.setX(textRect.x() + CheckboxSpacing); + + constexpr int padding = 4; + QFontMetrics fm(font()); + QString elidedText = fm.elidedText(text(), Qt::ElideRight, textRect.width() - padding); + + painter.setPen(palette().color(QPalette::WindowText)); + painter.drawText(textRect, Qt::AlignLeft | Qt::AlignVCenter, elidedText); +} + +QSize ElideCheckBox::sizeHint() const { + QFontMetrics fm(font()); + int width = fm.horizontalAdvance(this->text()) + CheckboxSpacing; + int height = fm.height(); + return {width, height}; +} + +QSize ElideCheckBox::minimumSizeHint() const { + QFontMetrics fm(font()); + QString minimumText = QStringLiteral("A..."); + int width = fm.horizontalAdvance(minimumText) + CheckboxSpacing; + int height = fm.height(); + return {width, height}; +} + +} // namespace Gui + +#include "moc_ElideCheckBox.cpp" // NOLINT diff --git a/src/Gui/ElideCheckBox.h b/src/Gui/ElideCheckBox.h new file mode 100644 index 0000000000..ce93133b53 --- /dev/null +++ b/src/Gui/ElideCheckBox.h @@ -0,0 +1,56 @@ +// SPDX-License-Identifier: LGPL-2.1-or-later +/**************************************************************************** + * * + * Copyright (c) 2025 Alfredo Monclus * + * * + * This file is part of FreeCAD. * + * * + * FreeCAD is free software: you can redistribute it and/or modify it * + * under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 2.1 of the * + * License, or (at your option) any later version. * + * * + * FreeCAD is distributed in the hope that it will be useful, but * + * WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * + * Lesser General Public License for more details. * + * * + * You should have received a copy of the GNU Lesser General Public * + * License along with FreeCAD. If not, see * + * . * + * * + ***************************************************************************/ + +// This custom widget adds the missing ellipsize functionality in QT5 + +#ifndef ELIDECHECKBOX_H +#define ELIDECHECKBOX_H + +#ifndef _PreComp_ +#include +#include +#include +#include +#endif + +#include + +namespace Gui { + +class GuiExport ElideCheckBox : public QCheckBox { + Q_OBJECT + +public: + explicit ElideCheckBox(QWidget *parent = nullptr); + ~ElideCheckBox() override = default; + +protected: + void paintEvent(QPaintEvent *event) override; + QSize sizeHint() const override; + QSize minimumSizeHint() const override; +}; + +} // namespace Gui + +#endif // ELIDECHECKBOX_H + diff --git a/src/Gui/ElideLabel.cpp b/src/Gui/ElideLabel.cpp new file mode 100644 index 0000000000..10d7294522 --- /dev/null +++ b/src/Gui/ElideLabel.cpp @@ -0,0 +1,73 @@ +// SPDX-License-Identifier: LGPL-2.1-or-later +/**************************************************************************** + * * + * Copyright (c) 2025 Alfredo Monclus * + * * + * This file is part of FreeCAD. * + * * + * FreeCAD is free software: you can redistribute it and/or modify it * + * under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 2.1 of the * + * License, or (at your option) any later version. * + * * + * FreeCAD is distributed in the hope that it will be useful, but * + * WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * + * Lesser General Public License for more details. * + * * + * You should have received a copy of the GNU Lesser General Public * + * License along with FreeCAD. If not, see * + * . * + * * + ***************************************************************************/ + +// This custom widget adds the missing ellipsize functionality in QT5 + +#include "PreCompiled.h" + +#include "ElideLabel.h" + +namespace Gui { + +ElideLabel::ElideLabel(QWidget *parent) + : QLabel(parent) { +} + +void ElideLabel::paintEvent(QPaintEvent *event) { + Q_UNUSED(event); + QPainter painter(this); + painter.setPen(palette().color(QPalette::WindowText)); + painter.setFont(font()); + + constexpr int padding = 4; + QFontMetrics fm(painter.fontMetrics()); + + int availableWidth = width() - padding * 2; + if (availableWidth < 0) { + return; + } + + QString elidedText = fm.elidedText(text(), Qt::ElideRight, availableWidth); + + QRect textRect = rect().adjusted(padding, 0, -padding, 0); + painter.drawText(textRect, Qt::AlignLeft | Qt::AlignVCenter, elidedText); +} + +QSize ElideLabel::sizeHint() const { + QFontMetrics fm(font()); + int width = fm.horizontalAdvance(this->text()); + int height = fm.height(); + return {width, height}; +} + +QSize ElideLabel::minimumSizeHint() const { + QFontMetrics fm(font()); + QString minimumText = QStringLiteral("A..."); + int width = fm.horizontalAdvance(minimumText); + int height = fm.height(); + return {width, height}; +} + +} // namespace Gui + +#include "moc_ElideLabel.cpp" // NOLINT diff --git a/src/Gui/ElideLabel.h b/src/Gui/ElideLabel.h new file mode 100644 index 0000000000..7191d52f57 --- /dev/null +++ b/src/Gui/ElideLabel.h @@ -0,0 +1,54 @@ +// SPDX-License-Identifier: LGPL-2.1-or-later +/**************************************************************************** + * * + * Copyright (c) 2025 Alfredo Monclus * + * * + * This file is part of FreeCAD. * + * * + * FreeCAD is free software: you can redistribute it and/or modify it * + * under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 2.1 of the * + * License, or (at your option) any later version. * + * * + * FreeCAD is distributed in the hope that it will be useful, but * + * WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * + * Lesser General Public License for more details. * + * * + * You should have received a copy of the GNU Lesser General Public * + * License along with FreeCAD. If not, see * + * . * + * * + ***************************************************************************/ + +// This custom widget adds the missing ellipsize functionality in QT5 + +#ifndef ELIDELABEL_H +#define ELIDELABEL_H + +#ifndef _PreComp_ +#include +#include +#include +#endif + +#include + +namespace Gui { + +class GuiExport ElideLabel : public QLabel { + Q_OBJECT + +public: + explicit ElideLabel(QWidget *parent = nullptr); + ~ElideLabel() override = default; + +protected: + void paintEvent(QPaintEvent *event) override; + QSize sizeHint() const override; + QSize minimumSizeHint() const override; +}; + +} // namespace Gui + +#endif // ELIDELABEL_H diff --git a/src/Gui/FontScaledSVG.cpp b/src/Gui/FontScaledSVG.cpp new file mode 100644 index 0000000000..89c02e3b21 --- /dev/null +++ b/src/Gui/FontScaledSVG.cpp @@ -0,0 +1,73 @@ +// SPDX-License-Identifier: LGPL-2.1-or-later +/**************************************************************************** + * * + * Copyright (c) 2025 Alfredo Monclus * + * * + * This file is part of FreeCAD. * + * * + * FreeCAD is free software: you can redistribute it and/or modify it * + * under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 2.1 of the * + * License, or (at your option) any later version. * + * * + * FreeCAD is distributed in the hope that it will be useful, but * + * WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * + * Lesser General Public License for more details. * + * * + * You should have received a copy of the GNU Lesser General Public * + * License along with FreeCAD. If not, see * + * . * + * * + ***************************************************************************/ + +// This custom widget scales an svg according to fonts + +#include "PreCompiled.h" + +#include "FontScaledSVG.h" + +namespace Gui { + +FontScaledSVG::FontScaledSVG(QWidget *parent) + : QWidget(parent), m_svgRenderer(new QSvgRenderer(this)) { + setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); +} + +void FontScaledSVG::setSvg(const QString &svgPath) { + if (m_svgRenderer->load(svgPath)) { + updateScaledSize(); + update(); + } +} + +void FontScaledSVG::paintEvent(QPaintEvent *event) { + Q_UNUSED(event); + QPainter painter(this); + + if (m_svgRenderer->isValid()) { + QRect targetRect(0, 0, width(), height()); + m_svgRenderer->render(&painter, targetRect); + } +} + +void FontScaledSVG::resizeEvent(QResizeEvent *event) { + Q_UNUSED(event); + updateScaledSize(); +} + +void FontScaledSVG::updateScaledSize() { + QSize baseSize = m_svgRenderer->defaultSize(); + + QFontMetrics metrics(font()); + qreal spacing = metrics.lineSpacing(); + constexpr int baseFactor = 18; + qreal scalingFactor = spacing / baseFactor; + + QSize targetSize = baseSize * scalingFactor; + setFixedSize(targetSize); +} + +} // namespace Gui + +#include "moc_FontScaledSVG.cpp" // NOLINT diff --git a/src/Gui/FontScaledSVG.h b/src/Gui/FontScaledSVG.h new file mode 100644 index 0000000000..ffdc3e666b --- /dev/null +++ b/src/Gui/FontScaledSVG.h @@ -0,0 +1,59 @@ +// SPDX-License-Identifier: LGPL-2.1-or-later +/**************************************************************************** + * * + * Copyright (c) 2025 Alfredo Monclus * + * * + * This file is part of FreeCAD. * + * * + * FreeCAD is free software: you can redistribute it and/or modify it * + * under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 2.1 of the * + * License, or (at your option) any later version. * + * * + * FreeCAD is distributed in the hope that it will be useful, but * + * WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * + * Lesser General Public License for more details. * + * * + * You should have received a copy of the GNU Lesser General Public * + * License along with FreeCAD. If not, see * + * . * + * * + ***************************************************************************/ + +// This custom widget scales an svg according to fonts + +#ifndef FONTSCALEDSVG_H +#define FONTSCALEDSVG_H + +#ifndef _PreComp_ +#include +#include +#include +#include +#endif + +#include + +namespace Gui { + +class GuiExport FontScaledSVG : public QWidget { + Q_OBJECT + +public: + explicit FontScaledSVG(QWidget *parent = nullptr); + void setSvg(const QString &svgPath); + +protected: + void paintEvent(QPaintEvent *event) override; + void resizeEvent(QResizeEvent *event) override; + +private: + QSvgRenderer *m_svgRenderer; + + void updateScaledSize(); +}; + +} // namespace Gui + +#endif // FONTSCALEDSVG_H diff --git a/src/Gui/QuantitySpinBox.cpp b/src/Gui/QuantitySpinBox.cpp index 63383a1fb4..38a265e38a 100644 --- a/src/Gui/QuantitySpinBox.cpp +++ b/src/Gui/QuantitySpinBox.cpp @@ -834,7 +834,7 @@ QSize QuantitySpinBox::sizeHintCalculator(int h) const const QFontMetrics fm(fontMetrics()); int w = 0; - constexpr int maxStrLen = 12; + constexpr int maxStrLen = 9; QString s; QString fixedContent = QLatin1String(" "); diff --git a/src/Mod/PartDesign/App/FeatureHole.h b/src/Mod/PartDesign/App/FeatureHole.h index f817e164cb..0478261d62 100644 --- a/src/Mod/PartDesign/App/FeatureHole.h +++ b/src/Mod/PartDesign/App/FeatureHole.h @@ -108,6 +108,8 @@ public: void Restore(Base::XMLReader & reader) override; virtual void updateProps(); + bool isDynamicCounterbore(const std::string &thread, const std::string &holeCutType); + bool isDynamicCountersink(const std::string &thread, const std::string &holeCutType); protected: void onChanged(const App::Property* prop) override; @@ -219,8 +221,6 @@ private: const CutDimensionSet& find_cutDimensionSet(const CutDimensionKey &k); void addCutType(const CutDimensionSet& dimensions); - bool isDynamicCounterbore(const std::string &thread, const std::string &holeCutType); - bool isDynamicCountersink(const std::string &thread, const std::string &holeCutType); void updateHoleCutParams(); std::optional determineDiameter() const; void updateDiameterParam(); diff --git a/src/Mod/PartDesign/Gui/Resources/PartDesign.qrc b/src/Mod/PartDesign/Gui/Resources/PartDesign.qrc index 30e408fb50..50e86ec8d7 100644 --- a/src/Mod/PartDesign/Gui/Resources/PartDesign.qrc +++ b/src/Mod/PartDesign/Gui/Resources/PartDesign.qrc @@ -56,5 +56,17 @@ icons/PartDesign_SubtractiveWedge.svg icons/PartDesign_Thickness.svg icons/PartDesignWorkbench.svg + images/hole_counterbore_angled.svg + images/hole_counterbore_angled_included.svg + images/hole_counterdrill_angled.svg + images/hole_counterdrill_angled_included.svg + images/hole_countersink_angled.svg + images/hole_countersink_angled_included.svg + images/hole_none_angled.svg + images/hole_none_angled_included.svg + images/hole_counterbore_flat.svg + images/hole_counterdrill_flat.svg + images/hole_countersink_flat.svg + images/hole_none_flat.svg diff --git a/src/Mod/PartDesign/Gui/Resources/images/hole_counterbore_angled.svg b/src/Mod/PartDesign/Gui/Resources/images/hole_counterbore_angled.svg new file mode 100644 index 0000000000..56891a95aa --- /dev/null +++ b/src/Mod/PartDesign/Gui/Resources/images/hole_counterbore_angled.svg @@ -0,0 +1,123 @@ + + + +Alfredo MonclusFreeCAD LGPL2+FreeCAD diff --git a/src/Mod/PartDesign/Gui/Resources/images/hole_counterbore_angled_included.svg b/src/Mod/PartDesign/Gui/Resources/images/hole_counterbore_angled_included.svg new file mode 100644 index 0000000000..47acb2f115 --- /dev/null +++ b/src/Mod/PartDesign/Gui/Resources/images/hole_counterbore_angled_included.svg @@ -0,0 +1,129 @@ + + + +Alfredo MonclusFreeCAD LGPL2+FreeCAD diff --git a/src/Mod/PartDesign/Gui/Resources/images/hole_counterbore_flat.svg b/src/Mod/PartDesign/Gui/Resources/images/hole_counterbore_flat.svg new file mode 100644 index 0000000000..40a70aa3b6 --- /dev/null +++ b/src/Mod/PartDesign/Gui/Resources/images/hole_counterbore_flat.svg @@ -0,0 +1,103 @@ + + + + diff --git a/src/Mod/PartDesign/Gui/Resources/images/hole_counterdrill_angled.svg b/src/Mod/PartDesign/Gui/Resources/images/hole_counterdrill_angled.svg new file mode 100644 index 0000000000..85093f317b --- /dev/null +++ b/src/Mod/PartDesign/Gui/Resources/images/hole_counterdrill_angled.svg @@ -0,0 +1,125 @@ + + + +Alfredo MonclusFreeCAD LGPL2+FreeCAD diff --git a/src/Mod/PartDesign/Gui/Resources/images/hole_counterdrill_angled_included.svg b/src/Mod/PartDesign/Gui/Resources/images/hole_counterdrill_angled_included.svg new file mode 100644 index 0000000000..e6e3b847bb --- /dev/null +++ b/src/Mod/PartDesign/Gui/Resources/images/hole_counterdrill_angled_included.svg @@ -0,0 +1,129 @@ + + + +Alfredo MonclusFreeCAD LGPL2+FreeCAD diff --git a/src/Mod/PartDesign/Gui/Resources/images/hole_counterdrill_flat.svg b/src/Mod/PartDesign/Gui/Resources/images/hole_counterdrill_flat.svg new file mode 100644 index 0000000000..2c2202e673 --- /dev/null +++ b/src/Mod/PartDesign/Gui/Resources/images/hole_counterdrill_flat.svg @@ -0,0 +1,102 @@ + + + +Alfredo MonclusFreeCAD LGPL2+FreeCAD diff --git a/src/Mod/PartDesign/Gui/Resources/images/hole_countersink_angled.svg b/src/Mod/PartDesign/Gui/Resources/images/hole_countersink_angled.svg new file mode 100644 index 0000000000..2ad31c6175 --- /dev/null +++ b/src/Mod/PartDesign/Gui/Resources/images/hole_countersink_angled.svg @@ -0,0 +1,134 @@ + + + +Alfredo MonclusFreeCAD LGPL2+FreeCAD diff --git a/src/Mod/PartDesign/Gui/Resources/images/hole_countersink_angled_included.svg b/src/Mod/PartDesign/Gui/Resources/images/hole_countersink_angled_included.svg new file mode 100644 index 0000000000..5ee7c6e9a6 --- /dev/null +++ b/src/Mod/PartDesign/Gui/Resources/images/hole_countersink_angled_included.svg @@ -0,0 +1,138 @@ + + + +Alfredo MonclusFreeCAD LGPL2+FreeCAD diff --git a/src/Mod/PartDesign/Gui/Resources/images/hole_countersink_flat.svg b/src/Mod/PartDesign/Gui/Resources/images/hole_countersink_flat.svg new file mode 100644 index 0000000000..fab3cb98a0 --- /dev/null +++ b/src/Mod/PartDesign/Gui/Resources/images/hole_countersink_flat.svg @@ -0,0 +1,110 @@ + + + +Alfredo MonclusFreeCAD LGPL2+FreeCAD diff --git a/src/Mod/PartDesign/Gui/Resources/images/hole_none_angled.svg b/src/Mod/PartDesign/Gui/Resources/images/hole_none_angled.svg new file mode 100644 index 0000000000..032cb25348 --- /dev/null +++ b/src/Mod/PartDesign/Gui/Resources/images/hole_none_angled.svg @@ -0,0 +1,106 @@ + + + +Alfredo MonclusFreeCAD LGPL2+FreeCAD diff --git a/src/Mod/PartDesign/Gui/Resources/images/hole_none_angled_included.svg b/src/Mod/PartDesign/Gui/Resources/images/hole_none_angled_included.svg new file mode 100644 index 0000000000..0f720de725 --- /dev/null +++ b/src/Mod/PartDesign/Gui/Resources/images/hole_none_angled_included.svg @@ -0,0 +1,110 @@ + + + +Alfredo MonclusFreeCAD LGPL2+FreeCAD diff --git a/src/Mod/PartDesign/Gui/Resources/images/hole_none_flat.svg b/src/Mod/PartDesign/Gui/Resources/images/hole_none_flat.svg new file mode 100644 index 0000000000..4181b96502 --- /dev/null +++ b/src/Mod/PartDesign/Gui/Resources/images/hole_none_flat.svg @@ -0,0 +1,82 @@ + + + +Alfredo MonclusFreeCAD LGPL2+FreeCAD diff --git a/src/Mod/PartDesign/Gui/TaskHoleParameters.cpp b/src/Mod/PartDesign/Gui/TaskHoleParameters.cpp index 0865583a9d..d690da3512 100644 --- a/src/Mod/PartDesign/Gui/TaskHoleParameters.cpp +++ b/src/Mod/PartDesign/Gui/TaskHoleParameters.cpp @@ -61,15 +61,15 @@ TaskHoleParameters::TaskHoleParameters(ViewProviderHole* HoleView, QWidget* pare QMetaObject::connectSlotsByName(this); ui->ThreadType->addItem(tr("None"), QByteArray("None")); - ui->ThreadType->addItem(tr("ISO metric regular profile"), QByteArray("ISO")); - ui->ThreadType->addItem(tr("ISO metric fine profile"), QByteArray("ISO")); - ui->ThreadType->addItem(tr("UTS coarse profile"), QByteArray("UTS")); - ui->ThreadType->addItem(tr("UTS fine profile"), QByteArray("UTS")); - ui->ThreadType->addItem(tr("UTS extra fine profile"), QByteArray("UTS")); - ui->ThreadType->addItem(tr("ANSI pipe profile"), QByteArray("NPT")); - ui->ThreadType->addItem(tr("BSP pipe profile"), QByteArray("BSP")); - ui->ThreadType->addItem(tr("BSW whitworth profile"), QByteArray("BSW")); - ui->ThreadType->addItem(tr("BSF whitworth fine profile"), QByteArray("BSF")); + ui->ThreadType->addItem(tr("ISO metric regular"), QByteArray("ISO")); + ui->ThreadType->addItem(tr("ISO metric fine"), QByteArray("ISO")); + ui->ThreadType->addItem(tr("UTS coarse"), QByteArray("UTS")); + ui->ThreadType->addItem(tr("UTS fine"), QByteArray("UTS")); + ui->ThreadType->addItem(tr("UTS extra fine"), QByteArray("UTS")); + ui->ThreadType->addItem(tr("ANSI pipes"), QByteArray("None")); + ui->ThreadType->addItem(tr("ISO/BSP pipes"), QByteArray("None")); + ui->ThreadType->addItem(tr("BSW whitworth"), QByteArray("None")); + ui->ThreadType->addItem(tr("BSF whitworth fine"), QByteArray("None")); // read values from the hole properties auto pcHole = getObject(); @@ -122,17 +122,11 @@ TaskHoleParameters::TaskHoleParameters(ViewProviderHole* HoleView, QWidget* pare } ui->HoleCutType->setCurrentIndex(pcHole->HoleCutType.getValue()); - bool isNotCut = pcHole->HoleCutType.getValue() == 0L; - ui->labelHoleCutDiameter->setHidden(isNotCut); - ui->labelHoleCutDepth->setHidden(isNotCut); - ui->labelHoleCutCountersinkAngle->setHidden(isNotCut); - ui->HoleCutDiameter->setHidden(isNotCut); - ui->HoleCutDepth->setHidden(isNotCut); - ui->HoleCutCountersinkAngle->setHidden(isNotCut); - ui->HoleCutCustomValues->setHidden(isNotCut); - ui->HoleCutCustomValues->setChecked(pcHole->HoleCutCustomValues.getValue()); - ui->HoleCutCustomValues->setDisabled(pcHole->HoleCutCustomValues.isReadOnly()); + ui->HoleCutCustomValues->setHidden( + pcHole->HoleCutType.getValue() < 5 + || pcHole->HoleCutCustomValues.isReadOnly() + ); // HoleCutDiameter must not be smaller or equal than the Diameter ui->HoleCutDiameter->setMinimum(pcHole->Diameter.getValue() + 0.1); ui->HoleCutDiameter->setValue(pcHole->HoleCutDiameter.getValue()); @@ -154,11 +148,9 @@ TaskHoleParameters::TaskHoleParameters(ViewProviderHole* HoleView, QWidget* pare bool isFlatDrill = pcHole->DrillPoint.getValue() == 0L; bool depthIsDimension = std::string(pcHole->DepthType.getValueAsString()) == "Dimension"; - ui->DrillGroupBox->setVisible(depthIsDimension); - ui->drillPointFlat->setChecked(isFlatDrill); - ui->drillPointAngled->setChecked(!isFlatDrill); - ui->DrillPointAngle->setEnabled(!isFlatDrill); - ui->DrillForDepth->setVisible(!isFlatDrill); + ui->DrillPointAngled->setChecked(!isFlatDrill && depthIsDimension); + ui->DrillPointAngle->setEnabled(!isFlatDrill && depthIsDimension); + ui->DrillForDepth->setEnabled(!isFlatDrill && depthIsDimension); ui->Tapered->setChecked(pcHole->Tapered.getValue()); // Angle is only enabled (sensible) if tapered @@ -184,11 +176,14 @@ TaskHoleParameters::TaskHoleParameters(ViewProviderHole* HoleView, QWidget* pare ui->UpdateView->setChecked(false); ui->UpdateView->setVisible(isThreaded && isModeled); - ui->Depth->setEnabled(std::string(pcHole->DepthType.getValueAsString()) == "Dimension"); + ui->Depth->setEnabled(depthIsDimension); ui->ThreadDepthWidget->setVisible(isThreaded && isModeled); - ui->ThreadDepth->setEnabled(ui->Threaded->isChecked() && ui->ModelThread->isChecked() - && std::string(pcHole->ThreadDepthType.getValueAsString()) - == "Dimension"); + + ui->ThreadDepthDimensionWidget->setVisible( + std::string(pcHole->ThreadDepthType.getValueAsString()) == "Dimension" + ); + + setCutDiagram(); // clang-format off connect(ui->Threaded, &QCheckBox::clicked, @@ -221,9 +216,7 @@ TaskHoleParameters::TaskHoleParameters(ViewProviderHole* HoleView, QWidget* pare this, &TaskHoleParameters::depthChanged); connect(ui->Depth, qOverload(&Gui::QuantitySpinBox::valueChanged), this, &TaskHoleParameters::depthValueChanged); - connect(ui->drillPointFlat, &QRadioButton::clicked, - this, &TaskHoleParameters::drillPointChanged); - connect(ui->drillPointAngled, &QRadioButton::clicked, + connect(ui->DrillPointAngled, &QCheckBox::toggled, this, &TaskHoleParameters::drillPointChanged); connect(ui->DrillPointAngle, qOverload(&Gui::QuantitySpinBox::valueChanged), this, &TaskHoleParameters::drillPointAngledValueChanged); @@ -306,7 +299,7 @@ void TaskHoleParameters::modelThreadChanged() ui->CustomThreadClearance->setEnabled(ui->UseCustomThreadClearance->isChecked()); ui->ThreadDepthWidget->setVisible(isThreaded && isModeled); - ui->ThreadDepth->setEnabled( + ui->ThreadDepthDimensionWidget->setVisible( std::string(pcHole->ThreadDepthType.getValueAsString()) == "Dimension" ); @@ -323,7 +316,7 @@ void TaskHoleParameters::threadDepthTypeChanged(int index) { if (auto hole = getObject()) { hole->ThreadDepthType.setValue(index); - ui->ThreadDepth->setEnabled(index == 1); + ui->ThreadDepthDimensionWidget->setVisible(index == 1); ui->ThreadDepth->setValue(hole->ThreadDepth.getValue()); recomputeFeature(); } @@ -333,6 +326,7 @@ void TaskHoleParameters::threadDepthChanged(double value) { if (auto hole = getObject()) { hole->ThreadDepth.setValue(value); + setCutDiagram(); recomputeFeature(); } } @@ -388,7 +382,7 @@ void TaskHoleParameters::holeCutTypeChanged(int index) recomputeFeature(); // apply the result to the widgets - ui->HoleCutCustomValues->setDisabled(hole->HoleCutCustomValues.isReadOnly()); + ui->HoleCutCustomValues->setHidden(hole->HoleCutCustomValues.isReadOnly()); ui->HoleCutCustomValues->setChecked(hole->HoleCutCustomValues.getValue()); // HoleCutCustomValues is only enabled for screw definitions @@ -396,47 +390,82 @@ void TaskHoleParameters::holeCutTypeChanged(int index) // the type is a countersink and thus if HoleCutCountersinkAngle can be enabled std::string HoleCutTypeString = hole->HoleCutType.getValueAsString(); - bool isNotCut = HoleCutTypeString == "None"; - ui->labelHoleCutDiameter->setHidden(isNotCut); - ui->labelHoleCutDepth->setHidden(isNotCut); - ui->labelHoleCutCountersinkAngle->setHidden(isNotCut); - ui->HoleCutDiameter->setHidden(isNotCut); - ui->HoleCutDepth->setHidden(isNotCut); - ui->HoleCutCountersinkAngle->setHidden(isNotCut); - ui->HoleCutCustomValues->setHidden(isNotCut); - - if (HoleCutTypeString == "None" || HoleCutTypeString == "Counterbore" - || HoleCutTypeString == "Countersink" || HoleCutTypeString == "Counterdrill") { - ui->HoleCutCustomValues->setEnabled(false); - if (HoleCutTypeString == "None") { - ui->HoleCutDiameter->setEnabled(false); - ui->HoleCutDepth->setEnabled(false); - ui->HoleCutCountersinkAngle->setEnabled(false); - } - if (HoleCutTypeString == "Counterbore") { - ui->HoleCutCountersinkAngle->setEnabled(false); - } - if (HoleCutTypeString == "Countersink") { - ui->HoleCutCountersinkAngle->setEnabled(true); - } + if ( + HoleCutTypeString == "None" + || HoleCutTypeString == "Counterbore" + || HoleCutTypeString == "Countersink" + || HoleCutTypeString == "Counterdrill" + ) { + ui->HoleCutCustomValues->setVisible(false); } else { // screw definition // we can have the case that we have no normed values // in this case HoleCutCustomValues is read-only AND true - if (ui->HoleCutCustomValues->isChecked()) { - ui->HoleCutDiameter->setEnabled(true); - ui->HoleCutDepth->setEnabled(true); - if (!hole->HoleCutCountersinkAngle.isReadOnly()) { - ui->HoleCutCountersinkAngle->setEnabled(true); - } - } - else { - ui->HoleCutCustomValues->setEnabled(true); - ui->HoleCutDiameter->setEnabled(false); - ui->HoleCutDepth->setEnabled(false); - ui->HoleCutCountersinkAngle->setEnabled(false); - } + bool isCustom = ui->HoleCutCustomValues->isChecked(); + ui->HoleCutDiameter->setEnabled(isCustom); + ui->HoleCutDepth->setEnabled(isCustom); + ui->HoleCutCountersinkAngle->setEnabled( + isCustom && !hole->HoleCutCountersinkAngle.isReadOnly() + ); } + setCutDiagram(); +} + +void TaskHoleParameters::setCutDiagram() +{ + auto hole = getObject(); + const std::string holeCutTypeString = hole->HoleCutType.getValueAsString(); + const std::string threadTypeString = hole->ThreadType.getValueAsString(); + bool isAngled = ( + std::string(hole->DepthType.getValueAsString()) == "Dimension" + && ui->DrillPointAngled->isChecked() + ); + bool isCountersink = ( + holeCutTypeString == "Countersink" + || hole->isDynamicCountersink(threadTypeString, holeCutTypeString) + ); + bool isCounterbore = ( + holeCutTypeString == "Counterbore" + || hole->isDynamicCounterbore(threadTypeString, holeCutTypeString) + ); + bool isCounterdrill = (holeCutTypeString == "Counterdrill"); + bool includeAngle = hole->DrillForDepth.getValue(); + bool isNotCut = holeCutTypeString == "None"; + + ui->labelHoleCutDiameter->setHidden(isNotCut); + ui->labelHoleCutDepth->setHidden(isNotCut); + ui->HoleCutDiameter->setHidden(isNotCut); + ui->HoleCutDepth->setHidden(isNotCut); + + std::string baseFileName; + if (isCounterbore) { + baseFileName = "hole_counterbore"; + ui->HoleCutCountersinkAngle->setVisible(false); + ui->labelHoleCutCountersinkAngle->setVisible(false); + } + else if (isCountersink) { + baseFileName = "hole_countersink"; + ui->HoleCutCountersinkAngle->setVisible(true); + ui->labelHoleCutCountersinkAngle->setVisible(true); + } + else if (isCounterdrill) { + baseFileName = "hole_counterdrill"; + ui->HoleCutCountersinkAngle->setVisible(true); + ui->labelHoleCutCountersinkAngle->setVisible(true); + } + else { + baseFileName = "hole_none"; + ui->HoleCutCountersinkAngle->setVisible(false); + ui->labelHoleCutCountersinkAngle->setVisible(false); + } + + if (isAngled) { + baseFileName += includeAngle ? "_angled_included" : "_angled"; + } else { + baseFileName += "_flat"; + } + + ui->cutDiagram->setSvg(QString::fromUtf8((":images/" + baseFileName + ".svg").c_str())); } void TaskHoleParameters::holeCutCustomValuesChanged() @@ -514,17 +543,16 @@ void TaskHoleParameters::depthChanged(int index) if (!hole) { return; } - hole->DepthType.setValue(index); - + recomputeFeature(); + // enabling must be handled after recompute bool DepthisDimension = ( std::string(hole->DepthType.getValueAsString()) == "Dimension" ); - - ui->DrillGroupBox->setVisible(DepthisDimension); - recomputeFeature(); - // enabling must be handled after recompute - ui->ThreadDepth->setEnabled(DepthisDimension); + ui->DrillPointAngled->setEnabled(DepthisDimension); + ui->DrillPointAngle->setEnabled(DepthisDimension); + ui->DrillForDepth->setEnabled(DepthisDimension); + setCutDiagram(); } void TaskHoleParameters::depthValueChanged(double value) @@ -538,17 +566,11 @@ void TaskHoleParameters::depthValueChanged(double value) void TaskHoleParameters::drillPointChanged() { if (auto hole = getObject()) { - if (sender() == ui->drillPointFlat) { - hole->DrillPoint.setValue(0L); - ui->DrillForDepth->setVisible(false); - } - else if (sender() == ui->drillPointAngled) { - hole->DrillPoint.setValue(1L); - ui->DrillForDepth->setVisible(true); - } - else { - assert(0); - } + bool angled = ui->DrillPointAngled->isChecked(); + hole->DrillPoint.setValue(angled); + ui->DrillPointAngle->setEnabled(angled); + ui->DrillForDepth->setEnabled(angled); + setCutDiagram(); recomputeFeature(); } } @@ -567,6 +589,7 @@ void TaskHoleParameters::drillForDepthChanged() hole->DrillForDepth.setValue(ui->DrillForDepth->isChecked()); recomputeFeature(); } + setCutDiagram(); } void TaskHoleParameters::taperedChanged() @@ -748,266 +771,145 @@ void TaskHoleParameters::changedObject(const App::Document&, const App::Property { auto hole = getObject(); if (!hole) { - // happens when aborting the command - return; + return; // happens when aborting the command } bool ro = Prop.isReadOnly(); Base::Console().Log("Parameter %s was updated\n", Prop.getName()); + auto updateCheckable = [&](QCheckBox* widget, bool value) { + [[maybe_unused]] QSignalBlocker blocker(widget); + widget->setChecked(value); + widget->setDisabled(ro); + }; + + auto updateRadio = [&](QRadioButton* widget, bool value) { + [[maybe_unused]] QSignalBlocker blocker(widget); + widget->setChecked(value); + widget->setDisabled(ro); + }; + + auto updateComboBox = [&](QComboBox* widget, int value) { + [[maybe_unused]] QSignalBlocker blocker(widget); + widget->setCurrentIndex(value); + widget->setDisabled(ro); + }; + + auto updateSpinBox = [&](Gui::PrefQuantitySpinBox* widget, double value) { + [[maybe_unused]] QSignalBlocker blocker(widget); + widget->setValue(value); + widget->setDisabled(ro); + }; + if (&Prop == &hole->Threaded) { ui->Threaded->setEnabled(true); - if (ui->Threaded->isChecked() ^ hole->Threaded.getValue()) { - ui->Threaded->blockSignals(true); - ui->Threaded->setChecked(hole->Threaded.getValue()); - ui->Threaded->blockSignals(false); - } - ui->Threaded->setDisabled(ro); + updateCheckable(ui->Threaded, hole->Threaded.getValue()); } else if (&Prop == &hole->ThreadType) { ui->ThreadType->setEnabled(true); + updateComboBox(ui->ThreadType, hole->ThreadType.getValue()); - ui->ThreadSize->blockSignals(true); - ui->ThreadSize->clear(); - std::vector cursor = hole->ThreadSize.getEnumVector(); - for (const auto& it : cursor) { - ui->ThreadSize->addItem(QString::fromStdString(it)); - } - ui->ThreadSize->setCurrentIndex(hole->ThreadSize.getValue()); - ui->ThreadSize->blockSignals(false); + // Thread type also updates related properties + auto updateComboBoxItems = [&](QComboBox* widget, const auto& values, int selected) { + QSignalBlocker blocker(widget); + widget->clear(); + for (const auto& it : values) { + widget->addItem(QString::fromStdString(it)); + } + widget->setCurrentIndex(selected); + }; - // Thread type also updates HoleCutType and ThreadClass - ui->HoleCutType->blockSignals(true); - ui->HoleCutType->clear(); - cursor = hole->HoleCutType.getEnumVector(); - for (const auto& it : cursor) { - ui->HoleCutType->addItem(QString::fromStdString(it)); - } - ui->HoleCutType->setCurrentIndex(hole->HoleCutType.getValue()); - ui->HoleCutType->blockSignals(false); - - ui->ThreadClass->blockSignals(true); - ui->ThreadClass->clear(); - cursor = hole->ThreadClass.getEnumVector(); - for (const auto& it : cursor) { - ui->ThreadClass->addItem(QString::fromStdString(it)); - } - ui->ThreadClass->setCurrentIndex(hole->ThreadClass.getValue()); - ui->ThreadClass->blockSignals(false); - - if (ui->ThreadType->currentIndex() != hole->ThreadType.getValue()) { - ui->ThreadType->blockSignals(true); - ui->ThreadType->setCurrentIndex(hole->ThreadType.getValue()); - ui->ThreadType->blockSignals(false); - } - ui->ThreadType->setDisabled(ro); + updateComboBoxItems(ui->ThreadSize, hole->ThreadSize.getEnumVector(), hole->ThreadSize.getValue()); + updateComboBoxItems(ui->HoleCutType, hole->HoleCutType.getEnumVector(), hole->HoleCutType.getValue()); + updateComboBoxItems(ui->ThreadClass, hole->ThreadClass.getEnumVector(), hole->ThreadClass.getValue()); } else if (&Prop == &hole->ThreadSize) { ui->ThreadSize->setEnabled(true); - if (ui->ThreadSize->currentIndex() != hole->ThreadSize.getValue()) { - ui->ThreadSize->blockSignals(true); - ui->ThreadSize->setCurrentIndex(hole->ThreadSize.getValue()); - ui->ThreadSize->blockSignals(false); - } - ui->ThreadSize->setDisabled(ro); + updateComboBox(ui->ThreadSize, hole->ThreadSize.getValue()); } else if (&Prop == &hole->ThreadClass) { ui->ThreadClass->setEnabled(true); - if (ui->ThreadClass->currentIndex() != hole->ThreadClass.getValue()) { - ui->ThreadClass->blockSignals(true); - ui->ThreadClass->setCurrentIndex(hole->ThreadClass.getValue()); - ui->ThreadClass->blockSignals(false); - } - ui->ThreadClass->setDisabled(ro); + updateComboBox(ui->ThreadClass, hole->ThreadClass.getValue()); } else if (&Prop == &hole->ThreadFit) { ui->ThreadFit->setEnabled(true); - if (ui->ThreadFit->currentIndex() != hole->ThreadFit.getValue()) { - ui->ThreadFit->blockSignals(true); - ui->ThreadFit->setCurrentIndex(hole->ThreadFit.getValue()); - ui->ThreadFit->blockSignals(false); - } - ui->ThreadFit->setDisabled(ro); + updateComboBox(ui->ThreadFit, hole->ThreadFit.getValue()); } else if (&Prop == &hole->Diameter) { ui->Diameter->setEnabled(true); - if (ui->Diameter->value().getValue() != hole->Diameter.getValue()) { - ui->Diameter->blockSignals(true); - ui->Diameter->setValue(hole->Diameter.getValue()); - ui->Diameter->blockSignals(false); - } - ui->Diameter->setDisabled(ro); + updateSpinBox(ui->Diameter, hole->Diameter.getValue()); } else if (&Prop == &hole->ThreadDirection) { ui->directionRightHand->setEnabled(true); ui->directionLeftHand->setEnabled(true); + std::string direction(hole->ThreadDirection.getValueAsString()); - if (direction == "Right" && !ui->directionRightHand->isChecked()) { - ui->directionRightHand->blockSignals(true); - ui->directionRightHand->setChecked(true); - ui->directionRightHand->blockSignals(false); - } - if (direction == "Left" && !ui->directionLeftHand->isChecked()) { - ui->directionLeftHand->blockSignals(true); - ui->directionLeftHand->setChecked(true); - ui->directionLeftHand->blockSignals(false); - } - ui->directionRightHand->setDisabled(ro); - ui->directionLeftHand->setDisabled(ro); + updateRadio(ui->directionRightHand, direction == "Right"); + updateRadio(ui->directionLeftHand, direction == "Left"); } else if (&Prop == &hole->HoleCutType) { ui->HoleCutType->setEnabled(true); - if (ui->HoleCutType->currentIndex() != hole->HoleCutType.getValue()) { - ui->HoleCutType->blockSignals(true); - ui->HoleCutType->setCurrentIndex(hole->HoleCutType.getValue()); - ui->HoleCutType->blockSignals(false); - } - ui->HoleCutType->setDisabled(ro); + updateComboBox(ui->HoleCutType, hole->HoleCutType.getValue()); } else if (&Prop == &hole->HoleCutDiameter) { ui->HoleCutDiameter->setEnabled(true); - if (ui->HoleCutDiameter->value().getValue() != hole->HoleCutDiameter.getValue()) { - ui->HoleCutDiameter->blockSignals(true); - ui->HoleCutDiameter->setValue(hole->HoleCutDiameter.getValue()); - ui->HoleCutDiameter->blockSignals(false); - } - ui->HoleCutDiameter->setDisabled(ro); + updateSpinBox(ui->HoleCutDiameter, hole->HoleCutDiameter.getValue()); } else if (&Prop == &hole->HoleCutDepth) { ui->HoleCutDepth->setEnabled(true); - if (ui->HoleCutDepth->value().getValue() != hole->HoleCutDepth.getValue()) { - ui->HoleCutDepth->blockSignals(true); - ui->HoleCutDepth->setValue(hole->HoleCutDepth.getValue()); - ui->HoleCutDepth->blockSignals(false); - } - ui->HoleCutDepth->setDisabled(ro); + updateSpinBox(ui->HoleCutDepth, hole->HoleCutDepth.getValue()); } else if (&Prop == &hole->HoleCutCountersinkAngle) { ui->HoleCutCountersinkAngle->setEnabled(true); - if (ui->HoleCutCountersinkAngle->value().getValue() - != hole->HoleCutCountersinkAngle.getValue()) { - ui->HoleCutCountersinkAngle->blockSignals(true); - ui->HoleCutCountersinkAngle->setValue(hole->HoleCutCountersinkAngle.getValue()); - ui->HoleCutCountersinkAngle->blockSignals(false); - } - ui->HoleCutCountersinkAngle->setDisabled(ro); + updateSpinBox(ui->HoleCutCountersinkAngle, hole->HoleCutCountersinkAngle.getValue()); } else if (&Prop == &hole->DepthType) { ui->DepthType->setEnabled(true); - if (ui->DepthType->currentIndex() != hole->DepthType.getValue()) { - ui->DepthType->blockSignals(true); - ui->DepthType->setCurrentIndex(hole->DepthType.getValue()); - ui->DepthType->blockSignals(false); - } - ui->DepthType->setDisabled(ro); + updateComboBox(ui->DepthType, hole->DepthType.getValue()); } else if (&Prop == &hole->Depth) { ui->Depth->setEnabled(true); - if (ui->Depth->value().getValue() != hole->Depth.getValue()) { - ui->Depth->blockSignals(true); - ui->Depth->setValue(hole->Depth.getValue()); - ui->Depth->blockSignals(false); - } - ui->Depth->setDisabled(ro); + updateSpinBox(ui->Depth, hole->Depth.getValue()); } else if (&Prop == &hole->DrillPoint) { - ui->drillPointFlat->setEnabled(true); - ui->drillPointAngled->setEnabled(true); - std::string drillPoint(hole->DrillPoint.getValueAsString()); - if (drillPoint == "Flat" && !ui->drillPointFlat->isChecked()) { - ui->drillPointFlat->blockSignals(true); - ui->drillPointFlat->setChecked(true); - ui->drillPointFlat->blockSignals(false); - } - if (drillPoint == "Angled" && !ui->drillPointAngled->isChecked()) { - ui->drillPointAngled->blockSignals(true); - ui->drillPointAngled->setChecked(true); - ui->drillPointAngled->blockSignals(false); - } - ui->drillPointFlat->setDisabled(ro); - ui->drillPointAngled->setDisabled(ro); + ui->DrillPointAngled->setEnabled(true); + updateCheckable(ui->DrillPointAngled, hole->DrillPoint.getValueAsString() == std::string("Angled")); } else if (&Prop == &hole->DrillPointAngle) { ui->DrillPointAngle->setEnabled(true); - if (ui->DrillPointAngle->value().getValue() != hole->DrillPointAngle.getValue()) { - ui->DrillPointAngle->blockSignals(true); - ui->DrillPointAngle->setValue(hole->DrillPointAngle.getValue()); - ui->DrillPointAngle->blockSignals(false); - } - ui->DrillPointAngle->setDisabled(ro); + updateSpinBox(ui->DrillPointAngle, hole->DrillPointAngle.getValue()); } else if (&Prop == &hole->DrillForDepth) { ui->DrillForDepth->setEnabled(true); - if (ui->DrillForDepth->isChecked() ^ hole->DrillForDepth.getValue()) { - ui->DrillForDepth->blockSignals(true); - ui->DrillForDepth->setChecked(hole->DrillForDepth.getValue()); - ui->DrillForDepth->blockSignals(false); - } - ui->DrillForDepth->setDisabled(ro); + updateCheckable(ui->DrillForDepth, hole->DrillForDepth.getValue()); } else if (&Prop == &hole->Tapered) { ui->Tapered->setEnabled(true); - if (ui->Tapered->isChecked() ^ hole->Tapered.getValue()) { - ui->Tapered->blockSignals(true); - ui->Tapered->setChecked(hole->Tapered.getValue()); - ui->Tapered->blockSignals(false); - } - ui->Tapered->setDisabled(ro); + updateCheckable(ui->Tapered, hole->Tapered.getValue()); } else if (&Prop == &hole->TaperedAngle) { ui->TaperedAngle->setEnabled(true); - if (ui->TaperedAngle->value().getValue() != hole->TaperedAngle.getValue()) { - ui->TaperedAngle->blockSignals(true); - ui->TaperedAngle->setValue(hole->TaperedAngle.getValue()); - ui->TaperedAngle->blockSignals(false); - } - ui->TaperedAngle->setDisabled(ro); + updateSpinBox(ui->TaperedAngle, hole->TaperedAngle.getValue()); } else if (&Prop == &hole->ModelThread) { ui->ModelThread->setEnabled(true); - if (ui->ModelThread->isChecked() ^ hole->ModelThread.getValue()) { - ui->ModelThread->blockSignals(true); - ui->ModelThread->setChecked(hole->ModelThread.getValue()); - ui->ModelThread->blockSignals(false); - } - ui->ModelThread->setDisabled(ro); + updateCheckable(ui->ModelThread, hole->ModelThread.getValue()); } else if (&Prop == &hole->UseCustomThreadClearance) { ui->UseCustomThreadClearance->setEnabled(true); - if (ui->UseCustomThreadClearance->isChecked() ^ hole->UseCustomThreadClearance.getValue()) { - ui->UseCustomThreadClearance->blockSignals(true); - ui->UseCustomThreadClearance->setChecked(hole->UseCustomThreadClearance.getValue()); - ui->UseCustomThreadClearance->blockSignals(false); - } - ui->UseCustomThreadClearance->setDisabled(ro); + updateCheckable(ui->UseCustomThreadClearance, hole->UseCustomThreadClearance.getValue()); } else if (&Prop == &hole->CustomThreadClearance) { ui->CustomThreadClearance->setEnabled(true); - if (ui->CustomThreadClearance->value().getValue() - != hole->CustomThreadClearance.getValue()) { - ui->CustomThreadClearance->blockSignals(true); - ui->CustomThreadClearance->setValue(hole->CustomThreadClearance.getValue()); - ui->CustomThreadClearance->blockSignals(false); - } - ui->CustomThreadClearance->setDisabled(ro); + updateSpinBox(ui->CustomThreadClearance, hole->CustomThreadClearance.getValue()); } else if (&Prop == &hole->ThreadDepthType) { ui->ThreadDepthType->setEnabled(true); - if (ui->ThreadDepthType->currentIndex() != hole->ThreadDepthType.getValue()) { - ui->ThreadDepthType->blockSignals(true); - ui->ThreadDepthType->setCurrentIndex(hole->ThreadDepthType.getValue()); - ui->ThreadDepthType->blockSignals(false); - } - ui->ThreadDepthType->setDisabled(ro); + updateComboBox(ui->ThreadDepthType, hole->ThreadDepthType.getValue()); } else if (&Prop == &hole->ThreadDepth) { ui->ThreadDepth->setEnabled(true); - if (ui->ThreadDepth->value().getValue() != hole->ThreadDepth.getValue()) { - ui->ThreadDepth->blockSignals(true); - ui->ThreadDepth->setValue(hole->ThreadDepth.getValue()); - ui->ThreadDepth->blockSignals(false); - } - ui->ThreadDepth->setDisabled(ro); + updateSpinBox(ui->ThreadDepth, hole->ThreadDepth.getValue()); } } @@ -1110,14 +1012,7 @@ Base::Quantity TaskHoleParameters::getDepth() const long TaskHoleParameters::getDrillPoint() const { - if (ui->drillPointFlat->isChecked()) { - return 0; - } - if (ui->drillPointAngled->isChecked()) { - return 1; - } - assert(0); - return -1; // to avoid a compiler warning + return ui->DrillPointAngled->isChecked() ? 1 : 0; } Base::Quantity TaskHoleParameters::getDrillPointAngle() const diff --git a/src/Mod/PartDesign/Gui/TaskHoleParameters.h b/src/Mod/PartDesign/Gui/TaskHoleParameters.h index fd2862d9c2..a3f2e30c62 100644 --- a/src/Mod/PartDesign/Gui/TaskHoleParameters.h +++ b/src/Mod/PartDesign/Gui/TaskHoleParameters.h @@ -108,6 +108,7 @@ private Q_SLOTS: void updateViewChanged(bool isChecked); void threadDepthTypeChanged(int index); void threadDepthChanged(double value); + void setCutDiagram(); private: class Observer : public App::DocumentObserver { diff --git a/src/Mod/PartDesign/Gui/TaskHoleParameters.ui b/src/Mod/PartDesign/Gui/TaskHoleParameters.ui index c0667192c0..ee923ddf3a 100644 --- a/src/Mod/PartDesign/Gui/TaskHoleParameters.ui +++ b/src/Mod/PartDesign/Gui/TaskHoleParameters.ui @@ -6,12 +6,12 @@ 0 0 - 432 - 776 + 366 + 844 - + 0 0 @@ -19,650 +19,384 @@ Task Hole Parameters - - - - - + + + 3 + + + 6 + + + 3 + + + 6 + + + + + 10 + + + - + 0 0 - - Taper angle for the hole -90 degree: straight hole -under 90: smaller hole radius at the bottom -over 90: larger hole radius at the bottom + + Qt::LeftToRight - - false - - - 0.000000000000000 - - - deg + + Depth Type - - - - - - - 0 - 0 - - - - Size - - - - - - + - + + 0 + 0 + + + + Qt::LeftToRight + + + + Dimension + + + + + Through all + + + + + + + + + 0 + 0 + + + + Qt::RightToLeft + + + Head Type + + + + + + + 0 0 - Hole diameter - - - false - - - 0.000000000000000 - - - mm - - - - - - - - - - 0 - 0 - - - - Reverses the hole direction - - - Reversed - - - - - - - - 0 - 0 - - - - Tapered - - - - - - - - - - - - 0 - 0 - - - - Depth - - - - - - - - 0 - 0 - - - - - Dimension - - - - - Through all - - - - - - - - - - - 0 - 0 - - - - false - - - mm - - - - - - - - 0 - 0 - - - - Diameter - - - - - - - - 0 - 0 - - - - - - - - - 0 - 0 - - - - Whether the hole gets a thread - - - Threaded + Cut type for screw heads - - - - + + + + + 0 + 0 + + + + Check to override the values predefined by the 'Type' + + + Qt::LeftToRight + + + Custom head values - - - - - - 0 - 0 - - - - Hole Cut Type - - - - - - - - 0 - 0 - - - - Cut type for screw heads - - - - - - - - 0 - 0 - - - - Diameter - - - - - - - - 0 - 0 - - - - Qt::NoContextMenu - - - false - - - 0.000000000000000 - - - 0.100000000000000 - - - mm - - - - - - - - 0 - 0 - - - - Depth - - - - - - - - 0 - 0 - - - - For countersinks this is the depth of -the screw's top below the surface - - - false - - - 0.000000000000000 - - - 0.100000000000000 - - - mm - - - - - - - - 0 - 0 - - - - Countersink angle - - - - - - - - 0 - 0 - - - - false - - - 0.000000000000000 - - - deg - - - - - - - - 0 - 0 - - - - Check to override the values predefined by the 'Type' - - - Custom values - - - - - - - - + + + + 0 - - - - - - - - 0 - 0 - - - - Drill Point - - - - - - - - 0 - 0 - - - - Flat - - - drillPointButtonGroup - - - - - - - - 0 - 0 - - - - Angled - - - drillPointButtonGroup - - - - - - - - 0 - 0 - - - - false - - - 0.000000000000000 - - - deg - - - - - - - - - - 0 - 0 - - - - The size of the drill point will be taken into -account for the depth of blind holes - - - Take into account for depth - - - - - - - - - - + + 0 - - - 6 - - - 6 - - - 6 - - - 6 - - - 6 - - - - - - 0 + + + + 0 + + + 0 + + + + + 10 0 - - 0 - 0 - - - - 0 - 0 - - - - Class - - + + + + + + 0 + 0 + + + + Head Diameter + + + + + + + + 0 + 0 + + + + Qt::NoContextMenu + + + false + + + 0.000000000000000 + + + 0.100000000000000 + + + mm + + + + - + + + + + + 0 + 0 + + + + Head Depth + + + + + + + + 0 + 0 + + + + For countersinks this is the depth of +the screw's top below the surface + + + false + + + 0.000000000000000 + + + 0.100000000000000 + + + mm + + + + + + + + + true + - + 0 0 - - Tolerance class for threaded holes according to hole profile - + + + 6 + + + 0 + + + 6 + + + 0 + + + 0 + + + + + + 0 + 0 + + + + Drill angle + + + + + + + + 0 + 0 + + + + false + + + 0.000000000000000 + + + deg + + + + + + + + 0 + 0 + + + + The size of the drill point will be taken into +account for the depth of blind holes + + + Include in depth + + + + - - - - - - - - - 0 - 0 - - - - Direction - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop - - - - - - - - 0 - 0 - - - - Left hand - - - directionButtonGroup - - - - - - - - 0 - 0 - - - - - - - Right hand - - - directionButtonGroup - - - - - - - - - 0 - - - 0 - - - - - - 0 - 0 - - - - Whether the hole gets a modelled thread - - - Model Thread - - - - - - - true - - - - 0 - 0 - - - - Live update of changes to the thread -Note that the calculation can take some time - - - Update thread view - - - - - - - - - - 6 + + + + + + 0 + 0 + - - 0 + + + 20 + 40 + + + + + 0 + 0 + + + + + + + + 8 0 - - 0 - 0 - - - 6 - - - 0 - + - + - + + 0 + 0 + + + + Countersink angle + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + 0 + 0 + + + + false + + + 0.000000000000000 + + + deg + + + + + + + + + + + 0 0 @@ -670,41 +404,15 @@ Note that the calculation can take some time Depth - - - - - - - 0 - 0 - + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - Hole depth - - - - - Dimension - - - - - Tapped (DIN76) - - - - - - - + - + 0 0 @@ -719,107 +427,202 @@ Note that the calculation can take some time - - - - - - - - 6 - - - 0 - - - 0 - - - 0 - - - 0 - - - - - 0 - 0 - - - - Customize thread clearance - - - Custom Clearance - - - - - - - - 0 - 0 - - - - Custom Thread clearance value - - - false - - - 0.100000000000000 - - - mm - - + + + + + + 0 + 0 + + + + Diameter + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + 0 + 0 + + + + + 0 + 0 + + + + Hole diameter + + + false + + + 0.000000000000000 + + + mm + + + + - - - - - - - + + + - + + + 0 + + + + + + 0 + 0 + + + + Reverses the hole direction + + + Switch direction + + + + + + + + 0 + 0 + + + + Qt::LeftToRight + + + Tapered + + + + + + + + 0 + 0 + + + + Taper angle for the hole +90 degree: straight hole +under 90: smaller hole radius at the bottom +over 90: larger hole radius at the bottom + + + false + + + 0.000000000000000 + + + deg + + + + + + + + + + + 0 + + + - + + 0 + 0 + + + + + + + + 0 0 - Profile + Size - + - + 0 0 + + + + + 0 + 0 + + + + Standard + + + - - + + - + 0 0 - + + Whether the hole gets a thread + + + Threaded + + + + + + + + 0 + 0 + + + 0 @@ -833,9 +636,9 @@ Note that the calculation can take some time 0 - + - + 0 0 @@ -877,6 +680,361 @@ Only available for holes without thread + + + + + 0 + 0 + + + + false + + + + + + + + + + 6 + + + 6 + + + 6 + + + 6 + + + 6 + + + + + 0 + + + + + + 0 + 0 + + + + Tolerance class for threaded holes according to hole profile + + + + + + + + 0 + 0 + + + + Class + + + + + + + + + 0 + + + + + + 0 + 0 + + + + Direction + + + Qt::AlignHCenter|Qt::AlignTop + + + + + + + 0 + + + + + + 0 + 0 + + + + + + + Right hand + + + directionButtonGroup + + + + + + + + 0 + 0 + + + + Left hand + + + directionButtonGroup + + + + + + + + + + + 0 + + + 0 + + + + + + 0 + 0 + + + + Whether the hole gets a modelled thread + + + Model Thread + + + + + + + true + + + + 0 + 0 + + + + Live update of changes to the thread +Note that the calculation can take some time + + + Update thread view + + + + + + + + + + 0 + 0 + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + 6 + + + 0 + + + + + + 0 + 0 + + + + Thread Depth Type + + + + + + + + 0 + 0 + + + + + Hole depth + + + + + Dimension + + + + + Tapped (DIN76) + + + + + + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + Thread Depth + + + + + + + + 0 + 0 + + + + false + + + mm + + + + + + + + + + + + + + 6 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 0 + 0 + + + + Customize thread clearance + + + Qt::LeftToRight + + + Custom Clearance + + + + + + + + 0 + 0 + + + + Custom Thread clearance value + + + false + + + 0.100000000000000 + + + mm + + + + + + + + + @@ -890,11 +1048,28 @@ Only available for holes without thread Gui::QuantitySpinBox
Gui/PrefWidgets.h
+ + Gui::ElideLabel + QLabel +
Gui/ElideLabel.h
+
+ + Gui::ElideCheckBox + QCheckBox +
Gui/ElideCheckBox.h
+
+ + Gui::FontScaledSVG + QWidget +
Gui/FontScaledSVG.h
+ 1 +
- + + + -