From 7eeebe428b208942168a99ef8d0fe8f58cd1c375 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20=C3=81ngel=20San=20Mart=C3=ADn?= Date: Wed, 21 Aug 2013 20:49:34 +0200 Subject: [PATCH] fixed rating delegate/widget --- custom_widgets/yacreader_table_view.cpp | 90 ++++++++++++++++++++----- custom_widgets/yacreader_table_view.h | 52 +++++++------- 2 files changed, 102 insertions(+), 40 deletions(-) diff --git a/custom_widgets/yacreader_table_view.cpp b/custom_widgets/yacreader_table_view.cpp index 05e84684..6f6b6c50 100644 --- a/custom_widgets/yacreader_table_view.cpp +++ b/custom_widgets/yacreader_table_view.cpp @@ -6,7 +6,7 @@ #include YACReaderTableView::YACReaderTableView(QWidget *parent) : - QTableView(parent),showDelete(false),editing(false) + QTableView(parent),showDelete(false),editing(false),myeditor(0) { setAlternatingRowColors(true); verticalHeader()->setAlternatingRowColors(true); @@ -62,27 +62,75 @@ void YACReaderTableView::mouseMoveEvent(QMouseEvent *event) if(selectedIndexes.contains(mi)) { if(mi.column() == 11) - if(!editing) { - editing = true; - currentIndexEditing = mi; - edit(mi); + if(!editing) + { + 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 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 ) { editing = false; + myeditor = 0; QTableView::closeEditor(editor,hint); } void YACReaderTableView::commitData ( QWidget * editor ) { //TODO - emit comicRated(((StarEditor *)editor)->starRating().starCount(),currentIndexEditing); + StarEditor *starEditor = qobject_cast(editor); + if(starEditor->getShouldCommitData()) + emit comicRated(((StarEditor *)editor)->starRating().starCount(),currentIndexEditing); } void YACReaderTableView::showDeleteProgress() @@ -152,7 +200,6 @@ QSize YACReaderRatingDelegate::sizeHint(const QStyleOptionViewItem &option, QWidget *YACReaderRatingDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const - { StarEditor *editor = new StarEditor(parent); connect(editor, SIGNAL(editingFinished()), @@ -268,7 +315,7 @@ void StarRating::paintSelected(QPainter *painter, const QRect &rect, painter->setPen(Qt::NoPen); QBrush star(color); - QBrush dot(color); + QBrush dot(QColor("#ffffff")); int yOffset = (rect.height() - PaintingScaleFactor) / 2; painter->translate(rect.x(), rect.y() + yOffset); @@ -308,9 +355,10 @@ void StarRating::mouseMoveEvent(QMouseEvent *event) //! [0] StarEditor::StarEditor(QWidget *parent) - : QWidget(parent) + : QWidget(parent),shouldCommitData(false) { - setMouseTracking(true); + //setMouseTracking(true); + //setAutoFillBackground(true); } //! [0] @@ -322,24 +370,24 @@ QSize StarEditor::sizeHint() const //! [1] void StarEditor::paintEvent(QPaintEvent *) { + /* QPainter painter(this); myStarRating.paintSelected(&painter, rect(), this->palette(), - StarRating::Editable,QColor("#A0A0A0")); + StarRating::Editable,QColor("#615f59"));*/ } //! [1] //! [2] void StarEditor::mouseMoveEvent(QMouseEvent *event) { - int star = starAtPosition(event->x()); + /*int star = starAtPosition(event->x()); if (star != myStarRating.starCount() && star != -1) { myStarRating.setStarCount(star); update(); - } + }*/ } //! [2] - void StarEditor::leaveEvent(QEvent * event){ emit editingFinished(); QWidget::leaveEvent(event); @@ -347,9 +395,17 @@ void StarEditor::leaveEvent(QEvent * event){ //! [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] diff --git a/custom_widgets/yacreader_table_view.h b/custom_widgets/yacreader_table_view.h index 9e1493ee..bd743450 100644 --- a/custom_widgets/yacreader_table_view.h +++ b/custom_widgets/yacreader_table_view.h @@ -19,6 +19,7 @@ signals: public slots: void showDeleteProgress(); void hideDeleteProgress(); + void closeRatingEditor(); protected slots: virtual void closeEditor ( QWidget * editor, QAbstractItemDelegate::EndEditHint hint ); @@ -30,9 +31,12 @@ private: void resizeEvent(QResizeEvent * event); void mouseMoveEvent(QMouseEvent *event); + void mousePressEvent(QMouseEvent * event); + void leaveEvent(QEvent * event); bool editing; QModelIndex currentIndexEditing; + QWidget * myeditor; }; //--- @@ -64,9 +68,9 @@ private slots: class StarRating { 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, const QPalette &palette, EditMode mode) const; @@ -76,45 +80,47 @@ public: const QPalette &palette, EditMode mode) const; QSize sizeHint() const; int starCount() const { return myStarCount; } - int maxStarCount() const { return myMaxStarCount; } - void setStarCount(int starCount) { myStarCount = starCount; } - void setMaxStarCount(int maxStarCount) { myMaxStarCount = maxStarCount; } + int maxStarCount() const { return myMaxStarCount; } + void setStarCount(int starCount) { myStarCount = starCount; } + void setMaxStarCount(int maxStarCount) { myMaxStarCount = maxStarCount; } protected: - void mouseMoveEvent(QMouseEvent *event); + void mouseMoveEvent(QMouseEvent *event); private: - QPolygonF starPolygon; - QPolygonF diamondPolygon; - int myStarCount; - int myMaxStarCount; + QPolygonF starPolygon; + QPolygonF diamondPolygon; + int myStarCount; + int myMaxStarCount; }; Q_DECLARE_METATYPE(StarRating); //--- class StarEditor : public QWidget { - Q_OBJECT + Q_OBJECT public: - StarEditor(QWidget *parent = 0); + StarEditor(QWidget *parent = 0); - QSize sizeHint() const; - void setStarRating(const StarRating &starRating) { - myStarRating = starRating; - } - StarRating starRating() { return myStarRating; } + QSize sizeHint() const; + void setStarRating(const StarRating &starRating) { + myStarRating = starRating; + } + StarRating starRating() { return myStarRating; } + bool getShouldCommitData() {return shouldCommitData;}; signals: - void editingFinished(); + void editingFinished(); void commitData(); protected: - void paintEvent(QPaintEvent *event); - void mouseMoveEvent(QMouseEvent *event); - void mouseReleaseEvent(QMouseEvent *event); + void paintEvent(QPaintEvent *event); + void mouseMoveEvent(QMouseEvent *event); + void mousePressEvent(QMouseEvent *event); void leaveEvent(QEvent * event); private: - int starAtPosition(int x); - StarRating myStarRating; + int starAtPosition(int x); + StarRating myStarRating; + bool shouldCommitData; }; #endif // YACREADER_TABLE_VIEW_H