o cleanup
This commit is contained in:
174
tools/bsnes/ui_qt/settings/input.cpp
Executable file
174
tools/bsnes/ui_qt/settings/input.cpp
Executable file
@@ -0,0 +1,174 @@
|
||||
void InputSettingsWindow::setup() {
|
||||
panel = new QWidget;
|
||||
|
||||
layout = new QVBoxLayout;
|
||||
layout->setMargin(0);
|
||||
layout->setSpacing(0);
|
||||
|
||||
title = new QLabel("Input Configuration Editor");
|
||||
title->setProperty("class", "title");
|
||||
layout->addWidget(title);
|
||||
|
||||
selection = new QHBoxLayout; {
|
||||
port = new QComboBox;
|
||||
port->addItem("Controller Port 1");
|
||||
port->addItem("Controller Port 2");
|
||||
port->addItem("User Interface");
|
||||
selection->addWidget(port);
|
||||
|
||||
device = new QComboBox;
|
||||
selection->addWidget(device);
|
||||
}
|
||||
selection->setSpacing(Style::WidgetSpacing);
|
||||
layout->addLayout(selection);
|
||||
layout->addSpacing(Style::WidgetSpacing);
|
||||
|
||||
list = new QTreeWidget;
|
||||
list->setColumnCount(3);
|
||||
list->setHeaderLabels(QStringList() << "Hidden" << "Name" << "Assignment");
|
||||
list->hideColumn(0); //used for default sorting + hides child expansion box
|
||||
layout->addWidget(list);
|
||||
layout->addSpacing(Style::WidgetSpacing);
|
||||
|
||||
controls = new QHBoxLayout; {
|
||||
assign = new QPushButton("Assign ...");
|
||||
controls->addWidget(assign);
|
||||
|
||||
assignAll = new QPushButton("Assign All ...");
|
||||
controls->addWidget(assignAll);
|
||||
|
||||
unassign = new QPushButton("Unassign");
|
||||
controls->addWidget(unassign);
|
||||
}
|
||||
controls->setSpacing(Style::WidgetSpacing);
|
||||
layout->addLayout(controls);
|
||||
|
||||
panel->setLayout(layout);
|
||||
connect(port, SIGNAL(currentIndexChanged(int)), this, SLOT(portChanged()));
|
||||
connect(device, SIGNAL(currentIndexChanged(int)), this, SLOT(reloadList()));
|
||||
connect(list, SIGNAL(itemActivated(QTreeWidgetItem*, int)), this, SLOT(assignKey()));
|
||||
connect(list, SIGNAL(itemSelectionChanged()), this, SLOT(listChanged()));
|
||||
connect(assign, SIGNAL(released()), this, SLOT(assignKey()));
|
||||
connect(assignAll, SIGNAL(released()), this, SLOT(assignAllKeys()));
|
||||
connect(unassign, SIGNAL(released()), this, SLOT(unassignKey()));
|
||||
|
||||
portChanged();
|
||||
}
|
||||
|
||||
void InputSettingsWindow::syncUi() {
|
||||
QList<QTreeWidgetItem*> itemList = list->selectedItems();
|
||||
assign->setEnabled(itemList.count() == 1);
|
||||
//allow rapid assign for controllers from both ports, but not for UI shortcuts
|
||||
assignAll->setEnabled(port->currentIndex() < 2);
|
||||
unassign->setEnabled(itemList.count() == 1);
|
||||
}
|
||||
|
||||
//when port combobox item is changed, device list needs to be repopulated
|
||||
void InputSettingsWindow::portChanged() {
|
||||
disconnect(device, SIGNAL(currentIndexChanged(int)), this, SLOT(reloadList()));
|
||||
|
||||
device->clear();
|
||||
deviceItem.reset();
|
||||
|
||||
int index = port->currentIndex();
|
||||
if(index < 2) {
|
||||
//this is a controller port
|
||||
for(unsigned i = 0; i < inputPool.size(); i++) {
|
||||
//only add devices for selected port
|
||||
if(inputPool[i]->port == index) {
|
||||
device->addItem(inputPool[i]->name);
|
||||
deviceItem.add(inputPool[i]);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
//user interface controls
|
||||
for(unsigned i = 0; i < inputUiPool.size(); i++) {
|
||||
device->addItem(inputUiPool[i]->name);
|
||||
deviceItem.add(inputUiPool[i]);
|
||||
}
|
||||
}
|
||||
|
||||
reloadList();
|
||||
connect(device, SIGNAL(currentIndexChanged(int)), this, SLOT(reloadList()));
|
||||
}
|
||||
|
||||
//when device combobox item is changed, object list needs to be repopulated
|
||||
void InputSettingsWindow::reloadList() {
|
||||
list->clear();
|
||||
list->setSortingEnabled(false);
|
||||
listItem.reset();
|
||||
|
||||
int index = device->currentIndex();
|
||||
if(index < deviceItem.size()) {
|
||||
InputGroup &group = *deviceItem[index];
|
||||
for(unsigned i = 0; i < group.size(); i++) {
|
||||
QTreeWidgetItem *item = new QTreeWidgetItem(list);
|
||||
item->setText(0, utf8() << (int)(1000000 + i));
|
||||
item->setText(1, group[i]->name);
|
||||
item->setText(2, (const char*)group[i]->id);
|
||||
listItem.add(item);
|
||||
}
|
||||
}
|
||||
|
||||
list->setSortingEnabled(true);
|
||||
list->sortByColumn(0, Qt::AscendingOrder); //set default sorting on list change, overriding user setting
|
||||
list->resizeColumnToContents(1); //shrink name column
|
||||
syncUi();
|
||||
}
|
||||
|
||||
void InputSettingsWindow::listChanged() {
|
||||
syncUi();
|
||||
}
|
||||
|
||||
//InputCaptureWindow calls this after a successful key assignment change:
|
||||
//need to update list of values to show new key assignment value.
|
||||
void InputSettingsWindow::updateList() {
|
||||
int index = device->currentIndex();
|
||||
if(index < deviceItem.size()) {
|
||||
InputGroup &group = *deviceItem[index];
|
||||
|
||||
for(unsigned i = 0; i < listItem.size(); i++) {
|
||||
listItem[i]->setText(2, (const char*)group[i]->id);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void InputSettingsWindow::assignKey() {
|
||||
int index = device->currentIndex();
|
||||
if(index < deviceItem.size()) {
|
||||
InputGroup &group = *deviceItem[index];
|
||||
|
||||
QTreeWidgetItem *item = list->currentItem();
|
||||
if(item && item->isSelected()) {
|
||||
signed i = listItem.find(item);
|
||||
if(i >= 0) winInputCapture->activate(group[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void InputSettingsWindow::assignAllKeys() {
|
||||
int index = port->currentIndex();
|
||||
if(index < 2) {
|
||||
index = device->currentIndex();
|
||||
if(index < deviceItem.size()) {
|
||||
winInputCapture->activate(deviceItem[index]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void InputSettingsWindow::unassignKey() {
|
||||
int index = device->currentIndex();
|
||||
if(index < deviceItem.size()) {
|
||||
InputGroup &group = *deviceItem[index];
|
||||
|
||||
QTreeWidgetItem *item = list->currentItem();
|
||||
if(item && item->isSelected()) {
|
||||
signed i = listItem.find(item);
|
||||
if(i >= 0) {
|
||||
group[i]->id = "none";
|
||||
inputManager.bind(); //update key bindings to reflect object ID change above
|
||||
item->setText(2, (const char*)group[i]->id);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user