diff --git a/src/Gui/CMakeLists.txt b/src/Gui/CMakeLists.txt index 412c35ad63..df9d37ee4c 100644 --- a/src/Gui/CMakeLists.txt +++ b/src/Gui/CMakeLists.txt @@ -1136,6 +1136,8 @@ SET(Widget_CPP_SRCS Widgets.cpp Window.cpp WorkbenchSelector.cpp + ElideLabel.cpp + ElideCheckBox.cpp ) SET(Widget_HPP_SRCS FileDialog.h @@ -1157,6 +1159,8 @@ SET(Widget_HPP_SRCS Widgets.h Window.h WorkbenchSelector.h + ElideLabel.h + ElideCheckBox.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..33169dbe4a --- /dev/null +++ b/src/Gui/ElideCheckBox.cpp @@ -0,0 +1,68 @@ +/*************************************************************************** + * Copyright (c) 2025 Alfredo Monclus * + * * + * This file is part of the FreeCAD CAx development system. * + * * + * This library is free software; you can redistribute it and/or * + * modify it under the terms of the GNU Library General Public * + * License as published by the Free Software Foundation; either * + * version 2 of the License, or (at your option) any later version. * + * * + * This library 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 Library General Public License for more details. * + * * + * You should have received a copy of the GNU Library General Public * + * License along with this library; see the file COPYING.LIB. If not, * + * write to the Free Software Foundation, Inc., 51 Franklin Street, * + * Fifth Floor, Boston, MA 02110-1301, USA * + * * + ***************************************************************************/ + +// This custom widget adds the missing ellipsize functionality in QT5 + +#include "ElideCheckBox.h" + +const int CheckboxSpacing = 25; + +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; + int padding = 4; + textRect.setX(textRect.x() + 25); + + 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 QSize(width, height); +} + +QSize ElideCheckBox::minimumSizeHint() const { + QFontMetrics fm(font()); + QString minimumText = QStringLiteral("A..."); + int width = fm.horizontalAdvance(minimumText) + CheckboxSpacing; + int height = fm.height(); + return QSize(width, height); +} + diff --git a/src/Gui/ElideCheckBox.h b/src/Gui/ElideCheckBox.h new file mode 100644 index 0000000000..8a32fb9484 --- /dev/null +++ b/src/Gui/ElideCheckBox.h @@ -0,0 +1,51 @@ +/*************************************************************************** + * Copyright (c) 2025 Alfredo Monclus * + * * + * This file is part of the FreeCAD CAx development system. * + * * + * This library is free software; you can redistribute it and/or * + * modify it under the terms of the GNU Library General Public * + * License as published by the Free Software Foundation; either * + * version 2 of the License, or (at your option) any later version. * + * * + * This library 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 Library General Public License for more details. * + * * + * You should have received a copy of the GNU Library General Public * + * License along with this library; see the file COPYING.LIB. If not, * + * write to the Free Software Foundation, Inc., 51 Franklin Street, * + * Fifth Floor, Boston, MA 02110-1301, USA * + * * + ***************************************************************************/ + +// This custom widget adds the missing ellipsize functionality in QT5 + +#ifndef ELIDECHECKBOX_H +#define ELIDECHECKBOX_H + +#include "PreCompiled.h" +#ifndef _PreComp_ +#include +#include +#include +#include +#endif + + +class 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; +}; + +#endif // ELIDECHECKBOX_H + diff --git a/src/Gui/ElideLabel.cpp b/src/Gui/ElideLabel.cpp new file mode 100644 index 0000000000..5576db31ae --- /dev/null +++ b/src/Gui/ElideLabel.cpp @@ -0,0 +1,59 @@ +/*************************************************************************** + * Copyright (c) 2025 Alfredo Monclus * + * * + * This file is part of the FreeCAD CAx development system. * + * * + * This library is free software; you can redistribute it and/or * + * modify it under the terms of the GNU Library General Public * + * License as published by the Free Software Foundation; either * + * version 2 of the License, or (at your option) any later version. * + * * + * This library 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 Library General Public License for more details. * + * * + * You should have received a copy of the GNU Library General Public * + * License along with this library; see the file COPYING.LIB. If not, * + * write to the Free Software Foundation, Inc., 51 Franklin Street, * + * Fifth Floor, Boston, MA 02110-1301, USA * + * * + ***************************************************************************/ + +// This custom widget adds the missing ellipsize functionality in QT5 + +#include "ElideLabel.h" + +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()); + + QFontMetrics fm(font()); + QString text = this->text(); + int availableWidth = width() - 4; // Account for padding + + QString elidedText = fm.elidedText(text, Qt::ElideRight, availableWidth); + + painter.drawText(2, 2, availableWidth, height(), Qt::AlignLeft | Qt::AlignVCenter, elidedText); +} + +QSize ElideLabel::sizeHint() const { + QFontMetrics fm(font()); + int width = fm.horizontalAdvance(this->text()); + int height = fm.height(); + return QSize(width, height); +} + +QSize ElideLabel::minimumSizeHint() const { + QFontMetrics fm(font()); + QString minimumText = QStringLiteral("A..."); + int width = fm.horizontalAdvance(minimumText); + int height = fm.height(); + return QSize(width, height); +} diff --git a/src/Gui/ElideLabel.h b/src/Gui/ElideLabel.h new file mode 100644 index 0000000000..a356392c45 --- /dev/null +++ b/src/Gui/ElideLabel.h @@ -0,0 +1,49 @@ +/*************************************************************************** + * Copyright (c) 2025 Alfredo Monclus * + * * + * This file is part of the FreeCAD CAx development system. * + * * + * This library is free software; you can redistribute it and/or * + * modify it under the terms of the GNU Library General Public * + * License as published by the Free Software Foundation; either * + * version 2 of the License, or (at your option) any later version. * + * * + * This library 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 Library General Public License for more details. * + * * + * You should have received a copy of the GNU Library General Public * + * License along with this library; see the file COPYING.LIB. If not, * + * write to the Free Software Foundation, Inc., 51 Franklin Street, * + * Fifth Floor, Boston, MA 02110-1301, USA * + * * + ***************************************************************************/ + +// This custom widget adds the missing ellipsize functionality in QT5 + +#ifndef ELIDELABEL_H +#define ELIDELABEL_H + +#include "PreCompiled.h" +#ifndef _PreComp_ +#include +#include +#include +#endif + + +class 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; +}; + +#endif // ELIDELABEL_H diff --git a/src/Gui/QuantitySpinBox.cpp b/src/Gui/QuantitySpinBox.cpp index 1ab6a81e84..204a2534f7 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 b239f44e1b..1647a9b84b 100644 --- a/src/Mod/PartDesign/App/FeatureHole.h +++ b/src/Mod/PartDesign/App/FeatureHole.h @@ -107,6 +107,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; @@ -228,8 +230,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..c396d0e1b1 100644 --- a/src/Mod/PartDesign/Gui/Resources/PartDesign.qrc +++ b/src/Mod/PartDesign/Gui/Resources/PartDesign.qrc @@ -56,5 +56,13 @@ icons/PartDesign_SubtractiveWedge.svg icons/PartDesign_Thickness.svg icons/PartDesignWorkbench.svg + images/hole_counterbore_angled.svg + images/hole_counterdrill_angled.svg + images/hole_countersink_angled.svg + images/hole_none_angled.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..3af7cd85c9 --- /dev/null +++ b/src/Mod/PartDesign/Gui/Resources/images/hole_counterbore_angled.svg @@ -0,0 +1,128 @@ + + + +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..658e019a88 --- /dev/null +++ b/src/Mod/PartDesign/Gui/Resources/images/hole_counterbore_flat.svg @@ -0,0 +1,99 @@ + + + + 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..35a15ef4a0 --- /dev/null +++ b/src/Mod/PartDesign/Gui/Resources/images/hole_counterdrill_angled.svg @@ -0,0 +1,128 @@ + + + +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..83eb5a6c97 --- /dev/null +++ b/src/Mod/PartDesign/Gui/Resources/images/hole_counterdrill_flat.svg @@ -0,0 +1,105 @@ + + + +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..cde675a7cb --- /dev/null +++ b/src/Mod/PartDesign/Gui/Resources/images/hole_countersink_angled.svg @@ -0,0 +1,137 @@ + + + +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..9be9f59f9b --- /dev/null +++ b/src/Mod/PartDesign/Gui/Resources/images/hole_countersink_flat.svg @@ -0,0 +1,113 @@ + + + +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..5c44120455 --- /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_flat.svg b/src/Mod/PartDesign/Gui/Resources/images/hole_none_flat.svg new file mode 100644 index 0000000000..b543ab3dad --- /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 1844cec248..247895e13a 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("BS")); + ui->ThreadType->addItem(tr("BSF whitworth fine"), QByteArray("BS")); // read values from the hole properties auto pcHole = getObject(); @@ -129,10 +129,12 @@ TaskHoleParameters::TaskHoleParameters(ViewProviderHole* HoleView, QWidget* pare 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 +156,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 +184,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" + ); + + setCutPixmap(); // clang-format off connect(ui->Threaded, &QCheckBox::clicked, @@ -221,9 +224,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 +307,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 +324,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 +334,7 @@ void TaskHoleParameters::threadDepthChanged(double value) { if (auto hole = getObject()) { hole->ThreadDepth.setValue(value); + setCutPixmap(); recomputeFeature(); } } @@ -388,7 +390,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 @@ -403,21 +405,23 @@ void TaskHoleParameters::holeCutTypeChanged(int index) 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); + ui->HoleCutCustomValues->setVisible(false); if (HoleCutTypeString == "None") { ui->HoleCutDiameter->setEnabled(false); ui->HoleCutDepth->setEnabled(false); - ui->HoleCutCountersinkAngle->setEnabled(false); + ui->labelHoleCutCountersinkAngle->setVisible(false); + ui->HoleCutCountersinkAngle->setVisible(false); } if (HoleCutTypeString == "Counterbore") { - ui->HoleCutCountersinkAngle->setEnabled(false); + ui->labelHoleCutCountersinkAngle->setVisible(false); + ui->HoleCutCountersinkAngle->setVisible(false); } if (HoleCutTypeString == "Countersink") { - ui->HoleCutCountersinkAngle->setEnabled(true); + ui->labelHoleCutCountersinkAngle->setVisible(true); + ui->HoleCutCountersinkAngle->setVisible(true); } } else { // screw definition @@ -427,14 +431,86 @@ void TaskHoleParameters::holeCutTypeChanged(int index) ui->HoleCutDiameter->setEnabled(true); ui->HoleCutDepth->setEnabled(true); if (!hole->HoleCutCountersinkAngle.isReadOnly()) { + ui->HoleCutCountersinkAngle->setVisible(true); + ui->labelHoleCutCountersinkAngle->setVisible(true); ui->HoleCutCountersinkAngle->setEnabled(true); } } else { - ui->HoleCutCustomValues->setEnabled(true); + ui->HoleCutCustomValues->setVisible(true); ui->HoleCutDiameter->setEnabled(false); ui->HoleCutDepth->setEnabled(false); ui->HoleCutCountersinkAngle->setEnabled(false); + ui->labelHoleCutCountersinkAngle->setVisible(true); + ui->HoleCutCountersinkAngle->setVisible(true); + } + } + setCutPixmap(); +} + +void TaskHoleParameters::setCutPixmap() +{ + 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" + ); + + if (isCounterbore) { + if (isAngled) { + ui->cutDiagram->setPixmap( + QPixmap(QString::fromUtf8(":/images/hole_counterbore_angled.svg")) + ); + } else { + ui->cutDiagram->setPixmap( + QPixmap(QString::fromUtf8(":/images/hole_counterbore_flat.svg")) + ); + } + } + else if (isCountersink) { + if (isAngled) { + ui->cutDiagram->setPixmap( + QPixmap(QString::fromUtf8(":/images/hole_countersink_angled.svg")) + ); + } else { + ui->cutDiagram->setPixmap( + QPixmap(QString::fromUtf8(":/images/hole_countersink_flat.svg")) + ); + } + } + else if (isCounterdrill) { + if (isAngled) { + ui->cutDiagram->setPixmap( + QPixmap(QString::fromUtf8(":/images/hole_counterdrill_angled.svg")) + ); + } else { + ui->cutDiagram->setPixmap( + QPixmap(QString::fromUtf8(":/images/hole_counterdrill_flat.svg")) + ); + } + } + else { + if (isAngled) { + ui->cutDiagram->setPixmap( + QPixmap(QString::fromUtf8(":/images/hole_none_angled.svg")) + ); + } else { + ui->cutDiagram->setPixmap( + QPixmap(QString::fromUtf8(":/images/hole_none_flat.svg")) + ); } } } @@ -514,17 +590,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); + setCutPixmap(); } void TaskHoleParameters::depthValueChanged(double value) @@ -538,17 +613,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); + setCutPixmap(); recomputeFeature(); } } @@ -932,21 +1001,14 @@ void TaskHoleParameters::changedObject(const App::Document&, const App::Property ui->Depth->setDisabled(ro); } 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); + ui->DrillPointAngled->setEnabled(true); + if (ui->DrillPointAngled->isChecked() ^ (drillPoint == "Angled")) { + ui->DrillPointAngled->blockSignals(true); + ui->DrillPointAngled->setChecked(drillPoint == "Angled"); + ui->DrillPointAngled->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->setDisabled(ro); } else if (&Prop == &hole->DrillPointAngle) { ui->DrillPointAngle->setEnabled(true); @@ -1131,14 +1193,11 @@ Base::Quantity TaskHoleParameters::getDepth() const long TaskHoleParameters::getDrillPoint() const { - if (ui->drillPointFlat->isChecked()) { - return 0; - } - if (ui->drillPointAngled->isChecked()) { + + if (ui->DrillPointAngled->isChecked()) { return 1; } - assert(0); - return -1; // to avoid a compiler warning + return 0; } Base::Quantity TaskHoleParameters::getDrillPointAngle() const diff --git a/src/Mod/PartDesign/Gui/TaskHoleParameters.h b/src/Mod/PartDesign/Gui/TaskHoleParameters.h index fd2862d9c2..f9fd063311 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 setCutPixmap(); private: class Observer : public App::DocumentObserver { diff --git a/src/Mod/PartDesign/Gui/TaskHoleParameters.ui b/src/Mod/PartDesign/Gui/TaskHoleParameters.ui index c0667192c0..52b761daba 100644 --- a/src/Mod/PartDesign/Gui/TaskHoleParameters.ui +++ b/src/Mod/PartDesign/Gui/TaskHoleParameters.ui @@ -6,12 +6,12 @@ 0 0 - 432 - 776 + 391 + 897 - + 0 0 @@ -19,650 +19,406 @@ 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 + + + 0 + 0 + + + + + + + :/images/hole_counterdrill_angled.svg + + + true + + + + + + + 8 0 - - 0 - 0 - - - 6 + + + Qt::Vertical - - 0 + + QSizePolicy::Fixed + + + 20 + 8 + + + + + + - + - + + 0 + 0 + + + + Countersink angle + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + 0 + 0 + + + + false + + + 0.000000000000000 + + + deg + + + + + + + + + + + 0 0 @@ -670,41 +426,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 +449,218 @@ Note that the calculation can take some time - - - - - - - - 6 - - - 0 - - - 0 - - - 0 - - - 0 - - - - - 0 - 0 - - - - Customize thread clearance - - - Custom Clearance - - + + + + + + 0 + 0 + + + + Diameter + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + 0 + 0 + + + + + 0 + 0 + + + + Hole diameter + + + false + + + 0.000000000000000 + + + mm + + + + - - - - 0 - 0 - + + + Qt::Vertical - - Custom Thread clearance value + + QSizePolicy::Fixed - - false + + + 20 + 17 + - - 0.100000000000000 - - - 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 +674,9 @@ Note that the calculation can take some time 0 - + - + 0 0 @@ -877,6 +718,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 +1086,22 @@ Only available for holes without thread Gui::QuantitySpinBox
Gui/PrefWidgets.h
+ + ElideLabel + QLabel +
Gui/ElideLabel.h
+
+ + ElideCheckBox + QCheckBox +
Gui/ElideCheckBox.h
+
- + + + -