28#include <QDoubleSpinBox>
31#include <tulip/DataSet.h>
32#include <tulip/VectorEditor.h>
33#include <tulip/GraphPropertiesModel.h>
34#include <tulip/TlpQtTools.h>
35#include <tulip/TulipMetaTypes.h>
36#include <tulip/ScientificDoubleSpinBox.h>
37#include <tulip/Perspective.h>
42QWidget *NumberEditorCreator<T>::createWidget(QWidget *parent)
const {
43 QDoubleSpinBox *dsb =
nullptr;
46 if (
typeid(T).name() ==
typeid(tlp::IntegerType).name() ||
47 typeid(T).name() ==
typeid(tlp::UnsignedIntegerType).name() ||
48 typeid(T).name() ==
typeid(tlp::LongType).name()) {
49 dsb =
new QDoubleSpinBox(parent);
54 dsb =
new tlp::ScientificDoubleSpinBox(parent);
56 dsb->setLocale(QLocale(QLocale::C));
60 if (
typeid(T).name() ==
typeid(tlp::IntegerType).name()) {
61 dsb->setRange(-INT_MAX, INT_MAX);
62 }
else if (
typeid(T).name() ==
typeid(tlp::UnsignedIntegerType).name()) {
63 dsb->setRange(0, UINT_MAX);
64 }
else if (
typeid(T).name() ==
typeid(tlp::LongType).name()) {
65 dsb->setRange(
static_cast<double>(-LONG_MAX),
static_cast<double>(LONG_MAX));
66 }
else if (
typeid(T).name() ==
typeid(tlp::FloatType).name()) {
67 dsb->setRange(-FLT_MAX, FLT_MAX);
69 dsb->setRange(-DBL_MAX, DBL_MAX);
76void NumberEditorCreator<T>::setEditorData(QWidget *editor,
const QVariant &data,
bool,
78 static_cast<QDoubleSpinBox *
>(editor)->setValue(data.value<
typename T::RealType>());
82QVariant NumberEditorCreator<T>::editorData(QWidget *editor,
tlp::Graph *) {
85 static_cast<typename T::RealType
>(
static_cast<QDoubleSpinBox *
>(editor)->value()));
90QWidget *LineEditEditorCreator<T>::createWidget(QWidget *parent)
const {
91 return new QLineEdit(parent);
95void LineEditEditorCreator<T>::setEditorData(QWidget *editor,
const QVariant &data,
bool,
97 typename T::RealType val = data.value<
typename T::RealType>();
99 static_cast<QLineEdit *
>(editor)->selectAll();
103QVariant LineEditEditorCreator<T>::editorData(QWidget *editor,
tlp::Graph *) {
106 typename T::RealType val;
108 if (T::fromString(val, strVal))
109 result.setValue(val);
115QWidget *MultiLinesEditEditorCreator<T>::createWidget(QWidget *parent)
const {
116 QTextEdit *edit =
new QTextEdit(parent);
117 edit->setFocusPolicy(Qt::StrongFocus);
118 edit->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
119 edit->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
124void MultiLinesEditEditorCreator<T>::setEditorData(QWidget *editor,
const QVariant &data,
bool,
126 typename T::RealType val = data.value<
typename T::RealType>();
128 static_cast<QTextEdit *
>(editor)->selectAll();
132QVariant MultiLinesEditEditorCreator<T>::editorData(QWidget *editor,
tlp::Graph *) {
133 std::string strVal =
QStringToTlpString(
static_cast<QTextEdit *
>(editor)->toPlainText());
135 typename T::RealType val;
137 if (T::fromString(val, strVal))
138 result.setValue(val);
144QSize MultiLinesEditEditorCreator<T>::sizeHint(
const QStyleOptionViewItem &option,
145 const QModelIndex &index)
const {
146 QVariant data = index.model()->data(index);
147 typename T::RealType val = data.value<
typename T::RealType>();
149 QStringList lines = valS.split(QLatin1Char(
'\n'));
150 QFontMetrics fontMetrics(option.font);
154 for (
int i = 0; i < lines.count(); ++i) {
155 QRect textBB = fontMetrics.boundingRect(lines.at(i));
156 height += fontMetrics.boundingRect(
"|").height();
157 width = std::max(width, textBB.width());
161 width = std::min(width, 500);
163 return QSize(width + 15, height + 5);
167bool MultiLinesEditEditorCreator<T>::paint(QPainter *painter,
const QStyleOptionViewItem &option,
168 const QVariant &data,
const QModelIndex &index)
const {
169 TulipItemEditorCreator::paint(painter, option, data, index);
170 QRect rect = option.rect;
171 typename T::RealType val = data.value<
typename T::RealType>();
173 QStringList lines = valS.split(QLatin1Char(
'\n'));
175 if (option.state.testFlag(QStyle::State_Selected) && option.showDecorationSelected) {
176 painter->setPen(option.palette.highlightedText().color());
177 painter->setBrush(option.palette.highlightedText());
179 painter->setPen(option.palette.text().color());
180 painter->setBrush(option.palette.text());
183 for (
int i = 0; i < lines.count(); ++i) {
184 painter->drawText(rect.x(), rect.y() + i * rect.height() / lines.count(), rect.width(),
185 rect.height() / lines.count(), Qt::AlignLeft | Qt::AlignVCenter, lines.at(i));
191template <
typename PROPTYPE>
192QWidget *PropertyEditorCreator<PROPTYPE>::createWidget(QWidget *parent)
const {
193 return new QComboBox(parent);
196template <
typename PROPTYPE>
197void PropertyEditorCreator<PROPTYPE>::setEditorData(QWidget *w,
const QVariant &val,
200 w->setEnabled(
false);
204 PROPTYPE *prop = val.value<PROPTYPE *>();
205 QComboBox *combo =
static_cast<QComboBox *
>(w);
206 GraphPropertiesModel<PROPTYPE> *model =
nullptr;
209 model =
new GraphPropertiesModel<PROPTYPE>(g,
false, combo);
211 model =
new GraphPropertiesModel<PROPTYPE>(QObject::tr(
"Select a property"), g,
false, combo);
213 combo->setModel(model);
214 combo->setCurrentIndex(model->rowOf(prop));
217template <
typename PROPTYPE>
218QVariant PropertyEditorCreator<PROPTYPE>::editorData(QWidget *w,
tlp::Graph *g) {
222 QComboBox *combo =
static_cast<QComboBox *
>(w);
223 GraphPropertiesModel<PROPTYPE> *model =
224 static_cast<GraphPropertiesModel<PROPTYPE> *
>(combo->model());
225 QVariant var = model->data(model->index(combo->currentIndex(), 0), TulipModel::PropertyRole);
227 PROPTYPE *prop =
static_cast<PROPTYPE *
>(pi);
228 return QVariant::fromValue<PROPTYPE *>(prop);
231template <
typename PROPTYPE>
232QString PropertyEditorCreator<PROPTYPE>::displayText(
const QVariant &v)
const {
233 PROPTYPE *prop = v.value<PROPTYPE *>();
236 return QObject::tr(
"Select a property");
241template <
typename ElementType>
242QWidget *VectorEditorCreator<ElementType>::createWidget(QWidget *)
const {
243 VectorEditor *w =
new VectorEditor(
246 w->setWindowFlags(Qt::Dialog);
247 w->setWindowModality(Qt::ApplicationModal);
251template <
typename ElementType>
252void VectorEditorCreator<ElementType>::setEditorData(QWidget *editor,
const QVariant &v,
bool,
254 QVector<QVariant> editorData;
255 std::vector<ElementType> vect = v.value<std::vector<ElementType>>();
257 for (
size_t i = 0; i < vect.size(); ++i) {
258 editorData.push_back(QVariant::fromValue<ElementType>(vect[i]));
261 static_cast<VectorEditor *
>(editor)->setVector(editorData, qMetaTypeId<ElementType>());
263 static_cast<VectorEditor *
>(editor)->move(QCursor::pos());
266template <
typename ElementType>
267QVariant VectorEditorCreator<ElementType>::editorData(QWidget *editor,
tlp::Graph *) {
268 std::vector<ElementType> result;
269 QVector<QVariant> editorData =
static_cast<VectorEditor *
>(editor)->vector();
271 for (
const QVariant &v : editorData)
274 return QVariant::fromValue<std::vector<ElementType>>(result);
279struct DisplayVectorDataType :
public DataType {
280 DisplayVectorDataType(
void *
value) : DataType(
value) {}
281 ~DisplayVectorDataType()
override {}
282 DataType *clone()
const override {
286 std::string getTypeName()
const override {
287 return std::string(
typeid(std::vector<T>).name());
291template <
typename ElementType>
292QString VectorEditorCreator<ElementType>::displayText(
const QVariant &data)
const {
293 std::vector<ElementType> v = data.value<std::vector<ElementType>>();
302 DisplayVectorDataType<ElementType> dt(&v);
304 std::stringstream sstr;
305 dts->writeData(sstr, &dt);
307 std::string str = sstr.str();
311 return truncateText(qstr);
315 return QString(
"1 element");
317 return QString::number(v.size()) + QObject::tr(
" elements");
static DataTypeSerializer * typenameToSerializer(const std::string &name)
static tlp::Perspective * instance()
PropertyInterface describes the interface of a graph property.
std::string QStringToTlpString(const QString &toConvert)
Convert a QString to a Tulip UTF-8 encoded std::string.
QString tlpStringToQString(const std::string &toConvert)
Convert a Tulip UTF-8 encoded std::string to a QString.
void * value
The actual pointer to the element's data.