From kde-commits Mon Jan 31 23:37:23 2011 From: =?utf-8?q?Stefan_B=C3=B6hmann?= Date: Mon, 31 Jan 2011 23:37:23 +0000 To: kde-commits Subject: =?utf-8?q?=5Bknipptasch=5D_/=3A_Move_CategoryComboBox_from_gui/_?= Message-Id: <20110131233723.34502A60CE () git ! kde ! org> X-MARC-Message: https://marc.info/?l=kde-commits&m=129651712606199 Git commit 9253b28d599bbc31c2066ab25491177619b76d0e by Stefan Böhmann. Pushed by sboehmann into branch 'master'. Move CategoryComboBox from gui/ to core/widgets M +2 -0 core/CMakeLists.txt A +1 -0 core/include/Knipptasch/CategoryComboBox [License: UNKNOWN] A +223 -0 core/widgets/categorycombobox.cpp [License: GPL (v2+)] A +77 -0 core/widgets/categorycombobox.h [License: GPL (v2+)] M +0 -2 gui/CMakeLists.txt D +0 -226 gui/categorycombobox.cpp D +0 -75 gui/categorycombobox.h M +9 -4 gui/delegate/categorydelegate.cpp http://commits.kde.org/knipptasch/9253b28d599bbc31c2066ab25491177619b76d0e diff --git a/core/CMakeLists.txt b/core/CMakeLists.txt index 053f74a..e06a3a2 100644 --- a/core/CMakeLists.txt +++ b/core/CMakeLists.txt @@ -26,6 +26,7 @@ set( knipptasch_core_SOURCES widgets/dateedit.cpp widgets/datevalidator.cpp widgets/datepickerpopup.cpp + widgets/categorycombobox.cpp backend/object.cpp backend/category.cpp @@ -53,6 +54,7 @@ set( knipptasch_core_HEADERS widgets/dateedit.h widgets/datevalidator.h widgets/datepickerpopup.h + widgets/categorycombobox.h backend/object.h backend/category.h diff --git a/core/include/Knipptasch/CategoryComboBox b/core/include/Knipptasch/CategoryComboBox new file mode 100644 index 0000000..0318436 --- /dev/null +++ b/core/include/Knipptasch/CategoryComboBox @@ -0,0 +1 @@ +#include "widgets/categorycombobox.h" diff --git a/core/widgets/categorycombobox.cpp b/core/widgets/categorycombobox.cpp new file mode 100644 index 0000000..d588d06 --- /dev/null +++ b/core/widgets/categorycombobox.cpp @@ -0,0 +1,223 @@ +/* + * Copyright 2010, 2011 by Stefan Böhmann + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +#include "categorycombobox.h" + +#include "backend/account.h" +#include "backend/category.h" + +#include +#include +#include +#include +#include +#include +#include + + + +CategoryComboBox::CategoryComboBox(const Account *account, QWidget* parent) + : KComboBox( parent ), + m_view( new QTreeView( this ) ), + m_model( new QStandardItemModel( this ) ), + m_account( 0 ), + m_skipNextHide( false ), + m_selectedCategory( -1 ) +{ + m_view->header()->hide(); + m_view->setRootIsDecorated( false ); + m_view->setAnimated( true ); + m_view->setUniformRowHeights( true ); + m_view->setEditTriggers( QAbstractItemView::NoEditTriggers ); + m_view->setSelectionBehavior( QAbstractItemView::SelectRows ); + + setView( m_view ); + setModel( m_model ); + + view()->viewport()->installEventFilter( this ); + + setAccount( account ); +} + + +const Account* CategoryComboBox::account() const +{ + return m_account; +} + + +void CategoryComboBox::setAccount(const Account *account) +{ + Q_ASSERT( m_model ); + + m_selectedCategory = -1; + m_account = account; + + m_items.clear(); + m_model->clear(); + + if( !m_account ) { + return; + } + + Q_ASSERT( m_account->rootCategory() ); + + QStandardItem *item = new QStandardItem( tr( "None" ) ); + item->setData( -1, Qt::UserRole ); + + for(int i = 0; i < m_account->rootCategory()->countCategories(); ++i) { + addCategory( item, m_account->rootCategory()->category( i ) ); + } + + m_model->appendRow( item ); + m_items.insert( item ); + + m_view->expandToDepth( 3 ); +} + + +const Category* CategoryComboBox::selectedCategory() const +{ + Object *object = account()->objectByIdentifier( m_selectedCategory ); + if( object ) { + Category *category = qobject_cast( object ); + Q_ASSERT( category ); + + return category; + } + + return 0; +} + + +Category* CategoryComboBox::selectedCategory() +{ + Object *object = account()->objectByIdentifier( m_selectedCategory ); + if( object ) { + Category *category = qobject_cast( object ); + Q_ASSERT( category ); + + return category; + } + + return 0; +} + + +void CategoryComboBox::setSelectedCategory(const Category *category) +{ + m_selectedCategory = account()->identifierByObject( category ); +} + + +bool CategoryComboBox::eventFilter(QObject *object, QEvent *event) +{ + if( event->type() == QEvent::MouseButtonPress ) { + if( object == view()->viewport() ) { + QMouseEvent* mouseEvent = static_cast( event ); + + QModelIndex index = view()->indexAt( mouseEvent->pos() ); + if( !view()->visualRect( index ).contains( mouseEvent->pos() ) ) { + m_skipNextHide = true; + } + } + } + + return false; +} + + +void CategoryComboBox::showPopup() +{ + QModelIndex index; + if( m_selectedCategory >= 0 ) { + foreach(QStandardItem *item, m_items) { + bool ok; + int itemid = item->data( Qt::UserRole ).toInt( &ok ); + Q_ASSERT( ok ); + + if( itemid == m_selectedCategory ) { + index = m_model->indexFromItem( item ); + Q_ASSERT( index.isValid() ); + + break; + } + } + } + + QComboBox::showPopup(); + + m_view->setCurrentIndex( index ); + m_view->scrollTo( index ); +} + + +void CategoryComboBox::hidePopup() +{ + if( m_skipNextHide ) { + m_skipNextHide = false; + return; + } + + if( m_view->currentIndex().isValid() ) { + bool ok; + int id = m_model->itemFromIndex( m_view->currentIndex() ) + ->data( Qt::UserRole ).toInt( &ok ); + Q_ASSERT( ok ); + + m_selectedCategory = id; + } + + QComboBox::hidePopup(); +} + + +void CategoryComboBox::addCategory(QStandardItem *parent, const Category *cat) +{ + Q_ASSERT( parent ); + Q_ASSERT( cat ); + + QStandardItem *item = new QStandardItem( renderCategoryIcon( cat ), cat->name() ); + item->setData( account()->identifierByObject( cat ), Qt::UserRole ); + + parent->appendRow( item ); + m_items.insert( item ); + + for(int i = 0; i < cat->countCategories(); ++i) { + addCategory( item, cat->category( i ) ); + } +} + + +QIcon CategoryComboBox::renderCategoryIcon(const Category *category) +{ + if( category && category->color().isValid() ) { + QPixmap pix( 128, 128 ); + + QPainter painter( &pix ); + painter.setPen( QPen( palette().color( QPalette::Dark ), 10 ) ); + painter.setBrush( category->color() ); + painter.drawRect( pix.rect() ); + + return QIcon( pix ); + } + + return QIcon(); +} + + +// kate: word-wrap off; encoding utf-8; indent-width 4; tab-width 4; line-numbers on; mixed-indent off; remove-trailing-space-save on; replace-tabs-save on; replace-tabs on; space-indent on; +// vim:set spell et sw=4 ts=4 nowrap cino=l1,cs,U1: diff --git a/core/widgets/categorycombobox.h b/core/widgets/categorycombobox.h new file mode 100644 index 0000000..dfccb9c --- /dev/null +++ b/core/widgets/categorycombobox.h @@ -0,0 +1,77 @@ +/* + * Copyright 2010, 2011 by Stefan Böhmann + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +#ifndef CATEGORYCOMBOBOX_H +#define CATEGORYCOMBOBOX_H + +#include "knipptasch_core_export.h" + +#include +#include + +class QTreeView; +class QEvent; +class QStandardItem; +class QStandardItemModel; +class QStandardItem; + +class Category; +class Account; + + +/** + * @class CategoryComboBox + * @brief + * + * @author Stefan Böhmann + */ +class KNIPPTASCH_CORE_EXPORT CategoryComboBox : public KComboBox +{ + Q_OBJECT + + public: + CategoryComboBox(const Account *account, QWidget *parent = 0); + + const Account* account() const; + void setAccount(const Account *account); + + const Category* selectedCategory() const; + Category* selectedCategory(); + void setSelectedCategory(const Category *category); + + bool eventFilter(QObject *object, QEvent *event); + + void showPopup(); + void hidePopup(); + + private: + void addCategory(QStandardItem *parent, const Category *category); + QIcon renderCategoryIcon(const Category *category); + + private: + QTreeView *m_view; + QStandardItemModel *m_model; + QSet m_items; + const Account *m_account; + bool m_skipNextHide; + int m_selectedCategory; +}; + + +#endif + +// kate: word-wrap off; encoding utf-8; indent-width 4; tab-width 4; line-numbers on; mixed-indent off; remove-trailing-space-save on; replace-tabs-save on; replace-tabs on; space-indent on; +// vim:set spell et sw=4 ts=4 nowrap cino=l1,cs,U1: diff --git a/gui/CMakeLists.txt b/gui/CMakeLists.txt index 90db1e1..82a9374 100644 --- a/gui/CMakeLists.txt +++ b/gui/CMakeLists.txt @@ -10,7 +10,6 @@ set(knipptasch_SOURCES quickreportpopup.cpp quickreportwidget.cpp passworddialog.cpp - categorycombobox.cpp main.cpp config/configdialog.cpp @@ -45,7 +44,6 @@ set( knipptasch_HEADERS quickreportpopup.h quickreportwidget.h passworddialog.h - categorycombobox.h config/configdialog.h config/configwidget.h diff --git a/gui/categorycombobox.cpp b/gui/categorycombobox.cpp deleted file mode 100644 index 0906612..0000000 --- a/gui/categorycombobox.cpp +++ /dev/null @@ -1,226 +0,0 @@ -/* - * Copyright 2010 Stefan Böhmann - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of - * the License, or (at your option) any later version. - * - * This program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -#include "categorycombobox.h" - -#include "backend/account.h" -#include "backend/category.h" -#include "preferences.h" - -#include -#include -#include -#include -#include -#include -#include - -#include - - -CategoryComboBox::CategoryComboBox(const Account *account, QWidget* parent) - : KComboBox( parent ), - m_view( new QTreeView( this ) ), - m_model( new QStandardItemModel( this ) ), - m_account( 0 ), - m_skipNextHide( false ), - m_selectedCategory( -1 ) -{ - m_view->header()->hide(); - m_view->setMinimumSize( Preferences::self()->minimumCategoryComboBoxPopupSize() ); - m_view->setRootIsDecorated( false ); - m_view->setAnimated( true ); - m_view->setUniformRowHeights( true ); - m_view->setEditTriggers( QAbstractItemView::NoEditTriggers ); - m_view->setSelectionBehavior( QAbstractItemView::SelectRows ); - - setView( m_view ); - setModel( m_model ); - - view()->viewport()->installEventFilter( this ); - - setAccount( account ); -} - - -const Account* CategoryComboBox::account() const -{ - return m_account; -} - - -void CategoryComboBox::setAccount(const Account *account) -{ - Q_ASSERT( m_model ); - - m_selectedCategory = -1; - m_account = account; - - m_items.clear(); - m_model->clear(); - - if( !m_account ) { - return; - } - - Q_ASSERT( m_account->rootCategory() ); - - QStandardItem *item = new QStandardItem( tr( "None" ) ); - item->setData( -1, Qt::UserRole ); - - for(int i = 0; i < m_account->rootCategory()->countCategories(); ++i) { - addCategory( item, m_account->rootCategory()->category( i ) ); - } - - m_model->appendRow( item ); - m_items.insert( item ); - - m_view->expandToDepth( 3 ); -} - - -const Category* CategoryComboBox::selectedCategory() const -{ - Object *object = account()->objectByIdentifier( m_selectedCategory ); - if( object ) { - Category *category = qobject_cast( object ); - Q_ASSERT( category ); - - return category; - } - - return 0; -} - - -Category* CategoryComboBox::selectedCategory() -{ - Object *object = account()->objectByIdentifier( m_selectedCategory ); - if( object ) { - Category *category = qobject_cast( object ); - Q_ASSERT( category ); - - return category; - } - - return 0; -} - - -void CategoryComboBox::setSelectedCategory(const Category *category) -{ - m_selectedCategory = account()->identifierByObject( category ); -} - - -bool CategoryComboBox::eventFilter(QObject *object, QEvent *event) -{ - if( event->type() == QEvent::MouseButtonPress ) { - if( object == view()->viewport() ) { - QMouseEvent* mouseEvent = static_cast( event ); - - QModelIndex index = view()->indexAt( mouseEvent->pos() ); - if( !view()->visualRect( index ).contains( mouseEvent->pos() ) ) { - m_skipNextHide = true; - } - } - } - - return false; -} - - -void CategoryComboBox::showPopup() -{ - QModelIndex index; - if( m_selectedCategory >= 0 ) { - foreach(QStandardItem *item, m_items) { - bool ok; - int itemid = item->data( Qt::UserRole ).toInt( &ok ); - Q_ASSERT( ok ); - - if( itemid == m_selectedCategory ) { - index = m_model->indexFromItem( item ); - Q_ASSERT( index.isValid() ); - - break; - } - } - } - - QComboBox::showPopup(); - - m_view->setCurrentIndex( index ); - m_view->scrollTo( index ); -} - - -void CategoryComboBox::hidePopup() -{ - if( m_skipNextHide ) { - m_skipNextHide = false; - return; - } - - if( m_view->currentIndex().isValid() ) { - bool ok; - int id = m_model->itemFromIndex( m_view->currentIndex() ) - ->data( Qt::UserRole ).toInt( &ok ); - Q_ASSERT( ok ); - - m_selectedCategory = id; - } - - QComboBox::hidePopup(); -} - - -void CategoryComboBox::addCategory(QStandardItem *parent, const Category *cat) -{ - Q_ASSERT( parent ); - Q_ASSERT( cat ); - - QStandardItem *item = new QStandardItem( renderCategoryIcon( cat ), cat->name() ); - item->setData( account()->identifierByObject( cat ), Qt::UserRole ); - - parent->appendRow( item ); - m_items.insert( item ); - - for(int i = 0; i < cat->countCategories(); ++i) { - addCategory( item, cat->category( i ) ); - } -} - - -QIcon CategoryComboBox::renderCategoryIcon(const Category *category) -{ - if( category && category->color().isValid() ) { - QPixmap pix( 128, 128 ); - - QPainter painter( &pix ); - painter.setPen( QPen( palette().color( QPalette::Dark ), 10 ) ); - painter.setBrush( category->color() ); - painter.drawRect( pix.rect() ); - - return QIcon( pix ); - } - - return QIcon(); -} - - -// kate: word-wrap off; encoding utf-8; indent-width 4; tab-width 4; line-numbers on; mixed-indent off; remove-trailing-space-save on; replace-tabs-save on; replace-tabs on; space-indent on; -// vim:set spell et sw=4 ts=4 nowrap cino=l1,cs,U1: diff --git a/gui/categorycombobox.h b/gui/categorycombobox.h deleted file mode 100644 index 99716ad..0000000 --- a/gui/categorycombobox.h +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Copyright 2010 by Stefan Böhmann - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of - * the License, or (at your option) any later version. - * - * This program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -#ifndef CATEGORYCOMBOBOX_H -#define CATEGORYCOMBOBOX_H - -#include -#include - -class QTreeView; -class QEvent; -class QStandardItem; -class QStandardItemModel; -class QStandardItem; - -class Category; -class Account; - - -/** - * @class CategoryComboBox - * @brief - * - * @author Stefan Böhmann - */ -class CategoryComboBox : public KComboBox -{ - Q_OBJECT - - public: - CategoryComboBox(const Account *account, QWidget *parent = 0); - - const Account* account() const; - void setAccount(const Account *account); - - const Category* selectedCategory() const; - Category* selectedCategory(); - void setSelectedCategory(const Category *category); - - bool eventFilter(QObject *object, QEvent *event); - - void showPopup(); - void hidePopup(); - - private: - void addCategory(QStandardItem *parent, const Category *category); - QIcon renderCategoryIcon(const Category *category); - - private: - QTreeView *m_view; - QStandardItemModel *m_model; - QSet m_items; - const Account *m_account; - bool m_skipNextHide; - int m_selectedCategory; -}; - - -#endif - -// kate: word-wrap off; encoding utf-8; indent-width 4; tab-width 4; line-numbers on; mixed-indent off; remove-trailing-space-save on; replace-tabs-save on; replace-tabs on; space-indent on; -// vim:set spell et sw=4 ts=4 nowrap cino=l1,cs,U1: diff --git a/gui/delegate/categorydelegate.cpp b/gui/delegate/categorydelegate.cpp index b76b1c1..adc2ed8 100644 --- a/gui/delegate/categorydelegate.cpp +++ b/gui/delegate/categorydelegate.cpp @@ -15,17 +15,21 @@ * along with this program. If not, see . */ #include "categorydelegate.h" -#include "categorycombobox.h" -#include "backend/account.h" -#include "backend/posting.h" -#include "backend/category.h" +#include + +#include +#include +#include #include "accountsortfilterproxymodel.h" +#include "preferences.h" + #include #include #include +#include @@ -46,6 +50,7 @@ QWidget* CategoryDelegate::createEditor(QWidget *parent, const QStyleOptionViewI CategoryComboBox *input = new CategoryComboBox( model->account(), parent ); input->setFrame( false ); + input->view()->setMinimumSize( Preferences::self()->minimumCategoryComboBoxPopupSize() ); return input; }