Merge pull request #1163 from flowln/fix_list_icons
This commit is contained in:
commit
787234a53a
@ -62,11 +62,7 @@ auto ListModel::data(const QModelIndex& index, int role) const -> QVariant
|
|||||||
}
|
}
|
||||||
case Qt::DecorationRole: {
|
case Qt::DecorationRole: {
|
||||||
if (m_logoMap.contains(pack.logoName)) {
|
if (m_logoMap.contains(pack.logoName)) {
|
||||||
auto icon = m_logoMap.value(pack.logoName);
|
return m_logoMap.value(pack.logoName);
|
||||||
// FIXME: This doesn't really belong here, but Qt doesn't offer a good way right now ;(
|
|
||||||
auto icon_scaled = QIcon(icon.pixmap(48, 48).scaledToWidth(48));
|
|
||||||
|
|
||||||
return icon_scaled;
|
|
||||||
}
|
}
|
||||||
QIcon icon = APPLICATION->getThemedIcon("screenshot-placeholder");
|
QIcon icon = APPLICATION->getThemedIcon("screenshot-placeholder");
|
||||||
// un-const-ify this
|
// un-const-ify this
|
||||||
@ -175,7 +171,7 @@ void ListModel::getLogo(const QString& logo, const QString& logoUrl, LogoCallbac
|
|||||||
|
|
||||||
void ListModel::requestLogo(QString logo, QString url)
|
void ListModel::requestLogo(QString logo, QString url)
|
||||||
{
|
{
|
||||||
if (m_loadingLogos.contains(logo) || m_failedLogos.contains(logo)) {
|
if (m_loadingLogos.contains(logo) || m_failedLogos.contains(logo) || url.isEmpty()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -41,6 +41,7 @@
|
|||||||
#include "minecraft/MinecraftInstance.h"
|
#include "minecraft/MinecraftInstance.h"
|
||||||
#include "minecraft/PackProfile.h"
|
#include "minecraft/PackProfile.h"
|
||||||
#include "ui/dialogs/ModDownloadDialog.h"
|
#include "ui/dialogs/ModDownloadDialog.h"
|
||||||
|
#include "ui/widgets/ProjectItem.h"
|
||||||
|
|
||||||
#include <QMessageBox>
|
#include <QMessageBox>
|
||||||
|
|
||||||
@ -74,31 +75,40 @@ auto ModpackListModel::data(const QModelIndex& index, int role) const -> QVarian
|
|||||||
}
|
}
|
||||||
|
|
||||||
Modrinth::Modpack pack = modpacks.at(pos);
|
Modrinth::Modpack pack = modpacks.at(pos);
|
||||||
if (role == Qt::DisplayRole) {
|
switch (role) {
|
||||||
return pack.name;
|
case Qt::ToolTipRole: {
|
||||||
} else if (role == Qt::ToolTipRole) {
|
if (pack.description.length() > 100) {
|
||||||
if (pack.description.length() > 100) {
|
// some magic to prevent to long tooltips and replace html linebreaks
|
||||||
// some magic to prevent to long tooltips and replace html linebreaks
|
QString edit = pack.description.left(97);
|
||||||
QString edit = pack.description.left(97);
|
edit = edit.left(edit.lastIndexOf("<br>")).left(edit.lastIndexOf(" ")).append("...");
|
||||||
edit = edit.left(edit.lastIndexOf("<br>")).left(edit.lastIndexOf(" ")).append("...");
|
return edit;
|
||||||
return edit;
|
}
|
||||||
|
return pack.description;
|
||||||
}
|
}
|
||||||
return pack.description;
|
case Qt::DecorationRole: {
|
||||||
} else if (role == Qt::DecorationRole) {
|
if (m_logoMap.contains(pack.iconName))
|
||||||
if (m_logoMap.contains(pack.iconName)) {
|
return m_logoMap.value(pack.iconName);
|
||||||
auto icon = m_logoMap.value(pack.iconName);
|
|
||||||
// FIXME: This doesn't really belong here, but Qt doesn't offer a good way right now ;(
|
|
||||||
auto icon_scaled = QIcon(icon.pixmap(48, 48).scaledToWidth(48));
|
|
||||||
|
|
||||||
return icon_scaled;
|
QIcon icon = APPLICATION->getThemedIcon("screenshot-placeholder");
|
||||||
|
((ModpackListModel*)this)->requestLogo(pack.iconName, pack.iconUrl.toString());
|
||||||
|
return icon;
|
||||||
}
|
}
|
||||||
QIcon icon = APPLICATION->getThemedIcon("screenshot-placeholder");
|
case Qt::UserRole: {
|
||||||
((ModpackListModel*)this)->requestLogo(pack.iconName, pack.iconUrl.toString());
|
QVariant v;
|
||||||
return icon;
|
v.setValue(pack);
|
||||||
} else if (role == Qt::UserRole) {
|
return v;
|
||||||
QVariant v;
|
}
|
||||||
v.setValue(pack);
|
case Qt::SizeHintRole:
|
||||||
return v;
|
return QSize(0, 58);
|
||||||
|
// Custom data
|
||||||
|
case UserDataTypes::TITLE:
|
||||||
|
return pack.name;
|
||||||
|
case UserDataTypes::DESCRIPTION:
|
||||||
|
return pack.description;
|
||||||
|
case UserDataTypes::SELECTED:
|
||||||
|
return false;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
return {};
|
return {};
|
||||||
@ -217,7 +227,7 @@ void ModpackListModel::getLogo(const QString& logo, const QString& logoUrl, Logo
|
|||||||
|
|
||||||
void ModpackListModel::requestLogo(QString logo, QString url)
|
void ModpackListModel::requestLogo(QString logo, QString url)
|
||||||
{
|
{
|
||||||
if (m_loadingLogos.contains(logo) || m_failedLogos.contains(logo)) {
|
if (m_loadingLogos.contains(logo) || m_failedLogos.contains(logo) || url.isEmpty()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -43,6 +43,8 @@
|
|||||||
#include "InstanceImportTask.h"
|
#include "InstanceImportTask.h"
|
||||||
#include "Json.h"
|
#include "Json.h"
|
||||||
|
|
||||||
|
#include "ui/widgets/ProjectItem.h"
|
||||||
|
|
||||||
#include <HoeDown.h>
|
#include <HoeDown.h>
|
||||||
|
|
||||||
#include <QComboBox>
|
#include <QComboBox>
|
||||||
@ -70,6 +72,8 @@ ModrinthPage::ModrinthPage(NewInstanceDialog* dialog, QWidget* parent) : QWidget
|
|||||||
connect(ui->sortByBox, SIGNAL(currentIndexChanged(int)), this, SLOT(triggerSearch()));
|
connect(ui->sortByBox, SIGNAL(currentIndexChanged(int)), this, SLOT(triggerSearch()));
|
||||||
connect(ui->packView->selectionModel(), &QItemSelectionModel::currentChanged, this, &ModrinthPage::onSelectionChanged);
|
connect(ui->packView->selectionModel(), &QItemSelectionModel::currentChanged, this, &ModrinthPage::onSelectionChanged);
|
||||||
connect(ui->versionSelectionBox, &QComboBox::currentTextChanged, this, &ModrinthPage::onVersionSelectionChanged);
|
connect(ui->versionSelectionBox, &QComboBox::currentTextChanged, this, &ModrinthPage::onVersionSelectionChanged);
|
||||||
|
|
||||||
|
ui->packView->setItemDelegate(new ProjectItemDelegate(this));
|
||||||
}
|
}
|
||||||
|
|
||||||
ModrinthPage::~ModrinthPage()
|
ModrinthPage::~ModrinthPage()
|
||||||
|
@ -14,9 +14,7 @@ void ProjectItemDelegate::paint(QPainter* painter, const QStyleOptionViewItem& o
|
|||||||
QStyleOptionViewItem opt(option);
|
QStyleOptionViewItem opt(option);
|
||||||
initStyleOption(&opt, index);
|
initStyleOption(&opt, index);
|
||||||
|
|
||||||
auto& rect = opt.rect;
|
auto rect = opt.rect;
|
||||||
auto icon_width = rect.height(), icon_height = rect.height();
|
|
||||||
auto remaining_width = rect.width() - icon_width;
|
|
||||||
|
|
||||||
if (opt.state & QStyle::State_Selected) {
|
if (opt.state & QStyle::State_Selected) {
|
||||||
painter->fillRect(rect, opt.palette.highlight());
|
painter->fillRect(rect, opt.palette.highlight());
|
||||||
@ -25,11 +23,34 @@ void ProjectItemDelegate::paint(QPainter* painter, const QStyleOptionViewItem& o
|
|||||||
painter->fillRect(rect, opt.palette.window());
|
painter->fillRect(rect, opt.palette.window());
|
||||||
}
|
}
|
||||||
|
|
||||||
{ // Icon painting
|
// The default icon size will be a square (and height is usually the lower value).
|
||||||
// Square-sized, occupying the left portion
|
auto icon_width = rect.height(), icon_height = rect.height();
|
||||||
opt.icon.paint(painter, rect.x(), rect.y(), icon_width, icon_height);
|
int icon_x_margin = (rect.height() - icon_width) / 2;
|
||||||
|
int icon_y_margin = (rect.height() - icon_height) / 2;
|
||||||
|
|
||||||
|
if (!opt.icon.isNull()) { // Icon painting
|
||||||
|
{
|
||||||
|
auto icon_size = opt.decorationSize;
|
||||||
|
icon_width = icon_size.width();
|
||||||
|
icon_height = icon_size.height();
|
||||||
|
|
||||||
|
icon_x_margin = (rect.height() - icon_width) / 2;
|
||||||
|
icon_y_margin = (rect.height() - icon_height) / 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Centralize icon with a margin to separate from the other elements
|
||||||
|
int x = rect.x() + icon_x_margin;
|
||||||
|
int y = rect.y() + icon_y_margin;
|
||||||
|
|
||||||
|
// Prevent 'scaling null pixmap' warnings
|
||||||
|
if (icon_width > 0 && icon_height > 0)
|
||||||
|
opt.icon.paint(painter, x, y, icon_width, icon_height);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Change the rect so that funther painting is easier
|
||||||
|
auto remaining_width = rect.width() - icon_width - 2 * icon_x_margin;
|
||||||
|
rect.setRect(rect.x() + icon_width + 2 * icon_x_margin, rect.y(), remaining_width, rect.height());
|
||||||
|
|
||||||
{ // Title painting
|
{ // Title painting
|
||||||
auto title = index.data(UserDataTypes::TITLE).toString();
|
auto title = index.data(UserDataTypes::TITLE).toString();
|
||||||
|
|
||||||
@ -46,7 +67,7 @@ void ProjectItemDelegate::paint(QPainter* painter, const QStyleOptionViewItem& o
|
|||||||
painter->setFont(font);
|
painter->setFont(font);
|
||||||
|
|
||||||
// On the top, aligned to the left after the icon
|
// On the top, aligned to the left after the icon
|
||||||
painter->drawText(rect.x() + icon_width, rect.y() + QFontMetrics(font).height(), title);
|
painter->drawText(rect.x(), rect.y() + QFontMetrics(font).height(), title);
|
||||||
|
|
||||||
painter->restore();
|
painter->restore();
|
||||||
}
|
}
|
||||||
@ -70,7 +91,7 @@ void ProjectItemDelegate::paint(QPainter* painter, const QStyleOptionViewItem& o
|
|||||||
}
|
}
|
||||||
|
|
||||||
// On the bottom, aligned to the left after the icon, and featuring at most two lines of text (with some margin space to spare)
|
// On the bottom, aligned to the left after the icon, and featuring at most two lines of text (with some margin space to spare)
|
||||||
painter->drawText(rect.x() + icon_width, rect.y() + rect.height() - 2.2 * opt.fontMetrics.height(), remaining_width,
|
painter->drawText(rect.x(), rect.y() + rect.height() - 2.2 * opt.fontMetrics.height(), remaining_width,
|
||||||
2 * opt.fontMetrics.height(), Qt::TextWordWrap, description);
|
2 * opt.fontMetrics.height(), Qt::TextWordWrap, description);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user