Changed: #1150 Code Cleanup

hg/feature/sound
aquiles 14 years ago
parent d60bcaec05
commit 0f26e09e23

@ -2,8 +2,8 @@ INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR} ${LI
INCLUDE( ${QT_USE_FILE} ) INCLUDE( ${QT_USE_FILE} )
FILE(GLOB GEORGES_EDITOR_SRC *.cpp) FILE(GLOB GEORGES_EDITOR_SRC *.cpp)
SET(GEORGES_EDITOR_HDR georges_dirtree_dialog.h georges_treeview_dialog.h georgesform_model.h main_window.h SET(GEORGES_EDITOR_HDR georges_dirtree_dialog.h georges_treeview_dialog.h main_window.h
log_dialog.h objectviewer_dialog.h settings_dialog.h) objectviewer_dialog.h settings_dialog.h)
SET(GEORGES_EDITOR_UIS settings_form.ui objectviewer_form.ui log_form.ui georges_treeview_form.ui georges_dirtree_form.ui) SET(GEORGES_EDITOR_UIS settings_form.ui objectviewer_form.ui log_form.ui georges_treeview_form.ui georges_dirtree_form.ui)
SET(GEORGES_EDITOR_RCS georges_editor_qt.qrc) SET(GEORGES_EDITOR_RCS georges_editor_qt.qrc)

@ -1,19 +1,19 @@
/* /*
Georges Editor Qt Georges Editor Qt
Copyright (C) 2010 Adrian Jaekel <aj at elane2k dot com> Copyright (C) 2010 Adrian Jaekel <aj at elane2k dot com>
This program is free software: you can redistribute it and/or modify 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 it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or the Free Software Foundation, either version 3 of the License, or
(at your option) any later version. (at your option) any later version.
This program is distributed in the hope that it will be useful, This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details. GNU General Public License for more details.
You should have received a copy of the GNU General Public License You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
#include "filesystem_model.h" #include "filesystem_model.h"
@ -21,26 +21,31 @@
#include <QtGui/QApplication> #include <QtGui/QApplication>
#include <QtGui/QStyle> #include <QtGui/QStyle>
namespace NLQT { namespace NLQT
{
CFileSystemModel::CFileSystemModel(QString ldPath, QObject *parent) CFileSystemModel::CFileSystemModel(QString ldPath, QObject *parent)
: QFileSystemModel(parent), : QFileSystemModel(parent),
_ldPath(ldPath){ _ldPath(ldPath)
{
} }
CFileSystemModel::~CFileSystemModel() { CFileSystemModel::~CFileSystemModel()
{
} }
QVariant CFileSystemModel::data(const QModelIndex& index, int role) const { QVariant CFileSystemModel::data(const QModelIndex& index, int role) const {
if (role == Qt::DecorationRole) { if (role == Qt::DecorationRole)
{
if (_ldPath.isEmpty()) if (_ldPath.isEmpty())
return QVariant(); return QVariant();
if (isDir(index)) if (isDir(index))
return QApplication::style()->standardIcon(QStyle::SP_DirIcon); return QApplication::style()->standardIcon(QStyle::SP_DirIcon);
} }
if (_ldPath.isEmpty() && role == Qt::DisplayRole) { if (_ldPath.isEmpty() && role == Qt::DisplayRole)
{
if (index.parent().isValid()) if (index.parent().isValid())
return QVariant(); return QVariant();
return QString("Set a correct leveldesign path ..."); return QString("Set a correct leveldesign path ...");
@ -55,10 +60,14 @@ namespace NLQT {
int CFileSystemModel::rowCount(const QModelIndex &parent) const int CFileSystemModel::rowCount(const QModelIndex &parent) const
{ {
if (_ldPath.isEmpty()) { if (_ldPath.isEmpty())
if(parent.isValid()) { {
if(parent.isValid())
{
return 0; return 0;
} else { }
else
{
return qMin(QFileSystemModel::rowCount(parent),1); return qMin(QFileSystemModel::rowCount(parent),1);
} }
} }

@ -1,19 +1,19 @@
/* /*
Georges Editor Qt Georges Editor Qt
Copyright (C) 2010 Adrian Jaekel <aj at elane2k dot com> Copyright (C) 2010 Adrian Jaekel <aj at elane2k dot com>
This program is free software: you can redistribute it and/or modify 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 it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or the Free Software Foundation, either version 3 of the License, or
(at your option) any later version. (at your option) any later version.
This program is distributed in the hope that it will be useful, This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details. GNU General Public License for more details.
You should have received a copy of the GNU General Public License You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
#ifndef FILESYSTEM_MODEL_H #ifndef FILESYSTEM_MODEL_H
@ -21,7 +21,8 @@
#include <QtGui/QFileSystemModel> #include <QtGui/QFileSystemModel>
namespace NLQT { namespace NLQT
{
class CFileSystemModel : public QFileSystemModel class CFileSystemModel : public QFileSystemModel
{ {

@ -0,0 +1,302 @@
/*
Georges Editor Qt
Copyright (C) 2010 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 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 "formdelegate.h"
// NeL includes
#include <nel/misc/debug.h>
#include <nel/georges/u_type.h>
#include <nel/georges/u_form_elm.h>
// Qt includes
#include <QSpinBox>
#include <QLineEdit>
#include <QDoubleSpinBox>
#include <QColorDialog>
#include <QComboBox>
#include <QApplication>
#include <QTextDocument>
#include <QAbstractTextDocumentLayout>
#include <QPainter>
// Project includes
#include "georgesform_model.h"
#include "formitem.h"
namespace NLQT
{
FormDelegate::FormDelegate(QObject *parent)
: QStyledItemDelegate(parent)
{
}
QWidget *FormDelegate::createEditor(QWidget *parent,
const QStyleOptionViewItem & option ,
const QModelIndex &index) const
{
CFormItem *item = static_cast<CFormItem*>(index.internalPointer());
QString value = item->data(1).toString();
if (value.isEmpty())
return 0;
const NLGEORGES::UType *type = dynamic_cast<const CGeorgesFormModel *>(index.model())->
getItem(index)->getFormElm()->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 NLGEORGES::UType *type = dynamic_cast<const CGeorgesFormModel *>(index.model())->
getItem(index)->getFormElm()->getType();
int numDefinitions = type->getNumDefinition();
QString value = index.model()->data(index, Qt::DisplayRole).toString();
if (numDefinitions)
{
QComboBox *cb = static_cast<QComboBox*>(editor);
cb->setCurrentIndex(cb->findText(value));
//cb->setIconSize()
}
else
{
switch (type->getType())
{
case NLGEORGES::UType::UnsignedInt:
case NLGEORGES::UType::SignedInt:
{
QSpinBox *spinBox = static_cast<QSpinBox*>(editor);
spinBox->setValue((int)value.toDouble());
break;
}
case NLGEORGES::UType::Double:
{
QDoubleSpinBox *spinBox = static_cast<QDoubleSpinBox*>(editor);
spinBox->setValue(value.toDouble());
break;
}
case NLGEORGES::UType::Color:
{
break;
}
default:
{
QLineEdit *textEdit = static_cast<QLineEdit*>(editor);
textEdit->setText(value);
break;
}
}
}
}
void FormDelegate::setModelData(QWidget *editor, QAbstractItemModel *model,
const QModelIndex &index) const
{
const NLGEORGES::UType *type = dynamic_cast<const CGeorgesFormModel *>(index.model())->
getItem(index)->getFormElm()->getType();
int numDefinitions = type->getNumDefinition();
if (numDefinitions)
{
QComboBox *comboBox = static_cast<QComboBox*>(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<QSpinBox*>(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<QDoubleSpinBox*>(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<QLineEdit*>(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);
//option.decorationAlignment = QStyleOptionViewItem::Right;
}
void FormDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
QStyleOptionViewItemV4 optionV4 = option;
optionV4.decorationPosition = QStyleOptionViewItem::Right;
//optionV4.decorationSize = QSize(32,32);
initStyleOption(&optionV4, index);
QStyledItemDelegate::paint(painter,optionV4,index);
//QStyle *style = optionV4.widget? optionV4.widget->style() : QApplication::style();
//QTextDocument doc;
//doc.setHtml(optionV4.text);
///// Painting item without text
//optionV4.text = QString();
//style->drawControl(QStyle::CE_ItemViewItem, &optionV4, painter);
//QAbstractTextDocumentLayout::PaintContext ctx;
//// Highlighting text if item is selected
//if (optionV4.state & QStyle::State_Selected)
// ctx.palette.setColor(QPalette::Text, optionV4.palette.color(QPalette::Active, QPalette::HighlightedText));
//QRect textRect = style->subElementRect(QStyle::SE_ItemViewItemText, &optionV4);
//painter->save();
//painter->translate(textRect.topLeft());
//painter->setClipRect(textRect.translated(-textRect.topLeft()));
//doc.documentLayout()->draw(painter, ctx);
//painter->restore();
}
} /* namespace NLQT */

@ -0,0 +1,45 @@
/*
Georges Editor Qt
Copyright (C) 2010 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 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/>.
*/
#ifndef FORMDELEGATE_H
#define FORMDELEGATE_H
#include <QStyledItemDelegate>
namespace NLQT
{
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;
void paint ( QPainter * painter, const QStyleOptionViewItem & option,
const QModelIndex & index ) const;
};
}
#endif // FORMDELEGATE_H

@ -24,10 +24,12 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
// NeL includes // NeL includes
#include <nel/georges/u_type.h> #include <nel/georges/u_type.h>
namespace NLQT { namespace NLQT
{
CFormItem::CFormItem(NLGEORGES::UFormElm* elm, const QList<QVariant> &data, CFormItem *parent, CFormItem::CFormItem(NLGEORGES::UFormElm* elm, const QList<QVariant> &data, CFormItem *parent,
NLGEORGES::UFormElm::TWhereIsValue wV, NLGEORGES::UFormElm::TWhereIsNode wN) { NLGEORGES::UFormElm::TWhereIsValue wV, NLGEORGES::UFormElm::TWhereIsNode wN)
{
parentItem = parent; parentItem = parent;
itemData = data; itemData = data;
formElm = elm; formElm = elm;
@ -35,27 +37,33 @@ namespace NLQT {
whereN = wN; whereN = wN;
} }
CFormItem::~CFormItem() { CFormItem::~CFormItem()
{
qDeleteAll(childItems); qDeleteAll(childItems);
} }
void CFormItem::appendChild(CFormItem *item) { void CFormItem::appendChild(CFormItem *item)
{
childItems.append(item); childItems.append(item);
} }
CFormItem *CFormItem::child(int row) { CFormItem *CFormItem::child(int row)
{
return childItems.value(row); return childItems.value(row);
} }
int CFormItem::childCount() const { int CFormItem::childCount() const
{
return childItems.count(); return childItems.count();
} }
int CFormItem::columnCount() const { int CFormItem::columnCount() const
{
return itemData.count(); return itemData.count();
} }
QVariant CFormItem::data(int column) const { QVariant CFormItem::data(int column) const
{
return itemData.value(column); return itemData.value(column);
} }
@ -64,36 +72,41 @@ namespace NLQT {
return parentItem; return parentItem;
} }
int CFormItem::row() const { int CFormItem::row() const
{
if (parentItem) if (parentItem)
return parentItem->childItems.indexOf(const_cast<CFormItem*>(this)); return parentItem->childItems.indexOf(const_cast<CFormItem*>(this));
return 0; return 0;
} }
bool CFormItem::setData(int column, const QVariant &value) { bool CFormItem::setData(int column, const QVariant &value)
{
if (column < 0 || column >= itemData.size()) if (column < 0 || column >= itemData.size())
return false; return false;
itemData[column] = value; itemData[column] = value;
if (formElm->isAtom()) { if (formElm->isAtom())
{
const NLGEORGES::UType *type = formElm->getType(); const NLGEORGES::UType *type = formElm->getType();
if (type) { if (type)
switch (type->getType()) { {
case NLGEORGES::UType::UnsignedInt: switch (type->getType())
case NLGEORGES::UType::SignedInt: {
case NLGEORGES::UType::Double: case NLGEORGES::UType::UnsignedInt:
case NLGEORGES::UType::String: case NLGEORGES::UType::SignedInt:
nldebug(QString("string %1 %2") case NLGEORGES::UType::Double:
.arg(itemData[0].toString()).arg(value.toString()) case NLGEORGES::UType::String:
.toStdString().c_str()); nldebug(QString("string %1 %2")
parentItem->formElm->setValueByName( .arg(itemData[0].toString()).arg(value.toString())
value.toString().toStdString().c_str(),itemData[0].toString().toStdString().c_str()); .toStdString().c_str());
break; parentItem->formElm->setValueByName(
case NLGEORGES::UType::Color: value.toString().toStdString().c_str(),itemData[0].toString().toStdString().c_str());
break; break;
default: case NLGEORGES::UType::Color:
break; break;
default:
break;
} }
} }
} }

@ -1,19 +1,19 @@
/* /*
Georges Editor Qt Georges Editor Qt
Copyright (C) 2010 Adrian Jaekel <aj at elane2k dot com> Copyright (C) 2010 Adrian Jaekel <aj at elane2k dot com>
This program is free software: you can redistribute it and/or modify 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 it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or the Free Software Foundation, either version 3 of the License, or
(at your option) any later version. (at your option) any later version.
This program is distributed in the hope that it will be useful, This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details. GNU General Public License for more details.
You should have received a copy of the GNU General Public License You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
#ifndef FORMITEM_H #ifndef FORMITEM_H
@ -26,43 +26,46 @@
#include <QList> #include <QList>
#include <QVariant> #include <QVariant>
namespace NLQT { namespace NLQT
{
class CFormItem class CFormItem
{ {
public: public:
CFormItem(NLGEORGES::UFormElm *elm, const QList<QVariant> &data, CFormItem(NLGEORGES::UFormElm *elm, const QList<QVariant> &data,
CFormItem *parent = 0, CFormItem *parent = 0,
NLGEORGES::UFormElm::TWhereIsValue = NLGEORGES::UFormElm::ValueForm, NLGEORGES::UFormElm::TWhereIsValue = NLGEORGES::UFormElm::ValueForm,
NLGEORGES::UFormElm::TWhereIsNode = NLGEORGES::UFormElm::NodeForm); NLGEORGES::UFormElm::TWhereIsNode = NLGEORGES::UFormElm::NodeForm);
~CFormItem(); ~CFormItem();
void appendChild(CFormItem *child); void appendChild(CFormItem *child);
CFormItem *child(int row); CFormItem *child(int row);
int childCount() const; int childCount() const;
int columnCount() const; int columnCount() const;
QVariant data(int column) const; QVariant data(int column) const;
int row() const; int row() const;
CFormItem *parent(); CFormItem *parent();
bool setData(int column, const QVariant &value); bool setData(int column, const QVariant &value);
NLGEORGES::UFormElm* getFormElm() {return formElm;}; NLGEORGES::UFormElm* getFormElm() {return formElm;};
NLGEORGES::UFormElm::TWhereIsValue CFormItem::valueFrom() { NLGEORGES::UFormElm::TWhereIsValue CFormItem::valueFrom()
return whereV; {
} return whereV;
NLGEORGES::UFormElm::TWhereIsNode CFormItem::nodeFrom() { }
return whereN; NLGEORGES::UFormElm::TWhereIsNode CFormItem::nodeFrom()
} {
return whereN;
}
private: private:
QList<CFormItem*> childItems; QList<CFormItem*> childItems;
QList<QVariant> itemData; QList<QVariant> itemData;
CFormItem *parentItem; CFormItem *parentItem;
NLGEORGES::UFormElm* formElm; NLGEORGES::UFormElm* formElm;
NLGEORGES::UFormElm::TWhereIsValue whereV; NLGEORGES::UFormElm::TWhereIsValue whereV;
NLGEORGES::UFormElm::TWhereIsNode whereN; NLGEORGES::UFormElm::TWhereIsNode whereN;
}; // CFormItem }; // CFormItem
} }
#endif // FORMITEM_H #endif // FORMITEM_H

@ -29,15 +29,20 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
using namespace NLGEORGES; using namespace NLGEORGES;
namespace NLQT { namespace NLQT
{
CGeorges::CGeorges(): FormLoader(0) { CGeorges::CGeorges(): FormLoader(0)
{
FormLoader = UFormLoader::createLoader(); FormLoader = UFormLoader::createLoader();
} }
CGeorges::~CGeorges() {} CGeorges::~CGeorges()
{
}
UForm *CGeorges::loadForm(std::string formName) { UForm *CGeorges::loadForm(std::string formName)
{
UForm *form = FormLoader->loadForm(formName.c_str()); UForm *form = FormLoader->loadForm(formName.c_str());
return form; return form;

@ -1,19 +1,19 @@
/* /*
Georges Editor Qt Georges Editor Qt
Copyright (C) 2010 Adrian Jaekel <aj at elane2k dot com> Copyright (C) 2010 Adrian Jaekel <aj at elane2k dot com>
This program is free software: you can redistribute it and/or modify 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 it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or the Free Software Foundation, either version 3 of the License, or
(at your option) any later version. (at your option) any later version.
This program is distributed in the hope that it will be useful, This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details. GNU General Public License for more details.
You should have received a copy of the GNU General Public License You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
#ifndef GEORGES_H #ifndef GEORGES_H
@ -38,26 +38,27 @@ namespace NLGEORGES
using namespace NLGEORGES; using namespace NLGEORGES;
namespace NLQT { namespace NLQT
/**
@class CGeorges
A CGeorges class loading and viewing sheets.
*/
class CGeorges
{ {
public:
/// Default constructor.
CGeorges();
virtual ~CGeorges();
// Load the given form root /**
UForm* loadForm(std::string formName); @class CGeorges
A CGeorges class loading and viewing sheets.
*/
class CGeorges
{
public:
/// Default constructor.
CGeorges();
virtual ~CGeorges();
// Load the given form root
UForm* loadForm(std::string formName);
// A form loader // A form loader
UFormLoader *FormLoader; UFormLoader *FormLoader;
};/* class CGeorges */ };/* class CGeorges */
} /* namespace NLQT */ } /* namespace NLQT */

@ -30,101 +30,113 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
using namespace NLMISC; using namespace NLMISC;
namespace NLQT { namespace NLQT
{
CGeorgesDirTreeDialog::CGeorgesDirTreeDialog(QString ldPath, QWidget *parent): CGeorgesDirTreeDialog::CGeorgesDirTreeDialog(QString ldPath, QWidget *parent)
QDockWidget(parent), :QDockWidget(parent), _ldPath(ldPath)
_ldPath(ldPath){ {
_ui.setupUi(this); _ui.setupUi(this);
//QStyleOptionViewItem myButtonOption; //QStyleOptionViewItem myButtonOption;
// const QStyleOptionViewItem *buttonOption = // const QStyleOptionViewItem *buttonOption =
// qstyleoption_cast<const QStyleOptionViewItem *>(_ui.dirTree->style()); // qstyleoption_cast<const QStyleOptionViewItem *>(_ui.dirTree->style());
/*setStyleSheet(" \ /*setStyleSheet(" \
QTreeView { \ QTreeView { \
alternate-background-color: yellow; \ alternate-background-color: yellow; \
} \ } \
QTreeView::item { \ QTreeView::item { \
border: 1px solid #d9d9d9; \ border: 1px solid #d9d9d9; \
border-top-color: transparent; \ border-top-color: transparent; \
border-bottom-color: transparent; \ border-bottom-color: transparent; \
} \ } \
QTreeView::item:hover { \ QTreeView::item:hover { \
background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #e7effd, stop: 1 #cbdaf1);\ background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #e7effd, stop: 1 #cbdaf1);\
border: 1px solid #bfcde4; \ border: 1px solid #bfcde4; \
} \ } \
QTreeView::item:selected { \ QTreeView::item:selected { \
border: 1px solid #567dbc; \ border: 1px solid #567dbc; \
} \ } \
QTreeView::item:selected:active{ \ QTreeView::item:selected:active{ \
background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #6ea1f1, stop: 1 #567dbc);\ background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #6ea1f1, stop: 1 #567dbc);\
} \ } \
QTreeView::item:selected:!active { \ QTreeView::item:selected:!active { \
background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #6b9be8, stop: 1 #577fbf);\ background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #6b9be8, stop: 1 #577fbf);\
}\ }\
");*/ ");*/
//QString leveldata = Modules::config().getConfigFile().getVar("SearchPaths").asString().c_str(); //QString leveldata = Modules::config().getConfigFile().getVar("SearchPaths").asString().c_str();
_dirModel = new CFileSystemModel(_ldPath); _dirModel = new CFileSystemModel(_ldPath);
_ui.dirTree->setModel(_dirModel); _ui.dirTree->setModel(_dirModel);
QFileInfo info(_ldPath); QFileInfo info(_ldPath);
if (!_ldPath.isEmpty() && info.isDir()) { if (!_ldPath.isEmpty() && info.isDir())
_dirModel->setRootPath(_ldPath); {
_ui.dirTree->setRootIndex(_dirModel->index(_ldPath)); _dirModel->setRootPath(_ldPath);
} else { _ui.dirTree->setRootIndex(_dirModel->index(_ldPath));
_dirModel->setRootPath(QDir::currentPath()); }
} else
{
_dirModel->setRootPath(QDir::currentPath());
}
_ui.dirTree->setAnimated(false); _ui.dirTree->setAnimated(false);
_ui.dirTree->setIndentation(20); _ui.dirTree->setIndentation(20);
//_ui.dirTree->setSortingEnabled(true); //_ui.dirTree->setSortingEnabled(true);
/*connect(_ui.dirTree, SIGNAL(clicked(QModelIndex)), /*connect(_ui.dirTree, SIGNAL(clicked(QModelIndex)),
this, SLOT(fileSelected(QModelIndex)));*/ this, SLOT(fileSelected(QModelIndex)));*/
connect(_ui.dirTree, SIGNAL(activated(QModelIndex)), connect(_ui.dirTree, SIGNAL(activated(QModelIndex)),
this, SLOT(fileSelected(QModelIndex))); this, SLOT(fileSelected(QModelIndex)));
}
CGeorgesDirTreeDialog::~CGeorgesDirTreeDialog() {
delete _dirModel;
}
void CGeorgesDirTreeDialog::fileSelected(QModelIndex index) {
QString name;
if (index.isValid() && !_dirModel->isDir(index)) {
Q_EMIT selectedForm(_dirModel->fileName(index));
} }
}
void CGeorgesDirTreeDialog::changeFile(QString file) { CGeorgesDirTreeDialog::~CGeorgesDirTreeDialog()
QModelIndex index = _dirModel->index(file); {
//_dirModel->; delete _dirModel;
_ui.dirTree->selectionModel()->select(index,QItemSelectionModel::ClearAndSelect); }
_ui.dirTree->scrollTo(index,QAbstractItemView::PositionAtCenter);
fileSelected(index);
}
void CGeorgesDirTreeDialog::ldPathChanged(QString path) { void CGeorgesDirTreeDialog::fileSelected(QModelIndex index)
_ldPath = path; {
QFileInfo info(_ldPath); QString name;
if (index.isValid() && !_dirModel->isDir(index))
{
Q_EMIT selectedForm(_dirModel->fileName(index));
}
}
delete _dirModel; void CGeorgesDirTreeDialog::changeFile(QString file)
{
QModelIndex index = _dirModel->index(file);
//_dirModel->;
_ui.dirTree->selectionModel()->select(index,QItemSelectionModel::ClearAndSelect);
_ui.dirTree->scrollTo(index,QAbstractItemView::PositionAtCenter);
fileSelected(index);
}
if (!_ldPath.isEmpty() && info.isDir()) { void CGeorgesDirTreeDialog::ldPathChanged(QString path)
_dirModel = new CFileSystemModel(_ldPath); {
_ui.dirTree->setModel(_dirModel); _ldPath = path;
_dirModel->setRootPath(_ldPath); QFileInfo info(_ldPath);
_ui.dirTree->setRootIndex(_dirModel->index(_ldPath));
} else { delete _dirModel;
_dirModel = new CFileSystemModel("");
_ui.dirTree->setModel(_dirModel); if (!_ldPath.isEmpty() && info.isDir())
_dirModel->setRootPath(QDir::currentPath()); {
_ldPath = ""; _dirModel = new CFileSystemModel(_ldPath);
_ui.dirTree->setModel(_dirModel);
_dirModel->setRootPath(_ldPath);
_ui.dirTree->setRootIndex(_dirModel->index(_ldPath));
}
else
{
_dirModel = new CFileSystemModel("");
_ui.dirTree->setModel(_dirModel);
_dirModel->setRootPath(QDir::currentPath());
_ldPath = "";
}
} }
}
} /* namespace NLQT */ } /* namespace NLQT */

@ -1,19 +1,19 @@
/* /*
Georges Editor Qt Georges Editor Qt
Copyright (C) 2010 Adrian Jaekel <aj at elane2k dot com> Copyright (C) 2010 Adrian Jaekel <aj at elane2k dot com>
This program is free software: you can redistribute it and/or modify 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 it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or the Free Software Foundation, either version 3 of the License, or
(at your option) any later version. (at your option) any later version.
This program is distributed in the hope that it will be useful, This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details. GNU General Public License for more details.
You should have received a copy of the GNU General Public License You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
#ifndef GEORGES_DIRTREE_DIALOG_H #ifndef GEORGES_DIRTREE_DIALOG_H
@ -30,34 +30,35 @@
#include "ui_georges_dirtree_form.h" #include "ui_georges_dirtree_form.h"
#include "filesystem_model.h" #include "filesystem_model.h"
namespace NLQT { namespace NLQT
class CGeorgesDirTreeDialog: public QDockWidget
{ {
Q_OBJECT
public: class CGeorgesDirTreeDialog: public QDockWidget
CGeorgesDirTreeDialog(QString ldPath, QWidget *parent = 0); {
~CGeorgesDirTreeDialog(); Q_OBJECT
private: public:
Ui::CGeorgesDirTreeDialog _ui; CGeorgesDirTreeDialog(QString ldPath, QWidget *parent = 0);
~CGeorgesDirTreeDialog();
CFileSystemModel *_dirModel; private:
QString _ldPath; Ui::CGeorgesDirTreeDialog _ui;
Q_SIGNALS:
void selectedForm(QString);
public Q_SLOTS: CFileSystemModel *_dirModel;
void ldPathChanged(QString path); QString _ldPath;
private Q_SLOTS: Q_SIGNALS:
void fileSelected(QModelIndex index); void selectedForm(QString);
void changeFile(QString file);
public Q_SLOTS:
void ldPathChanged(QString path);
private Q_SLOTS:
void fileSelected(QModelIndex index);
void changeFile(QString file);
friend class CMainWindow; friend class CMainWindow;
}; /* CGEorgesDirTreeDialog */ }; /* CGEorgesDirTreeDialog */
} /* namespace NLQT */ } /* namespace NLQT */

