mirror of
https://github.com/RPCSX/rpcsx.git
synced 2025-12-06 07:12:14 +01:00
168 lines
5.8 KiB
C++
168 lines
5.8 KiB
C++
#include "vfs_dialog_usb_tab.h"
|
|
#include "vfs_dialog_usb_input.h"
|
|
#include "table_item_delegate.h"
|
|
#include "Utilities/Config.h"
|
|
|
|
#include <QVBoxLayout>
|
|
#include <QHeaderView>
|
|
#include <QScrollBar>
|
|
#include <QMenu>
|
|
|
|
constexpr int max_usb_devices = 8;
|
|
|
|
const auto get_device_info = [](const QString& device_name, const cfg::map_of_type<cfg::device_info>& device_map) -> cfg::device_info
|
|
{
|
|
if (auto it = device_map.find(device_name.toStdString()); it != device_map.cend())
|
|
{
|
|
return it->second;
|
|
}
|
|
|
|
return {};
|
|
};
|
|
|
|
const auto get_device_name = [](int i) -> QString
|
|
{
|
|
return QString("/dev_usb00%0").arg(i);
|
|
};
|
|
|
|
enum usb_column : int
|
|
{
|
|
usb_name = 0,
|
|
usb_path = 1,
|
|
usb_vid = 2,
|
|
usb_pid = 3,
|
|
usb_serial = 4
|
|
};
|
|
|
|
vfs_dialog_usb_tab::vfs_dialog_usb_tab(cfg::device_entry* cfg_node, std::shared_ptr<gui_settings> _gui_settings, QWidget* parent)
|
|
: QWidget(parent), m_cfg_node(cfg_node), m_gui_settings(std::move(_gui_settings))
|
|
{
|
|
m_usb_table = new QTableWidget(this);
|
|
m_usb_table->setItemDelegate(new table_item_delegate(this, false));
|
|
m_usb_table->setShowGrid(false);
|
|
m_usb_table->setSelectionBehavior(QAbstractItemView::SelectRows);
|
|
m_usb_table->setEditTriggers(QAbstractItemView::NoEditTriggers);
|
|
m_usb_table->setContextMenuPolicy(Qt::CustomContextMenu);
|
|
m_usb_table->setVerticalScrollMode(QAbstractItemView::ScrollPerPixel);
|
|
m_usb_table->setHorizontalScrollMode(QAbstractItemView::ScrollPerPixel);
|
|
m_usb_table->verticalScrollBar()->setSingleStep(20);
|
|
m_usb_table->horizontalScrollBar()->setSingleStep(10);
|
|
m_usb_table->setColumnCount(5);
|
|
m_usb_table->setHorizontalHeaderLabels(QStringList() << tr("Device") << tr("Path") << tr("Vendor ID") << tr("Product ID") << tr("Serial"));
|
|
m_usb_table->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Fixed);
|
|
m_usb_table->horizontalHeader()->setStretchLastSection(true);
|
|
m_usb_table->setRowCount(max_usb_devices);
|
|
|
|
for (int i = 0; i < max_usb_devices; i++)
|
|
{
|
|
const QString device_name = get_device_name(i);
|
|
const cfg::device_info info = get_device_info(device_name, m_cfg_node->get_map());
|
|
|
|
m_usb_table->setItem(i, usb_column::usb_name, new QTableWidgetItem(device_name));
|
|
m_usb_table->setItem(i, usb_column::usb_path, new QTableWidgetItem(QString::fromStdString(info.path)));
|
|
m_usb_table->setItem(i, usb_column::usb_vid, new QTableWidgetItem(QString::fromStdString(info.vid)));
|
|
m_usb_table->setItem(i, usb_column::usb_pid, new QTableWidgetItem(QString::fromStdString(info.pid)));
|
|
m_usb_table->setItem(i, usb_column::usb_serial, new QTableWidgetItem(QString::fromStdString(info.serial)));
|
|
}
|
|
|
|
m_usb_table->resizeColumnsToContents();
|
|
|
|
connect(m_usb_table, &QTableWidget::customContextMenuRequested, this, &vfs_dialog_usb_tab::show_context_menu);
|
|
connect(m_usb_table, &QTableWidget::itemDoubleClicked, this, &vfs_dialog_usb_tab::double_clicked_slot);
|
|
|
|
QVBoxLayout* vbox = new QVBoxLayout;
|
|
vbox->addWidget(m_usb_table);
|
|
|
|
setLayout(vbox);
|
|
}
|
|
|
|
void vfs_dialog_usb_tab::set_settings() const
|
|
{
|
|
cfg::map_of_type<cfg::device_info> device_map{};
|
|
|
|
for (int i = 0; i < max_usb_devices; i++)
|
|
{
|
|
cfg::device_info info{};
|
|
|
|
info.path = m_usb_table->item(i, usb_column::usb_path)->text().toStdString();
|
|
info.vid = m_usb_table->item(i, usb_column::usb_vid)->text().toStdString();
|
|
info.pid = m_usb_table->item(i, usb_column::usb_pid)->text().toStdString();
|
|
info.serial = m_usb_table->item(i, usb_column::usb_serial)->text().toStdString();
|
|
|
|
device_map.emplace(get_device_name(i).toStdString(), std::move(info));
|
|
}
|
|
|
|
m_cfg_node->set_map(std::move(device_map));
|
|
}
|
|
|
|
void vfs_dialog_usb_tab::reset() const
|
|
{
|
|
for (int i = 0; i < max_usb_devices; i++)
|
|
{
|
|
const QString device_name = get_device_name(i);
|
|
const cfg::device_info info = get_device_info(device_name, m_cfg_node->get_default());
|
|
|
|
m_usb_table->item(i, usb_column::usb_path)->setText(QString::fromStdString(info.path));
|
|
m_usb_table->item(i, usb_column::usb_vid)->setText(QString::fromStdString(info.vid));
|
|
m_usb_table->item(i, usb_column::usb_pid)->setText(QString::fromStdString(info.pid));
|
|
m_usb_table->item(i, usb_column::usb_serial)->setText(QString::fromStdString(info.serial));
|
|
}
|
|
}
|
|
|
|
void vfs_dialog_usb_tab::show_usb_input_dialog(int index)
|
|
{
|
|
if (index < 0 || index >= max_usb_devices)
|
|
{
|
|
return;
|
|
}
|
|
|
|
const QString device_name = get_device_name(index);
|
|
const cfg::device_info default_info = get_device_info(device_name, m_cfg_node->get_default());
|
|
cfg::device_info info{};
|
|
|
|
info.path = m_usb_table->item(index, usb_column::usb_path)->text().toStdString();
|
|
info.vid = m_usb_table->item(index, usb_column::usb_vid)->text().toStdString();
|
|
info.pid = m_usb_table->item(index, usb_column::usb_pid)->text().toStdString();
|
|
info.serial = m_usb_table->item(index, usb_column::usb_serial)->text().toStdString();
|
|
|
|
vfs_dialog_usb_input* input_dialog = new vfs_dialog_usb_input(device_name, default_info, &info, m_gui_settings, this);
|
|
if (input_dialog->exec() == QDialog::Accepted)
|
|
{
|
|
m_usb_table->item(index, usb_column::usb_path)->setText(QString::fromStdString(info.path));
|
|
m_usb_table->item(index, usb_column::usb_vid)->setText(QString::fromStdString(info.vid));
|
|
m_usb_table->item(index, usb_column::usb_pid)->setText(QString::fromStdString(info.pid));
|
|
m_usb_table->item(index, usb_column::usb_serial)->setText(QString::fromStdString(info.serial));
|
|
}
|
|
input_dialog->deleteLater();
|
|
}
|
|
|
|
void vfs_dialog_usb_tab::show_context_menu(const QPoint& pos)
|
|
{
|
|
const int row = m_usb_table->indexAt(pos).row();
|
|
|
|
if (row < 0 || row >= max_usb_devices)
|
|
{
|
|
return;
|
|
}
|
|
|
|
QMenu menu{};
|
|
QAction* edit = menu.addAction(tr("&Edit"));
|
|
|
|
connect(edit, &QAction::triggered, this, [this, row]()
|
|
{
|
|
show_usb_input_dialog(row);
|
|
});
|
|
|
|
menu.exec(m_usb_table->viewport()->mapToGlobal(pos));
|
|
}
|
|
|
|
void vfs_dialog_usb_tab::double_clicked_slot(QTableWidgetItem* item)
|
|
{
|
|
if (!item)
|
|
{
|
|
return;
|
|
}
|
|
|
|
show_usb_input_dialog(item->row());
|
|
}
|