X-Git-Url: https://git.toastfreeware.priv.at/toast/confclerk.git/blobdiff_plain/fdf4d9c6fff535b9ee955b8eb8c512007b1ade32..080dc7d603d45ba0662aa731418993ddd45b5fe8:/src/gui/daynavigatorwidget.cpp diff --git a/src/gui/daynavigatorwidget.cpp b/src/gui/daynavigatorwidget.cpp index 9424ef1..1b61efd 100644 --- a/src/gui/daynavigatorwidget.cpp +++ b/src/gui/daynavigatorwidget.cpp @@ -1,6 +1,6 @@ /* * Copyright (C) 2010 Ixonos Plc. - * Copyright (C) 2011 Philipp Spitzer, gregor herrmann + * Copyright (C) 2011-2024 Philipp Spitzer, gregor herrmann, Stefan Stahl * * This file is part of ConfClerk. * @@ -17,112 +17,151 @@ * You should have received a copy of the GNU General Public License along with * ConfClerk. If not, see . */ -#include "daynavigatorwidget.h" #include -#include #include -#include +#include "daynavigatorwidget.h" +#include "conference.h" +#include "application.h" + + +DayNavigatorWidget::DayNavigatorWidget(QWidget *aParent): QWidget(aParent) { + setupUi(this); -DayNavigatorWidget::DayNavigatorWidget(QWidget *aParent) - : QWidget(aParent) - , mStartDate(QDate()) - , mEndDate(QDate()) - , mCurDate(QDate()) -{ - setupUi(this); connect(prevDayButton, SIGNAL(clicked()), SLOT(prevDayButtonClicked())); connect(nextDayButton, SIGNAL(clicked()), SLOT(nextDayButtonClicked())); - mFontMetrics = new QFontMetrics(QLabel().font()); + configureNavigation(); } -void DayNavigatorWidget::setDates(const QDate &aStartDate, const QDate &aEndDate) -{ - Q_ASSERT(aStartDate<=aEndDate); + +void DayNavigatorWidget::setDates(const QDate &aStartDate, const QDate &aEndDate) { + Q_ASSERT(aStartDate.isValid() && aEndDate.isValid() && aStartDate<=aEndDate); mStartDate = aStartDate; mEndDate = aEndDate; - mCurDate = aStartDate; - // QRect rect = mFontMetrics->boundingRect(mCurDate.toString("MMM dd yyyy")); + if (!mCurDate.isValid()) mCurDate = mStartDate; + // if mCurDate is out of range, set it to mstartDate + else if (mCurDate < mStartDate || mCurDate > mEndDate) mCurDate = mStartDate; - if(mStartDate==mEndDate) // only one day conference - { - prevDayButton->setDisabled(true); - nextDayButton->setDisabled(true); - emit(dateChanged(mCurDate)); - } - else - { - // at least 2-days conference - prevDayButton->setDisabled(true); - nextDayButton->setDisabled(false); - emit(dateChanged(mCurDate)); - } + configureNavigation(); + emit(dateChanged(mCurDate)); + this->update(); } -void DayNavigatorWidget::prevDayButtonClicked() -{ - if(mCurDate>mStartDate) - { - mCurDate = mCurDate.addDays(-1); - // check start date - if(mCurDate==mStartDate || mStartDate==mEndDate) - prevDayButton->setDisabled(true); - else - prevDayButton->setDisabled(false); - // check end date - if(mCurDate==mEndDate || mStartDate==mEndDate) - nextDayButton->setDisabled(true); - else - nextDayButton->setDisabled(false); - - emit(dateChanged(mCurDate)); - selectedDate->update(); + +void DayNavigatorWidget::setCurDate(const QDate& curDate) { + Q_ASSERT(curDate.isValid()); + if (curDate == mCurDate) return; + + if (!mStartDate.isValid()) { + // the start and end date have not been set + mStartDate = curDate; + mEndDate = curDate; + mCurDate = curDate; } + + else if (curDate < mStartDate) mCurDate = mStartDate; + else if (curDate > mEndDate) mCurDate = mEndDate; + else mCurDate = curDate; + + configureNavigation(); + emit(dateChanged(mCurDate)); + this->update(); } -void DayNavigatorWidget::nextDayButtonClicked() -{ - if(mCurDatesetDisabled(true); - else - prevDayButton->setDisabled(false); - // check end date - if(mCurDate==mEndDate || mStartDate==mEndDate) - nextDayButton->setDisabled(true); - else - nextDayButton->setDisabled(false); - - emit(dateChanged(mCurDate)); - selectedDate->update(); - } + +void DayNavigatorWidget::unsetDates() { + mStartDate= QDate(); + mEndDate = QDate(); + mCurDate = QDate(); + + configureNavigation(); + emit(dateChanged(mCurDate)); + this->update(); } -void DayNavigatorWidget::paintEvent(QPaintEvent *aEvent) -{ - Q_UNUSED(aEvent); +QSize DayNavigatorWidget::minimumSizeHint() const { +#ifdef MAEMO + return QSize(20, 0); +#else + return QSize(fontMetrics().lineSpacing() * 3 / 2, 0); +#endif +} + + +void DayNavigatorWidget::configureNavigation() { + prevDayButton->setDisabled(!mStartDate.isValid() || mCurDate == mStartDate); + nextDayButton->setDisabled(!mEndDate.isValid() || mCurDate == mEndDate); +} - QString selectedDateStr = mCurDate.toString("MMM dd yyyy"); +void DayNavigatorWidget::prevDayButtonClicked() { + if(mCurDate <= mStartDate) return; + mCurDate = mCurDate.addDays(-1); + configureNavigation(); + emit(dateChanged(mCurDate)); + this->update(); +} + + +void DayNavigatorWidget::nextDayButtonClicked() { + if(mCurDate >= mEndDate) return; + mCurDate = mCurDate.addDays(1); + configureNavigation(); + emit(dateChanged(mCurDate)); + this->update(); +} + + +void DayNavigatorWidget::paintEvent(QPaintEvent *aEvent) { + Q_UNUSED(aEvent); + QString selectedDateStr; + if (mCurDate.isValid()) { + QString selectedDateFormat = +#ifdef MAEMO + "dddd\nyyyy-MM-dd"; +#else + "dddd • yyyy-MM-dd"; +#endif + selectedDateStr = mCurDate.toString(selectedDateFormat); + bool hasConference = ((Application*) qApp)->hasActiveConference(); + if (hasConference) { + Conference& conference = ((Application*) qApp)->activeConference(); + if (conference.hasDisplayTimeShift() && conference.displayTimeShift() != 0) { + QTime shift(0, 0); + bool minus = conference.displayTimeShift() < 0; + shift = shift.addSecs(conference.displayTimeShift() * 60 * (minus ? -1 : 1)); + selectedDateStr += " • " + (minus ? QString("-") : "+") + shift.toString("HH:mm"); + } + } + } else { + selectedDateStr = tr("No date"); + } QPainter painter(this); painter.save(); - QRect r = selectedDate->geometry(); - QRect s = mFontMetrics->boundingRect(selectedDateStr); - QPoint p = QPoint( - r.x() + r.width()/2 - s.height()/2 - mFontMetrics->descent(), - - s.width() - ); - - painter.translate(r.width()/2, r.height()/2); + + // rectangle only for the text + QRect q(-selectedDate->height()-selectedDate->y(), selectedDate->x(), selectedDate->height(), selectedDate->width()); painter.rotate(270); - painter.drawText(p.y(), p.x(), selectedDateStr); // y,x,string + + // font size adjustion, static on maemo, dynamically otherwise + QFont f = painter.font(); +#ifdef MAEMO + qreal factor = 0.8; +#else +#if QT_VERSION >= 0x050b00 // QT 5.11 + auto dateStrWidth = painter.fontMetrics().horizontalAdvance(selectedDateStr); +#else + auto dateStrWidth = painter.fontMetrics().width(selectedDateStr); +#endif + qreal factor = (qreal) 2 * q.width() / dateStrWidth; +#endif + if (factor < 1) f.setPointSizeF(f.pointSizeF() * factor); + painter.setFont(f); + + painter.drawText(q, Qt::AlignCenter, selectedDateStr); painter.restore(); } -