khanat-opennel-code/code/nel/tools/3d/object_viewer_qt/src/animation_set_dialog.cpp

294 lines
8.1 KiB
C++
Raw Normal View History

/*
Object Viewer Qt
Copyright (C) 2010 Dzmitry Kamiahin <dnk-88@tut.by>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "stdpch.h"
#include "animation_set_dialog.h"
// Qt includes
#include <QtGui/QFileDialog>
// NeL includes
// Project includes
#include "modules.h"
#include "entity.h"
2010-11-26 11:54:06 +00:00
namespace NLQT
{
CAnimationSetDialog::CAnimationSetDialog(QWidget *parent)
2010-11-26 11:54:06 +00:00
: QDockWidget(parent)
{
ui.setupUi(this);
connect(ui.addToolButton, SIGNAL(clicked()), this, SLOT(addAnim()));
connect(ui.removeToolButton, SIGNAL(clicked()), this, SLOT(removeAnim()));
connect(ui.upToolButton, SIGNAL(clicked()), this, SLOT(upAnim()));
connect(ui.downToolButton, SIGNAL(clicked()), this, SLOT(downAnim()));
connect(ui.addAnimPushButton, SIGNAL(clicked()), this, SLOT(loadAnim()));
connect(ui.addSwtPushButton, SIGNAL(clicked()), this, SLOT(loadSwt()));
connect(ui.resetPushButton, SIGNAL(clicked()), this, SLOT(resetAnim()));
connect(ui.listRadioButton, SIGNAL(clicked(bool)), this, SLOT(setModeAnim()));
connect(ui.mixerRadioButton, SIGNAL(clicked(bool)), this, SLOT(setModeAnim()));
2010-11-26 11:54:06 +00:00
connect(ui.objectsComboBox, SIGNAL(currentIndexChanged(QString)), this, SLOT(setCurrentShape(QString)));
}
CAnimationSetDialog::~CAnimationSetDialog()
{
}
void CAnimationSetDialog::setCurrentShape(const QString &name)
{
2010-11-26 11:54:06 +00:00
if (name.isEmpty())
return;
Modules::objView().setCurrentObject(name.toStdString());
updateListAnim();
2010-11-26 11:54:06 +00:00
Q_EMIT changeCurrentShape(name);
2010-11-26 11:54:06 +00:00
}
void CAnimationSetDialog::setModeAnim()
{
std::string curObj = Modules::objView().getCurrentObject();
2010-11-26 11:54:06 +00:00
if (curObj.empty())
return;
CEntity &entity = Modules::objView().getEntity(curObj);
if (ui.mixerRadioButton->isChecked())
entity.setMode(CEntity::Mode::Mixer);
else
entity.setMode(CEntity::Mode::PlayList);
}
void CAnimationSetDialog::updateListObject()
{
ui.objectsComboBox->clear();
std::vector<std::string> listObjects;
Modules::objView().getListObjects(listObjects);
for (size_t i = 0; i < listObjects.size(); i++)
ui.objectsComboBox->addItem(QString(listObjects[i].c_str()));
2010-11-26 11:54:06 +00:00
if (listObjects.empty())
{
ui.addAnimPushButton->setEnabled(false);
2010-11-26 11:54:06 +00:00
ui.addSwtPushButton->setEnabled(false);
ui.resetPushButton->setEnabled(false);
ui.setLengthPushButton->setEnabled(false);
}
else
{
ui.addAnimPushButton->setEnabled(true);
ui.addSwtPushButton->setEnabled(true);
ui.resetPushButton->setEnabled(true);
ui.setLengthPushButton->setEnabled(true);
}
}
void CAnimationSetDialog::updateListAnim()
{
ui.animTreeWidget->clear();
ui.animPlaylistWidget->clear();
ui.skeletonTreeWidget->clear();
2010-11-26 11:54:06 +00:00
std::string curObj = Modules::objView().getCurrentObject();
2010-11-26 11:54:06 +00:00
if (curObj.empty())
return;
CEntity &entity = Modules::objView().getEntity(curObj);
2010-11-26 11:54:06 +00:00
std::vector<std::string>& animationList = entity.getAnimationList();
std::vector<std::string>& swtList = entity.getSWTList();
std::vector<std::string>& playListAnimation = entity.getPlayListAnimation();
2010-11-26 11:54:06 +00:00
// update animation list widget
for(size_t i = 0; i < animationList.size(); ++i)
{
QTreeWidgetItem *item = new QTreeWidgetItem(ui.animTreeWidget);
item->setText(0,QString(animationList[i].c_str()));
}
2010-11-26 11:54:06 +00:00
// update skeleton weight template list widget
for(size_t i = 0; i < swtList.size(); ++i)
{
QTreeWidgetItem *item = new QTreeWidgetItem(ui.skeletonTreeWidget);
item->setText(0,QString(swtList[i].c_str()));
}
2010-11-26 11:54:06 +00:00
// update PlayList animation widget
for(size_t i = 0; i < playListAnimation.size(); ++i)
{
QListWidgetItem *item = new QListWidgetItem(ui.animPlaylistWidget);
item->setText(QString(playListAnimation[i].c_str()));
}
2010-11-26 11:54:06 +00:00
if (animationList.empty())
{
// lock buttons
ui.addToolButton->setEnabled(false);
2010-11-26 11:54:06 +00:00
ui.removeToolButton->setEnabled(false);
ui.upToolButton->setEnabled(false);
2010-11-26 11:54:06 +00:00
ui.downToolButton->setEnabled(false);
}
else
{
2010-11-26 11:54:06 +00:00
// unlock buttons
ui.addToolButton->setEnabled(true);
2010-11-26 11:54:06 +00:00
ui.removeToolButton->setEnabled(true);
ui.upToolButton->setEnabled(true);
2010-11-26 11:54:06 +00:00
ui.downToolButton->setEnabled(true);
}
}
void CAnimationSetDialog::loadAnim()
{
CEntity &entity = Modules::objView().getEntity(Modules::objView().getCurrentObject());
QStringList fileNames = QFileDialog::getOpenFileNames(this,
2010-11-26 11:54:06 +00:00
tr("Open NeL anim file"), ".",
tr("NeL anim files (*.anim);;"));
setCursor(Qt::WaitCursor);
2010-11-26 11:54:06 +00:00
if (!fileNames.isEmpty())
{
QStringList list = fileNames;
2010-11-26 11:54:06 +00:00
QStringList::Iterator it = list.begin();
while(it != list.end())
{
std::string animName = it->toStdString();
entity.loadAnimation(animName);
++it;
}
updateListAnim();
}
setCursor(Qt::ArrowCursor);
}
void CAnimationSetDialog::loadSwt()
{
2010-11-26 11:54:06 +00:00
CEntity &entity = Modules::objView().getEntity(Modules::objView().getCurrentObject());
QStringList fileNames = QFileDialog::getOpenFileNames(this,
2010-11-26 11:54:06 +00:00
tr("Open NeL anim file"), ".",
tr("NeL Skeleton Weight Template files (*.swt);;"));
setCursor(Qt::WaitCursor);
2010-11-26 11:54:06 +00:00
if (!fileNames.isEmpty())
{
QStringList list = fileNames;
2010-11-26 11:54:06 +00:00
QStringList::Iterator it = list.begin();
while(it != list.end())
{
std::string swtName = it->toStdString();
entity.loadSWT(swtName);
++it;
}
updateListAnim();
}
setCursor(Qt::ArrowCursor);
}
void CAnimationSetDialog::resetAnim()
{
CEntity &entity = Modules::objView().getEntity(Modules::objView().getCurrentObject());
entity.reset();
2010-11-26 11:54:06 +00:00
updateListAnim();
}
void CAnimationSetDialog::addAnim()
{
CEntity &entity = Modules::objView().getEntity(Modules::objView().getCurrentObject());
QList<QTreeWidgetItem*> list = ui.animTreeWidget->selectedItems();
Q_FOREACH(QTreeWidgetItem* item, list)
{
std::string animName = item->text(0).toStdString();
entity.addAnimToPlayList(animName);
ui.animPlaylistWidget->addItem(item->text(0));
}
}
void CAnimationSetDialog::removeAnim()
{
CEntity &entity = Modules::objView().getEntity(Modules::objView().getCurrentObject());
QList<QListWidgetItem*> list = ui.animPlaylistWidget->selectedItems();
Q_FOREACH(QListWidgetItem* item, list)
{
int row = ui.animPlaylistWidget->row(item);
QListWidgetItem *removeItem = ui.animPlaylistWidget->takeItem(row);
2010-11-26 11:54:06 +00:00
if (!removeItem)
delete removeItem;
entity.removeAnimToPlayList(row);
}
}
void CAnimationSetDialog::upAnim()
{
CEntity &entity = Modules::objView().getEntity(Modules::objView().getCurrentObject());
QList<QListWidgetItem*> list = ui.animPlaylistWidget->selectedItems();
if (list.empty())
return;
int frontRow = ui.animPlaylistWidget->row(list.front());
int backRow = ui.animPlaylistWidget->row(list.back());
2010-11-26 11:54:06 +00:00
if (frontRow == 0)
return;
QListWidgetItem *item = ui.animPlaylistWidget->takeItem(frontRow - 1);
ui.animPlaylistWidget->insertItem(backRow, item);
for (int i = frontRow; i <= backRow; ++i)
entity.swapAnimToPlayList(i - 1, i);
}
void CAnimationSetDialog::downAnim()
2010-11-26 11:54:06 +00:00
{
CEntity &entity = Modules::objView().getEntity(Modules::objView().getCurrentObject());
QList<QListWidgetItem*> list = ui.animPlaylistWidget->selectedItems();
if (list.empty())
return;
int frontRow = ui.animPlaylistWidget->row(list.front());
int backRow = ui.animPlaylistWidget->row(list.back());
2010-11-26 11:54:06 +00:00
if (backRow == (ui.animPlaylistWidget->count() - 1))
return;
QListWidgetItem *item = ui.animPlaylistWidget->takeItem(backRow + 1);
ui.animPlaylistWidget->insertItem(frontRow, item);
for (int i = backRow; i >= frontRow; --i)
entity.swapAnimToPlayList(i, i + 1);
}
2010-11-26 11:54:06 +00:00
} /* namespace NLQT */