diff options
author | Arno <am@disconnect.de> | 2010-05-10 18:48:31 +0200 |
---|---|---|
committer | Arno <am@disconnect.de> | 2010-05-10 18:48:31 +0200 |
commit | 8e1b2c03076b9908fbc8eafe861845c2d11bd7f0 (patch) | |
tree | 5e6c563853b38211c00f5026308660af5957b9f7 /programconfigurator.cpp | |
parent | 9f0caecf7875f998dc9c85d4f35f985335222d67 (diff) | |
download | SheMov-8e1b2c03076b9908fbc8eafe861845c2d11bd7f0.tar.gz SheMov-8e1b2c03076b9908fbc8eafe861845c2d11bd7f0.tar.bz2 SheMov-8e1b2c03076b9908fbc8eafe861845c2d11bd7f0.zip |
Redesign of ConfigurationDialog
Revamped ConfigurationDialog for more than one movie player or picture
viewers. Introduced a new widget ProgramConfigurator.
Diffstat (limited to 'programconfigurator.cpp')
-rw-r--r-- | programconfigurator.cpp | 193 |
1 files changed, 193 insertions, 0 deletions
diff --git a/programconfigurator.cpp b/programconfigurator.cpp new file mode 100644 index 0000000..a557918 --- /dev/null +++ b/programconfigurator.cpp @@ -0,0 +1,193 @@ +/* + 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 <QPushButton> +#include <QComboBox> +#include <QLineEdit> +#include <QLabel> +#include <QGridLayout> +#include <QHBoxLayout> +#include <QCompleter> +#include <QSettings> +#include <QDirModel> +#include <QMessageBox> +#include <QRegExp> +#include <QFileInfo> + +#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); + /*QString defaultProg; + QSettings s; + QString settingsString = QString("programs_%1/default").arg(mPrefix);*/ + 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("Upadate")); + 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); + connect(mProgramSelector, SIGNAL(currentIndexChanged(QString)), this, SLOT(programChanged(QString))); + connect(mAdd, SIGNAL(clicked()), this, SLOT(addProgram())); + connect(mRemove, SIGNAL(clicked()), this, SLOT(removeProgram())); + 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<QString, QVariant> 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<QString, QVariant> newData; + newData.insert("path", prog); + newData.insert("args", args(mArgumentsEdit->text())); + mData.insert(name, newData); + mProgramSelector->addItem(name); +} + +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<QString, QVariant> data = mData.value(name).toHash(); + if(data.isEmpty()){ + return; + } + QString path = mPathEdit->text(); + if(!isValid(path)){ + return; + } + QStringList arguments = args(mArgumentsEdit->text()); + QHash<QString, QVariant> 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); +} |