Merge pull request #1776 from Trial97/resource_size
feat:added size column
This commit is contained in:
commit
12e04c412b
@ -206,8 +206,8 @@ int64_t calculateWorldSize(const QFileInfo& file)
|
|||||||
QDirIterator it(file.absoluteFilePath(), QDir::Files, QDirIterator::Subdirectories);
|
QDirIterator it(file.absoluteFilePath(), QDir::Files, QDirIterator::Subdirectories);
|
||||||
int64_t total = 0;
|
int64_t total = 0;
|
||||||
while (it.hasNext()) {
|
while (it.hasNext()) {
|
||||||
total += it.fileInfo().size();
|
|
||||||
it.next();
|
it.next();
|
||||||
|
total += it.fileInfo().size();
|
||||||
}
|
}
|
||||||
return total;
|
return total;
|
||||||
}
|
}
|
||||||
|
@ -65,29 +65,24 @@ std::pair<Version, Version> DataPack::compatibleVersions() const
|
|||||||
return s_pack_format_versions.constFind(m_pack_format).value();
|
return s_pack_format_versions.constFind(m_pack_format).value();
|
||||||
}
|
}
|
||||||
|
|
||||||
std::pair<int, bool> DataPack::compare(const Resource& other, SortType type) const
|
int DataPack::compare(const Resource& other, SortType type) const
|
||||||
{
|
{
|
||||||
auto const& cast_other = static_cast<DataPack const&>(other);
|
auto const& cast_other = static_cast<DataPack const&>(other);
|
||||||
|
|
||||||
switch (type) {
|
switch (type) {
|
||||||
default: {
|
default:
|
||||||
auto res = Resource::compare(other, type);
|
return Resource::compare(other, type);
|
||||||
if (res.first != 0)
|
|
||||||
return res;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case SortType::PACK_FORMAT: {
|
case SortType::PACK_FORMAT: {
|
||||||
auto this_ver = packFormat();
|
auto this_ver = packFormat();
|
||||||
auto other_ver = cast_other.packFormat();
|
auto other_ver = cast_other.packFormat();
|
||||||
|
|
||||||
if (this_ver > other_ver)
|
if (this_ver > other_ver)
|
||||||
return { 1, type == SortType::PACK_FORMAT };
|
return 1;
|
||||||
if (this_ver < other_ver)
|
if (this_ver < other_ver)
|
||||||
return { -1, type == SortType::PACK_FORMAT };
|
return -1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return { 0, false };
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool DataPack::applyFilter(QRegularExpression filter) const
|
bool DataPack::applyFilter(QRegularExpression filter) const
|
||||||
|
@ -56,7 +56,7 @@ class DataPack : public Resource {
|
|||||||
|
|
||||||
bool valid() const override;
|
bool valid() const override;
|
||||||
|
|
||||||
[[nodiscard]] auto compare(Resource const& other, SortType type) const -> std::pair<int, bool> override;
|
[[nodiscard]] int compare(Resource const& other, SortType type) const override;
|
||||||
[[nodiscard]] bool applyFilter(QRegularExpression filter) const override;
|
[[nodiscard]] bool applyFilter(QRegularExpression filter) const override;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
@ -45,6 +45,7 @@
|
|||||||
#include "MetadataHandler.h"
|
#include "MetadataHandler.h"
|
||||||
#include "Version.h"
|
#include "Version.h"
|
||||||
#include "minecraft/mod/ModDetails.h"
|
#include "minecraft/mod/ModDetails.h"
|
||||||
|
#include "minecraft/mod/Resource.h"
|
||||||
#include "minecraft/mod/tasks/LocalModParseTask.h"
|
#include "minecraft/mod/tasks/LocalModParseTask.h"
|
||||||
|
|
||||||
static ModPlatform::ProviderCapabilities ProviderCaps;
|
static ModPlatform::ProviderCapabilities ProviderCaps;
|
||||||
@ -77,7 +78,7 @@ void Mod::setDetails(const ModDetails& details)
|
|||||||
m_local_details = details;
|
m_local_details = details;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::pair<int, bool> Mod::compare(const Resource& other, SortType type) const
|
int Mod::compare(const Resource& other, SortType type) const
|
||||||
{
|
{
|
||||||
auto cast_other = dynamic_cast<Mod const*>(&other);
|
auto cast_other = dynamic_cast<Mod const*>(&other);
|
||||||
if (!cast_other)
|
if (!cast_other)
|
||||||
@ -87,30 +88,23 @@ std::pair<int, bool> Mod::compare(const Resource& other, SortType type) const
|
|||||||
default:
|
default:
|
||||||
case SortType::ENABLED:
|
case SortType::ENABLED:
|
||||||
case SortType::NAME:
|
case SortType::NAME:
|
||||||
case SortType::DATE: {
|
case SortType::DATE:
|
||||||
auto res = Resource::compare(other, type);
|
case SortType::SIZE:
|
||||||
if (res.first != 0)
|
return Resource::compare(other, type);
|
||||||
return res;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case SortType::VERSION: {
|
case SortType::VERSION: {
|
||||||
auto this_ver = Version(version());
|
auto this_ver = Version(version());
|
||||||
auto other_ver = Version(cast_other->version());
|
auto other_ver = Version(cast_other->version());
|
||||||
if (this_ver > other_ver)
|
if (this_ver > other_ver)
|
||||||
return { 1, type == SortType::VERSION };
|
return 1;
|
||||||
if (this_ver < other_ver)
|
if (this_ver < other_ver)
|
||||||
return { -1, type == SortType::VERSION };
|
return -1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case SortType::PROVIDER: {
|
case SortType::PROVIDER: {
|
||||||
auto compare_result =
|
return QString::compare(provider().value_or("Unknown"), cast_other->provider().value_or("Unknown"), Qt::CaseInsensitive);
|
||||||
QString::compare(provider().value_or("Unknown"), cast_other->provider().value_or("Unknown"), Qt::CaseInsensitive);
|
|
||||||
if (compare_result != 0)
|
|
||||||
return { compare_result, type == SortType::PROVIDER };
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return { 0, false };
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Mod::applyFilter(QRegularExpression filter) const
|
bool Mod::applyFilter(QRegularExpression filter) const
|
||||||
|
@ -88,7 +88,7 @@ class Mod : public Resource {
|
|||||||
|
|
||||||
bool valid() const override;
|
bool valid() const override;
|
||||||
|
|
||||||
[[nodiscard]] auto compare(Resource const& other, SortType type) const -> std::pair<int, bool> override;
|
[[nodiscard]] int compare(Resource const& other, SortType type) const override;
|
||||||
[[nodiscard]] bool applyFilter(QRegularExpression filter) const override;
|
[[nodiscard]] bool applyFilter(QRegularExpression filter) const override;
|
||||||
|
|
||||||
// Delete all the files of this mod
|
// Delete all the files of this mod
|
||||||
|
@ -52,6 +52,8 @@
|
|||||||
#include "Application.h"
|
#include "Application.h"
|
||||||
|
|
||||||
#include "Json.h"
|
#include "Json.h"
|
||||||
|
#include "StringUtils.h"
|
||||||
|
#include "minecraft/mod/Resource.h"
|
||||||
#include "minecraft/mod/tasks/LocalModParseTask.h"
|
#include "minecraft/mod/tasks/LocalModParseTask.h"
|
||||||
#include "minecraft/mod/tasks/LocalModUpdateTask.h"
|
#include "minecraft/mod/tasks/LocalModUpdateTask.h"
|
||||||
#include "minecraft/mod/tasks/ModFolderLoadTask.h"
|
#include "minecraft/mod/tasks/ModFolderLoadTask.h"
|
||||||
@ -62,12 +64,14 @@
|
|||||||
ModFolderModel::ModFolderModel(const QString& dir, BaseInstance* instance, bool is_indexed, bool create_dir)
|
ModFolderModel::ModFolderModel(const QString& dir, BaseInstance* instance, bool is_indexed, bool create_dir)
|
||||||
: ResourceFolderModel(QDir(dir), instance, nullptr, create_dir), m_is_indexed(is_indexed)
|
: ResourceFolderModel(QDir(dir), instance, nullptr, create_dir), m_is_indexed(is_indexed)
|
||||||
{
|
{
|
||||||
m_column_names = QStringList({ "Enable", "Image", "Name", "Version", "Last Modified", "Provider" });
|
m_column_names = QStringList({ "Enable", "Image", "Name", "Version", "Last Modified", "Provider", "Size" });
|
||||||
m_column_names_translated = QStringList({ tr("Enable"), tr("Image"), tr("Name"), tr("Version"), tr("Last Modified"), tr("Provider") });
|
m_column_names_translated =
|
||||||
m_column_sort_keys = { SortType::ENABLED, SortType::NAME, SortType::NAME, SortType::VERSION, SortType::DATE, SortType::PROVIDER };
|
QStringList({ tr("Enable"), tr("Image"), tr("Name"), tr("Version"), tr("Last Modified"), tr("Provider"), tr("Size") });
|
||||||
m_column_resize_modes = { QHeaderView::Interactive, QHeaderView::Interactive, QHeaderView::Stretch,
|
m_column_sort_keys = { SortType::ENABLED, SortType::NAME, SortType::NAME, SortType::VERSION,
|
||||||
|
SortType::DATE, SortType::PROVIDER, SortType::SIZE };
|
||||||
|
m_column_resize_modes = { QHeaderView::Interactive, QHeaderView::Interactive, QHeaderView::Stretch, QHeaderView::Interactive,
|
||||||
QHeaderView::Interactive, QHeaderView::Interactive, QHeaderView::Interactive };
|
QHeaderView::Interactive, QHeaderView::Interactive, QHeaderView::Interactive };
|
||||||
m_columnsHideable = { false, true, false, true, true, true };
|
m_columnsHideable = { false, true, false, true, true, true, true };
|
||||||
}
|
}
|
||||||
|
|
||||||
QVariant ModFolderModel::data(const QModelIndex& index, int role) const
|
QVariant ModFolderModel::data(const QModelIndex& index, int role) const
|
||||||
@ -105,12 +109,14 @@ QVariant ModFolderModel::data(const QModelIndex& index, int role) const
|
|||||||
|
|
||||||
return provider.value();
|
return provider.value();
|
||||||
}
|
}
|
||||||
|
case SizeColumn:
|
||||||
|
return m_resources[row]->sizeStr();
|
||||||
default:
|
default:
|
||||||
return QVariant();
|
return QVariant();
|
||||||
}
|
}
|
||||||
|
|
||||||
case Qt::ToolTipRole:
|
case Qt::ToolTipRole:
|
||||||
if (column == NAME_COLUMN) {
|
if (column == NameColumn) {
|
||||||
if (at(row)->isSymLinkUnder(instDirPath())) {
|
if (at(row)->isSymLinkUnder(instDirPath())) {
|
||||||
return m_resources[row]->internal_id() +
|
return m_resources[row]->internal_id() +
|
||||||
tr("\nWarning: This resource is symbolically linked from elsewhere. Editing it will also change the original."
|
tr("\nWarning: This resource is symbolically linked from elsewhere. Editing it will also change the original."
|
||||||
@ -124,7 +130,7 @@ QVariant ModFolderModel::data(const QModelIndex& index, int role) const
|
|||||||
}
|
}
|
||||||
return m_resources[row]->internal_id();
|
return m_resources[row]->internal_id();
|
||||||
case Qt::DecorationRole: {
|
case Qt::DecorationRole: {
|
||||||
if (column == NAME_COLUMN && (at(row)->isSymLinkUnder(instDirPath()) || at(row)->isMoreThanOneHardLink()))
|
if (column == NameColumn && (at(row)->isSymLinkUnder(instDirPath()) || at(row)->isMoreThanOneHardLink()))
|
||||||
return APPLICATION->getThemedIcon("status-yellow");
|
return APPLICATION->getThemedIcon("status-yellow");
|
||||||
if (column == ImageColumn) {
|
if (column == ImageColumn) {
|
||||||
return at(row)->icon({ 32, 32 }, Qt::AspectRatioMode::KeepAspectRatioByExpanding);
|
return at(row)->icon({ 32, 32 }, Qt::AspectRatioMode::KeepAspectRatioByExpanding);
|
||||||
@ -159,6 +165,7 @@ QVariant ModFolderModel::headerData(int section, [[maybe_unused]] Qt::Orientatio
|
|||||||
case DateColumn:
|
case DateColumn:
|
||||||
case ProviderColumn:
|
case ProviderColumn:
|
||||||
case ImageColumn:
|
case ImageColumn:
|
||||||
|
case SizeColumn:
|
||||||
return columnNames().at(section);
|
return columnNames().at(section);
|
||||||
default:
|
default:
|
||||||
return QVariant();
|
return QVariant();
|
||||||
@ -176,6 +183,8 @@ QVariant ModFolderModel::headerData(int section, [[maybe_unused]] Qt::Orientatio
|
|||||||
return tr("The date and time this mod was last changed (or added).");
|
return tr("The date and time this mod was last changed (or added).");
|
||||||
case ProviderColumn:
|
case ProviderColumn:
|
||||||
return tr("Where the mod was downloaded from.");
|
return tr("Where the mod was downloaded from.");
|
||||||
|
case SizeColumn:
|
||||||
|
return tr("The size of the mod.");
|
||||||
default:
|
default:
|
||||||
return QVariant();
|
return QVariant();
|
||||||
}
|
}
|
||||||
|
@ -61,7 +61,7 @@ class QFileSystemWatcher;
|
|||||||
class ModFolderModel : public ResourceFolderModel {
|
class ModFolderModel : public ResourceFolderModel {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
public:
|
public:
|
||||||
enum Columns { ActiveColumn = 0, ImageColumn, NameColumn, VersionColumn, DateColumn, ProviderColumn, NUM_COLUMNS };
|
enum Columns { ActiveColumn = 0, ImageColumn, NameColumn, VersionColumn, DateColumn, ProviderColumn, SizeColumn, NUM_COLUMNS };
|
||||||
enum ModStatusAction { Disable, Enable, Toggle };
|
enum ModStatusAction { Disable, Enable, Toggle };
|
||||||
ModFolderModel(const QString& dir, BaseInstance* instance, bool is_indexed = false, bool create_dir = true);
|
ModFolderModel(const QString& dir, BaseInstance* instance, bool is_indexed = false, bool create_dir = true);
|
||||||
|
|
||||||
|
@ -1,9 +1,12 @@
|
|||||||
#include "Resource.h"
|
#include "Resource.h"
|
||||||
|
|
||||||
|
#include <QDirIterator>
|
||||||
#include <QFileInfo>
|
#include <QFileInfo>
|
||||||
#include <QRegularExpression>
|
#include <QRegularExpression>
|
||||||
|
#include <tuple>
|
||||||
|
|
||||||
#include "FileSystem.h"
|
#include "FileSystem.h"
|
||||||
|
#include "StringUtils.h"
|
||||||
|
|
||||||
Resource::Resource(QObject* parent) : QObject(parent) {}
|
Resource::Resource(QObject* parent) : QObject(parent) {}
|
||||||
|
|
||||||
@ -18,6 +21,20 @@ void Resource::setFile(QFileInfo file_info)
|
|||||||
parseFile();
|
parseFile();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::tuple<QString, qint64> calculateFileSize(const QFileInfo& file)
|
||||||
|
{
|
||||||
|
if (file.isDir()) {
|
||||||
|
auto dir = QDir(file.absoluteFilePath());
|
||||||
|
dir.setFilter(QDir::AllEntries | QDir::NoDotAndDotDot);
|
||||||
|
auto count = dir.count();
|
||||||
|
auto str = QObject::tr("item");
|
||||||
|
if (count != 1)
|
||||||
|
str = QObject::tr("items");
|
||||||
|
return { QString("%1 %2").arg(QString::number(count), str), count };
|
||||||
|
}
|
||||||
|
return { StringUtils::humanReadableFileSize(file.size(), true), file.size() };
|
||||||
|
}
|
||||||
|
|
||||||
void Resource::parseFile()
|
void Resource::parseFile()
|
||||||
{
|
{
|
||||||
QString file_name{ m_file_info.fileName() };
|
QString file_name{ m_file_info.fileName() };
|
||||||
@ -26,6 +43,7 @@ void Resource::parseFile()
|
|||||||
|
|
||||||
m_internal_id = file_name;
|
m_internal_id = file_name;
|
||||||
|
|
||||||
|
std::tie(m_size_str, m_size_info) = calculateFileSize(m_file_info);
|
||||||
if (m_file_info.isDir()) {
|
if (m_file_info.isDir()) {
|
||||||
m_type = ResourceType::FOLDER;
|
m_type = ResourceType::FOLDER;
|
||||||
m_name = file_name;
|
m_name = file_name;
|
||||||
@ -61,15 +79,15 @@ static void removeThePrefix(QString& string)
|
|||||||
string = string.trimmed();
|
string = string.trimmed();
|
||||||
}
|
}
|
||||||
|
|
||||||
std::pair<int, bool> Resource::compare(const Resource& other, SortType type) const
|
int Resource::compare(const Resource& other, SortType type) const
|
||||||
{
|
{
|
||||||
switch (type) {
|
switch (type) {
|
||||||
default:
|
default:
|
||||||
case SortType::ENABLED:
|
case SortType::ENABLED:
|
||||||
if (enabled() && !other.enabled())
|
if (enabled() && !other.enabled())
|
||||||
return { 1, type == SortType::ENABLED };
|
return 1;
|
||||||
if (!enabled() && other.enabled())
|
if (!enabled() && other.enabled())
|
||||||
return { -1, type == SortType::ENABLED };
|
return -1;
|
||||||
break;
|
break;
|
||||||
case SortType::NAME: {
|
case SortType::NAME: {
|
||||||
QString this_name{ name() };
|
QString this_name{ name() };
|
||||||
@ -78,20 +96,31 @@ std::pair<int, bool> Resource::compare(const Resource& other, SortType type) con
|
|||||||
removeThePrefix(this_name);
|
removeThePrefix(this_name);
|
||||||
removeThePrefix(other_name);
|
removeThePrefix(other_name);
|
||||||
|
|
||||||
auto compare_result = QString::compare(this_name, other_name, Qt::CaseInsensitive);
|
return QString::compare(this_name, other_name, Qt::CaseInsensitive);
|
||||||
if (compare_result != 0)
|
|
||||||
return { compare_result, type == SortType::NAME };
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
case SortType::DATE:
|
case SortType::DATE:
|
||||||
if (dateTimeChanged() > other.dateTimeChanged())
|
if (dateTimeChanged() > other.dateTimeChanged())
|
||||||
return { 1, type == SortType::DATE };
|
return 1;
|
||||||
if (dateTimeChanged() < other.dateTimeChanged())
|
if (dateTimeChanged() < other.dateTimeChanged())
|
||||||
return { -1, type == SortType::DATE };
|
return -1;
|
||||||
break;
|
break;
|
||||||
|
case SortType::SIZE: {
|
||||||
|
if (this->type() != other.type()) {
|
||||||
|
if (this->type() == ResourceType::FOLDER)
|
||||||
|
return -1;
|
||||||
|
if (other.type() == ResourceType::FOLDER)
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sizeInfo() > other.sizeInfo())
|
||||||
|
return 1;
|
||||||
|
if (sizeInfo() < other.sizeInfo())
|
||||||
|
return -1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return { 0, false };
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Resource::applyFilter(QRegularExpression filter) const
|
bool Resource::applyFilter(QRegularExpression filter) const
|
||||||
|
@ -15,7 +15,7 @@ enum class ResourceType {
|
|||||||
LITEMOD, //!< The resource is a litemod
|
LITEMOD, //!< The resource is a litemod
|
||||||
};
|
};
|
||||||
|
|
||||||
enum class SortType { NAME, DATE, VERSION, ENABLED, PACK_FORMAT, PROVIDER };
|
enum class SortType { NAME, DATE, VERSION, ENABLED, PACK_FORMAT, PROVIDER, SIZE };
|
||||||
|
|
||||||
enum class EnableAction { ENABLE, DISABLE, TOGGLE };
|
enum class EnableAction { ENABLE, DISABLE, TOGGLE };
|
||||||
|
|
||||||
@ -45,6 +45,8 @@ class Resource : public QObject {
|
|||||||
[[nodiscard]] auto internal_id() const -> QString { return m_internal_id; }
|
[[nodiscard]] auto internal_id() const -> QString { return m_internal_id; }
|
||||||
[[nodiscard]] auto type() const -> ResourceType { return m_type; }
|
[[nodiscard]] auto type() const -> ResourceType { return m_type; }
|
||||||
[[nodiscard]] bool enabled() const { return m_enabled; }
|
[[nodiscard]] bool enabled() const { return m_enabled; }
|
||||||
|
[[nodiscard]] QString sizeStr() const { return m_size_str; }
|
||||||
|
[[nodiscard]] qint64 sizeInfo() const { return m_size_info; }
|
||||||
|
|
||||||
[[nodiscard]] virtual auto name() const -> QString { return m_name; }
|
[[nodiscard]] virtual auto name() const -> QString { return m_name; }
|
||||||
[[nodiscard]] virtual bool valid() const { return m_type != ResourceType::UNKNOWN; }
|
[[nodiscard]] virtual bool valid() const { return m_type != ResourceType::UNKNOWN; }
|
||||||
@ -53,10 +55,8 @@ class Resource : public QObject {
|
|||||||
* > 0: 'this' comes after 'other'
|
* > 0: 'this' comes after 'other'
|
||||||
* = 0: 'this' is equal to 'other'
|
* = 0: 'this' is equal to 'other'
|
||||||
* < 0: 'this' comes before 'other'
|
* < 0: 'this' comes before 'other'
|
||||||
*
|
|
||||||
* The second argument in the pair is true if the sorting type that decided which one is greater was 'type'.
|
|
||||||
*/
|
*/
|
||||||
[[nodiscard]] virtual auto compare(Resource const& other, SortType type = SortType::NAME) const -> std::pair<int, bool>;
|
[[nodiscard]] virtual int compare(Resource const& other, SortType type = SortType::NAME) const;
|
||||||
|
|
||||||
/** Returns whether the given filter should filter out 'this' (false),
|
/** Returns whether the given filter should filter out 'this' (false),
|
||||||
* or if such filter includes the Resource (true).
|
* or if such filter includes the Resource (true).
|
||||||
@ -117,4 +117,6 @@ class Resource : public QObject {
|
|||||||
bool m_is_resolving = false;
|
bool m_is_resolving = false;
|
||||||
bool m_is_resolved = false;
|
bool m_is_resolved = false;
|
||||||
int m_resolution_ticket = 0;
|
int m_resolution_ticket = 0;
|
||||||
|
QString m_size_str;
|
||||||
|
qint64 m_size_info;
|
||||||
};
|
};
|
||||||
|
@ -16,6 +16,7 @@
|
|||||||
#include "FileSystem.h"
|
#include "FileSystem.h"
|
||||||
|
|
||||||
#include "QVariantUtils.h"
|
#include "QVariantUtils.h"
|
||||||
|
#include "StringUtils.h"
|
||||||
#include "minecraft/mod/tasks/BasicFolderLoadTask.h"
|
#include "minecraft/mod/tasks/BasicFolderLoadTask.h"
|
||||||
|
|
||||||
#include "settings/Setting.h"
|
#include "settings/Setting.h"
|
||||||
@ -416,15 +417,17 @@ QVariant ResourceFolderModel::data(const QModelIndex& index, int role) const
|
|||||||
switch (role) {
|
switch (role) {
|
||||||
case Qt::DisplayRole:
|
case Qt::DisplayRole:
|
||||||
switch (column) {
|
switch (column) {
|
||||||
case NAME_COLUMN:
|
case NameColumn:
|
||||||
return m_resources[row]->name();
|
return m_resources[row]->name();
|
||||||
case DATE_COLUMN:
|
case DateColumn:
|
||||||
return m_resources[row]->dateTimeChanged();
|
return m_resources[row]->dateTimeChanged();
|
||||||
|
case SizeColumn:
|
||||||
|
return m_resources[row]->sizeStr();
|
||||||
default:
|
default:
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
case Qt::ToolTipRole:
|
case Qt::ToolTipRole:
|
||||||
if (column == NAME_COLUMN) {
|
if (column == NameColumn) {
|
||||||
if (at(row).isSymLinkUnder(instDirPath())) {
|
if (at(row).isSymLinkUnder(instDirPath())) {
|
||||||
return m_resources[row]->internal_id() +
|
return m_resources[row]->internal_id() +
|
||||||
tr("\nWarning: This resource is symbolically linked from elsewhere. Editing it will also change the original."
|
tr("\nWarning: This resource is symbolically linked from elsewhere. Editing it will also change the original."
|
||||||
@ -440,14 +443,14 @@ QVariant ResourceFolderModel::data(const QModelIndex& index, int role) const
|
|||||||
|
|
||||||
return m_resources[row]->internal_id();
|
return m_resources[row]->internal_id();
|
||||||
case Qt::DecorationRole: {
|
case Qt::DecorationRole: {
|
||||||
if (column == NAME_COLUMN && (at(row).isSymLinkUnder(instDirPath()) || at(row).isMoreThanOneHardLink()))
|
if (column == NameColumn && (at(row).isSymLinkUnder(instDirPath()) || at(row).isMoreThanOneHardLink()))
|
||||||
return APPLICATION->getThemedIcon("status-yellow");
|
return APPLICATION->getThemedIcon("status-yellow");
|
||||||
|
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
case Qt::CheckStateRole:
|
case Qt::CheckStateRole:
|
||||||
switch (column) {
|
switch (column) {
|
||||||
case ACTIVE_COLUMN:
|
case ActiveColumn:
|
||||||
return m_resources[row]->enabled() ? Qt::Checked : Qt::Unchecked;
|
return m_resources[row]->enabled() ? Qt::Checked : Qt::Unchecked;
|
||||||
default:
|
default:
|
||||||
return {};
|
return {};
|
||||||
@ -486,24 +489,27 @@ QVariant ResourceFolderModel::headerData(int section, [[maybe_unused]] Qt::Orien
|
|||||||
switch (role) {
|
switch (role) {
|
||||||
case Qt::DisplayRole:
|
case Qt::DisplayRole:
|
||||||
switch (section) {
|
switch (section) {
|
||||||
case ACTIVE_COLUMN:
|
case ActiveColumn:
|
||||||
case NAME_COLUMN:
|
case NameColumn:
|
||||||
case DATE_COLUMN:
|
case DateColumn:
|
||||||
|
case SizeColumn:
|
||||||
return columnNames().at(section);
|
return columnNames().at(section);
|
||||||
default:
|
default:
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
case Qt::ToolTipRole: {
|
case Qt::ToolTipRole: {
|
||||||
switch (section) {
|
switch (section) {
|
||||||
case ACTIVE_COLUMN:
|
case ActiveColumn:
|
||||||
//: Here, resource is a generic term for external resources, like Mods, Resource Packs, Shader Packs, etc.
|
//: Here, resource is a generic term for external resources, like Mods, Resource Packs, Shader Packs, etc.
|
||||||
return tr("Is the resource enabled?");
|
return tr("Is the resource enabled?");
|
||||||
case NAME_COLUMN:
|
case NameColumn:
|
||||||
//: Here, resource is a generic term for external resources, like Mods, Resource Packs, Shader Packs, etc.
|
//: Here, resource is a generic term for external resources, like Mods, Resource Packs, Shader Packs, etc.
|
||||||
return tr("The name of the resource.");
|
return tr("The name of the resource.");
|
||||||
case DATE_COLUMN:
|
case DateColumn:
|
||||||
//: Here, resource is a generic term for external resources, like Mods, Resource Packs, Shader Packs, etc.
|
//: Here, resource is a generic term for external resources, like Mods, Resource Packs, Shader Packs, etc.
|
||||||
return tr("The date and time this resource was last changed (or added).");
|
return tr("The date and time this resource was last changed (or added).");
|
||||||
|
case SizeColumn:
|
||||||
|
return tr("The size of the resource.");
|
||||||
default:
|
default:
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
@ -610,12 +616,10 @@ SortType ResourceFolderModel::columnToSortKey(size_t column) const
|
|||||||
auto const& resource_right = model->at(source_right.row());
|
auto const& resource_right = model->at(source_right.row());
|
||||||
|
|
||||||
auto compare_result = resource_left.compare(resource_right, column_sort_key);
|
auto compare_result = resource_left.compare(resource_right, column_sort_key);
|
||||||
if (compare_result.first == 0)
|
if (compare_result == 0)
|
||||||
return QSortFilterProxyModel::lessThan(source_left, source_right);
|
return QSortFilterProxyModel::lessThan(source_left, source_right);
|
||||||
|
|
||||||
if (compare_result.second || sortOrder() != Qt::DescendingOrder)
|
return compare_result < 0;
|
||||||
return (compare_result.first < 0);
|
|
||||||
return (compare_result.first > 0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
QString ResourceFolderModel::instDirPath() const
|
QString ResourceFolderModel::instDirPath() const
|
||||||
|
@ -96,7 +96,7 @@ class ResourceFolderModel : public QAbstractListModel {
|
|||||||
/* Qt behavior */
|
/* Qt behavior */
|
||||||
|
|
||||||
/* Basic columns */
|
/* Basic columns */
|
||||||
enum Columns { ACTIVE_COLUMN = 0, NAME_COLUMN, DATE_COLUMN, NUM_COLUMNS };
|
enum Columns { ActiveColumn = 0, NameColumn, DateColumn, SizeColumn, NUM_COLUMNS };
|
||||||
QStringList columnNames(bool translated = true) const { return translated ? m_column_names_translated : m_column_names; }
|
QStringList columnNames(bool translated = true) const { return translated ? m_column_names_translated : m_column_names; }
|
||||||
|
|
||||||
[[nodiscard]] int rowCount(const QModelIndex& parent = {}) const override { return parent.isValid() ? 0 : static_cast<int>(size()); }
|
[[nodiscard]] int rowCount(const QModelIndex& parent = {}) const override { return parent.isValid() ? 0 : static_cast<int>(size()); }
|
||||||
@ -195,11 +195,12 @@ class ResourceFolderModel : public QAbstractListModel {
|
|||||||
protected:
|
protected:
|
||||||
// Represents the relationship between a column's index (represented by the list index), and it's sorting key.
|
// Represents the relationship between a column's index (represented by the list index), and it's sorting key.
|
||||||
// As such, the order in with they appear is very important!
|
// As such, the order in with they appear is very important!
|
||||||
QList<SortType> m_column_sort_keys = { SortType::ENABLED, SortType::NAME, SortType::DATE };
|
QList<SortType> m_column_sort_keys = { SortType::ENABLED, SortType::NAME, SortType::DATE, SortType::SIZE };
|
||||||
QStringList m_column_names = { "Enable", "Name", "Last Modified" };
|
QStringList m_column_names = { "Enable", "Name", "Last Modified", "Size" };
|
||||||
QStringList m_column_names_translated = { tr("Enable"), tr("Name"), tr("Last Modified") };
|
QStringList m_column_names_translated = { tr("Enable"), tr("Name"), tr("Last Modified"), tr("Size") };
|
||||||
QList<QHeaderView::ResizeMode> m_column_resize_modes = { QHeaderView::Interactive, QHeaderView::Stretch, QHeaderView::Interactive };
|
QList<QHeaderView::ResizeMode> m_column_resize_modes = { QHeaderView::Interactive, QHeaderView::Stretch, QHeaderView::Interactive,
|
||||||
QList<bool> m_columnsHideable = { false, false, true };
|
QHeaderView::Interactive };
|
||||||
|
QList<bool> m_columnsHideable = { false, false, true, true };
|
||||||
|
|
||||||
QDir m_dir;
|
QDir m_dir;
|
||||||
BaseInstance* m_instance;
|
BaseInstance* m_instance;
|
||||||
|
@ -94,29 +94,24 @@ std::pair<Version, Version> ResourcePack::compatibleVersions() const
|
|||||||
return s_pack_format_versions.constFind(m_pack_format).value();
|
return s_pack_format_versions.constFind(m_pack_format).value();
|
||||||
}
|
}
|
||||||
|
|
||||||
std::pair<int, bool> ResourcePack::compare(const Resource& other, SortType type) const
|
int ResourcePack::compare(const Resource& other, SortType type) const
|
||||||
{
|
{
|
||||||
auto const& cast_other = static_cast<ResourcePack const&>(other);
|
auto const& cast_other = static_cast<ResourcePack const&>(other);
|
||||||
|
|
||||||
switch (type) {
|
switch (type) {
|
||||||
default: {
|
default:
|
||||||
auto res = Resource::compare(other, type);
|
return Resource::compare(other, type);
|
||||||
if (res.first != 0)
|
|
||||||
return res;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case SortType::PACK_FORMAT: {
|
case SortType::PACK_FORMAT: {
|
||||||
auto this_ver = packFormat();
|
auto this_ver = packFormat();
|
||||||
auto other_ver = cast_other.packFormat();
|
auto other_ver = cast_other.packFormat();
|
||||||
|
|
||||||
if (this_ver > other_ver)
|
if (this_ver > other_ver)
|
||||||
return { 1, type == SortType::PACK_FORMAT };
|
return 1;
|
||||||
if (this_ver < other_ver)
|
if (this_ver < other_ver)
|
||||||
return { -1, type == SortType::PACK_FORMAT };
|
return -1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return { 0, false };
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ResourcePack::applyFilter(QRegularExpression filter) const
|
bool ResourcePack::applyFilter(QRegularExpression filter) const
|
||||||
|
@ -44,7 +44,7 @@ class ResourcePack : public Resource {
|
|||||||
|
|
||||||
bool valid() const override;
|
bool valid() const override;
|
||||||
|
|
||||||
[[nodiscard]] auto compare(Resource const& other, SortType type) const -> std::pair<int, bool> override;
|
[[nodiscard]] int compare(Resource const& other, SortType type) const override;
|
||||||
[[nodiscard]] bool applyFilter(QRegularExpression filter) const override;
|
[[nodiscard]] bool applyFilter(QRegularExpression filter) const override;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
@ -42,19 +42,21 @@
|
|||||||
#include <QStyle>
|
#include <QStyle>
|
||||||
|
|
||||||
#include "Application.h"
|
#include "Application.h"
|
||||||
|
#include "StringUtils.h"
|
||||||
#include "Version.h"
|
#include "Version.h"
|
||||||
|
|
||||||
|
#include "minecraft/mod/Resource.h"
|
||||||
#include "minecraft/mod/tasks/BasicFolderLoadTask.h"
|
#include "minecraft/mod/tasks/BasicFolderLoadTask.h"
|
||||||
#include "minecraft/mod/tasks/LocalResourcePackParseTask.h"
|
#include "minecraft/mod/tasks/LocalResourcePackParseTask.h"
|
||||||
|
|
||||||
ResourcePackFolderModel::ResourcePackFolderModel(const QString& dir, BaseInstance* instance) : ResourceFolderModel(QDir(dir), instance)
|
ResourcePackFolderModel::ResourcePackFolderModel(const QString& dir, BaseInstance* instance) : ResourceFolderModel(QDir(dir), instance)
|
||||||
{
|
{
|
||||||
m_column_names = QStringList({ "Enable", "Image", "Name", "Pack Format", "Last Modified" });
|
m_column_names = QStringList({ "Enable", "Image", "Name", "Pack Format", "Last Modified", "Size" });
|
||||||
m_column_names_translated = QStringList({ tr("Enable"), tr("Image"), tr("Name"), tr("Pack Format"), tr("Last Modified") });
|
m_column_names_translated = QStringList({ tr("Enable"), tr("Image"), tr("Name"), tr("Pack Format"), tr("Last Modified"), tr("Size") });
|
||||||
m_column_sort_keys = { SortType::ENABLED, SortType::NAME, SortType::NAME, SortType::PACK_FORMAT, SortType::DATE };
|
m_column_sort_keys = { SortType::ENABLED, SortType::NAME, SortType::NAME, SortType::PACK_FORMAT, SortType::DATE, SortType::SIZE };
|
||||||
m_column_resize_modes = { QHeaderView::Interactive, QHeaderView::Interactive, QHeaderView::Stretch, QHeaderView::Interactive,
|
m_column_resize_modes = { QHeaderView::Interactive, QHeaderView::Interactive, QHeaderView::Stretch,
|
||||||
QHeaderView::Interactive };
|
QHeaderView::Interactive, QHeaderView::Interactive, QHeaderView::Interactive };
|
||||||
m_columnsHideable = { false, true, false, true, true };
|
m_columnsHideable = { false, true, false, true, true, true };
|
||||||
}
|
}
|
||||||
|
|
||||||
QVariant ResourcePackFolderModel::data(const QModelIndex& index, int role) const
|
QVariant ResourcePackFolderModel::data(const QModelIndex& index, int role) const
|
||||||
@ -85,6 +87,8 @@ QVariant ResourcePackFolderModel::data(const QModelIndex& index, int role) const
|
|||||||
}
|
}
|
||||||
case DateColumn:
|
case DateColumn:
|
||||||
return m_resources[row]->dateTimeChanged();
|
return m_resources[row]->dateTimeChanged();
|
||||||
|
case SizeColumn:
|
||||||
|
return m_resources[row]->sizeStr();
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return {};
|
return {};
|
||||||
@ -144,6 +148,7 @@ QVariant ResourcePackFolderModel::headerData(int section, [[maybe_unused]] Qt::O
|
|||||||
case PackFormatColumn:
|
case PackFormatColumn:
|
||||||
case DateColumn:
|
case DateColumn:
|
||||||
case ImageColumn:
|
case ImageColumn:
|
||||||
|
case SizeColumn:
|
||||||
return columnNames().at(section);
|
return columnNames().at(section);
|
||||||
default:
|
default:
|
||||||
return {};
|
return {};
|
||||||
@ -160,6 +165,8 @@ QVariant ResourcePackFolderModel::headerData(int section, [[maybe_unused]] Qt::O
|
|||||||
return tr("The resource pack format ID, as well as the Minecraft versions it was designed for.");
|
return tr("The resource pack format ID, as well as the Minecraft versions it was designed for.");
|
||||||
case DateColumn:
|
case DateColumn:
|
||||||
return tr("The date and time this resource pack was last changed (or added).");
|
return tr("The date and time this resource pack was last changed (or added).");
|
||||||
|
case SizeColumn:
|
||||||
|
return tr("The size of the resource pack.");
|
||||||
default:
|
default:
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
class ResourcePackFolderModel : public ResourceFolderModel {
|
class ResourcePackFolderModel : public ResourceFolderModel {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
public:
|
public:
|
||||||
enum Columns { ActiveColumn = 0, ImageColumn, NameColumn, PackFormatColumn, DateColumn, NUM_COLUMNS };
|
enum Columns { ActiveColumn = 0, ImageColumn, NameColumn, PackFormatColumn, DateColumn, SizeColumn, NUM_COLUMNS };
|
||||||
|
|
||||||
explicit ResourcePackFolderModel(const QString& dir, BaseInstance* instance);
|
explicit ResourcePackFolderModel(const QString& dir, BaseInstance* instance);
|
||||||
|
|
||||||
|
@ -37,6 +37,7 @@
|
|||||||
|
|
||||||
#include "Application.h"
|
#include "Application.h"
|
||||||
|
|
||||||
|
#include "StringUtils.h"
|
||||||
#include "TexturePackFolderModel.h"
|
#include "TexturePackFolderModel.h"
|
||||||
|
|
||||||
#include "minecraft/mod/tasks/BasicFolderLoadTask.h"
|
#include "minecraft/mod/tasks/BasicFolderLoadTask.h"
|
||||||
@ -44,11 +45,12 @@
|
|||||||
|
|
||||||
TexturePackFolderModel::TexturePackFolderModel(const QString& dir, BaseInstance* instance) : ResourceFolderModel(QDir(dir), instance)
|
TexturePackFolderModel::TexturePackFolderModel(const QString& dir, BaseInstance* instance) : ResourceFolderModel(QDir(dir), instance)
|
||||||
{
|
{
|
||||||
m_column_names = QStringList({ "Enable", "Image", "Name", "Last Modified" });
|
m_column_names = QStringList({ "Enable", "Image", "Name", "Last Modified", "Size" });
|
||||||
m_column_names_translated = QStringList({ tr("Enable"), tr("Image"), tr("Name"), tr("Last Modified") });
|
m_column_names_translated = QStringList({ tr("Enable"), tr("Image"), tr("Name"), tr("Last Modified"), tr("Size") });
|
||||||
m_column_sort_keys = { SortType::ENABLED, SortType::NAME, SortType::NAME, SortType::DATE };
|
m_column_sort_keys = { SortType::ENABLED, SortType::NAME, SortType::NAME, SortType::DATE, SortType::SIZE };
|
||||||
m_column_resize_modes = { QHeaderView::Interactive, QHeaderView::Interactive, QHeaderView::Stretch, QHeaderView::Interactive };
|
m_column_resize_modes = { QHeaderView::Interactive, QHeaderView::Interactive, QHeaderView::Stretch, QHeaderView::Interactive,
|
||||||
m_columnsHideable = { false, true, false, true };
|
QHeaderView::Interactive };
|
||||||
|
m_columnsHideable = { false, true, false, true, true };
|
||||||
}
|
}
|
||||||
|
|
||||||
Task* TexturePackFolderModel::createUpdateTask()
|
Task* TexturePackFolderModel::createUpdateTask()
|
||||||
@ -76,6 +78,8 @@ QVariant TexturePackFolderModel::data(const QModelIndex& index, int role) const
|
|||||||
return m_resources[row]->name();
|
return m_resources[row]->name();
|
||||||
case DateColumn:
|
case DateColumn:
|
||||||
return m_resources[row]->dateTimeChanged();
|
return m_resources[row]->dateTimeChanged();
|
||||||
|
case SizeColumn:
|
||||||
|
return m_resources[row]->sizeStr();
|
||||||
default:
|
default:
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
@ -127,6 +131,7 @@ QVariant TexturePackFolderModel::headerData(int section, [[maybe_unused]] Qt::Or
|
|||||||
case NameColumn:
|
case NameColumn:
|
||||||
case DateColumn:
|
case DateColumn:
|
||||||
case ImageColumn:
|
case ImageColumn:
|
||||||
|
case SizeColumn:
|
||||||
return columnNames().at(section);
|
return columnNames().at(section);
|
||||||
default:
|
default:
|
||||||
return {};
|
return {};
|
||||||
@ -135,13 +140,15 @@ QVariant TexturePackFolderModel::headerData(int section, [[maybe_unused]] Qt::Or
|
|||||||
switch (section) {
|
switch (section) {
|
||||||
case ActiveColumn:
|
case ActiveColumn:
|
||||||
//: Here, resource is a generic term for external resources, like Mods, Resource Packs, Shader Packs, etc.
|
//: Here, resource is a generic term for external resources, like Mods, Resource Packs, Shader Packs, etc.
|
||||||
return tr("Is the resource enabled?");
|
return tr("Is the texture pack enabled?");
|
||||||
case NameColumn:
|
case NameColumn:
|
||||||
//: Here, resource is a generic term for external resources, like Mods, Resource Packs, Shader Packs, etc.
|
//: Here, resource is a generic term for external resources, like Mods, Resource Packs, Shader Packs, etc.
|
||||||
return tr("The name of the resource.");
|
return tr("The name of the texture pack.");
|
||||||
case DateColumn:
|
case DateColumn:
|
||||||
//: Here, resource is a generic term for external resources, like Mods, Resource Packs, Shader Packs, etc.
|
//: Here, resource is a generic term for external resources, like Mods, Resource Packs, Shader Packs, etc.
|
||||||
return tr("The date and time this resource was last changed (or added).");
|
return tr("The date and time this texture pack was last changed (or added).");
|
||||||
|
case SizeColumn:
|
||||||
|
return tr("The size of the texture pack.");
|
||||||
default:
|
default:
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
@ -44,7 +44,7 @@ class TexturePackFolderModel : public ResourceFolderModel {
|
|||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
enum Columns { ActiveColumn = 0, ImageColumn, NameColumn, DateColumn, NUM_COLUMNS };
|
enum Columns { ActiveColumn = 0, ImageColumn, NameColumn, DateColumn, SizeColumn, NUM_COLUMNS };
|
||||||
|
|
||||||
explicit TexturePackFolderModel(const QString& dir, std::shared_ptr<const BaseInstance> instance);
|
explicit TexturePackFolderModel(const QString& dir, std::shared_ptr<const BaseInstance> instance);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user