From kde-commits Fri Aug 22 03:04:53 2008 From: Teemu Rytilahti Date: Fri, 22 Aug 2008 03:04:53 +0000 To: kde-commits Subject: KDE/kdepim/akregator/src Message-Id: <1219374293.133547.4851.nullmailer () svn ! kde ! org> X-MARC-Message: https://marc.info/?l=kde-commits&m=121937432621829 SVN commit 850696 by rytilahti: - use saveState()/restoreState() for handling the header states. -- The sizes for the feedlist are saved now correctly, as well as the shown items. Also the ordering is saved now. -- Call loadHeaderList only once, now it doesn't display the ugly horizontal scrollbar after being restarted \o/ - adapt subscriptionlistview to use the popupmenu stuff for the headers like articlelistview did already. - move connecting the rmb click on the header to be inside the ctor to avoid multiple connections (and thus multiple popupmenus) saveState()/restoreState() wasn't used due to some Qt-bug? I only had problem while trying to directly use Settings class to save the settings, with KConfigGroup it works just fine. could this be a bug in KConfigXT instead of in Qt? TODO: - ArticleListView does not still respect the sizes its entries has been given to, needs to be fixed (perhaps by setting up the headers some other way than directly inside setModel()? - Backporting to 4.1 branch after that's been done. - Figuring out whether we need feed specific header settings. CCMAIL:frank.osterfeld@kdemail.net CCMAIL:l.appelhans@gmx.de BUG:167803 CCBUG:152702 M +15 -32 articlelistview.cpp M +41 -46 subscriptionlistview.cpp M +1 -2 subscriptionlistview.h --- trunk/KDE/kdepim/akregator/src/articlelistview.cpp #850695:850696 @@ -142,13 +142,6 @@ void ArticleListView::setArticleModel( ArticleModel* model ) { - //const QByteArray headerState = header()->saveState(); - QList columnsSize; - for (int i = 0; i < header()->count(); ++i) - columnsSize.append( columnWidth( i ) ); - - //FIXME: HACK: Change back to saveState() when it's working again - slotClear(); if ( !model ) return; @@ -168,9 +161,6 @@ columnsProxy->setColumnEnabled( ArticleModel::AuthorColumn ); setModel( columnsProxy ); - //header()->restoreState( headerState ); - for (int i = 0; i < columnsSize.count(); ++i) - setColumnWidth( i, columnsSize.at( i ) ); if ( !m_headerSetUp ) { @@ -178,8 +168,6 @@ m_headerSetUp = true; } header()->setContextMenuPolicy( Qt::CustomContextMenu ); - connect( header(), SIGNAL( customContextMenuRequested( QPoint ) ), - this, SLOT( showHeaderMenu( QPoint ) ) ); } void ArticleListView::showHeaderMenu(const QPoint& pos) @@ -217,31 +205,24 @@ void ArticleListView::saveHeaderSettings() { - //Settings::setArticlelistHeaderStates( header()->saveState().toBase64() ); - QList columnsSize; - for (int i = 0; i < header()->count(); i++) - columnsSize.append( columnWidth( i ) ); - //FIXME: HACK: Change back to saveState() when the Qt-bug is fixed - Settings::setArticlelistHeaderStates(columnsSize); - Settings::setArticlelistSortColumn( header()->sortIndicatorSection() ); - Settings::setArticlelistSortOrder( header()->sortIndicatorOrder() == Qt::AscendingOrder ? 1 : 0 ); + // is it qt-bug, really? at least saveState is working, but calling the next line causes app to hang.. -Teemu + //Settings::setArticlelistHeaderStates( header()->saveState().toBase64() ); + + QByteArray s = header()->saveState(); + KConfigGroup conf( Settings::self()->config(), "General" ); + conf.writeEntry( "ArticleListHeaders", s.toBase64() ); } void ArticleListView::loadHeaderSettings() { - /*const QByteArray s = QByteArray::fromBase64( Settings::articlelistHeaderStates().toAscii() ); - if ( !s.isNull() ) - header()->restoreState( s );*/ - QList columnsSize = Settings::articlelistHeaderStates(); - if ( !columnsSize.isEmpty() ) { - for (int i = 0; i < columnsSize.count(); i++) - setColumnWidth( i, columnsSize.at( i ) ); - - //FIXME: HACK: Change back to saveState() when the Qt-bug is fixed - } - header()->setSortIndicator( Settings::articlelistSortColumn(), ( Settings::articlelistSortOrder() == 1 ? Qt::AscendingOrder : Qt::DescendingOrder ) ); - sortByColumn( Settings::articlelistSortColumn(), ( Settings::articlelistSortOrder() == 1 ? Qt::AscendingOrder : Qt::DescendingOrder ) ); + //FIXME: HACK: change back to loadState+Settings class instead of using KConfigGroup directly.. + //QByteArray s = QByteArray::fromBase64( Settings::feedlistHeaderStates().toAscii() ); // this fails currently, I think -Teemu + + KConfigGroup conf( Settings::self()->config(), "General" ); + QByteArray s = QByteArray::fromBase64( conf.readEntry( "ArticleListHeaders" ).toAscii() ); + if( !s.isNull() ) + header()->restoreState( s ); } QItemSelectionModel* ArticleListView::articleSelectionModel() const @@ -309,6 +290,8 @@ "Here you can browse articles from the currently selected feed. " "You can also manage articles, as marking them as persistent (\"Keep Article\") or delete them, using the right mouse button menu." "To view the web page of the article, you can open the article internally in a tab or in an external browser window.")); + + connect( header(), SIGNAL( customContextMenuRequested( QPoint ) ), this, SLOT( showHeaderMenu( QPoint ) ) ); } void ArticleListView::mousePressEvent( QMouseEvent *ev ) --- trunk/KDE/kdepim/akregator/src/subscriptionlistview.cpp #850695:850696 @@ -28,6 +28,7 @@ #include #include +#include #include #include @@ -134,6 +135,8 @@ setDragDropMode( QAbstractItemView::DragDrop ); setDropIndicatorShown( true ); setAcceptDrops( true ); + m_headerSetup = false; + connect( header(), SIGNAL( customContextMenuRequested( const QPoint & ) ), this, SLOT( showHeaderMenu( const QPoint& ) ) ); } Akregator::SubscriptionListView::~SubscriptionListView() @@ -160,73 +163,65 @@ setExpanded( i, i.data( Akregator::SubscriptionListModel::IsOpenRole ).toBool() ); } - // To show/hide specific columns, borrowed from KTorrent header()->setContextMenuPolicy( Qt::CustomContextMenu ); - connect( header(), SIGNAL( customContextMenuRequested( const QPoint & ) ), this, SLOT( showHeaderMenu( const QPoint& ) ) ); - m_headerMenu = new KMenu( this ); - m_headerMenu->addTitle( i18n( "Columns" ) ); - for (int i = 0; i < model->columnCount(); i++) - { - QString col = model->headerData( i, Qt::Horizontal, Qt::DisplayRole ).toString(); - QAction* act = m_headerMenu->addAction( col ); - act->setCheckable( true ); - act->setChecked( true ); - m_columnMap[act] = i; + if( ! m_headerSetup ) { + loadHeaderSettings(); + m_headerSetup = true; } - - connect(m_headerMenu, SIGNAL( triggered( QAction* ) ), this, SLOT( headerMenuItemTriggered( QAction* ) ) ); - - loadHeaderSettings(); } void Akregator::SubscriptionListView::showHeaderMenu( const QPoint& pos ) { - m_headerMenu->popup( header()->mapToGlobal( pos ) ); + if( ! model() ) + return; + + QPointer menu = new KMenu( this ); + menu->addTitle( i18n( "Columns" ) ); + menu->setAttribute( Qt::WA_DeleteOnClose ); + connect(menu, SIGNAL( triggered( QAction* ) ), this, SLOT( headerMenuItemTriggered( QAction* ) ) ); + + for (int i = 0; i < model()->columnCount(); i++) + { + QString col = model()->headerData( i, Qt::Horizontal, Qt::DisplayRole ).toString(); + QAction* act = menu->addAction( col ); + act->setCheckable( true ); + act->setChecked( !header()->isSectionHidden( i ) ); + act->setData( i ); + } + + menu->popup( header()->mapToGlobal( pos ) ); } void Akregator::SubscriptionListView::headerMenuItemTriggered( QAction* act ) { - int idx = m_columnMap[act]; + assert( act ); + const int col = act->data().toInt(); if ( act->isChecked() ) - header()->showSection( idx ); + header()->showSection( col ); else - header()->hideSection( idx ); + header()->hideSection( col ); } void Akregator::SubscriptionListView::saveHeaderSettings() -{ - //QByteArray s = header()->saveState(); - //Settings::setFeedlistHeaderStates( s.toBase64() ); - QList columnsSize; - for (int i = 0; i != header()->count(); i++) - { - kDebug() << i; - columnsSize.append( columnWidth( i ) ); - }//FIXME: HACK: Change back to saveState() when the Qt-bug is fixed - Settings::setFeedlistHeaderStates( columnsSize ); +{ + QByteArray s = header()->saveState(); + KConfigGroup conf( Settings::self()->config(), "General" ); + conf.writeEntry( "SubscriptionListHeaders", s.toBase64() ); + + //FIXME: HACK: Change back to Settings, when it starts to work again.. + // Settings::setFeedlistHeaderStates( s.toBase64() ); } void Akregator::SubscriptionListView::loadHeaderSettings() { + // FIXME: HACK: Change back to Settings when it's working //QByteArray s = QByteArray::fromBase64( Settings::feedlistHeaderStates().toAscii() ); - //if ( !s.isNull() ) - // header()->restoreState( s ); - QList columnsSize = Settings::feedlistHeaderStates(); - if ( !columnsSize.isEmpty() ) { - for (int i = 0; i != columnsSize.count(); i++) - { - kDebug() << i << " " << columnsSize.at( i ); - setColumnWidth( i, columnsSize.at( i ) ); - }//FIXME: HACK: Change back to saveState() when the Qt-bug is fixed - } - QMap::iterator i = m_columnMap.begin(); - while ( i != m_columnMap.end() ) - { - QAction* act = i.key(); - act->setChecked( !header()->isSectionHidden( i.value() ) ); - i++; - } + + KConfigGroup conf( Settings::self()->config(), "General" ); + QByteArray s = QByteArray::fromBase64( conf.readEntry( "SubscriptionListHeaders" ).toAscii() ); + if( !s.isNull() ) + header()->restoreState( s ); } void Akregator::SubscriptionListView::slotPrevFeed() --- trunk/KDE/kdepim/akregator/src/subscriptionlistview.h #850695:850696 @@ -83,8 +83,7 @@ void headerMenuItemTriggered( QAction* action ); private: - QMap m_columnMap; - KMenu *m_headerMenu; + bool m_headerSetup; }; }