You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
223 lines
7.8 KiB
223 lines
7.8 KiB
/****************************************************************************** |
|
* |
|
* Copyright 2008 Szymon Tomasz Stefanek <pragma@kvirc.net> |
|
* |
|
* 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, write to the Free Software |
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
|
* |
|
*******************************************************************************/ |
|
|
|
#ifndef __KMAIL_MESSAGELISTVIEW_CORE_THEMEDELEGATE_H__ |
|
#define __KMAIL_MESSAGELISTVIEW_CORE_THEMEDELEGATE_H__ |
|
|
|
#include <QStyledItemDelegate> |
|
#include <QRect> |
|
#include <QColor> |
|
|
|
#include "messagelistview/core/theme.h" |
|
#include "messagelistview/core/item.h" |
|
|
|
class QAbstractItemView; |
|
class QPaintDevice; |
|
|
|
namespace KMail |
|
{ |
|
|
|
namespace MessageListView |
|
{ |
|
|
|
namespace Core |
|
{ |
|
|
|
class Item; |
|
|
|
/** |
|
* The ThemeDelegate paints the message list view message and group items by |
|
* using the supplied Theme. |
|
*/ |
|
class ThemeDelegate : public QStyledItemDelegate |
|
{ |
|
public: |
|
ThemeDelegate( QAbstractItemView * parent, QPaintDevice * paintDevice ); |
|
~ThemeDelegate(); |
|
|
|
private: |
|
const Theme * mTheme; ///< Shallow pointer to the current theme |
|
QAbstractItemView * mItemView; |
|
QPaintDevice * mPaintDevice; |
|
|
|
QColor mGroupHeaderBackgroundColor; // cache |
|
|
|
// hitTest results |
|
QModelIndex mHitIndex; |
|
Item * mHitItem; |
|
QRect mHitItemRect; |
|
const Theme::Column * mHitColumn; |
|
const Theme::Row * mHitRow; |
|
int mHitRowIndex; |
|
bool mHitRowIsMessageRow; |
|
QRect mHitRowRect; |
|
bool mHitContentItemRight; |
|
const Theme::ContentItem * mHitContentItem; |
|
QRect mHitContentItemRect; |
|
public: |
|
const Theme * theme() const |
|
{ return mTheme; }; |
|
void setTheme( const Theme * theme ); |
|
|
|
/** |
|
* Returns a heuristic sizeHint() for the specified item type and column. |
|
* The hint is based on the contents of the theme (and not of any message or group header). |
|
*/ |
|
QSize sizeHintForItemTypeAndColumn( Item::Type type, int column ) const; |
|
|
|
/** |
|
* Performs a hit test on the specified viewport point. |
|
* Returns true if the point hit something and false otherwise. |
|
* When the hit test is succesfull then the hitIndex(), hitItem(), hitColumn(), hitRow(), and hitContentItem() |
|
* function will return information about the item that was effectively hit. |
|
* If exact is set to true then hitTest() will return true only if the viewportPoint |
|
* is exactly over an item. If exact is set to false then the hitTest() function |
|
* will do its best to find the closest object to be actually "hit": this is useful, |
|
* for example, in drag and drop operations. |
|
*/ |
|
bool hitTest( const QPoint &viewportPoint, bool exact = true ); |
|
|
|
/** |
|
* Returns the model index that was reported as hit by the previous call to hitTest(). |
|
* The result of this function is valid only if hitTest() returned true and only |
|
* within the same calling function. |
|
*/ |
|
const QModelIndex & hitIndex() const |
|
{ return mHitIndex; }; |
|
|
|
/** |
|
* Returns the Item that was reported as hit by the previous call to hitTest(). |
|
* The result of this function is valid only if hitTest() returned true and only |
|
* within the same calling function. |
|
*/ |
|
Item * hitItem() const |
|
{ return mHitItem; }; |
|
|
|
/** |
|
* Returns the visual rectangle of the item that was reported as hit by the previous call to hitTest(). |
|
* The result of this function is valid only if hitTest() returned true and only |
|
* within the same calling function. Please note that this rectangle refers |
|
* to a specific item column (and not all of the columns). |
|
*/ |
|
QRect hitItemRect() const |
|
{ return mHitItemRect; }; |
|
|
|
/** |
|
* Returns the theme column that was reported as hit by the previous call to hitTest(). |
|
* The result of this function is valid only if hitTest() returned true and only |
|
* within the same calling function. |
|
*/ |
|
const Theme::Column * hitColumn() const |
|
{ return mHitColumn; }; |
|
|
|
/** |
|
* Returns the index of the theme column that was reported as hit by the previous call to hitTest(). |
|
* The result of this function is valid only if hitTest() returned true and only |
|
* within the same calling function. |
|
* This is the same as hitIndex().column(). |
|
*/ |
|
int hitColumnIndex() const |
|
{ return mHitIndex.column(); }; |
|
|
|
/** |
|
* Returns the theme row that was reported as hit by the previous call to hitTest(). |
|
* The result of this function is valid only if hitTest() returned true and only |
|
* within the same calling function. This function may also return a null row |
|
* when hitTest() returned true. This means that the item was globally hit |
|
* but no row was exactly hit (the user probably hit the margin instead). |
|
*/ |
|
const Theme::Row * hitRow() const |
|
{ return mHitRow; }; |
|
|
|
/** |
|
* Returns the index of the theme row that was reported as hit by the previous call to hitTest(). |
|
* The result of this function is valid only if hitRow() returns a non null value. |
|
*/ |
|
int hitRowIndex() const |
|
{ return mHitRowIndex; }; |
|
|
|
/** |
|
* Returns the rectangle of the row that was reported as hit by the previous call to hitTest(). |
|
* The result of this function is valid only if hitTest() returned true and only |
|
* within the same calling function. The result of this function is also invalid |
|
* if hitRow() returns 0. |
|
*/ |
|
QRect hitRowRect() const |
|
{ return mHitRowRect; }; |
|
|
|
/** |
|
* Returns true if the hitRow() is a message row, false otherwise. |
|
* The result of this function has a meaning only if hitRow() returns a non zero result. |
|
*/ |
|
bool hitRowIsMessageRow() const |
|
{ return mHitRowIsMessageRow; }; |
|
|
|
/** |
|
* Returns the theme content item that was reported as hit by the previous call to hitTest(). |
|
* The result of this function is valid only if hitTest() returned true and only |
|
* within the same calling function. This function may also return a null content item |
|
* when hitTest() returned true. This means that the item was globally hit |
|
* but no content item was exactly hit (the user might have clicked inside a blank unused space instead). |
|
*/ |
|
const Theme::ContentItem * hitContentItem() const |
|
{ return mHitContentItem; }; |
|
|
|
/** |
|
* Returns true if the hit theme content item was a right item and false otherwise. |
|
* The result of this function is valid only if hitContentItem() returns true. |
|
*/ |
|
bool hitContentItemRight() const |
|
{ return mHitContentItemRight; }; |
|
|
|
/** |
|
* Returns the bounding rect of the content item that was reported as hit by the previous call to hitTest(). |
|
* The result of this function is valid only if hitTest() returned true and only |
|
* within the same calling function. The result of this function is to be considered |
|
* invalid also when hitContentItem() returns 0. |
|
*/ |
|
QRect hitContentItemRect() const |
|
{ return mHitContentItemRect; }; |
|
|
|
protected: |
|
/** |
|
* Returns the Item for the specified model index. Pure virtual: must be reimplemented |
|
* by derived classes. |
|
*/ |
|
virtual Item * itemFromIndex( const QModelIndex &index ) const = 0; |
|
|
|
/** |
|
* Reimplemented from QStyledItemDelegate |
|
*/ |
|
void paint( QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index ) const; |
|
|
|
/** |
|
* Reimplemented from QStyledItemDelegate |
|
*/ |
|
QSize sizeHint( const QStyleOptionViewItem & option, const QModelIndex & index ) const; |
|
|
|
}; |
|
|
|
} // namespace Core |
|
|
|
} // namespace MessageListView |
|
|
|
} // namespace KMail |
|
|
|
#endif //!__KMAIL_MESSAGELISTVIEW_CORE_SKINDELEGATE_H__
|
|
|