From e76f5d85b2842b40c9d5d02d3a9db427e51d7569 Mon Sep 17 00:00:00 2001 From: Michael Maltese Date: Fri, 26 May 2017 16:28:44 -0700 Subject: [PATCH 1/2] DolphinQt2: don't use custom delegate for GameList --- Source/Core/DolphinQt2/GameList/GameList.cpp | 6 ++-- Source/Core/DolphinQt2/GameList/GameList.h | 3 -- .../DolphinQt2/GameList/GameListModel.cpp | 29 ++++++++++++++----- .../DolphinQt2/GameList/ListProxyModel.cpp | 12 ++++---- 4 files changed, 30 insertions(+), 20 deletions(-) diff --git a/Source/Core/DolphinQt2/GameList/GameList.cpp b/Source/Core/DolphinQt2/GameList/GameList.cpp index 19bde59059..d47cf883e1 100644 --- a/Source/Core/DolphinQt2/GameList/GameList.cpp +++ b/Source/Core/DolphinQt2/GameList/GameList.cpp @@ -22,7 +22,6 @@ #include "DolphinQt2/Config/PropertiesDialog.h" #include "DolphinQt2/GameList/GameList.h" #include "DolphinQt2/GameList/ListProxyModel.h" -#include "DolphinQt2/GameList/TableDelegate.h" #include "DolphinQt2/Settings.h" static bool CompressCB(const std::string&, float, void*); @@ -35,8 +34,6 @@ GameList::GameList(QWidget* parent) : QStackedWidget(parent) m_list_proxy = new ListProxyModel(this); m_list_proxy->setSourceModel(m_model); - m_delegate = new TableDelegate(this); - MakeTableView(); MakeListView(); MakeEmptyView(); @@ -59,7 +56,7 @@ void GameList::MakeTableView() { m_table = new QTableView(this); m_table->setModel(m_table_proxy); - m_table->setItemDelegate(m_delegate); + m_table->setSelectionMode(QAbstractItemView::SingleSelection); m_table->setSelectionBehavior(QAbstractItemView::SelectRows); m_table->setAlternatingRowColors(true); @@ -67,6 +64,7 @@ void GameList::MakeTableView() m_table->setSortingEnabled(true); m_table->setCurrentIndex(QModelIndex()); m_table->setContextMenuPolicy(Qt::CustomContextMenu); + m_table->setWordWrap(false); connect(m_table, &QTableView::customContextMenuRequested, this, &GameList::ShowContextMenu); diff --git a/Source/Core/DolphinQt2/GameList/GameList.h b/Source/Core/DolphinQt2/GameList/GameList.h index 040d845ebe..750ed92c7a 100644 --- a/Source/Core/DolphinQt2/GameList/GameList.h +++ b/Source/Core/DolphinQt2/GameList/GameList.h @@ -13,8 +13,6 @@ #include "DolphinQt2/GameList/GameFile.h" #include "DolphinQt2/GameList/GameListModel.h" -class TableDelegate; - class GameList final : public QStackedWidget { Q_OBJECT @@ -56,7 +54,6 @@ private: void ConsiderViewChange(); GameListModel* m_model; - TableDelegate* m_delegate; QSortFilterProxyModel* m_table_proxy; QSortFilterProxyModel* m_list_proxy; diff --git a/Source/Core/DolphinQt2/GameList/GameListModel.cpp b/Source/Core/DolphinQt2/GameList/GameListModel.cpp index c2796b1dda..30aaa9d77b 100644 --- a/Source/Core/DolphinQt2/GameList/GameListModel.cpp +++ b/Source/Core/DolphinQt2/GameList/GameListModel.cpp @@ -5,6 +5,8 @@ #include "DolphinQt2/GameList/GameListModel.h" #include "DolphinQt2/Resources.h" +const QSize GAMECUBE_BANNER_SIZE(96, 32); + GameListModel::GameListModel(QObject* parent) : QAbstractTableModel(parent) { connect(&m_tracker, &GameTracker::GameLoaded, this, &GameListModel::UpdateGame); @@ -19,14 +21,29 @@ QVariant GameListModel::data(const QModelIndex& index, int role) const return QVariant(); QSharedPointer game = m_games[index.row()]; - if (role == Qt::DisplayRole) + if (role == Qt::DecorationRole) { switch (index.column()) { case COL_PLATFORM: - return static_cast(game->GetPlatformID()); + return Resources::GetPlatform(static_cast(game->GetPlatformID())); + case COL_COUNTRY: + return Resources::GetCountry(static_cast(game->GetCountryID())); + case COL_RATING: + return Resources::GetRating(game->GetRating()); case COL_BANNER: - return game->GetBanner(); + // GameCube banners are 96x32, but Wii banners are 192x64. + // TODO: use custom banners from rom directory like DolphinWX? + QPixmap banner = game->GetBanner(); + banner.setDevicePixelRatio(std::max(banner.width() / GAMECUBE_BANNER_SIZE.width(), + banner.height() / GAMECUBE_BANNER_SIZE.height())); + return banner; + } + } + if (role == Qt::DisplayRole) + { + switch (index.column()) + { case COL_TITLE: return game->GetLongName(); case COL_ID: @@ -36,11 +53,7 @@ QVariant GameListModel::data(const QModelIndex& index, int role) const case COL_MAKER: return game->GetMaker(); case COL_SIZE: - return game->GetFileSize(); - case COL_COUNTRY: - return static_cast(game->GetCountryID()); - case COL_RATING: - return game->GetRating(); + return FormatSize(game->GetFileSize()); } } return QVariant(); diff --git a/Source/Core/DolphinQt2/GameList/ListProxyModel.cpp b/Source/Core/DolphinQt2/GameList/ListProxyModel.cpp index f8c9a9463d..27394d6ab8 100644 --- a/Source/Core/DolphinQt2/GameList/ListProxyModel.cpp +++ b/Source/Core/DolphinQt2/GameList/ListProxyModel.cpp @@ -7,7 +7,7 @@ #include "DolphinQt2/GameList/GameListModel.h" #include "DolphinQt2/GameList/ListProxyModel.h" -static QSize LARGE_BANNER_SIZE(144, 48); +const QSize LARGE_BANNER_SIZE(144, 48); ListProxyModel::ListProxyModel(QObject* parent) : QSortFilterProxyModel(parent) { @@ -25,10 +25,12 @@ QVariant ListProxyModel::data(const QModelIndex& i, int role) const } else if (role == Qt::DecorationRole) { - return sourceModel() - ->data(sourceModel()->index(source_index.row(), GameListModel::COL_BANNER), Qt::DisplayRole) - .value() - .scaled(LARGE_BANNER_SIZE, Qt::KeepAspectRatio, Qt::SmoothTransformation); + auto pixmap = sourceModel() + ->data(sourceModel()->index(source_index.row(), GameListModel::COL_BANNER), + Qt::DecorationRole) + .value(); + return pixmap.scaled(LARGE_BANNER_SIZE * pixmap.devicePixelRatio(), Qt::KeepAspectRatio, + Qt::SmoothTransformation); } return QVariant(); } From c01c66ad4b0e1e683d7b1a1ea0ec3aa7b8b19f88 Mon Sep 17 00:00:00 2001 From: Michael Maltese Date: Fri, 26 May 2017 16:13:24 -0700 Subject: [PATCH 2/2] DolphinQt2: remove unused GameList::TableDelegate --- Source/Core/DolphinQt2/CMakeLists.txt | 1 - Source/Core/DolphinQt2/DolphinQt2.vcxproj | 3 - .../DolphinQt2/DolphinQt2.vcxproj.filters | 5 -- .../DolphinQt2/GameList/TableDelegate.cpp | 75 ------------------- .../Core/DolphinQt2/GameList/TableDelegate.h | 20 ----- 5 files changed, 104 deletions(-) delete mode 100644 Source/Core/DolphinQt2/GameList/TableDelegate.cpp delete mode 100644 Source/Core/DolphinQt2/GameList/TableDelegate.h diff --git a/Source/Core/DolphinQt2/CMakeLists.txt b/Source/Core/DolphinQt2/CMakeLists.txt index 7907501666..faf8b468f5 100644 --- a/Source/Core/DolphinQt2/CMakeLists.txt +++ b/Source/Core/DolphinQt2/CMakeLists.txt @@ -39,7 +39,6 @@ set(SRCS GameList/GameListModel.cpp GameList/GameTracker.cpp GameList/ListProxyModel.cpp - GameList/TableDelegate.cpp Settings/GeneralPane.cpp Settings/InterfacePane.cpp ) diff --git a/Source/Core/DolphinQt2/DolphinQt2.vcxproj b/Source/Core/DolphinQt2/DolphinQt2.vcxproj index e3afaee470..3f349a7996 100644 --- a/Source/Core/DolphinQt2/DolphinQt2.vcxproj +++ b/Source/Core/DolphinQt2/DolphinQt2.vcxproj @@ -94,7 +94,6 @@ - @@ -129,7 +128,6 @@ - @@ -154,7 +152,6 @@ - diff --git a/Source/Core/DolphinQt2/DolphinQt2.vcxproj.filters b/Source/Core/DolphinQt2/DolphinQt2.vcxproj.filters index ba0d04a1ac..0a4627d729 100644 --- a/Source/Core/DolphinQt2/DolphinQt2.vcxproj.filters +++ b/Source/Core/DolphinQt2/DolphinQt2.vcxproj.filters @@ -63,14 +63,10 @@ Config - Generated Files - - Generated Files - Generated Files @@ -146,7 +142,6 @@ Config - diff --git a/Source/Core/DolphinQt2/GameList/TableDelegate.cpp b/Source/Core/DolphinQt2/GameList/TableDelegate.cpp deleted file mode 100644 index f0f2fcaadf..0000000000 --- a/Source/Core/DolphinQt2/GameList/TableDelegate.cpp +++ /dev/null @@ -1,75 +0,0 @@ -// Copyright 2016 Dolphin Emulator Project -// Licensed under GPLv2+ -// Refer to the license.txt file included. - -#include - -#include "DolphinQt2/GameList/GameFile.h" -#include "DolphinQt2/GameList/GameListModel.h" -#include "DolphinQt2/GameList/TableDelegate.h" -#include "DolphinQt2/Resources.h" - -static QSize NORMAL_BANNER_SIZE(96, 32); - -TableDelegate::TableDelegate(QWidget* parent) : QStyledItemDelegate(parent) -{ -} - -void TableDelegate::paint(QPainter* painter, const QStyleOptionViewItem& option, - const QModelIndex& index) const -{ - QVariant data = index.data(Qt::DisplayRole); - switch (index.column()) - { - case GameListModel::COL_PLATFORM: - DrawPixmap(painter, option.rect, Resources::GetPlatform(data.toInt())); - break; - case GameListModel::COL_COUNTRY: - DrawPixmap(painter, option.rect, Resources::GetCountry(data.toInt())); - break; - case GameListModel::COL_RATING: - DrawPixmap(painter, option.rect, Resources::GetRating(data.toInt())); - break; - case GameListModel::COL_BANNER: - DrawPixmap(painter, option.rect, - data.value().scaled(NORMAL_BANNER_SIZE, Qt::KeepAspectRatio, - Qt::SmoothTransformation)); - break; - case GameListModel::COL_SIZE: - painter->drawText(option.rect, Qt::AlignCenter, FormatSize(data.toULongLong())); - break; - // Fall through. - case GameListModel::COL_ID: - case GameListModel::COL_TITLE: - case GameListModel::COL_DESCRIPTION: - case GameListModel::COL_MAKER: - painter->drawText(option.rect, Qt::AlignVCenter, data.toString()); - break; - default: - break; - } -} - -QSize TableDelegate::sizeHint(const QStyleOptionViewItem& option, const QModelIndex& index) const -{ - switch (index.column()) - { - case GameListModel::COL_PLATFORM: - return Resources::GetPlatform(0).size(); - case GameListModel::COL_COUNTRY: - return Resources::GetCountry(0).size(); - case GameListModel::COL_RATING: - return Resources::GetRating(0).size(); - case GameListModel::COL_BANNER: - return NORMAL_BANNER_SIZE; - default: - return QSize(0, 0); - } -} - -void TableDelegate::DrawPixmap(QPainter* painter, const QRect& rect, const QPixmap& pixmap) const -{ - // We don't want to stretch the pixmap out, so center it in the rect. - painter->drawPixmap(rect.left() + (rect.width() - pixmap.width()) / 2, - rect.top() + (rect.height() - pixmap.height()) / 2, pixmap); -} diff --git a/Source/Core/DolphinQt2/GameList/TableDelegate.h b/Source/Core/DolphinQt2/GameList/TableDelegate.h deleted file mode 100644 index f44c13fe10..0000000000 --- a/Source/Core/DolphinQt2/GameList/TableDelegate.h +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright 2016 Dolphin Emulator Project -// Licensed under GPLv2+ -// Refer to the license.txt file included. - -#pragma once - -#include - -class TableDelegate final : public QStyledItemDelegate -{ - Q_OBJECT - -public: - explicit TableDelegate(QWidget* parent = nullptr); - void paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const; - QSize sizeHint(const QStyleOptionViewItem& option, const QModelIndex& index) const; - -private: - void DrawPixmap(QPainter* painter, const QRect& rect, const QPixmap& pixmap) const; -};