You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdebase/kcontrol/background/bgwallpaper.cpp

239 lines
7.0 KiB

/* 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 <config.h>
#include <qcheckbox.h>
#include <qevent.h>
#include <qpushbutton.h>
#include <qspinbox.h>
#include <kfiledialog.h>
#include <kimageio.h>
#include <klocale.h>
#include <kstandarddirs.h>
#include <kurldrag.h>
#include "bgsettings.h"
#include "bgwallpaper.h"
#include "bgwallpaper_ui.h"
/**** BGMultiWallpaperList ****/
BGMultiWallpaperList::BGMultiWallpaperList(QWidget *parent, const char *name)
: QListBox(parent, name)
{
setAcceptDrops(true);
setSelectionMode(QListBox::Extended);
}
void BGMultiWallpaperList::dragEnterEvent(QDragEnterEvent *ev)
{
ev->accept(KURLDrag::canDecode(ev));
}
void BGMultiWallpaperList::dropEvent(QDropEvent *ev)
{
QStringList files;
KURL::List urls;
KURLDrag::decode(ev, urls);
for(KURL::List::ConstIterator it = urls.begin();
it != urls.end(); ++it)
{
// TODO: Download remote files
if ((*it).isLocalFile())
files.append((*it).path());
}
insertStringList(files);
}
bool BGMultiWallpaperList::hasSelection()
{
for ( unsigned i = 0; i < count(); i++)
{
if ( item( i ) && item( i )->isSelected() )
return true;
}
return false;
}
void BGMultiWallpaperList::ensureSelectionVisible()
{
for ( int i = topItem(); i < topItem() + numItemsVisible() - 1; i++)
if ( item( i ) && item( i )->isSelected() )
return;
for ( unsigned i = 0; i < count(); i++)
if ( item( i ) && item( i )->isSelected() )
{
setTopItem( i );
return;
}
}
/**** BGMultiWallpaperDialog ****/
BGMultiWallpaperDialog::BGMultiWallpaperDialog(KBackgroundSettings *settings,
QWidget *parent, const char *name)
: KDialogBase(parent, name, true, i18n("Setup Slide Show"),
Ok | Cancel, Ok, true), m_pSettings(settings)
{
dlg = new BGMultiWallpaperBase(this);
setMainWidget(dlg);
dlg->m_spinInterval->setRange(1, 99999);
dlg->m_spinInterval->setSteps(1, 15);
dlg->m_spinInterval->setSuffix(i18n(" min"));
// Load
dlg->m_spinInterval->setValue(QMAX(1,m_pSettings->wallpaperChangeInterval()));
dlg->m_listImages->insertStringList(m_pSettings->wallpaperList());
if (m_pSettings->multiWallpaperMode() == KBackgroundSettings::Random)
dlg->m_cbRandom->setChecked(true);
connect(dlg->m_buttonAdd, SIGNAL(clicked()), SLOT(slotAdd()));
connect(dlg->m_buttonRemove, SIGNAL(clicked()), SLOT(slotRemove()));
connect(dlg->m_buttonMoveUp, SIGNAL(clicked()), SLOT(slotMoveUp()));
connect(dlg->m_buttonMoveDown, SIGNAL(clicked()), SLOT(slotMoveDown()));
connect(dlg->m_listImages, SIGNAL(clicked ( QListBoxItem * )), SLOT(slotItemSelected( QListBoxItem *)));
dlg->m_buttonRemove->setEnabled( false );
dlg->m_buttonMoveUp->setEnabled( false );
dlg->m_buttonMoveDown->setEnabled( false );
}
void BGMultiWallpaperDialog::slotItemSelected( QListBoxItem * )
{
dlg->m_buttonRemove->setEnabled( dlg->m_listImages->hasSelection() );
setEnabledMoveButtons();
}
void BGMultiWallpaperDialog::setEnabledMoveButtons()
{
bool hasSelection = dlg->m_listImages->hasSelection();
QListBoxItem * item;
item = dlg->m_listImages->firstItem();
dlg->m_buttonMoveUp->setEnabled( hasSelection && item && !item->isSelected() );
item = dlg->m_listImages->item( dlg->m_listImages->count() - 1 );
dlg->m_buttonMoveDown->setEnabled( hasSelection && item && !item->isSelected() );
}
void BGMultiWallpaperDialog::slotAdd()
{
QStringList mimeTypes = KImageIO::mimeTypes( KImageIO::Reading );
#ifdef HAVE_LIBART
mimeTypes += "image/svg+xml";
#endif
KFileDialog fileDialog(KGlobal::dirs()->findDirs("wallpaper", "").first(),
mimeTypes.join( " " ), this,
0L, true);
fileDialog.setCaption(i18n("Select Image"));
KFile::Mode mode = static_cast<KFile::Mode> (KFile::Files |
KFile::Directory |
KFile::ExistingOnly |
KFile::LocalOnly);
fileDialog.setMode(mode);
fileDialog.exec();
QStringList files = fileDialog.selectedFiles();
if (files.isEmpty())
return;
dlg->m_listImages->insertStringList(files);
}
void BGMultiWallpaperDialog::slotRemove()
{
int current = -1;
for ( unsigned i = 0; i < dlg->m_listImages->count();)
{
QListBoxItem * item = dlg->m_listImages->item( i );
if ( item && item->isSelected())
{
dlg->m_listImages->removeItem(i);
if (current == -1)
current = i;
}
else
i++;
}
if ((current != -1) && (current < (signed)dlg->m_listImages->count()))
dlg->m_listImages->setSelected(current, true);
dlg->m_buttonRemove->setEnabled(dlg->m_listImages->hasSelection());
setEnabledMoveButtons();
}
void BGMultiWallpaperDialog::slotMoveUp()
{
for ( unsigned i = 1; i < dlg->m_listImages->count(); i++)
{
QListBoxItem * item = dlg->m_listImages->item( i );
if ( item && item->isSelected() )
{
dlg->m_listImages->takeItem( item );
dlg->m_listImages->insertItem( item, i - 1 );
}
}
dlg->m_listImages->ensureSelectionVisible();
setEnabledMoveButtons();
}
void BGMultiWallpaperDialog::slotMoveDown()
{
for ( unsigned i = dlg->m_listImages->count() - 1; i > 0; i--)
{
QListBoxItem * item = dlg->m_listImages->item( i - 1 );
if ( item && item->isSelected())
{
dlg->m_listImages->takeItem( item );
dlg->m_listImages->insertItem( item, i );
}
}
dlg->m_listImages->ensureSelectionVisible();
setEnabledMoveButtons();
}
void BGMultiWallpaperDialog::slotOk()
{
QStringList lst;
for (unsigned i=0; i < dlg->m_listImages->count(); i++)
lst.append(dlg->m_listImages->text(i));
m_pSettings->setWallpaperList(lst);
m_pSettings->setWallpaperChangeInterval(dlg->m_spinInterval->value());
if (dlg->m_cbRandom->isChecked())
m_pSettings->setMultiWallpaperMode(KBackgroundSettings::Random);
else
m_pSettings->setMultiWallpaperMode(KBackgroundSettings::InOrder);
accept();
}
#include "bgwallpaper.moc"