duckstation

duckstation, but archived from the revision just before upstream changed it to a proprietary software project, this version is the libre one
git clone https://git.neptards.moe/u3shit/duckstation.git
Log | Files | Refs | README | LICENSE

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 }