fixed rating delegate/widget

This commit is contained in:
Luis Ángel San Martín
2013-08-21 20:49:34 +02:00
parent 1763b16ccd
commit 7eeebe428b
2 changed files with 102 additions and 40 deletions

View File

@ -6,7 +6,7 @@
#include <QPainter> #include <QPainter>
YACReaderTableView::YACReaderTableView(QWidget *parent) : YACReaderTableView::YACReaderTableView(QWidget *parent) :
QTableView(parent),showDelete(false),editing(false) QTableView(parent),showDelete(false),editing(false),myeditor(0)
{ {
setAlternatingRowColors(true); setAlternatingRowColors(true);
verticalHeader()->setAlternatingRowColors(true); verticalHeader()->setAlternatingRowColors(true);
@ -62,27 +62,75 @@ void YACReaderTableView::mouseMoveEvent(QMouseEvent *event)
if(selectedIndexes.contains(mi)) if(selectedIndexes.contains(mi))
{ {
if(mi.column() == 11) if(mi.column() == 11)
if(!editing)
{ {
editing = true; if(!editing)
currentIndexEditing = mi; {
edit(mi); editing = true;
currentIndexEditing = mi;
edit(mi);
myeditor = indexWidget(mi);
}
else if(mi.row() != currentIndexEditing.row())
closeRatingEditor();
}
else
closeRatingEditor();
}
else
closeRatingEditor();
}
else
closeRatingEditor();
QTableView::mouseMoveEvent(event);
}
void YACReaderTableView::mousePressEvent(QMouseEvent * event)
{
QTableView::mousePressEvent(event);
QModelIndex mi = indexAt(event->pos());
if(mi.isValid())
{
QList<QModelIndex> selectedIndexes = this->selectedIndexes();
if(selectedIndexes.contains(mi))
{
if(mi.column() == 11)
{
if(!editing)
{
editing = true;
currentIndexEditing = mi;
edit(mi);
myeditor = indexWidget(mi);
}
} }
} }
} }
QTableView::mouseMoveEvent(event); }
void YACReaderTableView::leaveEvent(QEvent * event)
{
closeRatingEditor();
} }
void YACReaderTableView::closeRatingEditor()
{
editing = false;
if(myeditor!=0)
closeEditor(myeditor,QAbstractItemDelegate::NoHint);
myeditor = 0;
}
void YACReaderTableView::closeEditor ( QWidget * editor, QAbstractItemDelegate::EndEditHint hint ) void YACReaderTableView::closeEditor ( QWidget * editor, QAbstractItemDelegate::EndEditHint hint )
{ {
editing = false; editing = false;
myeditor = 0;
QTableView::closeEditor(editor,hint); QTableView::closeEditor(editor,hint);
} }
void YACReaderTableView::commitData ( QWidget * editor ) void YACReaderTableView::commitData ( QWidget * editor )
{ {
//TODO //TODO
emit comicRated(((StarEditor *)editor)->starRating().starCount(),currentIndexEditing); StarEditor *starEditor = qobject_cast<StarEditor *>(editor);
if(starEditor->getShouldCommitData())
emit comicRated(((StarEditor *)editor)->starRating().starCount(),currentIndexEditing);
} }
void YACReaderTableView::showDeleteProgress() void YACReaderTableView::showDeleteProgress()
@ -152,7 +200,6 @@ QSize YACReaderRatingDelegate::sizeHint(const QStyleOptionViewItem &option,
QWidget *YACReaderRatingDelegate::createEditor(QWidget *parent, QWidget *YACReaderRatingDelegate::createEditor(QWidget *parent,
const QStyleOptionViewItem &option, const QStyleOptionViewItem &option,
const QModelIndex &index) const const QModelIndex &index) const
{ {
StarEditor *editor = new StarEditor(parent); StarEditor *editor = new StarEditor(parent);
connect(editor, SIGNAL(editingFinished()), connect(editor, SIGNAL(editingFinished()),
@ -268,7 +315,7 @@ void StarRating::paintSelected(QPainter *painter, const QRect &rect,
painter->setPen(Qt::NoPen); painter->setPen(Qt::NoPen);
QBrush star(color); QBrush star(color);
QBrush dot(color); QBrush dot(QColor("#ffffff"));
int yOffset = (rect.height() - PaintingScaleFactor) / 2; int yOffset = (rect.height() - PaintingScaleFactor) / 2;
painter->translate(rect.x(), rect.y() + yOffset); painter->translate(rect.x(), rect.y() + yOffset);
@ -308,9 +355,10 @@ void StarRating::mouseMoveEvent(QMouseEvent *event)
//! [0] //! [0]
StarEditor::StarEditor(QWidget *parent) StarEditor::StarEditor(QWidget *parent)
: QWidget(parent) : QWidget(parent),shouldCommitData(false)
{ {
setMouseTracking(true); //setMouseTracking(true);
//setAutoFillBackground(true);
} }
//! [0] //! [0]
@ -322,24 +370,24 @@ QSize StarEditor::sizeHint() const
//! [1] //! [1]
void StarEditor::paintEvent(QPaintEvent *) void StarEditor::paintEvent(QPaintEvent *)
{ {
/*
QPainter painter(this); QPainter painter(this);
myStarRating.paintSelected(&painter, rect(), this->palette(), myStarRating.paintSelected(&painter, rect(), this->palette(),
StarRating::Editable,QColor("#A0A0A0")); StarRating::Editable,QColor("#615f59"));*/
} }
//! [1] //! [1]
//! [2] //! [2]
void StarEditor::mouseMoveEvent(QMouseEvent *event) void StarEditor::mouseMoveEvent(QMouseEvent *event)
{ {
int star = starAtPosition(event->x()); /*int star = starAtPosition(event->x());
if (star != myStarRating.starCount() && star != -1) { if (star != myStarRating.starCount() && star != -1) {
myStarRating.setStarCount(star); myStarRating.setStarCount(star);
update(); update();
} }*/
} }
//! [2] //! [2]
void StarEditor::leaveEvent(QEvent * event){ void StarEditor::leaveEvent(QEvent * event){
emit editingFinished(); emit editingFinished();
QWidget::leaveEvent(event); QWidget::leaveEvent(event);
@ -347,9 +395,17 @@ void StarEditor::leaveEvent(QEvent * event){
//! [3] //! [3]
void StarEditor::mouseReleaseEvent(QMouseEvent * event ) void StarEditor::mousePressEvent(QMouseEvent * event )
{ {
emit commitData(); int star = starAtPosition(event->x());
if (star != myStarRating.starCount() && star != -1) {
myStarRating.setStarCount(star);
shouldCommitData = true;
emit commitData();
}
} }
//! [3] //! [3]

View File

@ -19,6 +19,7 @@ signals:
public slots: public slots:
void showDeleteProgress(); void showDeleteProgress();
void hideDeleteProgress(); void hideDeleteProgress();
void closeRatingEditor();
protected slots: protected slots:
virtual void closeEditor ( QWidget * editor, QAbstractItemDelegate::EndEditHint hint ); virtual void closeEditor ( QWidget * editor, QAbstractItemDelegate::EndEditHint hint );
@ -30,9 +31,12 @@ private:
void resizeEvent(QResizeEvent * event); void resizeEvent(QResizeEvent * event);
void mouseMoveEvent(QMouseEvent *event); void mouseMoveEvent(QMouseEvent *event);
void mousePressEvent(QMouseEvent * event);
void leaveEvent(QEvent * event);
bool editing; bool editing;
QModelIndex currentIndexEditing; QModelIndex currentIndexEditing;
QWidget * myeditor;
}; };
//--- //---
@ -64,9 +68,9 @@ private slots:
class StarRating class StarRating
{ {
public: public:
enum EditMode { Editable, ReadOnly }; enum EditMode { Editable, ReadOnly };
StarRating(int starCount = 1, int maxStarCount = 5); StarRating(int starCount = 1, int maxStarCount = 5);
void paint(QPainter *painter, const QRect &rect, void paint(QPainter *painter, const QRect &rect,
const QPalette &palette, EditMode mode) const; const QPalette &palette, EditMode mode) const;
@ -76,45 +80,47 @@ public:
const QPalette &palette, EditMode mode) const; const QPalette &palette, EditMode mode) const;
QSize sizeHint() const; QSize sizeHint() const;
int starCount() const { return myStarCount; } int starCount() const { return myStarCount; }
int maxStarCount() const { return myMaxStarCount; } int maxStarCount() const { return myMaxStarCount; }
void setStarCount(int starCount) { myStarCount = starCount; } void setStarCount(int starCount) { myStarCount = starCount; }
void setMaxStarCount(int maxStarCount) { myMaxStarCount = maxStarCount; } void setMaxStarCount(int maxStarCount) { myMaxStarCount = maxStarCount; }
protected: protected:
void mouseMoveEvent(QMouseEvent *event); void mouseMoveEvent(QMouseEvent *event);
private: private:
QPolygonF starPolygon; QPolygonF starPolygon;
QPolygonF diamondPolygon; QPolygonF diamondPolygon;
int myStarCount; int myStarCount;
int myMaxStarCount; int myMaxStarCount;
}; };
Q_DECLARE_METATYPE(StarRating); Q_DECLARE_METATYPE(StarRating);
//--- //---
class StarEditor : public QWidget class StarEditor : public QWidget
{ {
Q_OBJECT Q_OBJECT
public: public:
StarEditor(QWidget *parent = 0); StarEditor(QWidget *parent = 0);
QSize sizeHint() const; QSize sizeHint() const;
void setStarRating(const StarRating &starRating) { void setStarRating(const StarRating &starRating) {
myStarRating = starRating; myStarRating = starRating;
} }
StarRating starRating() { return myStarRating; } StarRating starRating() { return myStarRating; }
bool getShouldCommitData() {return shouldCommitData;};
signals: signals:
void editingFinished(); void editingFinished();
void commitData(); void commitData();
protected: protected:
void paintEvent(QPaintEvent *event); void paintEvent(QPaintEvent *event);
void mouseMoveEvent(QMouseEvent *event); void mouseMoveEvent(QMouseEvent *event);
void mouseReleaseEvent(QMouseEvent *event); void mousePressEvent(QMouseEvent *event);
void leaveEvent(QEvent * event); void leaveEvent(QEvent * event);
private: private:
int starAtPosition(int x); int starAtPosition(int x);
StarRating myStarRating; StarRating myStarRating;
bool shouldCommitData;
}; };
#endif // YACREADER_TABLE_VIEW_H #endif // YACREADER_TABLE_VIEW_H