/* Copyright (C) 2005 J.F.Dockes * 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. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "confgui.h" #include "smallut.h" #include "debuglog.h" #include "rcldb.h" #include "guiutils.h" #include using std::list; namespace confgui { static const int spacing = 2; static const int margin = 2; void ConfParamW::setValue(const QString& value) { if (m_fsencoding) m_cflink->set(string((const char *)value.toLocal8Bit())); else m_cflink->set(string((const char *)value.toUtf8())); } void ConfParamW::setValue(int value) { char buf[30]; sprintf(buf, "%d", value); m_cflink->set(string(buf)); } void ConfParamW::setValue(bool value) { char buf[30]; sprintf(buf, "%d", value); m_cflink->set(string(buf)); } void setSzPol(QWidget *w, QSizePolicy::Policy hpol, QSizePolicy::Policy vpol, int hstretch, int vstretch) { QSizePolicy policy(hpol, vpol); policy.setHorizontalStretch(hstretch); policy.setVerticalStretch(vstretch); policy.setHeightForWidth(w->sizePolicy().hasHeightForWidth()); w->setSizePolicy(policy); } bool ConfParamW::createCommon(const QString& lbltxt, const QString& tltptxt) { m_hl = new QHBoxLayout(this); m_hl->setSpacing(spacing); QLabel *tl = new QLabel(this); setSzPol(tl, QSizePolicy::Preferred, QSizePolicy::Fixed, 0, 0); tl->setText(lbltxt); tl->setToolTip(tltptxt); m_hl->addWidget(tl); return true; } ConfParamIntW::ConfParamIntW(QWidget *parent, ConfLink cflink, const QString& lbltxt, const QString& tltptxt, int minvalue, int maxvalue, int defaultvalue) : ConfParamW(parent, cflink), m_defaultvalue(defaultvalue) { if (!createCommon(lbltxt, tltptxt)) return; m_sb = new QSpinBox(this); m_sb->setMinimum(minvalue); m_sb->setMaximum(maxvalue); setSzPol(m_sb, QSizePolicy::Fixed, QSizePolicy::Fixed, 0, 0); m_hl->addWidget(m_sb); QFrame *fr = new QFrame(this); setSzPol(fr, QSizePolicy::Preferred, QSizePolicy::Fixed, 0, 0); m_hl->addWidget(fr); loadValue(); QObject::connect(m_sb, SIGNAL(valueChanged(int)), this, SLOT(setValue(int))); } void ConfParamIntW::loadValue() { string s; if (m_cflink->get(s)) m_sb->setValue(atoi(s.c_str())); else m_sb->setValue(m_defaultvalue); } ConfParamStrW::ConfParamStrW(QWidget *parent, ConfLink cflink, const QString& lbltxt, const QString& tltptxt) : ConfParamW(parent, cflink) { if (!createCommon(lbltxt, tltptxt)) return; m_le = new QLineEdit(this); setSzPol(m_le, QSizePolicy::Preferred, QSizePolicy::Fixed, 1, 0); m_hl->addWidget(m_le); loadValue(); QObject::connect(m_le, SIGNAL(textChanged(const QString&)), this, SLOT(setValue(const QString&))); } void ConfParamStrW::loadValue() { string s; m_cflink->get(s); if (m_fsencoding) m_le->setText(QString::fromLocal8Bit(s.c_str())); else m_le->setText(QString::fromUtf8(s.c_str())); } ConfParamCStrW::ConfParamCStrW(QWidget *parent, ConfLink cflink, const QString& lbltxt, const QString& tltptxt, const QStringList &sl ) : ConfParamW(parent, cflink) { if (!createCommon(lbltxt, tltptxt)) return; m_cmb = new QComboBox(this); m_cmb->setEditable(FALSE); m_cmb->insertItems(0, sl); setSzPol(m_cmb, QSizePolicy::Preferred, QSizePolicy::Fixed, 1, 0); m_hl->addWidget(m_cmb); loadValue(); QObject::connect(m_cmb, SIGNAL(activated(const QString&)), this, SLOT(setValue(const QString&))); } void ConfParamCStrW::loadValue() { string s; m_cflink->get(s); QString cs; if (m_fsencoding) cs = QString::fromLocal8Bit(s.c_str()); else cs = QString::fromUtf8(s.c_str()); for (int i = 0; i < m_cmb->count(); i++) { if (!cs.compare(m_cmb->itemText(i))) { m_cmb->setCurrentIndex(i); break; } } } ConfParamBoolW::ConfParamBoolW(QWidget *parent, ConfLink cflink, const QString& lbltxt, const QString& tltptxt) : ConfParamW(parent, cflink) { // No createCommon because the checkbox has a label m_hl = new QHBoxLayout(this); m_hl->setSpacing(spacing); m_cb = new QCheckBox(lbltxt, this); setSzPol(m_cb, QSizePolicy::Fixed, QSizePolicy::Fixed, 0, 0); m_cb->setToolTip(tltptxt); m_hl->addWidget(m_cb); QFrame *fr = new QFrame(this); setSzPol(fr, QSizePolicy::Preferred, QSizePolicy::Fixed, 1, 0); m_hl->addWidget(fr); loadValue(); QObject::connect(m_cb, SIGNAL(toggled(bool)), this, SLOT(setValue(bool))); } void ConfParamBoolW::loadValue() { string s; m_cflink->get(s); m_cb->setChecked(stringToBool(s)); } ConfParamFNW::ConfParamFNW(QWidget *parent, ConfLink cflink, const QString& lbltxt, const QString& tltptxt, bool isdir ) : ConfParamW(parent, cflink), m_isdir(isdir) { if (!createCommon(lbltxt, tltptxt)) return; m_fsencoding = true; m_le = new QLineEdit(this); m_le->setMinimumSize(QSize(150, 0 )); setSzPol(m_le, QSizePolicy::Preferred, QSizePolicy::Fixed, 1, 0); m_hl->addWidget(m_le); m_pb = new QPushButton(this); setSzPol(m_pb, QSizePolicy::Fixed, QSizePolicy::Fixed, 1, 0); m_hl->addWidget(m_pb); loadValue(); QObject::connect(m_pb, SIGNAL(clicked()), this, SLOT(showBrowserDialog())); QObject::connect(m_le, SIGNAL(textChanged(const QString&)), this, SLOT(setValue(const QString&))); } void ConfParamFNW::loadValue() { string s; m_cflink->get(s); m_le->setText(QString::fromLocal8Bit(s.c_str())); } void ConfParamFNW::showBrowserDialog() { QString s = myGetFileName(m_isdir); if (!s.isEmpty()) m_le->setText(s); } class SmallerListWidget: public QListWidget { public: SmallerListWidget(QWidget *parent) : QListWidget(parent) {} virtual QSize sizeHint() {return QSize(150, 40);} }; ConfParamSLW::ConfParamSLW(QWidget *parent, ConfLink cflink, const QString& lbltxt, const QString& tltptxt) : ConfParamW(parent, cflink) { // Can't use createCommon here cause we want the buttons below the label m_hl = new QHBoxLayout(this); m_hl->setSpacing(spacing); QVBoxLayout *vl1 = new QVBoxLayout(); QHBoxLayout *hl1 = new QHBoxLayout(); QLabel *tl = new QLabel(this); setSzPol(tl, QSizePolicy::Preferred, QSizePolicy::Fixed, 0, 0); tl->setText(lbltxt); tl->setToolTip(tltptxt); vl1->addWidget(tl); QPushButton *pbA = new QPushButton(this); pbA->setText(tr("+")); setSzPol(pbA, QSizePolicy::Fixed, QSizePolicy::Fixed, 0, 0); hl1->addWidget(pbA); QPushButton *pbD = new QPushButton(this); setSzPol(pbD, QSizePolicy::Fixed, QSizePolicy::Fixed, 0, 0); pbD->setText(tr("-")); hl1->addWidget(pbD); vl1->addLayout(hl1); m_hl->addLayout(vl1); m_lb = new SmallerListWidget(this); m_lb->setSelectionMode(QAbstractItemView::ExtendedSelection); setSzPol(m_lb, QSizePolicy::Preferred, QSizePolicy::Preferred, 1, 1); m_hl->addWidget(m_lb); setSzPol(this, QSizePolicy::Preferred, QSizePolicy::Preferred, 1, 1); loadValue(); QObject::connect(pbA, SIGNAL(clicked()), this, SLOT(showInputDialog())); QObject::connect(pbD, SIGNAL(clicked()), this, SLOT(deleteSelected())); } void ConfParamSLW::loadValue() { string s; m_cflink->get(s); list ls; stringToStrings(s, ls); QStringList qls; for (list::const_iterator it = ls.begin(); it != ls.end(); it++) { if (m_fsencoding) qls.push_back(QString::fromLocal8Bit(it->c_str())); else qls.push_back(QString::fromUtf8(it->c_str())); } m_lb->clear(); m_lb->insertItems(0, qls); } void ConfParamSLW::showInputDialog() { bool ok; QString s = QInputDialog::getText (this, "", // title "", // label, QLineEdit::Normal, // EchoMode mode "", // const QString & text &ok); if (ok && !s.isEmpty()) { QListitems = m_lb->findItems(s, Qt::MatchFixedString|Qt::MatchCaseSensitive); if (items.empty()) { m_lb->insertItem(0, s); m_lb->sortItems(); listToConf(); } } } void ConfParamSLW::listToConf() { list ls; for (int i = 0; i < m_lb->count(); i++) { // General parameters are encoded as utf-8. File names as // local8bit There is no hope for 8bit file names anyway // except for luck: the original encoding is unknown. QString text = m_lb->item(i)->text(); if (m_fsencoding) ls.push_back((const char *)(text.toLocal8Bit())); else ls.push_back((const char *)(text.toUtf8())); } string s; stringsToString(ls, s); m_cflink->set(s); } void ConfParamSLW::deleteSelected() { bool didone; do { didone = false; for (int i = 0; i < m_lb->count(); i++) { if (m_lb->item(i)->isSelected()) { emit entryDeleted(m_lb->item(i)->text()); QListWidgetItem *item = m_lb->takeItem(i); delete item; didone = true; break; } } } while (didone); listToConf(); } // "Add entry" dialog for a file name list void ConfParamDNLW::showInputDialog() { QString s = myGetFileName(true); if (!s.isEmpty()) { QListitems = m_lb->findItems(s, Qt::MatchFixedString|Qt::MatchCaseSensitive); if (items.empty()) { m_lb->insertItem(0, s); m_lb->sortItems(); QListitems = m_lb->findItems(s, Qt::MatchFixedString|Qt::MatchCaseSensitive); if (m_lb->selectionMode() == QAbstractItemView::SingleSelection && !items.empty()) (*items.begin())->setSelected(TRUE); listToConf(); } } } // "Add entry" dialog for a constrained string list void ConfParamCSLW::showInputDialog() { bool ok; QString s = QInputDialog::getItem (this, // parent "", // title "", // label, m_sl, // items, 0, // current = 0 FALSE, // editable = true, &ok); if (ok && !s.isEmpty()) { QListitems = m_lb->findItems(s, Qt::MatchFixedString|Qt::MatchCaseSensitive); if (items.empty()) { m_lb->insertItem(0, s); m_lb->sortItems(); listToConf(); } } } } // Namespace confgui