From 8e1b2c03076b9908fbc8eafe861845c2d11bd7f0 Mon Sep 17 00:00:00 2001 From: Arno Date: Mon, 10 May 2010 18:48:31 +0200 Subject: Redesign of ConfigurationDialog Revamped ConfigurationDialog for more than one movie player or picture viewers. Introduced a new widget ProgramConfigurator. --- programconfigurator.cpp | 193 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 193 insertions(+) create mode 100644 programconfigurator.cpp (limited to 'programconfigurator.cpp') 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 +#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); + /*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 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); +} + +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); +} -- cgit v1.2.3-70-g09d2