From 91fa1471464714af22d93b409eed9c35b06023ff Mon Sep 17 00:00:00 2001 From: Pieter van der Kloet Date: Tue, 29 Mar 2011 01:31:42 +0200 Subject: [PATCH 001/111] Modified CMake to include the launcher directory --- CMakeLists.txt | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 49a4b9eccc..5a18751aad 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -294,10 +294,10 @@ if (WIN32) configure_file(${OpenMW_SOURCE_DIR}/files/plugins.cfg.win32 "${OpenMW_BINARY_DIR}/plugins.cfg" COPYONLY) endif (WIN32) -if (${CMAKE_SYSTEM_NAME} MATCHES "Linux") +if (LINUX) configure_file(${OpenMW_SOURCE_DIR}/files/plugins.cfg.linux "${OpenMW_BINARY_DIR}/plugins.cfg") -endif() +endif (LINUX) if (APPLE) configure_file(${OpenMW_SOURCE_DIR}/files/plugins.cfg.mac "${OpenMW_BINARY_DIR}/plugins.cfg") @@ -394,6 +394,8 @@ if (BUILD_ESMTOOL) add_subdirectory( apps/esmtool ) endif() +add_subdirectory( apps/launcher ) + if (WIN32) if (MSVC) if (USE_DEBUG_CONSOLE) From 7a032667299914a9c4f8a10f870daf4fef1eb975 Mon Sep 17 00:00:00 2001 From: Pieter van der Kloet Date: Tue, 29 Mar 2011 01:36:26 +0200 Subject: [PATCH 002/111] Initial commit of the launcher --- apps/launcher/CMakeLists.txt | 53 ++++ apps/launcher/datafilesdialog.cpp | 371 ++++++++++++++++++++++ apps/launcher/datafilesdialog.h | 54 ++++ apps/launcher/datafilesmodel.cpp | 145 +++++++++ apps/launcher/datafilesmodel.h | 38 +++ apps/launcher/launcher.pro | 23 ++ apps/launcher/launcher.rc | 1 + apps/launcher/lineedit.cpp | 46 +++ apps/launcher/lineedit.h | 35 ++ apps/launcher/main.cpp | 13 + apps/launcher/maindialog.cpp | 121 +++++++ apps/launcher/maindialog.h | 25 ++ apps/launcher/resources.qrc | 7 + apps/launcher/resources/clear.png | Bin 0 -> 644 bytes apps/launcher/resources/openmw_header.png | Bin 0 -> 108088 bytes apps/launcher/resources/openmw_icon.ico | Bin 0 -> 61282 bytes apps/launcher/resources/openmw_icon.png | Bin 0 -> 60039 bytes apps/launcher/settingsdialog.cpp | 259 +++++++++++++++ apps/launcher/settingsdialog.h | 46 +++ 19 files changed, 1237 insertions(+) create mode 100644 apps/launcher/CMakeLists.txt create mode 100644 apps/launcher/datafilesdialog.cpp create mode 100644 apps/launcher/datafilesdialog.h create mode 100644 apps/launcher/datafilesmodel.cpp create mode 100644 apps/launcher/datafilesmodel.h create mode 100644 apps/launcher/launcher.pro create mode 100644 apps/launcher/launcher.rc create mode 100644 apps/launcher/lineedit.cpp create mode 100644 apps/launcher/lineedit.h create mode 100644 apps/launcher/main.cpp create mode 100644 apps/launcher/maindialog.cpp create mode 100644 apps/launcher/maindialog.h create mode 100644 apps/launcher/resources.qrc create mode 100644 apps/launcher/resources/clear.png create mode 100644 apps/launcher/resources/openmw_header.png create mode 100644 apps/launcher/resources/openmw_icon.ico create mode 100644 apps/launcher/resources/openmw_icon.png create mode 100644 apps/launcher/settingsdialog.cpp create mode 100644 apps/launcher/settingsdialog.h diff --git a/apps/launcher/CMakeLists.txt b/apps/launcher/CMakeLists.txt new file mode 100644 index 0000000000..291103b28c --- /dev/null +++ b/apps/launcher/CMakeLists.txt @@ -0,0 +1,53 @@ +set(LAUNCHER + datafilesdialog.cpp + datafilesmodel.cpp + lineedit.cpp + main.cpp + maindialog.cpp + settingsdialog.cpp + datafilesdialog.h + datafilesmodel.h + lineedit.h + maindialog.h + settingsdialog.h +) + +SET(MOC_HDRS + datafilesdialog.h + lineedit.h + maindialog.h + settingsdialog.h +) + +source_group(apps\\launcher FILES ${ESMTOOL}) + +find_package(Qt4 REQUIRED) +set(QT_USE_QTGUI 1) + +QT4_ADD_RESOURCES(RCC_SRCS resources.qrc) +QT4_WRAP_CPP(MOC_SRCS ${MOC_HDRS}) + +include(${QT_USE_FILE}) + +# Main executable +add_executable(launcher + ${LAUNCHER} + ${MISC} ${MISC_HEADER} + ${TO_UTF8} + ${ESM} + ${RCC_SRCS} + ${MOC_SRCS} +) + +target_link_libraries(launcher + ${Boost_LIBRARIES} + ${OGRE_LIBRARIES} + ${QT_LIBRARIES} +) + + + +#if (APPLE) +# find_library(CARBON_FRAMEWORK Carbon) +# target_link_libraries(openmw ${CARBON_FRAMEWORK}) +#endif (APPLE) diff --git a/apps/launcher/datafilesdialog.cpp b/apps/launcher/datafilesdialog.cpp new file mode 100644 index 0000000000..201e2939c9 --- /dev/null +++ b/apps/launcher/datafilesdialog.cpp @@ -0,0 +1,371 @@ +#include +#include + +#include "datafilesdialog.h" +#include "datafilesmodel.h" + +using namespace ESM; + +//DataFilesDialog::DataFilesDialog(QWidget *parent) +// : QDialog(parent) + +DataFilesDialog::DataFilesDialog() +{ + //QWidget *centralWidget = new QWidget; + + dataFilesModel = new DataFilesModel(); + dataFilesModel->setReadOnly(true); // Prevent changes to files + dataFilesModel->setRootPath("/opt/openmw/data"); + +// sortModel = new QSortFilterProxyModel(); +// sortModel->setSourceModel(dataFilesModel); + + selectionModel = new QItemSelectionModel(dataFilesModel); +// selectionModel = new QItemSelectionModel(sortModel); + + // First, show only plugin files and sort them + QStringList acceptedfiles = (QStringList() << "*.esp"); + dataFilesModel->setNameFilters(acceptedfiles); + dataFilesModel->setNameFilterDisables(false); // Hide all other files + + dataFilesModel->sort(3, Qt::AscendingOrder); // Sort the plugins by date + dataFilesModel->submit(); // Force refresh of the data + + // Now show master files too, to make them appear at the top of the list + acceptedfiles = (QStringList() << "*.esm" << "*.esp"); + dataFilesModel->setNameFilters(acceptedfiles); + dataFilesModel->setFilter(QDir::Files); + + // Column 1 + QVBoxLayout *dialogLayout = new QVBoxLayout(this); + QHBoxLayout *groupsLayout = new QHBoxLayout(); + + QGroupBox *groupFiles = new QGroupBox(tr("Morrowind Files"), this); + groupFiles->setMinimumWidth(450); + QVBoxLayout *groupFilesLayout = new QVBoxLayout(groupFiles); + + QSpacerItem *vSpacer1 = new QSpacerItem(20, 2, QSizePolicy::Minimum, QSizePolicy::Fixed); + + QHBoxLayout *filterLayout = new QHBoxLayout(); + QLabel *labelFilter = new QLabel(tr("Filter:"), groupFiles); + lineFilter = new LineEdit(groupFiles); + + filterLayout->addWidget(labelFilter); + filterLayout->addWidget(lineFilter); + + // View for the game files + dataFilesView = new QTableView(groupFiles); + + // Put everything in the correct layouts + groupFilesLayout->addLayout(filterLayout); + groupFilesLayout->addItem(vSpacer1); + groupFilesLayout->addWidget(dataFilesView); + groupsLayout->addWidget(groupFiles); + + // Column 2 + QGroupBox *groupInfo = new QGroupBox(tr("File Information"), this); + groupInfo->setFixedWidth(250); + QVBoxLayout *groupInfoLayout = new QVBoxLayout(groupInfo); + + QSpacerItem *vSpacer2 = new QSpacerItem(20, 10, QSizePolicy::Minimum, QSizePolicy::Fixed); + + QLabel *labelAuthor = new QLabel(tr("Author:"), groupInfo); + lineAuthor = new QLineEdit(groupInfo); + lineAuthor->setReadOnly(true); + + QSpacerItem *vSpacer3 = new QSpacerItem(20, 10, QSizePolicy::Minimum, QSizePolicy::Fixed); + + QLabel *labelDesc = new QLabel(tr("Description:"), groupInfo); + textDesc = new QPlainTextEdit(groupInfo); + textDesc->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + textDesc->setMinimumHeight(180); + textDesc->setReadOnly(true); + + QSpacerItem *vSpacer4 = new QSpacerItem(20, 10, QSizePolicy::Minimum, QSizePolicy::Fixed); + + QLabel *labelDepends = new QLabel(tr("Dependencies:"), groupInfo); + textDepends = new QPlainTextEdit(groupInfo); + textDepends->setFixedHeight(80); + textDepends->setReadOnly(true); + + QHBoxLayout *buttonsLayout = new QHBoxLayout(); + QSpacerItem *horizontalSpacer = new QSpacerItem(40, 20, QSizePolicy::Expanding, QSizePolicy::Minimum); + + QDialogButtonBox *buttonBox = new QDialogButtonBox(); + buttonBox->setStandardButtons(QDialogButtonBox::Cancel|QDialogButtonBox::Ok|QDialogButtonBox::RestoreDefaults); + buttonBox->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); + + buttonsLayout->addItem(horizontalSpacer); + buttonsLayout->addWidget(buttonBox); + + // Put everything in the correct layouts + groupInfoLayout->addItem(vSpacer2); + groupInfoLayout->addWidget(labelAuthor); + groupInfoLayout->addWidget(lineAuthor); + groupInfoLayout->addItem(vSpacer3); + groupInfoLayout->addWidget(labelDesc); + groupInfoLayout->addWidget(textDesc); + groupInfoLayout->addItem(vSpacer4); + groupInfoLayout->addWidget(labelDepends); + groupInfoLayout->addWidget(textDepends); + + groupsLayout->addWidget(groupInfo); + + dialogLayout->addLayout(groupsLayout); + dialogLayout->addLayout(buttonsLayout); + + setWindowTitle(tr("Data Files")); + + + // Signals and slots + connect(dataFilesModel, SIGNAL(directoryLoaded(const QString &)), this, SLOT(setupView())); +// connect(dataFilesModel, SIGNAL(dataChanged(const QModelIndex, const QModelIndex)), this, SLOT(readConfig())); + + connect(dataFilesView, SIGNAL(doubleClicked(QModelIndex)), this, SLOT(setCheckstate(QModelIndex))); + connect(selectionModel, SIGNAL(currentChanged(QModelIndex, QModelIndex)), this, SLOT(changeData(QModelIndex, QModelIndex))); + + connect(lineFilter, SIGNAL(textChanged(const QString &)), this, SLOT(setFilter())); + + connect(buttonBox->button(QDialogButtonBox::RestoreDefaults), SIGNAL(clicked()), this, SLOT(restoreDefaults())); + connect(buttonBox, SIGNAL(accepted()), this, SLOT(writeConfig())); + connect(buttonBox, SIGNAL(rejected()), this, SLOT(close())); + + readConfig(); +} + +void DataFilesDialog::changeData(QModelIndex index, QModelIndex bottom) +{ + if (!index.isValid()) { + return; + } + + // Added for testing + + textDepends->clear(); // Clear the dependencies of previous file + + ESMReader datafile; + QString path(dataFilesModel->filePath(index)); +// QString path(dataFilesModel->filePath(sortModel->mapToSource(index))); + + datafile.open(path.toStdString()); // Open the selected file + + // Get the author of the selected file and display it + QString author(QString::fromStdString(datafile.getAuthor())); + lineAuthor->setText(author); + + // Get the file desciption + QString desc(QString::fromStdString(datafile.getDesc())); + textDesc->setPlainText(desc); + + // Get a list of master files on which the file depends + ESMReader::MasterList mlist = datafile.getMasters(); + + for (unsigned int i = 0; i < mlist.size(); ++i) // Add each master file + textDepends->appendPlainText(QString::fromStdString(mlist[i].name)); + + /* Get the date of creation + QDateTime dateCreated = dataFilesModel->fileInfo(index).created(); + QString created = dateCreated.toString(QString("dd.MM.yyyy")); + labelDateCreated->setText(created); + + // Get the date last modified + QDateTime dateModified = dataFilesModel->fileInfo(index).lastModified(); + QString modified = dateModified.toString(QString("dd.MM.yyyy")); + labelDateModified->setText(modified);*/ +} + +void DataFilesDialog::setupView() +{ + // The signal directoryLoaded is emitted after all files are in the model + dataFilesView->setModel(dataFilesModel); +// dataFilesView->setModel(sortModel); + + // Set the view to the data directory + dataFilesView->setRootIndex(QModelIndex(dataFilesModel->index("/opt/openmw/data"))); +// dataFilesView->setRootIndex(sortModel->mapFromSource(QModelIndex(dataFilesModel->index("/opt/openmw/data")))); + + dataFilesView->verticalHeader()->hide(); + + //dataFilesView->hideColumn(1); + dataFilesView->hideColumn(3); // Hide Date Modified column + dataFilesView->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + dataFilesView->verticalHeader()->setDefaultSectionSize(25); //setHeight + + dataFilesView->setSortingEnabled(true); + + dataFilesView->setSelectionBehavior(QAbstractItemView::SelectRows); + dataFilesView->setSelectionModel(selectionModel); + + + dataFilesView->setAlternatingRowColors(true); // Fancy colors! + + dataFilesView->resizeColumnsToContents(); + dataFilesView->horizontalHeader()->setStretchLastSection(true); + + + //sortModel->setSortCaseSensitivity(Qt::CaseInsensitive); + +} + +void DataFilesDialog::readConfig() +{ + qDebug() << "datachanged"; + + // Morrowind.ini settings + QSettings settings("Morrowind.ini", + QSettings::IniFormat); + settings.beginGroup("Game Files"); + + const QStringList childKeys = settings.childKeys(); + + // See if the files from the config file actually exist + foreach (const QString &childKey, childKeys) { + // Create full path to current file found in config + QString path = "/opt/openmw/data/"; // Note: get path from config + path.append(settings.value(childKey).toString()); + + QModelIndex index = dataFilesModel->index(path, 0); +// QModelIndex index = sortModel->mapFromSource(dataFilesModel->index(path, 0)); +// QModelIndex index = sortModel->mapFromSource(dataFilesModel->index(path)); + + if (index.isValid()) { + // File is found in model, set it to checked + qDebug() << "File is found in model, set it to checked"; + // dataFilesModel->setData(sortModel->mapToSource(index), Qt::Checked, Qt::CheckStateRole); + dataFilesModel->setData(index, Qt::Checked, Qt::CheckStateRole); +// dataFilesModel->checkedItems.insert(QPersistentModelIndex(sortModel->mapToSource(index))); + // dataFilesModel->checkedItems.insert(index); + + //qDebug() << index; + } else { + // File is not found in the model + qDebug() << "file not found!"; + } + } + settings.endGroup(); +} + +void DataFilesDialog::writeConfig() +{ +/* // Custom write method: We cannot use QSettings because it does not accept spaces + +// QList checkedItems = dataFilesModel->getCheckedItems().toList(); + QList checkedItems = dataFilesModel->getCheckedItems(); + + qSort(checkedItems); // Sort the indexes so that master files end up on top + + QString keyName; + QString fileName; + + QFile file("Morrowind.ini"); // Specify filepath later + if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) + close(); // File cannot be opened or created + + //QTextStream in(&file); + QTextStream in(&file); + + //QString buffer; + QByteArray buffer; + + while (!in.atEnd()) { + QString line = in.readLine(); + if (!line.contains("GameFile") && line != "[Game Files]") { + buffer += line + "\n"; + } + } + + file.close(); + + if (!file.open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Truncate)) + close(); + + QTextStream out(&file); + file.write(buffer); + + out << "[Game Files]\n"; + + // Write the list of game files to the config + for (int i = 0; i < checkedItems.size(); ++i) { + fileName = dataFilesModel->fileName(checkedItems.at(i)); + + keyName.setNum(i); + keyName.prepend("GameFile"); + + out << keyName << "=" << fileName << "\n"; + } + + file.close();*/ + close(); // Exit dialog +} + +void DataFilesDialog::restoreDefaults() +{ + // Uncheck all checked items + dataFilesModel->checkedItems.clear(); + + QModelIndexList indexlist; // Make a list of default master files + indexlist.append(dataFilesModel->index("/opt/openmw/data/Morrowind.esm", 0)); + indexlist.append(dataFilesModel->index("/opt/openmw/data/Tribunal.esm", 0)); + indexlist.append(dataFilesModel->index("/opt/openmw/data/Bloodmoon.esm", 0)); + + foreach (const QModelIndex &index, indexlist) { + if (index.isValid()) { + // Master file found, check it + dataFilesModel->setData(index, Qt::Checked, Qt::CheckStateRole); + } + } + dataFilesModel->submit(); // Force refresh of view +} + +void DataFilesDialog::setCheckstate(QModelIndex index) +{ + // No check if index is valid: doubleclicked() always returns + // a valid index when emitted + + //index = QModelIndex(sortModel->mapToSource(index)); // Get a valid index + index = index.sibling(index.row(), 0); // reset index to first column + // because that's where te checkbox is; makes it possible to doubleclick whole row + + if (!index.isValid()) + return; + + if (dataFilesModel->data(index, Qt::CheckStateRole) == Qt::Checked) { + // Selected row is checked, uncheck it + dataFilesModel->setData(index, Qt::Unchecked, Qt::CheckStateRole); + } else { + dataFilesModel->setData(index, Qt::Checked, Qt::CheckStateRole); + } +} + +void DataFilesDialog::setFilter() +{ + QStringList filefilter = (QStringList() << "*.esm" << "*.esp"); + QStringList currentfilefilter; + + QString esmfilter = lineFilter->text(); + QString espfilter = lineFilter->text(); + + if (lineFilter->text().isEmpty()) { + dataFilesModel->setNameFilters(filefilter); + // sortModel->setFilterRegExp(QRegExp("*.esp", Qt::CaseInsensitive, + // QRegExp::FixedString)); + // sortModel->setFilterKeyColumn(0); + return; + } + + esmfilter.prepend("*"); + esmfilter.append("*.esm"); + espfilter.prepend("*"); + espfilter.append("*.esp"); + + currentfilefilter << esmfilter << espfilter; +// sortModel->setFilterRegExp(QRegExp(espfilter, Qt::CaseInsensitive, + // QRegExp::FixedString)); + // sortModel->setFilterKeyColumn(0); + dataFilesModel->setNameFilters(currentfilefilter); + +// readConfig(); +// dataFilesModel->submit(); +// dataFilesModel->setData(); + +} diff --git a/apps/launcher/datafilesdialog.h b/apps/launcher/datafilesdialog.h new file mode 100644 index 0000000000..884de52191 --- /dev/null +++ b/apps/launcher/datafilesdialog.h @@ -0,0 +1,54 @@ +#ifndef DATAFILESDIALOG_H +#define DATAFILESDIALOG_H + +#include +#include +#include +#include + +#include "lineedit.h" + +class DataFilesModel; +class QStringList; +class QTableView; +class QLineEdit; +class QPlainTextEdit; +class QItemSelectionModel; +class QSortFilterProxyModel; + +class DataFilesDialog : public QDialog +{ + Q_OBJECT + +public: + DataFilesDialog(); +// ~DataFilesDialog() { }; + +private: + DataFilesModel *dataFilesModel; + + QTableView *dataFilesView; + QItemSelectionModel *selectionModel; + QSortFilterProxyModel *sortModel; + + QLineEdit *lineAuthor; + LineEdit *lineFilter; + QPlainTextEdit *textDesc; + QPlainTextEdit *textDepends; + + +public slots: + + void changeData(QModelIndex top, QModelIndex bottom); // edit + void restoreDefaults(); + void readConfig(); + void writeConfig(); + void setupView(); + + void setFilter(); + void setCheckstate(QModelIndex index); +// void doubleClicked(QModelIndex index); + +}; + +#endif diff --git a/apps/launcher/datafilesmodel.cpp b/apps/launcher/datafilesmodel.cpp new file mode 100644 index 0000000000..99b924d67a --- /dev/null +++ b/apps/launcher/datafilesmodel.cpp @@ -0,0 +1,145 @@ +#include "datafilesmodel.h" + +DataFilesModel::DataFilesModel(QObject *parent) + : QFileSystemModel(parent) +{ +} + +QVariant DataFilesModel::data(const QModelIndex &index, int role) const +{ + if (index.isValid() && role == Qt::DecorationRole) { + if (index.column() == 2) { + QFileIconProvider fip; + QIcon fileIcon = fip.icon(fileInfo(index)); + return fileIcon; + } + else { + return QIcon(); + } + + } + + if (index.isValid() && role == Qt::DisplayRole) { + if (index.column() == 2) { + //qDebug() << index.data(Qt::DisplayRole); + if (fileInfo(index).suffix().toLower() == "esp") { + return QString("Plugin File"); + } + else if (fileInfo(index).suffix().toLower() == "esm") { + return QString("Master File"); + + } + } + } + + if (index.isValid() && role == Qt::CheckStateRole && index.column() == 0) { + // Put a checkbox in the first column + if (index.isValid()) + + if (checkedItems.contains(filePath(index))) { +// if (checkedItems.contains(index)) { + return Qt::Checked; + } + else { + return Qt::Unchecked; + } + } + return QFileSystemModel::data(index, role); +} + +bool DataFilesModel::setData(const QModelIndex& index, const QVariant& value, int role) +{ + + if (index.isValid() && role == Qt::CheckStateRole && index.column() == 0) { +// QPersistentModelIndex pindex(index); + + // qDebug() << pindex; + + if (value == Qt::Checked) { + //checkedItems.insert(pindex); + checkedItems.append(filePath(index)); + } else { +// checkedItems.remove(pindex); + checkedItems.removeAll(filePath(index)); + } + + emit dataChanged(index, index); + return true; + } + + return QFileSystemModel::setData(index, value, role); +} + + + +Qt::ItemFlags DataFilesModel::flags(const QModelIndex &index) const +{ + return QFileSystemModel::flags(index) | Qt::ItemIsUserCheckable; +} + + + +/*QVariant DataFilesModel::headerData(int section, Qt::Orientation orientation, int role) const +{ + switch (role) { + case Qt::DecorationRole: + if (section == 0) { + // ### TODO oh man this is ugly and doesn't even work all the way! + // it is still 2 pixels off + QImage pixmap(16, 1, QImage::Format_Mono); + pixmap.fill(0); + pixmap.setAlphaChannel(pixmap.createAlphaMask()); + return pixmap; + } + break; + case Qt::TextAlignmentRole: + return Qt::AlignLeft; + } + + if (orientation != Qt::Horizontal || role != Qt::DisplayRole) + return QAbstractItemModel::headerData(section, orientation, role); + + QString returnValue; + switch (section) { + case 0: returnValue = tr("TES3 File"); + break; + case 1: returnValue = tr("Size"); + break; + case 2: returnValue = tr("Status"); + break; + case 3: returnValue = tr("Date Modified"); + break; + default: return QVariant(); + } + return returnValue; +} +*/ + +/*test +void DataFilesModel::setCheckedItems(const QStringList &gameFiles) +{ + qDebug() << "test"; + qDebug() << gameFiles.join("lol"); + + +}*/ + +/*void DataFilesModel::unCheckAll() +{ + checkedItems.clear(); +// data(); + emit dataChanged(QModelIndex(), QModelIndex()); + submit(); +}*/ + +const QStringList DataFilesModel::getCheckedItems() +//const QList DataFilesModel::getCheckedItems() +//const QSet DataFilesModel::getCheckedItems() +{ + return checkedItems; +} + +/*void DataFilesModel::sort(int column, Qt::SortOrder order) +{ + qDebug() << "Sort!"; +}*/ diff --git a/apps/launcher/datafilesmodel.h b/apps/launcher/datafilesmodel.h new file mode 100644 index 0000000000..0e376865b7 --- /dev/null +++ b/apps/launcher/datafilesmodel.h @@ -0,0 +1,38 @@ +#ifndef DATAFILESMODEL_H +#define DATAFILESMODEL_H + +#include +#include + +#include + +class DataFilesModel : public QFileSystemModel +{ +public: + DataFilesModel(QObject *parent = 0); + ~DataFilesModel() {}; + + QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const; + + Qt::ItemFlags flags(const QModelIndex &index) const; + + bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole); + +// void sort(int column, Qt::SortOrder order); + //test +// void setCheckedItems(const QStringList& files); +// void sort(int column, Qt::SortOrder order = Qt::AscendingOrder); +// void unCheckAll(); + +// const QSet getCheckedItems(); +// const QList getCheckedItems(); + const QStringList getCheckedItems(); + +// QVariant headerData(int section, Qt::Orientation orientation, int role) const; + +// QSet checkedItems; +// QList checkedItems; + QStringList checkedItems; +}; + +#endif diff --git a/apps/launcher/launcher.pro b/apps/launcher/launcher.pro new file mode 100644 index 0000000000..ac17e019ef --- /dev/null +++ b/apps/launcher/launcher.pro @@ -0,0 +1,23 @@ +###################################################################### +# Automatically generated by qmake (2.01a) Sun Mar 27 19:33:07 2011 +###################################################################### + +TEMPLATE = app +TARGET = +DEPENDPATH += . +INCLUDEPATH += . + +# Input +HEADERS += datafilesdialog.h \ + datafilesmodel.h \ + lineedit.h \ + maindialog.h \ + settingsdialog.h +SOURCES += datafilesdialog.cpp \ + datafilesmodel.cpp \ + lineedit.cpp \ + main.cpp \ + maindialog.cpp \ + settingsdialog.cpp +RESOURCES += resources.qrc +RC_FILE = launcher.rc \ No newline at end of file diff --git a/apps/launcher/launcher.rc b/apps/launcher/launcher.rc new file mode 100644 index 0000000000..3d22c74fc9 --- /dev/null +++ b/apps/launcher/launcher.rc @@ -0,0 +1 @@ +IDI_ICON1 ICON DISCARDABLE "resources/openmw_icon.ico" diff --git a/apps/launcher/lineedit.cpp b/apps/launcher/lineedit.cpp new file mode 100644 index 0000000000..7cd7f4d1da --- /dev/null +++ b/apps/launcher/lineedit.cpp @@ -0,0 +1,46 @@ +/**************************************************************************** +** +** Copyright (c) 2007 Trolltech ASA +** +** Use, modification and distribution is allowed without limitation, +** warranty, liability or support of any kind. +** +****************************************************************************/ + +#include "lineedit.h" +#include +#include + +LineEdit::LineEdit(QWidget *parent) + : QLineEdit(parent) +{ + clearButton = new QToolButton(this); + QPixmap pixmap(":resources/clear.png"); + clearButton->setIcon(QIcon(pixmap)); + clearButton->setIconSize(pixmap.size()); + clearButton->setCursor(Qt::ArrowCursor); + clearButton->setStyleSheet("QToolButton { border: none; padding: 0px; }"); + clearButton->hide(); + connect(clearButton, SIGNAL(clicked()), this, SLOT(clear())); + connect(this, SIGNAL(textChanged(const QString&)), this, SLOT(updateCloseButton(const QString&))); + int frameWidth = style()->pixelMetric(QStyle::PM_DefaultFrameWidth); + setStyleSheet(QString("QLineEdit { padding-right: %1px; } ").arg(clearButton->sizeHint().width() + frameWidth + 1)); + QSize msz = minimumSizeHint(); + setMinimumSize(qMax(msz.width(), clearButton->sizeHint().height() + frameWidth * 2 + 2), + qMax(msz.height(), clearButton->sizeHint().height() + frameWidth * 2 + 2)); +} + +void LineEdit::resizeEvent(QResizeEvent *) +{ + QSize sz = clearButton->sizeHint(); + int frameWidth = style()->pixelMetric(QStyle::PM_DefaultFrameWidth); + clearButton->move(rect().right() - frameWidth - sz.width(), + (rect().bottom() + 1 - sz.height())/2); +} + +void LineEdit::updateCloseButton(const QString& text) +{ + clearButton->setVisible(!text.isEmpty()); +} + + diff --git a/apps/launcher/lineedit.h b/apps/launcher/lineedit.h new file mode 100644 index 0000000000..7a96a523c8 --- /dev/null +++ b/apps/launcher/lineedit.h @@ -0,0 +1,35 @@ +/**************************************************************************** +** +** Copyright (c) 2007 Trolltech ASA +** +** Use, modification and distribution is allowed without limitation, +** warranty, liability or support of any kind. +** +****************************************************************************/ + +#ifndef LINEEDIT_H +#define LINEEDIT_H + +#include + +class QToolButton; + +class LineEdit : public QLineEdit +{ + Q_OBJECT + +public: + LineEdit(QWidget *parent = 0); + +protected: + void resizeEvent(QResizeEvent *); + +private slots: + void updateCloseButton(const QString &text); + +private: + QToolButton *clearButton; +}; + +#endif // LIENEDIT_H + diff --git a/apps/launcher/main.cpp b/apps/launcher/main.cpp new file mode 100644 index 0000000000..77c01148a8 --- /dev/null +++ b/apps/launcher/main.cpp @@ -0,0 +1,13 @@ +#include + +#include "maindialog.h" + +int main(int argc, char *argv[]) +{ + QApplication app(argc, argv); + + MainDialog dialog; + return dialog.exec(); + +} + diff --git a/apps/launcher/maindialog.cpp b/apps/launcher/maindialog.cpp new file mode 100644 index 0000000000..8ff37dda45 --- /dev/null +++ b/apps/launcher/maindialog.cpp @@ -0,0 +1,121 @@ +#include + +#include "maindialog.h" +#include "datafilesdialog.h" +#include "settingsdialog.h" + +MainDialog::MainDialog() +{ + + QLabel *header = new QLabel(this); + header->setMinimumSize(QSize(400, 150)); + header->setPixmap(QPixmap(":resources/openmw_header.png")); + + // Buttons + QPushButton *buttonStart = new QPushButton(this); + buttonStart->setMinimumSize(QSize(200, 40)); + buttonStart->setText(tr("Start OpenMW")); + + QPushButton *buttonDataFiles = new QPushButton(this); + buttonDataFiles->setMinimumSize(QSize(200, 40)); + buttonDataFiles->setText(tr("Data Files")); + + QPushButton *buttonSettings = new QPushButton(this); + buttonSettings->setText(tr("Settings")); + buttonSettings->setIcon(QIcon::fromTheme("preferences-other")); + + QDialogButtonBox *buttonBox = new QDialogButtonBox(this); + buttonBox->setStandardButtons(QDialogButtonBox::Close); + buttonBox->addButton(buttonSettings, QDialogButtonBox::ActionRole); + + QVBoxLayout *dialogLayout = new QVBoxLayout(this); + QVBoxLayout *buttonsLayout = new QVBoxLayout(); + QHBoxLayout *bodyLayout = new QHBoxLayout(); + QHBoxLayout *dialogButtonsLayout = new QHBoxLayout(); + + QSpacerItem *hSpacer1 = new QSpacerItem(40, 20, QSizePolicy::Expanding, QSizePolicy::Minimum); + QSpacerItem *hSpacer2 = new QSpacerItem(40, 20, QSizePolicy::Expanding, QSizePolicy::Minimum); + QSpacerItem *hSpacer3 = new QSpacerItem(40, 20, QSizePolicy::Expanding, QSizePolicy::Minimum); + + QSpacerItem *vSpacer1 = new QSpacerItem(40, 150, QSizePolicy::Minimum, QSizePolicy::Fixed); + QSpacerItem *vSpacer2 = new QSpacerItem(40, 20, QSizePolicy::Expanding, QSizePolicy::Minimum); + + buttonsLayout->addItem(vSpacer1); + buttonsLayout->addWidget(buttonStart); + buttonsLayout->addWidget(buttonDataFiles); + buttonsLayout->addItem(vSpacer2); + + bodyLayout->addItem(hSpacer1); + bodyLayout->addLayout(buttonsLayout); + bodyLayout->addItem(hSpacer2); + + dialogButtonsLayout->addItem(hSpacer3); + dialogButtonsLayout->addWidget(buttonBox); + + dialogLayout->addLayout(bodyLayout); + dialogLayout->addLayout(dialogButtonsLayout); + + setMinimumSize(QSize(400, 310)); + setMaximumSize(QSize(400, 310)); + + setWindowTitle(tr("OpenMW Launcher")); + QPixmap pixmap(":resources/openmw_icon.png"); + setWindowIcon(QIcon(pixmap)); + + // Signals and slots + connect(buttonStart, SIGNAL(clicked()), this, SLOT(start())); + connect(buttonDataFiles, SIGNAL(clicked()), this, SLOT(showDataFiles())); + connect(buttonSettings, SIGNAL(clicked()), this, SLOT(showSettings())); + connect(buttonBox, SIGNAL(rejected()), this, SLOT(close())); + + openmw = new QProcess(NULL); + +} + +void MainDialog::start() +{ + // Start the game! + openmw->start("./openmw"); + connect(openmw, SIGNAL(finished(int, QProcess::ExitStatus)), this, SLOT(finished(int, QProcess::ExitStatus))); +} + +void MainDialog::finished(int exitCode, QProcess::ExitStatus exitStatus) +{ + QString debuginfo = openmw->readAllStandardOutput(); + + if (exitCode == 0 && exitStatus == QProcess::NormalExit) { + // Close the launcher if the game is quitted + close(); + } + + if (exitCode != 0) { + // An error occured whilst starting OpenMW + + // First check if readAllStandardOutput is empty + // Finished gets signaled twice sometimes + + if (!debuginfo.isEmpty()) + { + QMessageBox msgBox; + msgBox.setWindowTitle("Error"); + msgBox.setIcon(QMessageBox::Warning); + msgBox.setStandardButtons(QMessageBox::Ok); + msgBox.setText(tr("\nAn error occured while starting OpenMW.")); + msgBox.setDetailedText(debuginfo); + msgBox.exec(); + } + + } +} + +void MainDialog::showDataFiles() +{ + DataFilesDialog dialog; + dialog.exec(); +} + +void MainDialog::showSettings() +{ + SettingsDialog dialog; + dialog.exec(); +} diff --git a/apps/launcher/maindialog.h b/apps/launcher/maindialog.h new file mode 100644 index 0000000000..db69111153 --- /dev/null +++ b/apps/launcher/maindialog.h @@ -0,0 +1,25 @@ +#ifndef MAINDIALOG_H +#define MAINDIALOG_H + +#include +#include + +class MainDialog : public QDialog +{ + Q_OBJECT + +public: + MainDialog(); + + QProcess *openmw; + +public slots: + + void start(); + void showDataFiles(); + void showSettings(); + void finished(int, QProcess::ExitStatus exitStatus); + +}; + +#endif diff --git a/apps/launcher/resources.qrc b/apps/launcher/resources.qrc new file mode 100644 index 0000000000..1116523573 --- /dev/null +++ b/apps/launcher/resources.qrc @@ -0,0 +1,7 @@ + + + resources/clear.png + resources/openmw_header.png + resources/openmw_icon.png + + diff --git a/apps/launcher/resources/clear.png b/apps/launcher/resources/clear.png new file mode 100644 index 0000000000000000000000000000000000000000..6c4b83b7ac6e451f461973dac0c9a6c53dedef25 GIT binary patch literal 644 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4rT@h1`S>QUg5-u&wghk z#lXO58sHP+`v3ob1_lNzCo2X91|1_E1_lNN1qB8M22oKV1_lOJR#sa(8wLgjTRZFI zeZ{aZ{L3S@Zt04 z&tJZL`St79@87@w{P|Pr^?els1A|0KkY6x^yu6;Cy?sbXYU++tr>;DG`t-wxA3y&7 z(gRMq;lvzdi#41B0ilpUXO@geCxxOzdj_ literal 0 HcmV?d00001 diff --git a/apps/launcher/resources/openmw_header.png b/apps/launcher/resources/openmw_header.png new file mode 100644 index 0000000000000000000000000000000000000000..a3045ce6154159300a24d8036798ceec2ebcc924 GIT binary patch literal 108088 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 literal 0 HcmV?d00001 diff --git a/apps/launcher/resources/openmw_icon.ico b/apps/launcher/resources/openmw_icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..c04fc3d9ce2b93ddce6188ad5f6944ee042b0be9 GIT binary patch literal 61282 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 FngAQyPh|iA literal 0 HcmV?d00001 diff --git a/apps/launcher/resources/openmw_icon.png b/apps/launcher/resources/openmw_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..7a5393821f378970c6ca73788b9141161c9cff09 GIT binary patch literal 60039 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 F696Pqnt%WR literal 0 HcmV?d00001 diff --git a/apps/launcher/settingsdialog.cpp b/apps/launcher/settingsdialog.cpp new file mode 100644 index 0000000000..100254ce65 --- /dev/null +++ b/apps/launcher/settingsdialog.cpp @@ -0,0 +1,259 @@ +#include + +#include "settingsdialog.h" + +SettingsDialog::SettingsDialog() +{ + QTabWidget *tabWidget = new QTabWidget(this); + QWidget *graphicsTab = new QWidget(); + + // Render group + QGroupBox *groupRender = new QGroupBox(tr("Renderer"), graphicsTab); + groupRender->setMinimumWidth(450); + + QVBoxLayout *groupRenderLayout = new QVBoxLayout(groupRender); + QVBoxLayout *dialogLayout = new QVBoxLayout(this); + QVBoxLayout *pageLayout = new QVBoxLayout(graphicsTab); + + QGridLayout *renderLayout = new QGridLayout(); + + QLabel *labelRender = new QLabel(tr("Rendering Subsystem:"), groupRender); + comboRender = new QComboBox(groupRender); + + QLabel *labelRTT = new QLabel(tr("Preferred RTT Mode:"), groupRender); + comboRTT = new QComboBox(groupRender); + + QLabel *labelAA = new QLabel(tr("Antialiasing:"), groupRender); + comboAA = new QComboBox(groupRender); + + renderLayout->addWidget(labelRender, 0, 0, 1, 1); + renderLayout->addWidget(comboRender, 0, 1, 1, 1); + + QSpacerItem *vSpacer1 = new QSpacerItem(20, 10, QSizePolicy::Minimum, QSizePolicy::Minimum); + renderLayout->addItem(vSpacer1, 1, 1, 1, 1); + + renderLayout->addWidget(labelRTT, 2, 0, 1, 1); + renderLayout->addWidget(comboRTT, 2, 1, 1, 1); + renderLayout->addWidget(labelAA, 3, 0, 1, 1); + renderLayout->addWidget(comboAA, 3, 1, 1, 1); + + QSpacerItem *vSpacer2 = new QSpacerItem(20, 40, QSizePolicy::Minimum, QSizePolicy::Expanding); + + groupRenderLayout->addLayout(renderLayout); + groupRenderLayout->addItem(vSpacer2); + + pageLayout->addWidget(groupRender); + + // Display group + QGroupBox *groupDisplay = new QGroupBox(tr("Display"), graphicsTab); + QVBoxLayout *groupDisplayLayout = new QVBoxLayout(groupDisplay); + + QGridLayout *displayLayout = new QGridLayout(); + + QLabel *labelResolution = new QLabel(tr("Resolution:"), groupDisplay); + comboResolution = new QComboBox(groupDisplay); + + QLabel *labelFrequency = new QLabel(tr("Display Frequency:"), groupDisplay); + comboFrequency = new QComboBox(groupDisplay); + + checkVSync = new QCheckBox(tr("Vertical Sync"), groupDisplay); + checkGamma = new QCheckBox(tr("sRGB Gamma Conversion"), groupDisplay); + checkFullScreen = new QCheckBox(tr("Full Screen"), groupDisplay); + + displayLayout->addWidget(labelResolution, 0, 0, 1, 1); + displayLayout->addWidget(comboResolution, 0, 1, 1, 1); + displayLayout->addWidget(labelFrequency, 1, 0, 1, 1); + displayLayout->addWidget(comboFrequency, 1, 1, 1, 1); + + QSpacerItem *vSpacer3 = new QSpacerItem(20, 10, QSizePolicy::Minimum, QSizePolicy::Minimum); + displayLayout->addItem(vSpacer3, 2, 1, 1, 1); + + displayLayout->addWidget(checkVSync, 3, 0, 1, 1); + displayLayout->addWidget(checkGamma, 3, 1, 1, 1); + displayLayout->addWidget(checkFullScreen, 6, 0, 1, 1); + + QSpacerItem *vSpacer4 = new QSpacerItem(20, 40, QSizePolicy::Minimum, QSizePolicy::Expanding); + + groupDisplayLayout->addLayout(displayLayout); + groupDisplayLayout->addItem(vSpacer4); + + pageLayout->addWidget(groupDisplay); + + + tabWidget->addTab(graphicsTab, QString(tr("Graphics"))); + tabWidget->setCurrentIndex(0); + + dialogLayout->addWidget(tabWidget); + + QDialogButtonBox *buttonBox = new QDialogButtonBox(this); + buttonBox->setStandardButtons(QDialogButtonBox::Cancel|QDialogButtonBox::Ok); + + dialogLayout->addWidget(buttonBox); + + setWindowTitle(tr("Settings")); + setWindowIcon(QIcon::fromTheme("preferences-other")); + + // Ogre Settings + // TODO: Find out a way to do this nice and platform-independent + QString filepath = QDir::homePath(); + filepath.append("/.config/openmw/ogre.cfg"); + + ogreConfig = new QSettings(filepath, QSettings::IniFormat); + + // Signals and slots + connect(comboRender, SIGNAL(currentIndexChanged(const QString&)), this, SLOT(rendererChanged(const QString&))); + connect(buttonBox, SIGNAL(accepted()), this, SLOT(writeConfig())); + connect(buttonBox, SIGNAL(rejected()), this, SLOT(close())); + + // Ogre stuff + root = new Ogre::Root("plugins.cfg"); + + // Get the available renderers and put them in the combobox + const Ogre::RenderSystemList &renderers = root->getAvailableRenderers(); + + for (Ogre::RenderSystemList::const_iterator r = renderers.begin(); r != renderers.end(); ++r) { + comboRender->addItem((*r)->getName().c_str()); + } + + int index = comboRender->findText(getConfigValue("Render System")); + + if ( index != -1) { + comboRender->setCurrentIndex(index); + } + +} + +QStringList SettingsDialog::getAvailableOptions(const QString& key) +{ + QStringList result; + + uint row = 0; + Ogre::ConfigOptionMap options = mSelectedRenderSystem->getConfigOptions(); + + for (Ogre::ConfigOptionMap::iterator i = options.begin (); i != options.end (); i++, row++) + { + Ogre::StringVector::iterator opt_it; + uint idx = 0; + for (opt_it = i->second.possibleValues.begin (); + opt_it != i->second.possibleValues.end (); opt_it++, idx++) + { + + if (strcmp (key.toStdString().c_str(), i->first.c_str()) == 0) + result << (*opt_it).c_str(); + } + + } + + return result; +} + +void SettingsDialog::rendererChanged(const QString& renderer) +{ + // Set the render system to the selected one + mSelectedRenderSystem = root->getRenderSystemByName(renderer.toStdString().c_str()); + + comboRTT->addItems(getAvailableOptions("RTT Preferred Mode")); + comboAA->addItems(getAvailableOptions("FSAA")); + comboResolution->addItems(getAvailableOptions("Video Mode")); + comboFrequency->addItems(getAvailableOptions("Display Frequency")); + + // Get the value for the option the config file, find if it's in the combobox. + // If it's found, set the current index to that value, otherwise: ignore. + + int index = comboRTT->findText(getConfigValue("RTT Preferred Mode")); + if ( index != -1) + comboRTT->setCurrentIndex(index); + + index = comboAA->findText(getConfigValue("FSAA")); + if ( index != -1) + comboAA->setCurrentIndex(index); + + index = comboResolution->findText(getConfigValue("Video Mode")); + if ( index != -1) + comboResolution->setCurrentIndex(index); + + index = comboFrequency->findText(getConfigValue("Display Frequency")); + if ( index != -1) + comboFrequency->setCurrentIndex(index); + + // Now we do the same for the checkboxes + if (QString::compare(getConfigValue("VSync"), QString("Yes")) == 0) { + checkVSync->setCheckState(Qt::Checked); + } + + if (QString::compare(getConfigValue("sRGB Gamma Conversion"), QString("Yes")) == 0) { + checkGamma->setCheckState(Qt::Checked); + } + + if (QString::compare(getConfigValue("Full Screen"), QString("Yes")) == 0) { + checkFullScreen->setCheckState(Qt::Checked); + } + +} + +QString SettingsDialog::getConfigValue(const QString& key) +{ + QString result; + + ogreConfig->beginGroup(mSelectedRenderSystem->getName().c_str()); + result = ogreConfig->value(key).toString(); + ogreConfig->endGroup(); + + return result; +} + +void SettingsDialog::writeConfig() +{ + // Get the values from the GUI elements and write them to the config file + + // Custom write method: We cannot use QSettings because it does not accept spaces + + QString keyName; + QString fileName; + + QFile file(ogreConfig->fileName()); + + if (!file.open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Truncate)) + // File could not be opened, TODO error + close(); + + QTextStream out(&file); + + out << "Render System=" << mSelectedRenderSystem->getName().c_str() << endl << endl; + + // add brackets to the renderer's name + QString renderer = mSelectedRenderSystem->getName().c_str(); + renderer.prepend("["); + renderer.append("]"); + out << renderer << endl; + + out << "Display Frequency=" << comboFrequency->currentText() << endl; + out << "FSAA=" << comboAA->currentText() << endl; + + if (checkFullScreen->checkState() == Qt::Checked) { + out << "Full Screen=Yes" << endl; + } else { + out << "Full Screen=No" << endl; + } + + out << "RTT Preferred Mode=" << comboRTT->currentText() << endl; + + if (checkVSync->checkState() == Qt::Checked) { + out << "VSync=Yes" << endl; + } else { + out << "VSync=No" << endl; + } + + out << "Video Mode=" << comboResolution->currentText() << endl; + + if (checkGamma->checkState() == Qt::Checked) { + out << "sRGB Gamma Conversion=Yes" << endl; + } else { + out << "sRGB Gamma Conversion=No" << endl; + } + + file.close(); + + close(); // Exit dialog +} + diff --git a/apps/launcher/settingsdialog.h b/apps/launcher/settingsdialog.h new file mode 100644 index 0000000000..964f2736b0 --- /dev/null +++ b/apps/launcher/settingsdialog.h @@ -0,0 +1,46 @@ +#ifndef SETTINGSDIALOG_H +#define SETTINGSDIALOG_H + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +class SettingsDialog : public QDialog +{ + Q_OBJECT + +public: + SettingsDialog(); + QStringList getAvailableOptions(const QString& key); + + Ogre::Root *root; + Ogre::RenderSystem *mSelectedRenderSystem; + + QComboBox *comboRender; + QComboBox *comboRTT; + QComboBox *comboAA; + QComboBox *comboResolution; + QComboBox *comboFrequency; + + QCheckBox *checkVSync; + QCheckBox *checkGamma; + QCheckBox *checkFullScreen; + + QSettings *ogreConfig; + + QString getConfigValue(const QString& key); + +public slots: + void rendererChanged(const QString& renderer); + void writeConfig(); +}; + +#endif From aa54975a2f48edd9810ce883520f5c77d12365ea Mon Sep 17 00:00:00 2001 From: Pieter van der Kloet Date: Tue, 29 Mar 2011 17:07:24 +0200 Subject: [PATCH 003/111] Removed the directoryLoaded() signal as it's only available in Qt 4.7. --- apps/launcher/datafilesdialog.cpp | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/apps/launcher/datafilesdialog.cpp b/apps/launcher/datafilesdialog.cpp index 201e2939c9..1fb387eadc 100644 --- a/apps/launcher/datafilesdialog.cpp +++ b/apps/launcher/datafilesdialog.cpp @@ -118,19 +118,19 @@ DataFilesDialog::DataFilesDialog() // Signals and slots - connect(dataFilesModel, SIGNAL(directoryLoaded(const QString &)), this, SLOT(setupView())); -// connect(dataFilesModel, SIGNAL(dataChanged(const QModelIndex, const QModelIndex)), this, SLOT(readConfig())); + //connect(dataFilesModel, SIGNAL(directoryLoaded(const QString &)), this, SLOT(setupView())); connect(dataFilesView, SIGNAL(doubleClicked(QModelIndex)), this, SLOT(setCheckstate(QModelIndex))); connect(selectionModel, SIGNAL(currentChanged(QModelIndex, QModelIndex)), this, SLOT(changeData(QModelIndex, QModelIndex))); - connect(lineFilter, SIGNAL(textChanged(const QString &)), this, SLOT(setFilter())); + connect(lineFilter, SIGNAL(textChanged(const QString&)), this, SLOT(setFilter())); connect(buttonBox->button(QDialogButtonBox::RestoreDefaults), SIGNAL(clicked()), this, SLOT(restoreDefaults())); connect(buttonBox, SIGNAL(accepted()), this, SLOT(writeConfig())); connect(buttonBox, SIGNAL(rejected()), this, SLOT(close())); readConfig(); + setupView(); } void DataFilesDialog::changeData(QModelIndex index, QModelIndex bottom) @@ -209,8 +209,6 @@ void DataFilesDialog::setupView() void DataFilesDialog::readConfig() { - qDebug() << "datachanged"; - // Morrowind.ini settings QSettings settings("Morrowind.ini", QSettings::IniFormat); From 493018322db519cc518aeba1b6c0a9916e99567f Mon Sep 17 00:00:00 2001 From: Pieter van der Kloet Date: Tue, 29 Mar 2011 20:12:10 +0200 Subject: [PATCH 004/111] Added function to write the list of plugins to openmw.cfg --- apps/launcher/datafilesdialog.cpp | 77 ++++++++++++++++++------------- 1 file changed, 46 insertions(+), 31 deletions(-) diff --git a/apps/launcher/datafilesdialog.cpp b/apps/launcher/datafilesdialog.cpp index 1fb387eadc..9dbe3f4af9 100644 --- a/apps/launcher/datafilesdialog.cpp +++ b/apps/launcher/datafilesdialog.cpp @@ -15,7 +15,7 @@ DataFilesDialog::DataFilesDialog() dataFilesModel = new DataFilesModel(); dataFilesModel->setReadOnly(true); // Prevent changes to files - dataFilesModel->setRootPath("/opt/openmw/data"); + dataFilesModel->setRootPath("data"); // sortModel = new QSortFilterProxyModel(); // sortModel->setSourceModel(dataFilesModel); @@ -181,7 +181,7 @@ void DataFilesDialog::setupView() // dataFilesView->setModel(sortModel); // Set the view to the data directory - dataFilesView->setRootIndex(QModelIndex(dataFilesModel->index("/opt/openmw/data"))); + dataFilesView->setRootIndex(QModelIndex(dataFilesModel->index("data"))); // dataFilesView->setRootIndex(sortModel->mapFromSource(QModelIndex(dataFilesModel->index("/opt/openmw/data")))); dataFilesView->verticalHeader()->hide(); @@ -245,19 +245,24 @@ void DataFilesDialog::readConfig() void DataFilesDialog::writeConfig() { -/* // Custom write method: We cannot use QSettings because it does not accept spaces + // Custom write method: We cannot use QSettings because it does not accept spaces -// QList checkedItems = dataFilesModel->getCheckedItems().toList(); - QList checkedItems = dataFilesModel->getCheckedItems(); - - qSort(checkedItems); // Sort the indexes so that master files end up on top - - QString keyName; - QString fileName; - - QFile file("Morrowind.ini"); // Specify filepath later +// QList checkeditems = dataFilesModel->getCheckedItems().toList(); + QStringList checkeditems = dataFilesModel->getCheckedItems(); + //QString sectionname = "[Game Files]"; + QString filename; + QFileInfo datafile; + + // Sort the items so that master files end up on top + foreach (QString str, checkeditems) { + if(str.endsWith(QString(".esm"), Qt::CaseInsensitive)) { + checkeditems.move(checkeditems.indexOf(str), 0); + } + } + + QFile file("openmw.cfg"); // Specify filepath later if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) - close(); // File cannot be opened or created + close(); // File cannot be opened or created TODO: throw error //QTextStream in(&file); QTextStream in(&file); @@ -265,34 +270,44 @@ void DataFilesDialog::writeConfig() //QString buffer; QByteArray buffer; + // Remove all previous master/plugin entries from config while (!in.atEnd()) { QString line = in.readLine(); - if (!line.contains("GameFile") && line != "[Game Files]") { - buffer += line + "\n"; + //if (!line.contains("GameFile") && line != "[Game Files]") { + if (!line.contains("master") && !line.contains("plugin")) { + buffer += line += "\n"; } } file.close(); + // Now we write back the other config entries if (!file.open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Truncate)) - close(); + close(); // File cannot be opened or created TODO: throw error - QTextStream out(&file); file.write(buffer); - - out << "[Game Files]\n"; - + QTextStream out(&file); + + // Write the section name to the config file before we write out the data files + //out << sectionname << endl; + // Write the list of game files to the config - for (int i = 0; i < checkedItems.size(); ++i) { - fileName = dataFilesModel->fileName(checkedItems.at(i)); - - keyName.setNum(i); - keyName.prepend("GameFile"); - - out << keyName << "=" << fileName << "\n"; + for (int i = 0; i < checkeditems.size(); ++i) { + //filename = dataFilesModel->fileName(checkeditems.at(i)); + filename = checkeditems.at(i); + datafile = QFileInfo(filename); + + if (datafile.exists()) { + if (filename.endsWith(QString(".esm"), Qt::CaseInsensitive)) { + out << "master=" << datafile.fileName() << endl; + } else if (filename.endsWith(QString(".esp"), Qt::CaseInsensitive)) { + out << "plugin=" << datafile.fileName() << endl; + } + } } - file.close();*/ + + file.close(); close(); // Exit dialog } @@ -302,9 +317,9 @@ void DataFilesDialog::restoreDefaults() dataFilesModel->checkedItems.clear(); QModelIndexList indexlist; // Make a list of default master files - indexlist.append(dataFilesModel->index("/opt/openmw/data/Morrowind.esm", 0)); - indexlist.append(dataFilesModel->index("/opt/openmw/data/Tribunal.esm", 0)); - indexlist.append(dataFilesModel->index("/opt/openmw/data/Bloodmoon.esm", 0)); + indexlist.append(dataFilesModel->index("Morrowind.esm", 0)); + indexlist.append(dataFilesModel->index("Tribunal.esm", 0)); + indexlist.append(dataFilesModel->index("Bloodmoon.esm", 0)); foreach (const QModelIndex &index, indexlist) { if (index.isValid()) { From 1d873c56a81d037310840b415511afae5c9fdd8d Mon Sep 17 00:00:00 2001 From: Pieter van der Kloet Date: Tue, 29 Mar 2011 20:15:15 +0200 Subject: [PATCH 005/111] Fixed the "Restore defaults" function. --- apps/launcher/datafilesdialog.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/launcher/datafilesdialog.cpp b/apps/launcher/datafilesdialog.cpp index 9dbe3f4af9..77386268f5 100644 --- a/apps/launcher/datafilesdialog.cpp +++ b/apps/launcher/datafilesdialog.cpp @@ -317,9 +317,9 @@ void DataFilesDialog::restoreDefaults() dataFilesModel->checkedItems.clear(); QModelIndexList indexlist; // Make a list of default master files - indexlist.append(dataFilesModel->index("Morrowind.esm", 0)); - indexlist.append(dataFilesModel->index("Tribunal.esm", 0)); - indexlist.append(dataFilesModel->index("Bloodmoon.esm", 0)); + indexlist.append(dataFilesModel->index("data/Morrowind.esm", 0)); + indexlist.append(dataFilesModel->index("data/Tribunal.esm", 0)); + indexlist.append(dataFilesModel->index("data/Bloodmoon.esm", 0)); foreach (const QModelIndex &index, indexlist) { if (index.isValid()) { From 082902473ba94ee2c93928f79c5c5c32da2b1719 Mon Sep 17 00:00:00 2001 From: Pieter van der Kloet Date: Tue, 29 Mar 2011 22:15:44 +0200 Subject: [PATCH 006/111] Changed the readConfig function to work with the new master/plugin options in openmw.cfg --- apps/launcher/datafilesdialog.cpp | 70 ++++++++++++++++++------------- 1 file changed, 40 insertions(+), 30 deletions(-) diff --git a/apps/launcher/datafilesdialog.cpp b/apps/launcher/datafilesdialog.cpp index 77386268f5..bab3f893ca 100644 --- a/apps/launcher/datafilesdialog.cpp +++ b/apps/launcher/datafilesdialog.cpp @@ -208,39 +208,49 @@ void DataFilesDialog::setupView() } void DataFilesDialog::readConfig() -{ - // Morrowind.ini settings - QSettings settings("Morrowind.ini", - QSettings::IniFormat); - settings.beginGroup("Game Files"); +{ + QString filename; + QString path = "data/"; // TODO: Should be global + + QFile file("openmw.cfg"); // Specify filepath later + if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { + qDebug() << "error open"; + close(); // File cannot be opened or created TODO: throw error + } + + QTextStream in(&file); - const QStringList childKeys = settings.childKeys(); + QStringList datafiles; - // See if the files from the config file actually exist - foreach (const QString &childKey, childKeys) { - // Create full path to current file found in config - QString path = "/opt/openmw/data/"; // Note: get path from config - path.append(settings.value(childKey).toString()); - - QModelIndex index = dataFilesModel->index(path, 0); -// QModelIndex index = sortModel->mapFromSource(dataFilesModel->index(path, 0)); -// QModelIndex index = sortModel->mapFromSource(dataFilesModel->index(path)); + // Add each data file read from the config file to a QStringList + while (!in.atEnd()) { + QString line = in.readLine(); + + if (line.contains("master")) { + filename = line.remove("master="); + filename.prepend(path); + + datafiles << filename << "\n"; + + } else if (line.contains("plugin")) { + filename = line.remove("plugin="); + filename.prepend(path); + + datafiles << filename << "\n"; + } + } + file.close(); + + // Check if the files are in the model, set to checked if found + foreach(const QString ¤tfile, datafiles) { + QModelIndex index = dataFilesModel->index(currentfile, 0); + if (index.isValid()) { // File is found in model, set it to checked - qDebug() << "File is found in model, set it to checked"; - // dataFilesModel->setData(sortModel->mapToSource(index), Qt::Checked, Qt::CheckStateRole); - dataFilesModel->setData(index, Qt::Checked, Qt::CheckStateRole); -// dataFilesModel->checkedItems.insert(QPersistentModelIndex(sortModel->mapToSource(index))); - // dataFilesModel->checkedItems.insert(index); - - //qDebug() << index; - } else { - // File is not found in the model - qDebug() << "file not found!"; - } + dataFilesModel->setData(index, Qt::Checked, Qt::CheckStateRole); + } } - settings.endGroup(); } void DataFilesDialog::writeConfig() @@ -254,9 +264,9 @@ void DataFilesDialog::writeConfig() QFileInfo datafile; // Sort the items so that master files end up on top - foreach (QString str, checkeditems) { - if(str.endsWith(QString(".esm"), Qt::CaseInsensitive)) { - checkeditems.move(checkeditems.indexOf(str), 0); + foreach (const QString ¤titem, checkeditems) { + if(currentitem.endsWith(QString(".esm"), Qt::CaseInsensitive)) { + checkeditems.move(checkeditems.indexOf(currentitem), 0); } } From 74eef829020408d0954b9eb4cd9cbdd244425fb9 Mon Sep 17 00:00:00 2001 From: Pieter van der Kloet Date: Tue, 29 Mar 2011 23:42:34 +0200 Subject: [PATCH 007/111] Messing around with a new datafilesdialog --- apps/launcher/CMakeLists.txt | 4 + apps/launcher/datafilesdialog.cpp | 123 ++++++-------- apps/launcher/datafilesdialog.h | 29 ++-- apps/launcher/datafilesmodel.cpp | 260 ++++++++++++++++-------------- apps/launcher/datafilesmodel.h | 45 +++--- apps/launcher/launcher.pro | 6 +- 6 files changed, 225 insertions(+), 242 deletions(-) diff --git a/apps/launcher/CMakeLists.txt b/apps/launcher/CMakeLists.txt index 291103b28c..fe29375d96 100644 --- a/apps/launcher/CMakeLists.txt +++ b/apps/launcher/CMakeLists.txt @@ -1,12 +1,14 @@ set(LAUNCHER datafilesdialog.cpp datafilesmodel.cpp + datafilesitem.cpp lineedit.cpp main.cpp maindialog.cpp settingsdialog.cpp datafilesdialog.h datafilesmodel.h + datafilesitem.h lineedit.h maindialog.h settingsdialog.h @@ -14,6 +16,8 @@ set(LAUNCHER SET(MOC_HDRS datafilesdialog.h + datafilesmodel.h + datafilesitem.h lineedit.h maindialog.h settingsdialog.h diff --git a/apps/launcher/datafilesdialog.cpp b/apps/launcher/datafilesdialog.cpp index bab3f893ca..b906cb75b5 100644 --- a/apps/launcher/datafilesdialog.cpp +++ b/apps/launcher/datafilesdialog.cpp @@ -3,27 +3,34 @@ #include "datafilesdialog.h" #include "datafilesmodel.h" +#include "datafilesitem.h" using namespace ESM; -//DataFilesDialog::DataFilesDialog(QWidget *parent) -// : QDialog(parent) - DataFilesDialog::DataFilesDialog() { - //QWidget *centralWidget = new QWidget; - + //dataFilesModel = new DataFilesModel(this); dataFilesModel = new DataFilesModel(); - dataFilesModel->setReadOnly(true); // Prevent changes to files - dataFilesModel->setRootPath("data"); + + for (int row = 0; row < 4; ++row) { + for (int column = 0; column < 4; ++column) { + QList test; + test << QString("%0").arg(i); + DataFilesItem *item = new DataFilesItem(test); + dataFilesModel->setItem(row, column, item); + } + } + + //dataFilesModel->setReadOnly(true); // Prevent changes to files + //dataFilesModel->setRootPath("data"); // sortModel = new QSortFilterProxyModel(); // sortModel->setSourceModel(dataFilesModel); - selectionModel = new QItemSelectionModel(dataFilesModel); + //selectionModel = new QItemSelectionModel(dataFilesModel); // selectionModel = new QItemSelectionModel(sortModel); - // First, show only plugin files and sort them + /* First, show only plugin files and sort them QStringList acceptedfiles = (QStringList() << "*.esp"); dataFilesModel->setNameFilters(acceptedfiles); dataFilesModel->setNameFilterDisables(false); // Hide all other files @@ -35,58 +42,33 @@ DataFilesDialog::DataFilesDialog() acceptedfiles = (QStringList() << "*.esm" << "*.esp"); dataFilesModel->setNameFilters(acceptedfiles); dataFilesModel->setFilter(QDir::Files); - +*/ // Column 1 QVBoxLayout *dialogLayout = new QVBoxLayout(this); - QHBoxLayout *groupsLayout = new QHBoxLayout(); QGroupBox *groupFiles = new QGroupBox(tr("Morrowind Files"), this); groupFiles->setMinimumWidth(450); QVBoxLayout *groupFilesLayout = new QVBoxLayout(groupFiles); - QSpacerItem *vSpacer1 = new QSpacerItem(20, 2, QSizePolicy::Minimum, QSizePolicy::Fixed); + //QSpacerItem *vSpacer1 = new QSpacerItem(20, 2, QSizePolicy::Minimum, QSizePolicy::Fixed); - QHBoxLayout *filterLayout = new QHBoxLayout(); + /*QHBoxLayout *filterLayout = new QHBoxLayout(); QLabel *labelFilter = new QLabel(tr("Filter:"), groupFiles); lineFilter = new LineEdit(groupFiles); filterLayout->addWidget(labelFilter); filterLayout->addWidget(lineFilter); - + */ + // View for the game files - dataFilesView = new QTableView(groupFiles); - + //dataFilesView = new QTreeView(groupFiles); + dataFilesView = new QTreeView(groupFiles); + dataFilesView->setModel(dataFilesModel); + // Put everything in the correct layouts - groupFilesLayout->addLayout(filterLayout); - groupFilesLayout->addItem(vSpacer1); + //groupFilesLayout->addLayout(filterLayout); + //groupFilesLayout->addItem(vSpacer1); groupFilesLayout->addWidget(dataFilesView); - groupsLayout->addWidget(groupFiles); - - // Column 2 - QGroupBox *groupInfo = new QGroupBox(tr("File Information"), this); - groupInfo->setFixedWidth(250); - QVBoxLayout *groupInfoLayout = new QVBoxLayout(groupInfo); - - QSpacerItem *vSpacer2 = new QSpacerItem(20, 10, QSizePolicy::Minimum, QSizePolicy::Fixed); - - QLabel *labelAuthor = new QLabel(tr("Author:"), groupInfo); - lineAuthor = new QLineEdit(groupInfo); - lineAuthor->setReadOnly(true); - - QSpacerItem *vSpacer3 = new QSpacerItem(20, 10, QSizePolicy::Minimum, QSizePolicy::Fixed); - - QLabel *labelDesc = new QLabel(tr("Description:"), groupInfo); - textDesc = new QPlainTextEdit(groupInfo); - textDesc->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); - textDesc->setMinimumHeight(180); - textDesc->setReadOnly(true); - - QSpacerItem *vSpacer4 = new QSpacerItem(20, 10, QSizePolicy::Minimum, QSizePolicy::Fixed); - - QLabel *labelDepends = new QLabel(tr("Dependencies:"), groupInfo); - textDepends = new QPlainTextEdit(groupInfo); - textDepends->setFixedHeight(80); - textDepends->setReadOnly(true); QHBoxLayout *buttonsLayout = new QHBoxLayout(); QSpacerItem *horizontalSpacer = new QSpacerItem(40, 20, QSizePolicy::Expanding, QSizePolicy::Minimum); @@ -97,28 +79,14 @@ DataFilesDialog::DataFilesDialog() buttonsLayout->addItem(horizontalSpacer); buttonsLayout->addWidget(buttonBox); - - // Put everything in the correct layouts - groupInfoLayout->addItem(vSpacer2); - groupInfoLayout->addWidget(labelAuthor); - groupInfoLayout->addWidget(lineAuthor); - groupInfoLayout->addItem(vSpacer3); - groupInfoLayout->addWidget(labelDesc); - groupInfoLayout->addWidget(textDesc); - groupInfoLayout->addItem(vSpacer4); - groupInfoLayout->addWidget(labelDepends); - groupInfoLayout->addWidget(textDepends); - - groupsLayout->addWidget(groupInfo); - - dialogLayout->addLayout(groupsLayout); + + dialogLayout->addWidget(groupFiles); dialogLayout->addLayout(buttonsLayout); setWindowTitle(tr("Data Files")); - // Signals and slots - //connect(dataFilesModel, SIGNAL(directoryLoaded(const QString &)), this, SLOT(setupView())); + /*connect(dataFilesModel, SIGNAL(directoryLoaded(const QString &)), this, SLOT(setupView())); connect(dataFilesView, SIGNAL(doubleClicked(QModelIndex)), this, SLOT(setCheckstate(QModelIndex))); connect(selectionModel, SIGNAL(currentChanged(QModelIndex, QModelIndex)), this, SLOT(changeData(QModelIndex, QModelIndex))); @@ -128,14 +96,14 @@ DataFilesDialog::DataFilesDialog() connect(buttonBox->button(QDialogButtonBox::RestoreDefaults), SIGNAL(clicked()), this, SLOT(restoreDefaults())); connect(buttonBox, SIGNAL(accepted()), this, SLOT(writeConfig())); connect(buttonBox, SIGNAL(rejected()), this, SLOT(close())); - - readConfig(); - setupView(); +*/ + //readConfig(); + //setupView(); } void DataFilesDialog::changeData(QModelIndex index, QModelIndex bottom) { - if (!index.isValid()) { + /*if (!index.isValid()) { return; } @@ -176,7 +144,7 @@ void DataFilesDialog::changeData(QModelIndex index, QModelIndex bottom) void DataFilesDialog::setupView() { - // The signal directoryLoaded is emitted after all files are in the model + /* The signal directoryLoaded is emitted after all files are in the model dataFilesView->setModel(dataFilesModel); // dataFilesView->setModel(sortModel); @@ -203,13 +171,13 @@ void DataFilesDialog::setupView() dataFilesView->horizontalHeader()->setStretchLastSection(true); - //sortModel->setSortCaseSensitivity(Qt::CaseInsensitive); + //sortModel->setSortCaseSensitivity(Qt::CaseInsensitive);*/ } void DataFilesDialog::readConfig() { - QString filename; +/* QString filename; QString path = "data/"; // TODO: Should be global QFile file("openmw.cfg"); // Specify filepath later @@ -250,12 +218,12 @@ void DataFilesDialog::readConfig() // File is found in model, set it to checked dataFilesModel->setData(index, Qt::Checked, Qt::CheckStateRole); } - } + }*/ } void DataFilesDialog::writeConfig() { - // Custom write method: We cannot use QSettings because it does not accept spaces + /* Custom write method: We cannot use QSettings because it does not accept spaces // QList checkeditems = dataFilesModel->getCheckedItems().toList(); QStringList checkeditems = dataFilesModel->getCheckedItems(); @@ -318,12 +286,12 @@ void DataFilesDialog::writeConfig() file.close(); - close(); // Exit dialog + close(); // Exit dialog*/ } void DataFilesDialog::restoreDefaults() { - // Uncheck all checked items +/* // Uncheck all checked items dataFilesModel->checkedItems.clear(); QModelIndexList indexlist; // Make a list of default master files @@ -337,12 +305,12 @@ void DataFilesDialog::restoreDefaults() dataFilesModel->setData(index, Qt::Checked, Qt::CheckStateRole); } } - dataFilesModel->submit(); // Force refresh of view + dataFilesModel->submit(); // Force refresh of view*/ } void DataFilesDialog::setCheckstate(QModelIndex index) { - // No check if index is valid: doubleclicked() always returns + /* No check if index is valid: doubleclicked() always returns // a valid index when emitted //index = QModelIndex(sortModel->mapToSource(index)); // Get a valid index @@ -357,11 +325,12 @@ void DataFilesDialog::setCheckstate(QModelIndex index) dataFilesModel->setData(index, Qt::Unchecked, Qt::CheckStateRole); } else { dataFilesModel->setData(index, Qt::Checked, Qt::CheckStateRole); - } + }*/ } void DataFilesDialog::setFilter() { + /* QStringList filefilter = (QStringList() << "*.esm" << "*.esp"); QStringList currentfilefilter; @@ -390,5 +359,5 @@ void DataFilesDialog::setFilter() // readConfig(); // dataFilesModel->submit(); // dataFilesModel->setData(); - +*/ } diff --git a/apps/launcher/datafilesdialog.h b/apps/launcher/datafilesdialog.h index 884de52191..d223bf14ad 100644 --- a/apps/launcher/datafilesdialog.h +++ b/apps/launcher/datafilesdialog.h @@ -1,20 +1,21 @@ #ifndef DATAFILESDIALOG_H #define DATAFILESDIALOG_H -#include -#include -#include -#include - #include "lineedit.h" class DataFilesModel; -class QStringList; -class QTableView; + +/*class QStringList; +class QTreeView; class QLineEdit; class QPlainTextEdit; class QItemSelectionModel; class QSortFilterProxyModel; +*/ +#include +#include + +class QTreeView; class DataFilesDialog : public QDialog { @@ -27,14 +28,14 @@ public: private: DataFilesModel *dataFilesModel; - QTableView *dataFilesView; - QItemSelectionModel *selectionModel; - QSortFilterProxyModel *sortModel; + QTreeView *dataFilesView; + //QItemSelectionModel *selectionModel; + //QSortFilterProxyModel *sortModel; - QLineEdit *lineAuthor; - LineEdit *lineFilter; - QPlainTextEdit *textDesc; - QPlainTextEdit *textDepends; + //QLineEdit *lineAuthor; + //LineEdit *lineFilter; + //QPlainTextEdit *textDesc; + //QPlainTextEdit *textDepends; public slots: diff --git a/apps/launcher/datafilesmodel.cpp b/apps/launcher/datafilesmodel.cpp index 99b924d67a..0eb68ab4c6 100644 --- a/apps/launcher/datafilesmodel.cpp +++ b/apps/launcher/datafilesmodel.cpp @@ -1,145 +1,155 @@ +#include + +#include "datafilesitem.h" #include "datafilesmodel.h" +//DataFilesModel::DataFilesModel(const QString &data, QObject *parent) DataFilesModel::DataFilesModel(QObject *parent) - : QFileSystemModel(parent) + : QAbstractItemModel(parent) { + QList rootData; + rootData << " "; + //rootItem = new DataFilesItem(rootData); + rootItem = new DataFilesItem(rootData); + //setupModelData(data.split(QString("\n")), rootItem); +} + +DataFilesModel::~DataFilesModel() +{ + delete rootItem; +} + +int DataFilesModel::columnCount(const QModelIndex &parent) const +{ + if (parent.isValid()) + return static_cast(parent.internalPointer())->columnCount(); + else + return rootItem->columnCount(); } QVariant DataFilesModel::data(const QModelIndex &index, int role) const { - if (index.isValid() && role == Qt::DecorationRole) { - if (index.column() == 2) { - QFileIconProvider fip; - QIcon fileIcon = fip.icon(fileInfo(index)); - return fileIcon; - } - else { - return QIcon(); - } + if (!index.isValid()) + return QVariant(); - } + if (role != Qt::DisplayRole) + return QVariant(); - if (index.isValid() && role == Qt::DisplayRole) { - if (index.column() == 2) { - //qDebug() << index.data(Qt::DisplayRole); - if (fileInfo(index).suffix().toLower() == "esp") { - return QString("Plugin File"); - } - else if (fileInfo(index).suffix().toLower() == "esm") { - return QString("Master File"); + DataFilesItem *item = static_cast(index.internalPointer()); - } - } - } - - if (index.isValid() && role == Qt::CheckStateRole && index.column() == 0) { - // Put a checkbox in the first column - if (index.isValid()) - - if (checkedItems.contains(filePath(index))) { -// if (checkedItems.contains(index)) { - return Qt::Checked; - } - else { - return Qt::Unchecked; - } - } - return QFileSystemModel::data(index, role); + return item->data(index.column()); } -bool DataFilesModel::setData(const QModelIndex& index, const QVariant& value, int role) -{ - - if (index.isValid() && role == Qt::CheckStateRole && index.column() == 0) { -// QPersistentModelIndex pindex(index); - - // qDebug() << pindex; - - if (value == Qt::Checked) { - //checkedItems.insert(pindex); - checkedItems.append(filePath(index)); - } else { -// checkedItems.remove(pindex); - checkedItems.removeAll(filePath(index)); - } - - emit dataChanged(index, index); - return true; - } - - return QFileSystemModel::setData(index, value, role); -} - - - Qt::ItemFlags DataFilesModel::flags(const QModelIndex &index) const { - return QFileSystemModel::flags(index) | Qt::ItemIsUserCheckable; + if (!index.isValid()) + return 0; + + return Qt::ItemIsEnabled | Qt::ItemIsSelectable; } - - -/*QVariant DataFilesModel::headerData(int section, Qt::Orientation orientation, int role) const +QVariant DataFilesModel::headerData(int section, Qt::Orientation orientation, + int role) const { - switch (role) { - case Qt::DecorationRole: - if (section == 0) { - // ### TODO oh man this is ugly and doesn't even work all the way! - // it is still 2 pixels off - QImage pixmap(16, 1, QImage::Format_Mono); - pixmap.fill(0); - pixmap.setAlphaChannel(pixmap.createAlphaMask()); - return pixmap; + if (orientation == Qt::Horizontal && role == Qt::DisplayRole) + return rootItem->data(section); + + return QVariant(); +} + +QModelIndex DataFilesModel::index(int row, int column, const QModelIndex &parent) + const +{ + if (!hasIndex(row, column, parent)) + return QModelIndex(); + + DataFilesItem *parentItem; + + if (!parent.isValid()) + parentItem = rootItem; + else + parentItem = static_cast(parent.internalPointer()); + + DataFilesItem *childItem = parentItem->child(row); + if (childItem) + return createIndex(row, column, childItem); + else + return QModelIndex(); +} + +QModelIndex DataFilesModel::parent(const QModelIndex &index) const +{ + if (!index.isValid()) + return QModelIndex(); + + DataFilesItem *childItem = static_cast(index.internalPointer()); + DataFilesItem *parentItem = childItem->parent(); + + if (parentItem == rootItem) + return QModelIndex(); + + return createIndex(parentItem->row(), 0, parentItem); +} + +int DataFilesModel::rowCount(const QModelIndex &parent) const +{ + DataFilesItem *parentItem; + if (parent.column() > 0) + return 0; + + if (!parent.isValid()) + parentItem = rootItem; + else + parentItem = static_cast(parent.internalPointer()); + + return parentItem->childCount(); +} + +/*void DataFilesModel::setupModelData(const QStringList &lines, DataFilesItem *parent) +{ + QList parents; + QList indentations; + parents << parent; + indentations << 0; + + int number = 0; + + while (number < lines.count()) { + int position = 0; + while (position < lines[number].length()) { + if (lines[number].mid(position, 1) != " ") + break; + position++; } - break; - case Qt::TextAlignmentRole: - return Qt::AlignLeft; + + QString lineData = lines[number].mid(position).trimmed(); + + if (!lineData.isEmpty()) { + // Read the column data from the rest of the line. + QStringList columnStrings = lineData.split("\t", QString::SkipEmptyParts); + QList columnData; + for (int column = 0; column < columnStrings.count(); ++column) + columnData << columnStrings[column]; + + if (position > indentations.last()) { + // The last child of the current parent is now the new parent + // unless the current parent has no children. + + if (parents.last()->childCount() > 0) { + parents << parents.last()->child(parents.last()->childCount()-1); + indentations << position; + } + } else { + while (position < indentations.last() && parents.count() > 0) { + parents.pop_back(); + indentations.pop_back(); + } + } + + // Append a new item to the current parent's list of children. + parents.last()->appendChild(new DataFilesItem(columnData, parents.last())); + } + + number++; } - - if (orientation != Qt::Horizontal || role != Qt::DisplayRole) - return QAbstractItemModel::headerData(section, orientation, role); - - QString returnValue; - switch (section) { - case 0: returnValue = tr("TES3 File"); - break; - case 1: returnValue = tr("Size"); - break; - case 2: returnValue = tr("Status"); - break; - case 3: returnValue = tr("Date Modified"); - break; - default: return QVariant(); - } - return returnValue; -} -*/ - -/*test -void DataFilesModel::setCheckedItems(const QStringList &gameFiles) -{ - qDebug() << "test"; - qDebug() << gameFiles.join("lol"); - - -}*/ - -/*void DataFilesModel::unCheckAll() -{ - checkedItems.clear(); -// data(); - emit dataChanged(QModelIndex(), QModelIndex()); - submit(); -}*/ - -const QStringList DataFilesModel::getCheckedItems() -//const QList DataFilesModel::getCheckedItems() -//const QSet DataFilesModel::getCheckedItems() -{ - return checkedItems; -} - -/*void DataFilesModel::sort(int column, Qt::SortOrder order) -{ - qDebug() << "Sort!"; -}*/ +}*/ \ No newline at end of file diff --git a/apps/launcher/datafilesmodel.h b/apps/launcher/datafilesmodel.h index 0e376865b7..bf2184dcdb 100644 --- a/apps/launcher/datafilesmodel.h +++ b/apps/launcher/datafilesmodel.h @@ -1,38 +1,35 @@ #ifndef DATAFILESMODEL_H #define DATAFILESMODEL_H -#include -#include +#include +#include +#include -#include +class DataFilesItem; -class DataFilesModel : public QFileSystemModel +class DataFilesModel : public QAbstractItemModel { + Q_OBJECT + public: + //DataFilesModel(const QString &data, QObject *parent = 0); DataFilesModel(QObject *parent = 0); - ~DataFilesModel() {}; - - QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const; + ~DataFilesModel(); + QVariant data(const QModelIndex &index, int role) const; Qt::ItemFlags flags(const QModelIndex &index) const; + QVariant headerData(int section, Qt::Orientation orientation, + int role = Qt::DisplayRole) const; + QModelIndex index(int row, int column, + const QModelIndex &parent = QModelIndex()) const; + QModelIndex parent(const QModelIndex &index) const; + int rowCount(const QModelIndex &parent = QModelIndex()) const; + int columnCount(const QModelIndex &parent = QModelIndex()) const; - bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole); +private: + //void setupModelData(const QStringList &lines, TreeItem *parent); -// void sort(int column, Qt::SortOrder order); - //test -// void setCheckedItems(const QStringList& files); -// void sort(int column, Qt::SortOrder order = Qt::AscendingOrder); -// void unCheckAll(); - -// const QSet getCheckedItems(); -// const QList getCheckedItems(); - const QStringList getCheckedItems(); - -// QVariant headerData(int section, Qt::Orientation orientation, int role) const; - -// QSet checkedItems; -// QList checkedItems; - QStringList checkedItems; + DataFilesItem *rootItem; }; -#endif +#endif \ No newline at end of file diff --git a/apps/launcher/launcher.pro b/apps/launcher/launcher.pro index ac17e019ef..4674c8c398 100644 --- a/apps/launcher/launcher.pro +++ b/apps/launcher/launcher.pro @@ -1,5 +1,5 @@ ###################################################################### -# Automatically generated by qmake (2.01a) Sun Mar 27 19:33:07 2011 +# Automatically generated by qmake (2.01a) Tue Mar 29 22:56:27 2011 ###################################################################### TEMPLATE = app @@ -9,15 +9,17 @@ INCLUDEPATH += . # Input HEADERS += datafilesdialog.h \ + datafilesitem.h \ datafilesmodel.h \ lineedit.h \ maindialog.h \ settingsdialog.h SOURCES += datafilesdialog.cpp \ + datafilesitem.cpp \ datafilesmodel.cpp \ lineedit.cpp \ main.cpp \ maindialog.cpp \ + qrc_resources.cxx \ settingsdialog.cpp RESOURCES += resources.qrc -RC_FILE = launcher.rc \ No newline at end of file From 1e62d8451fb93f18b1e0b84bac682c96e0891793 Mon Sep 17 00:00:00 2001 From: Pieter van der Kloet Date: Wed, 30 Mar 2011 14:05:27 +0200 Subject: [PATCH 008/111] More testing and removing --- apps/launcher/datafilesdialog.cpp | 45 ++++++++++++++++++++++--------- apps/launcher/datafilesdialog.h | 6 +++-- 2 files changed, 37 insertions(+), 14 deletions(-) diff --git a/apps/launcher/datafilesdialog.cpp b/apps/launcher/datafilesdialog.cpp index b906cb75b5..08fe1a085b 100644 --- a/apps/launcher/datafilesdialog.cpp +++ b/apps/launcher/datafilesdialog.cpp @@ -2,25 +2,17 @@ #include #include "datafilesdialog.h" -#include "datafilesmodel.h" -#include "datafilesitem.h" +//#include "datafilesmodel.h" +//#include "datafilesitem.h" using namespace ESM; DataFilesDialog::DataFilesDialog() { //dataFilesModel = new DataFilesModel(this); - dataFilesModel = new DataFilesModel(); + dataFilesModel = new QStandardItemModel(); - for (int row = 0; row < 4; ++row) { - for (int column = 0; column < 4; ++column) { - QList test; - test << QString("%0").arg(i); - DataFilesItem *item = new DataFilesItem(test); - dataFilesModel->setItem(row, column, item); - } - } - + //dataFilesModel->setReadOnly(true); // Prevent changes to files //dataFilesModel->setRootPath("data"); @@ -64,6 +56,10 @@ DataFilesDialog::DataFilesDialog() //dataFilesView = new QTreeView(groupFiles); dataFilesView = new QTreeView(groupFiles); dataFilesView->setModel(dataFilesModel); + dataFilesView->setDragEnabled(true); + dataFilesView->setDropIndicatorShown(true); + dataFilesView->setAlternatingRowColors(true); + // Put everything in the correct layouts //groupFilesLayout->addLayout(filterLayout); @@ -99,6 +95,7 @@ DataFilesDialog::DataFilesDialog() */ //readConfig(); //setupView(); + setupView(); } void DataFilesDialog::changeData(QModelIndex index, QModelIndex bottom) @@ -144,6 +141,30 @@ void DataFilesDialog::changeData(QModelIndex index, QModelIndex bottom) void DataFilesDialog::setupView() { + QDir datadir(QString("data/")); + QStringList acceptedfiles = (QStringList() << "*.esp"); + QStringList datafiles; + + datadir.setNameFilters(acceptedfiles); + + datafiles = datadir.entryList(); + + QStandardItem *parentItem = dataFilesModel->invisibleRootItem(); + QStandardItem *masterFile = new QStandardItem(QString("Morrowind.esm")); + parentItem->appendRow(masterFile); + parentItem = masterFile; + + QFileIconProvider fip; + QIcon fileIcon = fip.icon(QFileInfo("data/Morrowind.esm")); + + foreach (const QString ¤tfile, datafiles) { + QStandardItem *item = new QStandardItem(currentfile); + item->setIcon(fileIcon); + parentItem->appendRow(item); + } + + + /* The signal directoryLoaded is emitted after all files are in the model dataFilesView->setModel(dataFilesModel); // dataFilesView->setModel(sortModel); diff --git a/apps/launcher/datafilesdialog.h b/apps/launcher/datafilesdialog.h index d223bf14ad..38f4a5826c 100644 --- a/apps/launcher/datafilesdialog.h +++ b/apps/launcher/datafilesdialog.h @@ -3,7 +3,8 @@ #include "lineedit.h" -class DataFilesModel; +//class DataFilesModel; + /*class QStringList; class QTreeView; @@ -16,6 +17,7 @@ class QSortFilterProxyModel; #include class QTreeView; +class QStandardItemModel; class DataFilesDialog : public QDialog { @@ -26,7 +28,7 @@ public: // ~DataFilesDialog() { }; private: - DataFilesModel *dataFilesModel; + QStandardItemModel *dataFilesModel; QTreeView *dataFilesView; //QItemSelectionModel *selectionModel; From 96e7df36e5c83bcd8a0e3e09941ff2240e8ce873 Mon Sep 17 00:00:00 2001 From: Pieter van der Kloet Date: Sun, 3 Apr 2011 22:24:43 +0200 Subject: [PATCH 009/111] Added a proof-of-concept datafiles implementation to replace the old dialog --- apps/launcher/datafilesdialog.cpp | 407 ++++++++++++++++-------------- apps/launcher/datafilesdialog.h | 30 ++- 2 files changed, 240 insertions(+), 197 deletions(-) diff --git a/apps/launcher/datafilesdialog.cpp b/apps/launcher/datafilesdialog.cpp index 08fe1a085b..f00cfdfe8f 100644 --- a/apps/launcher/datafilesdialog.cpp +++ b/apps/launcher/datafilesdialog.cpp @@ -9,191 +9,233 @@ using namespace ESM; DataFilesDialog::DataFilesDialog() { - //dataFilesModel = new DataFilesModel(this); - dataFilesModel = new QStandardItemModel(); + QSplitter *splitter = new QSplitter(this); + tree = new QTreeView(this); + mastertable = new QTableView(this); + plugintable = new QTableView(this); + + splitter->setOrientation(Qt::Vertical); + splitter->addWidget(tree); + splitter->addWidget(mastertable); + splitter->addWidget(plugintable); + + // Adjust the widget heights inside the splitter + QList sizelist; + sizelist << 100 << 200 << 400; + splitter->setSizes(sizelist); - - //dataFilesModel->setReadOnly(true); // Prevent changes to files - //dataFilesModel->setRootPath("data"); - -// sortModel = new QSortFilterProxyModel(); -// sortModel->setSourceModel(dataFilesModel); - - //selectionModel = new QItemSelectionModel(dataFilesModel); -// selectionModel = new QItemSelectionModel(sortModel); - - /* First, show only plugin files and sort them - QStringList acceptedfiles = (QStringList() << "*.esp"); - dataFilesModel->setNameFilters(acceptedfiles); - dataFilesModel->setNameFilterDisables(false); // Hide all other files - - dataFilesModel->sort(3, Qt::AscendingOrder); // Sort the plugins by date - dataFilesModel->submit(); // Force refresh of the data - - // Now show master files too, to make them appear at the top of the list - acceptedfiles = (QStringList() << "*.esm" << "*.esp"); - dataFilesModel->setNameFilters(acceptedfiles); - dataFilesModel->setFilter(QDir::Files); -*/ - // Column 1 QVBoxLayout *dialogLayout = new QVBoxLayout(this); + dialogLayout->addWidget(splitter); + //dialogLayout->addWidget(plugintable); - QGroupBox *groupFiles = new QGroupBox(tr("Morrowind Files"), this); - groupFiles->setMinimumWidth(450); - QVBoxLayout *groupFilesLayout = new QVBoxLayout(groupFiles); + datafilesmodel = new QStandardItemModel(); + mastersmodel = new QStandardItemModel(); - //QSpacerItem *vSpacer1 = new QSpacerItem(20, 2, QSizePolicy::Minimum, QSizePolicy::Fixed); + QDir datafilesdir("data/"); + if (!datafilesdir.exists()) + qWarning("Cannot find the plugin directory"); - /*QHBoxLayout *filterLayout = new QHBoxLayout(); - QLabel *labelFilter = new QLabel(tr("Filter:"), groupFiles); - lineFilter = new LineEdit(groupFiles); - - filterLayout->addWidget(labelFilter); - filterLayout->addWidget(lineFilter); - */ - - // View for the game files - //dataFilesView = new QTreeView(groupFiles); - dataFilesView = new QTreeView(groupFiles); - dataFilesView->setModel(dataFilesModel); - dataFilesView->setDragEnabled(true); - dataFilesView->setDropIndicatorShown(true); - dataFilesView->setAlternatingRowColors(true); - - - // Put everything in the correct layouts - //groupFilesLayout->addLayout(filterLayout); - //groupFilesLayout->addItem(vSpacer1); - groupFilesLayout->addWidget(dataFilesView); - - QHBoxLayout *buttonsLayout = new QHBoxLayout(); - QSpacerItem *horizontalSpacer = new QSpacerItem(40, 20, QSizePolicy::Expanding, QSizePolicy::Minimum); - - QDialogButtonBox *buttonBox = new QDialogButtonBox(); - buttonBox->setStandardButtons(QDialogButtonBox::Cancel|QDialogButtonBox::Ok|QDialogButtonBox::RestoreDefaults); - buttonBox->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); - - buttonsLayout->addItem(horizontalSpacer); - buttonsLayout->addWidget(buttonBox); - - dialogLayout->addWidget(groupFiles); - dialogLayout->addLayout(buttonsLayout); - - setWindowTitle(tr("Data Files")); - - // Signals and slots - /*connect(dataFilesModel, SIGNAL(directoryLoaded(const QString &)), this, SLOT(setupView())); - - connect(dataFilesView, SIGNAL(doubleClicked(QModelIndex)), this, SLOT(setCheckstate(QModelIndex))); - connect(selectionModel, SIGNAL(currentChanged(QModelIndex, QModelIndex)), this, SLOT(changeData(QModelIndex, QModelIndex))); - - connect(lineFilter, SIGNAL(textChanged(const QString&)), this, SLOT(setFilter())); - - connect(buttonBox->button(QDialogButtonBox::RestoreDefaults), SIGNAL(clicked()), this, SLOT(restoreDefaults())); - connect(buttonBox, SIGNAL(accepted()), this, SLOT(writeConfig())); - connect(buttonBox, SIGNAL(rejected()), this, SLOT(close())); -*/ - //readConfig(); - //setupView(); - setupView(); -} - -void DataFilesDialog::changeData(QModelIndex index, QModelIndex bottom) -{ - /*if (!index.isValid()) { - return; - } - - // Added for testing - - textDepends->clear(); // Clear the dependencies of previous file - - ESMReader datafile; - QString path(dataFilesModel->filePath(index)); -// QString path(dataFilesModel->filePath(sortModel->mapToSource(index))); - - datafile.open(path.toStdString()); // Open the selected file - - // Get the author of the selected file and display it - QString author(QString::fromStdString(datafile.getAuthor())); - lineAuthor->setText(author); - - // Get the file desciption - QString desc(QString::fromStdString(datafile.getDesc())); - textDesc->setPlainText(desc); - - // Get a list of master files on which the file depends - ESMReader::MasterList mlist = datafile.getMasters(); - - for (unsigned int i = 0; i < mlist.size(); ++i) // Add each master file - textDepends->appendPlainText(QString::fromStdString(mlist[i].name)); - - /* Get the date of creation - QDateTime dateCreated = dataFilesModel->fileInfo(index).created(); - QString created = dateCreated.toString(QString("dd.MM.yyyy")); - labelDateCreated->setText(created); - - // Get the date last modified - QDateTime dateModified = dataFilesModel->fileInfo(index).lastModified(); - QString modified = dateModified.toString(QString("dd.MM.yyyy")); - labelDateModified->setText(modified);*/ -} - -void DataFilesDialog::setupView() -{ - QDir datadir(QString("data/")); QStringList acceptedfiles = (QStringList() << "*.esp"); - QStringList datafiles; + QStringList files; + + datafilesdir.setNameFilters(acceptedfiles); + files = datafilesdir.entryList(); + - datadir.setNameFilters(acceptedfiles); + //foreach (const QString ¤tfile, datafiles) { + for (int i=0; i foundmasters = mastersmodel->findItems(currentmaster); + + if (foundmasters.isEmpty()) { + // Current master is not found in the master, add it + mastersmodel->appendRow(item); + } + } + + // Add the masters to datafilesmodel + QStandardItem *item = new QStandardItem(masters.join(",")); + QStandardItem *child = new QStandardItem(currentfile); + + QList masteritems = datafilesmodel->findItems(masters.join(",")); + + + if (masteritems.isEmpty()) { + item->appendRow(child); + datafilesmodel->appendRow(item); + } else { + foreach (QStandardItem *currentitem, masteritems) { + currentitem->appendRow(child); + } + } + //if (foundmasters.isEmpty()) { + //datafilesmodel->appendRow(item); + //} + } + + /*for( int r=0; r<5; ++r ) { + QStandardItem *item = new QStandardItem( QString("Morrowind.esm").arg(r)); + + / *for( int i=0; i<3; i++ ) { + QStandardItem *child = new QStandardItem( QString("Master %0 Item %1").arg(r).arg(i)); + //child->setEditable( false ); + item->appendRow( child ); + }* / + + mastersmodel->setItem(r, 0, item); + }*/ + + + pluginsmodel = new QStandardItemModel(0, 1); + masterselectmodel = new QItemSelectionModel(mastersmodel); - datafiles = datadir.entryList(); + tree->setModel(datafilesmodel); + tree->header()->hide(); + + mastertable->setModel(mastersmodel); + mastertable->setSelectionModel(masterselectmodel); - QStandardItem *parentItem = dataFilesModel->invisibleRootItem(); - QStandardItem *masterFile = new QStandardItem(QString("Morrowind.esm")); - parentItem->appendRow(masterFile); - parentItem = masterFile; + mastertable->setSelectionBehavior(QAbstractItemView::SelectRows); + mastertable->setSelectionMode(QAbstractItemView::MultiSelection); + mastertable->setEditTriggers(QAbstractItemView::NoEditTriggers); + mastertable->horizontalHeader()->setStretchLastSection(true); + mastertable->horizontalHeader()->hide(); + + plugintable->setModel(pluginsmodel); + plugintable->setSelectionBehavior(QAbstractItemView::SelectRows); + plugintable->setSelectionMode(QAbstractItemView::MultiSelection); + plugintable->setEditTriggers(QAbstractItemView::NoEditTriggers); + plugintable->horizontalHeader()->setStretchLastSection(true); + plugintable->horizontalHeader()->hide(); + + connect(masterselectmodel, SIGNAL(selectionChanged(const QItemSelection&, const QItemSelection&)), this, SLOT(masterSelectionChanged(const QItemSelection&, const QItemSelection&))); + + // Adjust the dialog width + setMinimumWidth(500); +} + +void DataFilesDialog::appendPlugins(const QModelIndex &masterindex) +{ + // Find the plugins in the datafilesmodel and append them to the pluginsmodel + if (!masterindex.isValid()) + return; - QFileIconProvider fip; - QIcon fileIcon = fip.icon(QFileInfo("data/Morrowind.esm")); + for (int r=0; rrowCount(masterindex); ++r ) { + QModelIndex childindex = masterindex.child(r, 0); + + if (childindex.isValid()) { + // Now we see if the pluginsmodel already contains this plugin + QList itemlist = pluginsmodel->findItems(QVariant(datafilesmodel->data(childindex)).toString()); + + if (itemlist.isEmpty()) + { + // Plugin not yet in the pluginsmodel, add it + QStandardItem *item = new QStandardItem(QVariant(datafilesmodel->data(childindex)).toString()); + pluginsmodel->appendRow(item); + } + } - foreach (const QString ¤tfile, datafiles) { - QStandardItem *item = new QStandardItem(currentfile); - item->setIcon(fileIcon); - parentItem->appendRow(item); } +} + +void DataFilesDialog::removePlugins(const QModelIndex &masterindex) +{ + if (!masterindex.isValid()) + return; + + for (int r=0; rrowCount(masterindex); ++r) { + QModelIndex childindex = masterindex.child(r, 0); + + QList itemlist = pluginsmodel->findItems(QVariant(childindex.data()).toString()); + + if (!itemlist.isEmpty()) { + foreach (const QStandardItem *currentitem, itemlist) { + qDebug() << "Remove plugin:" << currentitem->data(Qt::DisplayRole).toString(); + pluginsmodel->removeRow(currentitem->row()); + } + } + } - /* The signal directoryLoaded is emitted after all files are in the model - dataFilesView->setModel(dataFilesModel); -// dataFilesView->setModel(sortModel); +} - // Set the view to the data directory - dataFilesView->setRootIndex(QModelIndex(dataFilesModel->index("data"))); -// dataFilesView->setRootIndex(sortModel->mapFromSource(QModelIndex(dataFilesModel->index("/opt/openmw/data")))); - - dataFilesView->verticalHeader()->hide(); - - //dataFilesView->hideColumn(1); - dataFilesView->hideColumn(3); // Hide Date Modified column - dataFilesView->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); - dataFilesView->verticalHeader()->setDefaultSectionSize(25); //setHeight - - dataFilesView->setSortingEnabled(true); - - dataFilesView->setSelectionBehavior(QAbstractItemView::SelectRows); - dataFilesView->setSelectionModel(selectionModel); - - - dataFilesView->setAlternatingRowColors(true); // Fancy colors! - - dataFilesView->resizeColumnsToContents(); - dataFilesView->horizontalHeader()->setStretchLastSection(true); - - - //sortModel->setSortCaseSensitivity(Qt::CaseInsensitive);*/ +void DataFilesDialog::masterSelectionChanged(const QItemSelection &selected, const QItemSelection &deselected) +{ + if (masterselectmodel->hasSelection()) { // Not exactly necessary to check + const QModelIndexList selectedindexes = masterselectmodel->selectedIndexes(); + + QStringList masters; + QString masterstr; + + // Create a QStringList containing all the masters + foreach (const QModelIndex ¤tindex, selectedindexes) { + masters.append(currentindex.data().toString()); + } + + masters.sort(); + masterstr = masters.join(","); // Make a comma-separated QString + + qDebug() << "Masters" << masterstr; + + // Iterate over all masters in the datafilesmodel to see if they are selected + for (int r=0; rrowCount(); ++r) { + QModelIndex currentindex = datafilesmodel->index(r, 0); + QString master = currentindex.data().toString(); + + if (currentindex.isValid()) { + // See if the current master is in the string with selected masters + if (masterstr.contains(master)) + { + // Append the plugins from the current master to pluginsmodel + appendPlugins(currentindex); + } + } + } + } + + // See what plugins to remove + QModelIndexList deselectedindexes = deselected.indexes(); + + if (!deselectedindexes.isEmpty()) { + foreach (const QModelIndex ¤tindex, deselectedindexes) { + QString master = currentindex.data().toString(); + master.prepend("*"); + master.append("*"); + QList itemlist = datafilesmodel->findItems(master, Qt::MatchWildcard); + + if (itemlist.isEmpty()) + qDebug() << "Empty as shit"; + + foreach (const QStandardItem *currentitem, itemlist) { + + QModelIndex index = currentitem->index(); + qDebug() << "Master to remove plugins of:" << index.data().toString(); + + removePlugins(index); + } + } + } } void DataFilesDialog::readConfig() @@ -329,29 +371,11 @@ void DataFilesDialog::restoreDefaults() dataFilesModel->submit(); // Force refresh of view*/ } -void DataFilesDialog::setCheckstate(QModelIndex index) + + +/*void DataFilesDialog::setFilter() { - /* No check if index is valid: doubleclicked() always returns - // a valid index when emitted - - //index = QModelIndex(sortModel->mapToSource(index)); // Get a valid index - index = index.sibling(index.row(), 0); // reset index to first column - // because that's where te checkbox is; makes it possible to doubleclick whole row - - if (!index.isValid()) - return; - - if (dataFilesModel->data(index, Qt::CheckStateRole) == Qt::Checked) { - // Selected row is checked, uncheck it - dataFilesModel->setData(index, Qt::Unchecked, Qt::CheckStateRole); - } else { - dataFilesModel->setData(index, Qt::Checked, Qt::CheckStateRole); - }*/ -} - -void DataFilesDialog::setFilter() -{ - /* + / * QStringList filefilter = (QStringList() << "*.esm" << "*.esp"); QStringList currentfilefilter; @@ -380,5 +404,6 @@ void DataFilesDialog::setFilter() // readConfig(); // dataFilesModel->submit(); // dataFilesModel->setData(); -*/ +* / } +*/ \ No newline at end of file diff --git a/apps/launcher/datafilesdialog.h b/apps/launcher/datafilesdialog.h index 38f4a5826c..69e57083e8 100644 --- a/apps/launcher/datafilesdialog.h +++ b/apps/launcher/datafilesdialog.h @@ -17,7 +17,10 @@ class QSortFilterProxyModel; #include class QTreeView; +class QTableView; class QStandardItemModel; +class QItemSelectionModel; +class QItemSelection; class DataFilesDialog : public QDialog { @@ -28,9 +31,9 @@ public: // ~DataFilesDialog() { }; private: - QStandardItemModel *dataFilesModel; + //QStandardItemModel *dataFilesModel; - QTreeView *dataFilesView; + //QTreeView *dataFilesView; //QItemSelectionModel *selectionModel; //QSortFilterProxyModel *sortModel; @@ -38,18 +41,33 @@ private: //LineEdit *lineFilter; //QPlainTextEdit *textDesc; //QPlainTextEdit *textDepends; + QModelIndexList *masterindexes; + QStandardItemModel *datafilesmodel; + QStandardItemModel *mastersmodel; + QStandardItemModel *pluginsmodel; + + QItemSelectionModel *masterselectmodel; + + QTreeView *tree; + + QTableView *mastertable; + QTableView *plugintable; + + void appendPlugins(const QModelIndex &masterindex); + void removePlugins(const QModelIndex &masterindex); public slots: - void changeData(QModelIndex top, QModelIndex bottom); // edit + //void changeData(QModelIndex top, QModelIndex bottom); // edit void restoreDefaults(); void readConfig(); void writeConfig(); - void setupView(); + //void setupView(); - void setFilter(); - void setCheckstate(QModelIndex index); + void masterSelectionChanged(const QItemSelection &selected, const QItemSelection &deselected); + //void setFilter(); + //void setCheckstate(QModelIndex index); // void doubleClicked(QModelIndex index); }; From fbdc10f0b0cde5b9699679b13d0e48fa3c90a181 Mon Sep 17 00:00:00 2001 From: Pieter van der Kloet Date: Mon, 4 Apr 2011 18:32:38 +0200 Subject: [PATCH 010/111] Removed some leftover files and more testing --- apps/launcher/CMakeLists.txt | 6 -- apps/launcher/datafilesdialog.cpp | 125 +++++++++++++++++++++++- apps/launcher/datafilesdialog.h | 7 +- apps/launcher/datafilesmodel.cpp | 155 ------------------------------ apps/launcher/datafilesmodel.h | 35 ------- 5 files changed, 128 insertions(+), 200 deletions(-) delete mode 100644 apps/launcher/datafilesmodel.cpp delete mode 100644 apps/launcher/datafilesmodel.h diff --git a/apps/launcher/CMakeLists.txt b/apps/launcher/CMakeLists.txt index fe29375d96..bb0af03b8a 100644 --- a/apps/launcher/CMakeLists.txt +++ b/apps/launcher/CMakeLists.txt @@ -1,14 +1,10 @@ set(LAUNCHER datafilesdialog.cpp - datafilesmodel.cpp - datafilesitem.cpp lineedit.cpp main.cpp maindialog.cpp settingsdialog.cpp datafilesdialog.h - datafilesmodel.h - datafilesitem.h lineedit.h maindialog.h settingsdialog.h @@ -16,8 +12,6 @@ set(LAUNCHER SET(MOC_HDRS datafilesdialog.h - datafilesmodel.h - datafilesitem.h lineedit.h maindialog.h settingsdialog.h diff --git a/apps/launcher/datafilesdialog.cpp b/apps/launcher/datafilesdialog.cpp index f00cfdfe8f..9b9733dedf 100644 --- a/apps/launcher/datafilesdialog.cpp +++ b/apps/launcher/datafilesdialog.cpp @@ -2,6 +2,7 @@ #include #include "datafilesdialog.h" +//#include "pluginitemmodel.h" //#include "datafilesmodel.h" //#include "datafilesitem.h" @@ -14,6 +15,28 @@ DataFilesDialog::DataFilesDialog() mastertable = new QTableView(this); plugintable = new QTableView(this); + /* listtest + QTableWidget *pluginlist = new QTableWidget(this); + + pluginlist->horizontalHeader()->setStretchLastSection(true); + pluginlist->insertColumn(0); + + for (unsigned int i=0; i<6; ++i) { + pluginlist->insertRow(i); + QTableWidgetItem *item = new QTableWidgetItem(QString("Plugin %0").arg(i)); + item->setFlags(item->flags() & ~(Qt::ItemIsDropEnabled)); + pluginlist->setItem(i, 0, item); + } + + pluginlist->insertRow(6); + pluginlist->setSelectionMode(QAbstractItemView::SingleSelection); // single item can be draged or droped + pluginlist->setDragEnabled(true); + pluginlist->setDragDropMode(QAbstractItemView::InternalMove); + pluginlist->viewport()->setAcceptDrops(true); + + pluginlist->setDropIndicatorShown(true); + */ + splitter->setOrientation(Qt::Vertical); splitter->addWidget(tree); splitter->addWidget(mastertable); @@ -63,6 +86,7 @@ DataFilesDialog::DataFilesDialog() // Add the masters to mastersmodel foreach (const QString ¤tmaster, masters) { QStandardItem *item = new QStandardItem(currentmaster); + item->setFlags(item->flags() & ~(Qt::ItemIsDropEnabled)); QList foundmasters = mastersmodel->findItems(currentmaster); @@ -74,7 +98,9 @@ DataFilesDialog::DataFilesDialog() // Add the masters to datafilesmodel QStandardItem *item = new QStandardItem(masters.join(",")); + item->setFlags(item->flags() & ~(Qt::ItemIsDropEnabled)); QStandardItem *child = new QStandardItem(currentfile); + child->setFlags(child->flags() & ~(Qt::ItemIsDropEnabled)); QList masteritems = datafilesmodel->findItems(masters.join(",")); @@ -84,6 +110,7 @@ DataFilesDialog::DataFilesDialog() datafilesmodel->appendRow(item); } else { foreach (QStandardItem *currentitem, masteritems) { + currentitem->setFlags(currentitem->flags() & ~(Qt::ItemIsDropEnabled)); currentitem->appendRow(child); } } @@ -106,7 +133,12 @@ DataFilesDialog::DataFilesDialog() pluginsmodel = new QStandardItemModel(0, 1); + pluginsmodel->setSupportedDragActions(Qt::MoveAction); + pluginsmodel->invisibleRootItem()->setFlags(Qt::ItemIsDropEnabled); + + masterselectmodel = new QItemSelectionModel(mastersmodel); + pluginselectmodel = new QItemSelectionModel(pluginsmodel); tree->setModel(datafilesmodel); tree->header()->hide(); @@ -121,14 +153,26 @@ DataFilesDialog::DataFilesDialog() mastertable->horizontalHeader()->hide(); plugintable->setModel(pluginsmodel); + plugintable->setSelectionModel(pluginselectmodel); plugintable->setSelectionBehavior(QAbstractItemView::SelectRows); - plugintable->setSelectionMode(QAbstractItemView::MultiSelection); + plugintable->setSelectionMode(QAbstractItemView::SingleSelection); plugintable->setEditTriggers(QAbstractItemView::NoEditTriggers); plugintable->horizontalHeader()->setStretchLastSection(true); plugintable->horizontalHeader()->hide(); + + plugintable->setDragEnabled(true); + plugintable->setDragDropMode(QAbstractItemView::InternalMove); + plugintable->setDropIndicatorShown(true); + plugintable->setDragDropOverwriteMode(false); + plugintable->viewport()->setAcceptDrops(true); + + plugintable->setContextMenuPolicy(Qt::CustomContextMenu); + connect(masterselectmodel, SIGNAL(selectionChanged(const QItemSelection&, const QItemSelection&)), this, SLOT(masterSelectionChanged(const QItemSelection&, const QItemSelection&))); - + connect(plugintable, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(showContextMenu(const QPoint&))); + connect(plugintable, SIGNAL(doubleClicked(QModelIndex)), this, SLOT(setCheckstate(QModelIndex))); + // Adjust the dialog width setMinimumWidth(500); } @@ -150,6 +194,8 @@ void DataFilesDialog::appendPlugins(const QModelIndex &masterindex) { // Plugin not yet in the pluginsmodel, add it QStandardItem *item = new QStandardItem(QVariant(datafilesmodel->data(childindex)).toString()); + item->setFlags(item->flags() & ~(Qt::ItemIsDropEnabled)); + item->setCheckable(true); pluginsmodel->appendRow(item); } } @@ -238,6 +284,78 @@ void DataFilesDialog::masterSelectionChanged(const QItemSelection &selected, con } } +void DataFilesDialog::showContextMenu(const QPoint &point) +{ + qDebug() << "Show me the money!"; + + + + QAction *action1 = new QAction(QIcon::fromTheme("arrow-up-double"), tr("Move to Top"), this); + QAction *action2 = new QAction(QIcon::fromTheme("arrow-down-double"), tr("Move to Bottom"), this); + QAction *action3 = new QAction(QIcon::fromTheme("arrow-up"), tr("Move Up"), this); + QAction *action4 = new QAction(QIcon::fromTheme("arrow-down"), tr("Move Down"), this); + QAction *action5 = new QAction(this); + + QModelIndex index = plugintable->indexAt(point); + + if (index.isValid()) { // Should be valid! + const QStandardItem *item = pluginsmodel->itemFromIndex(index); + + if (item->checkState() == Qt::Checked) { + action5->setText("Uncheck Item"); + } else if (item->checkState() == Qt::Unchecked) { + action5->setText("Check Item"); + } + } + + connect(action5, SIGNAL(triggered()), this, SLOT(actionCheckstate())); + + QMenu menu(this); + menu.addAction(action1); + menu.addAction(action2); + menu.addSeparator(); + menu.addAction(action3); + menu.addAction(action4); + menu.addSeparator(); + menu.addAction(action5); + + menu.exec(plugintable->viewport()->mapToGlobal(point)); + +} + +void DataFilesDialog::actionCheckstate() +{ + qDebug() << "actionCheckstate"; + + const QModelIndexList selectedindexes = pluginselectmodel->selectedIndexes(); + + // Should only be one index selected + foreach (const QModelIndex ¤tindex, selectedindexes) { + setCheckstate(currentindex); + } + +} + +void DataFilesDialog::setCheckstate(QModelIndex index) +{ + // No check if index is valid: doubleclicked() always returns + // a valid index when emitted + + //index = QModelIndex(sortModel->mapToSource(index)); // Get a valid index + index = index.sibling(index.row(), 0); // reset index to first column + // because that's where te checkbox is; makes it possible to doubleclick whole row + + if (!index.isValid()) + return; + + if (pluginsmodel->data(index, Qt::CheckStateRole) == Qt::Checked) { + // Selected row is checked, uncheck it + pluginsmodel->setData(index, Qt::Unchecked, Qt::CheckStateRole); + } else { + pluginsmodel->setData(index, Qt::Checked, Qt::CheckStateRole); + } +} + void DataFilesDialog::readConfig() { /* QString filename; @@ -406,4 +524,5 @@ void DataFilesDialog::restoreDefaults() // dataFilesModel->setData(); * / } -*/ \ No newline at end of file +*/ + diff --git a/apps/launcher/datafilesdialog.h b/apps/launcher/datafilesdialog.h index 69e57083e8..9a718f3f53 100644 --- a/apps/launcher/datafilesdialog.h +++ b/apps/launcher/datafilesdialog.h @@ -16,6 +16,7 @@ class QSortFilterProxyModel; #include #include +class PluginItemModel; class QTreeView; class QTableView; class QStandardItemModel; @@ -48,6 +49,7 @@ private: QStandardItemModel *pluginsmodel; QItemSelectionModel *masterselectmodel; + QItemSelectionModel *pluginselectmodel; QTreeView *tree; @@ -63,11 +65,14 @@ public slots: void restoreDefaults(); void readConfig(); void writeConfig(); + void showContextMenu(const QPoint &point); + + void actionCheckstate(); //void setupView(); void masterSelectionChanged(const QItemSelection &selected, const QItemSelection &deselected); //void setFilter(); - //void setCheckstate(QModelIndex index); + void setCheckstate(QModelIndex index); // void doubleClicked(QModelIndex index); }; diff --git a/apps/launcher/datafilesmodel.cpp b/apps/launcher/datafilesmodel.cpp deleted file mode 100644 index 0eb68ab4c6..0000000000 --- a/apps/launcher/datafilesmodel.cpp +++ /dev/null @@ -1,155 +0,0 @@ -#include - -#include "datafilesitem.h" -#include "datafilesmodel.h" - -//DataFilesModel::DataFilesModel(const QString &data, QObject *parent) -DataFilesModel::DataFilesModel(QObject *parent) - : QAbstractItemModel(parent) -{ - QList rootData; - rootData << " "; - //rootItem = new DataFilesItem(rootData); - rootItem = new DataFilesItem(rootData); - //setupModelData(data.split(QString("\n")), rootItem); -} - -DataFilesModel::~DataFilesModel() -{ - delete rootItem; -} - -int DataFilesModel::columnCount(const QModelIndex &parent) const -{ - if (parent.isValid()) - return static_cast(parent.internalPointer())->columnCount(); - else - return rootItem->columnCount(); -} - -QVariant DataFilesModel::data(const QModelIndex &index, int role) const -{ - if (!index.isValid()) - return QVariant(); - - if (role != Qt::DisplayRole) - return QVariant(); - - DataFilesItem *item = static_cast(index.internalPointer()); - - return item->data(index.column()); -} - -Qt::ItemFlags DataFilesModel::flags(const QModelIndex &index) const -{ - if (!index.isValid()) - return 0; - - return Qt::ItemIsEnabled | Qt::ItemIsSelectable; -} - -QVariant DataFilesModel::headerData(int section, Qt::Orientation orientation, - int role) const -{ - if (orientation == Qt::Horizontal && role == Qt::DisplayRole) - return rootItem->data(section); - - return QVariant(); -} - -QModelIndex DataFilesModel::index(int row, int column, const QModelIndex &parent) - const -{ - if (!hasIndex(row, column, parent)) - return QModelIndex(); - - DataFilesItem *parentItem; - - if (!parent.isValid()) - parentItem = rootItem; - else - parentItem = static_cast(parent.internalPointer()); - - DataFilesItem *childItem = parentItem->child(row); - if (childItem) - return createIndex(row, column, childItem); - else - return QModelIndex(); -} - -QModelIndex DataFilesModel::parent(const QModelIndex &index) const -{ - if (!index.isValid()) - return QModelIndex(); - - DataFilesItem *childItem = static_cast(index.internalPointer()); - DataFilesItem *parentItem = childItem->parent(); - - if (parentItem == rootItem) - return QModelIndex(); - - return createIndex(parentItem->row(), 0, parentItem); -} - -int DataFilesModel::rowCount(const QModelIndex &parent) const -{ - DataFilesItem *parentItem; - if (parent.column() > 0) - return 0; - - if (!parent.isValid()) - parentItem = rootItem; - else - parentItem = static_cast(parent.internalPointer()); - - return parentItem->childCount(); -} - -/*void DataFilesModel::setupModelData(const QStringList &lines, DataFilesItem *parent) -{ - QList parents; - QList indentations; - parents << parent; - indentations << 0; - - int number = 0; - - while (number < lines.count()) { - int position = 0; - while (position < lines[number].length()) { - if (lines[number].mid(position, 1) != " ") - break; - position++; - } - - QString lineData = lines[number].mid(position).trimmed(); - - if (!lineData.isEmpty()) { - // Read the column data from the rest of the line. - QStringList columnStrings = lineData.split("\t", QString::SkipEmptyParts); - QList columnData; - for (int column = 0; column < columnStrings.count(); ++column) - columnData << columnStrings[column]; - - if (position > indentations.last()) { - // The last child of the current parent is now the new parent - // unless the current parent has no children. - - if (parents.last()->childCount() > 0) { - parents << parents.last()->child(parents.last()->childCount()-1); - indentations << position; - } - } else { - while (position < indentations.last() && parents.count() > 0) { - parents.pop_back(); - indentations.pop_back(); - } - } - - // Append a new item to the current parent's list of children. - parents.last()->appendChild(new DataFilesItem(columnData, parents.last())); - } - - number++; - } -}*/ \ No newline at end of file diff --git a/apps/launcher/datafilesmodel.h b/apps/launcher/datafilesmodel.h deleted file mode 100644 index bf2184dcdb..0000000000 --- a/apps/launcher/datafilesmodel.h +++ /dev/null @@ -1,35 +0,0 @@ -#ifndef DATAFILESMODEL_H -#define DATAFILESMODEL_H - -#include -#include -#include - -class DataFilesItem; - -class DataFilesModel : public QAbstractItemModel -{ - Q_OBJECT - -public: - //DataFilesModel(const QString &data, QObject *parent = 0); - DataFilesModel(QObject *parent = 0); - ~DataFilesModel(); - - QVariant data(const QModelIndex &index, int role) const; - Qt::ItemFlags flags(const QModelIndex &index) const; - QVariant headerData(int section, Qt::Orientation orientation, - int role = Qt::DisplayRole) const; - QModelIndex index(int row, int column, - const QModelIndex &parent = QModelIndex()) const; - QModelIndex parent(const QModelIndex &index) const; - int rowCount(const QModelIndex &parent = QModelIndex()) const; - int columnCount(const QModelIndex &parent = QModelIndex()) const; - -private: - //void setupModelData(const QStringList &lines, TreeItem *parent); - - DataFilesItem *rootItem; -}; - -#endif \ No newline at end of file From 73f2fdfa7213726b753c904bb1cb51766b2f6717 Mon Sep 17 00:00:00 2001 From: Jan-Peter Nilsson Date: Fri, 1 Apr 2011 23:23:44 +0200 Subject: [PATCH 011/111] Update default version and add libbullet2.77 as a dependency --- CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 5a18751aad..53ba4ab31e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -347,7 +347,7 @@ if(DPKG_PROGRAM) set(PACKAGE_MAINTAINER "${GIT_NAME} <${GIT_EMAIL}>") else() #FIXME this should probably be read from some file like ${CMAKE_CURRENT_SOURCE_DIR}/VERSION or something that gets updated when changing version - set(VERSION_STRING "0.9.0") + set(VERSION_STRING "0.10.0") set(PACKAGE_MAINTAINER "unknown") endif() @@ -370,7 +370,7 @@ if(DPKG_PROGRAM) SET(CPACK_DEBIAN_PACKAGE_NAME "openmw") SET(CPACK_DEBIAN_PACKAGE_VERSION "${VERSION_STRING}") SET(CPACK_PACKAGE_EXECUTABLES "openmw;OpenMW") - SET(CPACK_DEBIAN_PACKAGE_DEPENDS "libogremain-1.7.1 (>= 1.7.1-1), libboost-filesystem1.42.0 (>= 1.42.0), libboost-program-options1.42.0 (>= 1.42.0), libboost-system1.42.0 (>= 1.42.0), libboost-thread1.42.0 (>= 1.42.0), libc6 (>= 2.11.2), libfreetype6 (>= 2.2.1), libgcc1 (>= 1:4.1.1), libmpg123-0 (>= 1.12.1), libois-1.2.0 (>= 1.2.0), libopenal1 (>= 1:1.12.854), libsndfile1 (>= 1.0.23), libstdc++6 (>= 4.4.5), libuuid1 (>= 2.17.2)") + SET(CPACK_DEBIAN_PACKAGE_DEPENDS "libogremain-1.7.1 (>= 1.7.1-1), libbullet2.77 (>= 2.77), libboost-filesystem1.42.0 (>= 1.42.0), libboost-program-options1.42.0 (>= 1.42.0), libboost-system1.42.0 (>= 1.42.0), libboost-thread1.42.0 (>= 1.42.0), libc6 (>= 2.11.2), libfreetype6 (>= 2.2.1), libgcc1 (>= 1:4.1.1), libmpg123-0 (>= 1.12.1), libois-1.2.0 (>= 1.2.0), libopenal1 (>= 1:1.12.854), libsndfile1 (>= 1.0.23), libstdc++6 (>= 4.4.5), libuuid1 (>= 2.17.2)") SET(CPACK_DEBIAN_PACKAGE_SECTION "Games") From b22234109dc56c16edd296347091eeffcf8adebb Mon Sep 17 00:00:00 2001 From: Jan-Peter Nilsson Date: Fri, 1 Apr 2011 23:25:22 +0200 Subject: [PATCH 012/111] Remove unused variable (compiler warning) --- apps/openmw/mwrender/mwscene.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/apps/openmw/mwrender/mwscene.cpp b/apps/openmw/mwrender/mwscene.cpp index 6fab00850f..5117f7eb87 100644 --- a/apps/openmw/mwrender/mwscene.cpp +++ b/apps/openmw/mwrender/mwscene.cpp @@ -63,7 +63,6 @@ MWScene::~MWScene() std::pair MWScene::getFacedHandle (MWWorld::World& world) { std::string handle = ""; - float distance = -1; //get a ray pointing to the center of the viewport Ray centerRay = getCamera()->getCameraToViewportRay( From 6aa1f3efdd1aa0882b04c1e4495ff3ba1db53416 Mon Sep 17 00:00:00 2001 From: Jan-Peter Nilsson Date: Fri, 1 Apr 2011 23:35:56 +0200 Subject: [PATCH 013/111] Whitespace changes only tabs->spaces and removal of traling space (including mangle and openengline) --- apps/openmw/engine.hpp | 2 +- apps/openmw/mwrender/mwscene.cpp | 88 ++--- apps/openmw/mwrender/mwscene.hpp | 2 +- apps/openmw/mwworld/world.cpp | 4 +- apps/openmw/mwworld/world.hpp | 2 +- components/interpreter/installopcodes.cpp | 86 ++--- components/nif/nif_file.cpp | 4 +- components/nifbullet/bullet_nif_loader.cpp | 360 ++++++++++----------- components/nifbullet/bullet_nif_loader.hpp | 86 ++--- components/nifbullet/test/test.cpp | 270 ++++++++-------- libs/mangle | 2 +- libs/openengine | 2 +- 12 files changed, 454 insertions(+), 454 deletions(-) diff --git a/apps/openmw/engine.hpp b/apps/openmw/engine.hpp index 5e38ab28f6..2f8a5b1d2e 100644 --- a/apps/openmw/engine.hpp +++ b/apps/openmw/engine.hpp @@ -60,7 +60,7 @@ namespace OMW boost::filesystem::path mDataDir; boost::filesystem::path mResDir; OEngine::Render::OgreRenderer mOgre; - OEngine::Physic::PhysicEngine* mPhysicEngine; + OEngine::Physic::PhysicEngine* mPhysicEngine; std::string mCellName; std::string mMaster; bool mShowFPS; diff --git a/apps/openmw/mwrender/mwscene.cpp b/apps/openmw/mwrender/mwscene.cpp index 5117f7eb87..890bf2cd6c 100644 --- a/apps/openmw/mwrender/mwscene.cpp +++ b/apps/openmw/mwrender/mwscene.cpp @@ -20,37 +20,37 @@ using namespace MWRender; using namespace Ogre; MWScene::MWScene(OEngine::Render::OgreRenderer &_rend , OEngine::Physic::PhysicEngine* physEng) - : rend(_rend) + : rend(_rend) { - eng = physEng; - rend.createScene("PlayerCam", 55, 5); + eng = physEng; + rend.createScene("PlayerCam", 55, 5); - // Set default mipmap level (NB some APIs ignore this) - TextureManager::getSingleton().setDefaultNumMipmaps(5); + // Set default mipmap level (NB some APIs ignore this) + TextureManager::getSingleton().setDefaultNumMipmaps(5); - // Load resources - ResourceGroupManager::getSingleton().initialiseAllResourceGroups(); + // Load resources + ResourceGroupManager::getSingleton().initialiseAllResourceGroups(); - // Turn the entire scene (represented by the 'root' node) -90 - // degrees around the x axis. This makes Z go upwards, and Y go into - // the screen (when x is to the right.) This is the orientation that - // Morrowind uses, and it automagically makes everything work as it - // should. - SceneNode *rt = rend.getScene()->getRootSceneNode(); - mwRoot = rt->createChildSceneNode(); - mwRoot->pitch(Degree(-90)); + // Turn the entire scene (represented by the 'root' node) -90 + // degrees around the x axis. This makes Z go upwards, and Y go into + // the screen (when x is to the right.) This is the orientation that + // Morrowind uses, and it automagically makes everything work as it + // should. + SceneNode *rt = rend.getScene()->getRootSceneNode(); + mwRoot = rt->createChildSceneNode(); + mwRoot->pitch(Degree(-90)); - //used to obtain ingame information of ogre objects (which are faced or selected) - mRaySceneQuery = rend.getScene()->createRayQuery(Ray()); + //used to obtain ingame information of ogre objects (which are faced or selected) + mRaySceneQuery = rend.getScene()->createRayQuery(Ray()); - Ogre::SceneNode *playerNode = mwRoot->createChildSceneNode(); - playerNode->pitch(Degree(90)); - Ogre::SceneNode *cameraYawNode = playerNode->createChildSceneNode(); - Ogre::SceneNode *cameraPitchNode = cameraYawNode->createChildSceneNode(); - cameraPitchNode->attachObject(getCamera()); + Ogre::SceneNode *playerNode = mwRoot->createChildSceneNode(); + playerNode->pitch(Degree(90)); + Ogre::SceneNode *cameraYawNode = playerNode->createChildSceneNode(); + Ogre::SceneNode *cameraPitchNode = cameraYawNode->createChildSceneNode(); + cameraPitchNode->attachObject(getCamera()); - mPlayer = new MWRender::Player (getCamera(), playerNode->getName()); + mPlayer = new MWRender::Player (getCamera(), playerNode->getName()); mFreeFly = true; } @@ -82,8 +82,8 @@ void MWScene::doPhysics (float duration, MWWorld::World& world, // stop changes to world from being reported back to the physics system MWWorld::DoingPhysics scopeGuard; - //set the DebugRenderingMode. To disable it,set it to 0 -// eng->setDebugRenderingMode(1); + //set the DebugRenderingMode. To disable it,set it to 0 + //eng->setDebugRenderingMode(1); //set the walkdirection to 0 (no movement) for every actor) for(std::map::iterator it = eng->PhysicActorMap.begin(); it != eng->PhysicActorMap.end();it++) @@ -95,7 +95,7 @@ void MWScene::doPhysics (float duration, MWWorld::World& world, for (std::vector >::const_iterator iter (actors.begin()); iter!=actors.end(); ++iter) { - OEngine::Physic::PhysicActor* act = eng->getCharacter(iter->first); + OEngine::Physic::PhysicActor* act = eng->getCharacter(iter->first); //dirty stuff to get the camera orientation. Must be changed! @@ -117,46 +117,46 @@ void MWScene::doPhysics (float duration, MWWorld::World& world, dir = 0.025*(quat*dir1); } - //set the walk direction - act->setWalkDirection(btVector3(dir.x,-dir.z,dir.y)); + //set the walk direction + act->setWalkDirection(btVector3(dir.x,-dir.z,dir.y)); } - eng->stepSimulation(duration); + eng->stepSimulation(duration); for(std::map::iterator it = eng->PhysicActorMap.begin(); it != eng->PhysicActorMap.end();it++) { OEngine::Physic::PhysicActor* act = it->second; - btVector3 newPos = act->getPosition(); + btVector3 newPos = act->getPosition(); MWWorld::Ptr ptr = world.getPtrViaHandle (it->first); - world.moveObject (ptr, newPos.x(), newPos.y(), newPos.z()); + world.moveObject (ptr, newPos.x(), newPos.y(), newPos.z()); } } void MWScene::addObject (const std::string& handle, const std::string& mesh, const Ogre::Quaternion& rotation, float scale, const Ogre::Vector3& position) { - OEngine::Physic::RigidBody* body = eng->createRigidBody(mesh,handle); - eng->addRigidBody(body); - btTransform tr; - tr.setOrigin(btVector3(position.x,position.y,position.z)); - tr.setRotation(btQuaternion(rotation.x,rotation.y,rotation.z,rotation.w)); - body->setWorldTransform(tr); + OEngine::Physic::RigidBody* body = eng->createRigidBody(mesh,handle); + eng->addRigidBody(body); + btTransform tr; + tr.setOrigin(btVector3(position.x,position.y,position.z)); + tr.setRotation(btQuaternion(rotation.x,rotation.y,rotation.z,rotation.w)); + body->setWorldTransform(tr); } void MWScene::addActor (const std::string& handle, const std::string& mesh, const Ogre::Vector3& position) { - //TODO:optimize this. Searching the std::map isn't very efficient i think. - eng->addCharacter(handle); - OEngine::Physic::PhysicActor* act = eng->getCharacter(handle); - act->setPosition(btVector3(position.x,position.y,position.z)); + //TODO:optimize this. Searching the std::map isn't very efficient i think. + eng->addCharacter(handle); + OEngine::Physic::PhysicActor* act = eng->getCharacter(handle); + act->setPosition(btVector3(position.x,position.y,position.z)); } void MWScene::removeObject (const std::string& handle) { - //TODO:check if actor??? + //TODO:check if actor??? eng->removeCharacter(handle); - eng->removeRigidBody(handle); - eng->deleteRigidBody(handle); + eng->removeRigidBody(handle); + eng->deleteRigidBody(handle); } void MWScene::moveObject (const std::string& handle, const Ogre::Vector3& position, bool updatePhysics) diff --git a/apps/openmw/mwrender/mwscene.hpp b/apps/openmw/mwrender/mwscene.hpp index aa567f7def..fd14fcce01 100644 --- a/apps/openmw/mwrender/mwscene.hpp +++ b/apps/openmw/mwrender/mwscene.hpp @@ -40,7 +40,7 @@ namespace MWRender Ogre::SceneNode *mwRoot; Ogre::RaySceneQuery *mRaySceneQuery; - OEngine::Physic::PhysicEngine* eng; + OEngine::Physic::PhysicEngine* eng; MWRender::Player *mPlayer; diff --git a/apps/openmw/mwworld/world.cpp b/apps/openmw/mwworld/world.cpp index c08dc420bb..63019349c8 100644 --- a/apps/openmw/mwworld/world.cpp +++ b/apps/openmw/mwworld/world.cpp @@ -412,7 +412,7 @@ namespace MWWorld : mSkyManager (0), mScene (renderer,physEng), mPlayer (0), mCurrentCell (0), mGlobalVariables (0), mSky (false), mCellChanged (false), mEnvironment (environment) { - mPhysEngine = physEng; + mPhysEngine = physEng; boost::filesystem::path masterPath (dataDir); masterPath /= master; @@ -437,7 +437,7 @@ namespace MWWorld mSkyManager = MWRender::SkyManager::create(renderer.getWindow(), mScene.getCamera(), resDir); - mPhysEngine = physEng; + mPhysEngine = physEng; } World::~World() diff --git a/apps/openmw/mwworld/world.hpp b/apps/openmw/mwworld/world.hpp index d64fa57be1..6965aebc6a 100644 --- a/apps/openmw/mwworld/world.hpp +++ b/apps/openmw/mwworld/world.hpp @@ -75,7 +75,7 @@ namespace MWWorld bool mCellChanged; Environment& mEnvironment; - OEngine::Physic::PhysicEngine* mPhysEngine; + OEngine::Physic::PhysicEngine* mPhysEngine; // not implemented World (const World&); diff --git a/components/interpreter/installopcodes.cpp b/components/interpreter/installopcodes.cpp index 2e22d10e5c..f383ff47c2 100644 --- a/components/interpreter/installopcodes.cpp +++ b/components/interpreter/installopcodes.cpp @@ -24,23 +24,23 @@ namespace Interpreter interpreter.installSegment5 (8, new OpNegateFloat); interpreter.installSegment5 (17, new OpIntToFloat1); interpreter.installSegment5 (18, new OpFloatToInt1); - + // local variables, global variables & literals interpreter.installSegment5 (0, new OpStoreLocalShort); interpreter.installSegment5 (1, new OpStoreLocalLong); - interpreter.installSegment5 (2, new OpStoreLocalFloat); - interpreter.installSegment5 (4, new OpFetchIntLiteral); - interpreter.installSegment5 (5, new OpFetchFloatLiteral); + interpreter.installSegment5 (2, new OpStoreLocalFloat); + interpreter.installSegment5 (4, new OpFetchIntLiteral); + interpreter.installSegment5 (5, new OpFetchFloatLiteral); interpreter.installSegment5 (21, new OpFetchLocalShort); interpreter.installSegment5 (22, new OpFetchLocalLong); - interpreter.installSegment5 (23, new OpFetchLocalFloat); + interpreter.installSegment5 (23, new OpFetchLocalFloat); interpreter.installSegment5 (39, new OpStoreGlobalShort); interpreter.installSegment5 (40, new OpStoreGlobalLong); - interpreter.installSegment5 (41, new OpStoreGlobalFloat); + interpreter.installSegment5 (41, new OpStoreGlobalFloat); interpreter.installSegment5 (42, new OpFetchGlobalShort); interpreter.installSegment5 (43, new OpFetchGlobalLong); - interpreter.installSegment5 (44, new OpFetchGlobalFloat); - + interpreter.installSegment5 (44, new OpFetchGlobalFloat); + // math interpreter.installSegment5 (9, new OpAddInt); interpreter.installSegment5 (10, new OpAddInt); @@ -50,57 +50,57 @@ namespace Interpreter interpreter.installSegment5 (14, new OpMulInt); interpreter.installSegment5 (15, new OpDivInt); interpreter.installSegment5 (16, new OpDivInt); - interpreter.installSegment5 (19, new OpSquareRoot); - interpreter.installSegment5 (26, - new OpCompare >); - interpreter.installSegment5 (27, - new OpCompare >); - interpreter.installSegment5 (28, - new OpCompare >); - interpreter.installSegment5 (29, - new OpCompare >); - interpreter.installSegment5 (30, - new OpCompare >); - interpreter.installSegment5 (31, - new OpCompare >); - - interpreter.installSegment5 (32, - new OpCompare >); - interpreter.installSegment5 (33, - new OpCompare >); - interpreter.installSegment5 (34, - new OpCompare >); - interpreter.installSegment5 (35, - new OpCompare >); - interpreter.installSegment5 (36, - new OpCompare >); - interpreter.installSegment5 (37, - new OpCompare >); - + interpreter.installSegment5 (19, new OpSquareRoot); + interpreter.installSegment5 (26, + new OpCompare >); + interpreter.installSegment5 (27, + new OpCompare >); + interpreter.installSegment5 (28, + new OpCompare >); + interpreter.installSegment5 (29, + new OpCompare >); + interpreter.installSegment5 (30, + new OpCompare >); + interpreter.installSegment5 (31, + new OpCompare >); + + interpreter.installSegment5 (32, + new OpCompare >); + interpreter.installSegment5 (33, + new OpCompare >); + interpreter.installSegment5 (34, + new OpCompare >); + interpreter.installSegment5 (35, + new OpCompare >); + interpreter.installSegment5 (36, + new OpCompare >); + interpreter.installSegment5 (37, + new OpCompare >); + // control structures - interpreter.installSegment5 (20, new OpReturn); + interpreter.installSegment5 (20, new OpReturn); interpreter.installSegment5 (24, new OpSkipZero); interpreter.installSegment5 (25, new OpSkipNonZero); interpreter.installSegment0 (1, new OpJumpForward); interpreter.installSegment0 (2, new OpJumpBackward); - + // misc - interpreter.installSegment3 (0, new OpMessageBox); - interpreter.installSegment5 (38, new OpMenuMode); - interpreter.installSegment5 (45, new OpRandom); - interpreter.installSegment5 (50, new OpGetSecondsPassed); + interpreter.installSegment3 (0, new OpMessageBox); + interpreter.installSegment5 (38, new OpMenuMode); + interpreter.installSegment5 (45, new OpRandom); + interpreter.installSegment5 (50, new OpGetSecondsPassed); interpreter.installSegment5 (51, new OpEnable); interpreter.installSegment5 (52, new OpDisable); interpreter.installSegment5 (53, new OpGetDisabled); interpreter.installSegment5 (54, new OpEnableExplicit); interpreter.installSegment5 (55, new OpDisableExplicit); interpreter.installSegment5 (56, new OpGetDisabledExplicit); - + // script control interpreter.installSegment5 (46, new OpScriptRunning); interpreter.installSegment5 (47, new OpStartScript); interpreter.installSegment5 (48, new OpStopScript); - + // spacial interpreter.installSegment5 (49, new OpGetDistance); interpreter.installSegment5 (57, new OpGetDistanceExplicit); diff --git a/components/nif/nif_file.cpp b/components/nif/nif_file.cpp index 6a4eb337c2..3c7d7fb17c 100644 --- a/components/nif/nif_file.cpp +++ b/components/nif/nif_file.cpp @@ -92,8 +92,8 @@ void NIFFile::parse() else if(rec == "NiRotatingParticles") { r = new NiRotatingParticles; r->recType = RC_NiRotatingParticles; } else if(rec == "NiAutoNormalParticles") { r = new NiAutoNormalParticles; r->recType = RC_NiAutoNormalParticles; } else if(rec == "NiCamera") { r = new NiCamera; r->recType = RC_NiCamera; } - else if(rec == "RootCollisionNode"){ r = new NiNode; r->recType = RC_RootCollisionNode; }// a root collision node is exactly like a node - //that's why there is no need to create a new type + else if(rec == "RootCollisionNode"){ r = new NiNode; r->recType = RC_RootCollisionNode; }// a root collision node is exactly like a node + //that's why there is no need to create a new type // Properties else if(rec == "NiTexturingProperty") { r = new NiTexturingProperty; r->recType = RC_NiTexturingProperty; } diff --git a/components/nifbullet/bullet_nif_loader.cpp b/components/nifbullet/bullet_nif_loader.cpp index b3fd9019c7..1ff78023d9 100644 --- a/components/nifbullet/bullet_nif_loader.cpp +++ b/components/nifbullet/bullet_nif_loader.cpp @@ -54,264 +54,264 @@ using namespace Mangle::VFS; //==================================================================================================== Ogre::Matrix3 ManualBulletShapeLoader::getMatrix(Nif::Transformation* tr) { - Ogre::Matrix3 rot(tr->rotation.v[0].array[0],tr->rotation.v[0].array[1],tr->rotation.v[0].array[2], - tr->rotation.v[1].array[0],tr->rotation.v[1].array[1],tr->rotation.v[1].array[2], - tr->rotation.v[2].array[0],tr->rotation.v[2].array[1],tr->rotation.v[2].array[2]); - return rot; + Ogre::Matrix3 rot(tr->rotation.v[0].array[0],tr->rotation.v[0].array[1],tr->rotation.v[0].array[2], + tr->rotation.v[1].array[0],tr->rotation.v[1].array[1],tr->rotation.v[1].array[2], + tr->rotation.v[2].array[0],tr->rotation.v[2].array[1],tr->rotation.v[2].array[2]); + return rot; } Ogre::Vector3 ManualBulletShapeLoader::getVector(Nif::Transformation* tr) { - Ogre::Vector3 vect3(tr->pos.array[0],tr->pos.array[1],tr->pos.array[2]); - return vect3; + Ogre::Vector3 vect3(tr->pos.array[0],tr->pos.array[1],tr->pos.array[2]); + return vect3; } btQuaternion ManualBulletShapeLoader::getbtQuat(Ogre::Matrix3 m) { - Ogre::Quaternion oquat(m); - btQuaternion quat; - quat.setW(oquat.w); - quat.setX(oquat.x); - quat.setY(oquat.y); - quat.setZ(oquat.z); - return quat; + Ogre::Quaternion oquat(m); + btQuaternion quat; + quat.setW(oquat.w); + quat.setX(oquat.x); + quat.setY(oquat.y); + quat.setZ(oquat.z); + return quat; } btVector3 ManualBulletShapeLoader::getbtVector(Nif::Vector v) { - btVector3 a(v.array[0],v.array[1],v.array[2]); - return a; + btVector3 a(v.array[0],v.array[1],v.array[2]); + return a; } void ManualBulletShapeLoader::loadResource(Ogre::Resource *resource) { - cShape = static_cast(resource); - resourceName = cShape->getName(); + cShape = static_cast(resource); + resourceName = cShape->getName(); cShape->collide = false; - currentShape = new btCompoundShape(); - cShape->Shape = currentShape; + currentShape = new btCompoundShape(); + cShape->Shape = currentShape; - if (!vfs) vfs = new OgreVFS(resourceGroup); + if (!vfs) vfs = new OgreVFS(resourceGroup); - if (!vfs->isFile(resourceName)) - { - warn("File not found."); - return; - } + if (!vfs->isFile(resourceName)) + { + warn("File not found."); + return; + } - // Load the NIF. TODO: Wrap this in a try-catch block once we're out - // of the early stages of development. Right now we WANT to catch - // every error as early and intrusively as possible, as it's most - // likely a sign of incomplete code rather than faulty input. - Nif::NIFFile nif(vfs->open(resourceName), resourceName); + // Load the NIF. TODO: Wrap this in a try-catch block once we're out + // of the early stages of development. Right now we WANT to catch + // every error as early and intrusively as possible, as it's most + // likely a sign of incomplete code rather than faulty input. + Nif::NIFFile nif(vfs->open(resourceName), resourceName); - if (nif.numRecords() < 1) - { - warn("Found no records in NIF."); - return; - } + if (nif.numRecords() < 1) + { + warn("Found no records in NIF."); + return; + } - // The first record is assumed to be the root node - Nif::Record *r = nif.getRecord(0); - assert(r != NULL); + // The first record is assumed to be the root node + Nif::Record *r = nif.getRecord(0); + assert(r != NULL); - Nif::Node *node = dynamic_cast(r); + Nif::Node *node = dynamic_cast(r); - if (node == NULL) - { - warn("First record in file was not a node, but a " + - r->recName.toString() + ". Skipping file."); - return; - } + if (node == NULL) + { + warn("First record in file was not a node, but a " + + r->recName.toString() + ". Skipping file."); + return; + } bool hasCollisionNode = hasRootCollisionNode(node); //do a first pass - handleNode(node,0,Ogre::Matrix3::IDENTITY,Ogre::Vector3::ZERO,1,hasCollisionNode,false,false); + handleNode(node,0,Ogre::Matrix3::IDENTITY,Ogre::Vector3::ZERO,1,hasCollisionNode,false,false); //if collide = false, then it does a second pass which create a shape for raycasting. if(cShape->collide == false) { - handleNode(node,0,Ogre::Matrix3::IDENTITY,Ogre::Vector3::ZERO,1,hasCollisionNode,false,true); + handleNode(node,0,Ogre::Matrix3::IDENTITY,Ogre::Vector3::ZERO,1,hasCollisionNode,false,true); } } bool ManualBulletShapeLoader::hasRootCollisionNode(Nif::Node* node) { - if (node->recType == Nif::RC_NiNode) - { - Nif::NodeList &list = ((Nif::NiNode*)node)->children; - int n = list.length(); - for (int i=0; irecType == Nif::RC_NiNode) + { + Nif::NodeList &list = ((Nif::NiNode*)node)->children; + int n = list.length(); + for (int i=0; irecType == Nif::RC_NiTriShape) + else if (node->recType == Nif::RC_NiTriShape) { return false; } - else if(node->recType == Nif::RC_RootCollisionNode) - { + else if(node->recType == Nif::RC_RootCollisionNode) + { return true; - } - + } + return false; } void ManualBulletShapeLoader::handleNode(Nif::Node *node, int flags, - Ogre::Matrix3 parentRot,Ogre::Vector3 parentPos,float parentScale,bool hasCollisionNode,bool isCollisionNode,bool raycastingOnly) + Ogre::Matrix3 parentRot,Ogre::Vector3 parentPos,float parentScale,bool hasCollisionNode,bool isCollisionNode,bool raycastingOnly) { - // Accumulate the flags from all the child nodes. This works for all - // the flags we currently use, at least. - flags |= node->flags; + // Accumulate the flags from all the child nodes. This works for all + // the flags we currently use, at least. + flags |= node->flags; - // Check for extra data - Nif::Extra *e = node; - while (!e->extra.empty()) - { - // Get the next extra data in the list - e = e->extra.getPtr(); - assert(e != NULL); + // Check for extra data + Nif::Extra *e = node; + while (!e->extra.empty()) + { + // Get the next extra data in the list + e = e->extra.getPtr(); + assert(e != NULL); - if (e->recType == Nif::RC_NiStringExtraData) - { - // String markers may contain important information - // affecting the entire subtree of this node - Nif::NiStringExtraData *sd = (Nif::NiStringExtraData*)e; + if (e->recType == Nif::RC_NiStringExtraData) + { + // String markers may contain important information + // affecting the entire subtree of this node + Nif::NiStringExtraData *sd = (Nif::NiStringExtraData*)e; - if (sd->string == "NCO" && !raycastingOnly) - { - // No collision. Use an internal flag setting to mark this. - // We ignor this node! - flags |= 0x800; - return; - } - else if (sd->string == "MRK" && !raycastingOnly) - // Marker objects. These are only visible in the - // editor. Until and unless we add an editor component to - // the engine, just skip this entire node. - return; - } - } + if (sd->string == "NCO" && !raycastingOnly) + { + // No collision. Use an internal flag setting to mark this. + // We ignor this node! + flags |= 0x800; + return; + } + else if (sd->string == "MRK" && !raycastingOnly) + // Marker objects. These are only visible in the + // editor. Until and unless we add an editor component to + // the engine, just skip this entire node. + return; + } + } - //transfo of parents node + curent node - Ogre::Matrix3 finalRot; - Ogre::Vector3 finalPos; - float finalScale; + //transfo of parents node + curent node + Ogre::Matrix3 finalRot; + Ogre::Vector3 finalPos; + float finalScale; - Nif::Transformation &final = *((Nif::Transformation*)node->trafo); - Ogre::Vector3 nodePos = getVector(&final); - Ogre::Matrix3 nodeRot = getMatrix(&final); + Nif::Transformation &final = *((Nif::Transformation*)node->trafo); + Ogre::Vector3 nodePos = getVector(&final); + Ogre::Matrix3 nodeRot = getMatrix(&final); - finalPos = nodePos + parentPos; - finalRot = parentRot*nodeRot; - finalScale = final.scale*parentScale; + finalPos = nodePos + parentPos; + finalRot = parentRot*nodeRot; + finalScale = final.scale*parentScale; - // For NiNodes, loop through children - if (node->recType == Nif::RC_NiNode) - { - Nif::NodeList &list = ((Nif::NiNode*)node)->children; - int n = list.length(); - for (int i=0; irecType == Nif::RC_NiNode) + { + Nif::NodeList &list = ((Nif::NiNode*)node)->children; + int n = list.length(); + for (int i=0; irecType == Nif::RC_NiTriShape && (isCollisionNode || !hasCollisionNode)) { cShape->collide = true; handleNiTriShape(dynamic_cast(node), flags,finalRot,finalPos,finalScale,raycastingOnly); } - else if(node->recType == Nif::RC_RootCollisionNode) - { - Nif::NodeList &list = ((Nif::NiNode*)node)->children; - int n = list.length(); - for (int i=0; irecType == Nif::RC_RootCollisionNode) + { + Nif::NodeList &list = ((Nif::NiNode*)node)->children; + int n = list.length(); + for (int i=0; i