* Basic tip of the day with sample widget added * "Show tips on startup" option added to settings * tip cycling implemented * Structure of the tipOfTheDay class and resource created * tip getter function modified * Resources added, feature works properly * clangified * accidental modification rolled back * zach cleanup * tips to spaces; cmake list combined * cleanup img * fix copy * remove TOTD as QObject so we can copy construct it * prevent mem leaks in dlg * changed order of 'next' and 'previous' buttons * Date and tip numbers added; content wraps around * useless sizepolicy removed * link support added & clangified * Initial tips & memory management updates
99 lines
2.8 KiB
C++
99 lines
2.8 KiB
C++
#include <QDate>
|
|
#include <QFile>
|
|
#include <QMessageBox>
|
|
#include <QTextStream>
|
|
#include <QXmlStreamReader>
|
|
#include <utility>
|
|
|
|
#include "tip_of_the_day.h"
|
|
|
|
#define TIPDDBMODEL_COLUMNS 3
|
|
|
|
TipOfTheDay::TipOfTheDay(QString _title, QString _content, QString _imagePath, QDate _date)
|
|
: title(std::move(_title)), content(std::move(_content)), imagePath(std::move(_imagePath)), date(_date)
|
|
{
|
|
}
|
|
|
|
TipsOfTheDay::TipsOfTheDay(QString xmlPath, QObject *parent) : QAbstractListModel(parent)
|
|
{
|
|
tipList = new QList<TipOfTheDay>;
|
|
|
|
QFile xmlFile(xmlPath);
|
|
|
|
QTextStream errorStream(stderr);
|
|
if (!QFile::exists(xmlPath)) {
|
|
errorStream << tr("File does not exist.\n");
|
|
return;
|
|
} else if (!xmlFile.open(QIODevice::ReadOnly)) {
|
|
errorStream << tr("Failed to open file.\n");
|
|
return;
|
|
}
|
|
|
|
QXmlStreamReader reader(&xmlFile);
|
|
|
|
while (!reader.atEnd()) {
|
|
if (reader.readNext() == QXmlStreamReader::EndElement) {
|
|
break;
|
|
}
|
|
|
|
if (reader.name() == "tip") {
|
|
QString title, content, imagePath;
|
|
QDate date;
|
|
reader.readNext();
|
|
while (!reader.atEnd()) {
|
|
if (reader.readNext() == QXmlStreamReader::EndElement) {
|
|
break;
|
|
}
|
|
|
|
if (reader.name() == "title") {
|
|
title = reader.readElementText();
|
|
} else if (reader.name() == "text") {
|
|
content = reader.readElementText();
|
|
} else if (reader.name() == "image") {
|
|
imagePath = "theme:tips/images/" + reader.readElementText();
|
|
} else if (reader.name() == "date") {
|
|
date = QDate::fromString(reader.readElementText(), Qt::ISODate);
|
|
} else {
|
|
// unkown element, do nothing
|
|
}
|
|
}
|
|
tipList->append(TipOfTheDay(title, content, imagePath, date));
|
|
}
|
|
}
|
|
}
|
|
|
|
TipsOfTheDay::~TipsOfTheDay()
|
|
{
|
|
delete tipList;
|
|
}
|
|
|
|
QVariant TipsOfTheDay::data(const QModelIndex &index, int /*role*/) const
|
|
{
|
|
if (!index.isValid() || index.row() >= tipList->size() || index.column() >= TIPDDBMODEL_COLUMNS)
|
|
return QVariant();
|
|
|
|
TipOfTheDay tip = tipList->at(index.row());
|
|
switch (index.column()) {
|
|
case TitleColumn:
|
|
return tip.getTitle();
|
|
case ContentColumn:
|
|
return tip.getContent();
|
|
case ImagePathColumn:
|
|
return tip.getImagePath();
|
|
case DateColumn:
|
|
return tip.getDate();
|
|
default:
|
|
return QVariant();
|
|
}
|
|
}
|
|
|
|
TipOfTheDay TipsOfTheDay::getTip(int tipId)
|
|
{
|
|
return tipList->at(tipId);
|
|
}
|
|
|
|
int TipsOfTheDay::rowCount(const QModelIndex &parent) const
|
|
{
|
|
Q_UNUSED(parent);
|
|
return tipList->size();
|
|
}
|