28 #include <QDoubleSpinBox> 30 #include <tulip/ForEach.h> 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> 42 QWidget* NumberEditorCreator<T>::createWidget(QWidget* parent)
const {
43 QDoubleSpinBox *dsb = NULL;
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);
57 dsb->setLocale(QLocale(QLocale::C));
61 if (
typeid(T).name() ==
typeid(tlp::IntegerType).name()) {
62 dsb->setRange(-INT_MAX, INT_MAX);
64 else if (
typeid(T).name() ==
typeid(tlp::UnsignedIntegerType).name()) {
65 dsb->setRange(0, UINT_MAX);
67 else if (
typeid(T).name() ==
typeid(tlp::LongType).name()) {
68 dsb->setRange(-LONG_MAX, LONG_MAX);
70 else if (
typeid(T).name() ==
typeid(tlp::FloatType).name()) {
71 dsb->setRange(-FLT_MAX, FLT_MAX);
74 dsb->setRange(-DBL_MAX, DBL_MAX);
81 void NumberEditorCreator<T>::setEditorData(QWidget* editor,
const QVariant& data,
bool,
tlp::Graph*) {
82 static_cast<QDoubleSpinBox*
>(editor)->setValue(data.value<
typename T::RealType>());
86 QVariant NumberEditorCreator<T>::editorData(QWidget* editor,
tlp::Graph*) {
88 result.setValue(static_cast<typename T::RealType>(static_cast<QDoubleSpinBox*>(editor)->value()));
93 QWidget* LineEditEditorCreator<T>::createWidget(QWidget *parent)
const {
94 return new QLineEdit(parent);
98 void LineEditEditorCreator<T>::setEditorData(QWidget* editor,
const QVariant &data,
bool,
tlp::Graph*) {
99 typename T::RealType val = data.value<
typename T::RealType>();
101 static_cast<QLineEdit*
>(editor)->selectAll();
105 QVariant LineEditEditorCreator<T>::editorData(QWidget* editor,
tlp::Graph*) {
108 typename T::RealType val;
110 if (T::fromString(val,strVal))
111 result.setValue<
typename T::RealType>(val);
117 QWidget* MultiLinesEditEditorCreator<T>::createWidget(QWidget *parent)
const {
118 QTextEdit *edit =
new QTextEdit(parent);
119 edit->setFocusPolicy(Qt::StrongFocus);
120 edit->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
121 edit->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
126 void MultiLinesEditEditorCreator<T>::setEditorData(QWidget* editor,
const QVariant &data,
bool,
tlp::Graph*) {
127 typename T::RealType val = data.value<
typename T::RealType>();
129 static_cast<QTextEdit*
>(editor)->selectAll();
133 QVariant MultiLinesEditEditorCreator<T>::editorData(QWidget* editor,
tlp::Graph*) {
134 std::string strVal =
QStringToTlpString(static_cast<QTextEdit*>(editor)->toPlainText());
136 typename T::RealType val;
138 if (T::fromString(val,strVal))
139 result.setValue<
typename T::RealType>(val);
145 QSize MultiLinesEditEditorCreator<T>::sizeHint(
const QStyleOptionViewItem & option,
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);
167 bool MultiLinesEditEditorCreator<T>::paint(QPainter* painter,
const QStyleOptionViewItem &option,
const QVariant &data)
const {
168 TulipItemEditorCreator::paint(painter,option,data);
169 QRect rect = option.rect;
170 typename T::RealType val = data.value<
typename T::RealType>();
172 QStringList lines = valS.split(QLatin1Char(
'\n'));
174 if (option.state.testFlag(QStyle::State_Selected) && option.showDecorationSelected) {
175 painter->setPen(option.palette.highlightedText().color());
176 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(), rect.height()/lines.count(),Qt::AlignLeft | Qt::AlignVCenter, lines.at(i));
190 template<
typename PROPTYPE>
191 QWidget* PropertyEditorCreator<PROPTYPE>::createWidget(QWidget* parent)
const {
192 return new QComboBox(parent);
195 template<
typename PROPTYPE>
196 void PropertyEditorCreator<PROPTYPE>::setEditorData(QWidget* w,
const QVariant& val,
bool isMandatory,
tlp::Graph* g) {
198 w->setEnabled(
false);
202 PROPTYPE* prop = val.value<PROPTYPE*>();
203 QComboBox* combo =
static_cast<QComboBox*
>(w);
204 GraphPropertiesModel<PROPTYPE>* model = NULL;
207 model =
new GraphPropertiesModel<PROPTYPE>(g,
false,combo);
209 model =
new GraphPropertiesModel<PROPTYPE>(QObject::trUtf8(
"Select a property"),g,
false,combo);
211 combo->setModel(model);
212 combo->setCurrentIndex(model->rowOf(prop));
215 template<
typename PROPTYPE>
216 QVariant PropertyEditorCreator<PROPTYPE>::editorData(QWidget* w,
tlp::Graph* g) {
220 QComboBox* combo =
static_cast<QComboBox*
>(w);
221 GraphPropertiesModel<PROPTYPE>* model =
static_cast<GraphPropertiesModel<PROPTYPE> *
>(combo->model());
222 QVariant var = model->data(model->index(combo->currentIndex(),0),TulipModel::PropertyRole);
224 PROPTYPE* prop = (PROPTYPE*)(pi);
225 return QVariant::fromValue<PROPTYPE*>(prop);
228 template<
typename PROPTYPE>
229 QString PropertyEditorCreator<PROPTYPE>::displayText(
const QVariant& v)
const {
230 PROPTYPE *prop = v.value<PROPTYPE*>();
233 return QObject::trUtf8(
"Select a property");
238 template<
typename ElementType>
239 QWidget* VectorEditorCreator<ElementType>::createWidget(QWidget*)
const {
240 VectorEditor* w =
new VectorEditor(NULL);
241 w->setWindowFlags(Qt::Dialog);
242 w->setWindowModality(Qt::ApplicationModal);
247 template<
typename ElementType>
248 void VectorEditorCreator<ElementType>::setEditorData(QWidget* editor,
const QVariant& v,
bool,
tlp::Graph*) {
249 QVector<QVariant> editorData;
250 std::vector<ElementType> vect = v.value<std::vector<ElementType> >();
252 for (
size_t i=0; i < vect.size(); ++i) {
253 editorData.push_back(QVariant::fromValue<ElementType>(vect[i]));
256 static_cast<VectorEditor*
>(editor)->setVector(editorData,qMetaTypeId<ElementType>());
258 static_cast<VectorEditor*
>(editor)->move(QCursor::pos());
261 template<
typename ElementType>
262 QVariant VectorEditorCreator<ElementType>::editorData(QWidget* editor,
tlp::Graph*) {
263 std::vector<ElementType> result;
264 QVector<QVariant> editorData =
static_cast<VectorEditor*
>(editor)->vector();
266 foreach(QVariant v, editorData)
269 return QVariant::fromValue<std::vector<ElementType> >(result);
274 struct DisplayVectorDataType :
public DataType {
275 DisplayVectorDataType(
void *value) :DataType(value) {}
276 ~DisplayVectorDataType() {
278 DataType* clone()
const {
282 std::string getTypeName()
const {
283 return std::string(
typeid(std::vector<T>).name());
288 template<
typename ElementType>
289 QString VectorEditorCreator<ElementType>::displayText(
const QVariant &data)
const {
290 std::vector<ElementType> v = data.value<std::vector<ElementType> >();
296 DataTypeSerializer* dts =
300 DisplayVectorDataType<ElementType> dt(&v);
302 std::stringstream sstr;
303 dts->writeData(sstr, &dt);
305 std::string str = sstr.str();
309 return truncateText(qstr);
313 return QString(
"1 element");
315 return QString::number(v.size()) + QObject::trUtf8(
" elements");
Utility class implementing a QDoubleSpinBox supporting scientific notation.
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.
static DataTypeSerializer * typenameToSerializer(const std::string &name)
QString tlpStringToQString(const std::string &toConvert)
Convert a Tulip UTF-8 encoded std::string to a QString.