File indexing completed on 2024-05-19 05:17:47

0001 /*
0002     SPDX-FileCopyrightText: 2019 Volker Krause <vkrause@kde.org>
0003 
0004     SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 #include "uic9183ticketlayoutmodel.h"
0008 
0009 #include <KColorScheme>
0010 
0011 #include <QColor>
0012 #include <QDebug>
0013 #include <QGuiApplication>
0014 #include <QSize>
0015 
0016 enum {
0017     RCT2Width = 72,
0018     RCT2Height = 18
0019 };
0020 
0021 static const struct {
0022     const char layout[RCT2Width * RCT2Height + 1];
0023 } rct2Layouts [] = { {
0024 // basic RCT2
0025 "X             XXXX                                 X                   X"
0026 "X             XXXX                                 X                   X"
0027 "X   X    X  XXXXXX                                 X                   X"
0028 "X                                                  X                   X"
0029 "X     X     X                                      X     X     XXX     X"
0030 "X     X     X                                      X     X     XXX     X"
0031 "X     X     X                                      X     X     XXX     X"
0032 "X     X     X                                      X     X     XXX     X"
0033 "X                                                                      X"
0034 "X                                                                      X"
0035 "X                                                                      X"
0036 "X                                                                      X"
0037 "X                                                  XXXXXXXXXXXXXXXXXXXXX"
0038 "X                                                  X                   X"
0039 "X                                                  X                   X"
0040 "X              X              X                    X                   X"
0041 "XRRRRRRRRRRRX                 X                    X                   X"
0042 "X           X                 X     X        X     X                   X" }, {
0043 
0044 // RCT2 NRT
0045 "X             XXXX                                 X                   X"
0046 "X             XXXX                                 X                   X"
0047 "X   X    X  XXXXXX                                 X                   X"
0048 "X                                                  X                   X"
0049 "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
0050 "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
0051 "XGGGGGXGGGGGXGGGGGGGGGGGGGGGGGGGXXGGGGGGGGGGGGGGGGGXGGGGGXGGGGGXXXGGGGGX"
0052 "XGGGGGXGGGGGXGGGGGGGGGGGGGGGGGGGXXGGGGGGGGGGGGGGGGGXGGGGGXGGGGGXXXGGGGGX"
0053 "X                                                                      X"
0054 "X                                                                      X"
0055 "X                                                                      X"
0056 "X                                                                      X"
0057 "X  X                                               XXXXXXXXXXXXXXXXXXXXX"
0058 "X  X                                               X                   X"
0059 "X  X                                               X                   X"
0060 "X              X              X                    X                   X"
0061 "XRRRRRRRRRRRX                 X                    X                   X"
0062 "X           X                 X     X        X     X                   X" }, {
0063 
0064 // RCT2 IRT
0065 "X             XXXX                                 X                   X"
0066 "X             XXXX                                 X                   X"
0067 "X   X    X  XXXXXX                                 X                   X"
0068 "X                                                  X                   X"
0069 "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
0070 "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
0071 "XGGGGGXGGGGGXGGGGGGGGGGGGGGGGGGGXXGGGGGGGGGGGGGGGGGXGGGGGXGGGGGXXXGGGGGX"
0072 "XGGGGGXGGGGGXGGGGGGGGGGGGGGGGGGGXXGGGGGGGGGGGGGGGGGXGGGGGXGGGGGXXXGGGGGX"
0073 "X     XGGGGGXGGGX        XGGGXXX               XGGGX                   X"
0074 "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX                   X                   X"
0075 "X                              X                   X                   X"
0076 "X                              X                   X                   X"
0077 "X  X                                X              XXXXXXXXXXXXXXXXXXXXX"
0078 "X  X                                X    X    X    X                   X"
0079 "X  X                                X    X    X    X                   X"
0080 "X              X              X                    X                   X"
0081 "XRRRRRRRRRRRX                 X                    X                   X"
0082 "X           X                 X     X        X     X                   X" }, {
0083 
0084 // RCT2 RES
0085 "X             XXXX                                 X                   X"
0086 "X             XXXX                                 X                   X"
0087 "X   X    X  XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX                   X"
0088 "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX                   X"
0089 "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
0090 "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
0091 "XGGGGGXGGGGGXGGGGGGGGGGGGGGGGGGGXXGGGGGGGGGGGGGGGGGXGGGGGXGGGGGXXXGGGGGX"
0092 "XGGGGGXGGGGGXGGGGGGGGGGGGGGGGGGGXXGGGGGGGGGGGGGGGGGXGGGGGXGGGGGXXXGGGGGX"
0093 "X     XGGGGGXGGGX        XGGGXXX               XGGGX                   X"
0094 "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX                   X                   X"
0095 "X                              X                   X                   X"
0096 "X                              X                   X                   X"
0097 "X  X                                               XXXXXXXXXXXXXXXXXXXXX"
0098 "X  X                                               X                   X"
0099 "X                                                  X                   X"
0100 "X              X              X                    X                   X"
0101 "XRRRRRRRRRRRX                 X                    X                   X"
0102 "X           X                 X     X        X     X                   X" }, {
0103 
0104 // RCT2 RPT
0105 "X             XXXX                   X             X                   X"
0106 "X             XXXX                   X             X                   X"
0107 "X   X    X  XXXXXXXXXXXXXXXXXXXXXXXXXX             X                   X"
0108 "X                                    X             X                   X"
0109 "X     X     X                                      X     X     XXX     X"
0110 "X     X     X                                      X     X     XXX     X"
0111 "X     X     X                                      X     X     XXX     X"
0112 "X     X     X                                      X     X     XXX     X"
0113 "X                                                                      X"
0114 "X                                                                      X"
0115 "X                                                                      X"
0116 "X                                                                      X"
0117 "X                                                  XXXXXXXXXXXXXXXXXXXXX"
0118 "X                                                  X                   X"
0119 "X                                                  X                   X"
0120 "X              X              X                    X                    "
0121 "XRRRRRRRRRRRX                 X                    X                    "
0122 "X           X                 X     X        X     X                    "
0123 }};
0124 
0125 Uic9183TicketLayoutModel::Uic9183TicketLayoutModel(QObject *parent)
0126     : QAbstractTableModel(parent)
0127 {
0128 }
0129 
0130 Uic9183TicketLayoutModel::~Uic9183TicketLayoutModel() = default;
0131 
0132 void Uic9183TicketLayoutModel::setLayout(const KItinerary::Uic9183TicketLayout &layout)
0133 {
0134     beginResetModel();
0135     m_layout = layout;
0136     endResetModel();
0137 }
0138 
0139 QStringList Uic9183TicketLayoutModel::supportedTemplates()
0140 {
0141     return {QStringLiteral("RCT2"), QStringLiteral("RCT2 NRT"), QStringLiteral("RCT2 IRT"), QStringLiteral("RCT2 RES"), QStringLiteral("RCT2 RPT")};
0142 }
0143 
0144 void Uic9183TicketLayoutModel::setLayoutTemplate(int tplIndex)
0145 {
0146     beginResetModel();
0147     m_layoutTemplate = tplIndex;
0148     endResetModel();
0149 }
0150 
0151 int Uic9183TicketLayoutModel::columnCount(const QModelIndex &parent) const
0152 {
0153     Q_UNUSED(parent);
0154     if (m_layout.isValid() && m_layout.type() == QLatin1String("RCT2")) {
0155         return std::max<int>(RCT2Width, m_layout.size().width());
0156     }
0157     return m_layout.size().width();
0158 }
0159 
0160 int Uic9183TicketLayoutModel::rowCount(const QModelIndex &parent) const
0161 {
0162     if (parent.isValid()) {
0163         return 0;
0164     }
0165 
0166     if (m_layout.isValid() && m_layout.type() == QLatin1String("RCT2")) {
0167         return std::max<int>(RCT2Height, m_layout.size().height());
0168     }
0169     return m_layout.size().height();
0170 }
0171 
0172 QVariant Uic9183TicketLayoutModel::data(const QModelIndex& index, int role) const
0173 {
0174     if (!m_layout.isValid() || !index.isValid()) {
0175         return {};
0176     }
0177 
0178     if (role == Qt::DisplayRole) {
0179         return m_layout.text(index.row(), index.column(), 1, 1);
0180     }
0181     if (role == Qt::BackgroundRole && m_layoutTemplate >= 0 && index.row() < RCT2Height && index.column() < RCT2Width) {
0182         const auto c = rct2Layouts[m_layoutTemplate].layout[index.row() * RCT2Width + index.column()];
0183         switch (c) {
0184             case 'X': return QGuiApplication::palette().color(QPalette::AlternateBase);
0185             case 'R': return KColorScheme(QPalette::Active).background(KColorScheme::NegativeBackground);
0186             case 'G': return KColorScheme(QPalette::Active).background(KColorScheme::PositiveBackground);
0187         }
0188     }
0189 
0190     return {};
0191 }
0192 
0193 QVariant Uic9183TicketLayoutModel::headerData(int section, Qt::Orientation orientation, int role) const
0194 {
0195     if (orientation == Qt::Horizontal) {
0196         switch (role) {
0197             case Qt::DisplayRole:
0198                 return QString::number(section % 10);
0199             case Qt::ToolTipRole:
0200                 return QString::number(section);
0201         }
0202     }
0203     if (role == Qt::DisplayRole && orientation == Qt::Vertical) {
0204         return QString::number(section);
0205     }
0206 
0207     return QAbstractTableModel::headerData(section, orientation, role);
0208 }