summaryrefslogtreecommitdiffstats
path: root/kcontrol/background/bgadvanced.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kcontrol/background/bgadvanced.cpp')
-rw-r--r--kcontrol/background/bgadvanced.cpp507
1 files changed, 507 insertions, 0 deletions
diff --git a/kcontrol/background/bgadvanced.cpp b/kcontrol/background/bgadvanced.cpp
new file mode 100644
index 000000000..3218ec470
--- /dev/null
+++ b/kcontrol/background/bgadvanced.cpp
@@ -0,0 +1,507 @@
+/* vi: ts=8 sts=4 sw=4
+
+ This file is part of the KDE project, module kcmbackground.
+
+ Copyright (C) 1999 Geert Jansen <g.t.jansen@stud.tue.nl>
+ Copyright (C) 2003 Waldo Bastian <bastian@kde.org>
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License
+ version 2 as published by the Free Software Foundation.
+
+ This library 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+ */
+
+#include <qbuttongroup.h>
+#include <qcheckbox.h>
+#include <qheader.h>
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qlineedit.h>
+#include <qcombobox.h>
+#include <qpushbutton.h>
+#include <qslider.h>
+#include <qspinbox.h>
+#include <qwhatsthis.h>
+
+#include <kconfig.h>
+#include <kcolorbutton.h>
+#include <klocale.h>
+#include <kmessagebox.h>
+#include <kpixmap.h>
+#include <kstandarddirs.h>
+#include <kwin.h>
+
+#include "bgrender.h"
+#include "bgadvanced.h"
+#include "bgadvanced_ui.h"
+
+#include <X11/Xlib.h>
+
+/**** BGAdvancedDialog ****/
+
+static QCString desktopConfigname()
+{
+ int desktop=0;
+ if (qt_xdisplay())
+ desktop = DefaultScreen(qt_xdisplay());
+ QCString name;
+ if (desktop == 0)
+ name = "kdesktoprc";
+ else
+ name.sprintf("kdesktop-screen-%drc", desktop);
+
+ return name;
+}
+
+
+BGAdvancedDialog::BGAdvancedDialog(KBackgroundRenderer *_r,
+ QWidget *parent,
+ bool m_multidesktop)
+ : KDialogBase(parent, "BGAdvancedDialog",
+ true, i18n("Advanced Background Settings"),
+ Ok | Cancel, Ok, true),
+ r(_r)
+{
+ dlg = new BGAdvancedBase(this);
+ setMainWidget(dlg);
+
+ dlg->m_listPrograms->header()->setStretchEnabled ( true, 1 );
+ dlg->m_listPrograms->setAllColumnsShowFocus(true);
+
+ connect(dlg->m_listPrograms, SIGNAL(clicked(QListViewItem *)),
+ SLOT(slotProgramItemClicked(QListViewItem *)));
+
+ // Load programs
+ QStringList lst = KBackgroundProgram::list();
+ QStringList::Iterator it;
+ for (it=lst.begin(); it != lst.end(); ++it)
+ addProgram(*it);
+
+ if (m_multidesktop)
+ {
+ KConfig cfg(desktopConfigname(), false, false);
+ cfg.setGroup( "General" );
+ if (!cfg.readBoolEntry( "Enabled", true ))
+ {
+ dlg->m_groupIconText->hide();
+ }
+
+ dlg->m_spinCache->setSteps(512, 1024);
+ dlg->m_spinCache->setRange(0, 40960);
+ dlg->m_spinCache->setSpecialValueText(i18n("Unlimited"));
+ dlg->m_spinCache->setSuffix(i18n(" KB"));
+
+ connect(dlg->m_buttonAdd, SIGNAL(clicked()),
+ SLOT(slotAdd()));
+ connect(dlg->m_buttonRemove, SIGNAL(clicked()),
+ SLOT(slotRemove()));
+ connect(dlg->m_buttonModify, SIGNAL(clicked()),
+ SLOT(slotModify()));
+
+ connect(dlg->m_listPrograms, SIGNAL(doubleClicked(QListViewItem *)),
+ SLOT(slotProgramItemDoubleClicked(QListViewItem *)));
+ }
+ else
+ {
+ dlg->m_buttonAdd->hide();
+ dlg->m_buttonRemove->hide();
+ dlg->m_buttonModify->hide();
+ dlg->m_groupIconText->hide();
+ dlg->m_groupCache->hide();
+ }
+
+ connect( dlg->m_cbProgram, SIGNAL(toggled(bool)),
+ SLOT(slotEnableProgram(bool)));
+
+ m_backgroundMode = m_oldBackgroundMode = r->backgroundMode();
+ if (m_oldBackgroundMode == KBackgroundSettings::Program)
+ m_oldBackgroundMode = KBackgroundSettings::Flat;
+
+ dlg->adjustSize();
+ updateUI();
+}
+
+void BGAdvancedDialog::makeReadOnly()
+{
+ dlg->m_cbProgram->setEnabled(false);
+ dlg->m_listPrograms->setEnabled(false);
+}
+
+void BGAdvancedDialog::setCacheSize(int s)
+{
+ dlg->m_spinCache->setValue(s);
+}
+
+int BGAdvancedDialog::cacheSize()
+{
+ return dlg->m_spinCache->value();
+}
+
+QColor BGAdvancedDialog::textColor()
+{
+ return dlg->m_colorText->color();
+}
+
+void BGAdvancedDialog::setTextColor(const QColor &color)
+{
+ dlg->m_colorText->setColor(color);
+}
+
+QColor BGAdvancedDialog::textBackgroundColor()
+{
+ return dlg->m_cbSolidTextBackground->isChecked() ?
+ dlg->m_colorTextBackground->color() : QColor();
+}
+
+void BGAdvancedDialog::setTextBackgroundColor(const QColor &color)
+{
+ dlg->m_colorTextBackground->blockSignals(true);
+ dlg->m_cbSolidTextBackground->blockSignals(true);
+ if (color.isValid())
+ {
+ dlg->m_cbSolidTextBackground->setChecked(true);
+ dlg->m_colorTextBackground->setColor(color);
+ dlg->m_colorTextBackground->setEnabled(true);
+ }
+ else
+ {
+ dlg->m_cbSolidTextBackground->setChecked(false);
+ dlg->m_colorTextBackground->setColor(Qt::white);
+ dlg->m_colorTextBackground->setEnabled(false);
+ }
+ dlg->m_colorTextBackground->blockSignals(false);
+ dlg->m_cbSolidTextBackground->blockSignals(false);
+}
+
+bool BGAdvancedDialog::shadowEnabled()
+{
+ return dlg->m_cbShadow->isChecked();
+}
+
+void BGAdvancedDialog::setShadowEnabled(bool enabled)
+{
+ dlg->m_cbShadow->setChecked(enabled);
+}
+
+void BGAdvancedDialog::setTextLines(int lines)
+{
+ dlg->m_spinTextLines->setValue(lines);
+}
+
+int BGAdvancedDialog::textLines() const
+{
+ return dlg->m_spinTextLines->value();
+}
+
+void BGAdvancedDialog::setTextWidth(int width)
+{
+ dlg->m_spinTextWidth->setValue(width);
+}
+
+int BGAdvancedDialog::textWidth() const
+{
+ return dlg->m_spinTextWidth->value();
+}
+
+void BGAdvancedDialog::updateUI()
+{
+ QString prog = r->KBackgroundProgram::name();
+
+ dlg->m_cbProgram->blockSignals(true);
+ if ((r->backgroundMode() == KBackgroundSettings::Program)
+ && !prog.isEmpty())
+ {
+ dlg->m_cbProgram->setChecked(true);
+ dlg->m_listPrograms->setEnabled(true);
+ dlg->m_buttonAdd->setEnabled(true);
+ dlg->m_buttonRemove->setEnabled(true);
+ dlg->m_buttonModify->setEnabled(true);
+ selectProgram(prog);
+ }
+ else
+ {
+ dlg->m_cbProgram->setChecked(false);
+ dlg->m_listPrograms->setEnabled(false);
+ dlg->m_buttonAdd->setEnabled(false);
+ dlg->m_buttonRemove->setEnabled(false);
+ dlg->m_buttonModify->setEnabled(false);
+ }
+ dlg->m_cbProgram->blockSignals(false);
+}
+
+void BGAdvancedDialog::removeProgram(const QString &name)
+{
+ if (m_programItems.find(name))
+ {
+ delete m_programItems[name];
+ m_programItems.remove(name);
+ }
+}
+
+void BGAdvancedDialog::addProgram(const QString &name)
+{
+ removeProgram(name);
+
+ KBackgroundProgram prog(name);
+ if (prog.command().isEmpty() || (prog.isGlobal() && !prog.isAvailable()))
+ return;
+
+ QListViewItem *item = new QListViewItem(dlg->m_listPrograms);
+ item->setText(0, prog.name());
+ item->setText(1, prog.comment());
+ item->setText(2, i18n("%1 min.").arg(prog.refresh()));
+
+ m_programItems.insert(name, item);
+}
+
+void BGAdvancedDialog::selectProgram(const QString &name)
+{
+ if (m_programItems.find(name))
+ {
+ QListViewItem *item = m_programItems[name];
+ dlg->m_listPrograms->ensureItemVisible(item);
+ dlg->m_listPrograms->setSelected(item, true);
+ m_selectedProgram = name;
+ }
+}
+
+void BGAdvancedDialog::slotAdd()
+{
+ KProgramEditDialog dlg;
+ dlg.exec();
+ if (dlg.result() == QDialog::Accepted)
+ {
+ QString program = dlg.program();
+ addProgram(program);
+ selectProgram(program);
+ }
+}
+
+void BGAdvancedDialog::slotRemove()
+{
+ if (m_selectedProgram.isEmpty())
+ return;
+
+ KBackgroundProgram prog(m_selectedProgram);
+ if (prog.isGlobal())
+ {
+ KMessageBox::sorry(this,
+ i18n("Unable to remove the program: the program is global "
+ "and can only be removed by the system administrator."),
+ i18n("Cannot Remove Program"));
+ return;
+ }
+ if (KMessageBox::warningContinueCancel(this,
+ i18n("Are you sure you want to remove the program `%1'?")
+ .arg(prog.name()),
+ i18n("Remove Background Program"),
+ i18n("&Remove")) != KMessageBox::Continue)
+ return;
+
+ prog.remove();
+ removeProgram(m_selectedProgram);
+ m_selectedProgram = QString::null;
+}
+
+/*
+ * Modify a program.
+ */
+void BGAdvancedDialog::slotModify()
+{
+ if (m_selectedProgram.isEmpty())
+ return;
+
+ KProgramEditDialog dlg(m_selectedProgram);
+ dlg.exec();
+ if (dlg.result() == QDialog::Accepted)
+ {
+ QString program = dlg.program();
+ if (program != m_selectedProgram)
+ {
+ KBackgroundProgram prog(m_selectedProgram);
+ prog.remove();
+ removeProgram(m_selectedProgram);
+ }
+ addProgram(dlg.program());
+ selectProgram(dlg.program());
+ }
+}
+
+void BGAdvancedDialog::slotProgramItemClicked(QListViewItem *item)
+{
+ if (item)
+ m_selectedProgram = item->text(0);
+ slotProgramChanged();
+}
+
+void BGAdvancedDialog::slotProgramItemDoubleClicked(QListViewItem *item)
+{
+ slotProgramItemClicked(item);
+ slotModify();
+}
+
+void BGAdvancedDialog::slotProgramChanged()
+{
+ if (dlg->m_cbProgram->isChecked() && !m_selectedProgram.isEmpty())
+ m_backgroundMode = KBackgroundSettings::Program;
+ else
+ m_backgroundMode = m_oldBackgroundMode;
+}
+
+void BGAdvancedDialog::slotEnableProgram(bool b)
+{
+ dlg->m_listPrograms->setEnabled(b);
+ if (b)
+ {
+ dlg->m_listPrograms->blockSignals(true);
+ QListViewItem *cur = dlg->m_listPrograms->currentItem();
+ dlg->m_listPrograms->setSelected(cur, true);
+ dlg->m_listPrograms->ensureItemVisible(cur);
+ dlg->m_listPrograms->blockSignals(false);
+ slotProgramItemClicked(cur);
+ }
+ else
+ {
+ slotProgramChanged();
+ }
+}
+
+QString BGAdvancedDialog::backgroundProgram() const
+{
+ return m_selectedProgram;
+}
+
+int BGAdvancedDialog::backgroundMode() const
+{
+ return m_backgroundMode;
+}
+
+/**** KProgramEditDialog ****/
+
+KProgramEditDialog::KProgramEditDialog(const QString &program, QWidget *parent, char *name)
+ : KDialogBase(parent, name, true, i18n("Configure Background Program"),
+ Ok | Cancel, Ok, true)
+{
+ QFrame *frame = makeMainWidget();
+
+ QGridLayout *grid = new QGridLayout(frame, 6, 2, 0, spacingHint());
+ grid->addColSpacing(1, 300);
+
+ QLabel *lbl = new QLabel(i18n("&Name:"), frame);
+ grid->addWidget(lbl, 0, 0);
+ m_NameEdit = new QLineEdit(frame);
+ lbl->setBuddy(m_NameEdit);
+ grid->addWidget(m_NameEdit, 0, 1);
+
+ lbl = new QLabel(i18n("Co&mment:"), frame);
+ grid->addWidget(lbl, 1, 0);
+ m_CommentEdit = new QLineEdit(frame);
+ lbl->setBuddy(m_CommentEdit);
+ grid->addWidget(m_CommentEdit, 1, 1);
+
+ lbl = new QLabel(i18n("Comman&d:"), frame);
+ grid->addWidget(lbl, 2, 0);
+ m_CommandEdit = new QLineEdit(frame);
+ lbl->setBuddy(m_CommandEdit);
+ grid->addWidget(m_CommandEdit, 2, 1);
+
+ lbl = new QLabel(i18n("&Preview cmd:"), frame);
+ grid->addWidget(lbl, 3, 0);
+ m_PreviewEdit = new QLineEdit(frame);
+ lbl->setBuddy(m_PreviewEdit);
+ grid->addWidget(m_PreviewEdit, 3, 1);
+
+ lbl = new QLabel(i18n("&Executable:"), frame);
+ grid->addWidget(lbl, 4, 0);
+ m_ExecEdit = new QLineEdit(frame);
+ lbl->setBuddy(m_ExecEdit);
+ grid->addWidget(m_ExecEdit, 4, 1);
+
+ lbl = new QLabel(i18n("&Refresh time:"), frame);
+ grid->addWidget(lbl, 5, 0);
+ m_RefreshEdit = new QSpinBox(frame);
+ m_RefreshEdit->setRange(5, 60);
+ m_RefreshEdit->setSteps(5, 10);
+ m_RefreshEdit->setSuffix(i18n(" min"));
+ m_RefreshEdit->setFixedSize(m_RefreshEdit->sizeHint());
+ lbl->setBuddy(m_RefreshEdit);
+ grid->addWidget(m_RefreshEdit, 5, 1, AlignLeft);
+
+ m_Program = program;
+ if (m_Program.isEmpty()) {
+ KBackgroundProgram prog(i18n("New Command"));
+ int i = 1;
+ while (!prog.command().isEmpty())
+ prog.load(i18n("New Command <%1>").arg(i++));
+ m_NameEdit->setText(prog.name());
+ m_NameEdit->setSelection(0, 100);
+ m_RefreshEdit->setValue(15);
+ return;
+ }
+
+ // Fill in the fields
+ m_NameEdit->setText(m_Program);
+ KBackgroundProgram prog(m_Program);
+ m_CommentEdit->setText(prog.comment());
+ m_ExecEdit->setText(prog.executable());
+ m_CommandEdit->setText(prog.command());
+ m_PreviewEdit->setText(prog.previewCommand());
+ m_RefreshEdit->setValue(prog.refresh());
+}
+
+
+QString KProgramEditDialog::program()const
+{
+ return m_NameEdit->text();
+}
+
+void KProgramEditDialog::slotOk()
+{
+ QString s = m_NameEdit->text();
+ if (s.isEmpty()) {
+ KMessageBox::sorry(this, i18n("You did not fill in the `Name' field.\n"
+ "This is a required field."));
+ return;
+ }
+
+ KBackgroundProgram prog(s);
+ if ((s != m_Program) && !prog.command().isEmpty()) {
+ int ret = KMessageBox::warningContinueCancel(this,
+ i18n("There is already a program with the name `%1'.\n"
+ "Do you want to overwrite it?").arg(s),QString::null,i18n("Overwrite"));
+ if (ret != KMessageBox::Continue)
+ return;
+ }
+
+ if (m_ExecEdit->text().isEmpty()) {
+ KMessageBox::sorry(this, i18n("You did not fill in the `Executable' field.\n"
+ "This is a required field."));
+ return;
+ }
+ if (m_CommandEdit->text().isEmpty()) {
+ KMessageBox::sorry(this, i18n("You did not fill in the `Command' field.\n"
+ "This is a required field."));
+ return;
+ }
+
+ prog.setComment(m_CommentEdit->text());
+ prog.setExecutable(m_ExecEdit->text());
+ prog.setCommand(m_CommandEdit->text());
+ prog.setPreviewCommand(m_PreviewEdit->text());
+ prog.setRefresh(m_RefreshEdit->value());
+
+ prog.writeSettings();
+ accept();
+}
+
+
+#include "bgadvanced.moc"