selectdiscdialog.cpp (2837B)
1 // SPDX-FileCopyrightText: 2019-2023 Connor McLaughlin <stenzek@gmail.com> 2 // SPDX-License-Identifier: (GPL-3.0 OR CC-BY-NC-ND-4.0) 3 4 #include "selectdiscdialog.h" 5 #include "qtutils.h" 6 7 #include "core/game_list.h" 8 9 #include "common/assert.h" 10 #include "common/path.h" 11 12 #include <QtWidgets/QTreeWidget> 13 14 SelectDiscDialog::SelectDiscDialog(const std::string& disc_set_name, QWidget* parent /* = nullptr */) : QDialog(parent) 15 { 16 m_ui.setupUi(this); 17 populateList(disc_set_name); 18 updateStartEnabled(); 19 20 connect(m_ui.select, &QPushButton::clicked, this, &SelectDiscDialog::onSelectClicked); 21 connect(m_ui.cancel, &QPushButton::clicked, this, &SelectDiscDialog::onCancelClicked); 22 connect(m_ui.discList, &QTreeWidget::itemActivated, this, &SelectDiscDialog::onListItemActivated); 23 connect(m_ui.discList, &QTreeWidget::itemSelectionChanged, this, &SelectDiscDialog::updateStartEnabled); 24 } 25 26 SelectDiscDialog::~SelectDiscDialog() = default; 27 28 void SelectDiscDialog::resizeEvent(QResizeEvent* ev) 29 { 30 QDialog::resizeEvent(ev); 31 32 QtUtils::ResizeColumnsForTreeView(m_ui.discList, {50, -1, 100}); 33 } 34 35 void SelectDiscDialog::onListItemActivated(const QTreeWidgetItem* item) 36 { 37 if (!item) 38 return; 39 40 m_selected_path = item->data(0, Qt::UserRole).toString().toStdString(); 41 done(1); 42 } 43 44 void SelectDiscDialog::updateStartEnabled() 45 { 46 const QList<QTreeWidgetItem*> items = m_ui.discList->selectedItems(); 47 m_ui.select->setEnabled(!items.isEmpty()); 48 if (!items.isEmpty()) 49 m_selected_path = items.first()->data(0, Qt::UserRole).toString().toStdString(); 50 else 51 m_selected_path = {}; 52 } 53 54 void SelectDiscDialog::onSelectClicked() 55 { 56 done(1); 57 } 58 59 void SelectDiscDialog::onCancelClicked() 60 { 61 done(0); 62 } 63 64 void SelectDiscDialog::populateList(const std::string& disc_set_name) 65 { 66 const auto lock = GameList::GetLock(); 67 const std::vector<const GameList::Entry*> entries = GameList::GetDiscSetMembers(disc_set_name); 68 const GameList::Entry* last_played_entry = nullptr; 69 70 for (const GameList::Entry* entry : entries) 71 { 72 QTreeWidgetItem* item = new QTreeWidgetItem(); 73 item->setData(0, Qt::UserRole, QString::fromStdString(entry->path)); 74 item->setIcon(0, QtUtils::GetIconForEntryType(GameList::EntryType::Disc)); 75 item->setText(0, QString::number(entry->disc_set_index + 1)); 76 item->setText(1, QtUtils::StringViewToQString(Path::GetFileName(entry->path))); 77 item->setText(2, QtUtils::StringViewToQString(GameList::FormatTimestamp(entry->last_played_time))); 78 m_ui.discList->addTopLevelItem(item); 79 80 if (!last_played_entry || 81 (entry->last_played_time > 0 && entry->last_played_time > last_played_entry->last_played_time)) 82 { 83 last_played_entry = entry; 84 m_ui.discList->setCurrentItem(item); 85 } 86 } 87 88 setWindowTitle(tr("Select Disc for %1").arg(QString::fromStdString(disc_set_name))); 89 }