2009-05-12 20:05:00 +02:00

175 lines
5.4 KiB
C++
Executable File

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);
}
}
}
}