1
0
mirror of https://github.com/vcmi/vcmi.git synced 2024-12-24 22:14:36 +02:00

fixes for launcher, as discussed on forums:

- renamed files that should be preprocessed with moc: they will have _moc suffix (cpp files were also renamed for consistency)
- fixed disabling of mods that have dependent on them mods
- repositories will be reloaded if changed
- may have fixed non-starting vcmi client on Win
This commit is contained in:
Ivan Savenko 2013-08-24 20:11:51 +00:00
parent 0c717618c5
commit 4287b2b7bb
21 changed files with 102 additions and 42 deletions

View File

@ -5,29 +5,29 @@ include_directories(${CMAKE_HOME_DIRECTORY} ${CMAKE_CURRENT_SOURCE_DIR})
include_directories(${Qt5Widgets_INCLUDE_DIRS} ${Qt5Network_INCLUDE_DIRS})
set(launcher_modmanager_SRCS
modManager/cdownloadmanager.cpp
modManager/cdownloadmanager_moc.cpp
modManager/cmodlist.cpp
modManager/cmodlistmodel.cpp
modManager/cmodlistview.cpp
modManager/cmodlistmodel_moc.cpp
modManager/cmodlistview_moc.cpp
modManager/cmodmanager.cpp
)
set(launcher_settingsview_SRCS
settingsView/csettingsview.cpp
settingsView/csettingsview_moc.cpp
)
set(launcher_SRCS
${launcher_modmanager_SRCS}
${launcher_settingsview_SRCS}
main.cpp
mainwindow.cpp
mainwindow_moc.cpp
launcherdirs.cpp
)
set(launcher_FORMS
modManager/cmodlistview.ui
settingsView/csettingsview.ui
mainwindow.ui
modManager/cmodlistview_moc.ui
settingsView/csettingsview_moc.ui
mainwindow_moc.ui
)
# Tell CMake to run moc when necessary:

View File

@ -1,5 +1,5 @@
#include "StdInc.h"
#include "mainwindow.h"
#include "mainwindow_moc.h"
#include <QApplication>
int main(int argc, char *argv[])

View File

