From 1cd8591bd9ae6d8ad208092b32303ae3650fc736 Mon Sep 17 00:00:00 2001 From: aquiles Date: Thu, 25 Aug 2011 23:25:33 +0200 Subject: [PATCH] Changed: #1306 added basic editing possibillities for normal and parent values (no default values and no saving of changed values yet); added possibillity to expand/collapse whole tree by header click --- .../src/plugins/georges_editor/CMakeLists.txt | 3 +- .../georges_editor/expandable_headerview.cpp | 143 +++++++++ .../georges_editor/expandable_headerview.h | 49 +++ .../plugins/georges_editor/formdelegate.cpp | 278 ++++++++++++++++++ .../src/plugins/georges_editor/formdelegate.h | 41 +++ .../georges_editor/georges_editor_plugin.cpp | 2 +- .../georges_treeview_dialog.cpp | 30 +- .../georges_editor/georges_treeview_dialog.h | 3 + .../georges_editor/georgesform_model.cpp | 72 +++-- .../georges_editor/georgesform_model.h | 5 +- .../georgesform_proxy_model.cpp | 17 +- 11 files changed, 595 insertions(+), 48 deletions(-) create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/expandable_headerview.cpp create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/expandable_headerview.h create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/formdelegate.cpp create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/formdelegate.h diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/CMakeLists.txt b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/CMakeLists.txt index 7c668ec8a..b29f32152 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/CMakeLists.txt +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/CMakeLists.txt @@ -12,7 +12,8 @@ SET(OVQT_PLUG_GEORGES_EDITOR_HDR georges_editor_plugin.h georges_editor_form.h georges_dirtree_dialog.h georges_filesystem_model.h - georges_treeview_dialog.h) + georges_treeview_dialog.h + expandable_headerview.h) SET(OVQT_PLUG_GEORGES_EDITOR_UIS georges_editor_form.ui georges_dirtree_form.ui diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/expandable_headerview.cpp b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/expandable_headerview.cpp new file mode 100644 index 000000000..7ae482824 --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/expandable_headerview.cpp @@ -0,0 +1,143 @@ +// Object Viewer Qt - Georges Editor Plugin - MMORPG Framework +// Copyright (C) 2011 Adrian Jaekel +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program 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 Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +// Project includes +#include "expandable_headerview.h" + +// Qt includes +#include +#include +#include + +namespace Plugin +{ + + ExpandableHeaderView::ExpandableHeaderView(Qt::Orientation orientation, QWidget * parent) + : QHeaderView(orientation, parent), + m_expanded(true), + m_inDecoration(false) + { + } + + void ExpandableHeaderView::paintSection(QPainter *painter, const QRect &rect, int logicalIndex) const + { + painter->save(); + QHeaderView::paintSection(painter, rect, logicalIndex); + painter->restore(); + + if (logicalIndex == 0) + { + QRect sectionRect = this->orientation() == Qt::Horizontal ? + QRect(this->sectionPosition(logicalIndex), 0, + this->sectionSize(logicalIndex), this->height()): + QRect(0, this->sectionPosition(logicalIndex), + this->width(), this->sectionSize(logicalIndex)); + + QStyleOptionHeader opt; + initStyleOption(&opt); + opt.iconAlignment = Qt::AlignVCenter; + + QVariant variant = this->model()->headerData(logicalIndex, this->orientation(), + Qt::DecorationRole); + opt.icon = qvariant_cast(variant); + if (opt.icon.isNull()) + { + opt.icon = qvariant_cast(variant); + } + QRect headerLabelRect = this->style()->subElementRect(QStyle::SE_HeaderLabel, &opt, this); + + QPixmap pixmap + = opt.icon.pixmap(this->style()->pixelMetric(QStyle::PM_SmallIconSize), + (opt.state & QStyle::State_Enabled) ? QIcon::Normal : QIcon::Disabled); + QRect aligned = this->style()->alignedRect(opt.direction, QFlag(opt.iconAlignment), + pixmap.size(), headerLabelRect); + QRect inter = aligned.intersected(headerLabelRect); + + QStyleOption option; + option.rect = QRect(inter.x()-2,inter.y(),inter.width(),inter.height()); + if (m_expanded) + option.state = QStyle::State_Children | QStyle::State_Open; + else + option.state = QStyle::State_Children; + if (m_inDecoration) + option.state |= QStyle::State_MouseOver; + QApplication::style()->drawPrimitive(QStyle::PE_IndicatorBranch, &option, painter); + } + } + + void ExpandableHeaderView::mousePressEvent(QMouseEvent *e) + { + int section = logicalIndexAt(e->x()); + + if (section == 0 && m_inDecoration) { + if (m_expanded) + m_expanded = false; + else + m_expanded = true; + this->QHeaderView::mousePressEvent(e); + Q_EMIT headerClicked(section); + } + } + + void ExpandableHeaderView::mouseMoveEvent(QMouseEvent *e) + { + int section = this->logicalIndexAt(e->x()); + + if (section != 0) + return; + + bool tmp = m_inDecoration; + if (isPointInDecoration(section, e->pos())) + m_inDecoration = true; + else + m_inDecoration = false; + + if (m_inDecoration != tmp) + updateSection(0); + } + + bool ExpandableHeaderView::isPointInDecoration(int section, QPoint pos)const + { + QRect sectionRect = this->orientation() == Qt::Horizontal ? + QRect(this->sectionPosition(section), 0, + this->sectionSize(section), this->height()): + QRect(0, this->sectionPosition(section), + this->width(), this->sectionSize(section)); + QStyleOptionHeader opt; + this->initStyleOption(&opt); + opt.iconAlignment = Qt::AlignVCenter; + QVariant variant = this->model()->headerData(section, this->orientation(), + Qt::DecorationRole); + opt.icon = qvariant_cast(variant); + if (opt.icon.isNull()) + { + opt.icon = qvariant_cast(variant); + } + QRect headerLabelRect = this->style()->subElementRect(QStyle::SE_HeaderLabel, &opt, this); + // from qcommonstyle.cpp + if (opt.icon.isNull()) + { + return false; + } + QPixmap pixmap + = opt.icon.pixmap(this->style()->pixelMetric(QStyle::PM_SmallIconSize), + (opt.state & QStyle::State_Enabled) ? QIcon::Normal : QIcon::Disabled); + QRect aligned = this->style()->alignedRect(opt.direction, QFlag(opt.iconAlignment), + pixmap.size(), headerLabelRect); + QRect inter = aligned.intersected(headerLabelRect); + return inter.contains(pos); + } +} diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/expandable_headerview.h b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/expandable_headerview.h new file mode 100644 index 000000000..596bf5ba1 --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/expandable_headerview.h @@ -0,0 +1,49 @@ +// Object Viewer Qt - Georges Editor Plugin - MMORPG Framework +// Copyright (C) 2011 Adrian Jaekel +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program 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 Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +#ifndef EXPANDABLE_HEADERVIEW_H +#define EXPANDABLE_HEADERVIEW_H + +// Qt includes +#include + +namespace Plugin +{ + class ExpandableHeaderView : public QHeaderView + { + Q_OBJECT + public: + ExpandableHeaderView(Qt::Orientation orientation, QWidget * parent = 0); + + bool* expanded() { return &m_expanded; } + + protected: + void paintSection(QPainter *painter, const QRect &rect, int logicalIndex) const; + bool isPointInDecoration(int section, QPoint pos)const; + void mousePressEvent(QMouseEvent *event); + void mouseMoveEvent(QMouseEvent *event); + + private: + bool m_expanded; + bool m_inDecoration; + +Q_SIGNALS: + void headerClicked(int); + }; + +} /* namespace NLQT */ + +#endif // EXPANDABLE_HEADERVIEW_H diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/formdelegate.cpp b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/formdelegate.cpp new file mode 100644 index 000000000..4d04bc6b5 --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/formdelegate.cpp @@ -0,0 +1,278 @@ +// Object Viewer Qt - Georges Editor Plugin - MMORPG Framework +// Copyright (C) 2011 Adrian Jaekel +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program 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 Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +#include "formdelegate.h" + +// NeL includes +#include +#include +#include + +// Qt includes +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// Project includes +#include "georgesform_model.h" +#include "georgesform_proxy_model.h" +#include "formitem.h" + +namespace Plugin +{ + + FormDelegate::FormDelegate(QObject *parent) + : QStyledItemDelegate(parent) + { + } + + QWidget *FormDelegate::createEditor(QWidget *parent, + const QStyleOptionViewItem & option , + const QModelIndex &index) const + { + const CGeorgesFormProxyModel * mp = dynamic_cast(index.model()); + const CGeorgesFormModel * m = dynamic_cast(mp->sourceModel()); + CFormItem *item = static_cast(mp->mapToSource(index).internalPointer()); + QString value = item->data(1).toString(); + + if (value.isEmpty() || !mp || !m) + return 0; + + CFormItem* curItem = m->getItem(mp->mapToSource(index)); + NLGEORGES::UFormElm *curElm = curItem->getFormElm(); + if (!curElm) { + // TODO: create new Element + return 0; + } + const NLGEORGES::UType *type = curElm->getType(); + if(type) + { + int numDefinitions = type->getNumDefinition(); + + if (numDefinitions) + { + std::string l, v; + QString label,value; + + QComboBox *editor = new QComboBox(parent); + for (int i = 0; i < numDefinitions; i++) + { + type->getDefinition(i,l,v); + label = l.c_str(); + value = v.c_str(); + editor->addItem(label); + } + return editor; + } + else + { + switch (type->getType()) + { + case NLGEORGES::UType::UnsignedInt: + case NLGEORGES::UType::SignedInt: + { + QSpinBox *editor = new QSpinBox(parent); + + //QString min = QString(type->getMin().c_str()); + //QString max = QString(type->getMax().c_str()); + //QString inc = QString(type->getIncrement().c_str()); + //nldebug(QString("min %1 max %2 inc %3").arg(min).arg(max).arg(inc).toStdString().c_str()); + + // TODO: use saved min/max values + editor->setMinimum(-99999); + editor->setMaximum(99999); + editor->setSingleStep(1); + return editor; + } + case NLGEORGES::UType::Double: + { + QDoubleSpinBox *editor = new QDoubleSpinBox(parent); + + //QString min = QString(type->getMin().c_str()); + //QString max = QString(type->getMax().c_str()); + //QString inc = QString(type->getIncrement().c_str()); + //nldebug(QString("min %1 max %2 inc %3").arg(min).arg(max).arg(inc).toStdString().c_str()); + + // TODO: use saved min/max values + editor->setMinimum(-99999); + editor->setMaximum(99999); + editor->setSingleStep(0.1); + editor->setDecimals(1); + return editor; + } + case NLGEORGES::UType::Color: + { + return new QColorDialog(); + } + default: // UType::String + { + QLineEdit *editor = new QLineEdit(parent); + return editor; + } + } + } + } + return 0; + } + + void FormDelegate::setEditorData(QWidget *editor, + const QModelIndex &index) const + { + const CGeorgesFormProxyModel * mp = dynamic_cast(index.model()); + const CGeorgesFormModel * m = dynamic_cast(mp->sourceModel()); + + const NLGEORGES::UType *type = m->getItem(mp->mapToSource(index))->getFormElm()->getType(); + int numDefinitions = type->getNumDefinition(); + QString value = index.model()->data(index, Qt::DisplayRole).toString(); + + if (numDefinitions) + { + QComboBox *cb = static_cast(editor); + cb->setCurrentIndex(cb->findText(value)); + } + else + { + switch (type->getType()) + { + case NLGEORGES::UType::UnsignedInt: + case NLGEORGES::UType::SignedInt: + { + QSpinBox *spinBox = static_cast(editor); + spinBox->setValue((int)value.toDouble()); + break; + } + case NLGEORGES::UType::Double: + { + QDoubleSpinBox *spinBox = static_cast(editor); + spinBox->setValue(value.toDouble()); + break; + } + case NLGEORGES::UType::Color: + { + break; + } + default: + { + QLineEdit *textEdit = static_cast(editor); + textEdit->setText(value); + break; + } + } + } + } + + void FormDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, + const QModelIndex &index) const + { + const CGeorgesFormProxyModel * mp = dynamic_cast(index.model()); + const CGeorgesFormModel * m = dynamic_cast(mp->sourceModel()); + + const NLGEORGES::UType *type = m->getItem(mp->mapToSource(index))->getFormElm()->getType(); + int numDefinitions = type->getNumDefinition(); + + if (numDefinitions) + { + QComboBox *comboBox = static_cast(editor); + QString value = comboBox->currentText(); + QString oldValue = index.model()->data(index, Qt::DisplayRole).toString(); + if (value == oldValue) + { + // nothing's changed + } + else + { + nldebug(QString("setModelData from %1 to %2") + .arg(oldValue).arg(value).toStdString().c_str()); + model->setData(index, value, Qt::EditRole); + } + } + else + { + switch (type->getType()) + { + case NLGEORGES::UType::UnsignedInt: + case NLGEORGES::UType::SignedInt: + { + QSpinBox *spinBox = static_cast(editor); + int value = spinBox->value(); + QString oldValue = index.model()->data(index, Qt::DisplayRole).toString(); + if (QString("%1").arg(value) == oldValue) + { + // nothing's changed + } + else + { + nldebug(QString("setModelData from %1 to %2") + .arg(oldValue).arg(value).toStdString().c_str()); + model->setData(index, value, Qt::EditRole); + } + break; + } + case NLGEORGES::UType::Double: + { + QDoubleSpinBox *spinBox = static_cast(editor); + double value = spinBox->value(); + QString oldValue = index.model()->data(index, Qt::DisplayRole).toString(); + if (QString("%1").arg(value) == oldValue) + { + // nothing's changed + } + else + { + nldebug(QString("setModelData from %1 to %2") + .arg(oldValue).arg(value).toStdString().c_str()); + model->setData(index, value, Qt::EditRole); + } + break; + } + case NLGEORGES::UType::Color: + { + break; // TODO + } + default: // UType::String + { + QLineEdit *textEdit = static_cast(editor); + QString value = textEdit->text(); + QString oldValue = index.model()->data(index, Qt::DisplayRole).toString(); + if (value == oldValue) + { + // nothing's changed + } + else + { + nldebug(QString("setModelData from %1 to %2") + .arg(oldValue).arg(value).toStdString().c_str()); + model->setData(index, value, Qt::EditRole); + } + break; + } + } + } + } + + void FormDelegate::updateEditorGeometry(QWidget *editor, + const QStyleOptionViewItem &option, const QModelIndex &index) const + { + QRect r = option.rect; + editor->setGeometry(r); + } +} /* namespace Plugin */ diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/formdelegate.h b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/formdelegate.h new file mode 100644 index 000000000..a309da1fc --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/formdelegate.h @@ -0,0 +1,41 @@ +// Object Viewer Qt - Georges Editor Plugin - MMORPG Framework +// Copyright (C) 2011 Adrian Jaekel +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program 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 Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +#ifndef FORMDELEGATE_H +#define FORMDELEGATE_H + +#include + +namespace Plugin +{ + + class FormDelegate : public QStyledItemDelegate + { + + public: + FormDelegate(QObject *parent = 0); + + QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, + const QModelIndex &index) const; + void setEditorData(QWidget *editor, const QModelIndex &index) const; + void setModelData(QWidget *editor, QAbstractItemModel *model, + const QModelIndex &index) const; + void updateEditorGeometry(QWidget *editor, + const QStyleOptionViewItem &option, const QModelIndex &index) const; + }; + +} +#endif // FORMDELEGATE_H diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georges_editor_plugin.cpp b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georges_editor_plugin.cpp index 9ea9ae5ff..425db7841 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georges_editor_plugin.cpp +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georges_editor_plugin.cpp @@ -74,7 +74,7 @@ QString GeorgesEditorPlugin::name() const QString GeorgesEditorPlugin::version() const { - return "0.3"; + return "0.4"; } QString GeorgesEditorPlugin::vendor() const diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georges_treeview_dialog.cpp b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georges_treeview_dialog.cpp index 09556a21a..bc5dd7487 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georges_treeview_dialog.cpp +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georges_treeview_dialog.cpp @@ -32,7 +32,8 @@ #include "georgesform_model.h" #include "georgesform_proxy_model.h" #include "formitem.h" -//#include "formdelegate.h" +#include "formdelegate.h" +#include "expandable_headerview.h" using namespace NLMISC; using namespace NLGEORGES; @@ -41,7 +42,8 @@ namespace Plugin { CGeorgesTreeViewDialog::CGeorgesTreeViewDialog(QWidget *parent /*= 0*/) - : QDockWidget(parent) + : QDockWidget(parent), + m_header(0) { m_georges = new CGeorges; @@ -49,16 +51,18 @@ namespace Plugin m_modified = false; m_ui.setupUi(this); + m_header = new ExpandableHeaderView(Qt::Horizontal, m_ui.treeView); + m_ui.treeView->setHeader(m_header); m_ui.treeView->header()->setResizeMode(QHeaderView::ResizeToContents); + m_ui.treeView->header()->setStretchLastSection(true); m_ui.treeViewTabWidget->setTabEnabled (2,false); m_ui.checkBoxParent->setStyleSheet("background-color: rgba(0,255,0,30)"); m_ui.checkBoxDefaults->setStyleSheet("background-color: rgba(255,0,0,30)"); m_form = 0; - //FormDelegate *formdelegate = new FormDelegate(this); - //_ui.treeView->setItemDelegateForColumn(1, formdelegate); - + FormDelegate *formdelegate = new FormDelegate(this); + m_ui.treeView->setItemDelegateForColumn(1, formdelegate); connect(m_ui.treeView, SIGNAL(doubleClicked (QModelIndex)), this, SLOT(doubleClicked (QModelIndex))); @@ -66,14 +70,22 @@ namespace Plugin this, SLOT(filterRows())); connect(m_ui.checkBoxDefaults, SIGNAL(toggled(bool)), this, SLOT(filterRows())); + connect(m_header, SIGNAL(headerClicked(int)), + this, SLOT(headerClicked(int))); } CGeorgesTreeViewDialog::~CGeorgesTreeViewDialog() { - //delete _ui.treeView->itemDelegateForColumn(1); delete m_form; - //QSettings settings("RyzomCore", "GeorgesQt"); - //settings.setValue("dirViewGeometry", saveGeometry()); + } + + void CGeorgesTreeViewDialog::headerClicked(int section) + { + if (section == 0) + if (*(m_header->expanded())) + m_ui.treeView->expandAll(); + else + m_ui.treeView->collapseAll(); } void CGeorgesTreeViewDialog::setForm(const CForm *form) @@ -170,7 +182,7 @@ namespace Plugin { loadedForm = m_form->getFilename().c_str(); - CGeorgesFormModel *model = new CGeorgesFormModel(root,deps,comments,parents); + CGeorgesFormModel *model = new CGeorgesFormModel(root,deps,comments,parents,m_header->expanded()); CGeorgesFormProxyModel *proxyModel = new CGeorgesFormProxyModel(); proxyModel->setSourceModel(model); m_ui.treeView->setModel(proxyModel); diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georges_treeview_dialog.h b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georges_treeview_dialog.h index 9d4f02e5d..e4c5dcdf4 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georges_treeview_dialog.h +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georges_treeview_dialog.h @@ -18,6 +18,7 @@ #define GEORGES_TREEVIEWER_DIALOG_H #include "ui_georges_treeview_form.h" +#include "expandable_headerview.h" // Qt includes #include @@ -77,9 +78,11 @@ namespace Plugin private Q_SLOTS: void doubleClicked ( const QModelIndex & index ); void filterRows(); + void headerClicked(int); private: Ui::CGeorgesTreeViewDialog m_ui; + ExpandableHeaderView *m_header; UForm *m_form; CGeorges *m_georges; diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georgesform_model.cpp b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georgesform_model.cpp index 0ec8f785a..3ae798dea 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georgesform_model.cpp +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georgesform_model.cpp @@ -30,10 +30,13 @@ #include #include #include +#include +#include +#include +#include // project includes #include "formitem.h" -//#include "modules.h" using namespace NLGEORGES; @@ -41,7 +44,7 @@ namespace Plugin { CGeorgesFormModel::CGeorgesFormModel(UFormElm *rootElm, QMap< QString, QStringList> deps, - QString comment, QStringList parents, QObject *parent) : QAbstractItemModel(parent) + QString comment, QStringList parents, bool *expanded, QObject *parent) : QAbstractItemModel(parent) { QList rootData; rootData << "Value" << "Data" << "Extra";// << "Type"; @@ -51,6 +54,7 @@ namespace Plugin m_comments = comment; m_parents = parents; m_parentRows = new QList; + m_expanded = expanded; setupModelData(); } @@ -231,23 +235,23 @@ namespace Plugin /******************************************************************************/ - //bool CGeorgesFormModel::setData(const QModelIndex &index, const QVariant &value, - // int role) - //{ + bool CGeorgesFormModel::setData(const QModelIndex &index, const QVariant &value, + int role) + { - // if (role != Qt::EditRole) - // return false; + if (role != Qt::EditRole) + return false; - // CFormItem *item = getItem(index); - // bool result = item->setData(index.column(), value); + CFormItem *item = getItem(index); + bool result = item->setData(index.column(), value); // // TODO: ugly hack for updating icon too // if (result) // Q_EMIT dataChanged(index, this->index(index.row(),index.column()+1,index.parent())); - // setupModelData(); - // return result; - //} + //setupModelData(); + return result; + } /******************************************************************************/ @@ -258,11 +262,8 @@ namespace Plugin Qt::ItemFlags returnValue = Qt::ItemIsSelectable | Qt::ItemIsEnabled; - //if(index.column() == 1) - // returnValue |= Qt::ItemIsEditable; - // TODO? - // col 2 should go here too but i dont want to do another delegate - // so for now i just connected the dblClick in the dialog + if(index.column() == 1) + returnValue |= Qt::ItemIsEditable; return returnValue; @@ -273,11 +274,42 @@ namespace Plugin QVariant CGeorgesFormModel::headerData(int section, Qt::Orientation orientation, int role) const { - if (orientation == Qt::Horizontal && role == Qt::DisplayRole) - return m_rootItem->data(section); + if (orientation == Qt::Horizontal) + { + if (role == Qt::DisplayRole) + return m_rootItem->data(section); + if (role == Qt::TextAlignmentRole) + return Qt::AlignLeft; + if (section == 0 && role == Qt::DecorationRole) + { + // transparent pixmap as we paint it ourself with tree brach + // if we extend the HeaderView::paintSection for the CE_HeaderLabel + // we could drop this + QPixmap pixmap = QPixmap( + QApplication::style()->pixelMetric(QStyle::PM_SmallIconSize), + QApplication::style()->pixelMetric(QStyle::PM_SmallIconSize)); + // Create new picture for transparent + QPixmap transparent(pixmap.size()); + // Do transparency + transparent.fill(Qt::transparent); + QPainter p(&transparent); + p.setCompositionMode(QPainter::CompositionMode_Source); + p.drawPixmap(0, 0, pixmap); + p.setCompositionMode(QPainter::CompositionMode_DestinationIn); + // Set transparency level to 150 (possible values are 0-255) + // The alpha channel of a color specifies the transparency effect, + // 0 represents a fully transparent color, while 255 represents + // a fully opaque color. + p.fillRect(transparent.rect(), QColor(0, 0, 0, 0)); + p.end(); + + // Set original picture's reference to new transparent one + pixmap = transparent; + return pixmap; + } + } return QVariant(); - } /******************************************************************************/ diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georgesform_model.h b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georgesform_model.h index 7668f9e7f..0d8ce6e69 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georgesform_model.h +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georgesform_model.h @@ -39,11 +39,11 @@ namespace Plugin public: CGeorgesFormModel(NLGEORGES::UFormElm *root, QMap< QString, QStringList> deps, - QString comment, QStringList parents, QObject *parent = 0); + QString comment, QStringList parents, bool* expanded, QObject *parent = 0); ~CGeorgesFormModel(); QVariant data(const QModelIndex &index, int role) const; - //bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole); + bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole); Qt::ItemFlags flags(const QModelIndex &index) const; QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const; QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const; @@ -71,6 +71,7 @@ namespace Plugin bool m_showParents; bool m_showDefaults; + bool *m_expanded; };/* class CGeorgesFormModel */ diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georgesform_proxy_model.cpp b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georgesform_proxy_model.cpp index 0950e1b04..ae3720a57 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georgesform_proxy_model.cpp +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georgesform_proxy_model.cpp @@ -14,17 +14,14 @@ // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . -#include "georgesform_proxy_model.h" -#include "georgesform_model.h" - // NeL includes #include #include // project includes #include "formitem.h" - -#include +#include "georgesform_proxy_model.h" +#include "georgesform_model.h" namespace Plugin { @@ -32,20 +29,11 @@ namespace Plugin bool CGeorgesFormProxyModel::filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const { - //nlinfo("CGeorgesFormProxyModel::filterAcceptsRow"); - // column doesnt matter for item CGeorgesFormModel *smodel = dynamic_cast(sourceModel()); QModelIndex index = sourceModel()->index(sourceRow, 0, sourceParent); CFormItem *item = smodel->getItem(index); - //qDebug() << smodel->showParents() << (item->valueFrom() == NLGEORGES::UFormElm::NodeParentForm); - //nlinfo("%s %d %d %d %d", item->data(index.column()).toString().toStdString().c_str(), - // item->valueFrom(), - // item->nodeFrom(), - // smodel->showParents(), - // (item->valueFrom() == NLGEORGES::UFormElm::NodeParentForm)); - // if elm not existing it must be some kind of default or type value if(!item->getFormElm()) { @@ -86,7 +74,6 @@ namespace Plugin bool CGeorgesFormProxyModel::filterAcceptsColumn(int sourceRow, const QModelIndex &sourceParent) const { - //nlinfo("CGeorgesFormProxyModel::filterAcceptsColumn"); return QSortFilterProxyModel::filterAcceptsColumn(sourceRow, sourceParent); } } /* namespace Plugin */