GameControllerMappingDialog::GameControllerMappingDialog(InputDevice *device, QWidget *parent) :
    QDialog(parent),
    ui(new Ui::GameControllerMappingDialog)
{
    ui->setupUi(this);
    setAttribute(Qt::WA_DeleteOnClose);

    this->device = device;

    device->getActiveSetJoystick()->setIgnoreEventState(true);
    device->getActiveSetJoystick()->release();

    GameController *controller = qobject_cast<GameController*>(device);
    if (controller)
    {
        populateGameControllerBindings(controller);
        ui->mappingStringPlainTextEdit->document()->setPlainText(generateSDLMappingString());
    }

    QString tempWindowTitle = QString(tr("Game Controller Mapping (%1)")).arg(device->getSDLName());
    setWindowTitle(tempWindowTitle);

    enableDeviceConnections();

    ui->buttonMappingTableWidget->setCurrentCell(0, 0);

    connect(device, SIGNAL(destroyed()), this, SLOT(obliterate()));
    connect(ui->buttonBox, SIGNAL(accepted()), this, SLOT(saveChanges()));
    connect(ui->buttonBox, SIGNAL(clicked(QAbstractButton*)), this, SLOT(discardMapping(QAbstractButton*)));
    connect(this, SIGNAL(finished(int)), this, SLOT(enableButtonEvents(int)));
}
void GameControllerMappingDialog::buttonAssign(int buttonindex)
{
    if (ui->buttonMappingTableWidget->currentRow() > -1 && buttonGrabs == 0)
    {
        QTableWidgetItem* item = ui->buttonMappingTableWidget->currentItem();
        int column = ui->buttonMappingTableWidget->currentColumn();
        int row = ui->buttonMappingTableWidget->currentRow();

        if (row < 17)
        {
            if (!item)
            {
                item = new QTableWidgetItem(QString("Button %1").arg(buttonindex+1));
                ui->buttonMappingTableWidget->setItem(row, column, item);
            }

            QList<QVariant> templist;
            templist.append(QVariant(0));
            templist.append(QVariant(buttonindex));
            QAbstractItemModel *model = ui->buttonMappingTableWidget->model();
            QModelIndexList matchlist = model->match(model->index(0,0), Qt::UserRole, templist, 1, Qt::MatchExactly);
            foreach (const QModelIndex &index, matchlist) {
                QTableWidgetItem *existingItem = ui->buttonMappingTableWidget->item(index.row(), index.column());
                if (existingItem)
                {
                    existingItem->setText("");
                    existingItem->setData(Qt::UserRole, QVariant());
                }
            }

            QList<QVariant> tempvalue;
            tempvalue.append(QVariant(0));
            tempvalue.append(QVariant(buttonindex));

            item->setData(Qt::UserRole, tempvalue);
            item->setText(QString("Button %1").arg(buttonindex+1));

            if (row < ui->buttonMappingTableWidget->rowCount()-1)
            {
                ui->buttonMappingTableWidget->setCurrentCell(row+1, column);
            }

            ui->mappingStringPlainTextEdit->document()->setPlainText(generateSDLMappingString());
        }