From 92c2b18350ff4e2ae5855fba2c266b84a1b07666 Mon Sep 17 00:00:00 2001 From: wmayer Date: Sun, 28 Feb 2016 11:24:36 +0100 Subject: [PATCH] + use quantity boxes in fillet/chamfer dialog --- src/Mod/Part/Gui/DlgFilletEdges.cpp | 65 +++++++++++++++++++---------- src/Mod/Part/Gui/DlgFilletEdges.h | 5 ++- src/Mod/Part/Gui/DlgFilletEdges.ui | 17 +++++++- 3 files changed, 60 insertions(+), 27 deletions(-) diff --git a/src/Mod/Part/Gui/DlgFilletEdges.cpp b/src/Mod/Part/Gui/DlgFilletEdges.cpp index 11fe91118921..0b11ad13ce33 100644 --- a/src/Mod/Part/Gui/DlgFilletEdges.cpp +++ b/src/Mod/Part/Gui/DlgFilletEdges.cpp @@ -66,6 +66,7 @@ #include #include #include +#include #include #include #include @@ -75,6 +76,8 @@ using namespace PartGui; +Q_DECLARE_METATYPE(Base::Quantity) + FilletRadiusDelegate::FilletRadiusDelegate(QObject *parent) : QItemDelegate(parent) { } @@ -85,8 +88,8 @@ QWidget *FilletRadiusDelegate::createEditor(QWidget *parent, const QStyleOptionV if (index.column() < 1) return 0; - QDoubleSpinBox *editor = new QDoubleSpinBox(parent); - editor->setDecimals(Base::UnitsApi::getDecimals()); + Gui::QuantitySpinBox *editor = new Gui::QuantitySpinBox(parent); + editor->setUnit(Base::Unit::Length); editor->setMinimum(0.0); editor->setMaximum(INT_MAX); editor->setSingleStep(0.1); @@ -96,22 +99,23 @@ QWidget *FilletRadiusDelegate::createEditor(QWidget *parent, const QStyleOptionV void FilletRadiusDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const { - double value = index.model()->data(index, Qt::EditRole).toDouble(); + Base::Quantity value = index.model()->data(index, Qt::EditRole).value(); - QDoubleSpinBox *spinBox = static_cast(editor); + Gui::QuantitySpinBox *spinBox = static_cast(editor); spinBox->setValue(value); } void FilletRadiusDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const { - QDoubleSpinBox *spinBox = static_cast(editor); + Gui::QuantitySpinBox *spinBox = static_cast(editor); spinBox->interpretText(); //double value = spinBox->value(); //QString value = QString::fromLatin1("%1").arg(spinBox->value(),0,'f',2); - QString value = QLocale::system().toString(spinBox->value(),'f',Base::UnitsApi::getDecimals()); + //QString value = QLocale::system().toString(spinBox->value().getValue(),'f',Base::UnitsApi::getDecimals()); + Base::Quantity value = spinBox->value(); - model->setData(index, value, Qt::EditRole); + model->setData(index, QVariant::fromValue(value), Qt::EditRole); } void FilletRadiusDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, @@ -149,6 +153,17 @@ bool FilletRadiusModel::setData (const QModelIndex & index, const QVariant & val return ok; } +QVariant FilletRadiusModel::data(const QModelIndex& index, int role) const +{ + QVariant value = QStandardItemModel::data(index, role); + if (role == Qt::DisplayRole && index.column() >= 1) { + Base::Quantity q = value.value(); + QString str = q.getUserString(); + return str; + } + return value; +} + // -------------------------------------------------------------- namespace PartGui { @@ -207,8 +222,8 @@ DlgFilletEdges::DlgFilletEdges(FilletType type, Part::FilletBase* fillet, QWidge ui->setupUi(this); ui->filletStartRadius->setMaximum(INT_MAX); ui->filletEndRadius->setMaximum(INT_MAX); - ui->filletStartRadius->setDecimals(Base::UnitsApi::getDecimals()); - ui->filletEndRadius->setDecimals(Base::UnitsApi::getDecimals()); + ui->filletStartRadius->setUnit(Base::Unit::Length); + ui->filletEndRadius->setUnit(Base::Unit::Length); d->object = 0; d->selection = new EdgeFaceSelection(d->object); @@ -557,8 +572,10 @@ void DlgFilletEdges::setupFillet(const std::vector& objs) if (it != d->edge_ids.end()) { int index = it - d->edge_ids.begin(); model->setData(model->index(index, 0), Qt::Checked, Qt::CheckStateRole); - model->setData(model->index(index, 1), QVariant(QLocale::system().toString(et->radius1,'f',Base::UnitsApi::getDecimals()))); - model->setData(model->index(index, 2), QVariant(QLocale::system().toString(et->radius2,'f',Base::UnitsApi::getDecimals()))); + //model->setData(model->index(index, 1), QVariant(QLocale::system().toString(et->radius1,'f',Base::UnitsApi::getDecimals()))); + //model->setData(model->index(index, 2), QVariant(QLocale::system().toString(et->radius2,'f',Base::UnitsApi::getDecimals()))); + model->setData(model->index(index, 1), QVariant::fromValue(Base::Quantity(et->radius1, Base::Unit::Length))); + model->setData(model->index(index, 2), QVariant::fromValue(Base::Quantity(et->radius2, Base::Unit::Length))); startRadius = et->radius1; endRadius = et->radius2; @@ -675,8 +692,10 @@ void DlgFilletEdges::on_shapeObject_activated(int index) for (std::vector::iterator it = d->edge_ids.begin(); it != d->edge_ids.end(); ++it) { model->setData(model->index(index, 0), QVariant(tr("Edge%1").arg(*it))); model->setData(model->index(index, 0), QVariant(*it), Qt::UserRole); - model->setData(model->index(index, 1), QVariant(QLocale::system().toString(1.0,'f',Base::UnitsApi::getDecimals()))); - model->setData(model->index(index, 2), QVariant(QLocale::system().toString(1.0,'f',Base::UnitsApi::getDecimals()))); + //model->setData(model->index(index, 1), QVariant(QLocale::system().toString(1.0,'f',Base::UnitsApi::getDecimals()))); + //model->setData(model->index(index, 2), QVariant(QLocale::system().toString(1.0,'f',Base::UnitsApi::getDecimals()))); + model->setData(model->index(index, 1), QVariant::fromValue(Base::Quantity(1.0,Base::Unit::Length))); + model->setData(model->index(index, 2), QVariant::fromValue(Base::Quantity(1.0,Base::Unit::Length))); std::stringstream element; element << "Edge" << *it; if (Gui::Selection().isSelected(part, element.str().c_str())) @@ -770,32 +789,30 @@ void DlgFilletEdges::on_filletType_activated(int index) ui->treeView->resizeColumnToContents(2); } -void DlgFilletEdges::on_filletStartRadius_valueChanged(double radius) +void DlgFilletEdges::on_filletStartRadius_valueChanged(const Base::Quantity& radius) { QAbstractItemModel* model = ui->treeView->model(); - QString text = QLocale::system().toString(radius,'f',Base::UnitsApi::getDecimals()); for (int i=0; irowCount(); ++i) { QVariant value = model->index(i,0).data(Qt::CheckStateRole); Qt::CheckState checkState = static_cast(value.toInt()); // is item checked if (checkState & Qt::Checked) { - model->setData(model->index(i, 1), QVariant(text)); + model->setData(model->index(i, 1), QVariant::fromValue(radius)); } } } -void DlgFilletEdges::on_filletEndRadius_valueChanged(double radius) +void DlgFilletEdges::on_filletEndRadius_valueChanged(const Base::Quantity& radius) { QAbstractItemModel* model = ui->treeView->model(); - QString text = QLocale::system().toString(radius,'f',Base::UnitsApi::getDecimals()); for (int i=0; irowCount(); ++i) { QVariant value = model->index(i,0).data(Qt::CheckStateRole); Qt::CheckState checkState = static_cast(value.toInt()); // is item checked if (checkState & Qt::Checked) { - model->setData(model->index(i, 2), QVariant(text)); + model->setData(model->index(i, 2), QVariant::fromValue(radius)); } } } @@ -846,13 +863,15 @@ bool DlgFilletEdges::accept() if (checkState & Qt::Checked) { // the index value of the edge int id = model->index(i,0).data(Qt::UserRole).toInt(); - double r1 = model->index(i,1).data().toDouble(); - double r2 = r1; + Base::Quantity r1 = model->index(i,1).data(Qt::EditRole).value(); + Base::Quantity r2 = r1; if (end_radius) - r2 = model->index(i,2).data().toDouble(); + r2 = model->index(i,2).data(Qt::EditRole).value(); code += QString::fromLatin1( "__fillets__.append((%1,%2,%3))\n") - .arg(id).arg(r1,0,'f',Base::UnitsApi::getDecimals()).arg(r2,0,'f',Base::UnitsApi::getDecimals()); + .arg(id) + .arg(r1.getValue(),0,'f',Base::UnitsApi::getDecimals()) + .arg(r2.getValue(),0,'f',Base::UnitsApi::getDecimals()); todo = true; } } diff --git a/src/Mod/Part/Gui/DlgFilletEdges.h b/src/Mod/Part/Gui/DlgFilletEdges.h index a92c37231e37..bba6d7a43bea 100644 --- a/src/Mod/Part/Gui/DlgFilletEdges.h +++ b/src/Mod/Part/Gui/DlgFilletEdges.h @@ -67,6 +67,7 @@ class FilletRadiusModel : public QStandardItemModel Qt::ItemFlags flags (const QModelIndex & index) const; bool setData (const QModelIndex & index, const QVariant & value, int role = Qt::EditRole); + QVariant data(const QModelIndex&, int role = Qt::DisplayRole) const; void updateCheckStates(); Q_SIGNALS: @@ -104,8 +105,8 @@ private Q_SLOTS: void on_selectAllButton_clicked(); void on_selectNoneButton_clicked(); void on_filletType_activated(int); - void on_filletStartRadius_valueChanged(double); - void on_filletEndRadius_valueChanged(double); + void on_filletStartRadius_valueChanged(const Base::Quantity&); + void on_filletEndRadius_valueChanged(const Base::Quantity&); void toggleCheckState(const QModelIndex&); void onHighlightEdges(); diff --git a/src/Mod/Part/Gui/DlgFilletEdges.ui b/src/Mod/Part/Gui/DlgFilletEdges.ui index 0ad96ceacaa2..7e4a5966b18b 100644 --- a/src/Mod/Part/Gui/DlgFilletEdges.ui +++ b/src/Mod/Part/Gui/DlgFilletEdges.ui @@ -98,7 +98,10 @@ - + + + mm + 0.100000000000000 @@ -108,7 +111,10 @@ - + + + mm + 0.100000000000000 @@ -177,6 +183,13 @@ + + + Gui::QuantitySpinBox + QWidget +
Gui/QuantitySpinBox.h
+
+
shapeObject filletType