File indexing completed on 2024-06-23 05:48:55

0001 /*
0002     This file is part of the Okteta Kasten module, made within the KDE community.
0003 
0004     SPDX-FileCopyrightText: 2008, 2023 Friedrich W. H. Kossebau <kossebau@kde.org>
0005 
0006     SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
0007 */
0008 
0009 #include "containedstringtablemodel.hpp"
0010 
0011 // KF
0012 #include <KLocalizedString>
0013 // Qt
0014 #include <QFontDatabase>
0015 #include <QMimeData>
0016 
0017 namespace Kasten {
0018 
0019 ContainedStringTableModel::ContainedStringTableModel(const QList<ContainedString>* containedStringList,
0020                                                      int offsetCoding,
0021                                                      QObject* parent)
0022     : QAbstractTableModel(parent)
0023     , mContainedStringList(containedStringList)
0024     , mFixedFont(QFontDatabase::systemFont(QFontDatabase::FixedFont))
0025 {
0026     mPrintFunction = Okteta::OffsetFormat::printFunction((Okteta::OffsetFormat::Format)offsetCoding);
0027 }
0028 
0029 ContainedStringTableModel::~ContainedStringTableModel() = default;
0030 
0031 void ContainedStringTableModel::setOffsetCoding(int offsetCoding)
0032 {
0033     mPrintFunction = Okteta::OffsetFormat::printFunction((Okteta::OffsetFormat::Format)offsetCoding);
0034     beginResetModel();
0035     endResetModel();
0036 }
0037 
0038 void ContainedStringTableModel::update()
0039 {
0040     beginResetModel();
0041     endResetModel();
0042 }
0043 
0044 int ContainedStringTableModel::rowCount(const QModelIndex& parent) const
0045 {
0046     return (!parent.isValid()) ? mContainedStringList->size() : 0;
0047 }
0048 
0049 int ContainedStringTableModel::columnCount(const QModelIndex& parent) const
0050 {
0051     return (!parent.isValid()) ? NoOfColumnIds : 0;
0052 }
0053 
0054 QVariant ContainedStringTableModel::data(const QModelIndex& index, int role) const
0055 {
0056     QVariant result;
0057     if (role == Qt::DisplayRole
0058         || role == Qt::ToolTipRole) {
0059         const int stringIndex = index.row();
0060 
0061         if (0 <= stringIndex && stringIndex < mContainedStringList->size()) {
0062             const ContainedString& string = mContainedStringList->at(stringIndex);
0063 
0064             const int column = index.column();
0065             switch (column)
0066             {
0067             case OffsetColumnId:
0068             {
0069                 if (role == Qt::DisplayRole) {
0070                     mPrintFunction(mCodedOffset, string.offset());
0071 
0072                     result = QString::fromLatin1(mCodedOffset);
0073                 }
0074                 break;
0075             }
0076             case StringColumnId:
0077             {
0078                 result = string.string();
0079                 break;
0080             }
0081             default:
0082                 ;
0083             }
0084         }
0085     } else if (role == Qt::FontRole) {
0086         result = mFixedFont;
0087     }
0088 
0089     return result;
0090 }
0091 
0092 QVariant ContainedStringTableModel::headerData(int section, Qt::Orientation orientation, int role) const
0093 {
0094     QVariant result;
0095 
0096     if (role == Qt::DisplayRole) {
0097         const QString titel =
0098             section == OffsetColumnId ? i18nc("@title:column offset of the extracted string",       "Offset") :
0099             section == StringColumnId ? i18nc("@title:column string extracted from the byte array", "String") :
0100                                         QString();
0101         result = titel;
0102     } else {
0103         result = QAbstractTableModel::headerData(section, orientation, role);
0104     }
0105 
0106     return result;
0107 }
0108 
0109 Qt::ItemFlags ContainedStringTableModel::flags(const QModelIndex& index) const
0110 {
0111     return QAbstractTableModel::flags(index) | Qt::ItemIsDragEnabled;
0112 }
0113 
0114 static QString stringColumnAsText(const QModelIndexList& indexes)
0115 {
0116     QString strings;
0117 
0118     // assumes indexes are in row-wise order as seen on screen
0119     // add tab between items in row, but for last linefeed
0120     int lastRow = -1;
0121     for (const QModelIndex& index : indexes) {
0122         const int row = index.row();
0123         if (row == lastRow) {
0124             continue;
0125         }
0126         lastRow = row;
0127         const QModelIndex stringIndex = index.siblingAtColumn(ContainedStringTableModel::StringColumnId);
0128         strings.append(stringIndex.data(Qt::DisplayRole).toString());
0129         strings.append(QLatin1Char('\n')); // TODO: specific linefeed for platforms
0130     }
0131 
0132     return strings;
0133 }
0134 
0135 QMimeData* ContainedStringTableModel::mimeData(const QModelIndexList& indexes) const
0136 {
0137     if (indexes.isEmpty()) {
0138         return nullptr;
0139     }
0140 
0141     auto* mimeData = new QMimeData;
0142 
0143     const QString text = stringColumnAsText(indexes);
0144     mimeData->setText(text);
0145 
0146     return mimeData;
0147 }
0148 
0149 QStringList ContainedStringTableModel::mimeTypes() const
0150 {
0151     return {
0152         QStringLiteral("text/plain"),
0153     };
0154 }
0155 
0156 }
0157 
0158 #include "moc_containedstringtablemodel.cpp"