@ -1,7 +0,0 @@
|
||||
#ifndef OVQT_CONFIG_H
|
||||
#define OVQT_CONFIG_H
|
||||
|
||||
#define DATA_DIR "${NL_SHARE_ABSOLUTE_PREFIX}/object_viewer_qt"
|
||||
#define PLUGINS_DIR "${NL_LIB_ABSOLUTE_PREFIX}/object_viewer_qt"
|
||||
|
||||
#endif
|
@ -1,53 +0,0 @@
|
||||
ADD_SUBDIRECTORY(3rdparty)
|
||||
|
||||
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR} ${LIBXML2_INCLUDE_DIR} ${NEL_INCLUDE_DIR} ${QT_INCLUDES})
|
||||
INCLUDE( ${QT_USE_FILE} )
|
||||
|
||||
CONFIGURE_FILE(translations/translations.qrc ${CMAKE_CURRENT_BINARY_DIR}/translations.qrc COPYONLY)
|
||||
|
||||
FILE(GLOB OBJECT_VIEWER_SRC extension_system/*.h
|
||||
extension_system/*.cpp
|
||||
*.h *.cpp)
|
||||
|
||||
SET(OBJECT_VIEWER_HDR extension_system/iplugin_manager.h
|
||||
extension_system/plugin_manager.h)
|
||||
|
||||
SET(OBJECT_VIEWER_RCS object_viewer_qt.qrc ${CMAKE_CURRENT_BINARY_DIR}/translations.qrc)
|
||||
|
||||
SET(OBJECT_VIEWER_TS translations/object_viewer_qt_en.ts
|
||||
translations/object_viewer_qt_fr.ts
|
||||
translations/object_viewer_qt_de.ts
|
||||
translations/object_viewer_qt_ru.ts)
|
||||
|
||||
SET(QT_USE_QTGUI TRUE)
|
||||
SET(QT_USE_QTOPENGL TRUE)
|
||||
|
||||
IF(WIN32)
|
||||
SET(OBJECT_VIEWER_RC object_viewer_qt.rc)
|
||||
ENDIF(WIN32)
|
||||
|
||||
QT4_ADD_TRANSLATION(OBJECT_VIEWER_QM ${OBJECT_VIEWER_TS})
|
||||
QT4_ADD_RESOURCES( OBJECT_VIEWER_RC_SRCS ${OBJECT_VIEWER_RCS})
|
||||
QT4_WRAP_CPP( OBJECT_VIEWER_MOC_SRCS ${OBJECT_VIEWER_HDR} )
|
||||
|
||||
SOURCE_GROUP(QtResources FILES ${OBJECT_VIEWER_RCS})
|
||||
SOURCE_GROUP(QtGeneratedMocQrcSrc FILES ${OBJECT_VIEWER_MOC_SRCS} ${OBJECT_VIEWER_RC_SRCS})
|
||||
|
||||
ADD_EXECUTABLE(object_viewer_qt WIN32 MACOSX_BUNDLE
|
||||
${OBJECT_VIEWER_SRC}
|
||||
${OBJECT_VIEWER_MOC_SRCS}
|
||||
${OBJECT_VIEWER_RC_SRCS}
|
||||
${OBJECT_VIEWER_RC})
|
||||
|
||||
TARGET_LINK_LIBRARIES(object_viewer_qt
|
||||
nelmisc
|
||||
${QT_LIBRARIES}
|
||||
${QT_QTMAIN_LIBRARY})
|
||||
|
||||
ADD_DEFINITIONS(-DQT_NO_KEYWORDS ${LIBXML2_DEFINITIONS} ${QT_DEFINITIONS})
|
||||
NL_DEFAULT_PROPS(object_viewer_qt "NeL, Tools, 3D: Object Viewer Qt")
|
||||
NL_ADD_RUNTIME_FLAGS(object_viewer_qt)
|
||||
|
||||
ADD_SUBDIRECTORY(plugins)
|
||||
|
||||
INSTALL(TARGETS object_viewer_qt RUNTIME DESTINATION ${NL_BIN_PREFIX} COMPONENT runtime BUNDLE DESTINATION /Applications)
|
Before Width: | Height: | Size: 135 KiB |
@ -1,163 +0,0 @@
|
||||
// Object Viewer Qt - Georges Editor Plugin - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
|
||||
// Copyright (C) 2011 Adrian Jaekel <aj at elane2k dot com>
|
||||
//
|
||||
// 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 <http://www.gnu.org/licenses/>.
|
||||
|
||||
#include "stdpch.h"
|
||||
#include "formitem.h"
|
||||
|
||||
// Qt includes
|
||||
|
||||
// NeL includes
|
||||
#include <nel/misc/o_xml.h>
|
||||
#include <nel/georges/u_type.h>
|
||||
#include <nel/georges/form.h>
|
||||
|
||||
namespace GeorgesQt
|
||||
{
|
||||
|
||||
CFormItem::CFormItem(NLGEORGES::UFormElm* elm, const QList<QVariant> &data, CFormItem *parent,
|
||||
NLGEORGES::UFormElm::TWhereIsValue wV, NLGEORGES::UFormElm::TWhereIsNode wN)
|
||||
{
|
||||
parentItem = parent;
|
||||
itemData = data;
|
||||
formElm = elm;
|
||||
whereV = wV;
|
||||
whereN = wN;
|
||||
}
|
||||
|
||||
CFormItem::~CFormItem()
|
||||
{
|
||||
qDeleteAll(childItems);
|
||||
}
|
||||
|
||||
void CFormItem::appendChild(CFormItem *item)
|
||||
{
|
||||
childItems.append(item);
|
||||
}
|
||||
|
||||
CFormItem *CFormItem::child(int row)
|
||||
{
|
||||
return childItems.value(row);
|
||||
}
|
||||
|
||||
int CFormItem::childCount() const
|
||||
{
|
||||
return childItems.count();
|
||||
}
|
||||
|
||||
int CFormItem::columnCount() const
|
||||
{
|
||||
//nlinfo("columnCount %d",itemData.count());
|
||||
return itemData.count();
|
||||
}
|
||||
|
||||
QVariant CFormItem::data(int column) const
|
||||
{
|
||||
return itemData.value(column);
|
||||
}
|
||||
|
||||
CFormItem *CFormItem::parent()
|
||||
{
|
||||
return parentItem;
|
||||
}
|
||||
|
||||
int CFormItem::row() const
|
||||
{
|
||||
if (parentItem)
|
||||
return parentItem->childItems.indexOf(const_cast<CFormItem*>(this));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
bool CFormItem::setData(int column, const QVariant &value)
|
||||
{
|
||||
if (column < 0 || column >= itemData.size())
|
||||
return false;
|
||||
|
||||
// TODO: default values
|
||||
if (!formElm)
|
||||
return false;
|
||||
|
||||
itemData[column] = value;
|
||||
if (formElm->isAtom())
|
||||
{
|
||||
const NLGEORGES::UType *type = formElm->getType();
|
||||
if (type)
|
||||
{
|
||||
switch (type->getType())
|
||||
{
|
||||
case NLGEORGES::UType::UnsignedInt:
|
||||
case NLGEORGES::UType::SignedInt:
|
||||
case NLGEORGES::UType::Double:
|
||||
case NLGEORGES::UType::String:
|
||||
if (parentItem->formElm->isArray())
|
||||
{
|
||||
//((NLGEORGES::CFormElm*)parentItem->formElm);//->arrayInsertNodeByName(
|
||||
//if(parentItem->formElm->getArrayNode(elmName, num))
|
||||
//{
|
||||
//}
|
||||
|
||||
bool ok;
|
||||
// TODO: the node can be renamed from eg "#0" to "foobar"
|
||||
int arrayIndex = itemData[0].toString().remove("#").toInt(&ok);
|
||||
if(ok)
|
||||
{
|
||||
NLGEORGES::UFormElm *elmt = 0;
|
||||
if(parentItem->formElm->getArrayNode(&elmt, arrayIndex) && elmt)
|
||||
{
|
||||
if (elmt->isAtom())
|
||||
{
|
||||
((NLGEORGES::CFormElmAtom*)elmt)->setValue(value.toString().toUtf8().constData());
|
||||
nldebug(QString("array element string %1 %2")
|
||||
.arg(itemData[0].toString()).arg(value.toString())
|
||||
.toUtf8().constData());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if(parentItem->formElm->setValueByName(
|
||||
value.toString().toUtf8().constData(),
|
||||
itemData[0].toString().toUtf8().constData()))
|
||||
{
|
||||
nldebug(QString("string %1 %2")
|
||||
.arg(itemData[0].toString()).arg(value.toString())
|
||||
.toUtf8().constData());
|
||||
}
|
||||
else
|
||||
{
|
||||
nldebug(QString("FAILED string %1 %2")
|
||||
.arg(itemData[0].toString()).arg(value.toString())
|
||||
.toUtf8().constData());
|
||||
}
|
||||
}
|
||||
break;
|
||||
case NLGEORGES::UType::Color:
|
||||
nldebug("Color is TODO");
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
nldebug("setting sth other than Atom");
|
||||
}
|
||||
//formElm->setValueByName();
|
||||
return true;
|
||||
}
|
||||
}
|
@ -1,5 +0,0 @@
|
||||
<RCC>
|
||||
<qresource>
|
||||
<file>images/ic_nel_georges_editor.png</file>
|
||||
</qresource>
|
||||
</RCC>
|
@ -1,704 +0,0 @@
|
||||
// Object Viewer Qt - Georges Editor Plugin - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
|
||||
// Copyright (C) 2011 Adrian Jaekel <aj at elane2k dot com>
|
||||
//
|
||||
// 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 <http://www.gnu.org/licenses/>.
|
||||
|
||||
#include "stdpch.h"
|
||||
#include "georgesform_model.h"
|
||||
#include "formitem.h"
|
||||
|
||||
// NeL includes
|
||||
#include <nel/misc/types_nl.h>
|
||||
#include <nel/misc/rgba.h>
|
||||
#include <nel/misc/path.h>
|
||||
#include <nel/georges/u_form_elm.h>
|
||||
#include <nel/georges/u_type.h>
|
||||
#include <nel/georges/u_form_dfn.h>
|
||||
|
||||
// Qt includes
|
||||
#include <QColor>
|
||||
#include <QBrush>
|
||||
#include <QApplication>
|
||||
#include <QStyle>
|
||||
#include <QDebug>
|
||||
#include <QStylePainter>
|
||||
#include <QStyleOption>
|
||||
#include <QLabel>
|
||||
#include <QPixmap>
|
||||
|
||||
using namespace NLGEORGES;
|
||||
|
||||
namespace GeorgesQt
|
||||
{
|
||||
|
||||
CGeorgesFormModel::CGeorgesFormModel(UFormElm *rootElm, QMap< QString, QStringList> deps,
|
||||
QString comment, QStringList parents, bool *expanded, QObject *parent) : QAbstractItemModel(parent)
|
||||
{
|
||||
|
||||
m_rootData << "Value" << "Data" << "Extra";// << "Type";
|
||||
m_rootElm = rootElm;
|
||||
m_rootItem = new CFormItem(m_rootElm, m_rootData);
|
||||
m_dependencies = deps;
|
||||
m_comments = comment;
|
||||
m_parents = parents;
|
||||
m_parentRows = new QList<const QModelIndex*>;
|
||||
m_expanded = expanded;
|
||||
|
||||
setupModelData();
|
||||
}
|
||||
|
||||
CGeorgesFormModel::~CGeorgesFormModel()
|
||||
{
|
||||
delete m_rootItem;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
|
||||
QVariant CGeorgesFormModel::data(const QModelIndex &p_index, int p_role) const
|
||||
{
|
||||
if (!p_index.isValid())
|
||||
return QVariant();
|
||||
|
||||
switch (p_role)
|
||||
{
|
||||
case Qt::DisplayRole:
|
||||
{
|
||||
return getItem(p_index)->data(p_index.column());
|
||||
}
|
||||
case Qt::BackgroundRole:
|
||||
{
|
||||
QBrush defaultBrush = QBrush(QColor(255,0,0,30));
|
||||
QBrush parentBrush = QBrush(QColor(0,255,0,30));
|
||||
|
||||
// if elm not existing it must be some kind of default or type value
|
||||
if(!getItem(p_index)->getFormElm())
|
||||
{
|
||||
return defaultBrush;
|
||||
}
|
||||
|
||||
// else it might be some parent elm
|
||||
switch (getItem(p_index)->nodeFrom())
|
||||
{
|
||||
case NLGEORGES::UFormElm::NodeParentForm:
|
||||
{
|
||||
return parentBrush;
|
||||
}
|
||||
case NLGEORGES::UFormElm::NodeForm:
|
||||
{
|
||||
switch (getItem(p_index)->valueFrom())
|
||||
{
|
||||
case NLGEORGES::UFormElm::ValueParentForm:
|
||||
{
|
||||
return parentBrush;
|
||||
}
|
||||
default:
|
||||
{
|
||||
// parent status test kindof ugly, testing only 2 steps deep
|
||||
// only needed for colorization as treeview default hides childs
|
||||
// when parent is hidden
|
||||
CFormItem *parent = getItem(p_index)->parent();
|
||||
if (parent)
|
||||
{
|
||||
if (parent->nodeFrom() == NLGEORGES::UFormElm::NodeParentForm)
|
||||
{
|
||||
return parentBrush;
|
||||
}
|
||||
|
||||
CFormItem *parentParent = parent->parent();
|
||||
if (parentParent)
|
||||
{
|
||||
if (parentParent->nodeFrom() == NLGEORGES::UFormElm::NodeParentForm)
|
||||
{
|
||||
return parentBrush;
|
||||
}
|
||||
} // endif parentParent
|
||||
} // endif parent
|
||||
} // end default
|
||||
} // end switch valueFrom
|
||||
} // end case nodeForm
|
||||
} // end switch nodeFrom
|
||||
return QVariant();
|
||||
}
|
||||
case Qt::DecorationRole:
|
||||
{
|
||||
if (p_index.column() == 2)
|
||||
{
|
||||
//p_index.
|
||||
QModelIndex in = index(p_index.row(),p_index.column()-1,p_index.parent());
|
||||
CFormItem *item = getItem(in);
|
||||
|
||||
QString value = item->data(1).toString();
|
||||
//QString path = NLMISC::CPath::lookup(value.toUtf8().constData(),false).c_str();
|
||||
|
||||
/*if (value.contains(".shape"))
|
||||
{
|
||||
if (Modules::objViewInt())
|
||||
{
|
||||
QIcon *icon = Modules::objViewInt()->saveOneImage(value.toUtf8().constData());
|
||||
if (icon)
|
||||
{
|
||||
if(icon->isNull())
|
||||
return QIcon(":/images/pqrticles.png");
|
||||
else
|
||||
return QIcon(*icon);
|
||||
}
|
||||
else
|
||||
{
|
||||
return QIcon();
|
||||
}
|
||||
}
|
||||
}*/
|
||||
if(value.contains(".tga") || value.contains(".png"))
|
||||
{
|
||||
QString path = NLMISC::CPath::lookup(value.toUtf8().constData(),false).c_str();
|
||||
if(path.isEmpty())
|
||||
{
|
||||
path = ":/images/pqrticles.png";
|
||||
}
|
||||
return QIcon(path);
|
||||
}
|
||||
}
|
||||
return QVariant();
|
||||
break;
|
||||
}
|
||||
case Qt::ToolTipRole:
|
||||
{
|
||||
if (p_index.column() == 2)
|
||||
{
|
||||
QModelIndex in = index(p_index.row(),p_index.column()-1,p_index.parent());
|
||||
CFormItem *item = getItem(in);
|
||||
QString value = item->data(1).toString();
|
||||
|
||||
/*if (value.contains(".shape"))
|
||||
{
|
||||
if (Modules::objViewInt())
|
||||
{
|
||||
QIcon *icon = Modules::objViewInt()->saveOneImage(value.toUtf8().constData());
|
||||
if (icon)
|
||||
{
|
||||
if(icon->isNull())
|
||||
return QIcon(":/images/pqrticles.png");
|
||||
else
|
||||
return QIcon(*icon);
|
||||
}
|
||||
else
|
||||
{
|
||||
return QIcon();
|
||||
}
|
||||
}
|
||||
}*/
|
||||
if(value.contains(".tga") || value.contains(".png"))
|
||||
{
|
||||
QString path = NLMISC::CPath::lookup(value.toUtf8().constData(),false).c_str();
|
||||
if(path.isEmpty())
|
||||
{
|
||||
path = ":/images/pqrticles.png";
|
||||
}
|
||||
|
||||
QString imageTooltip = QString("<img src='%1'>").arg(path);
|
||||
|
||||
return imageTooltip;
|
||||
}
|
||||
}
|
||||
return QVariant();
|
||||
break;
|
||||
}
|
||||
default:
|
||||
return QVariant();
|
||||
}
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
|
||||
CFormItem *CGeorgesFormModel::getItem(const QModelIndex &index) const
|
||||
{
|
||||
if (index.isValid())
|
||||
{
|
||||
CFormItem *item = static_cast<CFormItem*>(index.internalPointer());
|
||||
if (item)
|
||||
return item;
|
||||
}
|
||||
return m_rootItem;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
|
||||
bool CGeorgesFormModel::setData(const QModelIndex &index, const QVariant &value,
|
||||
int role)
|
||||
{
|
||||
|
||||
if (role != Qt::EditRole)
|
||||
return false;
|
||||
|
||||
CFormItem *item = getItem(index);
|
||||
bool result = item->setData(index.column(), value);
|
||||
|
||||
Q_EMIT dataChanged(index, index);
|
||||
|
||||
//setupModelData();
|
||||
return result;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
|
||||
Qt::ItemFlags CGeorgesFormModel::flags(const QModelIndex& index) const {
|
||||
|
||||
if (!index.isValid())
|
||||
return 0;
|
||||
|
||||
Qt::ItemFlags returnValue = Qt::ItemIsSelectable | Qt::ItemIsEnabled;
|
||||
|
||||
if(index.column() == 1)
|
||||
returnValue |= Qt::ItemIsEditable;
|
||||
|
||||
return returnValue;
|
||||
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
|
||||
QVariant CGeorgesFormModel::headerData(int section,
|
||||
Qt::Orientation orientation, int role) const
|
||||
{
|
||||
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();
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
|
||||
QModelIndex CGeorgesFormModel::index(int row, int column, const QModelIndex &parent)
|
||||
const
|
||||
{
|
||||
if (!hasIndex(row, column, parent))
|
||||
return QModelIndex();
|
||||
|
||||
CFormItem *parentItem;
|
||||
|
||||
if (!parent.isValid())
|
||||
parentItem = m_rootItem;
|
||||
else
|
||||
parentItem = static_cast<CFormItem*>(parent.internalPointer());
|
||||
|
||||
CFormItem *childItem = parentItem->child(row);
|
||||
if (childItem)
|
||||
return createIndex(row, column, childItem);
|
||||
else
|
||||
return QModelIndex();
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
|
||||
QModelIndex CGeorgesFormModel::parent(const QModelIndex &index) const
|
||||
{
|
||||
if (!index.isValid())
|
||||
return QModelIndex();
|
||||
|
||||
CFormItem *childItem = static_cast<CFormItem*>(index.internalPointer());
|
||||
CFormItem *parentItem = childItem->parent();
|
||||
|
||||
if (parentItem == m_rootItem)
|
||||
return QModelIndex();
|
||||
|
||||
return createIndex(parentItem->row(), 0, parentItem);
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
|
||||
int CGeorgesFormModel::rowCount(const QModelIndex &parent) const {
|
||||
|
||||
CFormItem *parentItem;
|
||||
if (parent.column() > 0)
|
||||
return 0;
|
||||
|
||||
if (!parent.isValid())
|
||||
parentItem = m_rootItem;
|
||||
else
|
||||
parentItem = static_cast<CFormItem*>(parent.internalPointer());
|
||||
|
||||
return parentItem->childCount();
|
||||
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
|
||||
int CGeorgesFormModel::columnCount(const QModelIndex &parent) const {
|
||||
|
||||
if (parent.isValid())
|
||||
return static_cast<CFormItem*>(parent.internalPointer())->columnCount();
|
||||
else
|
||||
return m_rootItem->columnCount();
|
||||
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
|
||||
void CGeorgesFormModel::loadFormData(UFormElm *root, CFormItem *parent) {
|
||||
|
||||
if (!root)
|
||||
return;
|
||||
|
||||
uint num = 0;
|
||||
|
||||
|
||||
if (root->isStruct())
|
||||
{
|
||||
//((CFormElm*)root)->getForm()->getComment();
|
||||
uint structSize = 0;
|
||||
root->getStructSize(structSize);
|
||||
while (num < structSize)
|
||||
{
|
||||
UFormElm::TWhereIsNode *whereN = new UFormElm::TWhereIsNode;
|
||||
UFormElm::TWhereIsValue *whereV = new UFormElm::TWhereIsValue;
|
||||
// Append a new item to the current parent's list of children.
|
||||
std::string elmName;
|
||||
if(root->getStructNodeName(num, elmName))
|
||||
{
|
||||
QList<QVariant> columnData;
|
||||
//QVariant value;
|
||||
std::string value;
|
||||
//NLMISC::CRGBA value_color;
|
||||
//uint value_uint;
|
||||
//sint value_sint;
|
||||
//double value_double;
|
||||
QString elmtType;
|
||||
UFormElm *elmt = 0;
|
||||
if(root->getNodeByName(&elmt, elmName.c_str(), whereN, true))
|
||||
{
|
||||
if (elmt)
|
||||
{
|
||||
if (elmt->isArray())
|
||||
elmtType = "Array";
|
||||
if (elmt->isStruct())
|
||||
elmtType = "Struct";
|
||||
if (elmt->isAtom())
|
||||
{
|
||||
elmtType = "Atom";
|
||||
uint numDefinitions = 0;
|
||||
const UType *type = elmt->getType();
|
||||
if (type)
|
||||
{
|
||||
numDefinitions = type->getNumDefinition();
|
||||
root->getValueByName(value, elmName.c_str(),UFormElm::Eval,whereV);
|
||||
switch (type->getType())
|
||||
{
|
||||
case UType::UnsignedInt:
|
||||
{
|
||||
uint v;
|
||||
NLMISC::fromString(value, v);
|
||||
value = NLMISC::toString(v);
|
||||
elmtType.append("_uint");break;
|
||||
}
|
||||
case UType::SignedInt:
|
||||
{
|
||||
sint v;
|
||||
NLMISC::fromString(value, v);
|
||||
value = NLMISC::toString(v);
|
||||
elmtType.append("_sint");break;
|
||||
}
|
||||
case UType::Double:
|
||||
float v;
|
||||
NLMISC::fromString(value, v);
|
||||
value = NLMISC::toString(v);
|
||||
elmtType.append("_double");break;
|
||||
case UType::String:
|
||||
elmtType.append("_string");break;
|
||||
case UType::Color:
|
||||
elmtType.append("_color");break;
|
||||
default:
|
||||
elmtType.append("_unknownType");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
elmtType.append("_noType");
|
||||
}
|
||||
|
||||
if (numDefinitions)
|
||||
{
|
||||
std::string l, v;
|
||||
QString tmpLabel, tmpValue;
|
||||
for (uint i = 0; i < numDefinitions; i++)
|
||||
{
|
||||
type->getDefinition(i,l,v);
|
||||
tmpLabel = l.c_str();
|
||||
tmpValue = v.c_str();
|
||||
if (type->getType() == UType::SignedInt)
|
||||
{
|
||||
if (QString("%1").arg(value.c_str()).toDouble() == tmpValue.toDouble()) {
|
||||
value = l;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (type->getType() == UType::String)
|
||||
{
|
||||
if (QString(value.c_str()) == tmpValue)
|
||||
{
|
||||
value = l;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (elmt->isVirtualStruct())
|
||||
{
|
||||
root->getValueByName(value, elmName.c_str(),UFormElm::Eval,whereV);
|
||||
elmtType = "VirtualStruct";
|
||||
}
|
||||
switch (*whereN)
|
||||
{
|
||||
case UFormElm::NodeForm:
|
||||
elmtType.append("_fromForm"); break;
|
||||
case UFormElm::NodeParentForm:
|
||||
elmtType.append("_fromParentForm"); break;
|
||||
case UFormElm::NodeDfn:
|
||||
elmtType.append("_isDFN"); break;
|
||||
case UFormElm::NodeType:
|
||||
elmtType.append("_isType"); break;
|
||||
default:
|
||||
elmtType.append("_noNode");
|
||||
}
|
||||
switch (*whereV)
|
||||
{
|
||||
case UFormElm::ValueForm:
|
||||
elmtType.append("_formValue"); break;
|
||||
case UFormElm::ValueParentForm:
|
||||
elmtType.append("_parentValue"); break;
|
||||
case UFormElm::ValueDefaultDfn:
|
||||
elmtType.append("_dfnValue"); break;
|
||||
case UFormElm::ValueDefaultType:
|
||||
elmtType.append("_typeValue"); break;
|
||||
default:
|
||||
elmtType.append("_noValue");
|
||||
}
|
||||
columnData << QString(elmName.c_str()) << QString(value.c_str()) << "";// << elmtType;
|
||||
parent->appendChild(new CFormItem(elmt, columnData, parent, *whereV, *whereN));
|
||||
//if (parents.last()->childCount() > 0) {
|
||||
// parents << parents.last()->child(parents.last()->childCount()-1);
|
||||
//}
|
||||
loadFormData(elmt, parent->child(parent->childCount()-1));
|
||||
}
|
||||
else
|
||||
{
|
||||
// add Defaults
|
||||
// TODO: spams warnings for non ATOM values but i dont get type of non existing nodes
|
||||
bool success = root->getValueByName(value, elmName.c_str(),UFormElm::Eval,whereV);
|
||||
switch (*whereN)
|
||||
{
|
||||
case UFormElm::NodeForm:
|
||||
elmtType.append("_fromForm"); break;
|
||||
case UFormElm::NodeParentForm:
|
||||
elmtType.append("_fromParentForm"); break;
|
||||
case UFormElm::NodeDfn:
|
||||
elmtType.append("_isDFN"); break;
|
||||
case UFormElm::NodeType:
|
||||
elmtType.append("_isType"); break;
|
||||
default:
|
||||
elmtType.append("_noNode");
|
||||
}
|
||||
switch (*whereV)
|
||||
{
|
||||
case UFormElm::ValueForm:
|
||||
elmtType.append("_formValue"); break;
|
||||
case UFormElm::ValueParentForm:
|
||||
elmtType.append("_parentValue"); break;
|
||||
case UFormElm::ValueDefaultDfn:
|
||||
elmtType.append("_dfnValue"); break;
|
||||
case UFormElm::ValueDefaultType:
|
||||
elmtType.append("_typeValue"); break;
|
||||
default:
|
||||
elmtType.append("_noValue");
|
||||
}
|
||||
|
||||
columnData << QString(elmName.c_str()) << QString(value.c_str()) << "";// << elmtType;
|
||||
parent->appendChild(new CFormItem(elmt, columnData, parent, *whereV, *whereN));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
nlinfo("getNodeByName returned false");
|
||||
}
|
||||
}
|
||||
num++;
|
||||
}
|
||||
}
|
||||
if (root->isArray())
|
||||
{
|
||||
uint arraySize = 0;
|
||||
root->getArraySize(arraySize);
|
||||
while (num < arraySize)
|
||||
{
|
||||
std::string elmName;
|
||||
if(root->getArrayNodeName(elmName, num))
|
||||
{
|
||||
QList<QVariant> columnData;
|
||||
std::string value;
|
||||
QString elmtType;
|
||||
|
||||
UFormElm *elmt = 0;
|
||||
if(root->getArrayNode(&elmt,0) && elmt)
|
||||
{
|
||||
if (elmt->isArray())
|
||||
elmtType = "Array";
|
||||
if (elmt->isStruct()) {
|
||||
elmtType = "Struct";
|
||||
}
|
||||
if (elmt->isAtom())
|
||||
{
|
||||
elmt->getValue(value);
|
||||
elmtType = "Atom";
|
||||
}
|
||||
if (elmt->isVirtualStruct())
|
||||
elmtType = "VirtualStruct";
|
||||
|
||||
elmtType.append("_arrayValue");
|
||||
columnData << QString(elmName.c_str()) << QString(value.c_str()) << "";// << elmtType;
|
||||
parent->appendChild(new CFormItem(elmt, columnData, parent));
|
||||
loadFormData(elmt, parent->child(parent->childCount()-1));
|
||||
}
|
||||
}
|
||||
num++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
|
||||
void CGeorgesFormModel::loadFormHeader()
|
||||
{
|
||||
|
||||
if (m_parents.size())
|
||||
{
|
||||
CFormItem *fi_pars = new CFormItem(m_rootElm, QList<QVariant>() << "parents" << "" << "", m_rootItem);
|
||||
m_rootItem->appendChild(fi_pars);
|
||||
|
||||
Q_FOREACH(QString str, m_parents)
|
||||
{
|
||||
fi_pars->appendChild(new CFormItem(m_rootElm, QList<QVariant>() << str << "" << "", fi_pars));
|
||||
}
|
||||
}
|
||||
|
||||
/*QStringList dfns = _dependencies["dfn"];
|
||||
QStringList typs = _dependencies["typ"];
|
||||
|
||||
_dependencies.remove("dfn");
|
||||
_dependencies.remove("typ");
|
||||
|
||||
CFormItem *fi_dep = new CFormItem(_rootElm, QList<QVariant>() << "dependencies", _rootItem);
|
||||
_rootItem->appendChild(fi_dep);
|
||||
|
||||
if (!dfns.isEmpty()) {
|
||||
CFormItem *fi_dfn = new CFormItem(_rootElm, QList<QVariant>() << "dfn", fi_dep);
|
||||
fi_dep->appendChild(fi_dfn);
|
||||
foreach(QString str, dfns) {
|
||||
fi_dfn->appendChild(new CFormItem(_rootElm, QList<QVariant>() << str, fi_dfn));
|
||||
}
|
||||
}
|
||||
if (!typs.isEmpty()) {
|
||||
CFormItem *fi_typ = new CFormItem(_rootElm, QList<QVariant>() << "typ", fi_dep);
|
||||
fi_dep->appendChild(fi_typ);
|
||||
foreach(QString str, typs) {
|
||||
fi_typ->appendChild(new CFormItem(_rootElm, QList<QVariant>() << str, fi_typ));
|
||||
}
|
||||
}
|
||||
if (!_dependencies.isEmpty()) {
|
||||
CFormItem *fi_other = new CFormItem(_rootElm, QList<QVariant>() << "other", fi_dep);
|
||||
fi_dep->appendChild(fi_other);
|
||||
foreach(QStringList list, _dependencies) {
|
||||
foreach(QString str, list) {
|
||||
fi_other->appendChild(new CFormItem(_rootElm, QList<QVariant>() << str, fi_other));
|
||||
}
|
||||
}
|
||||
}*/
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
|
||||
void CGeorgesFormModel::setupModelData()
|
||||
{
|
||||
loadFormHeader();
|
||||
loadFormData(m_rootElm, m_rootItem);
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
|
||||
void CGeorgesFormModel::setShowParents( bool show ) {
|
||||
m_showParents = show;
|
||||
Q_EMIT layoutAboutToBeChanged();
|
||||
Q_EMIT layoutChanged();
|
||||
}
|
||||
void CGeorgesFormModel::setShowDefaults( bool show )
|
||||
{
|
||||
m_showDefaults = show;
|
||||
Q_EMIT layoutAboutToBeChanged();
|
||||
Q_EMIT layoutChanged();
|
||||
}
|
||||
|
||||
void CGeorgesFormModel::addParentForm(QString parentForm)
|
||||
{
|
||||
beginResetModel();
|
||||
m_parents.push_back(parentForm);
|
||||
delete m_rootItem;
|
||||
m_rootItem = new CFormItem(m_rootElm, m_rootData);
|
||||
setupModelData();
|
||||
endResetModel();
|
||||
}
|
||||
|
||||
void CGeorgesFormModel::removeParentForm(QString parentForm)
|
||||
{
|
||||
beginResetModel();
|
||||
m_parents.removeOne(parentForm);
|
||||
|
||||
delete m_rootItem;
|
||||
m_rootItem = new CFormItem(m_rootElm, m_rootData);
|
||||
setupModelData();
|
||||
endResetModel();
|
||||
}
|
||||
} /* namespace GeorgesQt */
|
||||
|
||||
/* end of file */
|
@ -1,174 +0,0 @@
|
||||
// Object Viewer Qt GUI Editor plugin <http://dev.ryzom.com/projects/ryzom/>
|
||||
// Copyright (C) 2010 Winch Gate Property Limited
|
||||
//
|
||||
// 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 <http://www.gnu.org/licenses/>.
|
||||
|
||||
|
||||
#include "nel3d_widget.h"
|
||||
#include "nel/3d/u_driver.h"
|
||||
#include "nel/3d/text_context.h"
|
||||
#include "nel/3d/driver_user.h"
|
||||
#include "nel/misc/rgba.h"
|
||||
#include "nel/misc/path.h"
|
||||
#include "nel/misc/event_listener.h"
|
||||
#include "nel/gui/event_listener.h"
|
||||
|
||||
#ifdef NL_OS_WINDOWS
|
||||
#include <Windows.h>
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
namespace GUIEditor
|
||||
{
|
||||
Nel3DWidget::Nel3DWidget( QWidget *parent ) :
|
||||
QWidget( parent )
|
||||
{
|
||||
driver = NULL;
|
||||
textContext = NULL;
|
||||
|
||||
// Need to set this attribute with a NULL paintengine returned to Qt
|
||||
// so that we can render the widget normally ourselves, without the image
|
||||
// disappearing when a widget is resized or shown on top of us
|
||||
setAttribute( Qt::WA_PaintOnScreen, true );
|
||||
eventListener = NULL;
|
||||
}
|
||||
|
||||
Nel3DWidget::~Nel3DWidget()
|
||||
{
|
||||
if( driver != NULL )
|
||||
{
|
||||
if( textContext != NULL )
|
||||
{
|
||||
driver->deleteTextContext( textContext );
|
||||
textContext = NULL;
|
||||
}
|
||||
|
||||
driver->release();
|
||||
delete driver;
|
||||
driver = NULL;
|
||||
}
|
||||
delete eventListener;
|
||||
}
|
||||
|
||||
void Nel3DWidget::init()
|
||||
{
|
||||
nlassert( driver == NULL );
|
||||
|
||||
driver = NL3D::UDriver::createDriver( 0, false, 0 );
|
||||
driver->setMatrixMode2D11();
|
||||
driver->setDisplay( winId(), NL3D::UDriver::CMode( width(), height(), 32, true ) );
|
||||
eventListener = new NLGUI::CEventListener();
|
||||
eventListener->addToServer( &driver->EventServer );
|
||||
}
|
||||
|
||||
void Nel3DWidget::createTextContext( std::string fontFile )
|
||||
{
|
||||
if( driver == NULL )
|
||||
return;
|
||||
|
||||
std::string font;
|
||||
|
||||
try
|
||||
{
|
||||
font = NLMISC::CPath::lookup( fontFile );
|
||||
}
|
||||
catch( ... )
|
||||
{
|
||||
nlinfo( "Font %s cannot be found, cannot create textcontext!", fontFile.c_str() );
|
||||
exit( EXIT_FAILURE );
|
||||
}
|
||||
|
||||
if( textContext != NULL )
|
||||
{
|
||||
driver->deleteTextContext( textContext );
|
||||
textContext = NULL;
|
||||
}
|
||||
|
||||
textContext = driver->createTextContext( font );
|
||||
}
|
||||
|
||||
void Nel3DWidget::clear()
|
||||
{
|
||||
if( driver == NULL )
|
||||
return;
|
||||
driver->clearBuffers( NLMISC::CRGBA::Black );
|
||||
driver->swapBuffers();
|
||||
}
|
||||
|
||||
|
||||
#if defined ( NL_OS_WINDOWS )
|
||||
|
||||
typedef bool ( *winProc )( NL3D::IDriver *driver, HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam );
|
||||
|
||||
bool Nel3DWidget::winEvent( MSG *message, long *result )
|
||||
{
|
||||
if( driver != NULL )
|
||||
{
|
||||
NL3D::IDriver *iDriver = dynamic_cast< NL3D::CDriverUser* >( driver )->getDriver();
|
||||
if( iDriver != NULL )
|
||||
{
|
||||
winProc proc = (winProc)iDriver->getWindowProc();
|
||||
return proc( iDriver, message->hwnd, message->message, message->wParam, message->lParam );
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
#elif defined( NL_OS_MAC )
|
||||
|
||||
typedef bool ( *cocoaProc )( NL3D::IDriver *, const void *e );
|
||||
|
||||
bool Nel3DWidget::macEvent( EventHandlerCallRef caller, EventRef event )
|
||||
{
|
||||
if( caller )
|
||||
nlerror( "You are using QtCarbon! Only QtCocoa supported, please upgrade Qt" );
|
||||
|
||||
if( driver != NULL )
|
||||
{
|
||||
NL3D::IDriver *iDriver = dynamic_cast< NL3D::CDriverUser* >( driver )->getDriver();
|
||||
if( iDriver != NULL )
|
||||
{
|
||||
cocoaProc proc = ( cocoaProc )iDriver->getWindowProc();
|
||||
return proc( iDriver, event );
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
#elif defined( NL_OS_UNIX )
|
||||
|
||||
typedef bool ( *x11Proc )( NL3D::IDriver *drv, XEvent *e );
|
||||
|
||||
bool Nel3DWidget::x11Event( XEvent *event )
|
||||
{
|
||||
if( driver != NULL )
|
||||
{
|
||||
NL3D::IDriver *iDriver = dynamic_cast< NL3D::CDriverUser* >( driver )->getDriver();
|
||||
if( driver != NULL )
|
||||
{
|
||||
x11Proc proc = ( x11Proc )iDriver->getWindowProc();
|
||||
return proc( iDriver, event );
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
|
@ -1,79 +0,0 @@
|
||||
// Object Viewer Qt GUI Editor plugin <http://dev.ryzom.com/projects/ryzom/>
|
||||
// Copyright (C) 2010 Winch Gate Property Limited
|
||||
//
|
||||
// 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 <http://www.gnu.org/licenses/>.
|
||||
|
||||
|
||||
#ifndef NEL3D_WIDGET_H
|
||||
#define NEL3D_WIDGET_H
|
||||
|
||||
#include <QWidget>
|
||||
#include "nel/misc/types_nl.h"
|
||||
#include <string>
|
||||
|
||||
namespace NLGUI
|
||||
{
|
||||
class CEventListener;
|
||||
}
|
||||
|
||||
namespace NL3D
|
||||
{
|
||||
class UDriver;
|
||||
class UTextContext;
|
||||
}
|
||||
|
||||
namespace GUIEditor
|
||||
{
|
||||
/// Nel 3D interface to Qt
|
||||
class Nel3DWidget : public QWidget
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
Nel3DWidget( QWidget *parent = NULL );
|
||||
virtual ~Nel3DWidget();
|
||||
|
||||
virtual void init();
|
||||
void createTextContext( std::string fontFile );
|
||||
|
||||
NL3D::UDriver* getDriver() const{ return driver; }
|
||||
NL3D::UTextContext* getTextContext() const{ return textContext; }
|
||||
|
||||
|
||||
// Need to return NULL paintengine to Qt so that we can
|
||||
// render the widget normally ourselves, without the image
|
||||
// disappearing when a widget is resized or shown on top of us
|
||||
QPaintEngine* paintEngine() const{ return NULL; }
|
||||
|
||||
public Q_SLOTS:
|
||||
void clear();
|
||||
|
||||
protected:
|
||||
|
||||
#if defined(NL_OS_WINDOWS)
|
||||
virtual bool winEvent( MSG *message, long *result );
|
||||
#elif defined(NL_OS_MAC)
|
||||
virtual bool macEvent( EventHandlerCallRef caller, EventRef event );
|
||||
#elif defined(NL_OS_UNIX)
|
||||
virtual bool x11Event( XEvent *event );
|
||||
#endif
|
||||
|
||||
private:
|
||||
NL3D::UDriver *driver;
|
||||
NL3D::UTextContext *textContext;
|
||||
NLGUI::CEventListener *eventListener;
|
||||
};
|
||||
}
|
||||
|
||||
#endif
|
||||
|
@ -1,173 +0,0 @@
|
||||
// Object Viewer Qt GUI Editor plugin <http://dev.ryzom.com/projects/ryzom/>
|
||||
// Copyright (C) 2010 Winch Gate Property Limited
|
||||
//
|
||||
// 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 <http://www.gnu.org/licenses/>.
|
||||
|
||||
|
||||
#include "property_browser_ctrl.h"
|
||||
#include "../../3rdparty/qtpropertybrowser/QtVariantPropertyManager"
|
||||
#include "../../3rdparty/qtpropertybrowser/QtTreePropertyBrowser"
|
||||
#include "nel/gui/interface_group.h"
|
||||
#include "nel/gui/widget_manager.h"
|
||||
#include <typeinfo>
|
||||
#include "widget_info_tree.h"
|
||||
|
||||
namespace GUIEditor
|
||||
{
|
||||
CPropBrowserCtrl::CPropBrowserCtrl()
|
||||
{
|
||||
browser = NULL;
|
||||
propertyMgr = new QtVariantPropertyManager;
|
||||
}
|
||||
|
||||
CPropBrowserCtrl::~CPropBrowserCtrl()
|
||||
{
|
||||
delete propertyMgr;
|
||||
propertyMgr = NULL;
|
||||
browser = NULL;
|
||||
}
|
||||
|
||||
void CPropBrowserCtrl::setBrowser( QtTreePropertyBrowser *b )
|
||||
{
|
||||
browser = b;
|
||||
}
|
||||
|
||||
void CPropBrowserCtrl::setupWidgetInfo( CWidgetInfoTree *tree )
|
||||
{
|
||||
widgetInfo.clear();
|
||||
|
||||
std::vector< std::string > names;
|
||||
tree->getNames( names );
|
||||
|
||||
std::vector< std::string >::const_iterator itr;
|
||||
for( itr = names.begin(); itr != names.end(); ++itr )
|
||||
{
|
||||
CWidgetInfoTreeNode *node = tree->findNodeByName( *itr );
|
||||
const SWidgetInfo &w = node->getInfo();
|
||||
widgetInfo[ w.GUIName ] = w;
|
||||
}
|
||||
}
|
||||
|
||||
void CPropBrowserCtrl::clear()
|
||||
{
|
||||
browser->clear();
|
||||
disconnect( propertyMgr, SIGNAL( propertyChanged( QtProperty* ) ),
|
||||
this, SLOT( onPropertyChanged( QtProperty* ) ) );
|
||||
}
|
||||
|
||||
void CPropBrowserCtrl::onSelectionChanged( std::string &id )
|
||||
{
|
||||
if( browser == NULL )
|
||||
return;
|
||||
|
||||
disconnect( propertyMgr, SIGNAL( propertyChanged( QtProperty* ) ),
|
||||
this, SLOT( onPropertyChanged( QtProperty* ) ) );
|
||||
|
||||
browser->clear();
|
||||
|
||||
CInterfaceElement *e = CWidgetManager::getInstance()->getElementFromId( id );
|
||||
if( e == NULL )
|
||||
{
|
||||
connect( propertyMgr, SIGNAL( propertyChanged( QtProperty* ) ),
|
||||
this, SLOT( onPropertyChanged( QtProperty* ) ) );
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
currentElement = id;
|
||||
|
||||
std::string n = e->getClassName();
|
||||
|
||||
setupProperties( n, e );
|
||||
connect( propertyMgr, SIGNAL( propertyChanged( QtProperty* ) ),
|
||||
this, SLOT( onPropertyChanged( QtProperty* ) ) );
|
||||
}
|
||||
|
||||
void CPropBrowserCtrl::onPropertyChanged( QtProperty *prop )
|
||||
{
|
||||
QString propName = prop->propertyName();
|
||||
QString propValue = prop->valueText();
|
||||
|
||||
// for some reason booleans cannot be extracted from a QtProperty :(
|
||||
if( propValue.isEmpty() )
|
||||
{
|
||||
QtVariantProperty *p = propertyMgr->variantProperty( prop );
|
||||
if( p != NULL )
|
||||
propValue = p->value().toString();
|
||||
}
|
||||
|
||||
CInterfaceElement *e = CWidgetManager::getInstance()->getElementFromId( currentElement );
|
||||
if( e == NULL )
|
||||
return;
|
||||
e->setProperty( propName.toUtf8().constData(), propValue.toUtf8().constData() );
|
||||
|
||||
|
||||
// Make sure the changes are applied
|
||||
bool active = e->getActive();
|
||||
e->setActive( !active );
|
||||
e->setActive( active );
|
||||
}
|
||||
|
||||
void CPropBrowserCtrl::setupProperties( const std::string &type, const CInterfaceElement *element )
|
||||
{
|
||||
std::map< std::string, SWidgetInfo >::iterator itr = widgetInfo.find( type );
|
||||
if( itr == widgetInfo.end() )
|
||||
return;
|
||||
SWidgetInfo &w = itr->second;
|
||||
|
||||
std::vector< SPropEntry >::const_iterator pItr;
|
||||
for( pItr = w.props.begin(); pItr != w.props.end(); ++pItr )
|
||||
{
|
||||
const SPropEntry &prop = *pItr;
|
||||
setupProperty( prop, element );
|
||||
}
|
||||
|
||||
QtVariantEditorFactory *factory = new QtVariantEditorFactory;
|
||||
browser->setFactoryForManager( propertyMgr, factory );
|
||||
}
|
||||
|
||||
void CPropBrowserCtrl::setupProperty( const SPropEntry &prop, const CInterfaceElement *element )
|
||||
{
|
||||
QtVariantProperty *p = NULL;
|
||||
QVariant v;
|
||||
|
||||
if( prop.propType == "string" )
|
||||
{
|
||||
p = propertyMgr->addProperty( QVariant::String, prop.propName.c_str() );
|
||||
v = element->getProperty( prop.propName ).c_str();
|
||||
}
|
||||
else
|
||||
if( prop.propType == "bool" )
|
||||
{
|
||||
p = propertyMgr->addProperty( QVariant::Bool, prop.propName.c_str() );
|
||||
bool value = false;
|
||||
NLMISC::fromString( element->getProperty( prop.propName ), value );
|
||||
v = value;
|
||||
}
|
||||
else
|
||||
if( prop.propType == "int" )
|
||||
{
|
||||
p = propertyMgr->addProperty( QVariant::Int, prop.propName.c_str() );
|
||||
sint32 value = 0;
|
||||
NLMISC::fromString( element->getProperty( prop.propName ), value );
|
||||
v = value;
|
||||
}
|
||||
|
||||
if( p == NULL )
|
||||
return;
|
||||
|
||||
p->setValue( v );
|
||||
browser->addProperty( p );
|
||||
}
|
||||
}
|
@ -1,195 +0,0 @@
|
||||
/*
|
||||
Object Viewer Qt
|
||||
Copyright (C) 2010 Dzmitry Kamiahin <dnk-88@tut.by>
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU 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 General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
*/
|
||||
|
||||
#include "stdpch.h"
|
||||
#include "graphics_viewport.h"
|
||||
|
||||
// STL includes
|
||||
|
||||
// Qt includes
|
||||
#include <QtGui/QAction>
|
||||
#include <QtGui/QResizeEvent>
|
||||
#include <QtGui/QColorDialog>
|
||||
#include <QtGui/QFileDialog>
|
||||
|
||||
// NeL includes
|
||||
#include <nel/misc/rgba.h>
|
||||
|
||||
#include <nel/misc/event_server.h>
|
||||
#include <nel/misc/events.h>
|
||||
|
||||
#include <nel/3d/u_driver.h>
|
||||
#include <nel/3d/driver_user.h>
|
||||
|
||||
// Project includes
|
||||
#include "modules.h"
|
||||
|
||||
using namespace std;
|
||||
using namespace NL3D;
|
||||
|
||||
namespace NLQT
|
||||
{
|
||||
|
||||
CGraphicsViewport::CGraphicsViewport(QWidget *parent)
|
||||
: QNLWidget(parent)
|
||||
{
|
||||
setAttribute(Qt::WA_OpaquePaintEvent);
|
||||
setAttribute(Qt::WA_NoSystemBackground);
|
||||
setAttribute(Qt::WA_PaintOnScreen);
|
||||
}
|
||||
|
||||
CGraphicsViewport::~CGraphicsViewport()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void CGraphicsViewport::init()
|
||||
{
|
||||
//H_AUTO2
|
||||
nldebug("CGraphicsViewport::init");
|
||||
|
||||
#if defined(NL_OS_UNIX) && !defined(NL_OS_MAC)
|
||||
makeCurrent();
|
||||
#endif // defined(NL_OS_UNIX) && !defined(NL_OS_MAC)
|
||||
|
||||
Modules::objView().init((nlWindow)winId(), width(), height());
|
||||
Modules::psEdit().init();
|
||||
Modules::veget().init();
|
||||
|
||||
setMouseTracking(true);
|
||||
setFocusPolicy(Qt::StrongFocus);
|
||||
}
|
||||
|
||||
void CGraphicsViewport::release()
|
||||
{
|
||||
//H_AUTO2
|
||||
nldebug("CGraphicsViewport::release");
|
||||
|
||||
Modules::veget().release();
|
||||
Modules::psEdit().release();
|
||||
Modules::objView().release();
|
||||
}
|
||||
|
||||
|
||||
QAction *CGraphicsViewport::createSaveScreenshotAction(QObject *parent)
|
||||
{
|
||||
QAction *action = new QAction(parent);
|
||||
connect(action, SIGNAL(triggered()), this, SLOT(saveScreenshot()));
|
||||
return action;
|
||||
}
|
||||
|
||||
QAction *CGraphicsViewport::createSetBackgroundColor(QObject *parent)
|
||||
{
|
||||
QAction *action = new QAction(parent);
|
||||
connect(action, SIGNAL(triggered()), this, SLOT(setBackgroundColor()));
|
||||
return action;
|
||||
}
|
||||
|
||||
void CGraphicsViewport::saveScreenshot()
|
||||
{
|
||||
Modules::objView().saveScreenshot("screenshot", false, true, false);
|
||||
}
|
||||
|
||||
void CGraphicsViewport::setBackgroundColor()
|
||||
{
|
||||
QColor color = QColorDialog::getColor(QColor(Modules::objView().getBackgroundColor().R,
|
||||
Modules::objView().getBackgroundColor().G,
|
||||
Modules::objView().getBackgroundColor().B));
|
||||
if (color.isValid())
|
||||
Modules::objView().setBackgroundColor(NLMISC::CRGBA(color.red(), color.green(), color.blue()));
|
||||
}
|
||||
|
||||
void CGraphicsViewport::resizeEvent(QResizeEvent *resizeEvent)
|
||||
{
|
||||
QWidget::resizeEvent(resizeEvent);
|
||||
if (Modules::objView().getDriver())
|
||||
Modules::objView().setSizeViewport(resizeEvent->size().width(), resizeEvent->size().height());
|
||||
}
|
||||
|
||||
#if defined(NL_OS_WINDOWS)
|
||||
|
||||
typedef bool (*winProc)(NL3D::IDriver *driver, HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
|
||||
|
||||
bool CGraphicsViewport::winEvent(MSG *message, long *result)
|
||||
{
|
||||
if (Modules::objView().getDriver() && Modules::objView().getDriver()->isActive())
|
||||
{
|
||||
NL3D::IDriver *driver = dynamic_cast<NL3D::CDriverUser *>(Modules::objView().getDriver())->getDriver();
|
||||
if (driver)
|
||||
{
|
||||
winProc proc = (winProc)driver->getWindowProc();
|
||||
|
||||
// TODO: shouldn't it return false like the others?
|
||||
// see macEvent() and x11Event() below
|
||||
return proc(driver, message->hwnd, message->message, message->wParam, message->lParam);
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
#elif defined(NL_OS_MAC)
|
||||
|
||||
typedef bool (*cocoaProc)(NL3D::IDriver *, const void *e);
|
||||
|
||||
bool CGraphicsViewport::macEvent(EventHandlerCallRef caller, EventRef event)
|
||||
{
|
||||
if(caller)
|
||||
nlerror("You are using QtCarbon! Only QtCocoa supported, please upgrade Qt");
|
||||
|
||||
if (Modules::objView().getDriver() && Modules::objView().getDriver()->isActive())
|
||||
{
|
||||
NL3D::IDriver *driver = dynamic_cast<NL3D::CDriverUser *>(Modules::objView().getDriver())->getDriver();
|
||||
if (driver)
|
||||
{
|
||||
cocoaProc proc = (cocoaProc)driver->getWindowProc();
|
||||
proc(driver, event);
|
||||
}
|
||||
}
|
||||
|
||||
// return false to let Qt handle the event as well,
|
||||
// else the widget would never get focus
|
||||
return false;
|
||||
}
|
||||
|
||||
#elif defined(NL_OS_UNIX)
|
||||
|
||||
typedef bool (*x11Proc)(NL3D::IDriver *drv, XEvent *e);
|
||||
|
||||
bool CGraphicsViewport::x11Event(XEvent *event)
|
||||
{
|
||||
if (Modules::objView().getDriver() && Modules::objView().getDriver()->isActive())
|
||||
{
|
||||
NL3D::IDriver *driver = dynamic_cast<NL3D::CDriverUser *>(Modules::objView().getDriver())->getDriver();
|
||||
if (driver)
|
||||
{
|
||||
x11Proc proc = (x11Proc)driver->getWindowProc();
|
||||
proc(driver, event);
|
||||
}
|
||||
}
|
||||
|
||||
// return false to let Qt handle the event as well,
|
||||
// else the widget would never get focus
|
||||
// TODO: test me please, i have no linux at hand (rti)
|
||||
return false;
|
||||
}
|
||||
#endif
|
||||
|
||||
} /* namespace NLQT */
|
||||
|
@ -1,48 +0,0 @@
|
||||
INCLUDE_DIRECTORIES( ${CMAKE_CURRENT_BINARY_DIR}
|
||||
${CMAKE_CURRENT_SOURCE_DIR}
|
||||
${LIBXML2_INCLUDE_DIR}
|
||||
${QT_INCLUDES})
|
||||
|
||||
FILE(GLOB SRC *.cpp *.h)
|
||||
SET(OVQT_EXT_SYS_SRC ${CMAKE_CURRENT_SOURCE_DIR}/../../extension_system/iplugin.h
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/../../extension_system/iplugin_manager.h
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/../../extension_system/iplugin_spec.h)
|
||||
|
||||
SET(OVQT_PLUG_SHEET_BUILDER_HDR sheetbuilderconfgdialog.h sheetbuilderdialog.h ovqt_sheet_builder.h)
|
||||
|
||||
SET(QT_USE_QTGUI TRUE)
|
||||
SET(QT_USE_QTOPENGL TRUE)
|
||||
|
||||
QT4_WRAP_CPP(OVQT_PLUG_SHEET_BUILDER_MOC_SRC ${OVQT_PLUG_SHEET_BUILDER_HDR})
|
||||
|
||||
SOURCE_GROUP(QtGeneratedMocSrc FILES ${OVQT_PLUG_SHEET_BUILDER_MOC_SRC})
|
||||
SOURCE_GROUP("Sheet builder Plugin" FILES ${SRC})
|
||||
SOURCE_GROUP("OVQT Extension System" FILES ${OVQT_EXT_SYS_SRC})
|
||||
|
||||
ADD_LIBRARY(ovqt_plugin_sheet_builder MODULE ${SRC} ${OVQT_PLUG_SHEET_BUILDER_MOC_SRC} ${OVQT_EXT_SYS_SRC})
|
||||
|
||||
TARGET_LINK_LIBRARIES(ovqt_plugin_sheet_builder ovqt_plugin_core nelmisc ${QT_LIBRARIES})
|
||||
|
||||
NL_DEFAULT_PROPS(ovqt_plugin_sheet_builder "NeL, Tools, 3D: Object Viewer Qt Plugin: Sheet builder")
|
||||
NL_ADD_RUNTIME_FLAGS(ovqt_plugin_sheet_builder)
|
||||
NL_ADD_LIB_SUFFIX(ovqt_plugin_sheet_builder)
|
||||
|
||||
ADD_DEFINITIONS(${LIBXML2_DEFINITIONS} -DQT_PLUGIN -DQT_SHARED ${QT_DEFINITIONS})
|
||||
|
||||
|
||||
IF(WIN32)
|
||||
IF(WITH_INSTALL_LIBRARIES)
|
||||
INSTALL(TARGETS ovqt_plugin_sheet_builder LIBRARY DESTINATION ${OVQT_PLUGIN_DIR} ARCHIVE DESTINATION ${NL_LIB_PREFIX} RUNTIME DESTINATION ${OVQT_PLUGIN_DIR} COMPONENT tools3d)
|
||||
ELSE(WITH_INSTALL_LIBRARIES)
|
||||
INSTALL(TARGETS ovqt_plugin_sheet_builder LIBRARY DESTINATION ${OVQT_PLUGIN_DIR} RUNTIME DESTINATION ${OVQT_PLUGIN_DIR} COMPONENT tools3d)
|
||||
ENDIF(WITH_INSTALL_LIBRARIES)
|
||||
ELSE(WIN32)
|
||||
IF(WITH_INSTALL_LIBRARIES)
|
||||
INSTALL(TARGETS ovqt_plugin_sheet_builder LIBRARY DESTINATION ${OVQT_PLUGIN_DIR} ARCHIVE DESTINATION ${NL_LIB_PREFIX} RUNTIME DESTINATION ${NL_BIN_PREFIX} COMPONENT tools3d)
|
||||
ELSE(WITH_INSTALL_LIBRARIES)
|
||||
INSTALL(TARGETS ovqt_plugin_sheet_builder LIBRARY DESTINATION ${OVQT_PLUGIN_DIR} RUNTIME DESTINATION ${NL_BIN_PREFIX} COMPONENT tools3d)
|
||||
ENDIF(WITH_INSTALL_LIBRARIES)
|
||||
ENDIF(WIN32)
|
||||
|
||||
INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/ovqt_plugin_sheet_builder.xml DESTINATION ${OVQT_PLUGIN_SPECS_DIR} COMPONENT tools3d)
|
||||
|
Before Width: | Height: | Size: 3.5 KiB After Width: | Height: | Size: 3.5 KiB |
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 12 KiB |
Before Width: | Height: | Size: 2.1 KiB After Width: | Height: | Size: 2.1 KiB |
Before Width: | Height: | Size: 1.5 KiB After Width: | Height: | Size: 1.5 KiB |
Before Width: | Height: | Size: 131 KiB After Width: | Height: | Size: 131 KiB |
Before Width: | Height: | Size: 187 KiB After Width: | Height: | Size: 187 KiB |
@ -0,0 +1,7 @@
|
||||
#ifndef OVQT_CONFIG_H
|
||||
#define OVQT_CONFIG_H
|
||||
|
||||
#define DATA_DIR "${NL_SHARE_ABSOLUTE_PREFIX}/studio"
|
||||
#define PLUGINS_DIR "${NL_LIB_ABSOLUTE_PREFIX}/studio"
|
||||
|
||||
#endif
|