/* * Copyright (C) 2010 Ixonos Plc. * Copyright (C) 2011 Philipp Spitzer, gregor herrmann * * This file is part of ConfClerk. * * ConfClerk 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. * * ConfClerk 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 * ConfClerk. If not, see . */ #ifndef DELEGATE_H #define DELEGATE_H #include #include #include class Delegate : public QItemDelegate { Q_OBJECT public: enum ControlId { ControlNone = 0, FavouriteControlOn, FavouriteControlOff, AlarmControlOn, AlarmControlOff, WarningControl }; class Control { public: Control(ControlId aControlId, const QString &aImageName, const Control* prev_control); inline QImage *image() const { return mImage; } inline void setDrawPoint(const QPoint &aPoint) { mDrawPoint = aPoint; } inline QRect drawRect(const QRect &aRect) const // helper for determining if Control was clicked { return QRect(drawPoint(aRect), drawPoint(aRect)+QPoint(mImage->size().width(),mImage->size().height())); } void paint(QPainter* painter, const QRect rect); bool enabled() const { return mEnabled; } void setEnabled(bool v) { mEnabled = v; } private: inline QPoint drawPoint(const QRect &aRect = QRect()) const // for painter to draw Control { if(aRect == QRect()) // null rectangle return mDrawPoint; // returns relative drawing point else return QPoint(aRect.x()+aRect.width(),aRect.y()) + mDrawPoint; // returns absolute drawing point } ControlId mId; QImage *mImage; QPoint mDrawPoint; // relative 'start-drawing' position (may hold negative values) bool mEnabled; }; Delegate(QTreeView *aParent); // the delegate 'owner' has to be specified in the constructor - it's used to obtain visualRect of selected item/index ~Delegate(); void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const; QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const; // Delegate::ControlId whichControlClicked(const QModelIndex &aIndex, const QPoint &aPoint) const; bool isPointFromRect(const QPoint &aPoint, const QRect &aRect) const; private: bool hasParent( const QModelIndex &index ) const; bool isLast( const QModelIndex &index ) const; bool isExpanded( const QModelIndex &index ) const; void defineControls(); // TODO: the better place for these methods would be 'eventmodel' // they are used in 'paint' method and so it's better to obtain number of // favourities/alarms once when the data has changed and not to call // these methods which iterate over all Events in corresponding group // every time it requires them int numberOfFavourities(const QModelIndex &index) const; int numberOfAlarms(const QModelIndex &index) const; private: QPointer mViewPtr; QMap mControls; }; #endif /* DELEGATE_H */