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.
koffice/kchart/kchartLegendConfigPage.cc

386 lines
15 KiB

/* This file is part of the KDE project
Copyright (C) 2001,2002,2003,2004 Laurent Montel <montel@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 "kchartLegendConfigPage.h"
#include "kchartLegendConfigPage.moc"
#include <kapplication.h>
#include <klocale.h>
#include <kcolorbutton.h>
#include <kfontdialog.h>
#include <kiconloader.h>
#include <qlabel.h>
#include <qbuttongroup.h>
#include <qvbuttongroup.h>
#include <qradiobutton.h>
#include <qlineedit.h>
#include <qtooltip.h>
#include <qwhatsthis.h>
#include "kchart_params.h"
#include "kchart_factory.h"
#include "KDFrameProfileSection.h"
namespace KChart
{
KChartLegendConfigPage::KChartLegendConfigPage( KChartParams* params,
QWidget* parent ) :
QWidget( parent ),_params( params )
{
//Layout for 4 blocks
QGridLayout* layout = new QGridLayout( this, 3, 2, KDialog::marginHint(), KDialog::spacingHint() );
//1. Block: General settings
QButtonGroup* gb = new QButtonGroup( 0, Qt::Vertical, i18n("General"), this );
gb->layout()->setSpacing(KDialog::spacingHint());
gb->layout()->setMargin(KDialog::marginHint());
layout->addWidget( gb, 0, 0 );
QGridLayout *grid2 = new QGridLayout( gb->layout(), 4, 2 );
QLabel* lab = new QLabel( i18n("Title:"), gb );
QWhatsThis::add(lab, i18n("Write here the title of the legend, which is displayed at the top of the legend box."));
grid2->addWidget( lab, 0, 0 );
title = new QLineEdit( gb );
grid2->addWidget( title, 0, 1 );
// 2. Block: Legend position
gb = new QButtonGroup( 0, Qt::Vertical, i18n("Legend Position"), this );
QWhatsThis::add(gb, i18n("<qt>Choose the location of the legend on the chart by "
"clicking a location button.\nUse the central button to <b>hide</b> the legend.</qt>"));
gb->layout()->setSpacing(KDialog::spacingHint());
gb->layout()->setMargin(KDialog::marginHint());
gb->setExclusive( true );
QGridLayout *grid1 = new QGridLayout( gb->layout(), 5, 5 );
lTopLeft = addButton( grid1, gb, i18n("Top-Left"), "chart_legend_topleft", 0, 0 );
lTopLeftTop = addButton( grid1, gb, i18n("Top-Left-Top"), "chart_legend_toplefttop", 0, 1 );
lTop = addButton( grid1, gb, i18n("Top"), "chart_legend_top", 0, 2 );
lTopRightTop = addButton( grid1, gb, i18n("Top-Right-Top"), "chart_legend_toprighttop", 0, 3 );
lTopRight = addButton( grid1, gb, i18n("Top-Right"), "chart_legend_topright", 0, 4 );
lTopLeftLeft = addButton( grid1, gb, i18n("Top-Left-Left"), "chart_legend_topleftleft", 1, 0 );
lTopRightRight = addButton( grid1, gb, i18n("Top-Right-Right"), "chart_legend_toprightright", 1, 4 );
lLeft = addButton( grid1, gb, i18n("Left"), "chart_legend_left", 2, 0 );
noLegend = addButton( grid1, gb, i18n("No Legend"), "chart_legend_nolegend", 2, 2 );
lRight = addButton( grid1, gb, i18n("Right"), "chart_legend_right", 2, 4 );
lBottomLeftLeft = addButton( grid1, gb, i18n("Bottom-Left-Left"), "chart_legend_bottomleftleft", 3, 0 );
lBottomRightRight = addButton( grid1, gb, i18n("Bottom-Right-Right"), "chart_legend_bottomrightright", 3, 4 );
lBottomLeft = addButton( grid1, gb, i18n("Bottom-Left"), "chart_legend_bottomleft", 4, 0 );
lBottomLeftBottom = addButton( grid1, gb, i18n("Bottom-Left-Bottom"), "chart_legend_bottomleftbottom", 4, 1 );
lBottom = addButton( grid1, gb, i18n("Bottom"), "chart_legend_bottom", 4, 2 );
lBottomRightBottom= addButton( grid1, gb, i18n("Bottom-Right-Bottom"), "chart_legend_bottomrightbottom",4, 3 );
lBottomRight = addButton( grid1, gb, i18n("Bottom-Right"), "chart_legend_bottomright", 4, 4 );
gb->setAlignment( Qt::AlignLeft );
layout->addMultiCellWidget( gb, 1,2, 0,0 );
// 3. Block: Font
gb = new QButtonGroup( 0, Qt::Vertical, i18n("Font"), this );
QWhatsThis::add(gb, i18n("This Font box can be used to set different fonts for the legend title and the individual entries."));
gb->layout()->setSpacing(KDialog::spacingHint());
gb->layout()->setMargin(KDialog::marginHint());
layout->addWidget( gb, 0, 1 );
QGridLayout *grid4 = new QGridLayout( gb->layout(), 4, 2 );
titleLegendFontButton = new QPushButton( gb );
lab = new QLabel( i18n("Legend title font:"), gb );
grid4->addWidget( lab, 0 ,0 );
titleLegendFontButton->setText( i18n("Select Font...") );
QWhatsThis::add(titleLegendFontButton, i18n("Click here to display the KDE font chooser dialog. You will be able to change the font family, style and size for the legend title."));
grid4->addWidget( titleLegendFontButton, 1, 0 );
lab = new QLabel( i18n("Legend text font:"), gb );
grid4->addWidget( lab, 2, 0 );
textLegendFontButton = new QPushButton( gb );
textLegendFontButton->setText( i18n("Select Font...") );
QWhatsThis::add(textLegendFontButton, i18n("Click here to display the KDE font chooser dialog. You will be able to change the font family, style and size for the legend text."));
grid4->addWidget( textLegendFontButton, 3, 0 );
connect( titleLegendFontButton, SIGNAL(clicked()),
this, SLOT(changeTitleLegendFont()));
connect( textLegendFontButton, SIGNAL(clicked()),
this, SLOT(changeTextLegendFont()));
// 4. Block: Orientation
orientationGroup = new QVButtonGroup( i18n("Orientation"), this );
QWhatsThis::add(orientationGroup, i18n("Select, if the legend's items should be drawn next to each other, or below each other."));
orientationGroup->setRadioButtonExclusive(true);
orientationGroup->layout()->setSpacing(KDialog::spacingHint());
orientationGroup->layout()->setMargin(KDialog::marginHint());
layout->addWidget( orientationGroup, 1, 1 );
QRadioButton* orientation = new QRadioButton( i18n("Vertically"), orientationGroup );
orientation = new QRadioButton( i18n("Horizontally"), orientationGroup );
Q_UNUSED(orientation);
// 5. Block: Text Colors
gb = new QButtonGroup( 0, Qt::Vertical, i18n("Color"), this );
QWhatsThis::add(gb, i18n("This Color box can be used to set different colors for the legend title and text."));
gb->layout()->setSpacing(KDialog::spacingHint());
gb->layout()->setMargin(KDialog::marginHint());
layout->addWidget( gb, 2, 1 );
QGridLayout *grid3 = new QGridLayout( gb->layout(), 6, 2 );
lab = new QLabel( i18n("Legend title color:"), gb );
grid3->addWidget( lab, 0, 0 );
legendTitleColor = new KColorButton( gb );
QWhatsThis::add(legendTitleColor, i18n("Click here to display the KDE Select Color dialog. You will be able to change the color for the legend title."));
grid3->addWidget( legendTitleColor, 1, 0 );
lab = new QLabel( i18n("Legend text color:"), gb );
grid3->addWidget( lab, 2, 0 );
legendTextColor = new KColorButton( gb );
QWhatsThis::add(legendTextColor, i18n("Click here to display the KDE Select Color dialog. You will be able to change the color for the legend text."));
grid3->addWidget( legendTextColor, 3, 0 );
lab = new QLabel( i18n("Legend frame color:"), gb );
grid3->addWidget( lab, 4, 0 );
legendFrameColor = new KColorButton( gb );
QWhatsThis::add(legendFrameColor, i18n("Click here to display the KDE Select Color dialog. You will be able to change the color for the legend frame."));
grid3->addWidget( legendFrameColor, 5, 0 );
//it's not good but I don't know how
//to reduce space
layout->addColSpacing( 1, 300 );
}
void KChartLegendConfigPage::init()
{
switch( _params->legendPosition())
{
case KDChartParams::NoLegend:
noLegend->setOn( true );
break;
case KDChartParams::LegendTop:
lTop->setOn( true );
break;
case KDChartParams::LegendBottom:
lBottom->setOn( true );
break;
case KDChartParams::LegendLeft:
lLeft->setOn( true );
break;
case KDChartParams::LegendRight:
lRight->setOn( true );
break;
case KDChartParams::LegendTopLeft:
lTopLeft->setOn( true );
break;
case KDChartParams::LegendTopLeftTop:
lTopLeftTop->setOn( true );
break;
case KDChartParams::LegendTopLeftLeft:
lTopLeftLeft->setOn( true );
break;
case KDChartParams::LegendTopRight:
lTopRight->setOn( true );
break;
case KDChartParams::LegendTopRightTop:
lTopRightTop->setOn( true );
break;
case KDChartParams::LegendTopRightRight:
lTopRightRight->setOn( true );
break;
case KDChartParams::LegendBottomRight:
lBottomRight->setOn( true );
break;
case KDChartParams::LegendBottomRightBottom:
lBottomRightBottom->setOn( true );
break;
case KDChartParams::LegendBottomRightRight:
lBottomRightRight->setOn( true );
break;
case KDChartParams::LegendBottomLeft:
lBottomLeft->setOn( true );
break;
case KDChartParams::LegendBottomLeftBottom:
lBottomLeftBottom->setOn( true );
break;
case KDChartParams::LegendBottomLeftLeft:
lBottomLeftLeft->setOn( true );
break;
default:
lRight->setOn( true );
break;
}
title->setText(_params->legendTitleText());
legendTitleColor->setColor(_params->legendTitleTextColor());
legendTextColor->setColor(_params->legendTextColor());
QColor frameColor(Qt::black);
bool bFound;
const KDChartParams::KDChartFrameSettings * legendFrame =
_params->frameSettings( KDChartEnums::AreaLegend, bFound );
if( bFound )
{
const KDFrameProfileSection * top =
const_cast<KDFrameProfile&>(legendFrame->frame().profile( KDFrame::ProfileTop )).first();
if( top )
frameColor = top->pen().color();
}
legendFrameColor->setColor(frameColor);
if( _params->legendOrientation() == Qt::Vertical )
orientationGroup->setButton(0);
else
orientationGroup->setButton(1);
titleLegend = _params->legendTitleFont();
titleLegendIsRelative = _params->legendTitleFontUseRelSize()
? QButton::On
: QButton::Off;
if( QButton::On == titleLegendIsRelative )
titleLegend.setPointSize( _params->legendTitleFontRelSize() );
textLegend=_params->legendFont();
textLegendIsRelative = _params->legendFontUseRelSize()
? QButton::On
: QButton::Off;
if( QButton::On == textLegendIsRelative )
textLegend.setPointSize(_params->legendFontRelSize());
}
void KChartLegendConfigPage::changeTitleLegendFont()
{
QButton::ToggleState state = titleLegendIsRelative;
if ( KFontDialog::getFont( titleLegend,false,this, true,&state ) != QDialog::Rejected
&& QButton::NoChange != state )
titleLegendIsRelative = state;
}
void KChartLegendConfigPage::changeTextLegendFont()
{
QButton::ToggleState state = textLegendIsRelative;
if ( KFontDialog::getFont( textLegend,false,this, true,&state ) != QDialog::Rejected
&& QButton::NoChange != state )
textLegendIsRelative = state;
}
void KChartLegendConfigPage::apply()
{
if( noLegend->isOn() )
_params->setLegendPosition( KDChartParams::NoLegend );
else if( lTop->isOn() )
_params->setLegendPosition( KDChartParams::LegendTop );
else if( lBottom->isOn() )
_params->setLegendPosition( KDChartParams::LegendBottom );
else if( lLeft->isOn() )
_params->setLegendPosition( KDChartParams::LegendLeft );
else if( lRight->isOn() )
_params->setLegendPosition( KDChartParams::LegendRight );
else if( lTopLeft->isOn() )
_params->setLegendPosition( KDChartParams::LegendTopLeft );
else if( lTopLeftTop->isOn() )
_params->setLegendPosition( KDChartParams::LegendTopLeftTop );
else if( lTopLeftLeft->isOn() )
_params->setLegendPosition( KDChartParams::LegendTopLeftLeft );
else if( lTopRight->isOn() )
_params->setLegendPosition( KDChartParams::LegendTopRight );
else if( lTopRightTop->isOn() )
_params->setLegendPosition( KDChartParams::LegendTopRightTop );
else if( lTopRightRight->isOn() )
_params->setLegendPosition( KDChartParams::LegendTopRightRight );
else if( lBottomRight->isOn() )
_params->setLegendPosition( KDChartParams::LegendBottomRight );
else if( lBottomRightBottom->isOn() )
_params->setLegendPosition( KDChartParams::LegendBottomRightBottom );
else if( lBottomRightRight->isOn() )
_params->setLegendPosition( KDChartParams::LegendBottomRightRight );
else if( lBottomLeft->isOn() )
_params->setLegendPosition( KDChartParams::LegendBottomLeft );
else if( lBottomLeftBottom->isOn() )
_params->setLegendPosition( KDChartParams::LegendBottomLeftBottom );
else if( lBottomLeftLeft->isOn() )
_params->setLegendPosition( KDChartParams::LegendBottomLeftLeft );
else
_params->setLegendPosition( KDChartParams::LegendRight );
if( orientationGroup->selectedId() == 0 )
_params->setLegendOrientation( Qt::Vertical );
else
_params->setLegendOrientation( Qt::Horizontal );
_params->setLegendTitleText(title->text());
_params->setLegendTitleTextColor(legendTitleColor->color());
_params->setLegendTextColor(legendTextColor->color());
const QColor frameColor(legendFrameColor->color());
if( frameColor == Qt::black )
_params->removeFrame( KDChartEnums::AreaLegend );
else
_params->setSimpleFrame( KDChartEnums::AreaLegend,
0,0, 0,0,
true,
true,
KDFrame::FrameFlat,
1,
0,
frameColor );
_params->setLegendTitleFont(titleLegend, QButton::Off == titleLegendIsRelative);
if( QButton::On == titleLegendIsRelative )
_params->setLegendTitleFontRelSize(titleLegend.pointSize());
_params->setLegendFont(textLegend, QButton::Off == textLegendIsRelative);
if( QButton::On == textLegendIsRelative )
_params->setLegendFontRelSize(textLegend.pointSize());
}
QPushButton* KChartLegendConfigPage::addButton( QGridLayout* layout,
QButtonGroup* gb,
const QString &toolTipText,
const QString &icon,
int posY,
int posX )
{
QPushButton* button = new QPushButton( gb );
button->setToggleButton( true );
button->setPixmap( BarIcon( icon,
KIcon::SizeMedium,
KIcon::DefaultState,
KChartFactory::global() ) );
QToolTip::add( button, toolTipText );
layout->addWidget( button, posY, posX );
return button;
}
} //KChart namespace