void StatisticWindow::onSetPeriodPress() { switch(ui->comboBoxPeriod->currentIndex()){ case P_TODAY:{ ui->dateEditFrom->setDate(QDate::currentDate()); } break; case P_WEEK:{ QDate date = QDate::currentDate(); ui->dateEditFrom->setDate(date.addDays(-date.dayOfWeek()+1)); } break; case P_MONTH:{ QDate date = QDate::currentDate(); ui->dateEditFrom->setDate(date.addDays(-date.day()+1)); } break; case P_YEAR:{ QDate date = QDate::currentDate(); ui->dateEditFrom->setDate(date.addDays(-date.dayOfYear()+1)); } break; } ui->dateEditTo->setDate(QDate::currentDate()); onUpdatePress(); }
Element::List Datenums::createDayElements(const QDate &date) { Element::List result; int dayOfYear = date.dayOfYear(); int remainingDays = date.daysInYear() - dayOfYear; StoredElement *e; switch (mDisplayedInfo) { case DayOfYear: // only day of year e = new StoredElement(QStringLiteral("main element"), QString::number(dayOfYear)); break; case DaysRemaining: // only days until end of year e = new StoredElement(QStringLiteral("main element"), QString::number(remainingDays), i18np("1 day before the end of the year", "%1 days before the end of the year", remainingDays)); break; case DayOfYear + DaysRemaining: // both day of year and days till end of year default: e = new StoredElement(QStringLiteral("main element"), QString::number(dayOfYear), i18nc("dayOfYear / daysTillEndOfYear", "%1 / %2", dayOfYear, remainingDays), i18np("1 day since the beginning of the year,\n", "%1 days since the beginning of the year,\n", dayOfYear) + i18np("1 day until the end of the year", "%1 days until the end of the year", remainingDays)); break; } result.append(e); return result; }
/* * Get the last modification date for a file */ QString FileList::getLastModified(QString fullPath) { if (m_lastModifiedMap.contains(fullPath)) return m_lastModifiedMap.value(fullPath); else { QFileInfo fileInfo(fullPath); // Use day/month/year format because it makes more sense and anyone who's willing to tell // otherwise is wrong // Show only time if the file was modified on the same day bool sameDay = false; QDate currentDate = QDate::currentDate(); if (currentDate.dayOfYear() == fileInfo.lastModified().date().dayOfYear() && currentDate.year() == fileInfo.lastModified().date().year()) sameDay = true; QString modifiedString; if (sameDay) modifiedString = fileInfo.lastModified().toString("hh:mm"); else modifiedString = fileInfo.lastModified().toString("dd/MM/yyyy"); m_lastModifiedMap.insert(fullPath, modifiedString); return modifiedString; } }
int kMyMoneyCalendar::weekOfYear(const QDate& date) { // Calculate ISO 8601 week number (taken from glibc/Gnumeric) int year, week, jan1wday, nextjan1wday; QDate jan1date, nextjan1date; year = date.year(); jan1date = QDate(year, 1, 1); jan1wday = jan1date.dayOfWeek(); week = (date.dayOfYear() - 1 + jan1wday - 1) / 7 + ((jan1wday - 1) == 0 ? 1 : 0); /* Does date belong to last week of previous year? */ if ((week == 0) && (jan1wday > 4 /*THURSDAY*/)) { QDate tmpdate = QDate(year - 1, 12, 31); return weekOfYear(tmpdate); } if ((jan1wday <= 4 /*THURSDAY*/) && (jan1wday > 1 /*MONDAY*/)) week++; if (week == 53) { nextjan1date = QDate(year + 1, 1, 1); nextjan1wday = nextjan1date.dayOfWeek(); if (nextjan1wday <= 4 /*THURSDAY*/) week = 1; } return week; }
QList<int> tradeDateCalendar::computeFrequencyTradeYearly(int date_, int minimumDate_, int maximumDate_) { QList<int> tradeDates; QDate yearDayCounter = QDate::fromJulianDay(minimumDate_); int dayOfYear = QDate::fromJulianDay(date_).dayOfYear(); forever { QDate yearDayComputation = yearDayCounter; int leapDayofYear = dayOfYear + (dayOfYear > 59 /* Feb 28th */ && QDate::isLeapYear(yearDayComputation.year()) ? 1 : 0); if (yearDayComputation.dayOfYear() > leapDayofYear) { yearDayComputation = yearDayComputation.addYears(1); leapDayofYear = dayOfYear + (dayOfYear > 59 /* Feb 28th */ && QDate::isLeapYear(yearDayComputation.year()) ? 1 : 0); } date_ = checkTradeDate(yearDayComputation.toJulianDay(), direction_ascending); if (date_ > maximumDate_) break; tradeDates.append(date_); yearDayCounter = yearDayCounter.addYears(1); } return tradeDates; }
QString SigGenerator::daily() const { if(signatures.count() <= 0) return(QString::null); QDate date; int i = date.dayOfYear() % signatures.count(); QString text; SigListViewItem::nodeToText(signatures.item(i), text); return attachStandard(text); }
/*! Replacement for localtime_r() which is not available on MinGW. We use this on all of Qt's platforms for portability. */ struct tm gmtimeQt(const QDateTime &input) { tm result; const QDate date(input.date()); result.tm_year = date.year() - 1900; result.tm_mon = date.month(); result.tm_mday = date.day(); result.tm_wday = date.dayOfWeek(); result.tm_yday = date.dayOfYear(); const QTime time(input.time()); result.tm_sec = time.second(); result.tm_min = time.minute(); result.tm_hour = time.hour(); return result; }
// The following code is borrowed from QT 3.2 QDate::weekNumber() // and slightly modified int kMyMoneyDateTbl::weekNumber(const QDate& date, int *yearNumber) const { if ( !date.isValid() ) return 0; int dow = date.dayOfWeek(); int doy = date.dayOfYear(); int currYear = date.year(); int jan1WeekDay = QDate( currYear, 1, 1 ).dayOfWeek(); int yearNum; int weekNum; if ( doy <= (8 - jan1WeekDay) && jan1WeekDay > 4 ) { yearNum = currYear - 1; weekNum = 52; if ( jan1WeekDay == 5 || (jan1WeekDay == 6 && QDate::leapYear(yearNum)) ) weekNum++; } else { int totalDays = 365; if ( QDate::leapYear(currYear) ) totalDays++; if ( (totalDays - doy < 4 - dow) || (jan1WeekDay == 7 && totalDays - doy < 3) ) { yearNum = currYear + 1; weekNum = 1; } else { int j = doy + ( 7 - dow ) + ( jan1WeekDay - 1 ); yearNum = currYear; weekNum = j / 7; if ( jan1WeekDay > 4 ) weekNum--; } } if ( yearNumber ) *yearNumber = yearNum; return weekNum; }
// http://unicode.org/reports/tr35/tr35-6.html#Date_Format_Patterns static void finishStr(QString &str, const WeekDate &week_date, const QDate &date, const QTime &time, QChar c, int length) { if (length <= 0) return; switch (c.unicode()) { case L'G': { bool ad = date.year() > 0; if (length < 4) str += ad ? "AD" : "BC"; else if (length == 4) str += ad ? "Anno Domini" : "Before Christ"; else str += ad ? "A" : "B"; break; } case L'y': if (length == 2) appendInt(str, date.year() % 100, 2); else appendInt(str, date.year(), length); break; case L'Y': appendInt(str, week_date.year(), length); break; case L'u': { int year = date.year(); if (year < 0) year++; appendInt(str, date.year(), length); break; } case L'q': case L'Q': { int q = (date.month() + 2) / 3; if (length < 3) appendInt(str, q, length); else if (length == 3) { str += 'Q'; str += QString::number(q); } else { switch (q) { case 1: str += qApp->translate("AdiumTimeFormatter", "1st quarter"); break; case 2: str += qApp->translate("AdiumTimeFormatter", "2nd quarter"); break; case 3: str += qApp->translate("AdiumTimeFormatter", "3rd quarter"); break; case 4: str += qApp->translate("AdiumTimeFormatter", "4th quarter"); break; default: break; } } break; } case L'M': case L'L': if (length < 3) appendInt(str, date.month(), length); else if (length == 3) str += QDate::shortMonthName(date.month()); else if (length == 4) str += QDate::longMonthName(date.month()); else str += QDate::shortMonthName(date.month()).at(0); break; case L'w': TRIM_LENGTH(2); appendInt(str, length, week_date.week()); break; case L'W': while (length-- > 0) str += QString::number((date.day() + 6) / 7); break; case L'd': TRIM_LENGTH(2); appendInt(str, date.day(), length); break; case L'D': TRIM_LENGTH(3); appendInt(str, date.dayOfYear(), length); break; case L'F': while (length-- > 0) str += QString::number(1); break; case L'g': appendInt(str, date.toJulianDay(), length); break; case L'c': case L'e': if (length < 3) { appendInt(str, date.dayOfWeek(), length); break; } case L'E': if (length < 4) str += QDate::shortDayName(date.dayOfWeek()); else if (length == 4) str += QDate::longDayName(date.dayOfWeek()); else str += QDate::shortDayName(date.dayOfWeek()).at(0); break; case L'a': str += time.hour() < 12 ? "AM" : "PM"; break; case L'H': TRIM_LENGTH(2); appendInt(str, time.hour(), length); break; case L'h': TRIM_LENGTH(2); appendInt(str, time.hour() % 12, length); break; case L'K': TRIM_LENGTH(2); appendInt(str, time.hour() - 1, length); break; case L'k': TRIM_LENGTH(2); appendInt(str, time.hour() % 12 - 1, length); break; case L'm': TRIM_LENGTH(2); appendInt(str, time.minute(), length); break; case L's': TRIM_LENGTH(2); appendInt(str, time.second(), length); break; case L'S': str += QString::number(time.msec() / 1000.0, 'f', length).section('.', 1); break; case L'A': appendInt(str, QTime(0,0).msecsTo(time), length); break; case L'v': // I don't understand the difference case L'z': if (length < 4) str += SystemInfo::instance()->timezone(); else // There should be localized name, but I don't know how get it str += SystemInfo::instance()->timezone(); break; case L'Z': { if (length == 4) str += "GMT"; int offset = SystemInfo::instance()->timezoneOffset(); if (offset < 0) str += '+'; else str += '-'; appendInt(str, qAbs((offset/60)*100 + offset%60), 4); break; } default: while (length-- > 0) str += c; break; } }
QString convertTimeDate(const QString &mac_format, const QDateTime &datetime) { QDate date = datetime.date(); QTime time = datetime.time(); QString str; if (mac_format.contains('%')) { const QChar *chars = mac_format.constData(); bool is_percent = false; int length = 0; bool error = false; while ((*chars).unicode() && !error) { if (is_percent) { is_percent = false; switch ((*chars).unicode()) { case L'%': str += *chars; break; case L'a': appendStr(str, QDate::shortDayName(date.dayOfWeek()), length); break; case L'A': appendStr(str, QDate::longDayName(date.dayOfWeek()), length); break; case L'b': appendStr(str, QDate::shortMonthName(date.day()), length); break; case L'B': appendStr(str, QDate::longMonthName(date.day()), length); break; case L'c': appendStr(str, QLocale::system().toString(datetime), length); break; case L'd': appendInt(str, date.day(), length > 0 ? length : 2); break; case L'e': appendInt(str, date.day(), length); break; case L'F': appendInt(str, time.msec(), length > 0 ? length : 3); break; case L'H': appendInt(str, time.hour(), length > 0 ? length : 2); break; case L'I': appendInt(str, time.hour() % 12, length > 0 ? length : 2); break; case L'j': appendInt(str, date.dayOfYear(), length > 0 ? length : 3); break; case L'm': appendInt(str, date.month(), length > 0 ? length : 2); break; case L'M': appendInt(str, time.minute(), length > 0 ? length : 2); break; case L'p': appendStr(str, time.hour() < 12 ? "AM" : "PM", length); break; case L'S': appendInt(str, time.second(), length > 0 ? length : 2); break; case L'w': appendInt(str, date.dayOfWeek(), length); break; case L'x': appendStr(str, QLocale::system().toString(date), length); break; case L'X': appendStr(str, QLocale::system().toString(time), length); break; case L'y': appendInt(str, date.year() % 100, length > 0 ? length : 2); break; case L'Y': appendInt(str, date.year(), length > 0 ? length : 4); break; case L'Z': // It should be localized, isn't it?.. appendStr(str, SystemInfo::instance()->timezone(), length); break; case L'z': { int offset = SystemInfo::instance()->timezoneOffset(); appendInt(str, (offset/60)*100 + offset%60, length > 0 ? length : 4); break; } default: if ((*chars).isDigit()) { is_percent = true; length *= 10; length += (*chars).digitValue(); } else error = true; } } else if (*chars == '%') { length = 0; is_percent = true; } else str += *chars; chars++; } if (!error) return str; str.clear(); } WeekDate week_date(date); QChar last; QChar cur; int length = 0; bool quote = false; const QChar *chars = mac_format.constData(); forever { cur = *chars; if (cur == '\'') { if (*(chars+1) == '\'') { chars++; str += cur; } else { if (!quote) finishStr(str, week_date, date, time, last, length); quote = !quote; } length = 0; } else if (quote) str += cur; else { if (cur == last) length++; else { finishStr(str, week_date, date, time, last, length); length = 1; } } if (!chars->unicode()) break; last = cur; chars++; } return str; }
void SvgView::loadPlan(vlePlan *plan) { qWarning() << "SvgView::loadPlan"; if ( mTplHeader.isNull() ) { // ToDo : improve error handling qWarning() << "SvgView::loadPlan() Template error"; return; } // Compute the height of a group if (mTplHeader.hasAttribute("height")) mGroupHeight = mTplHeader.attribute("height").toDouble(); else mGroupHeight = 100; // Compute size of the whole plan int planHeight = mGroupHeight * (1 + plan->countGroups()); int planWidth = (mMaxWidth * mZoomLevel); // Create SVG document QDomDocument planSVG("xml"); // Create root element QDomElement e = planSVG.createElement("svg"); e.setAttribute("width", QString(planWidth)); e.setAttribute("height", QString(planHeight)); e.setAttribute("viewBox", QString("0 0 %1 %2").arg(planWidth).arg(planHeight)); e.setAttribute("version", "1.1"); QDate dateStart = plan->dateStart(); QDate dateEnd = plan->dateEnd(); int nbDays = dateStart.daysTo(dateEnd); // In the plan duration is more than 1500 days if (nbDays > mMaxWidth) { // Update "pixel-per-day" to avoid very large picture qreal widgetSize = mMaxWidth; mPixelPerDay = (widgetSize / nbDays); } if (plan != mPlan) { qWarning() << "Plan period is from" << dateStart.toString("dd/MM/yyyy") << "to" << dateEnd.toString("dd/MM/yyyy") << "(" << nbDays<< "days)" << "[" << mPixelPerDay << "pixel per day]"; } // First insert the time rule QDomElement timeGrp = mTplHeader.cloneNode().toElement(); updateField(timeGrp, "{{name}}", ""); updatePos (timeGrp, 0, 0); updateAttr (timeGrp, "header_background", "width", QString::number(planWidth)); float yLen = (mPixelPerDay * 365 * mZoomLevel); // Show Weeks if (yLen > 2000) { QDate r; if (dateStart.daysInMonth() == 1) r.setDate(dateStart.year(), dateStart.month(), dateStart.day()); else r.setDate(dateStart.year(), dateStart.month() + 1, 1); while (r < dateEnd) { QDomElement newTimeStep = mTplTime.cloneNode().toElement(); if (yLen < 5000) updateField(newTimeStep, "{{name}}", r.toString("dd/MM") ); else updateField(newTimeStep, "{{name}}", r.toString("dd/MM/yy") ); updateAttr (newTimeStep, "step_block", "width", QString::number(4)); int offset = dateStart.daysTo(r); int aPos = (offset * mPixelPerDay * mZoomLevel); updatePos(newTimeStep, aPos, 0); timeGrp.appendChild(newTimeStep); r = r.addDays(7); } } // Show month else if (yLen > 500) { QDate r; if (dateStart.daysInMonth() == 1) r.setDate(dateStart.year(), dateStart.month(), dateStart.day()); else r.setDate(dateStart.year(), dateStart.month() + 1, 1); while (r < dateEnd) { QDomElement newTimeStep = mTplTime.cloneNode().toElement(); if (yLen < 1000) updateField(newTimeStep, "{{name}}", r.toString("MMM") ); else updateField(newTimeStep, "{{name}}", r.toString("MMM yy") ); updateAttr (newTimeStep, "step_block", "width", QString::number(4)); int offset = dateStart.daysTo(r); int aPos = (offset * mPixelPerDay * mZoomLevel); updatePos(newTimeStep, aPos, 0); timeGrp.appendChild(newTimeStep); r = r.addMonths(1); } } // Show Year else { QDate r; if (dateStart.dayOfYear() == 1) r.setDate(dateStart.year(), dateStart.month(), dateStart.day()); else r.setDate(dateStart.year() + 1, 1, 1); while (r < dateEnd) { QDomElement newTimeStep = mTplTime.cloneNode().toElement(); updateField(newTimeStep, "{{name}}", QString::number(r.year()) ); updateAttr (newTimeStep, "step_block", "width", QString::number(4)); int offset = dateStart.daysTo(r); int aPos = (offset * mPixelPerDay * mZoomLevel); updatePos(newTimeStep, aPos, 0); timeGrp.appendChild(newTimeStep); r = r.addYears(1); } } e.appendChild(timeGrp); // Insert all the known groups for (int i=0; i < plan->countGroups(); i++) { vlePlanGroup *planGroup = plan->getGroup(i); vlePlanActivity *prevActivity = 0; int prevLen = 0; int prevOffset = 0; // Create a new Group QDomElement newGrp = mTplHeader.cloneNode().toElement(); updateField(newGrp, "{{name}}", planGroup->getName()); updatePos (newGrp, 0, ((i + 1) * mGroupHeight)); updateAttr (newGrp, "header_background", "width", QString::number(planWidth)); for (int j = 0; j < planGroup->count(); j++) { vlePlanActivity *planActivity = planGroup->getActivity(j); QDate actStart = planActivity->dateStart(); QDate actEnd = planActivity->dateEnd(); qreal actLength = (mPixelPerDay * actStart.daysTo(actEnd) * mZoomLevel); if (actLength < 1) actLength = 1; QDomElement newAct = mTplTask.cloneNode().toElement(); updateField(newAct, "{{name}}", planActivity->getName()); updateAttr (newAct, "activity_block", "width", QString::number(actLength)); QString cfgColor("#00edda"); QString activityClass = planActivity->getClass(); if ( ! activityClass.isEmpty() ) { QString cfg = getConfig("color", activityClass); if ( ! cfg.isEmpty() ) cfgColor = cfg; } QString fillStyle = QString(";fill:%1").arg(cfgColor); updateAttr (newAct, "activity_block", "style", fillStyle, false); int date = dateStart.daysTo(planActivity->dateStart()); int aPos = (date * mPixelPerDay * mZoomLevel); if (prevActivity) { if (prevLen > aPos) { if (prevOffset < 40) prevOffset += 15; updateAttr(newAct, "activity_name", "y", QString::number(prevOffset)); } else prevOffset = 15; } updatePos(newAct, aPos, 0); newGrp.appendChild(newAct); prevActivity = planActivity; prevLen = aPos + (planActivity->getName().size() * 8); } e.appendChild(newGrp); } planSVG.appendChild( e ); QByteArray data; QTextStream stream(&data); planSVG.save(stream, QDomNode::EncodingFromTextStream); #ifdef PLAN_OUT QFile File("planOut.svg"); File.open( QIODevice::WriteOnly ); QTextStream TextStream(&File); planSVG.save(TextStream, 0); File.close(); mFilename = "planOut.svg"; #else mFilename.clear(); #endif mPlan = plan; QXmlStreamReader xData(data); mSvgRenderer->load(&xData); refresh(); }