File indexing completed on 2024-05-12 17:22:03

0001 /*
0002     SPDX-FileCopyrightText: 2000-2002 Shie Erlich <erlich@users.sourceforge.net>
0003     SPDX-FileCopyrightText: 2000-2002 Rafi Yanai <yanai@users.sourceforge.net>
0004     SPDX-FileCopyrightText: 2004-2022 Krusader Krew <https://krusader.org>
0005 
0006     SPDX-License-Identifier: GPL-2.0-or-later
0007 */
0008 
0009 #include "krviewitem.h"
0010 
0011 #include "../FileSystem/fileitem.h"
0012 #include "../FileSystem/krpermhandler.h"
0013 #include "krinterview.h"
0014 #include "listmodel.h"
0015 
0016 // QtCore
0017 #include <QLocale>
0018 #include <QMimeDatabase>
0019 #include <QMimeType>
0020 // QtGui
0021 #include <QPixmap>
0022 
0023 #include <KI18n/KLocalizedString>
0024 
0025 KrViewItem::KrViewItem(FileItem *fileitem, KrInterView *parentView)
0026     : _fileitem(fileitem)
0027     , _view(parentView)
0028     , _viewProperties(parentView->properties())
0029     , _hasExtension(false)
0030     , _hidden(false)
0031     , _extension("")
0032 {
0033     dummyFileItem = parentView->_model->dummyFileItem() == fileitem;
0034 
0035     if (fileitem) {
0036         // check if the file has an extension
0037         const QString &fileitemName = fileitem->getName();
0038         int loc = fileitemName.lastIndexOf('.');
0039         if (loc > 0) { // avoid mishandling of .bashrc and friend
0040             // check if it has one of the predefined 'atomic extensions'
0041             for (const auto &atomicExtension : _viewProperties->atomicExtensions) {
0042                 if (fileitemName.endsWith(atomicExtension)) {
0043                     loc = fileitemName.length() - atomicExtension.length();
0044                     break;
0045                 }
0046             }
0047             _name = fileitemName.left(loc);
0048             _extension = fileitemName.mid(loc + 1);
0049             _hasExtension = true;
0050         }
0051 
0052         if (fileitemName.startsWith('.'))
0053             _hidden = true;
0054     }
0055 }
0056 
0057 const QString &KrViewItem::name(bool withExtension) const
0058 {
0059     if (!withExtension && _hasExtension)
0060         return _name;
0061     else
0062         return _fileitem->getName();
0063 }
0064 
0065 QString KrViewItem::description() const
0066 {
0067     if (dummyFileItem)
0068         return i18n("Climb up the folder tree");
0069 
0070     // else is implied
0071 
0072     QString mimeTypeComment;
0073     QMimeType mt = QMimeDatabase().mimeTypeForName(_fileitem->getMime());
0074     if (mt.isValid())
0075         mimeTypeComment = mt.comment();
0076 
0077     QString text = _fileitem->getName();
0078     if (_fileitem->isSymLink()) {
0079         text += " -> " + _fileitem->getSymDest() + "  ";
0080         if (_fileitem->isBrokenLink())
0081             text += i18n("(Broken Link)");
0082         else if (mimeTypeComment.isEmpty())
0083             text += i18n("Symbolic Link");
0084         else
0085             text += i18n("%1 (Link)", mimeTypeComment);
0086 
0087     } else {
0088         if (_fileitem->isDir())
0089             text += '/';
0090 
0091         if (_fileitem->getUISize() != (KIO::filesize_t)-1) {
0092             const QString size = KrView::sizeText(_viewProperties, _fileitem->getUISize());
0093             text += QString("  (%1)").arg(size);
0094         }
0095 
0096         text += "  " + mimeTypeComment;
0097     }
0098     return text;
0099 }
0100 
0101 QPixmap KrViewItem::icon()
0102 {
0103     if (dummyFileItem || !_viewProperties->displayIcons)
0104         return QPixmap();
0105     else
0106         return KrView::getIcon(_fileitem, true);
0107 }
0108 
0109 bool KrViewItem::isSelected() const
0110 {
0111     return _view->isSelected(_fileitem);
0112 }
0113 
0114 void KrViewItem::setSelected(bool s)
0115 {
0116     _view->setSelected(_fileitem, s);
0117     if (!_view->op()->isMassSelectionUpdate()) {
0118         redraw();
0119         _view->op()->emitSelectionChanged();
0120     }
0121 }
0122 
0123 QRect KrViewItem::itemRect() const
0124 {
0125     return _view->itemRect(_fileitem);
0126 }
0127 
0128 void KrViewItem::redraw()
0129 {
0130     _view->_itemView->viewport()->update(itemRect());
0131 }
0132 
0133 void KrViewItem::setSize(KIO::filesize_t size)
0134 {
0135     _fileitem->setSize(size);
0136 }