Files
thunderpad/src/layout_edit.cpp

215 lines
7.5 KiB
C++

#include "layout_edit.h"
#include "config.h"
//build the dialog
LayoutEdit::LayoutEdit( LayoutManager* l )
: QWidget(0),
lm(l),
mainLayout(0),
padStack(0),
joyButtons(0),
cmbLayouts(0),
btnAdd(0),
btnRem(0),
btnUpd(0),
btnRev(0),
btnExport(0),
btnImport(0),
btnRename(0) {
setAttribute(Qt::WA_DeleteOnClose);
setWindowTitle( QJOYPAD_NAME );
setWindowIcon(QPixmap(QJOYPAD_ICON64));
mainLayout = new QVBoxLayout(this);
mainLayout->setSpacing(5);
mainLayout->setMargin(5);
QFrame* frame = new QFrame(this);
frame->setFrameStyle(QFrame::Box | QFrame::Sunken);
QGridLayout* g = new QGridLayout(frame);
g->setMargin(5);
g->setSpacing(5);
cmbLayouts = new QComboBox(frame);
connect(cmbLayouts, SIGNAL(activated(int)), this, SLOT(load(int)));
QHBoxLayout *layoutLayout = new QHBoxLayout(this);
//most of these buttons can link directly into slots in the LayoutManager
btnAdd = new QPushButton(frame);
btnAdd->setIcon(QIcon::fromTheme("list-add"));
btnAdd->setToolTip(tr("Add Layout"));
if (btnAdd->icon().isNull()) {
btnAdd->setText("+");
}
btnAdd->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
connect(btnAdd, SIGNAL(clicked()), lm, SLOT(saveAs()));
btnRem = new QPushButton(frame);
btnRem->setIcon(QIcon::fromTheme("list-remove"));
if (btnRem->icon().isNull()) {
btnRem->setText("-");
}
btnRem->setToolTip(tr("Remove Layout"));
btnRem->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
connect(btnRem, SIGNAL(clicked()), lm, SLOT(remove()));
btnRename = new QPushButton(tr("&Rename"), frame);
btnRename->setToolTip(tr("Rename Layout"));
btnRename->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
connect(btnRename, SIGNAL(clicked()), lm, SLOT(rename()));
layoutLayout->addWidget(cmbLayouts);
layoutLayout->addWidget(btnAdd);
layoutLayout->addWidget(btnRem);
layoutLayout->addWidget(btnRename);
mainLayout->addLayout(layoutLayout);
btnImport = new QPushButton(QIcon::fromTheme("document-open"), tr("&Import"), frame);
connect(btnImport, SIGNAL(clicked()), lm, SLOT(importLayout()));
g->addWidget(btnImport,1,0);
btnExport = new QPushButton(QIcon::fromTheme("document-save-as"), tr("E&xport"), frame);
connect(btnExport, SIGNAL(clicked()), lm, SLOT(exportLayout()));
g->addWidget(btnExport,1,1);
btnUpd = new QPushButton(QIcon::fromTheme("document-save"), tr("&Save"), frame);
connect(btnUpd, SIGNAL(clicked()), lm, SLOT(save()));
g->addWidget(btnUpd,1,2);
btnRev = new QPushButton(QIcon::fromTheme("document-revert"), tr("Re&vert"), frame);
connect(btnRev, SIGNAL(clicked()), lm, SLOT(reload()));
g->addWidget(btnRev,1,3);
mainLayout->addWidget( frame );
//produce a list of names for the FlashRadioArray
//this is only necesary since joystick devices need not always be
//contiguous
QStringList names;
foreach (JoyPad *joypad, lm->available) {
names.append(joypad->getName());
connect(this, SIGNAL(focusStateChanged(bool)), joypad, SLOT(focusChange(bool)));
}
//flash radio array
joyButtons = new FlashRadioArray(names, true, this );
mainLayout->addWidget( joyButtons );
//we have a WidgetStack to represent the multiple joypads
padScroll = new QScrollArea(this);
padScroll->setWidgetResizable(true);
mainLayout->addWidget(padScroll);
padStack = new QStackedWidget( this );
padStack->setFrameStyle(QFrame::Box | QFrame::Sunken );
padScroll->setWidget(padStack);
//go through each of the available joysticks
// i is the current index into PadStack
int i = 0;
foreach (JoyPad *joypad, lm->available) {
//add a new JoyPadWidget to the stack
padStack->insertWidget( i, joypad->widget(padStack,i) );
//every time it "flashes", flash the associated tab.
connect( padStack->widget(i), SIGNAL( flashed( int ) ), joyButtons, SLOT( flash( int )));
++i;
}
//whenever a new tab is selected, raise the appropriate JoyPadWidget
connect( joyButtons, SIGNAL( changed( int ) ), padStack, SLOT( setCurrentIndex( int )));
updateLayoutList();
//add the buttons at the bottom.
QHBoxLayout* h = new QHBoxLayout(this);
h->setMargin(0);
h->setSpacing(5);
QPushButton* close = new QPushButton(QIcon::fromTheme("window-close"), tr("&Close Dialog"), this );
connect(close, SIGNAL(clicked()), this, SLOT(close()));
h->addWidget(close);
QPushButton* quit = new QPushButton(QIcon::fromTheme("application-exit"), tr("&Quit"), this );
connect( quit, SIGNAL( clicked() ), qApp, SLOT(quit()));
h->addWidget(quit);
mainLayout->addLayout(h);
connect(qApp, SIGNAL(focusChanged ( QWidget * , QWidget * ) ), this,
SLOT(appFocusChanged(QWidget *, QWidget *)));
this->show();
}
void LayoutEdit::setLayout(const QString &layout) {
//change the selection
for (int i = 0; i < cmbLayouts->count(); ++ i) {
if (cmbLayouts->itemData(i).toString() == layout) {
cmbLayouts->setCurrentIndex(i);
break;
}
}
bool hasLayout = !layout.isNull();
btnRem->setEnabled(hasLayout);
btnRename->setEnabled(hasLayout);
//update all the JoyPadWidgets.
for (int i = 0, n = lm->available.count(); i < n; i++) {
((JoyPadWidget*)padStack->widget(i))->update();
}
}
void LayoutEdit::updateLayoutList() {
//blank the list, then load in new names from the LayoutManager.
cmbLayouts->clear();
cmbLayouts->addItem(tr("[NO LAYOUT]"), QVariant(QString::null));
if (lm->currentLayout.isNull()) {
cmbLayouts->setCurrentIndex(0);
}
foreach (const QString& layout, lm->getLayoutNames()) {
cmbLayouts->addItem(layout, layout);
if (layout == lm->currentLayout) {
cmbLayouts->setCurrentIndex(cmbLayouts->count() - 1);
}
}
}
void LayoutEdit::updateJoypadWidgets() {
int indexOfFlashRadio = mainLayout->indexOf(joyButtons);
FlashRadioArray *newJoyButtons;
QStringList names;
foreach (JoyPad *joypad, lm->available) {
names.append(joypad->getName());
}
newJoyButtons = new FlashRadioArray( names, true, this );
mainLayout->insertWidget(indexOfFlashRadio, newJoyButtons);
mainLayout->removeWidget(joyButtons);
FlashRadioArray* oldJoyButtons = joyButtons;
joyButtons = newJoyButtons;
connect( joyButtons, SIGNAL( changed( int ) ), padStack, SLOT( setCurrentIndex( int )));
oldJoyButtons->deleteLater();
int numberOfJoypads = padStack->count();
for(int i = 0; i<numberOfJoypads; i++) {
padStack->removeWidget(padStack->widget(0));
}
int i = 0;
foreach (JoyPad *joypad, lm->available) {
//add a new JoyPadWidget to the stack
padStack->insertWidget( i, joypad->widget(padStack,i) );
//every time it "flashes", flash the associated tab.
connect( padStack->widget(i), SIGNAL( flashed( int ) ), joyButtons, SLOT( flash( int )));
++i;
}
}
void LayoutEdit::appFocusChanged(QWidget *old, QWidget *now) {
if (now != NULL && old == NULL) {
emit focusStateChanged(false);
} else if(old != NULL && now == NULL) {
emit focusStateChanged(true);
foreach (JoyPad *joypad, lm->available) {
debug_mesg("iterating and releasing\n");
joypad->release();
}
debug_mesg("done releasing!\n");
}
}
void LayoutEdit::load(int index) {
lm->load(cmbLayouts->itemData(index).toString());
}