/* This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. */ #include #include #include #include #include #include #include #include #include #include #include #include #include "programconfigurator.h" ProgramConfigurator::ProgramConfigurator(const QString &prefix, const QString &description, QWidget *parent) : QWidget(parent), mPrefix(prefix), mDescription(description){ QGridLayout *mainLayout = new QGridLayout; QLabel *l1 = new QLabel(QString(tr("Select %1")).arg(mDescription)); mProgramSelector = new QComboBox; mainLayout->addWidget(l1, 0, 0); mainLayout->addWidget(mProgramSelector, 0, 1); QLabel *l2 = new QLabel(QString(tr("%1 name")).arg(mDescription)); mNameEdit = new QLineEdit; mainLayout->addWidget(l2, 1, 0); mainLayout->addWidget(mNameEdit, 1, 1); QLabel *l3 = new QLabel(QString(tr("%1 path")).arg(mDescription)); mPathEdit = new QLineEdit; QCompleter *fsCompleter = new QCompleter(this); QDirModel *dirModel = new QDirModel(this); fsCompleter->setModel(dirModel); fsCompleter->setCompletionMode(QCompleter::PopupCompletion); mPathEdit->setCompleter(fsCompleter); mainLayout->addWidget(l3, 2, 0); mainLayout->addWidget(mPathEdit, 2, 1); QLabel *l4 = new QLabel(QString(tr("%2 arguments")).arg(mDescription)); mArgumentsEdit = new QLineEdit; mainLayout->addWidget(l4, 3, 0); mainLayout->addWidget(mArgumentsEdit, 3, 1); mDefaultLabel = new QLabel; mainLayout->addWidget(mDefaultLabel, 4, 0, 1, 2, Qt::AlignCenter); mAdd = new QPushButton(tr("Add program")); mRemove = new QPushButton(tr("Remove program")); mUpdate = new QPushButton(tr("Update")); mDefault = new QPushButton(tr("Set as default")); QHBoxLayout *buttonLayout = new QHBoxLayout; buttonLayout->addStretch(); buttonLayout->addWidget(mAdd); buttonLayout->addWidget(mRemove); buttonLayout->addWidget(mUpdate); buttonLayout->addWidget(mDefault); buttonLayout->addStretch(); mainLayout->addLayout(buttonLayout, 5, 0, 1, 2, Qt::AlignCenter); QVBoxLayout *stretchLayout = new QVBoxLayout; stretchLayout->addStretch(); mainLayout->addLayout(stretchLayout, 6, 0, 1, 2); connect(mProgramSelector, SIGNAL(currentIndexChanged(QString)), this, SLOT(programChanged(QString))); connect(mAdd, SIGNAL(clicked()), this, SLOT(addProgram())); connect(mRemove, SIGNAL(clicked()), this, SLOT(removeProgram())); connect(mUpdate, SIGNAL(clicked()), this, SLOT(updateProgram())); connect(mDefault, SIGNAL(clicked()), this, SLOT(setDefault())); readSettings(); setLayout(mainLayout); } void ProgramConfigurator::writeSettings(){ QString setString = QString("programs_%1").arg(mPrefix); QString defaultString = QString("%1/default").arg(setString); QString dataString = QString("%1/data").arg(setString); QSettings s; s.setValue(defaultString, mDefautProg); s.setValue(dataString, mData); } void ProgramConfigurator::programChanged(const QString &program){ QHash data = mData.value(program).toHash(); if(data.isEmpty()){ return; } mNameEdit->setText(program); mPathEdit->setText(data.value("path").toString()); QStringList args = data.value("args").toStringList(); mArgumentsEdit->setText(args.join(" ")); } void ProgramConfigurator::addProgram(){ QString name = mNameEdit->text(); if(mData.keys().contains(name)){ QString message = QString(tr("Already have a program with name %1.")).arg(name); QMessageBox::critical(this, tr("Error"), message); return; } QString prog = mPathEdit->text(); if(!isValid(prog)){ return; } QHash newData; newData.insert("path", prog); newData.insert("args", args(mArgumentsEdit->text())); mData.insert(name, newData); mProgramSelector->addItem(name); int newIdx = mProgramSelector->findText(name); if(newIdx != -1){ mProgramSelector->setCurrentIndex(newIdx); } } void ProgramConfigurator::removeProgram(){ QString name = mProgramSelector->currentText(); if(mData.keys().contains(name)){ QString message = QString(tr("Really remove %1 from program list?")).arg(name); int retval = QMessageBox::question(this, tr("Question"), message, QMessageBox::Yes | QMessageBox::No); if(retval == QMessageBox::Yes){ mData.remove(name); } } int idx = mProgramSelector->findText(name); if(idx != -1){ mProgramSelector->removeItem(idx); } } void ProgramConfigurator::updateProgram(){ QString name = mProgramSelector->currentText(); QHash data = mData.value(name).toHash(); if(data.isEmpty()){ return; } QString path = mPathEdit->text(); if(!isValid(path)){ return; } QStringList arguments = args(mArgumentsEdit->text()); QHash newData; newData.insert("path", path); newData.insert("args", arguments); mData.remove(name); mData.insert(name, newData); } void ProgramConfigurator::setDefault(){ mDefautProg = mProgramSelector->currentText(); QString defaultLbl; if(mDefautProg.isEmpty()){ defaultLbl = QString(tr("Default is [None]")); }else{ defaultLbl = QString(tr("Default is %1")).arg(mDefautProg); } mDefaultLabel->setText(defaultLbl); } void ProgramConfigurator::readSettings(){ QString settingsPrefix = QString("programs_%1").arg(mPrefix); QString defaultString = QString("%1/default").arg(settingsPrefix); QString dataString = QString("%1/data").arg(settingsPrefix); QSettings s; mData = s.value(dataString).toHash(); QStringList progs; foreach(QString p, mData.keys()){ progs << p; } mProgramSelector->addItems(progs); mDefautProg = s.value(defaultString, tr("[None]")).toString(); int idx = mProgramSelector->findText(mDefautProg); if(idx != -1){ mProgramSelector->setCurrentIndex(idx); } setDefault(); } bool ProgramConfigurator::isValid(const QString &program){ QFileInfo progInfo(program); if(!progInfo.isExecutable()){ QString message = QString(tr("%1 is not executable.")).arg(program); QMessageBox::critical(this, tr("Error"), message); return false; } if(!progInfo.exists()){ QString message = QString(tr("Cannot find %1.")).arg(program); QMessageBox::critical(this, tr("Error"), message); return false; } return true; } QStringList ProgramConfigurator::args(const QString &argString){ if(argString.isEmpty()){ return QStringList(); } QRegExp splitter("\\s+"); return argString.split(splitter, QString::SkipEmptyParts); }