summaryrefslogtreecommitdiffstats
path: root/kchart/kchartBackgroundPixmapConfigPage.cc
diff options
context:
space:
mode:
Diffstat (limited to 'kchart/kchartBackgroundPixmapConfigPage.cc')
-rw-r--r--kchart/kchartBackgroundPixmapConfigPage.cc548
1 files changed, 548 insertions, 0 deletions
diff --git a/kchart/kchartBackgroundPixmapConfigPage.cc b/kchart/kchartBackgroundPixmapConfigPage.cc
new file mode 100644
index 00000000..b778dca8
--- /dev/null
+++ b/kchart/kchartBackgroundPixmapConfigPage.cc
@@ -0,0 +1,548 @@
+/* This file is part of the KDE project
+ Copyright (C) 2000 Matthias Kalle Dalheimer <kalle@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ 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 "kchartBackgroundPixmapConfigPage.h"
+#include "kchartBackgroundPixmapConfigPage.moc"
+
+#include <klocale.h>
+#include <kglobal.h>
+#include <kstandarddirs.h>
+#include <kfiledialog.h>
+#include <kmessagebox.h>
+#include <kdebug.h>
+#include <kfilemetainfo.h>
+#include <kstringhandler.h>
+
+#include <qcombobox.h>
+#include <qradiobutton.h>
+#include <qbuttongroup.h>
+#include <qspinbox.h>
+#include <qlayout.h>
+#include <qhbox.h>
+#include <qpushbutton.h>
+#include <qlabel.h>
+#include <qwhatsthis.h>
+#include <qlistbox.h>
+#include <kcolorbutton.h>
+
+#include "kchart_params.h"
+
+namespace KChart
+{
+
+KChartBackgroundPixmapConfigPage::KChartBackgroundPixmapConfigPage( KChartParams* params, QWidget* parent )
+ : QWidget( parent, "KChartBackgroundPixmapConfigPage" ),
+ _params( params )
+{
+ QWhatsThis::add( this,
+ i18n( "On this page, you can select colors or images "
+ "to be displayed behind the different areas. You "
+ "can also select whether the images should be "
+ "stretched or scaled or centered or used as "
+ "background tiles." ) );
+
+ QHBoxLayout* toplevel = new QHBoxLayout( this, 10 );
+
+#if 0
+ QVBoxLayout* left=new QVBoxLayout(10);
+ toplevel->addLayout(left,2);
+ regionList=new QListBox(this);
+ left->addWidget(regionList);
+#endif
+
+ QVBoxLayout* center = new QVBoxLayout( 10 );
+ toplevel->addLayout( center, 2 );
+
+
+ QLabel* backgroundLA = new QLabel( i18n( "&Background color:" ), this );
+ center->addWidget( backgroundLA );
+ _backgroundCB = new KColorButton( this );
+ backgroundLA->setBuddy( _backgroundCB );
+ center->addWidget( _backgroundCB);
+ QString wtstr = i18n( "Here you set the color in which the background "
+ "of the chart is painted." );
+ QWhatsThis::add( backgroundLA, wtstr );
+ QWhatsThis::add( _backgroundCB, wtstr );
+
+
+ QLabel* wallpaperLA = new QLabel( i18n( "Background wallpaper:" ), this );
+ center->addWidget( wallpaperLA );
+
+ wallCB = new QComboBox( false, this, "wallCombo" );
+ wallpaperLA->setBuddy(wallCB);
+ QWhatsThis::add( wallCB, i18n( "You can select a background image from "
+ "this list. Initially, the installed KDE "
+ "wallpapers will be offered. If you do not "
+ "find what you are looking for here, you can "
+ "select any image file by clicking on the "
+ "<i>Browse</i> button below." ) );
+ center->addWidget( wallCB );
+ wallCB->insertItem( i18n("None") );
+
+ loadWallpaperFilesList();
+ QPushButton* browsePB = new QPushButton( i18n("&Browse..."), this );
+ QWhatsThis::add( browsePB, i18n( "Click this button to select a background "
+ "image not yet present in the list above. " ) );
+ center->addWidget( browsePB );
+ connect( browsePB, SIGNAL( clicked() ), SLOT( slotBrowse() ) );
+
+ wallWidget = new QWidget( this );
+ QWhatsThis::add( wallWidget, i18n( "This area will always display the "
+ "currently selected background image. "
+ "Note that the image will be scaled and "
+ "thus might have a different ratio than "
+ "it originally had." ) );
+ center->addWidget( wallWidget );
+
+ connect( wallCB, SIGNAL( activated( int ) ),
+ this, SLOT( slotWallPaperChanged( int ) ) );
+
+ right = new QVGroupBox( i18n( "Wallpaper Configuration" ), this );
+ QWhatsThis::add( right, i18n( "In this box, you can set various settings "
+ "that control how the background image is "
+ "displayed." ) );
+ toplevel->addWidget( right );
+
+ QHBox* intensityHB = new QHBox( right );
+ intensityHB->setSpacing( 10 );
+ QLabel* intensityLA = new QLabel(
+ // xgettext:no-c-format
+ i18n( "&Intensity in %:" ), intensityHB );
+ intensitySB = new QSpinBox( 1, 100, 1, intensityHB );
+ intensityLA->setBuddy( intensitySB );
+ // xgettext:no-c-format
+ QString ttstr = i18n( "Here you can select how much the image should be "
+ "brightened up so that it does not disturb the "
+ "selected area too much.<br> Different images require "
+ "different settings, but 25% is a good value to start "
+ "with." );
+ QWhatsThis::add( intensityLA, ttstr );
+ QWhatsThis::add( intensitySB, ttstr );
+
+
+ stretchedRB = new QRadioButton( i18n( "Stretched" ), right );
+ QWhatsThis::add( stretchedRB,
+ i18n( "If you check this box, the selected image will "
+ "be scaled to fit the total size of the selected "
+ "area. Image ratio will be adjusted to match "
+ "the area size and height if necessary." ) );
+ stretchedRB->setChecked( true );
+ scaledRB = new QRadioButton( i18n( "Scaled" ), right );
+ QWhatsThis::add( scaledRB,
+ i18n( "If you check this box, the selected image will "
+ "be scaled to match the height or width of the "
+ "selected area - whichever is reached first." ) );
+ centeredRB = new QRadioButton( i18n( "Centered" ), right );
+ QWhatsThis::add( centeredRB,
+ i18n( "If you check this box, the selected image will "
+ "be centered over the selected area. If the image "
+ "is larger then the area, you will only see the "
+ "middle part of it." ) );
+
+ tiledRB = new QRadioButton( i18n( "Tiled" ), right );
+ QWhatsThis::add( tiledRB,
+ i18n( "If you check this box, the selected image will "
+ "be used as a background tile. If the image is "
+ "larger then the selected area, you will only see "
+ "the upper left part of it." ) );
+ QButtonGroup* alignmentBG;
+ alignmentBG = new QButtonGroup( right, "GroupBox_Alignment" );
+ alignmentBG->setFrameStyle( QFrame::NoFrame );
+ alignmentBG->insert( stretchedRB );
+ alignmentBG->insert( scaledRB );
+ alignmentBG->insert( centeredRB );
+ alignmentBG->insert( tiledRB );
+
+ intensitySB->hide(); //the property doesn't work atm
+}
+
+//Code from kcontrol/background/bgdialog.cc
+void KChartBackgroundPixmapConfigPage::loadWallpaperFilesList()
+{
+ // Wallpapers
+ // the following QMap is lower cased names mapped to cased names and URLs
+ // this way we get case insensitive sorting
+ QMap<QString, QPair<QString, QString> > papers;
+
+ //search for .desktop files before searching for images without .desktop files
+ QStringList lst = KGlobal::dirs()->findAllResources("wallpaper", "*desktop", false, true);
+ QStringList files;
+ for (QStringList::ConstIterator it = lst.begin(); it != lst.end(); ++it)
+ {
+ KSimpleConfig fileConfig(*it);
+ fileConfig.setGroup("Wallpaper");
+
+ QString imageCaption = fileConfig.readEntry("Name");
+ QString fileName = fileConfig.readEntry("File");
+
+ if (imageCaption.isEmpty())
+ {
+ imageCaption = fileName;
+ imageCaption.replace('_', ' ');
+ imageCaption = KStringHandler::capwords(imageCaption);
+ }
+
+ // avoid name collisions
+ QString rs = imageCaption;
+ QString lrs = rs.lower();
+ for (int n = 1; papers.find(lrs) != papers.end(); ++n)
+ {
+ rs = imageCaption + " (" + QString::number(n) + ')';
+ lrs = rs.lower();
+ }
+ int slash = (*it).findRev('/') + 1;
+ QString directory = (*it).left(slash);
+ bool canLoadScaleable = false;
+#ifdef HAVE_LIBART
+ canLoadScaleable = true;
+#endif
+ if ( fileConfig.readEntry("ImageType") == "pixmap" || canLoadScaleable ) {
+ papers[lrs] = qMakePair(rs, directory + fileName);
+ files.append(directory + fileName);
+ }
+ }
+
+ //now find any wallpapers that don't have a .desktop file
+ lst = KGlobal::dirs()->findAllResources("wallpaper", "*", false, true);
+ for (QStringList::ConstIterator it = lst.begin(); it != lst.end(); ++it)
+ {
+ if ( !(*it).endsWith(".desktop") && files.grep(*it).empty() ) {
+ // First try to see if we have a comment describing the image. If we do
+ // just use the first line of said comment.
+ KFileMetaInfo metaInfo(*it);
+ QString imageCaption;
+
+ if (metaInfo.isValid() && metaInfo.item("Comment").isValid())
+ imageCaption = metaInfo.item("Comment").string().section('\n', 0, 0);
+
+ if (imageCaption.isEmpty())
+ {
+ int slash = (*it).findRev('/') + 1;
+ int endDot = (*it).findRev('.');
+
+ // strip the extension if it exists
+ if (endDot != -1 && endDot > slash)
+ imageCaption = (*it).mid(slash, endDot - slash);
+ else
+ imageCaption = (*it).mid(slash);
+
+ imageCaption.replace('_', ' ');
+ imageCaption = KStringHandler::capwords(imageCaption);
+ }
+
+ // avoid name collisions
+ QString rs = imageCaption;
+ QString lrs = rs.lower();
+ for (int n = 1; papers.find(lrs) != papers.end(); ++n)
+ {
+ rs = imageCaption + " (" + QString::number(n) + ')';
+ lrs = rs.lower();
+ }
+ papers[lrs] = qMakePair(rs, *it);
+ }
+ }
+
+ m_wallpaper.clear();
+ //don't start to 0, we have None element
+ int i = 1;
+ for (QMap<QString, QPair<QString, QString> >::Iterator it = papers.begin();
+ it != papers.end();
+ ++it)
+ {
+ wallCB->insertItem(it.data().first);
+ m_wallpaper[it.data().second] = i;
+ i++;
+ }
+}
+
+void KChartBackgroundPixmapConfigPage::init()
+{
+#if 0
+ QStringList lst;
+ lst.append(i18n( "Outermost Region" ));
+ lst.append(i18n( "Innermost Region" ));
+ lst.append(i18n( "Header+Title+Subtitle" ));
+ lst.append(i18n( "Footers" ));
+ lst.append(i18n( "Data+Axes+Legend" ));
+ lst.append(i18n( "Data+Axes" ));
+ lst.append(i18n( "Data" ));
+ lst.append(i18n( "Legend" ));
+ lst.append(i18n( "Left Axis" ));
+ lst.append(i18n( "Bottom Axis" ));
+ lst.append(i18n( "Right Axis" ));
+ lst.append(i18n( "Header A" ));
+ lst.append(i18n( "Header B" ));
+ lst.append(i18n( "Header C" ));
+ lst.append(i18n( "Title A" ));
+ lst.append(i18n( "Title B" ));
+ lst.append(i18n( "Title C" ));
+ lst.append(i18n( "Subtitle A" ));
+ lst.append(i18n( "Subtitle B" ));
+ lst.append(i18n( "Subtitle C" ));
+ lst.append(i18n( "Footer 1 A" ));
+ lst.append(i18n( "Footer 1 B" ));
+ lst.append(i18n( "Footer 1 C" ));
+ lst.append(i18n( "Footer 2 A" ));
+ lst.append(i18n( "Footer 2 B" ));
+ lst.append(i18n( "Footer 2 C" ));
+ lst.append(i18n( "Footer 3 A" ));
+ lst.append(i18n( "Footer 3 B" ));
+ lst.append(i18n( "Footer 3 C" ));
+ regionList->insertStringList(lst);
+#endif
+ // PENDING(kalle) Readapt
+ // showSettings( _params->backgroundPixmapName );
+// intensitySB->setValue( (int)(_params->backgroundPixmapIntensity * 100.0) );
+// scaledCB->setChecked( _params->backgroundPixmapScaled );
+// centeredCB->setChecked( _params->backgroundPixmapCentered );
+
+ bool bFound;
+ const KDChartParams::KDChartFrameSettings * innerFrame =
+ _params->frameSettings( KDChartEnums::AreaInnermost, bFound );
+ if( bFound )
+ {
+ const QPixmap* backPixmap;
+ bool isTiledMode = false;
+ KDFrame::BackPixmapMode backPixmapMode;
+ const QBrush& background = innerFrame->frame().background( backPixmap, backPixmapMode );
+ const QColor backColor( background.color() );
+
+ // Bg color has to be be set in any case,
+ // even when a (tiled) pixmap is specified:
+ _backgroundCB->setColor( backColor );
+
+
+ if( !backPixmap || backPixmap->isNull() )
+ {
+ // A pixmap can be in the brush, if used as Tile.
+ backPixmap = background.pixmap();
+ if( backPixmap )
+ isTiledMode = true;
+ }
+
+ if( !backPixmap || backPixmap->isNull() ) //color as background
+ {
+ right->setEnabled( false );
+ wallCB->setCurrentItem( 0 );
+ }
+ else //pixmap as background
+ {
+ _backgroundCB->setEnabled( false );
+ wallWidget->setPaletteBackgroundPixmap( *backPixmap );
+ wallCB->setCurrentItem( 1 );
+ if( isTiledMode )
+ {
+ tiledRB->setChecked( true );
+ }
+ else
+ {
+ switch( backPixmapMode ){
+ case KDFrame::PixCentered:
+ centeredRB->setChecked( true );
+ break;
+ case KDFrame::PixScaled:
+ scaledRB->setChecked( true );
+ break;
+ default:
+ stretchedRB->setChecked( true );
+ }
+ }
+ }
+ }
+ else
+ _backgroundCB->setColor(QColor(230, 222, 222) );
+}
+
+void KChartBackgroundPixmapConfigPage::apply()
+{
+ // PENDING(kalle) Readapt
+ // if( wallCB->currentText() != _params->backgroundPixmapName ) {
+// bool load=true;
+// if(wallCB->currentText()==i18n("None")) {
+// load=false;
+// } else {
+// _params->backgroundPixmapName = wallCB->currentText();
+// bool load=_params->backgroundPixmap.load( locate( "wallpaper", _params->backgroundPixmapName ) );
+// if(load)
+// _params->backgroundPixmapIsDirty = true;
+// }
+
+// if( !load ) {
+// _params->backgroundPixmapName = "";
+// _params->backgroundPixmap=QPixmap("");
+// _params->backgroundPixmapIsDirty = false;
+// }
+// }
+// if( (int)(_params->backgroundPixmapIntensity * 100.0) !=
+// intensitySB->value() ) {
+// _params->backgroundPixmapIntensity = (float)(intensitySB->value()) / 100.0;
+// _params->backgroundPixmapIsDirty = true;
+// }
+
+// if( _params->backgroundPixmapScaled !=
+// scaledCB->isChecked() ) {
+// _params->backgroundPixmapScaled = scaledCB->isChecked();
+// _params->backgroundPixmapIsDirty = true;
+// }
+// if( _params->backgroundPixmapCentered !=
+// centeredCB->isChecked() ) {
+// _params->backgroundPixmapCentered = centeredCB->isChecked();
+// _params->backgroundPixmapIsDirty = true;
+// }
+
+ //
+ // temp. hack: the background is removed if "None" is selected in the combo box
+ //
+ // For KOffice 1.5/2.0 this is to be removed by a checkbox.
+ bool bFound;
+ const KDChartParams::KDChartFrameSettings * innerFrame =
+ _params->frameSettings( KDChartEnums::AreaInnermost, bFound );
+ if( bFound )
+ {
+ const QColor backColor( _backgroundCB->color() );
+ KDFrame& frame( const_cast<KDFrame&>(innerFrame->frame()) );
+ if ( wallCB->currentItem() == 0 )
+ {
+ frame.setBackPixmap( 0 );
+ frame.setBackground( backColor );
+ }
+ else
+ {
+ const QPixmap* pixmap = wallWidget->paletteBackgroundPixmap();
+ if ( tiledRB->isChecked() ){
+ // We remove the frame's extra pixmap,
+ frame.setBackPixmap( 0 );
+ // because a tiled image is set via a QBrush.
+ if( pixmap )
+ frame.setBackground( QBrush( backColor, *pixmap ) );
+ else
+ frame.setBackground( backColor );
+ }else{
+ KDFrame::BackPixmapMode backPixmapMode;
+ if ( centeredRB->isChecked() )
+ backPixmapMode = KDFrame::PixCentered;
+ else if ( scaledRB->isChecked() )
+ backPixmapMode = KDFrame::PixScaled;
+ else
+ backPixmapMode = KDFrame::PixStretched;
+ // We reset the background color, removing any tiled brush,
+ frame.setBackground( backColor );
+ // because we specify an extra pixmap instead.
+ frame.setBackPixmap( pixmap, backPixmapMode );
+ }
+ }
+ }
+}
+
+
+void KChartBackgroundPixmapConfigPage::showSettings( const QString& fileName )
+{
+ wallCB->blockSignals(true);
+
+ if (m_wallpaper.find(fileName) == m_wallpaper.end())
+ {
+ int i = wallCB->count();
+ QString imageCaption;
+ int slash = fileName.findRev('/') + 1;
+ int endDot = fileName.findRev('.');
+
+ // strip the extension if it exists
+ if (endDot != -1 && endDot > slash)
+ imageCaption = fileName.mid(slash, endDot - slash);
+ else
+ imageCaption = fileName.mid(slash);
+ if (wallCB->text(i-1) == imageCaption)
+ {
+ i--;
+ wallCB->removeItem(i);
+ }
+ wallCB->insertItem(imageCaption);
+ m_wallpaper[fileName] = i;
+ wallCB->setCurrentItem(i);
+ }
+ else
+ {
+ wallCB->setCurrentItem(m_wallpaper[fileName]);
+ }
+ wallCB->blockSignals(false);
+ loadWallPaper();
+}
+
+
+void KChartBackgroundPixmapConfigPage::slotBrowse()
+{
+ //TODO: Support non-local wallpapers
+ KURL url = KFileDialog::getOpenFileName( 0 );
+ if( url.isEmpty() )
+ return;
+ showSettings( url.path() );
+}
+
+void KChartBackgroundPixmapConfigPage::slotWallPaperChanged( int index )
+{
+ if ( index != 0 && loadWallPaper() )
+ {
+ _backgroundCB->setEnabled( false );
+ right->setEnabled( true );
+ }
+ else
+ {
+ wallWidget->setPaletteBackgroundPixmap( 0 );
+ _backgroundCB->setEnabled( true );
+ right->setEnabled( false );
+ }
+}
+
+
+bool KChartBackgroundPixmapConfigPage::loadWallPaper()
+{
+ int i = wallCB->currentItem();
+ if ( i == -1 || i == 0 ) { // 0 is 'None'
+ wallPixmap.resize(0,0);
+ wallFile = "";
+ } else {
+ for(QMap<QString,int>::ConstIterator it = m_wallpaper.begin();
+ it != m_wallpaper.end();
+ ++it)
+ {
+ if (it.data() == i)
+ {
+ wallFile = it.key();
+ break;
+ }
+ }
+ QString file = locate("wallpaper", wallFile);
+ if( file.isEmpty() ) {
+ kdWarning(35001) << "Couldn't locate wallpaper " << wallFile << endl;
+ wallPixmap.resize(0,0);
+ wallFile = "";
+ return false;
+ } else {
+ wallPixmap.load( file );
+
+ if( wallPixmap.isNull() )
+ return false;
+// kdWarning(35001) << "Could not load wallpaper " << file << endl;
+ }
+ }
+ wallWidget->setPaletteBackgroundPixmap( wallPixmap );
+ return true;
+}
+
+} //KChart namespace