mirror of
https://github.com/subsurface/subsurface.git
synced 2024-11-28 13:10:19 +00:00
06e2fab291
Don't leave fields empty, this may corrupt the layout, a better way is to insert placeholders for empty data, which also provides a better UX. Signed-off-by: Lubomir I. Ivanov <neolit123@gmail.com> Signed-off-by: Gehad elrobey <gehadelrobey@gmail.com>
308 lines
6 KiB
C++
308 lines
6 KiB
C++
#include <string>
|
|
|
|
#include "templatelayout.h"
|
|
#include "helpers.h"
|
|
#include "display.h"
|
|
|
|
QList<QString> grantlee_templates;
|
|
|
|
int getTotalWork(print_options *printOptions)
|
|
{
|
|
if (printOptions->print_selected) {
|
|
// return the correct number depending on all/selected dives
|
|
// but don't return 0 as we might divide by this number
|
|
return amount_selected ? amount_selected : 1;
|
|
}
|
|
int dives = 0, i;
|
|
struct dive *dive;
|
|
for_each_dive (i, dive) {
|
|
dives++;
|
|
}
|
|
return dives;
|
|
}
|
|
|
|
void find_all_templates()
|
|
{
|
|
grantlee_templates.clear();
|
|
QDir dir(getSubsurfaceDataPath("printing_templates"));
|
|
QFileInfoList list = dir.entryInfoList(QDir::Files | QDir::NoDotAndDotDot);
|
|
foreach (QFileInfo finfo, list) {
|
|
QString filename = finfo.fileName();
|
|
if (filename.at(filename.size() - 1) != '~') {
|
|
grantlee_templates.append(finfo.fileName());
|
|
}
|
|
}
|
|
}
|
|
|
|
TemplateLayout::TemplateLayout(print_options *PrintOptions, template_options *templateOptions) :
|
|
m_engine(NULL)
|
|
{
|
|
this->PrintOptions = PrintOptions;
|
|
this->templateOptions = templateOptions;
|
|
}
|
|
|
|
TemplateLayout::~TemplateLayout()
|
|
{
|
|
delete m_engine;
|
|
}
|
|
|
|
QString TemplateLayout::generate()
|
|
{
|
|
int progress = 0;
|
|
int totalWork = getTotalWork(PrintOptions);
|
|
|
|
QString htmlContent;
|
|
m_engine = new Grantlee::Engine(this);
|
|
|
|
QSharedPointer<Grantlee::FileSystemTemplateLoader> m_templateLoader =
|
|
QSharedPointer<Grantlee::FileSystemTemplateLoader>(new Grantlee::FileSystemTemplateLoader());
|
|
m_templateLoader->setTemplateDirs(QStringList() << getSubsurfaceDataPath("printing_templates"));
|
|
m_engine->addTemplateLoader(m_templateLoader);
|
|
|
|
Grantlee::registerMetaType<Dive>();
|
|
Grantlee::registerMetaType<template_options>();
|
|
Grantlee::registerMetaType<print_options>();
|
|
|
|
QVariantHash mapping;
|
|
QVariantList diveList;
|
|
|
|
struct dive *dive;
|
|
int i;
|
|
for_each_dive (i, dive) {
|
|
//TODO check for exporting selected dives only
|
|
if (!dive->selected && PrintOptions->print_selected)
|
|
continue;
|
|
Dive d(dive);
|
|
diveList.append(QVariant::fromValue(d));
|
|
progress++;
|
|
emit progressUpdated(progress * 100.0 / totalWork);
|
|
}
|
|
mapping.insert("dives", diveList);
|
|
mapping.insert("template_options", QVariant::fromValue(*templateOptions));
|
|
mapping.insert("print_options", QVariant::fromValue(*PrintOptions));
|
|
|
|
Grantlee::Context c(mapping);
|
|
|
|
Grantlee::Template t = m_engine->loadByName(PrintOptions->p_template);
|
|
if (!t || t->error()) {
|
|
qDebug() << "Can't load template";
|
|
return htmlContent;
|
|
}
|
|
|
|
htmlContent = t->render(&c);
|
|
|
|
if (t->error()) {
|
|
qDebug() << "Can't render template";
|
|
return htmlContent;
|
|
}
|
|
return htmlContent;
|
|
}
|
|
|
|
QString TemplateLayout::readTemplate(QString template_name)
|
|
{
|
|
QFile qfile(getSubsurfaceDataPath("printing_templates") + QDir::separator() + template_name);
|
|
if (qfile.open(QFile::ReadOnly | QFile::Text)) {
|
|
QTextStream in(&qfile);
|
|
return in.readAll();
|
|
}
|
|
return "";
|
|
}
|
|
|
|
void TemplateLayout::writeTemplate(QString template_name, QString grantlee_template)
|
|
{
|
|
QFile qfile(getSubsurfaceDataPath("printing_templates") + QDir::separator() + template_name);
|
|
if (qfile.open(QFile::ReadWrite | QFile::Text)) {
|
|
qfile.write(grantlee_template.toUtf8().data());
|
|
qfile.resize(qfile.pos());
|
|
qfile.close();
|
|
}
|
|
}
|
|
|
|
Dive::Dive() :
|
|
m_number(-1),
|
|
dive(NULL)
|
|
{
|
|
}
|
|
|
|
Dive::~Dive()
|
|
{
|
|
}
|
|
|
|
int Dive::number() const
|
|
{
|
|
return m_number;
|
|
}
|
|
|
|
int Dive::id() const
|
|
{
|
|
return m_id;
|
|
}
|
|
|
|
QString Dive::date() const
|
|
{
|
|
return m_date;
|
|
}
|
|
|
|
QString Dive::time() const
|
|
{
|
|
return m_time;
|
|
}
|
|
|
|
QString Dive::location() const
|
|
{
|
|
return m_location;
|
|
}
|
|
|
|
QString Dive::duration() const
|
|
{
|
|
return m_duration;
|
|
}
|
|
|
|
QString Dive::depth() const
|
|
{
|
|
return m_depth;
|
|
}
|
|
|
|
QString Dive::divemaster() const
|
|
{
|
|
return m_divemaster;
|
|
}
|
|
|
|
QString Dive::buddy() const
|
|
{
|
|
return m_buddy;
|
|
}
|
|
|
|
QString Dive::airTemp() const
|
|
{
|
|
return m_airTemp;
|
|
}
|
|
|
|
QString Dive::waterTemp() const
|
|
{
|
|
return m_waterTemp;
|
|
}
|
|
|
|
QString Dive::notes() const
|
|
{
|
|
return m_notes;
|
|
}
|
|
|
|
QString Dive::tags() const
|
|
{
|
|
return m_tags;
|
|
}
|
|
|
|
QString Dive::gas() const
|
|
{
|
|
return m_gas;
|
|
}
|
|
|
|
QString Dive::sac() const
|
|
{
|
|
return m_sac;
|
|
}
|
|
|
|
int Dive::rating() const
|
|
{
|
|
return m_rating;
|
|
}
|
|
|
|
void Dive::put_divemaster()
|
|
{
|
|
if (!dive->divemaster)
|
|
m_divemaster = "--";
|
|
else
|
|
m_divemaster = dive->divemaster;
|
|
}
|
|
|
|
void Dive::put_date_time()
|
|
{
|
|
QDateTime localTime = QDateTime::fromTime_t(dive->when - gettimezoneoffset(displayed_dive.when));
|
|
localTime.setTimeSpec(Qt::UTC);
|
|
m_date = localTime.date().toString(QString::fromUtf8("MMM dd, yyyy"));
|
|
m_time = localTime.time().toString(QString::fromUtf8("hh:mm a"));
|
|
}
|
|
|
|
void Dive::put_location()
|
|
{
|
|
m_location = QString::fromUtf8(get_dive_location(dive));
|
|
if (m_location.isEmpty()) {
|
|
m_location = "--";
|
|
}
|
|
}
|
|
|
|
void Dive::put_depth()
|
|
{
|
|
m_depth = get_depth_string(dive->dc.maxdepth.mm, true, true);
|
|
}
|
|
|
|
void Dive::put_duration()
|
|
{
|
|
m_duration = QString::number(((dive->duration.seconds) / 60)) + QString::fromUtf8(" min");
|
|
}
|
|
|
|
void Dive::put_buddy()
|
|
{
|
|
if (!dive->buddy)
|
|
m_buddy = "--";
|
|
else
|
|
m_buddy = dive->buddy;
|
|
}
|
|
|
|
void Dive::put_temp()
|
|
{
|
|
m_airTemp = get_temperature_string(dive->airtemp, true);
|
|
m_waterTemp = get_temperature_string(dive->watertemp, true);
|
|
if (m_airTemp.isEmpty()) {
|
|
m_airTemp = "--";
|
|
}
|
|
if (m_waterTemp.isEmpty()) {
|
|
m_waterTemp = "--";
|
|
}
|
|
}
|
|
|
|
void Dive::put_notes()
|
|
{
|
|
m_notes = QString::fromUtf8(dive->notes);
|
|
if (m_notes.isEmpty()) {
|
|
m_notes = "--";
|
|
}
|
|
}
|
|
|
|
void Dive::put_tags()
|
|
{
|
|
char buffer[256];
|
|
taglist_get_tagstring(dive->tag_list, buffer, 256);
|
|
m_tags = QString(buffer);
|
|
}
|
|
|
|
void Dive::put_gas()
|
|
{
|
|
int added = 0;
|
|
QString gas, gases;
|
|
for (int i = 0; i < MAX_CYLINDERS; i++) {
|
|
if (!is_cylinder_used(dive, i))
|
|
continue;
|
|
gas = dive->cylinder[i].type.description;
|
|
gas += QString(!gas.isEmpty() ? " " : "") + gasname(&dive->cylinder[i].gasmix);
|
|
// if has a description and if such gas is not already present
|
|
if (!gas.isEmpty() && gases.indexOf(gas) == -1) {
|
|
if (added > 0)
|
|
gases += QString(" / ");
|
|
gases += gas;
|
|
added++;
|
|
}
|
|
}
|
|
m_gas = gases;
|
|
}
|
|
|
|
void Dive::put_sac()
|
|
{
|
|
if (dive->sac) {
|
|
const char *unit;
|
|
int decimal;
|
|
double value = get_volume_units(dive->sac, &decimal, &unit);
|
|
m_sac = QString::number(value, 'f', decimal).append(unit);
|
|
}
|
|
}
|