kde-playground/kdepim/incidenceeditor-ng/categoryselectdialog.cpp
2015-09-25 09:04:30 +00:00

250 lines
7 KiB
C++

/*
Copyright (c) 2000, 2001, 2002 Cornelius Schumacher <schumacher@kde.org>
Copyright (C) 2003-2004 Reinhold Kainhofer <reinhold@kainhofer.com>
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 "categoryselectdialog.h"
#include "categoryhierarchyreader.h"
#include "ui_categoryselectdialog_base.h"
#include <calendarsupport/categoryconfig.h>
#include <KLocale>
using namespace IncidenceEditorNG;
using namespace CalendarSupport;
class CategorySelectWidgetBase : public QWidget, public Ui::CategorySelectDialog_base
{
public:
CategorySelectWidgetBase( QWidget *parent ) : QWidget( parent )
{
setupUi( this );
#ifdef KDEPIM_MOBILE_UI
mButtonClear->setVisible( false );
mButtonEdit->setVisible( false );
#else
mButtonClear->setIcon( KIcon( "edit-clear-locationbar-rtl" ) );
mButtonEdit->setIcon( KIcon( "document-properties" ) );
#endif
}
};
CategorySelectWidget::CategorySelectWidget( CategoryConfig *cc, QWidget *parent )
: QWidget( parent ), mCategoryConfig( cc )
{
QHBoxLayout *topL = new QHBoxLayout( this );
topL->setMargin( 0 );
topL->setSpacing( KDialog::spacingHint() );
mWidgets = new CategorySelectWidgetBase( this );
topL->addWidget( mWidgets );
connect( mWidgets->mButtonEdit, SIGNAL(clicked()),
SIGNAL(editCategories()) );
connect( mWidgets->mButtonClear, SIGNAL(clicked()),
SLOT(clear()) );
}
CategorySelectWidget::~CategorySelectWidget()
{
}
AutoCheckTreeWidget *CategorySelectWidget::listView() const
{
return mWidgets->mCategories;
}
void CategorySelectWidget::hideButton()
{
mWidgets->mButtonEdit->hide();
mWidgets->mButtonClear->hide();
}
void CategorySelectWidget::setCategories( const QStringList &categoryList )
{
mWidgets->mCategories->clear();
mCategoryList.clear();
QStringList::ConstIterator it;
QStringList cats = mCategoryConfig->customCategories();
for ( it = categoryList.begin(); it != categoryList.end(); ++it ) {
if ( !cats.contains( *it ) ) {
cats.append( *it );
}
}
mCategoryConfig->setCustomCategories( cats );
CategoryHierarchyReaderQTreeWidget( mWidgets->mCategories ).read( cats );
}
void CategorySelectWidget::setSelected( const QStringList &selList )
{
clear();
QStringList::ConstIterator it;
bool remAutoCheckChildren = mWidgets->mCategories->autoCheckChildren();
mWidgets->mCategories->setAutoCheckChildren( false );
for ( it = selList.begin(); it != selList.end(); ++it ) {
QStringList path = CategoryHierarchyReader::path( *it );
QTreeWidgetItem *item = mWidgets->mCategories->itemByPath( path );
if ( item ) {
item->setCheckState( 0, Qt::Checked );
}
}
mWidgets->mCategories->setAutoCheckChildren( remAutoCheckChildren );
}
static QStringList getSelectedCategoriesFromCategoriesView( AutoCheckTreeWidget *categoriesView )
{
QStringList categories;
QTreeWidgetItemIterator it( categoriesView, QTreeWidgetItemIterator::Checked );
while ( *it ) {
QStringList path = categoriesView->pathByItem( *it++ );
if ( path.count() ) {
path.replaceInStrings( CategoryConfig::categorySeparator, QString( "\\" ) +
CategoryConfig::categorySeparator );
categories.append( path.join( CategoryConfig::categorySeparator ) );
}
}
return categories;
}
void CategorySelectWidget::clear()
{
bool remAutoCheckChildren = mWidgets->mCategories->autoCheckChildren();
mWidgets->mCategories->setAutoCheckChildren( false );
QTreeWidgetItemIterator it( mWidgets->mCategories );
while ( *it ) {
( *it++ )->setCheckState( 0, Qt::Unchecked );
}
mWidgets->mCategories->setAutoCheckChildren( remAutoCheckChildren );
}
void CategorySelectWidget::setAutoselectChildren( bool autoselectChildren )
{
mWidgets->mCategories->setAutoCheckChildren( autoselectChildren );
}
void CategorySelectWidget::hideHeader()
{
mWidgets->mCategories->header()->hide();
}
QStringList CategorySelectWidget::selectedCategories( QString &categoriesStr )
{
mCategoryList = getSelectedCategoriesFromCategoriesView( listView() );
categoriesStr = mCategoryList.join( ", " );
return mCategoryList;
}
QStringList CategorySelectWidget::selectedCategories() const
{
return mCategoryList;
}
void CategorySelectWidget::setCategoryList( const QStringList &categories )
{
mCategoryList = categories;
}
CategorySelectDialog::CategorySelectDialog( CategoryConfig *cc, QWidget *parent )
: KDialog( parent ), d( 0 )
{
setCaption( i18n( "Select Categories" ) );
#ifdef KDEPIM_MOBILE_UI
// HACK: This is for maemo, which hides the button if there is only a cancel
// button.
setButtons( KDialog::Ok );
showButtonSeparator( false );
connect( this, SIGNAL(okClicked()), this, SLOT(slotOk()) );
#else
setButtons( Ok | Apply | Cancel | Help );
showButtonSeparator( true );
#endif
QWidget *page = new QWidget;
setMainWidget( page );
QVBoxLayout *lay = new QVBoxLayout( page );
lay->setMargin( 0 );
lay->setSpacing( KDialog::spacingHint() );
mWidgets = new CategorySelectWidget( cc, this );
mWidgets->setObjectName( "CategorySelection" );
mWidgets->hideHeader();
lay->addWidget( mWidgets );
mWidgets->setCategories();
mWidgets->listView()->setFocus();
connect( mWidgets, SIGNAL(editCategories()), SIGNAL(editCategories()) );
connect( this, SIGNAL(okClicked()), this, SLOT(slotOk()) );
connect( this, SIGNAL(applyClicked()), this, SLOT(slotApply()) );
}
CategorySelectDialog::~CategorySelectDialog()
{
delete mWidgets;
}
QStringList CategorySelectDialog::selectedCategories() const
{
return mWidgets->selectedCategories();
}
void CategorySelectDialog::slotApply()
{
QString categoriesStr;
QStringList categories = mWidgets->selectedCategories( categoriesStr );
emit categoriesSelected( categories );
emit categoriesSelected( categoriesStr );
}
void CategorySelectDialog::slotOk()
{
slotApply();
accept();
}
void CategorySelectDialog::updateCategoryConfig()
{
QString tmp;
QStringList selected = mWidgets->selectedCategories( tmp );
mWidgets->setCategories();
mWidgets->setSelected( selected );
}
void CategorySelectDialog::setAutoselectChildren( bool autoselectChildren )
{
mWidgets->setAutoselectChildren( autoselectChildren );
}
void CategorySelectDialog::setCategoryList( const QStringList &categories )
{
mWidgets->setCategoryList( categories );
}
void CategorySelectDialog::setSelected( const QStringList &selList )
{
mWidgets->setSelected( selList );
}