summaryrefslogtreecommitdiffstats
path: root/programconfigurator.cpp
diff options
context:
space:
mode:
authorArno <am@disconnect.de>2010-05-10 18:48:31 +0200
committerArno <am@disconnect.de>2010-05-10 18:48:31 +0200
commit8e1b2c03076b9908fbc8eafe861845c2d11bd7f0 (patch)
tree5e6c563853b38211c00f5026308660af5957b9f7 /programconfigurator.cpp
parent9f0caecf7875f998dc9c85d4f35f985335222d67 (diff)
downloadSheMov-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.cpp193
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);
+}