mirror of
https://github.com/Cockatrice/Cockatrice.git
synced 2026-04-27 07:48:01 -07:00
Tip of the Day (#3118)
* 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
This commit is contained in:
parent
281e52eaa9
commit
312caae062
24 changed files with 498 additions and 2 deletions
99
cockatrice/src/tip_of_the_day.cpp
Normal file
99
cockatrice/src/tip_of_the_day.cpp
Normal file
|
|
@ -0,0 +1,99 @@
|
|||
#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();
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue