Files
qt5-legatus-legacy/Lts/Common/LtsScriptTimeline/track_entry_painters.cpp
2026-08-13 18:33:10 +02:00

329 lines
12 KiB
C++
Executable File

/**
* @RDE_HEADER@
* Topic painters
* $Id$
* $HeadURL$
* $Author$
*
* Created by Mike Wille, SLSE, 2017-06-30
*/
#include "track_entry_painters.h"
#include "track_entry.h"
#include <QObject>
#include <QDebug>
// color pallette from: https://www.w3schools.com/colors/colors_palettes.asp
namespace LtsScriptTimeline
{
QString translateTrackEntryType(const TrackEntryType &tet)
{
switch (tet)
{
case TrackEntryType::INVALID: return QObject::tr("<unknown>");
case TrackEntryType::SituationMap: return QObject::tr("Map"); // zu deutsch: "Karte"
case TrackEntryType::Situation: return QObject::tr("Situation");
case TrackEntryType::SituationReplay: return QObject::tr("Replay");
case TrackEntryType::Snapshot: return QObject::tr("Snapshot");
case TrackEntryType::Image: return QObject::tr("Image");
case TrackEntryType::Text: return QObject::tr("Text");
case TrackEntryType::Pdf: return QObject::tr("Pdf");
case TrackEntryType::Xml: return QObject::tr("Xml");
case TrackEntryType::MSOffice: return QObject::tr("MS Office");
case TrackEntryType::OpenOffice: return QObject::tr("Open Office");
case TrackEntryType::Audio: return QObject::tr("Audio");
case TrackEntryType::Video: return QObject::tr("Video");
case TrackEntryType::Building: return QObject::tr("Building");
case TrackEntryType::Evaluation: return QObject::tr("Evaluation");
case TrackEntryType::Report: return QObject::tr("Report");
// filters:
case TrackEntryType::TacticalPlan: return QObject::tr("Tactical Plan Map Filter");
case TrackEntryType::SituationMapFilter: return QObject::tr("Map Filter");
}
return QString();
}
QString trackEntryTypeName(const TrackEntryType &tet)
{
switch (tet)
{
case TrackEntryType::INVALID: return QStringLiteral("<unknown>");
case TrackEntryType::SituationMap: return QStringLiteral("SituationMap");
case TrackEntryType::Situation: return QStringLiteral("SituationReplayAndMap");
case TrackEntryType::SituationReplay: return QStringLiteral("SituationReplay");
case TrackEntryType::Image: return QStringLiteral("Image");
case TrackEntryType::Text: return QStringLiteral("Text");
case TrackEntryType::Pdf: return QStringLiteral("Pdf");
case TrackEntryType::Xml: return QStringLiteral("Xml");
case TrackEntryType::TacticalPlan: return QStringLiteral("TacticalPlan");
case TrackEntryType::MSOffice: return QStringLiteral("MSOffice");
case TrackEntryType::OpenOffice: return QStringLiteral("OpenOffice");
case TrackEntryType::Audio: return QStringLiteral("Audio");
case TrackEntryType::Video: return QStringLiteral("Video");
case TrackEntryType::Building: return QStringLiteral("Building");
case TrackEntryType::SituationMapFilter: return QStringLiteral("SituationMapFilter");
case TrackEntryType::Snapshot: return QStringLiteral("Snapshot");
case TrackEntryType::Evaluation: return QStringLiteral("Evaluation");
case TrackEntryType::Report: return QStringLiteral("Report");
}
return QString();
}
QIcon appToIcon(const TrackEntryType type)
{
switch (type)
{
case LtsScriptTimeline::TrackEntryType::INVALID:
return QIcon();
case LtsScriptTimeline::TrackEntryType::SituationMap:
return QIcon(QLatin1String("icon:add_situation.svg"));
case LtsScriptTimeline::TrackEntryType::Situation:
return QIcon(QLatin1String("icon:add_situation_combined.svg"));
case LtsScriptTimeline::TrackEntryType::SituationReplay:
return QIcon(QLatin1String("icon:add_restart.svg"));
case LtsScriptTimeline::TrackEntryType::Image:
return QIcon(QLatin1String("icon:create_image_topic.svg"));
case LtsScriptTimeline::TrackEntryType::Text:
return QIcon(QLatin1String("icon:document-new-txt.svg"));
case LtsScriptTimeline::TrackEntryType::Pdf:
return QIcon(QLatin1String("icon:create_pdf_topic.svg"));
case LtsScriptTimeline::TrackEntryType::Xml:
return QIcon(QLatin1String("icon:document-new-xml.svg"));
case LtsScriptTimeline::TrackEntryType::TacticalPlan:
return QIcon(QLatin1String("icon:tactical_organization.svg"));
case LtsScriptTimeline::TrackEntryType::MSOffice:
return QIcon(QLatin1String("icon:ms_office.svg"));
case LtsScriptTimeline::TrackEntryType::OpenOffice:
return QIcon(QLatin1String("icon:documents.svg"));
case LtsScriptTimeline::TrackEntryType::Audio:
return QIcon(QLatin1String("icon:create_lecture_topic.svg"));
case LtsScriptTimeline::TrackEntryType::Video:
return QIcon(QLatin1String("icon:add_video_menu.svg"));
case LtsScriptTimeline::TrackEntryType::Building:
return QIcon(QLatin1String("icon:configure_buildings.svg"));
case LtsScriptTimeline::TrackEntryType::SituationMapFilter:
return QIcon(QLatin1String("icon:filter_player.svg"));
case LtsScriptTimeline::TrackEntryType::Snapshot:
return QIcon(QLatin1String("icon:create_snapshot.svg"));
case LtsScriptTimeline::TrackEntryType::Evaluation:
return QIcon(QLatin1String("icon:add_evaluation_elements.svg"));
case LtsScriptTimeline::TrackEntryType::Report:
return QIcon(QLatin1String("icon:add_reports_display.svg"));
}
return QIcon();
}
// Main Functionalities
TrackEntryPainter *getTrackEntryPainter(const TrackEntryType &type)
{
TrackEntryPainter *trackEntryPainter = nullptr;
static TrackEntryPainter painter;
switch (type)
{
case TrackEntryType::SituationMap:
{
painter = TrackEntryPainter(QColor(QStringLiteral("#b1cbbb")), translateTrackEntryType(type));
trackEntryPainter = static_cast<TrackEntryPainter *>(&painter);
break;
}
case TrackEntryType::Situation:
{
painter = TrackEntryPainter(QColor(QStringLiteral("#b1c1cb")), translateTrackEntryType(type));
trackEntryPainter = static_cast<TrackEntryPainter *>(&painter);
break;
}
case TrackEntryType::SituationReplay:
{
painter = TrackEntryPainter(QColor(QStringLiteral("#c94c4c")), translateTrackEntryType(type));
trackEntryPainter = static_cast<TrackEntryPainter *>(&painter);
break;
}
case TrackEntryType::Audio:
{
painter = TrackEntryPainter(QColor(QStringLiteral("#034f84")), translateTrackEntryType(type));
trackEntryPainter = static_cast<TrackEntryPainter *>(&painter);
break;
}
case TrackEntryType::Video:
{
painter = TrackEntryPainter(QColor(QStringLiteral("#618685")), translateTrackEntryType(type));
trackEntryPainter = static_cast<TrackEntryPainter *>(&painter);
break;
}
case TrackEntryType::Image:
{
painter = TrackEntryPainter(QColor(QStringLiteral("#fefbd8")), translateTrackEntryType(type));
trackEntryPainter = static_cast<TrackEntryPainter *>(&painter);
break;
}
case TrackEntryType::Evaluation:
{
painter = TrackEntryPainter(QColor(QStringLiteral("#d6cbd3")), translateTrackEntryType(type));
trackEntryPainter = static_cast<TrackEntryPainter *>(&painter);
break;
}
case TrackEntryType::Pdf:
{
painter = TrackEntryPainter(QColor(QStringLiteral("#80ced6")), translateTrackEntryType(type));
trackEntryPainter = static_cast<TrackEntryPainter *>(&painter);
break;
}
case TrackEntryType::Text:
{
painter = TrackEntryPainter(QColor(QStringLiteral("#92a8d1")), translateTrackEntryType(type));
trackEntryPainter = static_cast<TrackEntryPainter *>(&painter);
break;
}
case TrackEntryType::Xml:
{
painter = TrackEntryPainter(QColor(QStringLiteral("#eea29a")), translateTrackEntryType(type));
trackEntryPainter = static_cast<TrackEntryPainter *>(&painter);
break;
}
case TrackEntryType::TacticalPlan:
{
painter = TrackEntryPainter(QColor(QStringLiteral("#dac292")), translateTrackEntryType(type));
trackEntryPainter = static_cast<TrackEntryPainter *>(&painter);
break;
}
case TrackEntryType::MSOffice:
{
painter = TrackEntryPainter(QColor(QStringLiteral("#f7cac9")), translateTrackEntryType(type));
trackEntryPainter = static_cast<TrackEntryPainter *>(&painter);
break;
}
case TrackEntryType::OpenOffice:
{
painter = TrackEntryPainter(QColor(QStringLiteral("#b2b2b2")), translateTrackEntryType(type));
trackEntryPainter = static_cast<TrackEntryPainter *>(&painter);
break;
}
case TrackEntryType::Building:
{
painter = TrackEntryPainter(QColor(QStringLiteral("#c6bcb6")), translateTrackEntryType(type));
trackEntryPainter = static_cast<TrackEntryPainter *>(&painter);
break;
}
case TrackEntryType::SituationMapFilter:
{
painter = TrackEntryPainter(QColor(QStringLiteral("#36486b")), translateTrackEntryType(type));
trackEntryPainter = static_cast<TrackEntryPainter *>(&painter);
break;
}
case TrackEntryType::Snapshot:
{
painter = TrackEntryPainter(QColor(QStringLiteral("#f18973")), translateTrackEntryType(type));
trackEntryPainter = static_cast<TrackEntryPainter *>(&painter);
break;
}
case TrackEntryType::Report:
{
painter = TrackEntryPainter(QColor(QStringLiteral("#feb236")), translateTrackEntryType(type));
trackEntryPainter = static_cast<TrackEntryPainter *>(&painter);
break;
}
default:
{
qWarning() << "no painter found for type" << (int)type;
trackEntryPainter = nullptr;
break;
}
}
return trackEntryPainter;
}
//#warning TODO: rect to size
void drawTrackEntry(TrackEntry *te, QPainter &painter, const QRect &trackRect, bool isSelected, bool isEnabled)
{
TrackEntryPainter *trackEntryPainter = getTrackEntryPainter(te->m_type);
if (!trackEntryPainter)
//#warning TODO: nullptr check + ausweichmanoever
return;
QColor trackEntryBgColor = trackEntryPainter->bgColor();
if (isSelected)
{
int r = trackEntryBgColor.red();
int g = trackEntryBgColor.green();
int b = trackEntryBgColor.blue();
trackEntryBgColor = trackEntryBgColor.lighter();
painter.setPen(QColor(255 - r, 255 - g, 255 - b));
}
else if (!isEnabled)
{
trackEntryBgColor = QColor(200, 200, 200);
painter.setPen(QColor("white"));
}
else
painter.setPen(QColor(36, 36, 36));
painter.setBrush(trackEntryBgColor);
painter.drawRect(trackRect); // draw frame
if (trackRect.width() < 20) // don't draw text if there is no space for it (otherwise there are some cut-up pixels nobody knows if this is a glitch or not, wouldn't look good) - and don't draw gradients!
return;
QRect trackEntryPainterRect(trackRect.adjusted(1, 1, -1, -1));
painter.save();
painter.setClipping(true);
painter.setClipRect(trackEntryPainterRect, Qt::ReplaceClip); // so that nobody draws over the frame
// is class trackentrypainter really required?
trackEntryPainter->paintEvent(painter, trackEntryPainterRect /* prevents overdrawing of the frame */);
painter.drawText(trackEntryPainterRect.adjusted(3, 16, 5000/* FIXME: hack */, 0), te->m_description);
painter.restore();
if (trackRect.width() < 12) // don't draw gradient if there is no space for it (otherwise it would leak into the script timeline and doesn't look good)
return;
// paint gradient from top-buttom-left to some pixels to the top-buttom-right to shadow-out text if there is too much text to fit in
int trackRectEnd = trackRect.right();
int gradientLength = 12;
QRect gradientRect(trackRectEnd - gradientLength, 2, gradientLength, trackRect.height() - 2);
QLinearGradient gradient(gradientRect.bottomRight(), gradientRect.bottomLeft()); // diagonal gradient from top-left to bottom-right
int r = trackEntryBgColor.red();
int g = trackEntryBgColor.green();
int b = trackEntryBgColor.blue();
gradient.setColorAt(0, QColor(r, g, b, 255));
gradient.setColorAt(1, QColor(r, g, b, 0));
painter.fillRect(gradientRect, gradient);
}
} // namespace LtsScriptTimeline