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"