KFile
kfileplacesitem.cpp
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include "kfileplacesitem_p.h"
00021 #include "kfileplacesmodel.h"
00022
00023 #include <QtCore/QDateTime>
00024
00025 #include <kbookmarkmanager.h>
00026 #include <kiconloader.h>
00027 #include <kdirlister.h>
00028 #include <solid/storageaccess.h>
00029 #include <solid/storagevolume.h>
00030
00031
00032 KFilePlacesItem::KFilePlacesItem(KBookmarkManager *manager,
00033 const QString &address,
00034 const QString &udi)
00035 : m_manager(manager), m_lister(0), m_folderIsEmpty(true)
00036 {
00037 m_bookmark = m_manager->findByAddress(address);
00038
00039 if (udi.isEmpty() && m_bookmark.metaDataItem("ID").isEmpty()) {
00040 m_bookmark.setMetaDataItem("ID", generateNewId());
00041 } else if (udi.isEmpty()) {
00042 if (hasFullIcon(m_bookmark)) {
00043
00044 m_lister = new KDirLister(this);
00045 m_lister->setAutoErrorHandlingEnabled(false, 0);
00046 m_lister->setDelayedMimeTypes(true);
00047 connect(m_lister, SIGNAL(completed()),
00048 this, SLOT(onListerCompleted()));
00049 m_lister->openUrl(m_bookmark.url());
00050 }
00051 } else if (!udi.isEmpty()) {
00052 Solid::Device dev(udi);
00053 connect(dev.as<Solid::StorageAccess>(), SIGNAL(accessibilityChanged(bool, const QString &)),
00054 this, SLOT(onAccessibilityChanged()));
00055 }
00056 }
00057
00058 KFilePlacesItem::~KFilePlacesItem()
00059 {
00060 }
00061
00062 QString KFilePlacesItem::id() const
00063 {
00064 if (isDevice()) {
00065 return bookmark().metaDataItem("UDI");
00066 } else {
00067 return bookmark().metaDataItem("ID");
00068 }
00069 }
00070
00071 bool KFilePlacesItem::isDevice() const
00072 {
00073 return !bookmark().metaDataItem("UDI").isEmpty();
00074 }
00075
00076 KBookmark KFilePlacesItem::bookmark() const
00077 {
00078 return m_bookmark;
00079 }
00080
00081 void KFilePlacesItem::setBookmark(const KBookmark &bookmark)
00082 {
00083 m_bookmark = bookmark;
00084 }
00085
00086 Solid::Device KFilePlacesItem::device() const
00087 {
00088 return Solid::Device(bookmark().metaDataItem("UDI"));
00089 }
00090
00091 QVariant KFilePlacesItem::data(int role) const
00092 {
00093 QVariant returnData;
00094
00095 if (role!=KFilePlacesModel::HiddenRole && role!=Qt::BackgroundRole && isDevice()) {
00096 returnData = deviceData(role);
00097 } else {
00098 returnData = bookmarkData(role);
00099 }
00100
00101 return returnData;
00102 }
00103
00104 QVariant KFilePlacesItem::bookmarkData(int role) const
00105 {
00106 KBookmark b = bookmark();
00107
00108 if (b.isNull()) return QVariant();
00109
00110 switch (role)
00111 {
00112 case Qt::DisplayRole:
00113 return b.text();
00114 case Qt::DecorationRole:
00115 return KIcon(iconNameForBookmark(b));
00116 case Qt::BackgroundRole:
00117 if (b.metaDataItem("IsHidden")=="true") {
00118 return Qt::lightGray;
00119 } else {
00120 return QVariant();
00121 }
00122 case KFilePlacesModel::UrlRole:
00123 return QUrl(b.url());
00124 case KFilePlacesModel::SetupNeededRole:
00125 return false;
00126 case KFilePlacesModel::HiddenRole:
00127 return b.metaDataItem("IsHidden")=="true";
00128 default:
00129 return QVariant();
00130 }
00131 }
00132
00133 QVariant KFilePlacesItem::deviceData(int role) const
00134 {
00135 Solid::Device d = device();
00136
00137 if (d.isValid()) {
00138 const Solid::StorageAccess *access = d.as<Solid::StorageAccess>();
00139 const Solid::StorageVolume *volume = d.as<Solid::StorageVolume>();
00140 QStringList overlays;
00141
00142 switch (role)
00143 {
00144 case Qt::DisplayRole:
00145 return d.product();
00146 case Qt::DecorationRole:
00147 if (access->isAccessible()) {
00148 overlays << "emblem-mounted";
00149 } else {
00150 overlays << QString();
00151 }
00152 if (volume && volume->usage()==Solid::StorageVolume::Encrypted) {
00153 overlays << "security-high";
00154 }
00155 return KIcon(d.icon(), 0, overlays);
00156 case KFilePlacesModel::UrlRole:
00157 if (access) {
00158 return QUrl(KUrl(access->filePath()));
00159 } else {
00160 return QVariant();
00161 }
00162 case KFilePlacesModel::SetupNeededRole:
00163 if (access) {
00164 return !access->isAccessible();
00165 } else {
00166 return QVariant();
00167 }
00168 default:
00169 return QVariant();
00170 }
00171 } else {
00172 return QVariant();
00173 }
00174 }
00175
00176 KBookmark KFilePlacesItem::createBookmark(KBookmarkManager *manager,
00177 const QString &label,
00178 const KUrl &url,
00179 const QString &iconName)
00180 {
00181 KBookmarkGroup root = manager->root();
00182 if (root.isNull())
00183 return KBookmark();
00184 QString empty_icon = iconName;
00185 if (url==KUrl("trash:/")) {
00186 if (empty_icon.endsWith("-full")) {
00187 empty_icon.chop(5);
00188 } else if (empty_icon.isEmpty()) {
00189 empty_icon = "user-trash";
00190 }
00191 }
00192 KBookmark bookmark = root.addBookmark(label, url, empty_icon);
00193 bookmark.setMetaDataItem("ID", generateNewId());
00194
00195 return bookmark;
00196 }
00197
00198 KBookmark KFilePlacesItem::createSystemBookmark(KBookmarkManager *manager,
00199 const QString &label,
00200 const KUrl &url,
00201 const QString &iconName)
00202 {
00203 KBookmark bookmark = createBookmark(manager, label, url, iconName);
00204 if (!bookmark.isNull())
00205 bookmark.setMetaDataItem("isSystemItem", "true");
00206 return bookmark;
00207 }
00208
00209
00210 KBookmark KFilePlacesItem::createDeviceBookmark(KBookmarkManager *manager,
00211 const QString &udi)
00212 {
00213 KBookmarkGroup root = manager->root();
00214 if (root.isNull())
00215 return KBookmark();
00216 KBookmark bookmark = root.createNewSeparator();
00217 bookmark.setMetaDataItem("UDI", udi);
00218 bookmark.setMetaDataItem("isSystemItem", "true");
00219 return bookmark;
00220 }
00221
00222 QString KFilePlacesItem::generateNewId()
00223 {
00224 static int count = 0;
00225
00226
00227
00228 return QString::number(QDateTime::currentDateTime().toTime_t())
00229 + '/' + QString::number(count++);
00230
00231
00232
00233
00234 }
00235
00236 void KFilePlacesItem::onAccessibilityChanged()
00237 {
00238 emit itemChanged(id());
00239 }
00240
00241 bool KFilePlacesItem::hasFullIcon(const KBookmark &bookmark) const
00242 {
00243 return bookmark.url()==KUrl("trash:/");
00244 }
00245
00246 QString KFilePlacesItem::iconNameForBookmark(const KBookmark &bookmark) const
00247 {
00248 if (!m_folderIsEmpty && hasFullIcon(bookmark)) {
00249 return bookmark.icon()+"-full";
00250 } else {
00251 return bookmark.icon();
00252 }
00253 }
00254
00255 void KFilePlacesItem::onListerCompleted()
00256 {
00257 m_folderIsEmpty = m_lister->items().isEmpty();
00258 emit itemChanged(id());
00259 }
00260
00261 #include "kfileplacesitem_p.moc"