| 
									
										
										
										
											2017-04-27 20:26:05 +02:00
										 |  |  | // SPDX-License-Identifier: GPL-2.0
 | 
					
						
							| 
									
										
										
										
											2015-04-21 17:23:13 +02:00
										 |  |  | #ifndef TEMPLATELAYOUT_H
 | 
					
						
							|  |  |  | #define TEMPLATELAYOUT_H
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-24 22:54:54 +02:00
										 |  |  | #include <QStringList>
 | 
					
						
							| 
									
										
										
										
											2015-04-21 17:23:13 +02:00
										 |  |  | #include <grantlee_templates.h>
 | 
					
						
							|  |  |  | #include "mainwindow.h"
 | 
					
						
							| 
									
										
										
										
											2015-06-14 06:25:35 +02:00
										 |  |  | #include "printoptions.h"
 | 
					
						
							| 
									
										
										
										
											2016-04-05 09:40:03 -07:00
										 |  |  | #include "core/statistics.h"
 | 
					
						
							|  |  |  | #include "core/qthelper.h"
 | 
					
						
							| 
									
										
										
										
											2016-04-04 22:02:03 -07:00
										 |  |  | #include "core/subsurface-qt/DiveObjectHelper.h"
 | 
					
						
							| 
									
										
										
										
											2019-08-12 18:26:42 +02:00
										 |  |  | #include "core/subsurface-qt/CylinderObjectHelper.h" // TODO: remove once grantlee supports Q_GADGET objects
 | 
					
						
							| 
									
										
										
										
											2015-04-21 17:23:13 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-06-21 06:13:22 +02:00
										 |  |  | int getTotalWork(print_options *printOptions); | 
					
						
							| 
									
										
										
										
											2015-07-24 09:26:25 +02:00
										 |  |  | void find_all_templates(); | 
					
						
							| 
									
										
										
										
											2017-11-23 01:59:26 +02:00
										 |  |  | void set_bundled_templates_as_read_only(); | 
					
						
							| 
									
										
										
										
											2017-11-24 22:54:54 +02:00
										 |  |  | void copy_bundled_templates(QString src, QString dst, QStringList *templateBackupList); | 
					
						
							| 
									
										
										
										
											2015-07-24 09:26:25 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-21 19:03:42 +02:00
										 |  |  | extern QList<QString> grantlee_templates, grantlee_statistics_templates; | 
					
						
							| 
									
										
										
										
											2015-06-10 13:39:15 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-21 17:23:13 +02:00
										 |  |  | class TemplateLayout : public QObject { | 
					
						
							|  |  |  | 	Q_OBJECT | 
					
						
							|  |  |  | public: | 
					
						
							| 
									
										
										
										
											2019-04-26 17:51:25 +02:00
										 |  |  | 	TemplateLayout(print_options *printOptions, template_options *templateOptions); | 
					
						
							| 
									
										
										
										
											2015-04-21 17:23:13 +02:00
										 |  |  | 	QString generate(); | 
					
						
							| 
									
										
										
										
											2015-08-21 19:03:42 +02:00
										 |  |  | 	QString generateStatistics(); | 
					
						
							| 
									
										
										
										
											2015-07-05 06:21:39 +02:00
										 |  |  | 	static QString readTemplate(QString template_name); | 
					
						
							|  |  |  | 	static void writeTemplate(QString template_name, QString grantlee_template); | 
					
						
							| 
									
										
										
										
											2015-04-21 17:23:13 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | private: | 
					
						
							| 
									
										
										
										
											2019-04-26 17:51:25 +02:00
										 |  |  | 	print_options *printOptions; | 
					
						
							| 
									
										
										
										
											2015-07-02 22:26:31 +02:00
										 |  |  | 	template_options *templateOptions; | 
					
						
							| 
									
										
										
										
											2015-05-30 15:32:15 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | signals: | 
					
						
							|  |  |  | 	void progressUpdated(int value); | 
					
						
							| 
									
										
										
										
											2015-04-21 17:23:13 +02:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-26 18:16:02 +02:00
										 |  |  | struct YearInfo { | 
					
						
							| 
									
										
										
										
											2015-08-21 19:00:46 +02:00
										 |  |  | 	stats_t *year; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-02 22:26:31 +02:00
										 |  |  | Q_DECLARE_METATYPE(template_options) | 
					
						
							| 
									
										
										
										
											2015-07-16 11:39:27 +02:00
										 |  |  | Q_DECLARE_METATYPE(print_options) | 
					
						
							| 
									
										
										
										
											2015-08-21 19:00:46 +02:00
										 |  |  | Q_DECLARE_METATYPE(YearInfo) | 
					
						
							| 
									
										
										
										
											2015-04-21 17:23:13 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-02 22:37:14 +02:00
										 |  |  | GRANTLEE_BEGIN_LOOKUP(template_options) | 
					
						
							|  |  |  | if (property == "font") { | 
					
						
							|  |  |  | 	switch (object.font_index) { | 
					
						
							|  |  |  | 	case 0: | 
					
						
							|  |  |  | 		return "Arial, Helvetica, sans-serif"; | 
					
						
							|  |  |  | 	case 1: | 
					
						
							|  |  |  | 		return "Impact, Charcoal, sans-serif"; | 
					
						
							|  |  |  | 	case 2: | 
					
						
							|  |  |  | 		return "Georgia, serif"; | 
					
						
							|  |  |  | 	case 3: | 
					
						
							|  |  |  | 		return "Courier, monospace"; | 
					
						
							|  |  |  | 	case 4: | 
					
						
							|  |  |  | 		return "Verdana, Geneva, sans-serif"; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2015-08-11 22:50:27 +02:00
										 |  |  | } else if (property == "borderwidth") { | 
					
						
							|  |  |  | 	return object.border_width; | 
					
						
							| 
									
										
										
										
											2015-07-02 22:37:14 +02:00
										 |  |  | } else if (property == "font_size") { | 
					
						
							|  |  |  | 	return object.font_size / 9.0; | 
					
						
							|  |  |  | } else if (property == "line_spacing") { | 
					
						
							|  |  |  | 	return object.line_spacing; | 
					
						
							| 
									
										
										
										
											2015-07-13 11:19:03 +02:00
										 |  |  | } else if (property == "color1") { | 
					
						
							|  |  |  | 	return object.color_palette.color1.name(); | 
					
						
							|  |  |  | } else if (property == "color2") { | 
					
						
							|  |  |  | 	return object.color_palette.color2.name(); | 
					
						
							|  |  |  | } else if (property == "color3") { | 
					
						
							|  |  |  | 	return object.color_palette.color3.name(); | 
					
						
							|  |  |  | } else if (property == "color4") { | 
					
						
							|  |  |  | 	return object.color_palette.color4.name(); | 
					
						
							|  |  |  | } else if (property == "color5") { | 
					
						
							|  |  |  | 	return object.color_palette.color5.name(); | 
					
						
							| 
									
										
										
										
											2015-08-07 09:54:09 +02:00
										 |  |  | } else if (property == "color6") { | 
					
						
							|  |  |  | 	return object.color_palette.color6.name(); | 
					
						
							| 
									
										
										
										
											2015-07-02 22:37:14 +02:00
										 |  |  | } | 
					
						
							|  |  |  | GRANTLEE_END_LOOKUP | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-16 11:39:27 +02:00
										 |  |  | GRANTLEE_BEGIN_LOOKUP(print_options) | 
					
						
							|  |  |  | if (property == "grayscale") { | 
					
						
							|  |  |  | 	if (object.color_selected) { | 
					
						
							|  |  |  | 		return ""; | 
					
						
							|  |  |  | 	} else { | 
					
						
							|  |  |  | 		return "-webkit-filter: grayscale(100%)"; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | GRANTLEE_END_LOOKUP | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-21 19:00:46 +02:00
										 |  |  | GRANTLEE_BEGIN_LOOKUP(YearInfo) | 
					
						
							|  |  |  | if (property == "year") { | 
					
						
							|  |  |  | 	return object.year->period; | 
					
						
							|  |  |  | } else if (property == "dives") { | 
					
						
							|  |  |  | 	return object.year->selection_size; | 
					
						
							|  |  |  | } else if (property == "min_temp") { | 
					
						
							| 
									
										
										
										
											2018-02-18 21:55:57 +01:00
										 |  |  | 	return object.year->min_temp.mkelvin == 0 ? "0" : get_temperature_string(object.year->min_temp, true); | 
					
						
							| 
									
										
										
										
											2015-08-21 19:00:46 +02:00
										 |  |  | } else if (property == "max_temp") { | 
					
						
							| 
									
										
										
										
											2018-02-18 21:55:57 +01:00
										 |  |  | 	return object.year->max_temp.mkelvin == 0 ? "0" : get_temperature_string(object.year->max_temp, true); | 
					
						
							| 
									
										
										
										
											2015-08-21 19:00:46 +02:00
										 |  |  | } else if (property == "total_time") { | 
					
						
							| 
									
										
										
										
											2018-07-03 16:52:20 +02:00
										 |  |  | 	return get_dive_duration_string(object.year->total_time.seconds, gettextFromC::tr("h"), | 
					
						
							|  |  |  | 									gettextFromC::tr("min"), gettextFromC::tr("sec"), " "); | 
					
						
							| 
									
										
										
										
											2015-08-21 19:00:46 +02:00
										 |  |  | } else if (property == "avg_time") { | 
					
						
							|  |  |  | 	return get_minutes(object.year->total_time.seconds / object.year->selection_size); | 
					
						
							|  |  |  | } else if (property == "shortest_time") { | 
					
						
							|  |  |  | 	return get_minutes(object.year->shortest_time.seconds); | 
					
						
							|  |  |  | } else if (property == "longest_time") { | 
					
						
							|  |  |  | 	return get_minutes(object.year->longest_time.seconds); | 
					
						
							|  |  |  | } else if (property == "avg_depth") { | 
					
						
							|  |  |  | 	return get_depth_string(object.year->avg_depth); | 
					
						
							|  |  |  | } else if (property == "min_depth") { | 
					
						
							|  |  |  | 	return get_depth_string(object.year->min_depth); | 
					
						
							|  |  |  | } else if (property == "max_depth") { | 
					
						
							|  |  |  | 	return get_depth_string(object.year->max_depth); | 
					
						
							|  |  |  | } else if (property == "avg_sac") { | 
					
						
							|  |  |  | 	return get_volume_string(object.year->avg_sac); | 
					
						
							|  |  |  | } else if (property == "min_sac") { | 
					
						
							|  |  |  | 	return get_volume_string(object.year->min_sac); | 
					
						
							|  |  |  | } else if (property == "max_sac") { | 
					
						
							|  |  |  | 	return get_volume_string(object.year->max_sac); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | GRANTLEE_END_LOOKUP | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-08-12 18:26:42 +02:00
										 |  |  | // TODO: This is currently needed because our grantlee version
 | 
					
						
							|  |  |  | // doesn't support Q_GADGET based classes. A patch to fix this
 | 
					
						
							|  |  |  | // exists. Remove in due course.
 | 
					
						
							|  |  |  | GRANTLEE_BEGIN_LOOKUP(CylinderObjectHelper) | 
					
						
							|  |  |  | if (property == "description") { | 
					
						
							|  |  |  | 	return object.description; | 
					
						
							|  |  |  | } else if (property == "size") { | 
					
						
							|  |  |  | 	return object.size; | 
					
						
							|  |  |  | } else if (property == "workingPressure") { | 
					
						
							|  |  |  | 	return object.workingPressure; | 
					
						
							|  |  |  | } else if (property == "startPressure") { | 
					
						
							|  |  |  | 	return object.startPressure; | 
					
						
							|  |  |  | } else if (property == "endPressure") { | 
					
						
							|  |  |  | 	return object.endPressure; | 
					
						
							|  |  |  | } else if (property == "gasMix") { | 
					
						
							|  |  |  | 	return object.gasMix; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | GRANTLEE_END_LOOKUP | 
					
						
							| 
									
										
										
										
											2019-08-13 07:28:24 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | // TODO: This is currently needed because our grantlee version
 | 
					
						
							|  |  |  | // doesn't support Q_GADGET based classes. A patch to fix this
 | 
					
						
							|  |  |  | // exists. Remove in due course.
 | 
					
						
							| 
									
										
										
										
											2019-08-22 19:40:42 +02:00
										 |  |  | GRANTLEE_BEGIN_LOOKUP(DiveObjectHelperGrantlee) | 
					
						
							| 
									
										
										
										
											2019-08-13 07:28:24 +02:00
										 |  |  | if (property == "number") { | 
					
						
							| 
									
										
										
										
											2019-08-13 22:48:18 +02:00
										 |  |  | 	return object.number; | 
					
						
							| 
									
										
										
										
											2019-08-13 07:28:24 +02:00
										 |  |  | } else if (property == "id") { | 
					
						
							| 
									
										
										
										
											2019-08-13 22:48:18 +02:00
										 |  |  | 	return object.id; | 
					
						
							| 
									
										
										
										
											2019-08-13 07:28:24 +02:00
										 |  |  | } else if (property == "rating") { | 
					
						
							| 
									
										
										
										
											2019-08-13 22:48:18 +02:00
										 |  |  | 	return object.rating; | 
					
						
							| 
									
										
										
										
											2019-08-13 07:28:24 +02:00
										 |  |  | } else if (property == "visibility") { | 
					
						
							| 
									
										
										
										
											2019-08-13 22:48:18 +02:00
										 |  |  | 	return object.visibility; | 
					
						
							| 
									
										
										
										
											2019-08-13 07:28:24 +02:00
										 |  |  | } else if (property == "date") { | 
					
						
							|  |  |  | 	return object.date(); | 
					
						
							|  |  |  | } else if (property == "time") { | 
					
						
							|  |  |  | 	return object.time(); | 
					
						
							|  |  |  | } else if (property == "timestamp") { | 
					
						
							| 
									
										
										
										
											2019-08-13 22:48:18 +02:00
										 |  |  | 	return QVariant::fromValue(object.timestamp); | 
					
						
							| 
									
										
										
										
											2019-08-13 07:28:24 +02:00
										 |  |  | } else if (property == "location") { | 
					
						
							| 
									
										
										
										
											2019-08-13 22:48:18 +02:00
										 |  |  | 	return object.location; | 
					
						
							| 
									
										
										
										
											2019-08-13 07:28:24 +02:00
										 |  |  | } else if (property == "gps") { | 
					
						
							| 
									
										
										
										
											2019-08-13 22:48:18 +02:00
										 |  |  | 	return object.gps; | 
					
						
							| 
									
										
										
										
											2019-08-13 07:28:24 +02:00
										 |  |  | } else if (property == "gps_decimal") { | 
					
						
							| 
									
										
										
										
											2019-08-13 22:48:18 +02:00
										 |  |  | 	return object.gps_decimal; | 
					
						
							| 
									
										
										
										
											2019-08-13 07:28:24 +02:00
										 |  |  | } else if (property == "dive_site") { | 
					
						
							| 
									
										
										
										
											2019-08-13 22:48:18 +02:00
										 |  |  | 	return object.dive_site; | 
					
						
							| 
									
										
										
										
											2019-08-13 07:28:24 +02:00
										 |  |  | } else if (property == "duration") { | 
					
						
							| 
									
										
										
										
											2019-08-13 22:48:18 +02:00
										 |  |  | 	return object.duration; | 
					
						
							| 
									
										
										
										
											2019-08-13 07:28:24 +02:00
										 |  |  | } else if (property == "noDive") { | 
					
						
							| 
									
										
										
										
											2019-08-13 22:48:18 +02:00
										 |  |  | 	return object.noDive; | 
					
						
							| 
									
										
										
										
											2019-08-13 07:28:24 +02:00
										 |  |  | } else if (property == "depth") { | 
					
						
							| 
									
										
										
										
											2019-08-13 22:48:18 +02:00
										 |  |  | 	return object.depth; | 
					
						
							| 
									
										
										
										
											2019-08-13 07:28:24 +02:00
										 |  |  | } else if (property == "divemaster") { | 
					
						
							| 
									
										
										
										
											2019-08-13 22:48:18 +02:00
										 |  |  | 	return object.divemaster; | 
					
						
							| 
									
										
										
										
											2019-08-13 07:28:24 +02:00
										 |  |  | } else if (property == "buddy") { | 
					
						
							| 
									
										
										
										
											2019-08-13 22:48:18 +02:00
										 |  |  | 	return object.buddy; | 
					
						
							| 
									
										
										
										
											2019-08-13 07:28:24 +02:00
										 |  |  | } else if (property == "airTemp") { | 
					
						
							| 
									
										
										
										
											2019-08-13 22:48:18 +02:00
										 |  |  | 	return object.airTemp; | 
					
						
							| 
									
										
										
										
											2019-08-13 07:28:24 +02:00
										 |  |  | } else if (property == "waterTemp") { | 
					
						
							| 
									
										
										
										
											2019-08-13 22:48:18 +02:00
										 |  |  | 	return object.waterTemp; | 
					
						
							| 
									
										
										
										
											2019-08-13 07:28:24 +02:00
										 |  |  | } else if (property == "notes") { | 
					
						
							| 
									
										
										
										
											2019-08-13 22:48:18 +02:00
										 |  |  | 	return object.notes; | 
					
						
							| 
									
										
										
										
											2019-08-13 07:28:24 +02:00
										 |  |  | } else if (property == "tags") { | 
					
						
							| 
									
										
										
										
											2019-08-13 22:48:18 +02:00
										 |  |  | 	return object.tags; | 
					
						
							| 
									
										
										
										
											2019-08-13 07:28:24 +02:00
										 |  |  | } else if (property == "gas") { | 
					
						
							| 
									
										
										
										
											2019-08-13 22:48:18 +02:00
										 |  |  | 	return object.gas; | 
					
						
							| 
									
										
										
										
											2019-08-13 07:28:24 +02:00
										 |  |  | } else if (property == "sac") { | 
					
						
							| 
									
										
										
										
											2019-08-13 22:48:18 +02:00
										 |  |  | 	return object.sac; | 
					
						
							| 
									
										
										
										
											2019-08-13 07:28:24 +02:00
										 |  |  | } else if (property == "weightList") { | 
					
						
							| 
									
										
										
										
											2019-08-13 22:48:18 +02:00
										 |  |  | 	return object.weightList; | 
					
						
							| 
									
										
										
										
											2019-08-13 07:28:24 +02:00
										 |  |  | } else if (property == "weights") { | 
					
						
							| 
									
										
										
										
											2019-08-13 22:48:18 +02:00
										 |  |  | 	return object.weights; | 
					
						
							| 
									
										
										
										
											2019-08-13 07:28:24 +02:00
										 |  |  | } else if (property == "singleWeight") { | 
					
						
							| 
									
										
										
										
											2019-08-13 22:48:18 +02:00
										 |  |  | 	return object.singleWeight; | 
					
						
							| 
									
										
										
										
											2019-08-13 07:28:24 +02:00
										 |  |  | } else if (property == "suit") { | 
					
						
							| 
									
										
										
										
											2019-08-13 22:48:18 +02:00
										 |  |  | 	return object.suit; | 
					
						
							| 
									
										
										
										
											2019-08-13 07:28:24 +02:00
										 |  |  | } else if (property == "cylinderList") { | 
					
						
							|  |  |  | 	return object.cylinderList(); | 
					
						
							|  |  |  | } else if (property == "cylinders") { | 
					
						
							| 
									
										
										
										
											2019-08-13 22:48:18 +02:00
										 |  |  | 	return object.cylinders; | 
					
						
							| 
									
										
										
										
											2019-08-13 07:28:24 +02:00
										 |  |  | } else if (property == "cylinderObjects") { | 
					
						
							| 
									
										
										
										
											2019-08-13 22:48:18 +02:00
										 |  |  | 	return QVariant::fromValue(object.cylinderObjects); | 
					
						
							| 
									
										
										
										
											2019-08-13 07:28:24 +02:00
										 |  |  | } else if (property == "maxcns") { | 
					
						
							| 
									
										
										
										
											2019-08-13 22:48:18 +02:00
										 |  |  | 	return object.maxcns; | 
					
						
							| 
									
										
										
										
											2019-08-13 07:28:24 +02:00
										 |  |  | } else if (property == "otu") { | 
					
						
							| 
									
										
										
										
											2019-08-13 22:48:18 +02:00
										 |  |  | 	return object.otu; | 
					
						
							| 
									
										
										
										
											2019-08-13 07:28:24 +02:00
										 |  |  | } else if (property == "sumWeight") { | 
					
						
							| 
									
										
										
										
											2019-08-13 22:48:18 +02:00
										 |  |  | 	return object.sumWeight; | 
					
						
							| 
									
										
										
										
											2019-08-13 07:28:24 +02:00
										 |  |  | } else if (property == "getCylinder") { | 
					
						
							| 
									
										
										
										
											2019-08-13 22:48:18 +02:00
										 |  |  | 	return object.getCylinder; | 
					
						
							| 
									
										
										
										
											2019-08-13 07:28:24 +02:00
										 |  |  | } else if (property == "startPressure") { | 
					
						
							| 
									
										
										
										
											2019-08-13 22:48:18 +02:00
										 |  |  | 	return object.startPressure; | 
					
						
							| 
									
										
										
										
											2019-08-13 07:28:24 +02:00
										 |  |  | } else if (property == "endPressure") { | 
					
						
							| 
									
										
										
										
											2019-08-13 22:48:18 +02:00
										 |  |  | 	return object.endPressure; | 
					
						
							| 
									
										
										
										
											2019-08-13 07:28:24 +02:00
										 |  |  | } else if (property == "firstGas") { | 
					
						
							| 
									
										
										
										
											2019-08-13 22:48:18 +02:00
										 |  |  | 	return object.firstGas; | 
					
						
							| 
									
										
										
										
											2019-08-13 07:28:24 +02:00
										 |  |  | } | 
					
						
							|  |  |  | GRANTLEE_END_LOOKUP | 
					
						
							| 
									
										
										
										
											2015-04-21 17:23:13 +02:00
										 |  |  | #endif
 |