mirror of
https://github.com/vcmi/vcmi.git
synced 2025-10-08 23:22:25 +02:00
Support for new fields in mod format including:
- screenshots, repository-only field, will be used by launcher to d/l screeenshots - screenshots will be viewed as thumbnails with switch to full view on click - changelog that is now visible in launcher - somewhat better handling of submods by launcher
This commit is contained in:
@@ -12,6 +12,8 @@ SPELLS:
|
|||||||
* New configuration format: http://wiki.vcmi.eu/index.php?title=Spell_Format
|
* New configuration format: http://wiki.vcmi.eu/index.php?title=Spell_Format
|
||||||
|
|
||||||
MODS:
|
MODS:
|
||||||
|
* Support for submods - mod may have their own "submods" located in <modname>/Mods directory
|
||||||
|
* Mods may provide their own changelogs and screenshots that will be visible in Launcher
|
||||||
* Mods cas now add new (offensive, buffs, debuffs) spells and change existing
|
* Mods cas now add new (offensive, buffs, debuffs) spells and change existing
|
||||||
|
|
||||||
0.94 -> 0.95 (Mar 01 2014)
|
0.94 -> 0.95 (Mar 01 2014)
|
||||||
|
@@ -31,6 +31,16 @@
|
|||||||
"description": "Author of the mod. Can be nickname, real name or name of team"
|
"description": "Author of the mod. Can be nickname, real name or name of team"
|
||||||
},
|
},
|
||||||
|
|
||||||
|
"licenseName" : {
|
||||||
|
"type":"string",
|
||||||
|
"description": "Name of the license, recommended is Creative Commons Attribution-ShareAlike"
|
||||||
|
},
|
||||||
|
|
||||||
|
"licenseURL" : {
|
||||||
|
"type":"string",
|
||||||
|
"description": "Url to license text, e.g. http://creativecommons.org/licenses/by-sa/4.0/deed"
|
||||||
|
},
|
||||||
|
|
||||||
"contact" : {
|
"contact" : {
|
||||||
"type":"string",
|
"type":"string",
|
||||||
"description": "Home page of mod or link to forum thread"
|
"description": "Home page of mod or link to forum thread"
|
||||||
@@ -47,6 +57,11 @@
|
|||||||
"items": { "type":"string" }
|
"items": { "type":"string" }
|
||||||
},
|
},
|
||||||
|
|
||||||
|
"keepDisabled" : {
|
||||||
|
"type":"boolean",
|
||||||
|
"description": "If set to true, mod will not be enabled automatically on install"
|
||||||
|
},
|
||||||
|
|
||||||
"artifacts": {
|
"artifacts": {
|
||||||
"type":"array",
|
"type":"array",
|
||||||
"description": "List of configuration files for artifacts",
|
"description": "List of configuration files for artifacts",
|
||||||
@@ -72,12 +87,21 @@
|
|||||||
"description": "List of configuration files for heroes",
|
"description": "List of configuration files for heroes",
|
||||||
"items": { "type":"string", "format" : "textFile" }
|
"items": { "type":"string", "format" : "textFile" }
|
||||||
},
|
},
|
||||||
"spells": {
|
"spells": {
|
||||||
"type":"array",
|
"type":"array",
|
||||||
"description": "List of configuration files for spells",
|
"description": "List of configuration files for spells",
|
||||||
"items": { "type":"string", "format" : "textFile" }
|
"items": { "type":"string", "format" : "textFile" }
|
||||||
},
|
},
|
||||||
|
|
||||||
|
"changelog" : {
|
||||||
|
"type":"object",
|
||||||
|
"description": "List of changes/new features in each version",
|
||||||
|
"additionalProperties" : {
|
||||||
|
"type" : "array",
|
||||||
|
"items" : { "type":"string" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
"filesystem": {
|
"filesystem": {
|
||||||
"type":"object",
|
"type":"object",
|
||||||
"description": "Optional, description on how files are organized in your mod. In most cases you do not need to use this field",
|
"description": "Optional, description on how files are organized in your mod. In most cases you do not need to use this field",
|
||||||
|
@@ -10,6 +10,7 @@ set(launcher_modmanager_SRCS
|
|||||||
modManager/cmodlistmodel_moc.cpp
|
modManager/cmodlistmodel_moc.cpp
|
||||||
modManager/cmodlistview_moc.cpp
|
modManager/cmodlistview_moc.cpp
|
||||||
modManager/cmodmanager.cpp
|
modManager/cmodmanager.cpp
|
||||||
|
modManager/imageviewer.cpp
|
||||||
)
|
)
|
||||||
|
|
||||||
set(launcher_settingsview_SRCS
|
set(launcher_settingsview_SRCS
|
||||||
@@ -28,6 +29,7 @@ set(launcher_SRCS
|
|||||||
|
|
||||||
set(launcher_FORMS
|
set(launcher_FORMS
|
||||||
modManager/cmodlistview_moc.ui
|
modManager/cmodlistview_moc.ui
|
||||||
|
modManager/imageviewer.ui
|
||||||
settingsView/csettingsview_moc.ui
|
settingsView/csettingsview_moc.ui
|
||||||
mainwindow_moc.ui
|
mainwindow_moc.ui
|
||||||
)
|
)
|
||||||
|
@@ -97,7 +97,7 @@
|
|||||||
<bool>false</bool>
|
<bool>false</bool>
|
||||||
</property>
|
</property>
|
||||||
<property name="currentRow">
|
<property name="currentRow">
|
||||||
<number>-1</number>
|
<number>0</number>
|
||||||
</property>
|
</property>
|
||||||
<item>
|
<item>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
|
@@ -113,3 +113,13 @@ void CDownloadManager::downloadProgressChanged(qint64 bytesReceived, qint64 byte
|
|||||||
|
|
||||||
emit downloadProgress(received, total);
|
emit downloadProgress(received, total);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool CDownloadManager::downloadInProgress(const QUrl &url)
|
||||||
|
{
|
||||||
|
for (auto & entry : currentDownloads)
|
||||||
|
{
|
||||||
|
if (entry.reply->url() == url)
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
@@ -271,3 +271,16 @@ QVector<QString> CModList::getModList() const
|
|||||||
}
|
}
|
||||||
return modList;
|
return modList;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QVector<QString> CModList::getChildren(QString parent) const
|
||||||
|
{
|
||||||
|
QVector<QString> children;
|
||||||
|
|
||||||
|
int depth = parent.count('.') + 1;
|
||||||
|
for (const QString & mod : getModList())
|
||||||
|
{
|
||||||
|
if (mod.count('.') == depth && mod.startsWith(parent))
|
||||||
|
children.push_back(mod);
|
||||||
|
}
|
||||||
|
return children;
|
||||||
|
}
|
||||||
|
@@ -79,4 +79,6 @@ public:
|
|||||||
|
|
||||||
// returns list of all available mods
|
// returns list of all available mods
|
||||||
QVector<QString> getModList() const;
|
QVector<QString> getModList() const;
|
||||||
|
|
||||||
|
QVector<QString> getChildren(QString parent) const;
|
||||||
};
|
};
|
||||||
|
@@ -1,6 +1,7 @@
|
|||||||
#include "StdInc.h"
|
#include "StdInc.h"
|
||||||
#include "cmodlistview_moc.h"
|
#include "cmodlistview_moc.h"
|
||||||
#include "ui_cmodlistview_moc.h"
|
#include "ui_cmodlistview_moc.h"
|
||||||
|
#include "imageviewer.h"
|
||||||
|
|
||||||
#include <QJsonArray>
|
#include <QJsonArray>
|
||||||
#include <QCryptographicHash>
|
#include <QCryptographicHash>
|
||||||
@@ -68,7 +69,7 @@ CModListView::CModListView(QWidget *parent) :
|
|||||||
|
|
||||||
ui->progressWidget->setVisible(false);
|
ui->progressWidget->setVisible(false);
|
||||||
dlManager = nullptr;
|
dlManager = nullptr;
|
||||||
//loadRepositories();
|
loadRepositories();
|
||||||
hideModInfo();
|
hideModInfo();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -106,6 +107,7 @@ void CModListView::showModInfo()
|
|||||||
{
|
{
|
||||||
ui->modInfoWidget->show();
|
ui->modInfoWidget->show();
|
||||||
ui->hideModInfoButton->setArrowType(Qt::RightArrow);
|
ui->hideModInfoButton->setArrowType(Qt::RightArrow);
|
||||||
|
loadScreenshots();
|
||||||
}
|
}
|
||||||
|
|
||||||
void CModListView::hideModInfo()
|
void CModListView::hideModInfo()
|
||||||
@@ -135,25 +137,60 @@ static QString replaceIfNotEmpty(QStringList value, QString pattern)
|
|||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QString CModListView::genChangelogText(CModEntry &mod)
|
||||||
|
{
|
||||||
|
QString headerTemplate = "<p><span style=\" font-weight:600;\">%1: </span></p>";
|
||||||
|
QString entryBegin = "<p align=\"justify\"><ul>";
|
||||||
|
QString entryEnd = "</ul></p>";
|
||||||
|
QString entryLine = "<li>%1</li>";
|
||||||
|
//QString versionSeparator = "<hr/>";
|
||||||
|
|
||||||
|
QString result;
|
||||||
|
|
||||||
|
QVariantMap changelog = mod.getValue("changelog").toMap();
|
||||||
|
QList<QString> versions = changelog.keys();
|
||||||
|
|
||||||
|
std::sort(versions.begin(), versions.end(), [](QString lesser, QString greater)
|
||||||
|
{
|
||||||
|
return !CModEntry::compareVersions(lesser, greater);
|
||||||
|
});
|
||||||
|
|
||||||
|
for (auto & version : versions)
|
||||||
|
{
|
||||||
|
result += headerTemplate.arg(version);
|
||||||
|
result += entryBegin;
|
||||||
|
for (auto & line : changelog.value(version).toStringList())
|
||||||
|
result += entryLine.arg(line);
|
||||||
|
result += entryEnd;
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
QString CModListView::genModInfoText(CModEntry &mod)
|
QString CModListView::genModInfoText(CModEntry &mod)
|
||||||
{
|
{
|
||||||
QString prefix = "<p><span style=\" font-weight:600;\">%1: </span>"; // shared prefix
|
QString prefix = "<p><span style=\" font-weight:600;\">%1: </span>"; // shared prefix
|
||||||
QString lineTemplate = prefix + "%2</p>";
|
QString lineTemplate = prefix + "%2</p>";
|
||||||
QString urlTemplate = prefix + "<a href=\"%2\"><span style=\" text-decoration: underline; color:#0000ff;\">%2</span></a></p>";
|
QString urlTemplate = prefix + "<a href=\"%2\">%3</a></p>";
|
||||||
QString textTemplate = prefix + "</p><p align=\"justify\">%2</p>";
|
QString textTemplate = prefix + "</p><p align=\"justify\">%2</p>";
|
||||||
QString listTemplate = "<p align=\"justify\">%1: %2</p>";
|
QString listTemplate = "<p align=\"justify\">%1: %2</p>";
|
||||||
QString noteTemplate = "<p align=\"justify\">%1</p>";
|
QString noteTemplate = "<p align=\"justify\">%1</p>";
|
||||||
|
|
||||||
QString result;
|
QString result;
|
||||||
|
|
||||||
result += "<html><body>";
|
|
||||||
result += replaceIfNotEmpty(mod.getValue("name"), lineTemplate.arg(tr("Mod name")));
|
result += replaceIfNotEmpty(mod.getValue("name"), lineTemplate.arg(tr("Mod name")));
|
||||||
result += replaceIfNotEmpty(mod.getValue("installedVersion"), lineTemplate.arg(tr("Installed version")));
|
result += replaceIfNotEmpty(mod.getValue("installedVersion"), lineTemplate.arg(tr("Installed version")));
|
||||||
result += replaceIfNotEmpty(mod.getValue("latestVersion"), lineTemplate.arg(tr("Latest version")));
|
result += replaceIfNotEmpty(mod.getValue("latestVersion"), lineTemplate.arg(tr("Latest version")));
|
||||||
if (mod.getValue("size").toDouble() != 0)
|
|
||||||
|
if (mod.getValue("size").isValid())
|
||||||
result += replaceIfNotEmpty(CModEntry::sizeToString(mod.getValue("size").toDouble()), lineTemplate.arg(tr("Download size")));
|
result += replaceIfNotEmpty(CModEntry::sizeToString(mod.getValue("size").toDouble()), lineTemplate.arg(tr("Download size")));
|
||||||
result += replaceIfNotEmpty(mod.getValue("author"), lineTemplate.arg(tr("Authors")));
|
result += replaceIfNotEmpty(mod.getValue("author"), lineTemplate.arg(tr("Authors")));
|
||||||
result += replaceIfNotEmpty(mod.getValue("contact"), urlTemplate.arg(tr("Home")));
|
|
||||||
|
if (mod.getValue("licenseURL").isValid())
|
||||||
|
result += urlTemplate.arg(tr("License")).arg(mod.getValue("licenseURL").toString()).arg(mod.getValue("licenseName").toString());
|
||||||
|
|
||||||
|
if (mod.getValue("contact").isValid())
|
||||||
|
result += urlTemplate.arg(tr("Home")).arg(mod.getValue("contact").toString()).arg(mod.getValue("contact").toString());
|
||||||
|
|
||||||
result += replaceIfNotEmpty(mod.getValue("depends"), lineTemplate.arg(tr("Required mods")));
|
result += replaceIfNotEmpty(mod.getValue("depends"), lineTemplate.arg(tr("Required mods")));
|
||||||
result += replaceIfNotEmpty(mod.getValue("conflicts"), lineTemplate.arg(tr("Conflicting mods")));
|
result += replaceIfNotEmpty(mod.getValue("conflicts"), lineTemplate.arg(tr("Conflicting mods")));
|
||||||
result += replaceIfNotEmpty(mod.getValue("description"), textTemplate.arg(tr("Description")));
|
result += replaceIfNotEmpty(mod.getValue("description"), textTemplate.arg(tr("Description")));
|
||||||
@@ -181,7 +218,6 @@ QString CModListView::genModInfoText(CModEntry &mod)
|
|||||||
if (notes.size())
|
if (notes.size())
|
||||||
result += textTemplate.arg(tr("Notes")).arg(notes);
|
result += textTemplate.arg(tr("Notes")).arg(notes);
|
||||||
|
|
||||||
result += "</body></html>";
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -212,7 +248,8 @@ void CModListView::selectMod(const QModelIndex & index)
|
|||||||
{
|
{
|
||||||
auto mod = modModel->getMod(index.data(ModRoles::ModNameRole).toString());
|
auto mod = modModel->getMod(index.data(ModRoles::ModNameRole).toString());
|
||||||
|
|
||||||
ui->textBrowser->setHtml(genModInfoText(mod));
|
ui->modInfoBrowser->setHtml(genModInfoText(mod));
|
||||||
|
ui->changelogBrowser->setHtml(genChangelogText(mod));
|
||||||
|
|
||||||
bool hasInvalidDeps = !findInvalidDependencies(index.data(ModRoles::ModNameRole).toString()).empty();
|
bool hasInvalidDeps = !findInvalidDependencies(index.data(ModRoles::ModNameRole).toString()).empty();
|
||||||
bool hasBlockingMods = !findBlockingMods(index.data(ModRoles::ModNameRole).toString()).empty();
|
bool hasBlockingMods = !findBlockingMods(index.data(ModRoles::ModNameRole).toString()).empty();
|
||||||
@@ -232,6 +269,8 @@ void CModListView::selectMod(const QModelIndex & index)
|
|||||||
ui->installButton->setEnabled(!hasInvalidDeps);
|
ui->installButton->setEnabled(!hasInvalidDeps);
|
||||||
ui->uninstallButton->setEnabled(!hasDependentMods);
|
ui->uninstallButton->setEnabled(!hasDependentMods);
|
||||||
ui->updateButton->setEnabled(!hasInvalidDeps && !hasDependentMods);
|
ui->updateButton->setEnabled(!hasInvalidDeps && !hasDependentMods);
|
||||||
|
|
||||||
|
loadScreenshots();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -239,7 +278,7 @@ void CModListView::keyPressEvent(QKeyEvent * event)
|
|||||||
{
|
{
|
||||||
if (event->key() == Qt::Key_Escape && ui->modInfoWidget->isVisible() )
|
if (event->key() == Qt::Key_Escape && ui->modInfoWidget->isVisible() )
|
||||||
{
|
{
|
||||||
ui->modInfoWidget->hide();
|
hideModInfo();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -480,17 +519,23 @@ void CModListView::hideProgressBar()
|
|||||||
void CModListView::installFiles(QStringList files)
|
void CModListView::installFiles(QStringList files)
|
||||||
{
|
{
|
||||||
QStringList mods;
|
QStringList mods;
|
||||||
|
QStringList images;
|
||||||
|
|
||||||
// TODO: some better way to separate zip's with mods and downloaded repository files
|
// TODO: some better way to separate zip's with mods and downloaded repository files
|
||||||
for (QString filename : files)
|
for (QString filename : files)
|
||||||
{
|
{
|
||||||
if (filename.contains(".zip"))
|
if (filename.endsWith(".zip"))
|
||||||
mods.push_back(filename);
|
mods.push_back(filename);
|
||||||
if (filename.contains(".json"))
|
if (filename.endsWith(".json"))
|
||||||
manager->loadRepository(filename);
|
manager->loadRepository(filename);
|
||||||
|
if (filename.endsWith(".png"))
|
||||||
|
images.push_back(filename);
|
||||||
}
|
}
|
||||||
if (!mods.empty())
|
if (!mods.empty())
|
||||||
installMods(mods);
|
installMods(mods);
|
||||||
|
|
||||||
|
if (!images.empty())
|
||||||
|
loadScreenshots();
|
||||||
}
|
}
|
||||||
|
|
||||||
void CModListView::installMods(QStringList archives)
|
void CModListView::installMods(QStringList archives)
|
||||||
@@ -536,8 +581,23 @@ void CModListView::installMods(QStringList archives)
|
|||||||
for (int i=0; i<modNames.size(); i++)
|
for (int i=0; i<modNames.size(); i++)
|
||||||
manager->installMod(modNames[i], archives[i]);
|
manager->installMod(modNames[i], archives[i]);
|
||||||
|
|
||||||
|
std::function<void(QString)> enableMod = [&](QString modName)
|
||||||
|
{
|
||||||
|
auto mod = modModel->getMod(modName);
|
||||||
|
if (mod.isInstalled() && !mod.getValue("keepDisabled").toBool())
|
||||||
|
{
|
||||||
|
if (manager->enableMod(modName))
|
||||||
|
{
|
||||||
|
for (QString child : modModel->getChildren(modName))
|
||||||
|
enableMod(child);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
for (QString mod : modsToEnable)
|
for (QString mod : modsToEnable)
|
||||||
manager->enableMod(mod);
|
{
|
||||||
|
enableMod(mod);
|
||||||
|
}
|
||||||
|
|
||||||
for (QString archive : archives)
|
for (QString archive : archives)
|
||||||
QFile::remove(archive);
|
QFile::remove(archive);
|
||||||
@@ -568,3 +628,50 @@ void CModListView::checkManagerErrors()
|
|||||||
QMessageBox::warning(this, title, description, QMessageBox::Ok, QMessageBox::Ok );
|
QMessageBox::warning(this, title, description, QMessageBox::Ok, QMessageBox::Ok );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CModListView::on_tabWidget_currentChanged(int index)
|
||||||
|
{
|
||||||
|
loadScreenshots();
|
||||||
|
}
|
||||||
|
|
||||||
|
void CModListView::loadScreenshots()
|
||||||
|
{
|
||||||
|
if (ui->tabWidget->currentIndex() == 2 && ui->modInfoWidget->isVisible())
|
||||||
|
{
|
||||||
|
ui->screenshotsList->clear();
|
||||||
|
QString modName = ui->allModsView->currentIndex().data(ModRoles::ModNameRole).toString();
|
||||||
|
assert(modModel->hasMod(modName)); //should be filtered out by check above
|
||||||
|
|
||||||
|
for (QString & url : modModel->getMod(modName).getValue("screenshots").toStringList())
|
||||||
|
{
|
||||||
|
// URL must be encoded to something else to get rid of symbols illegal in file names
|
||||||
|
auto hashed = QCryptographicHash::hash(url.toUtf8(), QCryptographicHash::Md5);
|
||||||
|
auto hashedStr = QString::fromUtf8(hashed.toHex());
|
||||||
|
|
||||||
|
QString fullPath = CLauncherDirs::get().downloadsPath() + '/' + hashedStr + ".png";
|
||||||
|
QPixmap pixmap(fullPath);
|
||||||
|
if (pixmap.isNull())
|
||||||
|
{
|
||||||
|
// image file not exists or corrupted - try to redownload
|
||||||
|
downloadFile(hashedStr + ".png", url, "screenshots");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// managed to load cached image
|
||||||
|
QIcon icon(pixmap);
|
||||||
|
QListWidgetItem * item = new QListWidgetItem(icon, QString(tr("Screenshot %1")).arg(ui->screenshotsList->count() + 1));
|
||||||
|
ui->screenshotsList->addItem(item);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void CModListView::on_screenshotsList_clicked(const QModelIndex &index)
|
||||||
|
{
|
||||||
|
if (index.isValid())
|
||||||
|
{
|
||||||
|
QIcon icon = ui->screenshotsList->item(index.row())->icon();
|
||||||
|
auto pixmap = icon.pixmap(icon.availableSizes()[0]);
|
||||||
|
ImageViewer::showPixmap(pixmap, this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@@ -50,6 +50,7 @@ class CModListView : public QWidget
|
|||||||
void installMods(QStringList archives);
|
void installMods(QStringList archives);
|
||||||
void installFiles(QStringList mods);
|
void installFiles(QStringList mods);
|
||||||
|
|
||||||
|
QString genChangelogText(CModEntry & mod);
|
||||||
QString genModInfoText(CModEntry & mod);
|
QString genModInfoText(CModEntry & mod);
|
||||||
public:
|
public:
|
||||||
explicit CModListView(QWidget *parent = 0);
|
explicit CModListView(QWidget *parent = 0);
|
||||||
@@ -57,6 +58,7 @@ public:
|
|||||||
|
|
||||||
void showModInfo();
|
void showModInfo();
|
||||||
void hideModInfo();
|
void hideModInfo();
|
||||||
|
void loadScreenshots();
|
||||||
|
|
||||||
void enableModInfo();
|
void enableModInfo();
|
||||||
void disableModInfo();
|
void disableModInfo();
|
||||||
@@ -91,6 +93,10 @@ private slots:
|
|||||||
|
|
||||||
void on_allModsView_activated(const QModelIndex &index);
|
void on_allModsView_activated(const QModelIndex &index);
|
||||||
|
|
||||||
|
void on_tabWidget_currentChanged(int index);
|
||||||
|
|
||||||
|
void on_screenshotsList_clicked(const QModelIndex &index);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Ui::CModListView *ui;
|
Ui::CModListView *ui;
|
||||||
};
|
};
|
||||||
|
@@ -202,50 +202,8 @@
|
|||||||
<property name="bottomMargin">
|
<property name="bottomMargin">
|
||||||
<number>0</number>
|
<number>0</number>
|
||||||
</property>
|
</property>
|
||||||
<item row="0" column="0" colspan="6">
|
<item row="1" column="4">
|
||||||
<widget class="QTextBrowser" name="textBrowser">
|
<widget class="QPushButton" name="uninstallButton">
|
||||||
<property name="sizePolicy">
|
|
||||||
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
|
|
||||||
<horstretch>0</horstretch>
|
|
||||||
<verstretch>0</verstretch>
|
|
||||||
</sizepolicy>
|
|
||||||
</property>
|
|
||||||
<property name="readOnly">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
<property name="html">
|
|
||||||
<string><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
|
|
||||||
<html><head><meta name="qrichtext" content="1" /><style type="text/css">
|
|
||||||
p, li { white-space: pre-wrap; }
|
|
||||||
</style></head><body style=" font-family:'Ubuntu'; font-size:10pt; font-weight:400; font-style:normal;">
|
|
||||||
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:11pt;"><br /></p></body></html></string>
|
|
||||||
</property>
|
|
||||||
<property name="openExternalLinks">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
<property name="openLinks">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="1" column="0">
|
|
||||||
<spacer name="modButtonSpacer">
|
|
||||||
<property name="orientation">
|
|
||||||
<enum>Qt::Horizontal</enum>
|
|
||||||
</property>
|
|
||||||
<property name="sizeType">
|
|
||||||
<enum>QSizePolicy::MinimumExpanding</enum>
|
|
||||||
</property>
|
|
||||||
<property name="sizeHint" stdset="0">
|
|
||||||
<size>
|
|
||||||
<width>0</width>
|
|
||||||
<height>20</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
</spacer>
|
|
||||||
</item>
|
|
||||||
<item row="1" column="1">
|
|
||||||
<widget class="QPushButton" name="enableButton">
|
|
||||||
<property name="sizePolicy">
|
<property name="sizePolicy">
|
||||||
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
|
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
|
||||||
<horstretch>0</horstretch>
|
<horstretch>0</horstretch>
|
||||||
@@ -265,7 +223,7 @@ p, li { white-space: pre-wrap; }
|
|||||||
</size>
|
</size>
|
||||||
</property>
|
</property>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Enable</string>
|
<string>Uninstall</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
@@ -319,30 +277,21 @@ p, li { white-space: pre-wrap; }
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="1" column="4">
|
<item row="1" column="0">
|
||||||
<widget class="QPushButton" name="uninstallButton">
|
<spacer name="modButtonSpacer">
|
||||||
<property name="sizePolicy">
|
<property name="orientation">
|
||||||
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
|
<enum>Qt::Horizontal</enum>
|
||||||
<horstretch>0</horstretch>
|
|
||||||
<verstretch>0</verstretch>
|
|
||||||
</sizepolicy>
|
|
||||||
</property>
|
</property>
|
||||||
<property name="minimumSize">
|
<property name="sizeType">
|
||||||
|
<enum>QSizePolicy::MinimumExpanding</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" stdset="0">
|
||||||
<size>
|
<size>
|
||||||
<width>51</width>
|
<width>0</width>
|
||||||
<height>0</height>
|
<height>20</height>
|
||||||
</size>
|
</size>
|
||||||
</property>
|
</property>
|
||||||
<property name="maximumSize">
|
</spacer>
|
||||||
<size>
|
|
||||||
<width>100</width>
|
|
||||||
<height>16777215</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Uninstall</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
</item>
|
||||||
<item row="1" column="5">
|
<item row="1" column="5">
|
||||||
<widget class="QPushButton" name="installButton">
|
<widget class="QPushButton" name="installButton">
|
||||||
@@ -369,6 +318,149 @@ p, li { white-space: pre-wrap; }
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
<item row="1" column="1">
|
||||||
|
<widget class="QPushButton" name="enableButton">
|
||||||
|
<property name="sizePolicy">
|
||||||
|
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
|
||||||
|
<horstretch>0</horstretch>
|
||||||
|
<verstretch>0</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
|
<property name="minimumSize">
|
||||||
|
<size>
|
||||||
|
<width>51</width>
|
||||||
|
<height>0</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<property name="maximumSize">
|
||||||
|
<size>
|
||||||
|
<width>100</width>
|
||||||
|
<height>16777215</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Enable</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="0" column="0" colspan="6">
|
||||||
|
<widget class="QTabWidget" name="tabWidget">
|
||||||
|
<property name="currentIndex">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<widget class="QWidget" name="tabInfo">
|
||||||
|
<attribute name="title">
|
||||||
|
<string>Description</string>
|
||||||
|
</attribute>
|
||||||
|
<layout class="QGridLayout" name="gridLayout_4">
|
||||||
|
<property name="leftMargin">
|
||||||
|
<number>4</number>
|
||||||
|
</property>
|
||||||
|
<property name="topMargin">
|
||||||
|
<number>4</number>
|
||||||
|
</property>
|
||||||
|
<property name="rightMargin">
|
||||||
|
<number>4</number>
|
||||||
|
</property>
|
||||||
|
<property name="bottomMargin">
|
||||||
|
<number>4</number>
|
||||||
|
</property>
|
||||||
|
<item row="0" column="0">
|
||||||
|
<widget class="QTextBrowser" name="modInfoBrowser">
|
||||||
|
<property name="sizePolicy">
|
||||||
|
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
|
||||||
|
<horstretch>0</horstretch>
|
||||||
|
<verstretch>0</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
|
<property name="readOnly">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<property name="html">
|
||||||
|
<string><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
|
||||||
|
<html><head><meta name="qrichtext" content="1" /><style type="text/css">
|
||||||
|
p, li { white-space: pre-wrap; }
|
||||||
|
</style></head><body style=" font-family:'Ubuntu'; font-size:10pt; font-weight:400; font-style:normal;">
|
||||||
|
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:11pt;"><br /></p></body></html></string>
|
||||||
|
</property>
|
||||||
|
<property name="openExternalLinks">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<property name="openLinks">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
<widget class="QWidget" name="tabChangelog">
|
||||||
|
<attribute name="title">
|
||||||
|
<string>Changelog</string>
|
||||||
|
</attribute>
|
||||||
|
<layout class="QGridLayout" name="gridLayout_5">
|
||||||
|
<property name="leftMargin">
|
||||||
|
<number>4</number>
|
||||||
|
</property>
|
||||||
|
<property name="topMargin">
|
||||||
|
<number>4</number>
|
||||||
|
</property>
|
||||||
|
<property name="rightMargin">
|
||||||
|
<number>4</number>
|
||||||
|
</property>
|
||||||
|
<property name="bottomMargin">
|
||||||
|
<number>4</number>
|
||||||
|
</property>
|
||||||
|
<item row="0" column="0">
|
||||||
|
<widget class="QTextBrowser" name="changelogBrowser"/>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
<widget class="QWidget" name="tabScreenshots">
|
||||||
|
<attribute name="title">
|
||||||
|
<string>Screenshots</string>
|
||||||
|
</attribute>
|
||||||
|
<layout class="QGridLayout" name="gridLayout_6">
|
||||||
|
<property name="leftMargin">
|
||||||
|
<number>4</number>
|
||||||
|
</property>
|
||||||
|
<property name="topMargin">
|
||||||
|
<number>4</number>
|
||||||
|
</property>
|
||||||
|
<property name="rightMargin">
|
||||||
|
<number>4</number>
|
||||||
|
</property>
|
||||||
|
<property name="bottomMargin">
|
||||||
|
<number>4</number>
|
||||||
|
</property>
|
||||||
|
<item row="0" column="0">
|
||||||
|
<widget class="QListWidget" name="screenshotsList">
|
||||||
|
<property name="horizontalScrollBarPolicy">
|
||||||
|
<enum>Qt::ScrollBarAlwaysOff</enum>
|
||||||
|
</property>
|
||||||
|
<property name="selectionMode">
|
||||||
|
<enum>QAbstractItemView::NoSelection</enum>
|
||||||
|
</property>
|
||||||
|
<property name="selectionBehavior">
|
||||||
|
<enum>QAbstractItemView::SelectRows</enum>
|
||||||
|
</property>
|
||||||
|
<property name="iconSize">
|
||||||
|
<size>
|
||||||
|
<width>240</width>
|
||||||
|
<height>180</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<property name="viewMode">
|
||||||
|
<enum>QListView::IconMode</enum>
|
||||||
|
</property>
|
||||||
|
<property name="uniformItemSizes">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
@@ -390,6 +482,9 @@ p, li { white-space: pre-wrap; }
|
|||||||
</size>
|
</size>
|
||||||
</property>
|
</property>
|
||||||
<layout class="QHBoxLayout" name="horizontalLayout">
|
<layout class="QHBoxLayout" name="horizontalLayout">
|
||||||
|
<property name="leftMargin">
|
||||||
|
<number>9</number>
|
||||||
|
</property>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QProgressBar" name="progressBar">
|
<widget class="QProgressBar" name="progressBar">
|
||||||
<property name="sizePolicy">
|
<property name="sizePolicy">
|
||||||
@@ -437,7 +532,6 @@ p, li { white-space: pre-wrap; }
|
|||||||
<tabstop>lineEdit</tabstop>
|
<tabstop>lineEdit</tabstop>
|
||||||
<tabstop>comboBox</tabstop>
|
<tabstop>comboBox</tabstop>
|
||||||
<tabstop>allModsView</tabstop>
|
<tabstop>allModsView</tabstop>
|
||||||
<tabstop>textBrowser</tabstop>
|
|
||||||
<tabstop>hideModInfoButton</tabstop>
|
<tabstop>hideModInfoButton</tabstop>
|
||||||
<tabstop>enableButton</tabstop>
|
<tabstop>enableButton</tabstop>
|
||||||
<tabstop>disableButton</tabstop>
|
<tabstop>disableButton</tabstop>
|
||||||
|
55
launcher/modManager/imageviewer.cpp
Normal file
55
launcher/modManager/imageviewer.cpp
Normal file
@@ -0,0 +1,55 @@
|
|||||||
|
#include "StdInc.h"
|
||||||
|
|
||||||
|
#include <QDesktopWidget>
|
||||||
|
|
||||||
|
#include "imageviewer.h"
|
||||||
|
#include "ui_imageviewer.h"
|
||||||
|
|
||||||
|
ImageViewer::ImageViewer(QWidget *parent) :
|
||||||
|
QDialog(parent),
|
||||||
|
ui(new Ui::ImageViewer)
|
||||||
|
{
|
||||||
|
ui->setupUi(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
ImageViewer::~ImageViewer()
|
||||||
|
{
|
||||||
|
delete ui;
|
||||||
|
}
|
||||||
|
|
||||||
|
QSize ImageViewer::calculateWindowSize()
|
||||||
|
{
|
||||||
|
QDesktopWidget desktop;
|
||||||
|
return desktop.availableGeometry(desktop.primaryScreen()).size() * 0.8;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ImageViewer::showPixmap(QPixmap & pixmap, QWidget *parent)
|
||||||
|
{
|
||||||
|
assert(!pixmap.isNull());
|
||||||
|
|
||||||
|
ImageViewer * iw = new ImageViewer(parent);
|
||||||
|
|
||||||
|
QSize size = pixmap.size();
|
||||||
|
size.scale(iw->calculateWindowSize(), Qt::KeepAspectRatio);
|
||||||
|
iw->resize(size);
|
||||||
|
|
||||||
|
iw->setPixmap(pixmap);
|
||||||
|
iw->setAttribute(Qt::WA_DeleteOnClose, true);
|
||||||
|
iw->setModal(Qt::WindowModal);
|
||||||
|
iw->show();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ImageViewer::setPixmap(QPixmap & pixmap)
|
||||||
|
{
|
||||||
|
ui->label->setPixmap(pixmap);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ImageViewer::mousePressEvent(QMouseEvent * event)
|
||||||
|
{
|
||||||
|
close();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ImageViewer::keyPressEvent(QKeyEvent * event)
|
||||||
|
{
|
||||||
|
close(); // FIXME: it also closes on pressing modifiers (e.g. Ctrl/Alt). Not exactly expected
|
||||||
|
}
|
31
launcher/modManager/imageviewer.h
Normal file
31
launcher/modManager/imageviewer.h
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
#ifndef IMAGEVIEWER_H
|
||||||
|
#define IMAGEVIEWER_H
|
||||||
|
|
||||||
|
#include <QDialog>
|
||||||
|
|
||||||
|
namespace Ui {
|
||||||
|
class ImageViewer;
|
||||||
|
}
|
||||||
|
|
||||||
|
class ImageViewer : public QDialog
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit ImageViewer(QWidget *parent = 0);
|
||||||
|
~ImageViewer();
|
||||||
|
|
||||||
|
void setPixmap(QPixmap & pixmap);
|
||||||
|
|
||||||
|
static void showPixmap(QPixmap & pixmap, QWidget *parent = 0);
|
||||||
|
protected:
|
||||||
|
void mousePressEvent(QMouseEvent * event);
|
||||||
|
void keyPressEvent(QKeyEvent * event);
|
||||||
|
QSize calculateWindowSize();
|
||||||
|
|
||||||
|
|
||||||
|
private:
|
||||||
|
Ui::ImageViewer *ui;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // IMAGEVIEWER_H
|
58
launcher/modManager/imageviewer.ui
Normal file
58
launcher/modManager/imageviewer.ui
Normal file
@@ -0,0 +1,58 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<ui version="4.0">
|
||||||
|
<class>ImageViewer</class>
|
||||||
|
<widget class="QDialog" name="ImageViewer">
|
||||||
|
<property name="geometry">
|
||||||
|
<rect>
|
||||||
|
<x>0</x>
|
||||||
|
<y>0</y>
|
||||||
|
<width>640</width>
|
||||||
|
<height>480</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<property name="sizePolicy">
|
||||||
|
<sizepolicy hsizetype="Ignored" vsizetype="Ignored">
|
||||||
|
<horstretch>0</horstretch>
|
||||||
|
<verstretch>0</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
|
<property name="windowTitle">
|
||||||
|
<string>Image Viewer</string>
|
||||||
|
</property>
|
||||||
|
<layout class="QGridLayout" name="gridLayout">
|
||||||
|
<property name="sizeConstraint">
|
||||||
|
<enum>QLayout::SetNoConstraint</enum>
|
||||||
|
</property>
|
||||||
|
<property name="leftMargin">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="topMargin">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="rightMargin">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="bottomMargin">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<item row="0" column="0">
|
||||||
|
<widget class="QLabel" name="label">
|
||||||
|
<property name="sizePolicy">
|
||||||
|
<sizepolicy hsizetype="MinimumExpanding" vsizetype="MinimumExpanding">
|
||||||
|
<horstretch>0</horstretch>
|
||||||
|
<verstretch>0</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string/>
|
||||||
|
</property>
|
||||||
|
<property name="scaledContents">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
<resources/>
|
||||||
|
<connections/>
|
||||||
|
</ui>
|
Reference in New Issue
Block a user