Skip to content

Commit

Permalink
+ use quantity boxes in fillet/chamfer dialog
Browse files Browse the repository at this point in the history
  • Loading branch information
wwmayer committed Feb 28, 2016
1 parent e3aba10 commit 92c2b18
Show file tree
Hide file tree
Showing 3 changed files with 60 additions and 27 deletions.
65 changes: 42 additions & 23 deletions src/Mod/Part/Gui/DlgFilletEdges.cpp
Expand Up @@ -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>
Expand All @@ -75,6 +76,8 @@

using namespace PartGui;

Q_DECLARE_METATYPE(Base::Quantity)

FilletRadiusDelegate::FilletRadiusDelegate(QObject *parent) : QItemDelegate(parent)
{
}
Expand All @@ -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);
Expand All @@ -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,
Expand Down Expand Up @@ -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 {
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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()))
Expand Down Expand Up @@ -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));
}
}
}
Expand Down Expand Up @@ -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;
}
}
Expand Down
5 changes: 3 additions & 2 deletions src/Mod/Part/Gui/DlgFilletEdges.h
Expand Up @@ -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:
Expand Down Expand Up @@ -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();

Expand Down
17 changes: 15 additions & 2 deletions src/Mod/Part/Gui/DlgFilletEdges.ui
Expand Up @@ -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>
Expand All @@ -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>
Expand Down Expand Up @@ -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>
Expand Down

0 comments on commit 92c2b18

Please sign in to comment.