From kde-commits Thu Dec 16 17:30:00 2010 From: =?utf-8?q?Aur=C3=A9lien=20G=C3=A2teau?= Date: Thu, 16 Dec 2010 17:30:00 +0000 To: kde-commits Subject: KDE/kdepim/akregator/src Message-Id: <20101216173001.029B1AC8A8 () svn ! kde ! org> X-MARC-Message: https://marc.info/?l=kde-commits&m=129252065911221 SVN commit 1207041 by gateau: More usable column widths: - Resize the title column when ArticleListView is resized. - By default, hide the feed column in feed mode. - By default, set the date column wide enough to fit all dates. M +63 -5 articlelistview.cpp M +4 -0 articlelistview.h --- trunk/KDE/kdepim/akregator/src/articlelistview.cpp #1207040:1207041 @@ -32,6 +32,8 @@ #include +#include +#include #include #include #include @@ -170,6 +172,7 @@ setModel( columnsProxy ); header()->setContextMenuPolicy( Qt::CustomContextMenu ); + resizeColumnToContents( ArticleModel::ItemTitleColumn ); } void ArticleListView::showHeaderMenu(const QPoint& pos) @@ -279,9 +282,8 @@ if ( model() ) m_feedHeaderState = header()->saveState(); - - header()->restoreState( m_groupHeaderState ); m_columnMode = GroupMode; + restoreHeaderState(); } void ArticleListView::setFeedMode() @@ -292,10 +294,66 @@ header()->resizeSection( header()->logicalIndex( header()->count() - 1 ), 1 ); if ( model() ) m_groupHeaderState = header()->saveState(); - header()->restoreState( m_feedHeaderState ); m_columnMode = FeedMode; + restoreHeaderState(); } +static int maxDateColumnWidth( const QFontMetrics &fm ) +{ + int width = 0; + KDateTime date( KDateTime::currentLocalDate(), QTime(23, 59) ); + for (int x=0; x<10; x++, date = date.addDays( -1 ) ) { + QString txt = ' ' + KGlobal::locale()->formatDateTime(date, KLocale::FancyShortDate ) + ' '; + width = qMax( width, fm.width( txt ) ); + } + return width; +} + +void ArticleListView::restoreHeaderState() +{ + QByteArray state = m_columnMode == GroupMode ? m_groupHeaderState : m_feedHeaderState; + header()->restoreState( state ); + if ( state.isEmpty() ) + { + // No state, set a default config: + // - hide the feed column in feed mode (no need to see the same feed title over and over) + // - set the date column wide enough to fit all possible dates + header()->setSectionHidden( ArticleModel::FeedTitleColumn, m_columnMode == FeedMode ); + header()->resizeSection( ArticleModel::DateColumn, maxDateColumnWidth(fontMetrics()) ); + } + + header()->setStretchLastSection( false ); + startResizingTitleColumn(); +} + +void ArticleListView::startResizingTitleColumn() +{ + // set the title column to Stretch resize mode so that it adapts to the + // content. finishResizingTitleColumn() will turn the resize mode back to + // Interactive so that the user can still resize the column himself if he + // wants to + header()->setResizeMode( ArticleModel::ItemTitleColumn, QHeaderView::Stretch ); + QMetaObject::invokeMethod( this, "finishResizingTitleColumn", Qt::QueuedConnection ); +} + +void ArticleListView::finishResizingTitleColumn() +{ + if ( QApplication::mouseButtons() != Qt::NoButton ) + { + // Come back later: user is still resizing the widget + QMetaObject::invokeMethod( this, "finishResizingTitleColumn", Qt::QueuedConnection ); + return; + } + header()->setResizeMode( QHeaderView::Interactive ); +} + +void ArticleListView::resizeEvent(QResizeEvent *event) +{ + QTreeView::resizeEvent( event ); + if ( header() && model() && header()->resizeMode( ArticleModel::ItemTitleColumn ) != QHeaderView::Stretch ) + startResizingTitleColumn(); +} + ArticleListView::~ArticleListView() { saveHeaderSettings(); @@ -432,8 +490,8 @@ if ( m ) { - header()->resizeSection( header()->logicalIndex( header()->count() - 1 ), 1 ); - header()->restoreState( groupMode ? m_groupHeaderState : m_feedHeaderState ); + sortByColumn( ArticleModel::DateColumn, Qt::DescendingOrder ); + restoreHeaderState(); // Ensure at least one column is visible if ( header()->hiddenSectionCount() == header()->count() ) { --- trunk/KDE/kdepim/akregator/src/articlelistview.h #1207040:1207041 @@ -126,6 +126,7 @@ protected: void mousePressEvent( QMouseEvent *ev ); + void resizeEvent( QResizeEvent *ev ); signals: void signalMouseButtonPressed( int, const KUrl ); @@ -147,6 +148,7 @@ void userActionTakingPlace(); private: + void restoreHeaderState(); void saveHeaderSettings(); void loadHeaderSettings(); @@ -163,6 +165,8 @@ private Q_SLOTS: void showHeaderMenu( const QPoint& pos ); + void startResizingTitleColumn(); + void finishResizingTitleColumn(); private: