// SPDX-License-Identifier: LGPL-2.1-or-later /*************************************************************************** * Copyright (c) 2023 David Carter * * * * 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 * * . * * * **************************************************************************/ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "Array2D.h" #include "Array3D.h" #include "ArrayDelegate.h" #include "MaterialSave.h" using namespace MatGui; ArrayDelegate::ArrayDelegate(Materials::MaterialValue::ValueType type, const QString& units, QObject* parent) : QStyledItemDelegate(parent) , _type(type) , _units(units) {} void ArrayDelegate::paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const { if (_type == Materials::MaterialValue::Quantity) { auto* tableModel = dynamic_cast(index.model()); painter->save(); QString text; if (!tableModel->newRow(index)) { QVariant item = tableModel->data(index); auto quantity = item.value(); text = QString::fromStdString(quantity.getUserString()); } painter->drawText(option.rect, 0, text); painter->restore(); } else { QStyledItemDelegate::paint(painter, option, index); } } void ArrayDelegate::setEditorData(QWidget* editor, const QModelIndex& index) const { if (_type == Materials::MaterialValue::Quantity) { auto tableModel = dynamic_cast(index.model()); auto item = tableModel->data(index); auto input = static_cast(editor); input->setValue(item.value()); } else { QStyledItemDelegate::setEditorData(editor, index); } } QWidget* ArrayDelegate::createEditor(QWidget* parent, const QStyleOptionViewItem& styleOption, const QModelIndex& index) const { Q_UNUSED(styleOption) auto tableModel = dynamic_cast(index.model()); auto item = tableModel->data(index); QWidget* editor = createWidget(parent, item); return editor; } QWidget* ArrayDelegate::createWidget(QWidget* parent, const QVariant& item) const { QWidget* widget = nullptr; if (_type == Materials::MaterialValue::String || _type == Materials::MaterialValue::URL || _type == Materials::MaterialValue::List) { widget = new Gui::PrefLineEdit(parent); } else if (_type == Materials::MaterialValue::Integer) { Gui::UIntSpinBox* spinner = new Gui::UIntSpinBox(parent); spinner->setMinimum(0); spinner->setMaximum(std::numeric_limits::max()); spinner->setValue(item.toUInt()); widget = spinner; } else if (_type == Materials::MaterialValue::Float) { auto spinner = new Gui::DoubleSpinBox(parent); // the magnetic permeability is the parameter for which many decimals matter // the most however, even for this, 6 digits are sufficient spinner->setDecimals(6); // for almost all Float parameters of materials a step of 1 would be too large spinner->setSingleStep(0.1); spinner->setMinimum(std::numeric_limits::min()); spinner->setMaximum(std::numeric_limits::max()); spinner->setValue(item.toDouble()); widget = spinner; } else if (_type == Materials::MaterialValue::Boolean) { auto combo = new Gui::PrefComboBox(parent); combo->insertItem(0, QStringLiteral("")); combo->insertItem(1, tr("False")); combo->insertItem(2, tr("True")); combo->setCurrentText(item.toString()); widget = combo; } else if (_type == Materials::MaterialValue::Quantity) { auto input = new Gui::QuantitySpinBox(); input->setMinimum(std::numeric_limits::min()); input->setMaximum(std::numeric_limits::max()); input->setUnitText(_units); input->setValue(item.value()); widget = input; } else if (_type == Materials::MaterialValue::FileList) { auto chooser = new Gui::FileChooser(); auto propertyValue = item.toString(); if (!propertyValue.isEmpty()) { chooser->setFileName(propertyValue); } widget = chooser; } else { // Default editor widget = new QLineEdit(parent); } widget->setParent(parent); return widget; }