@ -1,6 +1,6 @@
#include "StdInc.h"
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "mainwindow_moc.h"
#include "ui_mainwindow_moc.h"
#include <QProcess>
#include <QDir>
@ -46,13 +46,7 @@ MainWindow::~MainWindow()
void MainWindow::on_startGameButon_clicked()
{
#if defined(Q_OS_WIN)
QString clientName = "VCMI_Client.exe";
#else
// TODO: Right now launcher will only start vcmi from system-default locations
QString clientName = "vcmiclient";
#endif
startExecutable(clientName);
startExecutable(QString::fromUtf8(VCMIDirs::get().clientPath().c_str()));
}
void MainWindow::startExecutable(QString name)
@ -68,7 +62,8 @@ void MainWindow::startExecutable(QString name)
{
QMessageBox::critical(this,
"Error starting executable",
"Failed to start " + name + ": " + process.errorString(),
"Failed to start " + name + "\n"
"Reason: " + process.errorString(),
QMessageBox::Ok,
QMessageBox::Ok);
return;

View File

@ -187,13 +187,13 @@
<customwidget>
<class>CModListView</class>
<extends>QWidget</extends>
<header>modManager/cmodlistview.h</header>
<header>modManager/cmodlistview_moc.h</header>
<container>1</container>
</customwidget>
<customwidget>
<class>CSettingsView</class>
<extends>QWidget</extends>
<header>settingsView/csettingsview.h</header>
<header>settingsView/csettingsview_moc.h</header>
<container>1</container>
</customwidget>
</customwidgets>

View File

@ -1,5 +1,5 @@
#include "StdInc.h"
#include "cdownloadmanager.h"
#include "cdownloadmanager_moc.h"
#include "launcherdirs.h"

View File

@ -111,9 +111,14 @@ QJsonObject CModList::copyField(QJsonObject data, QString from, QString to)
return renamed;
}
void CModList::resetRepositories()
{
repositories.clear();
}
void CModList::addRepository(QJsonObject data)
{
repositores.push_back(copyField(data, "version", "latestVersion"));
repositories.push_back(copyField(data, "version", "latestVersion"));
}
void CModList::setLocalModList(QJsonObject data)
@ -134,7 +139,7 @@ CModEntry CModList::getMod(QString modname) const
QJsonObject local = localModList[modname].toObject();
QJsonValue settings = modSettings[modname];
for (auto entry : repositores)
for (auto entry : repositories)
{
if (entry.contains(modname))
{
@ -157,7 +162,7 @@ bool CModList::hasMod(QString modname) const
if (localModList.contains(modname))
return true;
for (auto entry : repositores)
for (auto entry : repositories)
if (entry.contains(modname))
return true;
@ -184,7 +189,7 @@ QVector<QString> CModList::getModList() const
{
QSet<QString> knownMods;
QVector<QString> modList;
for (auto repo : repositores)
for (auto repo : repositories)
{
for (auto it = repo.begin(); it != repo.end(); it++)
{

View File

@ -52,12 +52,13 @@ public:
class CModList
{
QVector<QJsonObject> repositores;
QVector<QJsonObject> repositories;
QJsonObject localModList;
QJsonObject modSettings;
QJsonObject copyField(QJsonObject data, QString from, QString to);
public:
virtual void resetRepositories();
virtual void addRepository(QJsonObject data);
virtual void setLocalModList(QJsonObject data);
virtual void setModSettings(QJsonObject data);

View File

@ -1,5 +1,5 @@
#include "StdInc.h"
#include "cmodlistmodel.h"
#include "cmodlistmodel_moc.h"
#include <QIcon>
@ -110,6 +110,13 @@ QVariant CModListModel::headerData(int section, Qt::Orientation orientation, int
return QVariant();
}
void CModListModel::resetRepositories()
{
beginResetModel();
CModList::resetRepositories();
endResetModel();
}
void CModListModel::addRepository(QJsonObject data)
{
beginResetModel();

View File

@ -29,6 +29,7 @@ class CModListModel : public QAbstractTableModel, public CModList
void endResetModel();
public:
/// CModListContainer overrides
void resetRepositories();
void addRepository(QJsonObject data);
void setLocalModList(QJsonObject data);
void setModSettings(QJsonObject data);

View File

@ -1,13 +1,13 @@
#include "StdInc.h"
#include "cmodlistview.h"
#include "ui_cmodlistview.h"
#include "cmodlistview_moc.h"
#include "ui_cmodlistview_moc.h"
#include <QJsonArray>
#include <QCryptographicHash>
#include "cmodlistmodel.h"
#include "cmodlistmodel_moc.h"
#include "cmodmanager.h"
#include "cdownloadmanager.h"
#include "cdownloadmanager_moc.h"
#include "launcherdirs.h"
#include "../lib/CConfigHandler.h"
@ -42,12 +42,16 @@ void CModListView::setupModsView()
connect( filterModel, SIGNAL( modelReset()),
this, SLOT( modelReset()));
selectMod(filterModel->rowCount() > 0 ? 0 : -1);
}
CModListView::CModListView(QWidget *parent) :
QWidget(parent),
settingsListener(settings.listen["launcher"]["repositoryURL"]),
ui(new Ui::CModListView)
{
settingsListener([&](const JsonNode &){ repositoriesChanged = true; });
ui->setupUi(this);
setupModModel();
@ -56,10 +60,12 @@ CModListView::CModListView(QWidget *parent) :
ui->progressWidget->setVisible(false);
dlManager = nullptr;
loadRepositories();
}
// hide mod description on start. looks better this way
hideModInfo();
void CModListView::loadRepositories()
{
manager->resetRepositories();
for (auto entry : settings["launcher"]["repositoryURL"].Vector())
{
QString str = QString::fromUtf8(entry.String().c_str());
@ -77,6 +83,16 @@ CModListView::~CModListView()
delete ui;
}
void CModListView::showEvent(QShowEvent * event)
{
QWidget::showEvent(event);
if (repositoriesChanged)
{
repositoriesChanged = false;
loadRepositories();
}
}
void CModListView::showModInfo()
{
ui->modInfoWidget->show();
@ -174,6 +190,7 @@ QString CModListView::genModInfoText(CModEntry &mod)
void CModListView::enableModInfo()
{
showModInfo();
ui->hideModInfoButton->setEnabled(true);
}
@ -514,5 +531,6 @@ void CModListView::on_pushButton_clicked()
void CModListView::modelReset()
{
selectMod(filterModel->mapToSource(ui->allModsView->currentIndex()).row());
}
//selectMod(filterModel->mapToSource(ui->allModsView->currentIndex()).row());
selectMod(filterModel->rowCount() > 0 ? 0 : -1);
}

View File

@ -1,5 +1,8 @@
#pragma once
#include "Global.h"
#include "../../lib/CConfigHandler.h"
namespace Ui {
class CModListView;
}
@ -21,11 +24,17 @@ class CModListView : public QWidget
CModFilterModel * filterModel;
CDownloadManager * dlManager;
SettingsListener settingsListener;
bool repositoriesChanged;
void showEvent(QShowEvent * event);
void keyPressEvent(QKeyEvent * event);
void setupModModel();
void setupFilterModel();
void setupModsView();
void loadRepositories();
// find mods unknown to mod list (not present in repo and not installed)
QStringList findInvalidDependencies(QString mod);

View File

@ -61,6 +61,11 @@ void CModManager::loadModSettings()
modList->setModSettings(modSettings["activeMods"].toObject());
}
void CModManager::resetRepositories()
{
modList->resetRepositories();
}
void CModManager::loadRepository(QString file)
{
modList->addRepository(JsonFromFile(file));
@ -182,7 +187,7 @@ bool CModManager::canDisableMod(QString modname)
auto current = modList->getMod(modEntry);
if (current.getValue("depends").toStringList().contains(modname) &&
!current.isDisabled())
current.isEnabled())
return false; // this mod must be disabled first
}
return true;

View File

@ -19,6 +19,7 @@ class CModManager
public:
CModManager(CModList * modList);
void resetRepositories();
void loadRepository(QString filename);
void loadModSettings();
void loadMods();

View File

@ -1,6 +1,6 @@
#include "StdInc.h"
#include "csettingsview.h"
#include "ui_csettingsview.h"
#include "csettingsview_moc.h"
#include "ui_csettingsview_moc.h"
#include "../lib/CConfigHandler.h"
#include "../lib/VCMIDirs.h"

View File

@ -60,6 +60,11 @@ std::string VCMIDirs::libraryPath() const
return userDataPath();
}
std::string VCMIDirs::clientPath() const
{
return userDataPath() + "\\" + "VCMI_client.exe";
}
std::string VCMIDirs::serverPath() const
{
return userDataPath() + "\\" + "VCMI_server.exe";
@ -96,9 +101,14 @@ std::string VCMIDirs::libraryPath() const
return ".";
}
std::string VCMIDirs::clientPath() const
{
return userDataPath() + "\\" + "VCMI_client.exe";
}
std::string VCMIDirs::serverPath() const
{
return "./vcmiserver";
return userDataPath() + "\\" + "VCMI_server.exe";
}
std::vector<std::string> VCMIDirs::dataPaths() const
@ -125,6 +135,11 @@ std::string VCMIDirs::libraryPath() const
return M_LIB_DIR;
}
std::string VCMIDirs::clientPath() const
{
return std::string(M_BIN_DIR) + "/" + "vcmiclient";
}
std::string VCMIDirs::serverPath() const
{
return std::string(M_BIN_DIR) + "/" + "vcmiserver";

View File

@ -39,7 +39,10 @@ public:
/// Paths to global system-wide data directories. First items have higher priority
std::vector<std::string> dataPaths() const;
/// Full path to vcmiserver executable, including server name (e.g. /usr/bin/vcmiserver)
/// Full path to client executable, including server name (e.g. /usr/bin/vcmiclient)
std::string clientPath() const;
/// Full path to server executable, including server name (e.g. /usr/bin/vcmiserver)
std::string serverPath() const;
/// Path where vcmi libraries can be found (in AI and Scripting subdirectories)