mirror of
https://bitbucket.org/smil3y/kde-playground.git
synced 2025-02-24 02:42:51 +00:00
469 lines
15 KiB
C++
469 lines
15 KiB
C++
#ifndef KDEPIM_FOLDERTREEWIDGET_H
|
|
#define KDEPIM_FOLDERTREEWIDGET_H
|
|
|
|
/******************************************************************************
|
|
*
|
|
* This file is part of libkdepim.
|
|
*
|
|
* Copyright (C) 2008 Szymon Tomasz Stefanek <pragma@kvirc.net>
|
|
*
|
|
* 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.
|
|
*
|
|
*****************************************************************************/
|
|
|
|
/**
|
|
* @file foldertreewidget.h A basic implementation of an UI for a tree of folders
|
|
*/
|
|
|
|
#include "knode_export.h"
|
|
#include "treewidget.h"
|
|
|
|
#include <QHash>
|
|
#include <QColor>
|
|
|
|
namespace KPIM
|
|
{
|
|
|
|
class FolderTreeWidgetItem;
|
|
|
|
/**
|
|
* @brief A tree widget useful for displaying a tree of folders containing messages
|
|
*
|
|
* This widget provides some facilities commonly used to display a tree of folders
|
|
* containing messages.
|
|
*
|
|
* Besides the standard functionality of a KPIM::TreeWidget this implementation will handle
|
|
* four special columns: the "Label", the "Unread", the "Total" and the "DataSize" column.
|
|
*
|
|
* You add a Label column with addLabelColumn(). It will fetch the text data from
|
|
* FolderTreeWidgetItem::labelText() instead of QTreeWidgetItem::text(). It will
|
|
* also display the unread message count if the "Unread" column is not visible.
|
|
*
|
|
* You add a "Unread" column with addUnreadColumn(). It will fetch the numeric
|
|
* count of unread messages from FolderTreeWidgetItem::unreadCount() and
|
|
* it will automatically display it aligned to the right.
|
|
*
|
|
* You add a "Total" column with addTotalColumn(). It will fetch the numeric
|
|
* total count of messages from FolderTreeWidgetItem::totalCount() and it will
|
|
* automatically display it aligned to the right.
|
|
*
|
|
* You add a "DataSize" column with addSizeColumn(). It will fetch the size in bytes
|
|
* of the message folder from FolderTreeWidgetItem::size() and it will
|
|
* display it aligned to the right and with a suitable textual rappresentation.
|
|
*
|
|
* You can set the color of the unread message count with setUnreadCountColor().
|
|
* When the items are marked with the closeToQuota() warning then the text in the
|
|
* "Label" column is displayed with the color set by setCloseToQuotaWarningColor().
|
|
*
|
|
* @author: Szymon Tomasz Stefanek <pragma@kvirc.net>
|
|
*/
|
|
class KNODE_EXPORT FolderTreeWidget : public KPIM::TreeWidget
|
|
{
|
|
friend class FolderTreeWidgetItemLabelColumnDelegate;
|
|
Q_OBJECT
|
|
public:
|
|
/**
|
|
* Constructs a FolderTreeWidget instance.
|
|
*/
|
|
explicit FolderTreeWidget( QWidget *parent , const char *name = 0 );
|
|
|
|
private:
|
|
/**
|
|
* Emits the renamed() signal
|
|
*/
|
|
void emitRenamed( QTreeWidgetItem *item );
|
|
int mLabelColumnIndex; ///< The index for the special "Label" column or -1 if none
|
|
int mUnreadColumnIndex; ///< The index for the special "Unread" column or -1 if none
|
|
int mTotalColumnIndex; ///< The index for the special "Total" column or -1 if none
|
|
int mDataSizeColumnIndex; ///< The index for the special "DataSize" column or -1 if none
|
|
|
|
QColor mUnreadCountColor;
|
|
QColor mCloseToQuotaWarningColor;
|
|
|
|
public:
|
|
/**
|
|
* Adds a special "Label" column to this view and returns its logical index.
|
|
* If a "Label" column was already present in the view then nothing is added
|
|
* and the logical index of the existing column is returned.
|
|
*/
|
|
int addLabelColumn( const QString &headerLabel );
|
|
|
|
/**
|
|
* Returns the logical index of the "Label" column or -1 if such a column
|
|
* has not been added (yet).
|
|
*/
|
|
int labelColumnIndex() const
|
|
{ return mLabelColumnIndex; };
|
|
|
|
/**
|
|
* Returns true if the widget contains a "Label" column and it's currently visible.
|
|
*/
|
|
bool labelColumnVisible() const;
|
|
|
|
/**
|
|
* Adds a special "Unread" column to this view and returns its logical index.
|
|
* If a "Unread" column was already present in the view then nothing is added
|
|
* and the logical index of the existing column is returned.
|
|
*/
|
|
int addUnreadColumn( const QString &headerLabel );
|
|
|
|
/**
|
|
* Returns the logical index of the "Unread" column or -1 if such a column
|
|
* has not been added (yet).
|
|
*/
|
|
int unreadColumnIndex() const
|
|
{ return mUnreadColumnIndex; };
|
|
|
|
/**
|
|
* Returns true if the widget contains an "Unread" column and it's currently visible.
|
|
*/
|
|
bool unreadColumnVisible() const;
|
|
|
|
/**
|
|
* Adds a special "Total" column to this view and returns its logical index.
|
|
* If a "Total" column was already present in the view then nothing is added
|
|
* and the logical index of the existing column is returned.
|
|
*/
|
|
int addTotalColumn( const QString &headerLabel );
|
|
|
|
/**
|
|
* Returns the logical index of the "Total" column or -1 if such a column
|
|
* has not been added (yet).
|
|
*/
|
|
int totalColumnIndex() const
|
|
{ return mTotalColumnIndex; };
|
|
|
|
/**
|
|
* Returns true if the widget contains a "Total" column and it's currently visible.
|
|
*/
|
|
bool totalColumnVisible() const;
|
|
|
|
/**
|
|
* Adds a special "DataSize" column to this view and returns its logical index.
|
|
* If a "DataSize" column was already present in the view then nothing is added
|
|
* and the logical index of the existing column is returned.
|
|
*/
|
|
int addDataSizeColumn( const QString &headerLabel );
|
|
|
|
/**
|
|
* Returns the logical index of the "DataSize" column or -1 if such a column
|
|
* has not been added (yet).
|
|
*/
|
|
int dataSizeColumnIndex() const
|
|
{ return mDataSizeColumnIndex; };
|
|
|
|
/**
|
|
* Returns true if the widget contains a "DataSize" column and it's currently visible.
|
|
*/
|
|
bool dataSizeColumnVisible() const;
|
|
|
|
/**
|
|
* Returns the color used to display the "Label" column text when
|
|
* the item is marked as close to quota.
|
|
*/
|
|
const QColor & closeToQuotaWarningColor() const
|
|
{ return mCloseToQuotaWarningColor; };
|
|
|
|
/**
|
|
* Sets the color used to display the "Label" column text when
|
|
* the item is marked as close to quota.
|
|
*/
|
|
void setCloseToQuotaWarningColor( const QColor &clr );
|
|
|
|
/**
|
|
* Returns the color used to display the unread message count in the "Label" column.
|
|
*/
|
|
const QColor & unreadCountColor() const
|
|
{ return mUnreadCountColor; };
|
|
|
|
/**
|
|
* Sets the color used to display the unread message count in the "Label" column.
|
|
*/
|
|
void setUnreadCountColor( const QColor &clr );
|
|
|
|
/**
|
|
* Triggers an update for the specified column of the specified item.
|
|
*/
|
|
void updateColumnForItem( FolderTreeWidgetItem * item, int columnIndex );
|
|
|
|
Q_SIGNALS:
|
|
/**
|
|
* This signal is emitted when the label of @p item has changed
|
|
* after an edition.
|
|
*/
|
|
void renamed( QTreeWidgetItem *item );
|
|
|
|
private Q_SLOTS:
|
|
|
|
/**
|
|
* Connected to the itemExpanded/itemCollapsed signal, forwards this call
|
|
* to updateExpandedState() of the item.
|
|
*/
|
|
void updateExpandedState( QTreeWidgetItem *item );
|
|
};
|
|
|
|
class FolderTreeWidgetItemLabelColumnDelegate;
|
|
|
|
/**
|
|
* @brief A folder tree node to be used with FolderTreeWidget
|
|
*
|
|
* @author Szymon Tomasz Stefanek <pragma@kvirc.net>
|
|
*/
|
|
class KNODE_EXPORT FolderTreeWidgetItem : public QTreeWidgetItem
|
|
{
|
|
friend class FolderTreeWidgetItemLabelColumnDelegate;
|
|
public:
|
|
/**
|
|
* Protocol information associated to the item.
|
|
* Please note that this list should be kept in the order of items
|
|
* that one wants to be shown in the foldertreewidget.
|
|
*/
|
|
enum Protocol {
|
|
Local, Imap, CachedImap, News, Search, NONE
|
|
};
|
|
|
|
/**
|
|
* Folder type information
|
|
* Please note that this list should be kept in the order of items
|
|
* that one wants to be shown in the FolderTreeWidget, but better
|
|
* keep it in sync with the type in KFolderTree.
|
|
*/
|
|
// FIXME: Rename to FolderItemType
|
|
enum FolderType {
|
|
Inbox, Outbox, SentMail, Trash, Drafts, Templates, Root,
|
|
Calendar, Tasks, Journals, Contacts, Notes, Other
|
|
};
|
|
|
|
private:
|
|
Protocol mProtocol; ///< The protocol associated to the folder
|
|
FolderType mFolderType; ///< The type of the folder
|
|
QString mLabelText; ///< The text data for the special "Label" column
|
|
int mTotalCount; ///< The total count of messages
|
|
int mUnreadCount; ///< The count of unread messages
|
|
qint64 mDataSize; ///< The size of the folder in bytes, -1 if meaningless
|
|
unsigned int mIsCloseToQuota:1; ///< The "Close to Quota" warning mark
|
|
unsigned int mLabelTextElided:1; ///< The "Label text elided" warning mark
|
|
int mChildrenTotalCount; ///< The total count of messages in children
|
|
int mChildrenUnreadCount; ///< The total count of unread messages in children
|
|
qint64 mChildrenDataSize; ///< The size of the children folders in bytes, -1 if meaningless
|
|
bool mAlwaysDisplayCounts; ///< Bypasses data display logic for toplevel/children folders
|
|
|
|
public:
|
|
/**
|
|
* Constructs a root-item
|
|
*/
|
|
explicit FolderTreeWidgetItem(
|
|
FolderTreeWidget *parent,
|
|
const QString &label,
|
|
Protocol protocol,
|
|
FolderType folderType
|
|
);
|
|
|
|
/**
|
|
* Constructs a child-item
|
|
*/
|
|
explicit FolderTreeWidgetItem(
|
|
FolderTreeWidgetItem *parent,
|
|
const QString &label,
|
|
Protocol protocol,
|
|
FolderType folderType
|
|
);
|
|
|
|
public:
|
|
/**
|
|
* Returns the sate of the "Close to quota" warning for this folder.
|
|
*/
|
|
bool isCloseToQuota() const
|
|
{ return mIsCloseToQuota; };
|
|
|
|
/**
|
|
* Sets the status of the close to quota warning.
|
|
*/
|
|
void setIsCloseToQuota( bool closeToQuota );
|
|
|
|
/**
|
|
* Returns the textual data for the "Label" column of the parent FolderTreeWidget.
|
|
*/
|
|
const QString & labelText() const
|
|
{ return mLabelText; };
|
|
|
|
/**
|
|
* Sets the textual data for the "Label" column of the parent FolderTreeWidget.
|
|
*/
|
|
void setLabelText( const QString &label );
|
|
|
|
/**
|
|
* Returns the unread message count. Displayed in the special "Unread" column
|
|
* by FolderTreeWidget.
|
|
*/
|
|
int unreadCount() const
|
|
{ return mUnreadCount; };
|
|
|
|
/**
|
|
* Sets the unread message count to be displayed in the special "Unread" column.
|
|
*/
|
|
void setUnreadCount( int unreadCount );
|
|
|
|
/**
|
|
* Returns the total message count. Displayed in the special "Total" column
|
|
* by FolderTreeWidget.
|
|
*/
|
|
int totalCount() const
|
|
{ return mTotalCount; };
|
|
|
|
/**
|
|
* Sets the total message count to be displayed in the special "Total" column.
|
|
*/
|
|
void setTotalCount( int totalCount );
|
|
|
|
/**
|
|
* Returns the size in bytes of the folder, displayed in the special "DataSize" column.
|
|
* If the size is meaningless (for folders that don't have storage, for example) then
|
|
* this function returns -1.
|
|
*/
|
|
qint64 dataSize() const
|
|
{ return mDataSize; };
|
|
|
|
/**
|
|
* Sets the size in bytes of the folder to be displayed in the special "DataSize" column.
|
|
* If s is -1 then the size becomes meaningless and is displayed as a dash in the view.
|
|
*/
|
|
void setDataSize( qint64 s );
|
|
|
|
/**
|
|
* Returns the unread message count for the children. Displayed in the
|
|
* special "Unread" column by FolderTreeWidget.
|
|
*/
|
|
int childrenUnreadCount() const
|
|
{ return mChildrenUnreadCount; };
|
|
|
|
/**
|
|
* Returns the total message count for the children. Displayed in the special
|
|
* "Total" column by FolderTreeWidget.
|
|
*/
|
|
int childrenTotalCount() const
|
|
{ return mChildrenTotalCount; };
|
|
|
|
/**
|
|
* Returns the size in bytes of the children folders
|
|
* displayed in the special "DataSize" column.
|
|
*/
|
|
qint64 childrenDataSize() const
|
|
{ return mChildrenDataSize; };
|
|
|
|
/**
|
|
* Gathers the counts for the children.
|
|
* Please note that this function is NOT recursive. It will simply
|
|
* scan the children and sum up their own+children counts.
|
|
* It will also NOT update any text.
|
|
* Returns true if any of the counts has actually changed.
|
|
*/
|
|
bool updateChildrenCounts();
|
|
|
|
/**
|
|
* Returns the protocol associated to the folder item
|
|
*/
|
|
Protocol protocol() const
|
|
{ return mProtocol; };
|
|
|
|
/**
|
|
* Sets the protocol associated to the folder item
|
|
*/
|
|
void setProtocol( Protocol protocol )
|
|
{ mProtocol = protocol; };
|
|
|
|
/**
|
|
* Returns a descriptive string of the folder's protocol
|
|
*/
|
|
QString protocolDescription() const;
|
|
|
|
/**
|
|
* Returns the type of the folder
|
|
*/
|
|
FolderType folderType() const
|
|
{ return mFolderType; };
|
|
|
|
/**
|
|
* Sets the type of the folder
|
|
*/
|
|
void setFolderType( FolderType folderType )
|
|
{ mFolderType = folderType; };
|
|
|
|
/**
|
|
* Operator used for item sorting.
|
|
*/
|
|
virtual bool operator < ( const QTreeWidgetItem &other ) const;
|
|
|
|
/**
|
|
* Triggers an update for the specified column of this item
|
|
*/
|
|
void updateColumn( int columnIndex );
|
|
|
|
/**
|
|
* This should be called whenever this item is expanded/collapsed. It updates
|
|
* the text for the total, unread and size column. If the item is collapsed,
|
|
* that numbers will include the sum of the child numbers, otherwise it will
|
|
* just be the numbers of this item.
|
|
*/
|
|
void updateExpandedState();
|
|
|
|
/**
|
|
* Returns true if the last painting operation had to elide
|
|
* the label text thus making it partially invisible.
|
|
* This flag is meaningful only for currently visible items.
|
|
*/
|
|
bool labelTextElided() const
|
|
{ return mLabelTextElided; };
|
|
|
|
/**
|
|
* Returns true if this item should bypass the size, total and unread
|
|
* display logic. Normally when this item is a toplevel one and
|
|
* has no children it doesn't display the counts. With this flag
|
|
* set it displays the counts regardless of this.
|
|
* FIXME: Why this logic is actually hardwired here ?
|
|
*/
|
|
bool alwaysDisplayCounts() const
|
|
{ return mAlwaysDisplayCounts; };
|
|
|
|
/**
|
|
* Sets whether this item should bypass the size, total and unread
|
|
* display logic. Normally when this item is a toplevel one and
|
|
* has no children it doesn't display the counts. With this flag
|
|
* set it displays the counts regardless of this.
|
|
* FIXME: Why this logic is actually hardwired here ?
|
|
*/
|
|
void setAlwaysDisplayCounts( bool alwaysDisplayCounts )
|
|
{ mAlwaysDisplayCounts = alwaysDisplayCounts; };
|
|
|
|
protected:
|
|
/**
|
|
* This is called by FolderTreeWidgetItemLabelColumnDelegate
|
|
* to update the mLabelTextElided flag.
|
|
*/
|
|
void setLabelTextElided( bool labelTextElided )
|
|
{ mLabelTextElided = labelTextElided ? 1 : 0; };
|
|
|
|
/**
|
|
* Returns the label text that has been elided if necessary to
|
|
* fit into the @p width for the given font @p metrics.
|
|
* The default implementation elides the right of the label.
|
|
*/
|
|
virtual QString elidedLabelText( const QFontMetrics &metrics, unsigned int width ) const;
|
|
};
|
|
|
|
} // namespace KPIM
|
|
|
|
#endif //!__FOLDERTREEWIDGET_H__
|