From 7b3cd0eb4b63303646bc63269106c5360e586559 Mon Sep 17 00:00:00 2001 From: Philipp Spitzer Date: Fri, 20 Jan 2017 21:46:55 +0100 Subject: [PATCH] Event favourite is now tristate in the code now and the corresponding buttons are tristate as well. --- src/gui/eventdialog.cpp | 35 +++++++++++++-------------------- src/gui/eventdialog.h | 1 + src/icons.qrc | 1 + src/icons/favourite-weak.png | Bin 0 -> 1563 bytes src/mvc/delegate.cpp | 37 ++++++++++++++++++++++------------- src/mvc/delegate.h | 5 +++-- src/mvc/event.cpp | 16 +++++++++++---- src/mvc/event.h | 1 + src/mvc/treeview.cpp | 14 ++++++------- 9 files changed, 61 insertions(+), 49 deletions(-) create mode 100644 src/icons/favourite-weak.png diff --git a/src/gui/eventdialog.cpp b/src/gui/eventdialog.cpp index 67f01d5..dce05bf 100644 --- a/src/gui/eventdialog.cpp +++ b/src/gui/eventdialog.cpp @@ -88,10 +88,7 @@ EventDialog::EventDialog(int conferenceId, int eventId, QWidget *parent): QDialo connect(favouriteButton, SIGNAL(clicked()), SLOT(favouriteClicked())); connect(alarmButton, SIGNAL(clicked()), SLOT(alarmClicked())); - if(event.isFavourite()) - { - favouriteButton->setIcon(QIcon(":/icons/favourite-on.png")); - } + updateFavouriteButton(event); if(event.hasAlarm()) { @@ -102,25 +99,12 @@ EventDialog::EventDialog(int conferenceId, int eventId, QWidget *parent): QDialo void EventDialog::favouriteClicked() { Event event = Event::getById(mEventId, mConferenceId); - - QList conflicts = Event::conflictEvents(event.id(), mConferenceId); - if(event.isFavourite()) - { - event.setFavourite(false); - favouriteButton->setIcon(QIcon(":/icons/favourite-off.png")); - } - else - { - event.setFavourite(true); - favouriteButton->setIcon(QIcon(":/icons/favourite-on.png")); - } + event.cycleFavourite(); event.update("favourite"); + updateFavouriteButton(event); - if(event.isFavourite()) - { - // event has became 'favourite' and so 'conflicts' list may have changed - conflicts = Event::conflictEvents(event.id(), mConferenceId); - } + // 'conflicts' list may have changed + QList conflicts = Event::conflictEvents(event.id(), mConferenceId); // have to emit 'eventChanged' signal on all events in conflict for(int i=0; isetIcon(QIcon(":/icons/favourite-off.png")); break; + case Favourite_weak: favouriteButton->setIcon(QIcon(":/icons/favourite-weak.png")); break; + case Favourite_strong: favouriteButton->setIcon(QIcon(":/icons/favourite-on.png")); break; + } +} + diff --git a/src/gui/eventdialog.h b/src/gui/eventdialog.h index 6a0f0b4..9d31ed8 100644 --- a/src/gui/eventdialog.h +++ b/src/gui/eventdialog.h @@ -38,6 +38,7 @@ signals: private: int mConferenceId; int mEventId; + void updateFavouriteButton(const Event& event); }; #endif /* EVENTDIALOG_H */ diff --git a/src/icons.qrc b/src/icons.qrc index 60b5634..563300e 100644 --- a/src/icons.qrc +++ b/src/icons.qrc @@ -9,6 +9,7 @@ icons/search.png icons/today.png icons/favourite-off.png + icons/favourite-weak.png icons/favourite-on.png icons/alarm-on.png icons/alarm-off.png diff --git a/src/icons/favourite-weak.png b/src/icons/favourite-weak.png new file mode 100644 index 0000000000000000000000000000000000000000..79ec01197a193df28cb970af226b888b9db43f12 GIT binary patch literal 1563 zcmV+$2ITpPP)Na-6q5KJU7kS0ikCSDS0uv9wqf-`l7Ik!18ojKRN_qzCSPN&thqcanR zm8|Ubu-5*5>;HXgecuw!IX=lI*Rl3Hz<1XRAl9hBC~%^7;+SYfI@iBv?}jUID~)=t z_4-TMsTY1qyFu@dG$`R0Pcd${&GLNU0Ej z1@cE;q_&1&Tn)f|z}J~N14e_C9VmwYs2rtm{GC+;c%AQNAPMvXn}8UQ0S1AQPUPgg@sN<~0g(0p{M>cE3 zqY&x~(3J(>hd^Sj1!pdZfyf`>?2~nRcYlTS*iI6I!>B|Ol}sU1X@ut?6G?}mYYS(sZvR9Ggb?^DfvTRS_17Zi zSdzMmA%wyKk+m4>(1~tLW`JuRdzxh5KpQ~ClnE@7$QVN1#9EEk0ikXXL^T54pl|;#@iSe^ z3M@!Jc6{4i4{SZ_1m)j8!eS+XAMYoX86?xyPb!@wp?uI0)N1Y64H`5XHNc`|94S16 zP#9}4Q3Go=kq!uSgFv?kjG?7r*CVg;nSHn7#S{OLjCz5?R!4VKPET;^;G?+W9}vRF z_j1G&17xy8V}}jho|0Qu5>~eUB_W@fVGauMubKaXhUEivOxbhUw-Uq z#`b&xDdlCeVH&s-cxLX@$=t-RzK<=u0SJ`z@KuI*aub=ZAu`zkA{|l6zfaJb7m=wE znW!zhb%X}Oj$!K{yZ0f+AN(F8SMU74((&EEp$iZc-T)y{GLG+M@ck^FpC$|&)SCsg zjYMby0&NK`LI7NUIJ?k z^;U&exP*3AXzK`#BeHGd#)5H>+<6zb{P-ZfBb)!{MfBh86@b1S*F0|@c)X|d>?F!d z;du#+iKy0!w4y43(Olq{0+awJ+A*qt?YG>qqVbggE;QklzBEWJ-P2xw{0ot>w5 z-A{7IJObLBM$;hp4XsL!4ypZ|dKjUp}6Hr{jN0ruSgEe5x3$5}&Z z;s7&m{+`9Re}0K81kU8Cl?!BthF1-sfNjl*;}i>%R2C-)40vO=bM1W(@#*m!iKkK% zz)t{1KmR3$ulpSNn{MOG;V02EuOR>@1l8#&Sm88W2_TDexyrdS6iO#)M2`Obzu>d? ze1q^T_Wgz5Hzesvmx^HW!#Mpq!s3+PaV3UwfF% z*YClL#f}0$0RDERb(z6U?7H`x^zOWt$(Ns_H9Lt3LsTqwg+kN0%k>`T++@96oDJ%= zS?AoWbM9g1ThQ literal 0 HcmV?d00001 diff --git a/src/mvc/delegate.cpp b/src/mvc/delegate.cpp index ef7dc7a..065d21d 100644 --- a/src/mvc/delegate.cpp +++ b/src/mvc/delegate.cpp @@ -64,7 +64,7 @@ void Delegate::paint(QPainter *painter, const QStyleOptionViewItem &option, cons // * spacer (aka y position of image) // * image // * rest is text, which is 1 line of title with big letters and 2 lines of Presenter and Track - int aux = option.rect.height() - SPACER - mControls[FavouriteControlOn]->image()->height(); + int aux = option.rect.height() - SPACER - mControls[FavouriteControlStrong]->image()->height(); Event *event = static_cast(index.internalPointer()); // font SMALL @@ -105,10 +105,17 @@ void Delegate::paint(QPainter *painter, const QStyleOptionViewItem &option, cons foreach(Control* c, mControls.values()) { c->setEnabled(false); } - if(event->isFavourite()) - mControls[FavouriteControlOn]->paint(painter, option.rect); - else - mControls[FavouriteControlOff]->paint(painter, option.rect); + switch (event->favourite()) { + case Favourite_strong: + mControls[FavouriteControlStrong]->paint(painter, option.rect); + break; + case Favourite_weak: + mControls[FavouriteControlWeak]->paint(painter, option.rect); + break; + case Favourite_no: + mControls[FavouriteControlNo]->paint(painter, option.rect); + break; + } if(event->hasAlarm()) mControls[AlarmControlOn]->paint(painter, option.rect); @@ -124,7 +131,7 @@ void Delegate::paint(QPainter *painter, const QStyleOptionViewItem &option, cons // so the first line is actually at the same height as the image) painter->setPen(QPen(event->hasTimeConflict() ? Qt::black : textColor)); QPointF titlePointF(option.rect.x() + SPACER, - option.rect.y() + SPACER + mControls[FavouriteControlOn]->image()->height()); + option.rect.y() + SPACER + mControls[FavouriteControlStrong]->image()->height()); QTime start = event->start().time(); painter->setFont(fontBig); painter->drawText(titlePointF,start.toString("hh:mm") + "-" + start.addSecs(event->duration()).toString("hh:mm") + ", " + event->roomName()); @@ -188,7 +195,7 @@ void Delegate::paint(QPainter *painter, const QStyleOptionViewItem &option, cons // draw icons painter->setPen(QPen(textColor)); painter->setFont(fontSmall); - QImage *image = mControls[numFav ? FavouriteControlOn : FavouriteControlOff]->image(); + QImage *image = mControls[numFav ? FavouriteControlStrong : FavouriteControlNo]->image(); QPoint drawPoint = option.rect.topRight() - QPoint( @@ -306,18 +313,20 @@ void Delegate::Control::paint(QPainter* painter, const QRect rect) void Delegate::defineControls() { // FAVOURITE ICONs - // on - mControls.insert(FavouriteControlOn, new Control(FavouriteControlOn, QString(":icons/favourite-on.png"), NULL)); - // off - mControls.insert(FavouriteControlOff, new Control(FavouriteControlOff, QString(":icons/favourite-off.png"), NULL)); + // strong + mControls.insert(FavouriteControlStrong, new Control(FavouriteControlStrong, QString(":icons/favourite-on.png"), NULL)); + // weak + mControls.insert(FavouriteControlWeak, new Control(FavouriteControlWeak, QString(":icons/favourite-weak.png"), NULL)); + // no + mControls.insert(FavouriteControlNo, new Control(FavouriteControlNo, QString(":icons/favourite-off.png"), NULL)); // ALARM ICONs // on mControls.insert(AlarmControlOn, - new Control(AlarmControlOn, QString(":icons/alarm-on.png"), mControls[FavouriteControlOn])); + new Control(AlarmControlOn, QString(":icons/alarm-on.png"), mControls[FavouriteControlStrong])); // off mControls.insert(AlarmControlOff, - new Control(AlarmControlOff, QString(":icons/alarm-off.png"), mControls[FavouriteControlOff])); + new Control(AlarmControlOff, QString(":icons/alarm-off.png"), mControls[FavouriteControlNo])); // WARNING ICON mControls.insert(WarningControl, new Control(WarningControl, QString(":icons/dialog-warning.png"), mControls[AlarmControlOff])); @@ -338,7 +347,7 @@ int Delegate::numberOfFavourities(const QModelIndex &index) const int nrofFavs = 0; for(int i=0; irowCount(index); i++) - if(static_cast(index.child(i,0).internalPointer())->isFavourite()) + if(static_cast(index.child(i,0).internalPointer())->favourite() != Favourite_no) nrofFavs++; return nrofFavs; diff --git a/src/mvc/delegate.h b/src/mvc/delegate.h index e285795..ec67731 100644 --- a/src/mvc/delegate.h +++ b/src/mvc/delegate.h @@ -31,8 +31,9 @@ class Delegate : public QItemDelegate enum ControlId { ControlNone = 0, - FavouriteControlOn, - FavouriteControlOff, + FavouriteControlStrong, + FavouriteControlWeak, + FavouriteControlNo, AlarmControlOn, AlarmControlOff, WarningControl diff --git a/src/mvc/event.cpp b/src/mvc/event.cpp index 4ac2f68..47a7494 100644 --- a/src/mvc/event.cpp +++ b/src/mvc/event.cpp @@ -90,7 +90,7 @@ QList Event::conflictEvents(int aEventId, int conferenceId) { query.prepare(selectQuery() + "WHERE xid_conference = :conf AND ( \ ( start >= :s1 AND ( start + duration ) < :e1 ) \ OR ( ( start + duration ) > :s2 AND start < :e2 ) ) \ - AND favourite = 1 AND NOT id = :id ORDER BY start, duration"); + AND favourite >= 1 AND NOT id = :id ORDER BY start, duration"); query.bindValue(":conf", event.conferenceId()); query.bindValue(":s1", convertToDb(event.start(), QVariant::DateTime)); query.bindValue(":e1", convertToDb(event.start().toTime_t()+event.duration(), QVariant::DateTime)); @@ -116,7 +116,7 @@ QList Event::getFavByDate(const QDate& date, int conferenceId) { Conference conference = Conference::getById(conferenceId); QDateTime dayStart(date, conference.dayChangeTime(), Qt::UTC); QSqlQuery query; - query.prepare(selectQuery() + QString("WHERE xid_conference = :conf AND start >= :start AND start < :end AND favourite = 1 ORDER BY start, duration")); + query.prepare(selectQuery() + QString("WHERE xid_conference = :conf AND start >= :start AND start < :end AND favourite >= 1 ORDER BY start, duration")); query.bindValue(":conf", conferenceId); query.bindValue(":start", dayStart.toTime_t()); query.bindValue(":end", dayStart.addDays(1).toTime_t()); @@ -194,10 +194,18 @@ QMap Event::links() bool Event::hasTimeConflict() const { - if(!isFavourite()) // if it's not favourite, it can't have time-conflict + if(favourite() == Favourite_no) // if it's not favourite, it can't have time-conflict return false; - return conflictEvents(id(),conferenceId()).count() > 0 ? true : false; + return conflictEvents(id(),conferenceId()).count() > 0; +} + +void Event::cycleFavourite() { + switch (favourite()) { + case Favourite_no: setFavourite(Favourite_strong); break; + case Favourite_strong: setFavourite(Favourite_weak); break; + case Favourite_weak: setFavourite(Favourite_no); break; + } } void Event::setRoom(const QString &room) diff --git a/src/mvc/event.h b/src/mvc/event.h index 481db52..6322d04 100644 --- a/src/mvc/event.h +++ b/src/mvc/event.h @@ -88,6 +88,7 @@ public: void setLanguage(const QString & language) { setValue("language", language); } void setFavourite(Favourite favourite) { setValue("favourite", (int) favourite); } void setFavourite(bool favourite) { setFavourite(favourite ? Favourite_strong : Favourite_no); } // deprecated + void cycleFavourite(); void setHasAlarm(bool alarm) { setValue("alarm", (int)((alarm))); } void setTag(const QString& tag) { setValue("tag", tag); } void setTitle(const QString& title) { setValue("title", title); } diff --git a/src/mvc/treeview.cpp b/src/mvc/treeview.cpp index a3c081a..b4510ce 100644 --- a/src/mvc/treeview.cpp +++ b/src/mvc/treeview.cpp @@ -64,21 +64,19 @@ bool TreeView::testForControlClicked(const QModelIndex &aIndex, const QPoint &aP Delegate *delegate = static_cast(itemDelegate(aIndex)); switch(delegate->whichControlClicked(aIndex,aPoint)) { - case Delegate::FavouriteControlOn: - case Delegate::FavouriteControlOff: + case Delegate::FavouriteControlStrong: + case Delegate::FavouriteControlWeak: + case Delegate::FavouriteControlNo: { // handle Favourite Control clicked Event event = Event::getById(aIndex.data().toInt(),confId); QList conflicts = Event::conflictEvents(event.id(),Conference::activeConference()); - event.setFavourite(!event.isFavourite()); + event.cycleFavourite(); event.update("favourite"); - if(event.isFavourite()) - { - // event has became 'favourite' and so 'conflicts' list may have changed - conflicts = Event::conflictEvents(event.id(),Conference::activeConference()); - } + // event has became 'favourite' and so 'conflicts' list may have changed + conflicts = Event::conflictEvents(event.id(),Conference::activeConference()); // have to emit 'eventChanged' signal on all events in conflict for(int i=0; i