GCMemcardManager: Make columns sortable.

This commit is contained in:
Admiral H. Curtiss 2020-08-10 20:47:50 +02:00
parent 42f4ee629b
commit 9acbe1aced
2 changed files with 34 additions and 14 deletions

View File

@ -128,8 +128,10 @@ void GCMemcardManager::CreateWidgets()
m_slot_table[i]->setSelectionMode(QAbstractItemView::ExtendedSelection); m_slot_table[i]->setSelectionMode(QAbstractItemView::ExtendedSelection);
m_slot_table[i]->setSelectionBehavior(QAbstractItemView::SelectRows); m_slot_table[i]->setSelectionBehavior(QAbstractItemView::SelectRows);
m_slot_table[i]->setSortingEnabled(true);
m_slot_table[i]->horizontalHeader()->setHighlightSections(false); m_slot_table[i]->horizontalHeader()->setHighlightSections(false);
m_slot_table[i]->horizontalHeader()->setMinimumSectionSize(0); m_slot_table[i]->horizontalHeader()->setMinimumSectionSize(0);
m_slot_table[i]->horizontalHeader()->setSortIndicatorShown(true);
m_slot_table[i]->setColumnCount(COLUMN_COUNT); m_slot_table[i]->setColumnCount(COLUMN_COUNT);
m_slot_table[i]->setHorizontalHeaderItem(COLUMN_INDEX_BANNER, m_slot_table[i]->setHorizontalHeaderItem(COLUMN_INDEX_BANNER,
new QTableWidgetItem(tr("Banner"))); new QTableWidgetItem(tr("Banner")));
@ -241,11 +243,11 @@ void GCMemcardManager::UpdateSlotTable(int slot)
auto& memcard = m_slot_memcard[slot]; auto& memcard = m_slot_memcard[slot];
auto* table = m_slot_table[slot]; auto* table = m_slot_table[slot];
table->setSortingEnabled(false);
const u8 num_files = memcard->GetNumFiles(); const u8 num_files = memcard->GetNumFiles();
const u8 free_files = Memcard::DIRLEN - num_files; const u8 free_files = Memcard::DIRLEN - num_files;
const u16 free_blocks = memcard->GetFreeBlocks(); const u16 free_blocks = memcard->GetFreeBlocks();
m_slot_active_icons[slot].reserve(num_files);
table->setRowCount(num_files); table->setRowCount(num_files);
for (int i = 0; i < num_files; i++) for (int i = 0; i < num_files; i++)
{ {
@ -264,10 +266,11 @@ void GCMemcardManager::UpdateSlotTable(int slot)
auto* item_banner = new QTableWidgetItem(); auto* item_banner = new QTableWidgetItem();
auto* item_text = new QTableWidgetItem(QStringLiteral("%1\n%2").arg(title, comment)); auto* item_text = new QTableWidgetItem(QStringLiteral("%1\n%2").arg(title, comment));
auto* item_icon = new QTableWidgetItem(); auto* item_icon = new QTableWidgetItem();
auto* item_blocks = new QTableWidgetItem(QString::number(block_count)); auto* item_blocks = new QTableWidgetItem();
item_banner->setData(Qt::DecorationRole, banner); item_banner->setData(Qt::DecorationRole, banner);
item_icon->setData(Qt::DecorationRole, icon_data.m_frames[0]); item_icon->setData(Qt::DecorationRole, icon_data.m_frames[0]);
item_blocks->setData(Qt::DisplayRole, block_count);
for (auto* item : {item_banner, item_text, item_icon, item_blocks}) for (auto* item : {item_banner, item_text, item_icon, item_blocks})
{ {
@ -275,7 +278,7 @@ void GCMemcardManager::UpdateSlotTable(int slot)
item->setData(Qt::UserRole, static_cast<int>(file_index)); item->setData(Qt::UserRole, static_cast<int>(file_index));
} }
m_slot_active_icons[slot].emplace_back(std::move(icon_data)); m_slot_active_icons[slot].emplace(file_index, std::move(icon_data));
table->setItem(i, COLUMN_INDEX_BANNER, item_banner); table->setItem(i, COLUMN_INDEX_BANNER, item_banner);
table->setItem(i, COLUMN_INDEX_TEXT, item_text); table->setItem(i, COLUMN_INDEX_TEXT, item_text);
@ -287,6 +290,8 @@ void GCMemcardManager::UpdateSlotTable(int slot)
const QString free_files_string = tr("Free Files: %1").arg(free_files); const QString free_files_string = tr("Free Files: %1").arg(free_files);
m_slot_stat_label[slot]->setText( m_slot_stat_label[slot]->setText(
QStringLiteral("%1 %2").arg(free_blocks_string, free_files_string)); QStringLiteral("%1 %2").arg(free_blocks_string, free_files_string));
table->setSortingEnabled(true);
} }
void GCMemcardManager::UpdateActions() void GCMemcardManager::UpdateActions()
@ -670,19 +675,34 @@ void GCMemcardManager::DrawIcons()
const int column = COLUMN_INDEX_ICON; const int column = COLUMN_INDEX_ICON;
for (int slot = 0; slot < SLOT_COUNT; slot++) for (int slot = 0; slot < SLOT_COUNT; slot++)
{ {
// skip loop if the table is empty QTableWidget* table = m_slot_table[slot];
if (m_slot_table[slot]->rowCount() <= 0) const int row_count = table->rowCount();
if (row_count <= 0)
continue; continue;
const auto viewport = m_slot_table[slot]->viewport(); const auto viewport = table->viewport();
u32 row = m_slot_table[slot]->indexAt(viewport->rect().topLeft()).row(); const int viewport_first_row = table->indexAt(viewport->rect().topLeft()).row();
const auto max_table_index = m_slot_table[slot]->indexAt(viewport->rect().bottomLeft()); if (viewport_first_row >= row_count)
const u32 max_row = continue;
max_table_index.row() < 0 ? (m_slot_table[slot]->rowCount() - 1) : max_table_index.row();
for (; row <= max_row; row++) const int first_row = viewport_first_row < 0 ? 0 : viewport_first_row;
const int viewport_last_row = table->indexAt(viewport->rect().bottomLeft()).row();
const int last_row =
viewport_last_row < 0 ? (row_count - 1) : std::min(viewport_last_row, row_count - 1);
for (int row = first_row; row <= last_row; ++row)
{ {
const auto& icon = m_slot_active_icons[slot][row]; auto* item = table->item(row, column);
if (!item)
continue;
const u8 index = static_cast<u8>(item->data(Qt::UserRole).toInt());
auto it = m_slot_active_icons[slot].find(index);
if (it == m_slot_active_icons[slot].end())
continue;
const auto& icon = it->second;
// this icon doesn't have an animation // this icon doesn't have an animation
if (icon.m_frames.size() <= 1) if (icon.m_frames.size() <= 1)
@ -696,7 +716,6 @@ void GCMemcardManager::DrawIcons()
if (prev_frame == current_frame) if (prev_frame == current_frame)
continue; continue;
auto* item = m_slot_table[slot]->item(row, column);
item->setData(Qt::DecorationRole, icon.m_frames[current_frame]); item->setData(Qt::DecorationRole, icon.m_frames[current_frame]);
} }
} }

View File

@ -5,6 +5,7 @@
#pragma once #pragma once
#include <array> #include <array>
#include <map>
#include <memory> #include <memory>
#include <utility> #include <utility>
#include <vector> #include <vector>
@ -88,7 +89,7 @@ private:
// Slots // Slots
static constexpr int SLOT_COUNT = 2; static constexpr int SLOT_COUNT = 2;
std::array<std::vector<IconAnimationData>, SLOT_COUNT> m_slot_active_icons; std::array<std::map<u8, IconAnimationData>, SLOT_COUNT> m_slot_active_icons;
std::array<std::unique_ptr<Memcard::GCMemcard>, SLOT_COUNT> m_slot_memcard; std::array<std::unique_ptr<Memcard::GCMemcard>, SLOT_COUNT> m_slot_memcard;
std::array<QGroupBox*, SLOT_COUNT> m_slot_group; std::array<QGroupBox*, SLOT_COUNT> m_slot_group;
std::array<QLineEdit*, SLOT_COUNT> m_slot_file_edit; std::array<QLineEdit*, SLOT_COUNT> m_slot_file_edit;