[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: KDE/kdepim/akregator/src
From: Aurélien Gâteau <agateau () kde ! org>
Date: 2010-12-16 17:30:00
Message-ID: 20101216173001.029B1AC8A8 () svn ! kde ! org
[Download RAW message or body]
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 <utils/filtercolumnsproxymodel.h>
+#include <KDateTime>
+#include <KGlobal>
#include <KIcon>
#include <KLocale>
#include <KUrl>
@@ -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:
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic