+ use quantity boxes in fillet/chamfer dialog

This commit is contained in:
wmayer 2016-02-28 11:24:36 +01:00
parent e3aba10762
commit 92c2b18350
3 changed files with 60 additions and 27 deletions

View File

@ -66,6 +66,7 @@
#include <Gui/Application.h>
#include <Gui/BitmapFactory.h>
#include <Gui/Command.h>
#include <Gui/QuantitySpinBox.h>
#include <Gui/WaitCursor.h>
#include <Gui/Selection.h>
#include <Gui/SelectionFilter.h>
@ -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<Base::Quantity>();
QDoubleSpinBox *spinBox = static_cast<QDoubleSpinBox*>(editor);
Gui::QuantitySpinBox *spinBox = static_cast<Gui::QuantitySpinBox*>(editor);
spinBox->setValue(value);
}
void FilletRadiusDelegate::setModelData(QWidget *editor, QAbstractItemModel *model,
const QModelIndex &index) const
{
QDoubleSpinBox *spinBox = static_cast<QDoubleSpinBox*>(editor);
Gui::QuantitySpinBox *spinBox = static_cast<Gui::QuantitySpinBox*>(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<Base::Quantity>(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<Base::Quantity>();
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<App::DocumentObject*>& 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>(Base::Quantity(et->radius1, Base::Unit::Length)));
model->setData(model->index(index, 2), QVariant::fromValue<Base::Quantity>(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<int>::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>(Base::Quantity(1.0,Base::Unit::Length)));
model->setData(model->index(index, 2), QVariant::fromValue<Base::Quantity>(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; i<model->rowCount(); ++i) {
QVariant value = model->index(i,0).data(Qt::CheckStateRole);
Qt::CheckState checkState = static_cast<Qt::CheckState>(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<Base::Quantity>(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; i<model->rowCount(); ++i) {
QVariant value = model->index(i,0).data(Qt::CheckStateRole);
Qt::CheckState checkState = static_cast<Qt::CheckState>(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<Base::Quantity>(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>();
Base::Quantity r2 = r1;
if (end_radius)
r2 = model->index(i,2).data().toDouble();
r2 = model->index(i,2).data(Qt::EditRole).value<Base::Quantity>();
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;
}
}

View File

@ -67,6 +67,7 @@ public:
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();

View File

@ -98,7 +98,10 @@
</widget>
</item>
<item>
<widget class="QDoubleSpinBox" name="filletStartRadius">
<widget class="Gui::QuantitySpinBox" name="filletStartRadius">
<property name="unit" stdset="0">
<string notr="true">mm</string>
</property>
<property name="singleStep">
<double>0.100000000000000</double>
</property>
@ -108,7 +111,10 @@
</widget>
</item>
<item>
<widget class="QDoubleSpinBox" name="filletEndRadius">
<widget class="Gui::QuantitySpinBox" name="filletEndRadius">
<property name="unit" stdset="0">
<string notr="true">mm</string>
</property>
<property name="singleStep">
<double>0.100000000000000</double>
</property>
@ -177,6 +183,13 @@
</item>
</layout>
</widget>
<customwidgets>
<customwidget>
<class>Gui::QuantitySpinBox</class>
<extends>QWidget</extends>
<header>Gui/QuantitySpinBox.h</header>
</customwidget>
</customwidgets>
<tabstops>
<tabstop>shapeObject</tabstop>
<tabstop>filletType</tabstop>