@ -34,12 +34,13 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include "georgesform_model.h" #include "georgesform_model.h"
#include "georgesform_proxy_model.h" #include "georgesform_proxy_model.h"
#include "formitem.h" #include "formitem.h"
#include "spindelegate.h" #include "formdelegate.h"
using namespace NLMISC; using namespace NLMISC;
using namespace NLGEORGES; using namespace NLGEORGES;
namespace NLQT { namespace NLQT
{
CGeorgesTreeViewDialog::CGeorgesTreeViewDialog(QWidget *parent /*= 0*/, bool emptyView /*= false*/) CGeorgesTreeViewDialog::CGeorgesTreeViewDialog(QWidget *parent /*= 0*/, bool emptyView /*= false*/)
: QDockWidget(parent) : QDockWidget(parent)
@ -50,7 +51,8 @@ namespace NLQT {
_ui.setupUi(this); _ui.setupUi(this);
_ui.treeViewTabWidget->setTabEnabled (2,false); _ui.treeViewTabWidget->setTabEnabled (2,false);
if (emptyView) { if (emptyView)
{
_ui.treeViewTabWidget->clear(); _ui.treeViewTabWidget->clear();
setWindowTitle("Form Area"); setWindowTitle("Form Area");
} }
@ -59,9 +61,9 @@ namespace NLQT {
_ui.checkBoxDefaults->setStyleSheet("background-color: rgba(255,0,0,30)"); _ui.checkBoxDefaults->setStyleSheet("background-color: rgba(255,0,0,30)");
_form = 0; _form = 0;
SpinBoxDelegate *spindelegate = new SpinBoxDelegate(this); FormDelegate *formdelegate = new FormDelegate(this);
_ui.treeView->setItemDelegateForColumn(1, spindelegate); _ui.treeView->setItemDelegateForColumn(1, formdelegate);
connect(_ui.treeView, SIGNAL(doubleClicked (QModelIndex)), connect(_ui.treeView, SIGNAL(doubleClicked (QModelIndex)),
this, SLOT(doubleClicked (QModelIndex))); this, SLOT(doubleClicked (QModelIndex)));
@ -77,15 +79,18 @@ namespace NLQT {
//settings.setValue("dirViewGeometry", saveGeometry()); //settings.setValue("dirViewGeometry", saveGeometry());
} }
void CGeorgesTreeViewDialog::selectedForm(QString formName) { void CGeorgesTreeViewDialog::selectedForm(QString formName)
{
_form = Modules::georges().loadForm(formName.toStdString()); _form = Modules::georges().loadForm(formName.toStdString());
if (_form) { if (_form)
{
UFormElm *root = 0; UFormElm *root = 0;
root = &_form->getRootNode(); root = &_form->getRootNode();
QStringList parents; QStringList parents;
for (uint i = 0; i < _form->getNumParent(); i++) { for (uint i = 0; i < _form->getNumParent(); i++)
{
UForm *u = _form->getParentForm(i); UForm *u = _form->getParentForm(i);
parents << u->getFilename().c_str(); parents << u->getFilename().c_str();
} }
@ -93,7 +98,8 @@ namespace NLQT {
QString comments; QString comments;
comments = _form->getComment().c_str(); comments = _form->getComment().c_str();
if (!comments.isEmpty()) { if (!comments.isEmpty())
{
_ui.treeViewTabWidget->setTabEnabled (1,true); _ui.treeViewTabWidget->setTabEnabled (1,true);
_ui.commentEdit->setPlainText(comments); _ui.commentEdit->setPlainText(comments);
} }
@ -103,16 +109,18 @@ namespace NLQT {
_form->getDependencies(dependencies); _form->getDependencies(dependencies);
QMap< QString, QStringList> deps; QMap< QString, QStringList> deps;
Q_FOREACH(std::string str, dependencies) { Q_FOREACH(std::string str, dependencies)
{
QString file = str.c_str(); QString file = str.c_str();
if (file == formName) continue; if (file == formName) continue;
deps[file.remove(0,file.indexOf(".")+1)] << str.c_str(); deps[file.remove(0,file.indexOf(".")+1)] << str.c_str();
} }
nlinfo("typ's %d",deps["typ"].count()); nlinfo("typ's %d",deps["typ"].count());
nlinfo("dfn's %d",deps["dfn"].count()); nlinfo("dfn's %d",deps["dfn"].count());
//nlwarning(strList.join(";").toStdString().c_str()); //nlwarning(strList.join(";").toStdString().c_str());
if (root) { if (root)
{
loadedForm = formName; loadedForm = formName;
CGeorgesFormModel *model = new CGeorgesFormModel(root,deps,comments,parents); CGeorgesFormModel *model = new CGeorgesFormModel(root,deps,comments,parents);
@ -137,8 +145,10 @@ namespace NLQT {
} }
} }
void CGeorgesTreeViewDialog::modifiedFile( ) { void CGeorgesTreeViewDialog::modifiedFile( )
if (!_modified) { {
if (!_modified)
{
_modified = true; _modified = true;
setWindowTitle(windowTitle()+"*"); setWindowTitle(windowTitle()+"*");
Modules::mainWin().setWindowTitle(Modules::mainWin().windowTitle()+"*"); Modules::mainWin().setWindowTitle(Modules::mainWin().windowTitle()+"*");
@ -146,13 +156,17 @@ namespace NLQT {
} }
} }
void CGeorgesTreeViewDialog::write( ) { void CGeorgesTreeViewDialog::write( )
{
COFile file; COFile file;
std::string s = CPath::lookup(loadedForm.toStdString()); std::string s = CPath::lookup(loadedForm.toStdString());
if (file.open (s)) { if (file.open (s))
try { {
if (loadedForm.contains(".typ")) { try
{
if (loadedForm.contains(".typ"))
{
//nlassert (Type != NULL); //nlassert (Type != NULL);
//// Write the file //// Write the file
@ -167,7 +181,9 @@ namespace NLQT {
//flushValueChange (); //flushValueChange ();
//UpdateAllViews (NULL); //UpdateAllViews (NULL);
//return TRUE; //return TRUE;
} else if (loadedForm.contains(".dfn")) { }
else if (loadedForm.contains(".dfn"))
{
//nlassert (Dfn != NULL); //nlassert (Dfn != NULL);
//// Write the file //// Write the file
@ -180,13 +196,15 @@ namespace NLQT {
//modify (NULL, NULL, false); //modify (NULL, NULL, false);
//UpdateAllViews (NULL); //UpdateAllViews (NULL);
//return TRUE; //return TRUE;
} else { }
else
{
nlassert (_form != NULL); nlassert (_form != NULL);
// Write the file // Write the file
/*if (IsModified ()) /*if (IsModified ())
{ {
((CForm*)(UForm*)Form)->Header.MinorVersion++; ((CForm*)(UForm*)Form)->Header.MinorVersion++;
}*/ }*/
//((CForm*)(UForm*)Form)->write (xmlStream.getDocument (), lpszPathName, theApp.Georges4CVS); //((CForm*)(UForm*)Form)->write (xmlStream.getDocument (), lpszPathName, theApp.Georges4CVS);
_form->write(file, false); _form->write(file, false);
@ -196,7 +214,7 @@ namespace NLQT {
//{ //{
// char message[512]; // char message[512];
// smprintf (message, 512, "Error while saving file: %s", xmlStream.getErrorString ()); // smprintf (message, 512, "Error while saving file: %s", xmlStream.getErrorString ());
//theApp.outputError (message); //theApp.outputError (message);
//} //}
//modify (NULL, NULL, false); //modify (NULL, NULL, false);
//flushValueChange (); //flushValueChange ();
@ -205,16 +223,23 @@ namespace NLQT {
// Get the left view // Get the left view
//CView* pView = getLeftView (); //CView* pView = getLeftView ();
} }
} catch (Exception &e) { }
catch (Exception &e)
{
nlerror("Error while loading file: %s", e.what()); nlerror("Error while loading file: %s", e.what());
} }
} else { //if (!file.open()) }
else
{ //if (!file.open())
nlerror("Can't open the file %s for writing.", s); nlerror("Can't open the file %s for writing.", s);
} }
} }
void CGeorgesTreeViewDialog::doubleClicked ( const QModelIndex & index ) { void CGeorgesTreeViewDialog::doubleClicked ( const QModelIndex & index )
if (index.column() == 1) return; {
if (index.column() == 1)
return;
CFormItem *item = static_cast<CFormItem*>(index.internalPointer()); CFormItem *item = static_cast<CFormItem*>(index.internalPointer());
QString value = item->data(1).toString(); QString value = item->data(1).toString();
@ -222,7 +247,8 @@ namespace NLQT {
if (!path.isEmpty() && !path.contains(".shape")) if (!path.isEmpty() && !path.contains(".shape"))
Q_EMIT changeFile(path); Q_EMIT changeFile(path);
if (path.contains(".shape")) { if (path.contains(".shape"))
{
Modules::objView().resetScene(); Modules::objView().resetScene();
Modules::config().configRemapExtensions(); Modules::config().configRemapExtensions();
Modules::objView().loadMesh(path.toStdString(),""); Modules::objView().loadMesh(path.toStdString(),"");
@ -230,37 +256,55 @@ namespace NLQT {
int i = 0; int i = 0;
} }
void CGeorgesTreeViewDialog::closeEvent(QCloseEvent *event) { void CGeorgesTreeViewDialog::closeEvent(QCloseEvent *event)
if (Modules::mainWin().getEmptyView() == this) { {
if (Modules::mainWin().getEmptyView() == this)
{
event->ignore(); event->ignore();
} else { }
else
{
Modules::mainWin().getTreeViewList().removeOne(this); Modules::mainWin().getTreeViewList().removeOne(this);
if(!Modules::mainWin().getTreeViewList().size()) { if(!Modules::mainWin().getTreeViewList().size())
{
Modules::mainWin().createEmptyView(); Modules::mainWin().createEmptyView();
} }
deleteLater(); deleteLater();
} }
} }
void CGeorgesTreeViewDialog::showParentRows(int newState) { void CGeorgesTreeViewDialog::showParentRows(int newState)
{
CGeorgesFormProxyModel * mp = dynamic_cast<CGeorgesFormProxyModel *>(_ui.treeView->model()); CGeorgesFormProxyModel * mp = dynamic_cast<CGeorgesFormProxyModel *>(_ui.treeView->model());
CGeorgesFormModel *m = qobject_cast<CGeorgesFormModel *>(mp->sourceModel()); CGeorgesFormModel *m = dynamic_cast<CGeorgesFormModel *>(mp->sourceModel());
for (int i = 0; i < m->rowCount(); i++) { for (int i = 0; i < m->rowCount(); i++)
{
const QModelIndex in = m->index(i,0); const QModelIndex in = m->index(i,0);
if (m->getItem(in)->nodeFrom() == UFormElm::NodeParentForm) { if (m->getItem(in)->nodeFrom() == UFormElm::NodeParentForm)
if (newState == Qt::Checked) { {
if (newState == Qt::Checked)
{
_ui.treeView->setRowHidden(in.row(),in.parent(),false); _ui.treeView->setRowHidden(in.row(),in.parent(),false);
} else { }
else
{
_ui.treeView->setRowHidden(in.row(),in.parent(),true); _ui.treeView->setRowHidden(in.row(),in.parent(),true);
} }
} else { // search childs // recursive? }
for (int j = 0; j < m->rowCount(in); j++) { else
{ // search childs // recursive?
for (int j = 0; j < m->rowCount(in); j++)
{
const QModelIndex in2 = m->index(j,0,in); const QModelIndex in2 = m->index(j,0,in);
if (m->getItem(in2)->nodeFrom() == UFormElm::NodeParentForm) { if (m->getItem(in2)->nodeFrom() == UFormElm::NodeParentForm)
if (newState == Qt::Checked) { {
if (newState == Qt::Checked)
{
_ui.treeView->setRowHidden(in2.row(),in,false); _ui.treeView->setRowHidden(in2.row(),in,false);
} else { }
else
{
_ui.treeView->setRowHidden(in2.row(),in,true); _ui.treeView->setRowHidden(in2.row(),in,true);
} }
} }
@ -268,4 +312,5 @@ namespace NLQT {
} // end of search childs } // end of search childs
} }
} }
} /* namespace NLQT */ } /* namespace NLQT */

@ -37,7 +37,8 @@ namespace NLGEORGES
using namespace NLGEORGES; using namespace NLGEORGES;
namespace NLQT { namespace NLQT
{
class CGeorgesTreeViewDialog: public QDockWidget class CGeorgesTreeViewDialog: public QDockWidget
{ {

@ -1,19 +1,19 @@
/* /*
Georges Editor Qt Georges Editor Qt
Copyright (C) 2010 Adrian Jaekel <aj at elane2k dot com> Copyright (C) 2010 Adrian Jaekel <aj at elane2k dot com>
This program is free software: you can redistribute it and/or modify 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 it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or the Free Software Foundation, either version 3 of the License, or
(at your option) any later version. (at your option) any later version.
This program is distributed in the hope that it will be useful, This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details. GNU General Public License for more details.
You should have received a copy of the GNU General Public License You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
#include "georgesform_model.h" #include "georgesform_model.h"
@ -38,79 +38,89 @@
using namespace NLGEORGES; using namespace NLGEORGES;
namespace NLQT { namespace NLQT
{
CGeorgesFormModel::CGeorgesFormModel(UFormElm *rootElm, QMap< QString, QStringList> deps, CGeorgesFormModel::CGeorgesFormModel(UFormElm *rootElm, QMap< QString, QStringList> deps,
QString comment, QStringList parents, QObject *parent) : QAbstractItemModel(parent) { QString comment, QStringList parents, QObject *parent) : QAbstractItemModel(parent)
{
QList<QVariant> rootData; QList<QVariant> rootData;
rootData << "Value" << "Data" << "Extra" << "Type"; rootData << "Value" << "Data" << "Extra" << "Type";
_rootElm = rootElm; _rootElm = rootElm;
_rootItem = new CFormItem(_rootElm, rootData); _rootItem = new CFormItem(_rootElm, rootData);
_dependencies = deps; _dependencies = deps;
_comments = comment; _comments = comment;
_parents = parents; _parents = parents;
_parentRows = new QList<const QModelIndex*>; _parentRows = new QList<const QModelIndex*>;
setupModelData(); setupModelData();
} }
CGeorgesFormModel::~CGeorgesFormModel() { CGeorgesFormModel::~CGeorgesFormModel()
{
delete _rootItem; delete _rootItem;
} }
/******************************************************************************/ /******************************************************************************/
QVariant CGeorgesFormModel::data(const QModelIndex &p_index, int p_role) const { QVariant CGeorgesFormModel::data(const QModelIndex &p_index, int p_role) const
{
if (!p_index.isValid()) if (!p_index.isValid())
return QVariant(); return QVariant();
switch (p_role) { switch (p_role)
case Qt::DisplayRole: {
{ case Qt::DisplayRole:
return getItem(p_index)->data(p_index.column()); {
} return getItem(p_index)->data(p_index.column());
case Qt::BackgroundRole: }
{ case Qt::BackgroundRole:
if (getItem(p_index)->valueFrom() == UFormElm::ValueDefaultDfn) {
return QBrush(QColor(255,0,0,30)); if (getItem(p_index)->valueFrom() == UFormElm::ValueDefaultDfn)
if (getItem(p_index)->nodeFrom() == UFormElm::NodeParentForm) return QBrush(QColor(255,0,0,30));
return QBrush(QColor(0,255,0,30)); if (getItem(p_index)->nodeFrom() == UFormElm::NodeParentForm)
return QVariant(); return QBrush(QColor(0,255,0,30));
} return QVariant();
case Qt::DecorationRole: }
case Qt::DecorationRole:
{
if (p_index.column() == 2)
{ {
if (p_index.column() == 2) { //p_index.
//p_index. QModelIndex in = index(p_index.row(),p_index.column()-1,p_index.parent());
QModelIndex in = index(p_index.row(),p_index.column()-1,p_index.parent()); CFormItem *item = getItem(in);
CFormItem *item = getItem(in);
QString value = item->data(1).toString();
QString value = item->data(1).toString(); //QString path = NLMISC::CPath::lookup(value.toStdString(),false).c_str();
//QString path = NLMISC::CPath::lookup(value.toStdString(),false).c_str();
if (value.contains(".shape"))
if (value.contains(".shape")) { {
return QIcon(":/images/pqrticles.png"); return QIcon(":/images/pqrticles.png");
} else if(value.contains(".tga") || value.contains(".png")) { }
qDebug() << p_index << p_role; else if(value.contains(".tga") || value.contains(".png"))
QString path = NLMISC::CPath::lookup(value.toStdString(),false).c_str(); {
return QIcon(":/images/pqrticles.png"); qDebug() << p_index << p_role;
} QString path = NLMISC::CPath::lookup(value.toStdString(),false).c_str();
return QIcon(":/images/pqrticles.png");
} }
return QVariant();
break;
} }
default:
return QVariant(); return QVariant();
break;
}
default:
return QVariant();
} }
} }
/******************************************************************************/ /******************************************************************************/
CFormItem *CGeorgesFormModel::getItem(const QModelIndex &index) const { CFormItem *CGeorgesFormModel::getItem(const QModelIndex &index) const
if (index.isValid()) { {
if (index.isValid())
{
CFormItem *item = static_cast<CFormItem*>(index.internalPointer()); CFormItem *item = static_cast<CFormItem*>(index.internalPointer());
if (item) return item; if (item)
return item;
} }
return _rootItem; return _rootItem;
} }
@ -118,18 +128,19 @@ namespace NLQT {
/******************************************************************************/ /******************************************************************************/
bool CGeorgesFormModel::setData(const QModelIndex &index, const QVariant &value, bool CGeorgesFormModel::setData(const QModelIndex &index, const QVariant &value,
int role) { int role)
{
if (role != Qt::EditRole) if (role != Qt::EditRole)
return false; return false;
CFormItem *item = getItem(index); CFormItem *item = getItem(index);
bool result = item->setData(index.column(), value); bool result = item->setData(index.column(), value);
if (result) if (result)
Q_EMIT dataChanged(index, index); Q_EMIT dataChanged(index, index);
return result; return result;
} }
/******************************************************************************/ /******************************************************************************/
@ -142,7 +153,7 @@ namespace NLQT {
Qt::ItemFlags returnValue = Qt::ItemIsSelectable | Qt::ItemIsEnabled; Qt::ItemFlags returnValue = Qt::ItemIsSelectable | Qt::ItemIsEnabled;
if(index.column() == 1) if(index.column() == 1)
returnValue |= Qt::ItemIsEditable; returnValue |= Qt::ItemIsEditable;
return returnValue; return returnValue;
@ -229,21 +240,25 @@ namespace NLQT {
/******************************************************************************/ /******************************************************************************/
void CGeorgesFormModel::loadFormData(UFormElm *root, CFormItem *parent) { void CGeorgesFormModel::loadFormData(UFormElm *root, CFormItem *parent) {
if (!root) return; if (!root)
return;
uint num = 0; uint num = 0;
UFormElm::TWhereIsNode *whereN = new UFormElm::TWhereIsNode; UFormElm::TWhereIsNode *whereN = new UFormElm::TWhereIsNode;
UFormElm::TWhereIsValue *whereV = new UFormElm::TWhereIsValue; UFormElm::TWhereIsValue *whereV = new UFormElm::TWhereIsValue;
if (root->isStruct()) { if (root->isStruct())
{
//((CFormElm*)root)->getForm()->getComment(); //((CFormElm*)root)->getForm()->getComment();
uint structSize = 0; uint structSize = 0;
root->getStructSize(structSize); root->getStructSize(structSize);
while (num < structSize) { while (num < structSize)
{
// Append a new item to the current parent's list of children. // Append a new item to the current parent's list of children.
std::string elmName; std::string elmName;
if(root->getStructNodeName(num, elmName)) { if(root->getStructNodeName(num, elmName))
{
QList<QVariant> columnData; QList<QVariant> columnData;
//QVariant value; //QVariant value;
std::string value; std::string value;
@ -253,8 +268,10 @@ namespace NLQT {
//double value_double; //double value_double;
QString elmtType = ""; QString elmtType = "";
UFormElm *elmt = 0; UFormElm *elmt = 0;
if(root->getNodeByName(&elmt, elmName.c_str(), whereN, true)) { if(root->getNodeByName(&elmt, elmName.c_str(), whereN, true))
if (elmt) { {
if (elmt)
{
if (elmt->isArray()) if (elmt->isArray())
elmtType = "Array"; elmtType = "Array";
if (elmt->isStruct()) if (elmt->isStruct())
@ -263,43 +280,50 @@ namespace NLQT {
elmtType = "Atom"; elmtType = "Atom";
uint numDefinitions = 0; uint numDefinitions = 0;
const UType *type = elmt->getType(); const UType *type = elmt->getType();
if (type) { if (type)
{
numDefinitions = type->getNumDefinition(); numDefinitions = type->getNumDefinition();
root->getValueByName(value, elmName.c_str(),UFormElm::Eval,whereV); root->getValueByName(value, elmName.c_str(),UFormElm::Eval,whereV);
switch (type->getType()) { switch (type->getType())
case UType::UnsignedInt: {
value = QString("%1").arg(QString("%1").arg(value.c_str()).toDouble()).toStdString(); case UType::UnsignedInt:
elmtType.append("_uint");break; value = QString("%1").arg(QString("%1").arg(value.c_str()).toDouble()).toStdString();
case UType::SignedInt: elmtType.append("_uint");break;
value = QString("%1").arg(QString("%1").arg(value.c_str()).toDouble()).toStdString(); case UType::SignedInt:
elmtType.append("_sint");break; value = QString("%1").arg(QString("%1").arg(value.c_str()).toDouble()).toStdString();
case UType::Double: elmtType.append("_sint");break;
value = QString("%1").arg(QString("%1").arg(value.c_str()).toDouble(),0,'f',1).toStdString(); case UType::Double:
elmtType.append("_double");break; value = QString("%1").arg(QString("%1").arg(value.c_str()).toDouble(),0,'f',1).toStdString();
case UType::String: elmtType.append("_double");break;
elmtType.append("_string");break; case UType::String:
case UType::Color: elmtType.append("_string");break;
elmtType.append("_color");break; case UType::Color:
default: elmtType.append("_color");break;
elmtType.append("_unknownType"); default:
elmtType.append("_unknownType");
} }
} }
if (numDefinitions) { if (numDefinitions)
{
std::string l, v; std::string l, v;
QString tmpLabel, tmpValue; QString tmpLabel, tmpValue;
for (uint i = 0; i < numDefinitions; i++) { for (uint i = 0; i < numDefinitions; i++)
{
type->getDefinition(i,l,v); type->getDefinition(i,l,v);
tmpLabel = l.c_str(); tmpLabel = l.c_str();
tmpValue = v.c_str(); tmpValue = v.c_str();
if (type->getType() == UType::SignedInt) { if (type->getType() == UType::SignedInt)
{
if (QString("%1").arg(value.c_str()).toDouble() == tmpValue.toDouble()) { if (QString("%1").arg(value.c_str()).toDouble() == tmpValue.toDouble()) {
value = l; value = l;
break; break;
} }
} }
if (type->getType() == UType::String) { if (type->getType() == UType::String)
if (QString(value.c_str()) == tmpValue) { {
if (QString(value.c_str()) == tmpValue)
{
value = l; value = l;
break; break;
} }
@ -307,11 +331,13 @@ namespace NLQT {
} }
} }
} }
if (elmt->isVirtualStruct()){ if (elmt->isVirtualStruct())
{
root->getValueByName(value, elmName.c_str(),UFormElm::Eval,whereV); root->getValueByName(value, elmName.c_str(),UFormElm::Eval,whereV);
elmtType = "VirtualStruct"; elmtType = "VirtualStruct";
} }
switch (*whereN) { switch (*whereN)
{
case UFormElm::NodeForm: case UFormElm::NodeForm:
elmtType.append("_fromForm"); break; elmtType.append("_fromForm"); break;
case UFormElm::NodeParentForm: case UFormElm::NodeParentForm:
@ -323,7 +349,8 @@ namespace NLQT {
default: default:
elmtType.append("_noNode"); elmtType.append("_noNode");
} }
switch (*whereV) { switch (*whereV)
{
case UFormElm::ValueForm: case UFormElm::ValueForm:
elmtType.append("_formValue"); break; elmtType.append("_formValue"); break;
case UFormElm::ValueParentForm: case UFormElm::ValueParentForm:
@ -341,36 +368,43 @@ namespace NLQT {
// parents << parents.last()->child(parents.last()->childCount()-1); // parents << parents.last()->child(parents.last()->childCount()-1);
//} //}
loadFormData(elmt, parent->child(parent->childCount()-1)); loadFormData(elmt, parent->child(parent->childCount()-1));
} else { }
else
{
// add Defaults // add Defaults
//columnData << QString(elmName.c_str()) << QString("default") << QString("default"); //columnData << QString(elmName.c_str()) << QString("default") << QString("default");
//parent->appendChild(new CFormItem(elmt, columnData, parent, UFormElm::ValueDefaultDfn, UFormElm::NodeDfn)); //parent->appendChild(new CFormItem(elmt, columnData, parent, UFormElm::ValueDefaultDfn, UFormElm::NodeDfn));
} }
} }
} }
num++; num++;
} }
} }
if (root->isArray()) { if (root->isArray())
{
uint arraySize = 0; uint arraySize = 0;
root->getArraySize(arraySize); root->getArraySize(arraySize);
while (num < arraySize) { while (num < arraySize)
{
std::string elmName; std::string elmName;
if(root->getArrayNodeName(elmName, num)) { if(root->getArrayNodeName(elmName, num))
{
QList<QVariant> columnData; QList<QVariant> columnData;
std::string value; std::string value;
QString elmtType = ""; QString elmtType = "";
//root->getValueByName(value, elmName.c_str()); //root->getValueByName(value, elmName.c_str());
UFormElm *elmt = 0; UFormElm *elmt = 0;
if(root->getArrayNode(&elmt,0) && elmt) { if(root->getArrayNode(&elmt,0) && elmt)
{
if (elmt->isArray()) if (elmt->isArray())
elmtType = "Array"; elmtType = "Array";
if (elmt->isStruct()) { if (elmt->isStruct()) {
elmtType = "Struct"; elmtType = "Struct";
} }
if (elmt->isAtom()) { if (elmt->isAtom())
{
elmt->getValue(value); elmt->getValue(value);
elmtType = "Atom"; elmtType = "Atom";
} }
@ -388,14 +422,16 @@ namespace NLQT {
/******************************************************************************/ /******************************************************************************/
void CGeorgesFormModel::loadFormHeader() { void CGeorgesFormModel::loadFormHeader()
{
CFormItem *fi_pars = new CFormItem(_rootElm, QList<QVariant>() << "parents", _rootItem); CFormItem *fi_pars = new CFormItem(_rootElm, QList<QVariant>() << "parents", _rootItem);
_rootItem->appendChild(fi_pars); _rootItem->appendChild(fi_pars);
Q_FOREACH(QString str, _parents) { Q_FOREACH(QString str, _parents)
fi_pars->appendChild(new CFormItem(_rootElm, QList<QVariant>() << str, fi_pars)); {
} fi_pars->appendChild(new CFormItem(_rootElm, QList<QVariant>() << str, fi_pars));
}
/*QStringList dfns = _dependencies["dfn"]; /*QStringList dfns = _dependencies["dfn"];
QStringList typs = _dependencies["typ"]; QStringList typs = _dependencies["typ"];
@ -407,33 +443,34 @@ namespace NLQT {
_rootItem->appendChild(fi_dep); _rootItem->appendChild(fi_dep);
if (!dfns.isEmpty()) { if (!dfns.isEmpty()) {
CFormItem *fi_dfn = new CFormItem(_rootElm, QList<QVariant>() << "dfn", fi_dep); CFormItem *fi_dfn = new CFormItem(_rootElm, QList<QVariant>() << "dfn", fi_dep);
fi_dep->appendChild(fi_dfn); fi_dep->appendChild(fi_dfn);
foreach(QString str, dfns) { foreach(QString str, dfns) {
fi_dfn->appendChild(new CFormItem(_rootElm, QList<QVariant>() << str, fi_dfn)); fi_dfn->appendChild(new CFormItem(_rootElm, QList<QVariant>() << str, fi_dfn));
} }
} }
if (!typs.isEmpty()) { if (!typs.isEmpty()) {
CFormItem *fi_typ = new CFormItem(_rootElm, QList<QVariant>() << "typ", fi_dep); CFormItem *fi_typ = new CFormItem(_rootElm, QList<QVariant>() << "typ", fi_dep);
fi_dep->appendChild(fi_typ); fi_dep->appendChild(fi_typ);
foreach(QString str, typs) { foreach(QString str, typs) {
fi_typ->appendChild(new CFormItem(_rootElm, QList<QVariant>() << str, fi_typ)); fi_typ->appendChild(new CFormItem(_rootElm, QList<QVariant>() << str, fi_typ));
} }
} }
if (!_dependencies.isEmpty()) { if (!_dependencies.isEmpty()) {
CFormItem *fi_other = new CFormItem(_rootElm, QList<QVariant>() << "other", fi_dep); CFormItem *fi_other = new CFormItem(_rootElm, QList<QVariant>() << "other", fi_dep);
fi_dep->appendChild(fi_other); fi_dep->appendChild(fi_other);
foreach(QStringList list, _dependencies) { foreach(QStringList list, _dependencies) {
foreach(QString str, list) { foreach(QString str, list) {
fi_other->appendChild(new CFormItem(_rootElm, QList<QVariant>() << str, fi_other)); fi_other->appendChild(new CFormItem(_rootElm, QList<QVariant>() << str, fi_other));
} }
} }
}*/ }*/
} }
/******************************************************************************/ /******************************************************************************/
void CGeorgesFormModel::setupModelData() { void CGeorgesFormModel::setupModelData()
{
loadFormHeader(); loadFormHeader();
loadFormData(_rootElm, _rootItem); loadFormData(_rootElm, _rootItem);
} }

@ -32,12 +32,13 @@ namespace NLGEORGES {
class UFormElm; class UFormElm;
} }
namespace NLQT { namespace NLQT
{
class CFormItem; class CFormItem;
class CGeorgesFormModel : public QAbstractItemModel { class CGeorgesFormModel : public QAbstractItemModel
Q_OBJECT {
public: public:
CGeorgesFormModel(NLGEORGES::UFormElm *root, QMap< QString, QStringList> deps, CGeorgesFormModel(NLGEORGES::UFormElm *root, QMap< QString, QStringList> deps,

@ -21,7 +21,8 @@
// NeL includes // NeL includes
#include <nel/misc/debug.h> #include <nel/misc/debug.h>
namespace NLQT { namespace NLQT
{
bool CGeorgesFormProxyModel::filterAcceptsRow(int sourceRow, bool CGeorgesFormProxyModel::filterAcceptsRow(int sourceRow,
const QModelIndex &sourceParent) const const QModelIndex &sourceParent) const

@ -23,13 +23,19 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
// Qt includes // Qt includes
#include <QSortFilterProxyModel> #include <QSortFilterProxyModel>
namespace NLQT { namespace NLQT
{
class CGeorgesFormProxyModel : public QSortFilterProxyModel
{
class CGeorgesFormProxyModel : public QSortFilterProxyModel {
public: public:
CGeorgesFormProxyModel(QObject *parent = 0): QSortFilterProxyModel(parent){} CGeorgesFormProxyModel(QObject *parent = 0): QSortFilterProxyModel(parent)
~CGeorgesFormProxyModel() {} {
}
~CGeorgesFormProxyModel()
{
}
protected: protected:
virtual bool filterAcceptsColumn ( int source_column, const QModelIndex & source_parent ) const ; virtual bool filterAcceptsColumn ( int source_column, const QModelIndex & source_parent ) const ;

@ -30,10 +30,12 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
// Project includes // Project includes
#include "qt_displayer.h" #include "qt_displayer.h"
namespace NLQT { namespace NLQT
{
CGeorgesLogDialog::CGeorgesLogDialog(QWidget *parent): CGeorgesLogDialog::CGeorgesLogDialog(QWidget *parent):
QDockWidget(parent){ QDockWidget(parent)
{
_ui.setupUi(this); _ui.setupUi(this);
@ -46,7 +48,8 @@ namespace NLQT {
} }
CGeorgesLogDialog::~CGeorgesLogDialog() { CGeorgesLogDialog::~CGeorgesLogDialog()
{
NLMISC::ErrorLog->removeDisplayer(_displayer); NLMISC::ErrorLog->removeDisplayer(_displayer);
NLMISC::WarningLog->removeDisplayer(_displayer); NLMISC::WarningLog->removeDisplayer(_displayer);
NLMISC::DebugLog->removeDisplayer(_displayer); NLMISC::DebugLog->removeDisplayer(_displayer);

@ -1,19 +1,19 @@
/* /*
Georges Editor Qt Georges Editor Qt
Copyright (C) 2010 Adrian Jaekel <aj at elane2k dot com> Copyright (C) 2010 Adrian Jaekel <aj at elane2k dot com>
This program is free software: you can redistribute it and/or modify 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 it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or the Free Software Foundation, either version 3 of the License, or
(at your option) any later version. (at your option) any later version.
This program is distributed in the hope that it will be useful, This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details. GNU General Public License for more details.
You should have received a copy of the GNU General Public License You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
#ifndef LOG_DIALOG_H #ifndef LOG_DIALOG_H
@ -30,24 +30,24 @@
// Project includes // Project includes
#include "ui_log_form.h" #include "ui_log_form.h"
namespace NLQT { namespace NLQT
class CQtDisplayer;
class CGeorgesLogDialog: public QDockWidget
{ {
Q_OBJECT class CQtDisplayer;
class CGeorgesLogDialog: public QDockWidget
{
public: public:
CGeorgesLogDialog(QWidget *parent = 0); CGeorgesLogDialog(QWidget *parent = 0);
~CGeorgesLogDialog(); ~CGeorgesLogDialog();
private: private:
Ui::CGeorgesLogDialog _ui; Ui::CGeorgesLogDialog _ui;
CQtDisplayer *_displayer; CQtDisplayer *_displayer;
friend class CMainWindow; friend class CMainWindow;
}; /* CGeorgesLogDialog */ }; /* CGeorgesLogDialog */
} /* namespace NLQT */ } /* namespace NLQT */

@ -33,33 +33,37 @@
using namespace std; using namespace std;
using namespace NLMISC; using namespace NLMISC;
namespace NLQT { namespace NLQT
{
namespace { namespace
{
CFileDisplayer *s_FileDisplayer = NULL; CFileDisplayer *s_FileDisplayer = NULL;
} /* anonymous namespace */ } /* anonymous namespace */
} /* namespace NLQT */ } /* namespace NLQT */
void messageHandler(QtMsgType p_type, const char* p_msg) { void messageHandler(QtMsgType p_type, const char* p_msg)
{
fprintf(stderr, "%s\n", p_msg); fprintf(stderr, "%s\n", p_msg);
QFile file("qt.log"); QFile file("qt.log");
file.open(QIODevice::WriteOnly | QIODevice::Append | QIODevice::Text); file.open(QIODevice::WriteOnly | QIODevice::Append | QIODevice::Text);
QChar code; QChar code;
switch (p_type) { switch (p_type)
case QtDebugMsg: code = 'D'; break; {
case QtWarningMsg: code = 'W'; break; case QtDebugMsg: code = 'D'; break;
case QtCriticalMsg: code = 'C'; break; case QtWarningMsg: code = 'W'; break;
case QtFatalMsg: code = 'F'; break; case QtCriticalMsg: code = 'C'; break;
} case QtFatalMsg: code = 'F'; break;
QString dt = QDateTime::currentDateTime().toString("yyyyMMdd hh:mm:ss"); }
QString dt = QDateTime::currentDateTime().toString("yyyyMMdd hh:mm:ss");
QTextStream(&file) << QString("%1 [%2] %3\n").arg(dt).arg(code).arg(QString(p_msg)); QTextStream(&file) << QString("%1 [%2] %3\n").arg(dt).arg(code).arg(QString(p_msg));
} }
#ifndef DATA_DIR #ifndef DATA_DIR
@ -77,12 +81,12 @@ void messageHandler(QtMsgType p_type, const char* p_msg) {
sint main(int argc, char **argv) sint main(int argc, char **argv)
{ {
// go nel! // go nel!
{ {
// use log.log if NEL_LOG_IN_FILE and NLQT_USE_LOG_LOG defined as 1 // use log.log if NEL_LOG_IN_FILE and NLQT_USE_LOG_LOG defined as 1
createDebug(NULL, NLQT_USE_LOG_LOG, false); createDebug(NULL, NLQT_USE_LOG_LOG, false);
if (QFile::exists("qt.log")) if (QFile::exists("qt.log"))
QFile::remove("qt.log"); QFile::remove("qt.log");
qInstallMsgHandler(messageHandler); qInstallMsgHandler(messageHandler);
#if NLQT_USE_LOG #if NLQT_USE_LOG
@ -101,12 +105,12 @@ sint main(int argc, char **argv)
#endif #endif
nlinfo("Welcome to NeL!"); nlinfo("Welcome to NeL!");
NLMISC::CPath::remapExtension("tga", "png", true); NLMISC::CPath::remapExtension("tga", "png", true);
} }
QApplication app(argc, argv); QApplication app(argc, argv);
Modules::init(); Modules::init();
//Modules::mainWin().resize(800,600); //Modules::mainWin().resize(800,600);
Modules::mainWin().show(); Modules::mainWin().show();

@ -1,19 +1,19 @@
/* /*
Georges Editor Qt Georges Editor Qt
Copyright (C) 2010 Adrian Jaekel <aj at elane2k dot com> Copyright (C) 2010 Adrian Jaekel <aj at elane2k dot com>
This program is free software: you can redistribute it and/or modify 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 it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or the Free Software Foundation, either version 3 of the License, or
(at your option) any later version. (at your option) any later version.
This program is distributed in the hope that it will be useful, This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details. GNU General Public License for more details.
You should have received a copy of the GNU General Public License You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
#include "main_window.h" #include "main_window.h"
@ -36,453 +36,473 @@
using namespace std; using namespace std;
using namespace NLMISC; using namespace NLMISC;
namespace NLQT { namespace NLQT
{
CMainWindow::CMainWindow(QWidget *parent)
: QMainWindow(parent), _GeorgesLogDialog(0), _ObjectViewerDialog(0),
_GeorgesDirTreeDialog(0)
{
setWindowTitle("Qt Georges Editor");
CMainWindow::CMainWindow(QWidget *parent) setDockNestingEnabled(true);
: QMainWindow(parent), setCentralWidget(0);
_GeorgesLogDialog(0), _ObjectViewerDialog(0), setCorner(Qt::TopLeftCorner, Qt::LeftDockWidgetArea);
_GeorgesDirTreeDialog(0) setCorner(Qt::BottomLeftCorner, Qt::LeftDockWidgetArea);
{
setWindowTitle("Qt Georges Editor"); // create log dock widget
_GeorgesLogDialog = new CGeorgesLogDialog(this);
setDockNestingEnabled(true); addDockWidget(Qt::RightDockWidgetArea, _GeorgesLogDialog);
setCentralWidget(0);
setCorner(Qt::TopLeftCorner, Qt::LeftDockWidgetArea); // empty form view as placeholder
setCorner(Qt::BottomLeftCorner, Qt::LeftDockWidgetArea); createEmptyView();
_currentView = 0;
// create log dock widget
_GeorgesLogDialog = new CGeorgesLogDialog(this); // load and set leveldesign path from config
addDockWidget(Qt::RightDockWidgetArea, _GeorgesLogDialog); QString ldPath = Modules::config().configLeveldesignPath().c_str();
QFileInfo info(ldPath);
// empty form view as placeholder if (!info.isDir())
createEmptyView(); ldPath = "";
_currentView = 0;
// create georges dir dock widget
// load and set leveldesign path from config _GeorgesDirTreeDialog = new CGeorgesDirTreeDialog(ldPath, this);
QString ldPath = Modules::config().configLeveldesignPath().c_str(); addDockWidget(Qt::LeftDockWidgetArea, _GeorgesDirTreeDialog);
QFileInfo info(ldPath); if (ldPath == "")
if (!info.isDir()) ldPath = ""; {
if (QMessageBox::information(this, tr("Missing leveldesign path"),
// create georges dir dock widget tr("Your leveldesign path seems to be empty or incorrect.\nDo you want to set it now?"),
_GeorgesDirTreeDialog = new CGeorgesDirTreeDialog(ldPath, this); QMessageBox::Ok | QMessageBox::Cancel) == QMessageBox::Ok)
addDockWidget(Qt::LeftDockWidgetArea, _GeorgesDirTreeDialog); {
if (ldPath == "") { settings();
if (QMessageBox::information(this, tr("Missing leveldesign path"), }
tr("Your leveldesign path seems to be empty or incorrect.\nDo you want to set it now?"),
QMessageBox::Ok | QMessageBox::Cancel) == QMessageBox::Ok) {
settings();
} }
// create NeL viewport dock widget
_ObjectViewerDialog = new CObjectViewerDialog(this);
//_ObjectViewerDialog->setAllowedAreas(Qt::LeftDockWidgetArea );
//_ObjectViewerDialog->hide();
addDockWidget(Qt::LeftDockWidgetArea, _ObjectViewerDialog);
createActions();
createMenus();
createToolBars();
createStatusBar();
//_ObjectViewerDialog->toggleViewAction()->trigger();
QSettings settings("georges_editor_qt.ini", QSettings::IniFormat);
settings.beginGroup("WindowSettings");
restoreState(settings.value("QtWindowState").toByteArray());
restoreGeometry(settings.value("QtWindowGeometry").toByteArray());
settings.endGroup();
// setup Qt style and palette from config file
//_originalPalette = QApplication::palette();
//Modules::config().setAndCallback("QtStyle", CConfigCallback(this, &CMainWindow::cfcbQtStyle));
//Modules::config().setAndCallback("QtPalette", CConfigCallback(this, &CMainWindow::cfcbQtPalette));
setWindowIcon(QIcon(":/images/khead.png"));
_statusBarTimer = new QTimer(this);
connect(_statusBarTimer, SIGNAL(timeout()), this, SLOT(updateStatusBar()));
_statusBarTimer->start(5000);
connect(_GeorgesDirTreeDialog, SIGNAL(selectedForm(QString)),
this, SLOT(openTreeView(QString)));
} }
// create NeL viewport dock widget CMainWindow::~CMainWindow()
_ObjectViewerDialog = new CObjectViewerDialog(this); {
//_ObjectViewerDialog->setAllowedAreas(Qt::LeftDockWidgetArea ); // save state & geometry of window and widgets
//_ObjectViewerDialog->hide(); QSettings settings("georges_editor_qt.ini", QSettings::IniFormat);
addDockWidget(Qt::LeftDockWidgetArea, _ObjectViewerDialog); settings.beginGroup("WindowSettings");
settings.setValue("QtWindowState", saveState());
createActions(); settings.setValue("QtWindowGeometry", saveGeometry());
createMenus(); settings.endGroup();
createToolBars();
createStatusBar(); //Modules::config().dropCallback("QtPalette");
//Modules::config().dropCallback("QtStyle");
//_ObjectViewerDialog->toggleViewAction()->trigger();
QSettings settings("georges_editor_qt.ini", QSettings::IniFormat);
settings.beginGroup("WindowSettings");
restoreState(settings.value("QtWindowState").toByteArray());
restoreGeometry(settings.value("QtWindowGeometry").toByteArray());
settings.endGroup();
// setup Qt style and palette from config file
//_originalPalette = QApplication::palette();
//Modules::config().setAndCallback("QtStyle", CConfigCallback(this, &CMainWindow::cfcbQtStyle));
//Modules::config().setAndCallback("QtPalette", CConfigCallback(this, &CMainWindow::cfcbQtPalette));
setWindowIcon(QIcon(":/images/khead.png"));
_statusBarTimer = new QTimer(this);
connect(_statusBarTimer, SIGNAL(timeout()), this, SLOT(updateStatusBar()));
_statusBarTimer->start(5000);
connect(_GeorgesDirTreeDialog, SIGNAL(selectedForm(QString)),
this, SLOT(openTreeView(QString)));
}
CMainWindow::~CMainWindow()
{
// save state & geometry of window and widgets
QSettings settings("georges_editor_qt.ini", QSettings::IniFormat);
settings.beginGroup("WindowSettings");
settings.setValue("QtWindowState", saveState());
settings.setValue("QtWindowGeometry", saveGeometry());
settings.endGroup();
//Modules::config().dropCallback("QtPalette"); _statusBarTimer->stop();
//Modules::config().dropCallback("QtStyle");
_statusBarTimer->stop();
delete _ObjectViewerDialog; delete _ObjectViewerDialog;
delete _GeorgesDirTreeDialog; delete _GeorgesDirTreeDialog;
delete _GeorgesLogDialog; delete _GeorgesLogDialog;
} }
void CMainWindow::openTreeView(QString file) { void CMainWindow::openTreeView(QString file)
// create or/and raise tree view dock widget for current file {
// create or/and raise tree view dock widget for current file
setCurrentFile(file); setCurrentFile(file);
CGeorgesTreeViewDialog *newView = 0; CGeorgesTreeViewDialog *newView = 0;
Q_FOREACH(CGeorgesTreeViewDialog* dlg, _treeViewList) { Q_FOREACH(CGeorgesTreeViewDialog* dlg, _treeViewList)
if (dlg->loadedForm == file) {
newView = dlg; if (dlg->loadedForm == file)
} newView = dlg;
if (!newView) { }
newView = new CGeorgesTreeViewDialog(this); if (!newView)
//newView->setAllowedAreas(Qt::TopDockWidgetArea | Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea); {
newView->setWindowTitle(file); newView = new CGeorgesTreeViewDialog(this);
//newView->setAllowedAreas(Qt::TopDockWidgetArea | Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);
if (_treeViewList.isEmpty()) { newView->setWindowTitle(file);
_emptyView->deleteLater();
addDockWidget(Qt::TopDockWidgetArea, newView); if (_treeViewList.isEmpty())
} else { {
tabifyDockWidget(_treeViewList.first(),newView); _emptyView->deleteLater();
QTabBar* tb = Modules::mainWin().getTabBar(); addDockWidget(Qt::TopDockWidgetArea, newView);
if (tb) { }
disconnect(tb, SIGNAL(currentChanged ( int ) ), else
this,SLOT(tabChanged(int))); {
connect(tb, SIGNAL(currentChanged ( int ) ), tabifyDockWidget(_treeViewList.first(),newView);
this,SLOT(tabChanged(int))); QTabBar* tb = Modules::mainWin().getTabBar();
if (tb)
{
disconnect(tb, SIGNAL(currentChanged ( int ) ),
this,SLOT(tabChanged(int)));
connect(tb, SIGNAL(currentChanged ( int ) ),
this,SLOT(tabChanged(int)));
}
} }
_treeViewList.append(newView);
newView->selectedForm(file);
_currentView = newView;
connect(newView, SIGNAL(changeFile(QString)),
_GeorgesDirTreeDialog, SLOT(changeFile(QString)));
connect(newView, SIGNAL(modified(bool)),
_saveAction, SLOT(setEnabled(bool)));
} }
newView->raise();
_treeViewList.append(newView);
newView->selectedForm(file);
_currentView = newView;
connect(newView, SIGNAL(changeFile(QString)),
_GeorgesDirTreeDialog, SLOT(changeFile(QString)));
connect(newView, SIGNAL(modified(bool)),
_saveAction, SLOT(setEnabled(bool)));
} }
newView->raise();
}
void CMainWindow::settings() void CMainWindow::settings()
{ {
CSettingsDialog _settingsDialog(this); CSettingsDialog _settingsDialog(this);
connect(&_settingsDialog,SIGNAL(ldPathChanged(QString)), connect(&_settingsDialog,SIGNAL(ldPathChanged(QString)),
_GeorgesDirTreeDialog,SLOT(ldPathChanged(QString))); _GeorgesDirTreeDialog,SLOT(ldPathChanged(QString)));
//_settingsDialog.show(); //_settingsDialog.show();
_settingsDialog.exec(); _settingsDialog.exec();
} }
void CMainWindow::about() void CMainWindow::about()
{ {
QMessageBox::about(this, tr("About Georges Viewer Qt"), QMessageBox::about(this, tr("About Georges Viewer Qt"),
tr("<h2>Georges Viewer Qt</h2>" tr("<h2>Georges Viewer Qt</h2>"
"Author: aquiles<br>Credits:Thx to dnk-88 for parts of his code")); "Author: aquiles<br>Credits:Thx to dnk-88 for parts of his code"));
} }
void CMainWindow::updateStatusBar() void CMainWindow::updateStatusBar()
{ {
//if (_isGraphicsInitialized) //if (_isGraphicsInitialized)
// statusBar()->showMessage(QString(Modules::objView().getDriver()->getVideocardInformation())); // statusBar()->showMessage(QString(Modules::objView().getDriver()->getVideocardInformation()));
} }
void CMainWindow::open() void CMainWindow::open()
{
/*QStringList fileNames = QFileDialog::getOpenFileNames(this,
tr("Open NeL data file"), _lastDir,
tr("All NeL files (*.shape *.ps);;"
"NeL shape files (*.shape);;"
"NeL particle system files (*.ps)"));
setCursor(Qt::WaitCursor);
if (!fileNames.isEmpty())
{ {
/*QStringList fileNames = QFileDialog::getOpenFileNames(this,
tr("Open NeL data file"), _lastDir,
tr("All NeL files (*.shape *.ps);;"
"NeL shape files (*.shape);;"
"NeL particle system files (*.ps)"));
setCursor(Qt::WaitCursor);
if (!fileNames.isEmpty())
{
QStringList list = fileNames; QStringList list = fileNames;
QStringList::Iterator it = list.begin(); QStringList::Iterator it = list.begin();
_lastDir = QFileInfo(*it).absolutePath(); _lastDir = QFileInfo(*it).absolutePath();
QString skelFileName = QFileDialog::getOpenFileName(this, QString skelFileName = QFileDialog::getOpenFileName(this,
tr("Open skeleton file"), _lastDir, tr("Open skeleton file"), _lastDir,
tr("NeL skeleton file (*.skel)")); tr("NeL skeleton file (*.skel)"));
while(it != list.end()) while(it != list.end())
{ {
loadFile(*it, skelFileName); loadFile(*it, skelFileName);
++it; ++it;
} }
_AnimationSetDialog->updateListObject(); _AnimationSetDialog->updateListObject();
_AnimationSetDialog->updateListAnim(); _AnimationSetDialog->updateListAnim();
_SlotManagerDialog->updateUiSlots(); _SlotManagerDialog->updateUiSlots();
}
setCursor(Qt::ArrowCursor);*/
} }
setCursor(Qt::ArrowCursor);*/
}
void CMainWindow::save() void CMainWindow::save()
{ {
if(!_currentView) if(!_currentView)
return; return;
setCursor(Qt::WaitCursor); setCursor(Qt::WaitCursor);
_currentView->write();
setWindowTitle(windowTitle().remove("*"));
_saveAction->setEnabled(false);
setCursor(Qt::ArrowCursor); _currentView->write();
} setWindowTitle(windowTitle().remove("*"));
_saveAction->setEnabled(false);
void CMainWindow::create() setCursor(Qt::ArrowCursor);
{ }
}
void CMainWindow::createEmptyView() void CMainWindow::create()
{ {
_emptyView = new CGeorgesTreeViewDialog(this, true);
//_emptyView->setAllowedAreas(Qt::TopDockWidgetArea);
addDockWidget(Qt::TopDockWidgetArea,_emptyView);
}
void CMainWindow::createActions()
{
_openAction = new QAction(tr("&Open..."), this);
_openAction->setIcon(QApplication::style()->standardIcon(QStyle::SP_DialogOpenButton));
_openAction->setShortcut(QKeySequence::Open);
_openAction->setStatusTip(tr("Open an existing file"));
connect(_openAction, SIGNAL(triggered()), this, SLOT(open()));
_createAction = new QAction(tr("&New..."), this);
_createAction->setIcon(QApplication::style()->standardIcon(QStyle::SP_FileDialogNewFolder));
_createAction->setShortcut(QKeySequence::New);
_createAction->setStatusTip(tr("Create a new file"));
connect(_createAction, SIGNAL(triggered()), this, SLOT(create()));
_saveAction = new QAction(tr("&Save..."), this);
_saveAction->setIcon(QApplication::style()->standardIcon(QStyle::SP_DialogSaveButton));
_saveAction->setShortcut(QKeySequence::Save);
_saveAction->setStatusTip(tr("Saves the current file"));
_saveAction->setDisabled(true);
connect(_saveAction, SIGNAL(triggered()), this, SLOT(save()));
_exitAction = new QAction(tr("E&xit"), this);
_exitAction->setShortcut(QKeySequence::Close);
_exitAction->setIcon(QApplication::style()->standardIcon(QStyle::SP_DialogCloseButton));
_exitAction->setStatusTip(tr("Exit the application"));
connect(_exitAction, SIGNAL(triggered()), this, SLOT(close()));
_setBackColorAction = _ObjectViewerDialog->createSetBackgroundColor(this);
_setBackColorAction->setText(tr("Set &background color"));
_setBackColorAction->setStatusTip(tr("Set background color"));
_settingsAction = new QAction(tr("&Settings"), this);
_settingsAction->setIcon(QIcon(":/images/preferences.png"));
_settingsAction->setStatusTip(tr("Settings"));
connect(_settingsAction, SIGNAL(triggered()), this, SLOT(settings()));
_aboutAction = new QAction(tr("&About"), this);
_aboutAction->setStatusTip(tr("Show the application's About box"));
connect(_aboutAction, SIGNAL(triggered()), this, SLOT(about()));
_aboutQtAction = new QAction(tr("About &Qt"), this);
_aboutQtAction->setStatusTip(tr("Show the Qt library's About box"));
connect(_aboutQtAction, SIGNAL(triggered()), qApp, SLOT(aboutQt()));
for (int i = 0; i < MaxRecentFiles; ++i) {
recentFileActs[i] = new QAction(this);
recentFileActs[i]->setVisible(false);
connect(recentFileActs[i], SIGNAL(triggered()),
this, SLOT(openRecentFile()));
} }
}
void CMainWindow::createMenus() void CMainWindow::createEmptyView()
{ {
_fileMenu = menuBar()->addMenu(tr("&File")); _emptyView = new CGeorgesTreeViewDialog(this, true);
_fileMenu->addAction(_createAction); //_emptyView->setAllowedAreas(Qt::TopDockWidgetArea);
_fileMenu->addAction(_openAction); addDockWidget(Qt::TopDockWidgetArea,_emptyView);
_fileMenu->addAction(_saveAction);
_separatorAction = _fileMenu->addSeparator();
for (int i = 0; i < MaxRecentFiles; ++i)
_fileMenu->addAction(recentFileActs[i]);
_fileMenu->addSeparator();
_fileMenu->addAction(_exitAction);
updateRecentFileActions();
_viewMenu = menuBar()->addMenu(tr("&View"));
_viewMenu->addAction(_setBackColorAction);
if (_GeorgesDirTreeDialog)
_viewMenu->addAction(_GeorgesDirTreeDialog->toggleViewAction());
_toolsMenu = menuBar()->addMenu(tr("&Tools"));
if (_ObjectViewerDialog) {
_toolsMenu->addAction(_ObjectViewerDialog->toggleViewAction());
_ObjectViewerDialog->toggleViewAction()->setIcon(QIcon(":/images/pqrticles.png"));
} }
_toolsMenu->addSeparator();
_toolsMenu->addAction(_settingsAction);
menuBar()->addSeparator();
_helpMenu = menuBar()->addMenu(tr("&Help")); void CMainWindow::createActions()
_helpMenu->addAction(_aboutAction); {
_helpMenu->addAction(_aboutQtAction); _openAction = new QAction(tr("&Open..."), this);
} _openAction->setIcon(QApplication::style()->standardIcon(QStyle::SP_DialogOpenButton));
_openAction->setShortcut(QKeySequence::Open);
_openAction->setStatusTip(tr("Open an existing file"));
connect(_openAction, SIGNAL(triggered()), this, SLOT(open()));
_createAction = new QAction(tr("&New..."), this);
_createAction->setIcon(QApplication::style()->standardIcon(QStyle::SP_FileDialogNewFolder));
_createAction->setShortcut(QKeySequence::New);
_createAction->setStatusTip(tr("Create a new file"));
connect(_createAction, SIGNAL(triggered()), this, SLOT(create()));
_saveAction = new QAction(tr("&Save..."), this);
_saveAction->setIcon(QApplication::style()->standardIcon(QStyle::SP_DialogSaveButton));
_saveAction->setShortcut(QKeySequence::Save);
_saveAction->setStatusTip(tr("Saves the current file"));
_saveAction->setDisabled(true);
connect(_saveAction, SIGNAL(triggered()), this, SLOT(save()));
_exitAction = new QAction(tr("E&xit"), this);
_exitAction->setShortcut(QKeySequence::Close);
_exitAction->setIcon(QApplication::style()->standardIcon(QStyle::SP_DialogCloseButton));
_exitAction->setStatusTip(tr("Exit the application"));
connect(_exitAction, SIGNAL(triggered()), this, SLOT(close()));
_setBackColorAction = _ObjectViewerDialog->createSetBackgroundColor(this);
_setBackColorAction->setText(tr("Set &background color"));
_setBackColorAction->setStatusTip(tr("Set background color"));
_settingsAction = new QAction(tr("&Settings"), this);
_settingsAction->setIcon(QIcon(":/images/preferences.png"));
_settingsAction->setStatusTip(tr("Settings"));
connect(_settingsAction, SIGNAL(triggered()), this, SLOT(settings()));
_aboutAction = new QAction(tr("&About"), this);
_aboutAction->setStatusTip(tr("Show the application's About box"));
connect(_aboutAction, SIGNAL(triggered()), this, SLOT(about()));
_aboutQtAction = new QAction(tr("About &Qt"), this);
_aboutQtAction->setStatusTip(tr("Show the Qt library's About box"));
connect(_aboutQtAction, SIGNAL(triggered()), qApp, SLOT(aboutQt()));
for (int i = 0; i < MaxRecentFiles; ++i) {
recentFileActs[i] = new QAction(this);
recentFileActs[i]->setVisible(false);
connect(recentFileActs[i], SIGNAL(triggered()),
this, SLOT(openRecentFile()));
}
}
void CMainWindow::createToolBars() void CMainWindow::createMenus()
{ {
_fileToolBar = addToolBar(tr("&File")); _fileMenu = menuBar()->addMenu(tr("&File"));
_fileToolBar->addAction(_createAction); _fileMenu->addAction(_createAction);
_fileToolBar->addAction(_openAction); _fileMenu->addAction(_openAction);
_fileToolBar->addAction(_saveAction); _fileMenu->addAction(_saveAction);
_separatorAction = _fileMenu->addSeparator();
for (int i = 0; i < MaxRecentFiles; ++i)
_fileMenu->addAction(recentFileActs[i]);
_fileMenu->addSeparator();
_fileMenu->addAction(_exitAction);
updateRecentFileActions();
_viewMenu = menuBar()->addMenu(tr("&View"));
_viewMenu->addAction(_setBackColorAction);
if (_GeorgesDirTreeDialog)
_viewMenu->addAction(_GeorgesDirTreeDialog->toggleViewAction());
_toolsMenu = menuBar()->addMenu(tr("&Tools"));
if (_ObjectViewerDialog)
{
_toolsMenu->addAction(_ObjectViewerDialog->toggleViewAction());
_ObjectViewerDialog->toggleViewAction()->setIcon(QIcon(":/images/pqrticles.png"));
}
_toolsMenu->addSeparator();
_toolsMenu->addAction(_settingsAction);
_toolsBar = addToolBar(tr("&Tools")); menuBar()->addSeparator();
if (_ObjectViewerDialog)
_toolsBar->addAction(_ObjectViewerDialog->toggleViewAction());
}
void CMainWindow::createStatusBar() _helpMenu = menuBar()->addMenu(tr("&Help"));
{ _helpMenu->addAction(_aboutAction);
statusBar()->showMessage(tr("StatusReady")); _helpMenu->addAction(_aboutQtAction);
} }
void CMainWindow::cfcbQtStyle(NLMISC::CConfigFile::CVar &var) void CMainWindow::createToolBars()
{ {
QApplication::setStyle(QStyleFactory::create(var.asString().c_str())); _fileToolBar = addToolBar(tr("&File"));
} _fileToolBar->addAction(_createAction);
_fileToolBar->addAction(_openAction);
_fileToolBar->addAction(_saveAction);
_toolsBar = addToolBar(tr("&Tools"));
if (_ObjectViewerDialog)
_toolsBar->addAction(_ObjectViewerDialog->toggleViewAction());
}
void CMainWindow::cfcbQtPalette(NLMISC::CConfigFile::CVar &var) void CMainWindow::createStatusBar()
{ {
if (var.asBool()) QApplication::setPalette(QApplication::style()->standardPalette()); statusBar()->showMessage(tr("StatusReady"));
else QApplication::setPalette(_originalPalette); }
}
QTabBar* CMainWindow::getTabBar() void CMainWindow::cfcbQtStyle(NLMISC::CConfigFile::CVar &var)
{ {
// get the QTabBar QApplication::setStyle(QStyleFactory::create(var.asString().c_str()));
QList<QTabBar *> tabList = findChildren<QTabBar *>();
//tabList = _mainWindow->findChildren<QTabBar *>();
//nlinfo(QString("%1 %2").arg(QString::number((int)this,16)).
// arg(QString::number((int)_mainWindow,16)).
// toStdString().c_str());
QTabBar *tb = 0;
Q_FOREACH(QTabBar *tabBar, tabList){
if (tabBar->parent() != this)
continue;
//nlinfo(QString("%1 %2 %3 %4").arg(tabBar->objectName()).
// arg(QString::number((int)tabBar,16)).
// arg(QString::number((int)tabBar->parentWidget(),16)).
// arg(QString::number((int)tabBar->parent(),16)).
// toStdString().c_str());
for (int i = 0; i < tabBar->count(); i++) {
QString currentTab = tabBar->tabText(i);
//nlinfo(currentTab.toStdString().c_str());
}
tb = tabBar;
} }
return tb;
}
void CMainWindow::tabChanged(int index) void CMainWindow::cfcbQtPalette(NLMISC::CConfigFile::CVar &var)
{ {
if (index == -1) { if (var.asBool())
setWindowTitle("Qt Georges Editor"); QApplication::setPalette(QApplication::style()->standardPalette());
return; else
QApplication::setPalette(_originalPalette);
} }
QTabBar *tb = getTabBar(); QTabBar* CMainWindow::getTabBar()
//nlinfo(QString("%1").arg(index).toStdString().c_str()); {
// get the QTabBar
Q_FOREACH(CGeorgesTreeViewDialog* dlg, _treeViewList) { QList<QTabBar *> tabList = findChildren<QTabBar *>();
if (dlg->windowTitle() == tb->tabText(index)) { //tabList = _mainWindow->findChildren<QTabBar *>();
//nlinfo(QString("%1 modified %2").arg(tb->tabText(index)). //nlinfo(QString("%1 %2").arg(QString::number((int)this,16)).
// arg(dlg->modified()). // arg(QString::number((int)_mainWindow,16)).
// toStdString().c_str());
QTabBar *tb = 0;
Q_FOREACH(QTabBar *tabBar, tabList)
{
if (tabBar->parent() != this)
continue;
//nlinfo(QString("%1 %2 %3 %4").arg(tabBar->objectName()).
// arg(QString::number((int)tabBar,16)).
// arg(QString::number((int)tabBar->parentWidget(),16)).
// arg(QString::number((int)tabBar->parent(),16)).
// toStdString().c_str()); // toStdString().c_str());
_currentView = dlg; for (int i = 0; i < tabBar->count(); i++)
setWindowTitle("Qt Georges Editor - " + tb->tabText(index)); {
_saveAction->setEnabled(dlg->modified()); QString currentTab = tabBar->tabText(i);
//nlinfo(currentTab.toStdString().c_str());
}
tb = tabBar;
} }
return tb;
} }
}
void CMainWindow::tabChanged(int index)
void CMainWindow::openRecentFile() {
{ if (index == -1)
QAction *action = qobject_cast<QAction *>(sender()); {
if (action) setWindowTitle("Qt Georges Editor");
loadFile(action->data().toString()); return;
} }
void CMainWindow::setCurrentFile(const QString &fileName) QTabBar *tb = getTabBar();
{ //nlinfo(QString("%1").arg(index).toStdString().c_str());
//curFile = fileName;
//setWindowFilePath(curFile); Q_FOREACH(CGeorgesTreeViewDialog* dlg, _treeViewList)
{
QSettings settings("georges_editor_qt.ini", QSettings::IniFormat); if (dlg->windowTitle() == tb->tabText(index))
settings.beginGroup("RecentFileList"); {
QStringList files = settings.value("List").toStringList(); //nlinfo(QString("%1 modified %2").arg(tb->tabText(index)).
settings.endGroup(); // arg(dlg->modified()).
// toStdString().c_str());
files.removeAll(fileName); _currentView = dlg;
files.prepend(fileName); setWindowTitle("Qt Georges Editor - " + tb->tabText(index));
while (files.size() > MaxRecentFiles) _saveAction->setEnabled(dlg->modified());
files.removeLast(); }
}
settings.beginGroup("RecentFileList"); }
settings.setValue("List",files);
settings.endGroup(); void CMainWindow::openRecentFile()
{
Q_FOREACH (QWidget *widget, QApplication::topLevelWidgets()) { QAction *action = qobject_cast<QAction *>(sender());
CMainWindow *mainWin = qobject_cast<CMainWindow *>(widget); if (action)
if (mainWin) loadFile(action->data().toString());
mainWin->updateRecentFileActions(); }
}
} void CMainWindow::setCurrentFile(const QString &fileName)
{
void CMainWindow::updateRecentFileActions() //curFile = fileName;
{ //setWindowFilePath(curFile);
QSettings settings("georges_editor_qt.ini", QSettings::IniFormat);
settings.beginGroup("RecentFileList"); QSettings settings("georges_editor_qt.ini", QSettings::IniFormat);
QStringList files = settings.value("List").toStringList(); settings.beginGroup("RecentFileList");
settings.endGroup(); QStringList files = settings.value("List").toStringList();
int numRecentFiles = qMin(files.size(), (int)MaxRecentFiles); settings.endGroup();
for (int i = 0; i < numRecentFiles; ++i) { files.removeAll(fileName);
QString text = tr("&%1 %2").arg(i + 1).arg(QFileInfo(files[i]).fileName()); files.prepend(fileName);
recentFileActs[i]->setText(text); while (files.size() > MaxRecentFiles)
recentFileActs[i]->setData(files[i]); files.removeLast();
recentFileActs[i]->setVisible(true);
} settings.beginGroup("RecentFileList");
for (int j = numRecentFiles; j < MaxRecentFiles; ++j) settings.setValue("List",files);
recentFileActs[j]->setVisible(false); settings.endGroup();
_separatorAction->setVisible(numRecentFiles > 0); Q_FOREACH (QWidget *widget, QApplication::topLevelWidgets())
} {
CMainWindow *mainWin = qobject_cast<CMainWindow *>(widget);
void CMainWindow::loadFile(const QString &fileName) if (mainWin)
{ mainWin->updateRecentFileActions();
/*QFile file(fileName); }
if (!file.open(QFile::ReadOnly | QFile::Text)) { }
QMessageBox::warning(this, tr("Recent Files"),
tr("Cannot read file %1:\n%2.") void CMainWindow::updateRecentFileActions()
.arg(fileName) {
.arg(file.errorString())); QSettings settings("georges_editor_qt.ini", QSettings::IniFormat);
return; settings.beginGroup("RecentFileList");
} QStringList files = settings.value("List").toStringList();
settings.endGroup();
QTextStream in(&file); int numRecentFiles = qMin(files.size(), (int)MaxRecentFiles);
QApplication::setOverrideCursor(Qt::WaitCursor);
textEdit->setPlainText(in.readAll()); for (int i = 0; i < numRecentFiles; ++i)
QApplication::restoreOverrideCursor();*/ {
QString text = tr("&%1 %2").arg(i + 1).arg(QFileInfo(files[i]).fileName());
openTreeView(fileName); recentFileActs[i]->setText(text);
setCurrentFile(fileName); recentFileActs[i]->setData(files[i]);
//statusBar()->showMessage(tr("File loaded"), 2000); recentFileActs[i]->setVisible(true);
} }
for (int j = numRecentFiles; j < MaxRecentFiles; ++j)
recentFileActs[j]->setVisible(false);
_separatorAction->setVisible(numRecentFiles > 0);
}
void CMainWindow::loadFile(const QString &fileName)
{
/*QFile file(fileName);
if (!file.open(QFile::ReadOnly | QFile::Text)) {
QMessageBox::warning(this, tr("Recent Files"),
tr("Cannot read file %1:\n%2.")
.arg(fileName)
.arg(file.errorString()));
return;
}
QTextStream in(&file);
QApplication::setOverrideCursor(Qt::WaitCursor);
textEdit->setPlainText(in.readAll());
QApplication::restoreOverrideCursor();*/
openTreeView(fileName);
setCurrentFile(fileName);
//statusBar()->showMessage(tr("File loaded"), 2000);
}
} /* namespace NLQT */ } /* namespace NLQT */
/* end of file */ /* end of file */

@ -1,19 +1,19 @@
/* /*
Georges Editor Qt Georges Editor Qt
Copyright (C) 2010 Adrian Jaekel <aj at elane2k dot com> Copyright (C) 2010 Adrian Jaekel <aj at elane2k dot com>
This program is free software: you can redistribute it and/or modify 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 it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or the Free Software Foundation, either version 3 of the License, or
(at your option) any later version. (at your option) any later version.
This program is distributed in the hope that it will be useful, This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details. GNU General Public License for more details.
You should have received a copy of the GNU General Public License You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
@ -33,89 +33,90 @@
// Project includes // Project includes
namespace NLMISC { namespace NLMISC
{
class CConfigFile; class CConfigFile;
} }
namespace NLQT { namespace NLQT
{
class CGeorgesLogDialog; class CGeorgesLogDialog;
class CObjectViewerDialog; class CObjectViewerDialog;
class CGeorgesDirTreeDialog; class CGeorgesDirTreeDialog;
class CGeorgesTreeViewDialog; class CGeorgesTreeViewDialog;
class CMainWindow : public QMainWindow class CMainWindow : public QMainWindow
{ {
Q_OBJECT Q_OBJECT
public: public:
CMainWindow(QWidget *parent = 0); CMainWindow(QWidget *parent = 0);
~CMainWindow(); ~CMainWindow();
CGeorgesTreeViewDialog* getEmptyView() { return _emptyView;} CGeorgesTreeViewDialog* getEmptyView() { return _emptyView;}
QList<CGeorgesTreeViewDialog*>& getTreeViewList() { return _treeViewList; } QList<CGeorgesTreeViewDialog*>& getTreeViewList() { return _treeViewList; }
QTabBar* getTabBar(); QTabBar* getTabBar();
void createEmptyView(); void createEmptyView();
private Q_SLOTS: private Q_SLOTS:
void open(); void open();
void create(); void create();
void save(); void save();
void settings(); void settings();
void about(); void about();
void updateStatusBar(); void updateStatusBar();
void openTreeView(QString); void openTreeView(QString);
void tabChanged(int); void tabChanged(int);
void openRecentFile(); void openRecentFile();
private: private:
void createActions(); void createActions();
void createMenus(); void createMenus();
void createToolBars(); void createToolBars();
void createStatusBar(); void createStatusBar();
void createDialogs(); void createDialogs();
void loadFile(const QString &fileName); void loadFile(const QString &fileName);
void updateRecentFileActions(); void updateRecentFileActions();
void setCurrentFile(const QString &fileName); void setCurrentFile(const QString &fileName);
void cfcbQtStyle(NLMISC::CConfigFile::CVar &var); void cfcbQtStyle(NLMISC::CConfigFile::CVar &var);
void cfcbQtPalette(NLMISC::CConfigFile::CVar &var); void cfcbQtPalette(NLMISC::CConfigFile::CVar &var);
CGeorgesLogDialog *_GeorgesLogDialog; CGeorgesLogDialog *_GeorgesLogDialog;
CObjectViewerDialog *_ObjectViewerDialog; CObjectViewerDialog *_ObjectViewerDialog;
CGeorgesDirTreeDialog *_GeorgesDirTreeDialog; CGeorgesDirTreeDialog *_GeorgesDirTreeDialog;
QList<CGeorgesTreeViewDialog*> _treeViewList; QList<CGeorgesTreeViewDialog*> _treeViewList;
CGeorgesTreeViewDialog *_emptyView; CGeorgesTreeViewDialog *_emptyView;
CGeorgesTreeViewDialog *_currentView; CGeorgesTreeViewDialog *_currentView;
QPalette _originalPalette; QPalette _originalPalette;
QTimer *_statusBarTimer; QTimer *_statusBarTimer;
QMenu *_fileMenu; QMenu *_fileMenu;
QMenu *_viewMenu; QMenu *_viewMenu;
QMenu *_toolsMenu; QMenu *_toolsMenu;
QMenu *_helpMenu; QMenu *_helpMenu;
QToolBar *_fileToolBar; QToolBar *_fileToolBar;
QToolBar *_editToolBar; QToolBar *_editToolBar;
QToolBar *_toolsBar; QToolBar *_toolsBar;
QAction *_openAction; QAction *_openAction;
QAction *_createAction; QAction *_createAction;
QAction *_saveAction; QAction *_saveAction;
QAction *_exitAction; QAction *_exitAction;
QAction *_setBackColorAction; QAction *_setBackColorAction;
QAction *_settingsAction; QAction *_settingsAction;
QAction *_aboutAction; QAction *_aboutAction;
QAction *_aboutQtAction; QAction *_aboutQtAction;
QAction *_separatorAction; QAction *_separatorAction;
enum { MaxRecentFiles = 5 }; enum { MaxRecentFiles = 5 };
QAction *recentFileActs[MaxRecentFiles]; QAction *recentFileActs[MaxRecentFiles];
};/* class CMainWindow */ };/* class CMainWindow */
} /* namespace NLQT */ } /* namespace NLQT */

@ -1,19 +1,19 @@
/* /*
Georges Editor Qt Georges Editor Qt
Copyright (C) 2010 Adrian Jaekel <aj at elane2k dot com> Copyright (C) 2010 Adrian Jaekel <aj at elane2k dot com>
This program is free software: you can redistribute it and/or modify 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 it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or the Free Software Foundation, either version 3 of the License, or
(at your option) any later version. (at your option) any later version.
This program is distributed in the hope that it will be useful, This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details. GNU General Public License for more details.
You should have received a copy of the GNU General Public License You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
#include "object_viewer.h" #include "object_viewer.h"
@ -49,363 +49,364 @@ using namespace std;
using namespace NLMISC; using namespace NLMISC;
using namespace NL3D; using namespace NL3D;
namespace NLQT { namespace NLQT
CObjectViewer::CObjectViewer()
: _Driver(NULL),
_phi(0), _psi(0),_dist(20),
_CurrentInstance("")
{ {
}
CObjectViewer::~CObjectViewer() CObjectViewer::CObjectViewer()
{ : _Driver(NULL),
_phi(0), _psi(0),_dist(20),
_CurrentInstance("")
{
} }
void CObjectViewer::reinit(nlWindow wnd, uint16 w, uint16 h) CObjectViewer::~CObjectViewer()
{ {
nldebug("CObjectViewert::reinit");
//release(); }
//init(wnd, w, h);
_Driver->setDisplay(wnd, NL3D::UDriver::CMode(w, h, 32));
}
void CObjectViewer::init(nlWindow wnd, uint16 w, uint16 h) void CObjectViewer::reinit(nlWindow wnd, uint16 w, uint16 h)
{ {
//H_AUTO2 nldebug("CObjectViewert::reinit");
nldebug("CObjectViewer::init");
//release();
// load and set remap extensions from config //init(wnd, w, h);
//Modules::config().configRemapExtensions(); _Driver->setDisplay(wnd, NL3D::UDriver::CMode(w, h, 32));
}
// load and set search paths from config
//Modules::config().configSearchPaths();
// set background color from config
Modules::config().setAndCallback("BackgroundColor", CConfigCallback(this, &CObjectViewer::cfcbBackgroundColor));
// set graphics driver from config
Modules::config().setAndCallback("GraphicsDriver",CConfigCallback(this,&CObjectViewer::cfcbGraphicsDriver));
// create the driver
nlassert(!_Driver);
_Driver = UDriver::createDriver(NULL, _Direct3D, NULL);
nlassert(_Driver);
// initialize the window with config file values
_Driver->setDisplay(wnd, NL3D::UDriver::CMode(w, h, 32));
_Light = ULight::createLight();
// set mode of the light
_Light->setMode(ULight::DirectionalLight);
// set position of the light
_Light->setPosition(CVector(-20.f, 30.f, 10.f));
// white light
_Light->setAmbiant(CRGBA(255, 255, 255));
// set and enable the light
_Driver->setLight(0, *_Light);
_Driver->enableLight(0);
// Create a scene
_Scene = _Driver->createScene(true);
_PlayListManager = _Scene->createPlayListManager();
_Scene->enableLightingSystem(true);
// create the camera
UCamera camera = _Scene->getCam();
camera.setTransformMode (UTransformable::DirectMatrix);
setSizeViewport(w, h);
// camera will look at entities
updateCamera(0,0,0);
NLMISC::CVector hotSpot=NLMISC::CVector(0,0,0);
_MouseListener = _Driver->create3dMouseListener();
_MouseListener->setMatrix(Modules::objView().getScene()->getCam().getMatrix());
_MouseListener->setFrustrum(Modules::objView().getScene()->getCam().getFrustum());
_MouseListener->setHotSpot(hotSpot);
_MouseListener->setMouseMode(U3dMouseListener::edit3d);
}
void CObjectViewer::release()
{
//H_AUTO2
nldebug("CObjectViewer::release");
Modules::config().dropCallback("BackgroundColor");
Modules::config().dropCallback("GraphicsDriver");
_Driver->delete3dMouseListener(_MouseListener); void CObjectViewer::init(nlWindow wnd, uint16 w, uint16 h)
{
//H_AUTO2
nldebug("CObjectViewer::init");
// delete all entities // load and set remap extensions from config
deleteEntities(); //Modules::config().configRemapExtensions();
_Scene->deletePlayListManager(_PlayListManager); // load and set search paths from config
//Modules::config().configSearchPaths();
// delete the scene // set background color from config
_Driver->deleteScene(_Scene); Modules::config().setAndCallback("BackgroundColor", CConfigCallback(this, &CObjectViewer::cfcbBackgroundColor));
// delete the light // set graphics driver from config
delete _Light; Modules::config().setAndCallback("GraphicsDriver",CConfigCallback(this,&CObjectViewer::cfcbGraphicsDriver));
// release driver // create the driver
nlassert(_Driver); nlassert(!_Driver);
_Driver->release();
delete _Driver;
_Driver = NULL;
}
void CObjectViewer::updateInput() _Driver = UDriver::createDriver(NULL, _Direct3D, NULL);
{ nlassert(_Driver);
_Driver->EventServer.pump();
// New matrix from camera
_Scene->getCam().setTransformMode(NL3D::UTransformable::DirectMatrix);
_Scene->getCam().setMatrix (_MouseListener->getViewMatrix());
}
void CObjectViewer::renderDriver()
{
_Driver->clearBuffers(_BackgroundColor);
}
void CObjectViewer::renderScene() // initialize the window with config file values
{ _Driver->setDisplay(wnd, NL3D::UDriver::CMode(w, h, 32));
// render the scene
_Scene->render();
}
void CObjectViewer::renderDebug2D() _Light = ULight::createLight();
{
}
void CObjectViewer::saveScreenshot(const std::string &nameFile, bool jpg, bool png, bool tga) // set mode of the light
{ _Light->setMode(ULight::DirectionalLight);
//H_AUTO2
// set position of the light
// FIXME: create screenshot path if it doesn't exist! _Light->setPosition(CVector(-20.f, 30.f, 10.f));
// empty bitmap // white light
CBitmap bitmap; _Light->setAmbiant(CRGBA(255, 255, 255));
// copy the driver buffer to the bitmap
_Driver->getBuffer(bitmap); // set and enable the light
// create the file name _Driver->setLight(0, *_Light);
string filename = std::string("./") + nameFile; _Driver->enableLight(0);
// write the bitmap as a jpg, png or tga to the file
if (jpg) // Create a scene
_Scene = _Driver->createScene(true);
_PlayListManager = _Scene->createPlayListManager();
_Scene->enableLightingSystem(true);
// create the camera
UCamera camera = _Scene->getCam();
camera.setTransformMode (UTransformable::DirectMatrix);
setSizeViewport(w, h);
// camera will look at entities
updateCamera(0,0,0);
NLMISC::CVector hotSpot=NLMISC::CVector(0,0,0);
_MouseListener = _Driver->create3dMouseListener();
_MouseListener->setMatrix(Modules::objView().getScene()->getCam().getMatrix());
_MouseListener->setFrustrum(Modules::objView().getScene()->getCam().getFrustum());
_MouseListener->setHotSpot(hotSpot);
_MouseListener->setMouseMode(U3dMouseListener::edit3d);
}
void CObjectViewer::release()
{ {
string newfilename = CFile::findNewFile(filename + ".jpg"); //H_AUTO2
COFile outputFile(newfilename); nldebug("CObjectViewer::release");
bitmap.writeJPG(outputFile, 100);
nlinfo("Screenshot '%s' saved", newfilename.c_str()); Modules::config().dropCallback("BackgroundColor");
Modules::config().dropCallback("GraphicsDriver");
_Driver->delete3dMouseListener(_MouseListener);
// delete all entities
deleteEntities();
_Scene->deletePlayListManager(_PlayListManager);
// delete the scene
_Driver->deleteScene(_Scene);
// delete the light
delete _Light;
// release driver
nlassert(_Driver);
_Driver->release();
delete _Driver;
_Driver = NULL;
} }
if (png)
void CObjectViewer::updateInput()
{ {
string newfilename = CFile::findNewFile(filename + ".png"); _Driver->EventServer.pump();
COFile outputFile(newfilename);
bitmap.writePNG(outputFile, 24); // New matrix from camera
nlinfo("Screenshot '%s' saved", newfilename.c_str()); _Scene->getCam().setTransformMode(NL3D::UTransformable::DirectMatrix);
_Scene->getCam().setMatrix (_MouseListener->getViewMatrix());
} }
if (tga)
void CObjectViewer::renderDriver()
{ {
string newfilename = CFile::findNewFile(filename + ".tga"); _Driver->clearBuffers(_BackgroundColor);
COFile outputFile(newfilename);
bitmap.writeTGA(outputFile, 24, false);
nlinfo("Screenshot '%s' saved", newfilename.c_str());
} }
}
bool CObjectViewer::loadMesh(const std::string &meshFileName, const std::string &skelFileName) void CObjectViewer::renderScene()
{
CPath::addSearchPath(CFile::getPath(meshFileName), false, false);
// create instance of the mesh character
UInstance Entity = _Scene->createInstance(meshFileName);
USkeleton Skeleton = _Scene->createSkeleton(skelFileName);
// if we can't create entity, skip it
if (Entity.empty()) return false;
// create a new entity
EIT eit = (_Entities.insert (make_pair (CFile::getFilenameWithoutExtension(meshFileName), CEntity()))).first;
CEntity &entity = (*eit).second;
// set the entity up
entity._Name = CFile::getFilenameWithoutExtension(meshFileName);
entity._Instance = Entity;
if (!Skeleton.empty())
{ {
entity._Skeleton = Skeleton; // render the scene
entity._Skeleton.bindSkin (entity._Instance); _Scene->render();
} }
entity._AnimationSet = _Driver->createAnimationSet(false);
entity._PlayList = _PlayListManager->createPlayList(entity._AnimationSet);
return true;
}
void CObjectViewer::resetScene() void CObjectViewer::renderDebug2D()
{ {
deleteEntities(); }
// Reset camera.
//..
// to load files with the same name but located in different directories
//CPath::clearMap();
// load and set search paths from config
//Modules::config().configSearchPaths();
_CurrentInstance = "";
nlinfo("Scene cleared");
}
void CObjectViewer::updateCamera(float deltaPsi, float deltaPhi, float deltaDist)
{
_phi += deltaPhi;
_psi += deltaPsi;
_dist += deltaDist;
if(_phi < -NLMISC::Pi/2) _phi -= deltaPhi;
if(_phi > NLMISC::Pi/2) _phi -= deltaPsi;
if (_dist < 1) _dist = 1;
NLMISC::CQuat q0,q1,q2;
NLMISC::CVector up(0,0,1);
NLMISC::CVector v(0,0,1);
q0.setAngleAxis(v,_psi);
v = NLMISC::CVector(0,1,0);
q1.setAngleAxis(v,_phi);
q2 = q0 * q1;
NLMISC::CMatrix m0;
m0.setRot(q2);
NLMISC::CVector camera = m0 * NLMISC::CVector(_dist,0,0);
_Scene->getCam().lookAt(camera, up);
}
void CObjectViewer::setBackgroundColor(NLMISC::CRGBA backgroundColor)
{
_BackgroundColor = backgroundColor;
// config file variable changes
Modules::config().getConfigFile().getVar("BackgroundColor").setAsInt(_BackgroundColor.R, 0);
Modules::config().getConfigFile().getVar("BackgroundColor").setAsInt(_BackgroundColor.G, 1);
Modules::config().getConfigFile().getVar("BackgroundColor").setAsInt(_BackgroundColor.B, 2);
}
void CObjectViewer::setGraphicsDriver(bool Direct3D)
{
_Direct3D = Direct3D;
if (_Direct3D) Modules::config().getConfigFile().getVar("GraphicsDriver").setAsString("Direct3D"); void CObjectViewer::saveScreenshot(const std::string &nameFile, bool jpg, bool png, bool tga)
else Modules::config().getConfigFile().getVar("GraphicsDriver").setAsString("OpenGL"); {
} //H_AUTO2
// FIXME: create screenshot path if it doesn't exist!
// empty bitmap
CBitmap bitmap;
// copy the driver buffer to the bitmap
_Driver->getBuffer(bitmap);
// create the file name
string filename = std::string("./") + nameFile;
// write the bitmap as a jpg, png or tga to the file
if (jpg)
{
string newfilename = CFile::findNewFile(filename + ".jpg");
COFile outputFile(newfilename);
bitmap.writeJPG(outputFile, 100);
nlinfo("Screenshot '%s' saved", newfilename.c_str());
}
if (png)
{
string newfilename = CFile::findNewFile(filename + ".png");
COFile outputFile(newfilename);
bitmap.writePNG(outputFile, 24);
nlinfo("Screenshot '%s' saved", newfilename.c_str());
}
if (tga)
{
string newfilename = CFile::findNewFile(filename + ".tga");
COFile outputFile(newfilename);
bitmap.writeTGA(outputFile, 24, false);
nlinfo("Screenshot '%s' saved", newfilename.c_str());
}
}
void CObjectViewer::setSizeViewport(uint16 w, uint16 h) bool CObjectViewer::loadMesh(const std::string &meshFileName, const std::string &skelFileName)
{ {
_Scene->getCam().setPerspective((float)Pi/2.f, (float)w/h, 0.1f, 1000); CPath::addSearchPath(CFile::getPath(meshFileName), false, false);
}
void CObjectViewer::getSizeViewport(float &left, float &right, float &bottom, float &top, float &znear, float &zfar) // create instance of the mesh character
{ UInstance Entity = _Scene->createInstance(meshFileName);
//_Scene->getCam().setPerspective((float)Pi/2.f, (float)w/h, 0.1f, 1000);
_Scene->getCam().getFrustum(left, right, bottom, top, znear, zfar);
}
void CObjectViewer::setCurrentObject(const std::string &name) USkeleton Skeleton = _Scene->createSkeleton(skelFileName);
{
if ((_Entities.count(name) != 0) || ( name.empty() )) _CurrentInstance = name;
else nlerror ("Entity %s not found", name.c_str());
nlinfo("set current entity %s", _CurrentInstance.c_str());
}
CEntity& CObjectViewer::getEntity(const std::string &name) // if we can't create entity, skip it
{ if (Entity.empty()) return false;
if ( _Entities.count(name) == 0) nlerror("Entity %s not found", name.c_str());
EIT eit = _Entities.find (name);
return (*eit).second;
}
void CObjectViewer::getListObjects(std::vector<std::string> &listObj) // create a new entity
{ EIT eit = (_Entities.insert (make_pair (CFile::getFilenameWithoutExtension(meshFileName), CEntity()))).first;
listObj.clear(); CEntity &entity = (*eit).second;
for (EIT eit = _Entities.begin(); eit != _Entities.end(); ++eit)
listObj.push_back((*eit).second._Name);
}
void CObjectViewer::deleteEntity(CEntity &entity) // set the entity up
{ entity._Name = CFile::getFilenameWithoutExtension(meshFileName);
if (entity._PlayList != NULL) entity._Instance = Entity;
if (!Skeleton.empty())
{
entity._Skeleton = Skeleton;
entity._Skeleton.bindSkin (entity._Instance);
}
entity._AnimationSet = _Driver->createAnimationSet(false);
entity._PlayList = _PlayListManager->createPlayList(entity._AnimationSet);
return true;
}
void CObjectViewer::resetScene()
{ {
_PlayListManager->deletePlayList (entity._PlayList); deleteEntities();
entity._PlayList = NULL;
// Reset camera.
//..
// to load files with the same name but located in different directories
//CPath::clearMap();
// load and set search paths from config
//Modules::config().configSearchPaths();
_CurrentInstance = "";
nlinfo("Scene cleared");
} }
if (entity._AnimationSet != NULL) void CObjectViewer::updateCamera(float deltaPsi, float deltaPhi, float deltaDist)
{ {
_Driver->deleteAnimationSet(entity._AnimationSet); _phi += deltaPhi;
entity._AnimationSet = NULL; _psi += deltaPsi;
_dist += deltaDist;
if(_phi < -NLMISC::Pi/2) _phi -= deltaPhi;
if(_phi > NLMISC::Pi/2) _phi -= deltaPsi;
if (_dist < 1) _dist = 1;
NLMISC::CQuat q0,q1,q2;
NLMISC::CVector up(0,0,1);
NLMISC::CVector v(0,0,1);
q0.setAngleAxis(v,_psi);
v = NLMISC::CVector(0,1,0);
q1.setAngleAxis(v,_phi);
q2 = q0 * q1;
NLMISC::CMatrix m0;
m0.setRot(q2);
NLMISC::CVector camera = m0 * NLMISC::CVector(_dist,0,0);
_Scene->getCam().lookAt(camera, up);
} }
if (!entity._Skeleton.empty()) void CObjectViewer::setBackgroundColor(NLMISC::CRGBA backgroundColor)
{ {
entity._Skeleton.detachSkeletonSon(entity._Instance); _BackgroundColor = backgroundColor;
_Scene->deleteSkeleton(entity._Skeleton); // config file variable changes
entity._Skeleton = NULL; Modules::config().getConfigFile().getVar("BackgroundColor").setAsInt(_BackgroundColor.R, 0);
Modules::config().getConfigFile().getVar("BackgroundColor").setAsInt(_BackgroundColor.G, 1);
Modules::config().getConfigFile().getVar("BackgroundColor").setAsInt(_BackgroundColor.B, 2);
} }
if (!entity._Instance.empty()) void CObjectViewer::setGraphicsDriver(bool Direct3D)
{ {
_Scene->deleteInstance(entity._Instance); _Direct3D = Direct3D;
entity._Instance = NULL;
if (_Direct3D) Modules::config().getConfigFile().getVar("GraphicsDriver").setAsString("Direct3D");
else Modules::config().getConfigFile().getVar("GraphicsDriver").setAsString("OpenGL");
} }
}
void CObjectViewer::deleteEntities() void CObjectViewer::setSizeViewport(uint16 w, uint16 h)
{
for (EIT eit = _Entities.begin(); eit != _Entities.end(); ++eit)
{ {
CEntity &entity = (*eit).second; _Scene->getCam().setPerspective((float)Pi/2.f, (float)w/h, 0.1f, 1000);
deleteEntity(entity);
} }
_Entities.clear();
}
void CObjectViewer::cfcbBackgroundColor(NLMISC::CConfigFile::CVar &var) void CObjectViewer::getSizeViewport(float &left, float &right, float &bottom, float &top, float &znear, float &zfar)
{ {
// read variable from config file //_Scene->getCam().setPerspective((float)Pi/2.f, (float)w/h, 0.1f, 1000);
_BackgroundColor = CRGBA(var.asInt(0), var.asInt(1), var.asInt(2)); _Scene->getCam().getFrustum(left, right, bottom, top, znear, zfar);
} }
void CObjectViewer::setCurrentObject(const std::string &name)
{
if ((_Entities.count(name) != 0) || ( name.empty() )) _CurrentInstance = name;
else nlerror ("Entity %s not found", name.c_str());
nlinfo("set current entity %s", _CurrentInstance.c_str());
}
CEntity& CObjectViewer::getEntity(const std::string &name)
{
if ( _Entities.count(name) == 0) nlerror("Entity %s not found", name.c_str());
EIT eit = _Entities.find (name);
return (*eit).second;
}
void CObjectViewer::getListObjects(std::vector<std::string> &listObj)
{
listObj.clear();
for (EIT eit = _Entities.begin(); eit != _Entities.end(); ++eit)
listObj.push_back((*eit).second._Name);
}
void CObjectViewer::deleteEntity(CEntity &entity)
{
if (entity._PlayList != NULL)
{
_PlayListManager->deletePlayList (entity._PlayList);
entity._PlayList = NULL;
}
if (entity._AnimationSet != NULL)
{
_Driver->deleteAnimationSet(entity._AnimationSet);
entity._AnimationSet = NULL;
}
if (!entity._Skeleton.empty())
{
entity._Skeleton.detachSkeletonSon(entity._Instance);
_Scene->deleteSkeleton(entity._Skeleton);
entity._Skeleton = NULL;
}
if (!entity._Instance.empty())
{
_Scene->deleteInstance(entity._Instance);
entity._Instance = NULL;
}
}
void CObjectViewer::deleteEntities()
{
for (EIT eit = _Entities.begin(); eit != _Entities.end(); ++eit)
{
CEntity &entity = (*eit).second;
deleteEntity(entity);
}
_Entities.clear();
}
void CObjectViewer::cfcbBackgroundColor(NLMISC::CConfigFile::CVar &var)
{
// read variable from config file
_BackgroundColor = CRGBA(var.asInt(0), var.asInt(1), var.asInt(2));
}
void CObjectViewer::cfcbGraphicsDriver(NLMISC::CConfigFile::CVar &var)
{
// Choose driver opengl to work correctly under Linux example
_Direct3D = false; //_Driver = OpenGL;
void CObjectViewer::cfcbGraphicsDriver(NLMISC::CConfigFile::CVar &var)
{
// Choose driver opengl to work correctly under Linux example
_Direct3D = false; //_Driver = OpenGL;
#ifdef NL_OS_WINDOWS #ifdef NL_OS_WINDOWS
std::string driver = var.asString(); std::string driver = var.asString();
if (driver == "Direct3D") _Direct3D = true; //m_Driver = Direct3D; if (driver == "Direct3D") _Direct3D = true; //m_Driver = Direct3D;
else if (driver == "OpenGL") _Direct3D = false; //m_Driver = OpenGL; else if (driver == "OpenGL") _Direct3D = false; //m_Driver = OpenGL;
else nlwarning("Invalid driver specified, defaulting to OpenGL"); else nlwarning("Invalid driver specified, defaulting to OpenGL");
#endif #endif
} }
} /* namespace NLQT */ } /* namespace NLQT */

@ -1,19 +1,19 @@
/* /*
Georges Editor Qt Georges Editor Qt
Copyright (C) 2010 Adrian Jaekel <aj at elane2k dot com> Copyright (C) 2010 Adrian Jaekel <aj at elane2k dot com>
This program is free software: you can redistribute it and/or modify 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 it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or the Free Software Foundation, either version 3 of the License, or
(at your option) any later version. (at your option) any later version.
This program is distributed in the hope that it will be useful, This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details. GNU General Public License for more details.
You should have received a copy of the GNU General Public License You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
#ifndef OBJECT_VIEWER_H #ifndef OBJECT_VIEWER_H
@ -33,7 +33,8 @@
// Project includes // Project includes
#include "entity.h" #include "entity.h"
namespace NL3D { namespace NL3D
{
class UDriver; class UDriver;
class UScene; class UScene;
class ULight; class ULight;
@ -48,143 +49,144 @@ namespace NL3D {
namespace NLQT namespace NLQT
@brief namespace NLQT @brief namespace NLQT
*/ */
namespace NLQT { namespace NLQT
/**
@class CObjectViewer
A CObjectViewer class loading and viewing shape, particle system files.
*/
class CObjectViewer
{ {
public:
/// Default constructor. /**
CObjectViewer(); @class CObjectViewer
A CObjectViewer class loading and viewing shape, particle system files.
virtual ~CObjectViewer(); */
class CObjectViewer
/// Init a driver and create scene. {
/// @param wnd - handle window. public:
/// @param w - width window. /// Default constructor.
/// @param h - height window. CObjectViewer();
void init(nlWindow wnd, uint16 w, uint16 h);
virtual ~CObjectViewer();
void reinit(nlWindow wnd, uint16 w, uint16 h);
/// Init a driver and create scene.
/// Release class. /// @param wnd - handle window.
void release(); /// @param w - width window.
/// @param h - height window.
/// Update mouse and keyboard events. And update camera matrix. void init(nlWindow wnd, uint16 w, uint16 h);
void updateInput();
void reinit(nlWindow wnd, uint16 w, uint16 h);
/// Render Driver (clear all buffers and set background color).
void renderDriver(); /// Release class.
void release();
/// Render current scene.
void renderScene(); /// Update mouse and keyboard events. And update camera matrix.
void updateInput();
/// Render Debug 2D (stuff for dev).
void renderDebug2D(); /// Render Driver (clear all buffers and set background color).
void renderDriver();
/// Make a screenshot of the current scene and save.
void saveScreenshot(const std::string &nameFile, bool jpg, bool png, bool tga); /// Render current scene.
void renderScene();
/// Load a mesh or particle system and add to current scene.
/// @param meshFileName - name loading shape or ps file. /// Render Debug 2D (stuff for dev).
/// @param skelFileName - name loading skeletin file. void renderDebug2D();
/// @return true if file have been loaded, false if file have not been loaded.
bool loadMesh (const std::string &meshFileName, const std::string &skelFileName); /// Make a screenshot of the current scene and save.
void saveScreenshot(const std::string &nameFile, bool jpg, bool png, bool tga);
/// Reset current scene.
void resetScene(); /// Load a mesh or particle system and add to current scene.
/// @param meshFileName - name loading shape or ps file.
/// Update the navigation camera. /// @param skelFileName - name loading skeletin file.
/// @param deltaPsi - delta angle horizontal (radians). /// @return true if file have been loaded, false if file have not been loaded.
/// @param deltaPhi - delta angle vertical (radians). bool loadMesh (const std::string &meshFileName, const std::string &skelFileName);
/// @param deltaDist - delta distance.
void updateCamera(float deltaPsi, float deltaPhi, float deltaDist); /// Reset current scene.
void resetScene();
/// Set the background color.
/// @param backgroundColor - background color. /// Update the navigation camera.
void setBackgroundColor(NLMISC::CRGBA backgroundColor); /// @param deltaPsi - delta angle horizontal (radians).
/// @param deltaPhi - delta angle vertical (radians).
/// Set type driver. /// @param deltaDist - delta distance.
/// @param Direct3D - type driver (true - Direct3D) or (false -OpenGL) void updateCamera(float deltaPsi, float deltaPhi, float deltaDist);
void setGraphicsDriver(bool Direct3D);
/// Set the background color.
/// Set size viewport for correct set perspective /// @param backgroundColor - background color.
/// @param w - width window. void setBackgroundColor(NLMISC::CRGBA backgroundColor);
/// @param h - height window.
void setSizeViewport(uint16 w, uint16 h); /// Set type driver.
void getSizeViewport(float &left, float &right, float &bottom, float &top, float &znear, float &zfar); /// @param Direct3D - type driver (true - Direct3D) or (false -OpenGL)
void setGraphicsDriver(bool Direct3D);
/// Select instance from the scene
/// @param name - name instance, "" if no instance edited /// Set size viewport for correct set perspective
void setCurrentObject(const std::string &name); /// @param w - width window.
/// @param h - height window.
/// Get current instance from the scene void setSizeViewport(uint16 w, uint16 h);
/// @return name current instance, "" if no instance edited void getSizeViewport(float &left, float &right, float &bottom, float &top, float &znear, float &zfar);
const std::string& getCurrentObject() { return _CurrentInstance; }
/// Select instance from the scene
/// Get entity from the scene /// @param name - name instance, "" if no instance edited
/// @return ref Entity void setCurrentObject(const std::string &name);
CEntity& getEntity(const std::string &name);
/// Get current instance from the scene
/// Get full list instances from the scene /// @return name current instance, "" if no instance edited
/// @param listObj - ref of return list instances const std::string& getCurrentObject() { return _CurrentInstance; }
void getListObjects(std::vector<std::string> &listObj);
/// Get entity from the scene
/// Get value background color. /// @return ref Entity
/// @return background color. CEntity& getEntity(const std::string &name);
NLMISC::CRGBA getBackgroundColor() { return _BackgroundColor; }
/// Get full list instances from the scene
/// Get type driver. /// @param listObj - ref of return list instances
/// @return true if have used Direct3D driver, false OpenGL driver. void getListObjects(std::vector<std::string> &listObj);
inline bool getDirect3D() { return _Direct3D; }
/// Get value background color.
/// Get a pointer to the driver. /// @return background color.
/// @return pointer to the driver. NLMISC::CRGBA getBackgroundColor() { return _BackgroundColor; }
inline NL3D::UDriver *getDriver() { return _Driver; }
/// Get type driver.
/// Get a pointer to the scene. /// @return true if have used Direct3D driver, false OpenGL driver.
/// @return pointer to the scene. inline bool getDirect3D() { return _Direct3D; }
inline NL3D::UScene *getScene() { return _Scene; }
/// Get a pointer to the driver.
/// Get a manager of playlist /// @return pointer to the driver.
/// @return pointer to the UPlayListManager inline NL3D::UDriver *getDriver() { return _Driver; }
inline NL3D::UPlayListManager *getPlayListManager() { return _PlayListManager; }
/// Get a pointer to the scene.
private: /// @return pointer to the scene.
void deleteEntity (CEntity &entity); inline NL3D::UScene *getScene() { return _Scene; }
/// Delete all entities /// Get a manager of playlist
void deleteEntities(); /// @return pointer to the UPlayListManager
inline NL3D::UPlayListManager *getPlayListManager() { return _PlayListManager; }
/// Load background color from config file, intended for CConfiguration.
void cfcbBackgroundColor(NLMISC::CConfigFile::CVar &var); private:
void cfcbGraphicsDriver(NLMISC::CConfigFile::CVar &var); void deleteEntity (CEntity &entity);
NLMISC::CRGBA _BackgroundColor; /// Delete all entities
void deleteEntities();
NL3D::UDriver *_Driver;
NL3D::UScene *_Scene; /// Load background color from config file, intended for CConfiguration.
NL3D::UPlayListManager *_PlayListManager; void cfcbBackgroundColor(NLMISC::CConfigFile::CVar &var);
NL3D::ULight *_Light; void cfcbGraphicsDriver(NLMISC::CConfigFile::CVar &var);
NL3D::UCamera *_Camera;
NL3D::U3dMouseListener *_MouseListener; NLMISC::CRGBA _BackgroundColor;
// The entities storage NL3D::UDriver *_Driver;
CEntities _Entities; NL3D::UScene *_Scene;
NL3D::UPlayListManager *_PlayListManager;
/// Camera parameters. NL3D::ULight *_Light;
float _phi, _psi, _dist; NL3D::UCamera *_Camera;
NL3D::U3dMouseListener *_MouseListener;
bool _Direct3D;
// The entities storage
std::string _CurrentInstance; CEntities _Entities;
// a temporary solution, and later remove /// Camera parameters.
friend class CAnimationSetDialog; float _phi, _psi, _dist;
};/* class CObjectViewer */
bool _Direct3D;
std::string _CurrentInstance;
// a temporary solution, and later remove
friend class CAnimationSetDialog;
};/* class CObjectViewer */
} /* namespace NLQT */ } /* namespace NLQT */

@ -1,19 +1,19 @@
/* /*
Georges Editor Qt Georges Editor Qt
Copyright (C) 2010 Adrian Jaekel <aj at elane2k dot com> Copyright (C) 2010 Adrian Jaekel <aj at elane2k dot com>
This program is free software: you can redistribute it and/or modify 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 it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or the Free Software Foundation, either version 3 of the License, or
(at your option) any later version. (at your option) any later version.
This program is distributed in the hope that it will be useful, This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details. GNU General Public License for more details.
You should have received a copy of the GNU General Public License You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
#include "objectviewer_dialog.h" #include "objectviewer_dialog.h"
@ -39,370 +39,377 @@
using namespace std; using namespace std;
using namespace NL3D; using namespace NL3D;
namespace NLQT { namespace NLQT
CObjectViewerDialog::CObjectViewerDialog(QWidget *parent)
: _isGraphicsInitialized(false), _isGraphicsEnabled(false), QDockWidget(parent)
{ {
_ui.setupUi(this);
CObjectViewerDialog::CObjectViewerDialog(QWidget *parent)
//widget = new QWidget(dockWidgetContents); : _isGraphicsInitialized(false), _isGraphicsEnabled(false), QDockWidget(parent)
//widget->setObjectName(QString::fromUtf8("widget")); {
_ui.setupUi(this);
_nlw = new QNLWidget(_ui.dockWidgetContents); //widget = new QWidget(dockWidgetContents);
_nlw->setObjectName(QString::fromUtf8("nlwidget")); //widget->setObjectName(QString::fromUtf8("widget"));
_ui.gridLayout->addWidget(_nlw, 0, 0, 1, 1);
//nlw->setLayout(new QGridLayout(nlw));
//_ui.widget = nlw; _nlw = new QNLWidget(_ui.dockWidgetContents);
//QWidget * w = widget(); _nlw->setObjectName(QString::fromUtf8("nlwidget"));
_ui.gridLayout->addWidget(_nlw, 0, 0, 1, 1);
_isGraphicsEnabled = true; //nlw->setLayout(new QGridLayout(nlw));
//_ui.widget = nlw;
// As a special case, a QTimer with a timeout of 0 will time out as soon as all the events in the window system's event queue have been processed. //QWidget * w = widget();
// This can be used to do heavy work while providing a snappy user interface.
_mainTimer = new QTimer(this); _isGraphicsEnabled = true;
connect(_mainTimer, SIGNAL(timeout()), this, SLOT(updateRender()));
// timer->start(); // <- timeout 0 // As a special case, a QTimer with a timeout of 0 will time out as soon as all the events in the window system's event queue have been processed.
// it's heavy on cpu, though, when no 3d driver initialized :) // This can be used to do heavy work while providing a snappy user interface.
_mainTimer->start(5); // 25fps _mainTimer = new QTimer(this);
} connect(_mainTimer, SIGNAL(timeout()), this, SLOT(updateRender()));
// timer->start(); // <- timeout 0
CObjectViewerDialog::~CObjectViewerDialog() { // it's heavy on cpu, though, when no 3d driver initialized :)
_mainTimer->stop(); _mainTimer->start(5); // 25fps
} }
void CObjectViewerDialog::init() CObjectViewerDialog::~CObjectViewerDialog()
{ {
connect(this, SIGNAL(topLevelChanged(bool)), _mainTimer->stop();
this, SLOT(topLevelChanged(bool))); }
//H_AUTO2
nldebug("CObjectViewerDialog::init %d",_nlw->winId()); void CObjectViewerDialog::init()
{
connect(this, SIGNAL(topLevelChanged(bool)),
this, SLOT(topLevelChanged(bool)));
//H_AUTO2
nldebug("CObjectViewerDialog::init %d",_nlw->winId());
#ifdef NL_OS_UNIX #ifdef NL_OS_UNIX
dynamic_cast<QNLWidget*>(widget())->makeCurrent(); dynamic_cast<QNLWidget*>(widget())->makeCurrent();
#endif // NL_OS_UNIX #endif // NL_OS_UNIX
Modules::objView().init((nlWindow)_nlw->winId(), 20, 20);
setMouseTracking(true);
}
void CObjectViewerDialog::setVisible(bool visible) Modules::objView().init((nlWindow)_nlw->winId(), 20, 20);
{ setMouseTracking(true);
// called by show() }
// code assuming visible window needed to init the 3d driver
if (visible != isVisible()) void CObjectViewerDialog::setVisible(bool visible)
{ {
if (visible) // called by show()
{ // code assuming visible window needed to init the 3d driver
QDockWidget::setVisible(true); if (visible != isVisible())
updateInitialization(true);
}
else
{ {
updateInitialization(false); if (visible)
QDockWidget::setVisible(false); {
QDockWidget::setVisible(true);
updateInitialization(true);
}
else
{
updateInitialization(false);
QDockWidget::setVisible(false);
}
} }
} }
}
void CObjectViewerDialog::updateInitialization(bool visible) void CObjectViewerDialog::updateInitialization(bool visible)
{
//nldebug("CMainWindow::updateInitialization");
bool done;
do
{ {
done = true; // set false whenever change //nldebug("CMainWindow::updateInitialization");
bool wantGraphics = _isGraphicsEnabled && visible; bool done;
// bool wantLandscape = wantGraphics && m_IsGraphicsInitialized && isLandscapeEnabled; do
{
done = true; // set false whenever change
bool wantGraphics = _isGraphicsEnabled && visible;
// bool wantLandscape = wantGraphics && m_IsGraphicsInitialized && isLandscapeEnabled;
// .. stuff that depends on other stuff goes on top to prioritize deinitialization // .. stuff that depends on other stuff goes on top to prioritize deinitialization
// Landscape // Landscape
// ... // ...
// Graphics (Driver) // Graphics (Driver)
if (_isGraphicsInitialized) if (_isGraphicsInitialized)
{
if (!wantGraphics)
{ {
_isGraphicsInitialized = false; if (!wantGraphics)
release(); {
_mainTimer->stop(); _isGraphicsInitialized = false;
done = false; release();
_mainTimer->stop();
done = false;
}
} }
else
}
else
{
if (wantGraphics)
{ {
init(); if (wantGraphics)
_isGraphicsInitialized = true; {
_mainTimer->start(5); init();
done = false; _isGraphicsInitialized = true;
_mainTimer->start(5);
done = false;
}
} }
}
} while (!done);
}
void CObjectViewerDialog::updateRender() } while (!done);
{ }
//nldebug("CMainWindow::updateRender");
updateInitialization(isVisible());
//QModelIndex index = _dirModel->setRootPath("D:/Dev/Ryzom/code/ryzom/common/data_leveldesign/leveldesign");
//_dirTree->setRootIndex(index);
if (isVisible()) void CObjectViewerDialog::updateRender()
{ {
// call all update functions //nldebug("CMainWindow::updateRender");
// 01. Update Utilities (configuration etc) updateInitialization(isVisible());
// 02. Update Time (deltas) //QModelIndex index = _dirModel->setRootPath("D:/Dev/Ryzom/code/ryzom/common/data_leveldesign/leveldesign");
// ... //_dirTree->setRootIndex(index);
// 03. Update Receive (network, servertime, receive messages) if (isVisible())
// ...
// 04. Update Input (keyboard controls, etc)
if (_isGraphicsInitialized)
Modules::objView().updateInput();
// 05. Update Weather (sky, snow, wind, fog, sun)
// ...
// 06. Update Entities (movement, do after possible tp from incoming messages etc)
// - Move other entities
// - Update self entity
// - Move bullets
// ...
// 07. Update Landscape (async zone loading near entity)
// ...
// 08. Update Collisions (entities)
// - Update entities
// - Update move container (swap with Update entities? todo: check code!)
// - Update bullets
// ...
// 09. Update Animations (playlists)
// - Needs to be either before or after entities, not sure,
// there was a problem with wrong order a while ago!!!
//Modules::objView().updateAnimation(_AnimationDialog->getTime());
// 10. Update Camera (depends on entities)
// ...
// 11. Update Interface (login, ui, etc)
// ...
// 12. Update Sound (sound driver)
// ...
// 13. Update Send (network, send new position etc)
// ...
// 14. Update Debug (stuff for dev)
// ...
if (_isGraphicsInitialized && !Modules::objView().getDriver()->isLost())
{ {
// 01. Render Driver (background color) // call all update functions
Modules::objView().renderDriver(); // clear all buffers // 01. Update Utilities (configuration etc)
// 02. Render Sky (sky scene) // 02. Update Time (deltas)
// ... // ...
// 04. Render Scene (entity scene) // 03. Update Receive (network, servertime, receive messages)
Modules::objView().renderScene();
// 05. Render Effects (flare)
// ... // ...
// 06. Render Interface 3D (player names) // 04. Update Input (keyboard controls, etc)
if (_isGraphicsInitialized)
Modules::objView().updateInput();
// 05. Update Weather (sky, snow, wind, fog, sun)
// ... // ...
// 07. Render Debug 3D // 06. Update Entities (movement, do after possible tp from incoming messages etc)
// - Move other entities
// - Update self entity
// - Move bullets
// ... // ...
// 08. Render Interface 2D (chatboxes etc, optionally does have 3d) // 07. Update Landscape (async zone loading near entity)
// ... // ...
// 09. Render Debug 2D (stuff for dev)
Modules::objView().renderDebug2D();
// swap 3d buffers // 08. Update Collisions (entities)
Modules::objView().getDriver()->swapBuffers(); // - Update entities
// - Update move container (swap with Update entities? todo: check code!)
// - Update bullets
// ...
// 09. Update Animations (playlists)
// - Needs to be either before or after entities, not sure,
// there was a problem with wrong order a while ago!!!
//Modules::objView().updateAnimation(_AnimationDialog->getTime());
// 10. Update Camera (depends on entities)
// ...
// 11. Update Interface (login, ui, etc)
// ...
// 12. Update Sound (sound driver)
// ...
// 13. Update Send (network, send new position etc)
// ...
// 14. Update Debug (stuff for dev)
// ...
if (_isGraphicsInitialized && !Modules::objView().getDriver()->isLost())
{
// 01. Render Driver (background color)
Modules::objView().renderDriver(); // clear all buffers
// 02. Render Sky (sky scene)
// ...
// 04. Render Scene (entity scene)
Modules::objView().renderScene();
// 05. Render Effects (flare)
// ...
// 06. Render Interface 3D (player names)
// ...
// 07. Render Debug 3D
// ...
// 08. Render Interface 2D (chatboxes etc, optionally does have 3d)
// ...
// 09. Render Debug 2D (stuff for dev)
Modules::objView().renderDebug2D();
// swap 3d buffers
Modules::objView().getDriver()->swapBuffers();
}
} }
} }
}
void CObjectViewerDialog::release() void CObjectViewerDialog::release()
{ {
//H_AUTO2 //H_AUTO2
nldebug("CObjectViewerDialog::release"); nldebug("CObjectViewerDialog::release");
Modules::objView().release();
}
void CObjectViewerDialog::reinit() Modules::objView().release();
{ }
//H_AUTO2
nldebug("CObjectViewerDialog::reinit");
Modules::objView().release();
//Modules::objView().reinit(_ui.frame->winId(), width(), height());
}
QAction *CObjectViewerDialog::createSaveScreenshotAction(QObject *parent)
{
QAction *action = new QAction(parent);
connect(action, SIGNAL(triggered()), this, SLOT(saveScreenshot()));
return action;
}
QAction *CObjectViewerDialog::createSetBackgroundColor(QObject *parent) void CObjectViewerDialog::reinit()
{ {
QAction *action = new QAction(parent); //H_AUTO2
connect(action, SIGNAL(triggered()), this, SLOT(setBackgroundColor())); nldebug("CObjectViewerDialog::reinit");
return action;
}
void CObjectViewerDialog::saveScreenshot() Modules::objView().release();
{ //Modules::objView().reinit(_ui.frame->winId(), width(), height());
Modules::objView().saveScreenshot("screenshot", false, true, false); }
}
void CObjectViewerDialog::setBackgroundColor() QAction *CObjectViewerDialog::createSaveScreenshotAction(QObject *parent)
{ {
QColor color = QColorDialog::getColor(QColor(Modules::objView().getBackgroundColor().R, QAction *action = new QAction(parent);
Modules::objView().getBackgroundColor().G, connect(action, SIGNAL(triggered()), this, SLOT(saveScreenshot()));
Modules::objView().getBackgroundColor().B)); return action;
Modules::objView().setBackgroundColor(NLMISC::CRGBA(color.red(), color.green(), color.blue())); }
}
void CObjectViewerDialog::topLevelChanged ( bool topLevel ) {
//nldebug("CObjectViewerDialog::topLevelChanged topLevel:%d",topLevel);
nldebug("CObjectViewerDialog::topLevelChanged winId:%d",winId());
// winId changing when re/docking
//Modules::georges().init();
Modules::objView().reinit((nlWindow)_nlw->winId(), _nlw->width(), _nlw->height());
}
void CObjectViewerDialog::resizeEvent(QResizeEvent *resizeEvent)
{
QDockWidget::resizeEvent(resizeEvent);
if (Modules::objView().getDriver())
Modules::objView().setSizeViewport(resizeEvent->size().width(), resizeEvent->size().height());
// The OpenGL driver does not resize automatically. QAction *CObjectViewerDialog::createSetBackgroundColor(QObject *parent)
// The Direct3D driver breaks the window mode to include window borders when calling setMode windowed. {
QAction *action = new QAction(parent);
connect(action, SIGNAL(triggered()), this, SLOT(setBackgroundColor()));
return action;
}
// Resizing the window after switching drivers a few times becomes slow. void CObjectViewerDialog::saveScreenshot()
// There is probably something inside the drivers not being released properly. {
} Modules::objView().saveScreenshot("screenshot", false, true, false);
}
void CObjectViewerDialog::wheelEvent(QWheelEvent *event) void CObjectViewerDialog::setBackgroundColor()
{ {
//nldebug("CObjectViewerDialog::wheelEvent"); QColor color = QColorDialog::getColor(QColor(Modules::objView().getBackgroundColor().R,
// Get relative positions. Modules::objView().getBackgroundColor().G,
float fX = 1.0f - (float)event->pos().x() / this->width(); Modules::objView().getBackgroundColor().B));
float fY = 1.0f - (float)event->pos().y() / this->height(); Modules::objView().setBackgroundColor(NLMISC::CRGBA(color.red(), color.green(), color.blue()));
}
// Set the buttons currently pressed.
NLMISC::TMouseButton buttons = (NLMISC::TMouseButton)getNelButtons(event); void CObjectViewerDialog::topLevelChanged ( bool topLevel ) {
if(event->delta() > 0) //nldebug("CObjectViewerDialog::topLevelChanged topLevel:%d",topLevel);
Modules::objView().getDriver()->EventServer.postEvent(new NLMISC::CEventMouseWheel(-fX, fY, buttons, true, this)); nldebug("CObjectViewerDialog::topLevelChanged winId:%d",winId());
else // winId changing when re/docking
Modules::objView().getDriver()->EventServer.postEvent(new NLMISC::CEventMouseWheel(-fX, fY, buttons, false, this)); //Modules::georges().init();
Modules::objView().reinit((nlWindow)_nlw->winId(), _nlw->width(), _nlw->height());
} }
uint32 CObjectViewerDialog::getNelButtons(QMouseEvent *event) { void CObjectViewerDialog::resizeEvent(QResizeEvent *resizeEvent)
//nldebug("CObjectViewerDialog::getNelButtons"); {
uint32 buttons = NLMISC::noButton; QDockWidget::resizeEvent(resizeEvent);
if(event->buttons() & Qt::LeftButton) buttons |= NLMISC::leftButton; if (Modules::objView().getDriver())
if(event->buttons() & Qt::RightButton) buttons |= NLMISC::rightButton; Modules::objView().setSizeViewport(resizeEvent->size().width(), resizeEvent->size().height());
if(event->buttons() & Qt::MidButton) buttons |= NLMISC::middleButton;
if(event->modifiers() & Qt::ControlModifier) buttons |= NLMISC::ctrlButton; // The OpenGL driver does not resize automatically.
if(event->modifiers() & Qt::ShiftModifier) buttons |= NLMISC::shiftButton; // The Direct3D driver breaks the window mode to include window borders when calling setMode windowed.
if(event->modifiers() & Qt::AltModifier) buttons |= NLMISC::altButton;
// Resizing the window after switching drivers a few times becomes slow.
return buttons; // There is probably something inside the drivers not being released properly.
} }
uint32 CObjectViewerDialog::getNelButtons(QWheelEvent *event) { void CObjectViewerDialog::wheelEvent(QWheelEvent *event)
//nldebug("CObjectViewerDialog::getNelButtons"); {
uint32 buttons = NLMISC::noButton; //nldebug("CObjectViewerDialog::wheelEvent");
if(event->buttons() & Qt::LeftButton) buttons |= NLMISC::leftButton; // Get relative positions.
if(event->buttons() & Qt::RightButton) buttons |= NLMISC::rightButton; float fX = 1.0f - (float)event->pos().x() / this->width();
if(event->buttons() & Qt::MidButton) buttons |= NLMISC::middleButton; float fY = 1.0f - (float)event->pos().y() / this->height();
if(event->modifiers() & Qt::ControlModifier) buttons |= NLMISC::ctrlButton;
if(event->modifiers() & Qt::ShiftModifier) buttons |= NLMISC::shiftButton; // Set the buttons currently pressed.
if(event->modifiers() & Qt::AltModifier) buttons |= NLMISC::altButton; NLMISC::TMouseButton buttons = (NLMISC::TMouseButton)getNelButtons(event);
if(event->delta() > 0)
return buttons; Modules::objView().getDriver()->EventServer.postEvent(new NLMISC::CEventMouseWheel(-fX, fY, buttons, true, this));
} else
Modules::objView().getDriver()->EventServer.postEvent(new NLMISC::CEventMouseWheel(-fX, fY, buttons, false, this));
void CObjectViewerDialog::mousePressEvent(QMouseEvent *event) {
//nldebug("CObjectViewerDialog::mousePressEvent"); }
// Get relative positions.
float fX = 1.0f - (float)event->pos().x() / this->width(); uint32 CObjectViewerDialog::getNelButtons(QMouseEvent *event)
float fY = 1.0f - (float)event->pos().y() / this->height(); {
//nldebug("CObjectViewerDialog::getNelButtons");
// Set the buttons currently pressed. uint32 buttons = NLMISC::noButton;
NLMISC::TMouseButton buttons = (NLMISC::TMouseButton)getNelButtons(event); if(event->buttons() & Qt::LeftButton) buttons |= NLMISC::leftButton;
if(event->buttons() & Qt::RightButton) buttons |= NLMISC::rightButton;
if(event->button() == Qt::LeftButton) if(event->buttons() & Qt::MidButton) buttons |= NLMISC::middleButton;
Modules::objView().getDriver()->EventServer.postEvent( if(event->modifiers() & Qt::ControlModifier) buttons |= NLMISC::ctrlButton;
if(event->modifiers() & Qt::ShiftModifier) buttons |= NLMISC::shiftButton;
if(event->modifiers() & Qt::AltModifier) buttons |= NLMISC::altButton;
return buttons;
}
uint32 CObjectViewerDialog::getNelButtons(QWheelEvent *event)
{
//nldebug("CObjectViewerDialog::getNelButtons");
uint32 buttons = NLMISC::noButton;
if(event->buttons() & Qt::LeftButton) buttons |= NLMISC::leftButton;
if(event->buttons() & Qt::RightButton) buttons |= NLMISC::rightButton;
if(event->buttons() & Qt::MidButton) buttons |= NLMISC::middleButton;
if(event->modifiers() & Qt::ControlModifier) buttons |= NLMISC::ctrlButton;
if(event->modifiers() & Qt::ShiftModifier) buttons |= NLMISC::shiftButton;
if(event->modifiers() & Qt::AltModifier) buttons |= NLMISC::altButton;
return buttons;
}
void CObjectViewerDialog::mousePressEvent(QMouseEvent *event)
{
//nldebug("CObjectViewerDialog::mousePressEvent");
// Get relative positions.
float fX = 1.0f - (float)event->pos().x() / this->width();
float fY = 1.0f - (float)event->pos().y() / this->height();
// Set the buttons currently pressed.
NLMISC::TMouseButton buttons = (NLMISC::TMouseButton)getNelButtons(event);
if(event->button() == Qt::LeftButton)
Modules::objView().getDriver()->EventServer.postEvent(
new NLMISC::CEventMouseDown( -fX, fY, new NLMISC::CEventMouseDown( -fX, fY,
(NLMISC::TMouseButton)(NLMISC::leftButton|(buttons&~(NLMISC::leftButton|NLMISC::middleButton|NLMISC::rightButton))), this)); (NLMISC::TMouseButton)(NLMISC::leftButton|(buttons&~(NLMISC::leftButton|NLMISC::middleButton|NLMISC::rightButton))), this));
if(event->button() == Qt::MidButton) if(event->button() == Qt::MidButton)
Modules::objView().getDriver()->EventServer.postEvent( Modules::objView().getDriver()->EventServer.postEvent(
new NLMISC::CEventMouseDown( -fX, fY, new NLMISC::CEventMouseDown( -fX, fY,
(NLMISC::TMouseButton)(NLMISC::middleButton|(buttons&~(NLMISC::middleButton|NLMISC::leftButton|NLMISC::rightButton))), this)); (NLMISC::TMouseButton)(NLMISC::middleButton|(buttons&~(NLMISC::middleButton|NLMISC::leftButton|NLMISC::rightButton))), this));
if(event->button() == Qt::RightButton) if(event->button() == Qt::RightButton)
Modules::objView().getDriver()->EventServer.postEvent( Modules::objView().getDriver()->EventServer.postEvent(
new NLMISC::CEventMouseDown( -fX, fY, new NLMISC::CEventMouseDown( -fX, fY,
(NLMISC::TMouseButton)(NLMISC::rightButton|(buttons&~(NLMISC::rightButton|NLMISC::leftButton|NLMISC::middleButton))), this)); (NLMISC::TMouseButton)(NLMISC::rightButton|(buttons&~(NLMISC::rightButton|NLMISC::leftButton|NLMISC::middleButton))), this));
} }
void CObjectViewerDialog::mouseReleaseEvent(QMouseEvent *event) { void CObjectViewerDialog::mouseReleaseEvent(QMouseEvent *event)
//nldebug("CObjectViewerDialog::mouseReleaseEvent"); {
// Get relative positions. //nldebug("CObjectViewerDialog::mouseReleaseEvent");
float fX = 1.0f - (float)event->pos().x() / this->width(); // Get relative positions.
float fY = 1.0f - (float)event->pos().y() / this->height(); float fX = 1.0f - (float)event->pos().x() / this->width();
float fY = 1.0f - (float)event->pos().y() / this->height();
// Set the buttons currently pressed.
NLMISC::TMouseButton buttons = (NLMISC::TMouseButton)getNelButtons(event); // Set the buttons currently pressed.
NLMISC::TMouseButton buttons = (NLMISC::TMouseButton)getNelButtons(event);
if(event->button() == Qt::LeftButton)
Modules::objView().getDriver()->EventServer.postEvent( if(event->button() == Qt::LeftButton)
Modules::objView().getDriver()->EventServer.postEvent(
new NLMISC::CEventMouseUp( -fX, fY, NLMISC::leftButton, this)); new NLMISC::CEventMouseUp( -fX, fY, NLMISC::leftButton, this));
if(event->button() == Qt::MidButton) if(event->button() == Qt::MidButton)
Modules::objView().getDriver()->EventServer.postEvent( Modules::objView().getDriver()->EventServer.postEvent(
new NLMISC::CEventMouseUp( -fX, fY, NLMISC::middleButton, this)); new NLMISC::CEventMouseUp( -fX, fY, NLMISC::middleButton, this));
if(event->button() == Qt::RightButton) if(event->button() == Qt::RightButton)
Modules::objView().getDriver()->EventServer.postEvent( Modules::objView().getDriver()->EventServer.postEvent(
new NLMISC::CEventMouseUp( -fX, fY, NLMISC::rightButton, this)); new NLMISC::CEventMouseUp( -fX, fY, NLMISC::rightButton, this));
} }
void CObjectViewerDialog::mouseMoveEvent(QMouseEvent *event) { void CObjectViewerDialog::mouseMoveEvent(QMouseEvent *event)
//nldebug("CObjectViewerDialog::mouseMoveEvent"); {
// Get relative positions. //nldebug("CObjectViewerDialog::mouseMoveEvent");
float fX = 1.0f - (float)event->pos().x() / this->width(); // Get relative positions.
float fY = 1.0f - (float)event->pos().y() / this->height(); float fX = 1.0f - (float)event->pos().x() / this->width();
float fY = 1.0f - (float)event->pos().y() / this->height();
if ((fX == 0.5f) && (fY == 0.5f)) return;
NLMISC::TMouseButton buttons = (NLMISC::TMouseButton)getNelButtons(event); if ((fX == 0.5f) && (fY == 0.5f)) return;
Modules::objView().getDriver()->EventServer.postEvent(new NLMISC::CEventMouseMove(-fX, fY, buttons, this)); NLMISC::TMouseButton buttons = (NLMISC::TMouseButton)getNelButtons(event);
} Modules::objView().getDriver()->EventServer.postEvent(new NLMISC::CEventMouseMove(-fX, fY, buttons, this));
}
} /* namespace NLQT */ } /* namespace NLQT */

@ -1,19 +1,19 @@
/* /*
Georges Editor Qt Georges Editor Qt
Copyright (C) 2010 Adrian Jaekel <aj at elane2k dot com> Copyright (C) 2010 Adrian Jaekel <aj at elane2k dot com>
This program is free software: you can redistribute it and/or modify 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 it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or the Free Software Foundation, either version 3 of the License, or
(at your option) any later version. (at your option) any later version.
This program is distributed in the hope that it will be useful, This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details. GNU General Public License for more details.
You should have received a copy of the GNU General Public License You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
#ifndef OBJECTVIEWER_DIALOG_H #ifndef OBJECTVIEWER_DIALOG_H
@ -45,63 +45,64 @@ typedef QGLWidget QNLWidget;
class QAction; class QAction;
namespace NLQT { namespace NLQT
class CObjectViewerDialog: public QDockWidget, public NLMISC::IEventEmitter
{ {
Q_OBJECT
public: class CObjectViewerDialog: public QDockWidget, public NLMISC::IEventEmitter
CObjectViewerDialog(QWidget *parent = 0); {
~CObjectViewerDialog(); Q_OBJECT
virtual void setVisible(bool visible); public:
// virtual QPaintEngine* paintEngine() const { return NULL; } CObjectViewerDialog(QWidget *parent = 0);
~CObjectViewerDialog();
void init(); virtual void setVisible(bool visible);
void release(); // virtual QPaintEngine* paintEngine() const { return NULL; }
void reinit();
QAction *createSaveScreenshotAction(QObject *parent); void init();
QAction *createSetBackgroundColor(QObject *parent); void release();
void reinit();
private Q_SLOTS: QAction *createSaveScreenshotAction(QObject *parent);
void updateRender(); QAction *createSetBackgroundColor(QObject *parent);
void saveScreenshot(); private Q_SLOTS:
void setBackgroundColor(); void updateRender();
void submitEvents(NLMISC::CEventServer &server, bool allWindows) { }; void saveScreenshot();
void emulateMouseRawMode(bool) { }; void setBackgroundColor();
void topLevelChanged(bool topLevel); void submitEvents(NLMISC::CEventServer &server, bool allWindows) { };
void emulateMouseRawMode(bool) { };
protected: void topLevelChanged(bool topLevel);
virtual void resizeEvent(QResizeEvent *resizeEvent);
virtual void mousePressEvent(QMouseEvent *event);
virtual void mouseReleaseEvent(QMouseEvent *event);
virtual void wheelEvent(QWheelEvent *event);
virtual void mouseMoveEvent(QMouseEvent *event);
uint32 getNelButtons(QMouseEvent *event);
uint32 getNelButtons(QWheelEvent *event);
private:
CObjectViewerDialog(const CObjectViewerDialog &);
CObjectViewerDialog &operator=(const CObjectViewerDialog &);
void updateInitialization(bool visible); protected:
virtual void resizeEvent(QResizeEvent *resizeEvent);
virtual void mousePressEvent(QMouseEvent *event);
virtual void mouseReleaseEvent(QMouseEvent *event);
virtual void wheelEvent(QWheelEvent *event);
virtual void mouseMoveEvent(QMouseEvent *event);
Ui::CObjectViewerDialog _ui; uint32 getNelButtons(QMouseEvent *event);
uint32 getNelButtons(QWheelEvent *event);
// render stuff
QTimer *_mainTimer;
bool _isGraphicsInitialized, _isGraphicsEnabled;
QNLWidget * _nlw; private:
CObjectViewerDialog(const CObjectViewerDialog &);
CObjectViewerDialog &operator=(const CObjectViewerDialog &);
friend class CMainWindow; void updateInitialization(bool visible);
}; /* CObjectViewerDialog */
Ui::CObjectViewerDialog _ui;
// render stuff
QTimer *_mainTimer;
bool _isGraphicsInitialized, _isGraphicsEnabled;
QNLWidget * _nlw;
friend class CMainWindow;
}; /* CObjectViewerDialog */
} /* namespace NLQT */ } /* namespace NLQT */

@ -24,14 +24,18 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include <nel/misc/debug.h> #include <nel/misc/debug.h>
#include <nel/misc/file.h> #include <nel/misc/file.h>
namespace NLQT { namespace NLQT
{
CQtDisplayer::CQtDisplayer(QPlainTextEdit *dlgDebug, bool eraseLastLog, const char *displayerName, bool raw) CQtDisplayer::CQtDisplayer(QPlainTextEdit *dlgDebug, bool eraseLastLog, const char *displayerName, bool raw)
: NLMISC::IDisplayer (displayerName), _NeedHeader(true), _LastLogSizeChecked(0), _Raw(raw) { : NLMISC::IDisplayer (displayerName), _NeedHeader(true), _LastLogSizeChecked(0), _Raw(raw)
setParam(dlgDebug,eraseLastLog); {
setParam(dlgDebug,eraseLastLog);
} }
CQtDisplayer::CQtDisplayer() : IDisplayer (""), _NeedHeader(true), _LastLogSizeChecked(0), _Raw(false) { CQtDisplayer::CQtDisplayer()
: IDisplayer (""), _NeedHeader(true), _LastLogSizeChecked(0), _Raw(false)
{
; ;
} }
@ -39,12 +43,14 @@ namespace NLQT {
; ;
} }
void CQtDisplayer::setParam (QPlainTextEdit *dlgDebug, bool eraseLastLog) { void CQtDisplayer::setParam (QPlainTextEdit *dlgDebug, bool eraseLastLog)
{
m_DlgDebug=dlgDebug; m_DlgDebug=dlgDebug;
//dlgDebug->dlgDbgText->WriteText("test"); //dlgDebug->dlgDbgText->WriteText("test");
} }
void CQtDisplayer::doDisplay ( const NLMISC::CLog::TDisplayInfo& args, const char *message ) { void CQtDisplayer::doDisplay ( const NLMISC::CLog::TDisplayInfo& args, const char *message )
{
bool needSpace = false; bool needSpace = false;
std::string str; std::string str;
@ -58,7 +64,8 @@ namespace NLQT {
needSpace = true; needSpace = true;
} }
if (args.LogType != NLMISC::CLog::LOG_NO && !_Raw) { if (args.LogType != NLMISC::CLog::LOG_NO && !_Raw)
{
if (needSpace) { str += " "; needSpace = false; } if (needSpace) { str += " "; needSpace = false; }
str += logTypeToString(args.LogType); str += logTypeToString(args.LogType);
if (args.LogType == NLMISC::CLog::LOG_WARNING) if (args.LogType == NLMISC::CLog::LOG_WARNING)
@ -70,14 +77,14 @@ namespace NLQT {
// Write thread identifier // Write thread identifier
/*if ( args.ThreadId != 0 && !_Raw) { /*if ( args.ThreadId != 0 && !_Raw) {
if (needSpace) { str += " "; needSpace = false; } if (needSpace) { str += " "; needSpace = false; }
str += NLMISC::toString(args.ThreadId); str += NLMISC::toString(args.ThreadId);
needSpace = true; needSpace = true;
}*/ }*/
/*if (!args.ProcessName.empty() && !_Raw) { /*if (!args.ProcessName.empty() && !_Raw) {
if (needSpace) { str += " "; needSpace = false; } if (needSpace) { str += " "; needSpace = false; }
str += args.ProcessName; str += args.ProcessName;
needSpace = true; needSpace = true;
}*/ }*/
//if (args.FileName != NULL && !_Raw) { //if (args.FileName != NULL && !_Raw) {
@ -87,22 +94,29 @@ namespace NLQT {
//} //}
/*if (args.Line != -1 && !_Raw) { /*if (args.Line != -1 && !_Raw) {
if (needSpace) { str += " "; needSpace = false; } if (needSpace) { str += " "; needSpace = false; }
str += NLMISC::toString(args.Line); str += NLMISC::toString(args.Line);
needSpace = true; needSpace = true;
}*/ }*/
if (args.FuncName != NULL && !_Raw) { if (args.FuncName != NULL && !_Raw)
if (needSpace) { str += " "; needSpace = false; } {
if (needSpace)
{
str += " "; needSpace = false;
}
str += args.FuncName; str += args.FuncName;
needSpace = true; needSpace = true;
} }
if (needSpace) { str += " : "; needSpace = false; } if (needSpace)
{
str += " : "; needSpace = false;
}
str += message; str += message;
m_DlgDebug->textCursor().insertText(str.c_str(), format); m_DlgDebug->textCursor().insertText(str.c_str(), format);
//m_DlgDebug->setCenterOnScroll(true); //m_DlgDebug->setCenterOnScroll(true);
m_DlgDebug->centerCursor(); m_DlgDebug->centerCursor();

@ -28,10 +28,12 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
// Qt includes // Qt includes
#include <QPlainTextEdit> #include <QPlainTextEdit>
namespace NLQT { namespace NLQT
{
class CQtDisplayer : virtual public NLMISC::IDisplayer class CQtDisplayer : virtual public NLMISC::IDisplayer
{ {
public: public:
CQtDisplayer(QPlainTextEdit *dlgDebug, bool eraseLastLog = false, const char *displayerName = "", bool raw = false); CQtDisplayer(QPlainTextEdit *dlgDebug, bool eraseLastLog = false, const char *displayerName = "", bool raw = false);
CQtDisplayer(); CQtDisplayer();
@ -42,7 +44,7 @@ namespace NLQT {
virtual void doDisplay ( const NLMISC::CLog::TDisplayInfo& args, const char *message ); virtual void doDisplay ( const NLMISC::CLog::TDisplayInfo& args, const char *message );
private: private:
QPlainTextEdit *m_DlgDebug; QPlainTextEdit *m_DlgDebug;
bool _NeedHeader; bool _NeedHeader;
uint _LastLogSizeChecked; uint _LastLogSizeChecked;
bool _Raw; bool _Raw;

@ -31,7 +31,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
using namespace NLMISC; using namespace NLMISC;
namespace NLQT { namespace NLQT
{
CSettingsDialog::CSettingsDialog(QWidget *parent) CSettingsDialog::CSettingsDialog(QWidget *parent)
: QDialog(parent) : QDialog(parent)
@ -72,7 +73,8 @@ namespace NLQT {
QFileDialog dialog(this); QFileDialog dialog(this);
dialog.setOption(QFileDialog::ShowDirsOnly, true); dialog.setOption(QFileDialog::ShowDirsOnly, true);
dialog.setFileMode(QFileDialog::Directory); dialog.setFileMode(QFileDialog::Directory);
if (dialog.exec()) { if (dialog.exec())
{
QString newPath = dialog.selectedFiles().first(); QString newPath = dialog.selectedFiles().first();
if (!newPath.isEmpty()) if (!newPath.isEmpty())
{ {
@ -137,9 +139,12 @@ namespace NLQT {
list.push_back(str); list.push_back(str);
} }
if (list.empty()) { if (list.empty())
{
Modules::config().getConfigFile().getVar("SearchPaths").forceAsString(""); Modules::config().getConfigFile().getVar("SearchPaths").forceAsString("");
} else { }
else
{
Modules::config().getConfigFile().getVar("SearchPaths").forceAsString(""); Modules::config().getConfigFile().getVar("SearchPaths").forceAsString("");
Modules::config().getConfigFile().getVar("SearchPaths").setAsString(list); Modules::config().getConfigFile().getVar("SearchPaths").setAsString(list);
} }
@ -197,4 +202,5 @@ namespace NLQT {
ui.leveldesignPath->setText(QFileDialog::getExistingDirectory(this, tr("Open Directory"), ui.leveldesignPath->setText(QFileDialog::getExistingDirectory(this, tr("Open Directory"),
QDir::currentPath(), QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks)); QDir::currentPath(), QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks));
} }
} /* namespace NLQT */
} /* namespace NLQT */

@ -1,19 +1,19 @@
/* /*
Georges Editor Qt Georges Editor Qt
Copyright (C) 2010 Adrian Jaekel <aj at elane2k dot com> Copyright (C) 2010 Adrian Jaekel <aj at elane2k dot com>
This program is free software: you can redistribute it and/or modify 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 it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or the Free Software Foundation, either version 3 of the License, or
(at your option) any later version. (at your option) any later version.
This program is distributed in the hope that it will be useful, This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details. GNU General Public License for more details.
You should have received a copy of the GNU General Public License You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
#ifndef SETTINGS_DIALOG_H #ifndef SETTINGS_DIALOG_H
@ -29,36 +29,37 @@
// Project includes // Project includes
namespace NLQT { namespace NLQT
class CSettingsDialog: public QDialog
{ {
Q_OBJECT
class CSettingsDialog: public QDialog
public: {
CSettingsDialog(QWidget *parent = 0); Q_OBJECT
~CSettingsDialog();
public:
Q_SIGNALS: CSettingsDialog(QWidget *parent = 0);
void ldPathChanged(QString); ~CSettingsDialog();
private Q_SLOTS: Q_SIGNALS:
void addPath(); void ldPathChanged(QString);
void removePath();
void upPath(); private Q_SLOTS:
void downPath(); void addPath();
void applyPressed(); void removePath();
void browseLeveldesignPath(); void upPath();
void downPath();
private: void applyPressed();
void cfcbGraphicsDrivers(NLMISC::CConfigFile::CVar &var); void browseLeveldesignPath();
void cfcbSoundDrivers(NLMISC::CConfigFile::CVar &var);
void cfcbSearchPaths(NLMISC::CConfigFile::CVar &var); private:
void cfcbLeveldesignPath(NLMISC::CConfigFile::CVar &var); void cfcbGraphicsDrivers(NLMISC::CConfigFile::CVar &var);
void cfcbSoundDrivers(NLMISC::CConfigFile::CVar &var);
Ui::CSettingsDialog ui; void cfcbSearchPaths(NLMISC::CConfigFile::CVar &var);
void cfcbLeveldesignPath(NLMISC::CConfigFile::CVar &var);
}; /* class CSettingsDialog */
Ui::CSettingsDialog ui;
}; /* class CSettingsDialog */
} /* namespace NLQT */ } /* namespace NLQT */

@ -1,275 +0,0 @@
/*
Georges Editor Qt
Copyright (C) 2010 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 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 "spindelegate.h"
// NeL includes
#include <nel/misc/debug.h>
#include <nel/georges/u_type.h>
#include <nel/georges/u_form_elm.h>
// Qt includes
#include <QSpinBox>
#include <QLineEdit>
#include <QDoubleSpinBox>
#include <QColorDialog>
#include <QComboBox>
#include <QApplication>
#include <QTextDocument>
#include <QAbstractTextDocumentLayout>
#include <QPainter>
// Project includes
#include "georgesform_model.h"
#include "formitem.h"
namespace NLQT {
SpinBoxDelegate::SpinBoxDelegate(QObject *parent)
: QStyledItemDelegate(parent)
{
}
QWidget *SpinBoxDelegate::createEditor(QWidget *parent,
const QStyleOptionViewItem & option ,
const QModelIndex &index) const
{
CFormItem *item = static_cast<CFormItem*>(index.internalPointer());
QString value = item->data(1).toString();
if (value.isEmpty())
return 0;
const NLGEORGES::UType *type = qobject_cast<const CGeorgesFormModel *>(index.model())->
getItem(index)->getFormElm()->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 SpinBoxDelegate::setEditorData(QWidget *editor,
const QModelIndex &index) const
{
const NLGEORGES::UType *type = qobject_cast<const CGeorgesFormModel *>(index.model())->
getItem(index)->getFormElm()->getType();
int numDefinitions = type->getNumDefinition();
QString value = index.model()->data(index, Qt::DisplayRole).toString();
if (numDefinitions) {
QComboBox *cb = static_cast<QComboBox*>(editor);
cb->setCurrentIndex(cb->findText(value));
//cb->setIconSize()
} else {
switch (type->getType()) {
case NLGEORGES::UType::UnsignedInt:
case NLGEORGES::UType::SignedInt:
{
QSpinBox *spinBox = static_cast<QSpinBox*>(editor);
spinBox->setValue((int)value.toDouble());
break;
}
case NLGEORGES::UType::Double:
{
QDoubleSpinBox *spinBox = static_cast<QDoubleSpinBox*>(editor);
spinBox->setValue(value.toDouble());
break;
}
case NLGEORGES::UType::Color:
{
break;
}
default:
{
QLineEdit *textEdit = static_cast<QLineEdit*>(editor);
textEdit->setText(value);
break;
}
}
}
}
void SpinBoxDelegate::setModelData(QWidget *editor, QAbstractItemModel *model,
const QModelIndex &index) const
{
const NLGEORGES::UType *type = qobject_cast<const CGeorgesFormModel *>(index.model())->
getItem(index)->getFormElm()->getType();
int numDefinitions = type->getNumDefinition();
if (numDefinitions) {
QComboBox *comboBox = static_cast<QComboBox*>(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<QSpinBox*>(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<QDoubleSpinBox*>(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<QLineEdit*>(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 SpinBoxDelegate::updateEditorGeometry(QWidget *editor,
const QStyleOptionViewItem &option, const QModelIndex &index) const
{
QRect r = option.rect;
editor->setGeometry(r);
//option.decorationAlignment = QStyleOptionViewItem::Right;
}
void SpinBoxDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
QStyleOptionViewItemV4 optionV4 = option;
optionV4.decorationPosition = QStyleOptionViewItem::Right;
//optionV4.decorationSize = QSize(32,32);
initStyleOption(&optionV4, index);
QStyledItemDelegate::paint(painter,optionV4,index);
//QStyle *style = optionV4.widget? optionV4.widget->style() : QApplication::style();
//QTextDocument doc;
//doc.setHtml(optionV4.text);
///// Painting item without text
//optionV4.text = QString();
//style->drawControl(QStyle::CE_ItemViewItem, &optionV4, painter);
//QAbstractTextDocumentLayout::PaintContext ctx;
//// Highlighting text if item is selected
//if (optionV4.state & QStyle::State_Selected)
// ctx.palette.setColor(QPalette::Text, optionV4.palette.color(QPalette::Active, QPalette::HighlightedText));
//QRect textRect = style->subElementRect(QStyle::SE_ItemViewItemText, &optionV4);
//painter->save();
//painter->translate(textRect.topLeft());
//painter->setClipRect(textRect.translated(-textRect.topLeft()));
//doc.documentLayout()->draw(painter, ctx);
//painter->restore();
}
}

@ -1,44 +0,0 @@
/*
Georges Editor Qt
Copyright (C) 2010 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 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/>.
*/
#ifndef DELEGATE_H
#define DELEGATE_H
#include <QStyledItemDelegate>
namespace NLQT {
class SpinBoxDelegate : public QStyledItemDelegate
{
public:
SpinBoxDelegate(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;
void paint ( QPainter * painter, const QStyleOptionViewItem & option,
const QModelIndex & index ) const;
};
}
#endif
Loading…
Cancel
Save