215 lines
7.5 KiB
C++
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());
|
|
}
|