File indexing completed on 2024-05-12 09:58:05
0001 /* 0002 SPDX-FileCopyrightText: 2005 Dirk Eschler <deschler@users.sourceforge.net> 0003 SPDX-FileCopyrightText: 2005-2022 Krusader Krew <https://krusader.org> 0004 0005 SPDX-License-Identifier: GPL-2.0-or-later 0006 */ 0007 0008 #include "krresulttable.h" 0009 0010 #include <iostream> 0011 0012 // QtCore 0013 #include <QList> 0014 // QtGui 0015 #include <QFontDatabase> 0016 #include <QGuiApplication> 0017 // QtWidgets 0018 #include <QGridLayout> 0019 #include <QLabel> 0020 0021 #include <KI18n/KLocalizedString> 0022 #include <kio_version.h> 0023 0024 #include "../Archive/krarchandler.h" 0025 #include "../krservices.h" 0026 0027 using namespace std; 0028 0029 #define PS(x) (_supported.contains(x)) 0030 0031 KrResultTable::KrResultTable(QWidget *parent) 0032 : QWidget(parent) 0033 , _numRows(1) 0034 { 0035 } 0036 0037 KrResultTable::~KrResultTable() = default; 0038 0039 QGridLayout *KrResultTable::initTable() 0040 { 0041 _grid = new QGridLayout(this); 0042 _grid->setColumnStretch(_numColumns - 1, 1); // stretch last column 0043 _grid->setContentsMargins(0, 0, 0, 0); 0044 _grid->setSpacing(0); 0045 0046 // +++ Build and add table header +++ 0047 int column = 0; 0048 for (auto &_tableHeader : _tableHeaders) { 0049 _label = new QLabel(_tableHeader, this); 0050 _label->setContentsMargins(5, 5, 5, 5); 0051 _grid->addWidget(_label, 0, column); 0052 0053 // Set font 0054 QFont defFont = QFontDatabase::systemFont(QFontDatabase::GeneralFont); 0055 defFont.setPointSize(defFont.pointSize() - 1); 0056 defFont.setBold(true); 0057 _label->setFont(defFont); 0058 0059 ++column; 0060 } 0061 0062 return _grid; 0063 } 0064 0065 void KrResultTable::adjustRow(QGridLayout *grid) 0066 { 0067 int i = 0; 0068 QLayoutItem *child; 0069 int col = 0; 0070 0071 while ((child = grid->itemAt(i)) != nullptr) { 0072 // Add some space between columns 0073 child->widget()->setMinimumWidth(child->widget()->sizeHint().width() + 15); 0074 0075 // Paint uneven rows in alternate color 0076 if (((col / _numColumns) % 2)) { 0077 child->widget()->setAutoFillBackground(true); 0078 QPalette p = QGuiApplication::palette(); 0079 QPalette pal = child->widget()->palette(); 0080 pal.setColor(child->widget()->backgroundRole(), p.color(QPalette::Active, QPalette::AlternateBase)); 0081 child->widget()->setPalette(pal); 0082 } 0083 0084 ++i; 0085 ++col; 0086 } 0087 } 0088 0089 // ----------------------------------------------------------------------------- 0090 // ----------------------------------------------------------------------------- 0091 0092 KrArchiverResultTable::KrArchiverResultTable(QWidget *parent) 0093 : KrResultTable(parent) 0094 { 0095 _supported = KrArcHandler::supportedPackers(); // get list of available packers 0096 0097 Archiver *tar = new Archiver("tar", "https://www.gnu.org/", PS("tar"), true, true); 0098 Archiver *gzip = new Archiver("gzip", "https://www.gnu.org/", PS("gzip"), true, true); 0099 Archiver *bzip2 = new Archiver("bzip2", "https://www.gnu.org/", PS("bzip2"), true, true); 0100 Archiver *lzma = new Archiver("lzma", "https://tukaani.org/lzma/", PS("lzma"), true, true); 0101 Archiver *xz = new Archiver("xz", "https://tukaani.org/xz/", PS("xz"), true, true); 0102 Archiver *lha = new Archiver("lha", "https://www.gnu.org/", PS("lha"), true, true); 0103 Archiver *zip = new Archiver("zip", "http://www.info-zip.org", PS("zip"), true, false); 0104 Archiver *unzip = new Archiver("unzip", "http://www.info-zip.org", PS("unzip"), false, true); 0105 Archiver *arj = new Archiver("arj", "http://www.arjsoftware.com", PS("arj"), true, true); 0106 Archiver *unarj = new Archiver("unarj", "http://www.arjsoftware.com", PS("unarj"), false, true); 0107 Archiver *unace = new Archiver("unace", "https://web.archive.org/web/20170714193504/http://winace.com/", PS("unace"), false, true); 0108 Archiver *rar = new Archiver("rar", "https://www.rarlab.com/", PS("rar"), true, true); 0109 Archiver *unrar = new Archiver("unrar", "https://www.rarlab.com/", PS("unrar"), false, true); 0110 Archiver *rpm = new Archiver("rpm", "https://www.gnu.org/", PS("rpm"), false, true); 0111 Archiver *dpkg = new Archiver("dpkg", "https://www.dpkg.org/", PS("dpkg"), false, true); 0112 Archiver *_7z = new Archiver("7z", "https://www.7-zip.org/", PS("7z"), true, true); 0113 0114 // Special case: arj can unpack, but unarj is preferred 0115 if (PS("arj") && PS("unarj")) 0116 arj->setIsUnpacker(false); 0117 if (PS("arj") && !PS("unarj")) 0118 unarj->setNote(i18n("unarj not found, but arj found, which will be used for unpacking")); 0119 // Special case: rar can unpack, but unrar is preferred 0120 if (PS("rar") && PS("unrar")) 0121 rar->setIsUnpacker(false); 0122 // Special case: rpm needs cpio for unpacking 0123 if (PS("rpm") && !PS("cpio")) 0124 rpm->setNote(i18n("rpm found, but cpio not found which is required for unpacking")); 0125 0126 _tableHeaders.append(i18n("Name")); 0127 _tableHeaders.append(i18n("Found")); 0128 _tableHeaders.append(i18n("Packing")); 0129 _tableHeaders.append(i18n("Unpacking")); 0130 _tableHeaders.append(i18n("Note")); 0131 _numColumns = _tableHeaders.size(); 0132 0133 _grid = initTable(); 0134 0135 addRow(tar, _grid); 0136 addRow(gzip, _grid); 0137 addRow(bzip2, _grid); 0138 addRow(lzma, _grid); 0139 addRow(xz, _grid); 0140 addRow(lha, _grid); 0141 addRow(zip, _grid); 0142 addRow(unzip, _grid); 0143 addRow(arj, _grid); 0144 addRow(unarj, _grid); 0145 addRow(unace, _grid); 0146 addRow(rar, _grid); 0147 addRow(unrar, _grid); 0148 addRow(rpm, _grid); 0149 addRow(dpkg, _grid); 0150 addRow(_7z, _grid); 0151 0152 delete tar; 0153 delete gzip; 0154 delete bzip2; 0155 delete lzma; 0156 delete xz; 0157 delete lha; 0158 delete zip; 0159 delete unzip; 0160 delete arj; 0161 delete unarj; 0162 delete unace; 0163 delete rar; 0164 delete unrar; 0165 delete rpm; 0166 delete dpkg; 0167 delete _7z; 0168 } 0169 0170 KrArchiverResultTable::~KrArchiverResultTable() = default; 0171 0172 bool KrArchiverResultTable::addRow(SearchObject *search, QGridLayout *grid) 0173 { 0174 auto *arch = dynamic_cast<Archiver *>(search); 0175 0176 // Name column 0177 KUrlLabel *urlLabel = new KUrlLabel(arch->getWebsite(), arch->getSearchName(), this); 0178 urlLabel->setContentsMargins(5, 5, 5, 5); 0179 urlLabel->setAlignment(Qt::AlignTop); 0180 grid->addWidget(urlLabel, _numRows, 0); 0181 connect(urlLabel, QOverload<>::of(&KUrlLabel::leftClickedUrl), this, [this, urlLabel]() { 0182 KrArchiverResultTable::website(urlLabel->url()); 0183 }); 0184 _label = urlLabel; 0185 0186 // Found column 0187 _label = new QLabel(arch->getPath(), this); 0188 _label->setContentsMargins(5, 5, 5, 5); 0189 grid->addWidget(_label, _numRows, 1); 0190 0191 // Packing column 0192 _label = new QLabel(this); 0193 _label->setContentsMargins(5, 5, 5, 5); 0194 _label->setAlignment(Qt::AlignTop); 0195 if (arch->getIsPacker() && arch->getFound()) { 0196 _label->setText(i18n("enabled")); 0197 QPalette pal = _label->palette(); 0198 pal.setColor(_label->foregroundRole(), "darkgreen"); 0199 _label->setPalette(pal); 0200 } else if (arch->getIsPacker() && !arch->getFound()) { 0201 _label->setText(i18n("disabled")); 0202 QPalette pal = _label->palette(); 0203 pal.setColor(_label->foregroundRole(), "red"); 0204 _label->setPalette(pal); 0205 } else 0206 _label->setText(""); 0207 grid->addWidget(_label, _numRows, 2); 0208 0209 // Unpacking column 0210 _label = new QLabel(this); 0211 _label->setContentsMargins(5, 5, 5, 5); 0212 _label->setAlignment(Qt::AlignTop); 0213 if (arch->getIsUnpacker() && arch->getFound()) { 0214 _label->setText(i18n("enabled")); 0215 QPalette pal = _label->palette(); 0216 pal.setColor(_label->foregroundRole(), "darkgreen"); 0217 _label->setPalette(pal); 0218 } else if (arch->getIsUnpacker() && !arch->getFound()) { 0219 _label->setText(i18n("disabled")); 0220 QPalette pal = _label->palette(); 0221 pal.setColor(_label->foregroundRole(), "red"); 0222 _label->setPalette(pal); 0223 } else 0224 _label->setText(""); 0225 grid->addWidget(_label, _numRows, 3); 0226 0227 // Note column 0228 _label = new QLabel(arch->getNote(), this); 0229 _label->setContentsMargins(5, 5, 5, 5); 0230 _label->setAlignment(Qt::AlignTop); 0231 _label->setWordWrap(true); // wrap words 0232 grid->addWidget(_label, _numRows, 4); 0233 0234 // Apply shared design elements 0235 adjustRow(_grid); 0236 0237 // Ensure the last column takes more space 0238 _label->setMinimumWidth(300); 0239 0240 ++_numRows; 0241 return true; 0242 } 0243 0244 void KrArchiverResultTable::website(const QString &url) 0245 { 0246 (void)new KRun(QUrl(url), this); 0247 } 0248 0249 // ----------------------------------------------------------------------------- 0250 // ----------------------------------------------------------------------------- 0251 0252 KrToolResultTable::KrToolResultTable(QWidget *parent) 0253 : KrResultTable(parent) 0254 { 0255 _supported = KrServices::supportedTools(); // get list of available tools 0256 0257 QList<Application *> vecDiff, vecMail, vecRename, vecChecksum; 0258 Application *kdiff3 = new Application("kdiff3", "https://www.kde.org/applications/development/kdiff3/", KrServices::cmdExist("kdiff3")); 0259 Application *kompare = new Application("kompare", "https://www.kde.org/applications/development/kompare/", KrServices::cmdExist("kompare")); 0260 Application *xxdiff = new Application("xxdiff", "http://furius.ca/xxdiff/", KrServices::cmdExist("xxdiff")); 0261 Application *thunderbird = new Application("thunderbird", "https://www.thunderbird.net/", KrServices::cmdExist("thunderbird")); 0262 Application *kmail = new Application("kmail", "https://kontact.kde.org/components/kmail.html", KrServices::cmdExist("kmail")); 0263 Application *krename = new Application("krename", "https://www.kde.org/applications/utilities/krename/", KrServices::cmdExist("krename")); 0264 Application *md5sum = new Application("md5sum", "https://www.gnu.org/software/textutils/textutils.html", KrServices::cmdExist("md5sum")); 0265 0266 vecDiff.push_back(kdiff3); 0267 vecDiff.push_back(kompare); 0268 vecDiff.push_back(xxdiff); 0269 vecMail.push_back(thunderbird); 0270 vecMail.push_back(kmail); 0271 vecRename.push_back(krename); 0272 vecChecksum.push_back(md5sum); 0273 0274 ApplicationGroup *diff = new ApplicationGroup(i18n("diff utility"), PS("DIFF"), vecDiff); 0275 ApplicationGroup *mail = new ApplicationGroup(i18n("email client"), PS("MAIL"), vecMail); 0276 ApplicationGroup *rename = new ApplicationGroup(i18n("batch renamer"), PS("RENAME"), vecRename); 0277 ApplicationGroup *checksum = new ApplicationGroup(i18n("checksum utility"), PS("MD5"), vecChecksum); 0278 0279 _tableHeaders.append(i18n("Group")); 0280 _tableHeaders.append(i18n("Tool")); 0281 _tableHeaders.append(i18n("Found")); 0282 _tableHeaders.append(i18n("Status")); 0283 _numColumns = _tableHeaders.size(); 0284 0285 _grid = initTable(); 0286 0287 addRow(diff, _grid); 0288 addRow(mail, _grid); 0289 addRow(rename, _grid); 0290 addRow(checksum, _grid); 0291 0292 delete thunderbird; 0293 delete kmail; 0294 delete kompare; 0295 delete kdiff3; 0296 delete xxdiff; 0297 delete krename; 0298 delete md5sum; 0299 0300 delete diff; 0301 delete mail; 0302 delete rename; 0303 delete checksum; 0304 } 0305 0306 KrToolResultTable::~KrToolResultTable() = default; 0307 0308 bool KrToolResultTable::addRow(SearchObject *search, QGridLayout *grid) 0309 { 0310 auto *appGroup = dynamic_cast<ApplicationGroup *>(search); 0311 QList<Application *> _apps = appGroup->getAppVec(); 0312 0313 // Name column 0314 _label = new QLabel(appGroup->getSearchName(), this); 0315 _label->setContentsMargins(5, 5, 5, 5); 0316 _label->setAlignment(Qt::AlignTop); 0317 grid->addWidget(_label, _numRows, 0); 0318 0319 // Tool column 0320 QWidget *toolBoxWidget = new QWidget(this); 0321 auto *toolBox = new QVBoxLayout(toolBoxWidget); 0322 0323 for (auto &_app : _apps) { 0324 auto *l = new KUrlLabel(_app->getWebsite(), _app->getAppName(), toolBoxWidget); 0325 toolBox->addWidget(l); 0326 0327 l->setAlignment(Qt::AlignLeft | Qt::AlignTop); 0328 l->setContentsMargins(5, 5, 5, 5); 0329 connect(l, QOverload<>::of(&KUrlLabel::leftClickedUrl), this, [this, l]() { 0330 KrToolResultTable::website(l->url()); 0331 }); 0332 } 0333 grid->addWidget(toolBoxWidget, _numRows, 1); 0334 0335 // Found column 0336 QWidget *vboxWidget = new QWidget(this); 0337 auto *vbox = new QVBoxLayout(vboxWidget); 0338 0339 for (auto &_app : _apps) { 0340 _label = new QLabel(_app->getPath(), vboxWidget); 0341 _label->setContentsMargins(5, 5, 5, 5); 0342 _label->setAlignment(Qt::AlignTop); 0343 vbox->addWidget(_label); 0344 } 0345 grid->addWidget(vboxWidget, _numRows, 2); 0346 0347 // Status column 0348 _label = new QLabel(this); 0349 _label->setContentsMargins(5, 5, 5, 5); 0350 _label->setAlignment(Qt::AlignTop); 0351 if (appGroup->getFoundGroup()) { 0352 _label->setText(i18n("enabled")); 0353 QPalette pal = _label->palette(); 0354 pal.setColor(_label->foregroundRole(), "darkgreen"); 0355 _label->setPalette(pal); 0356 } else { 0357 _label->setText(i18n("disabled")); 0358 QPalette pal = _label->palette(); 0359 pal.setColor(_label->foregroundRole(), "red"); 0360 _label->setPalette(pal); 0361 } 0362 grid->addWidget(_label, _numRows, 3); 0363 0364 // Apply shared design elements 0365 adjustRow(_grid); 0366 0367 // Ensure the last column takes more space 0368 _label->setMinimumWidth(300); 0369 0370 ++_numRows; 0371 return true; 0372 } 0373 0374 void KrToolResultTable::website(const QString &url) 0375 { 0376 (void)new KRun(QUrl(url), this); 0377 }