OSDN Git Service

Ver0.26
[gefu/Gefu.git] / foldermodel.cpp
1 #include "global.h"\r
2 #include "preferences.h"\r
3 #include "thumbnailworker.h"\r
4 #include "win32.h"\r
5 #include "foldermodel.h"\r
6 \r
7 #include <QApplication>\r
8 #include <QDateTime>\r
9 #include <QDebug>\r
10 #include <QPalette>\r
11 #include <QThread>\r
12 \r
13 FolderModel* FolderModel::m_activeModel = NULL;\r
14 \r
15 ///////////////////////////////////////////////////////////////////////////////\r
16 /// \brief FolderModel::FolderModel\r
17 /// \param parent   親オブジェクト\r
18 ///\r
19 /// コンストラクタ\r
20 ///\r
21 FolderModel::FolderModel(QObject *parent) :\r
22     QAbstractTableModel(parent),\r
23     m_dir(),\r
24     m_fileInfoList(),\r
25     m_checkStates(),\r
26     m_IconProvider(),\r
27     m_fsWatcher(this),\r
28     m_history(),\r
29     m_historyPos(-1),\r
30     m_worker(),\r
31     m_pixmapCache(),\r
32     m_lastModifiedCache(),\r
33     m_pixmapCacheMutex(),\r
34     m_Palette(),\r
35     m_font()\r
36 {\r
37     // サムネイル生成用スレッドを初期化する\r
38     m_worker = new ThumbnailWorker();\r
39     connect(m_worker, SIGNAL(resultReady(QString,QPixmap)), this, SLOT(thumbnail_Ready(QString,QPixmap)));\r
40     m_worker->start();\r
41 \r
42     connect(&m_fsWatcher, SIGNAL(directoryChanged(QString)), this, SLOT(fsWatcher_directoryChanged(QString)));\r
43 }\r
44 \r
45 ///////////////////////////////////////////////////////////////////////////////\r
46 /// \brief FolderModel::~FolderModel\r
47 ///\r
48 /// デストラクタ\r
49 ///\r
50 FolderModel::~FolderModel()\r
51 {\r
52     m_worker->abort();\r
53 }\r
54 \r
55 ///////////////////////////////////////////////////////////////////////////////\r
56 /// \brief FolderModel::clearPixmapCache\r
57 ///\r
58 /// サムネイルキャッシュをクリアしたように見せかけます。\r
59 ///\r
60 void FolderModel::clearPixmapCache()\r
61 {\r
62     beginResetModel();\r
63     endResetModel();\r
64 }\r
65 \r
66 ///////////////////////////////////////////////////////////////////////////////\r
67 /// \brief FolderModel::fileIcon\r
68 /// \param index    アイテムのインデックス\r
69 /// \return アイコンを返します。\r
70 ///\r
71 QIcon FolderModel::fileIcon(const QModelIndex &index) const\r
72 {\r
73     if (fileName(index) == "..") {\r
74         return QIcon("://images/Up.png");\r
75     }\r
76     return m_IconProvider.icon(fileInfo(index));\r
77 }\r
78 \r
79 ///////////////////////////////////////////////////////////////////////////////\r
80 /// \brief FolderModel::isMarked\r
81 /// \param index    アイテムのインデックス\r
82 /// \return マークされていればtrueを返します。\r
83 ///\r
84 bool FolderModel::isMarked(const QModelIndex &index) const\r
85 {\r
86     CheckContainer::const_iterator it = m_checkStates.find(fileName(index));\r
87     if (it != m_checkStates.end()) {\r
88         return *it == Qt::Checked;\r
89     }\r
90     return false;\r
91 }\r
92 \r
93 ///////////////////////////////////////////////////////////////////////////////\r
94 /// \brief FolderModel::markedItems\r
95 /// \return マークされているアイテムのリストを返します。\r
96 ///\r
97 QFileInfoList FolderModel::markedItems() const\r
98 {\r
99     QFileInfoList list;\r
100     for (int n = 0; n < rowCount(); ++n) {\r
101         QModelIndex index = this->index(n, 0);\r
102         if (isMarked(index)) {\r
103             list << fileInfo(index);\r
104         }\r
105     }\r
106 \r
107     return list;\r
108 }\r
109 \r
110 ///////////////////////////////////////////////////////////////////////////////\r
111 /// \brief FolderModel::mkdir\r
112 /// \param name 作成するフォルダ名\r
113 /// \return 作成したフォルダのインデックス\r
114 ///\r
115 /// フォルダを作成します。\r
116 ///\r
117 QModelIndex FolderModel::mkdir(const QString &name)\r
118 {\r
119     qDebug() << "FolderModel::mkdir()" << name;\r
120 \r
121     if (!m_dir.mkdir(name)) {\r
122         return QModelIndex();\r
123     }\r
124 \r
125     refresh();\r
126 \r
127     for (int n = 0; n < rowCount(); ++n) {\r
128         if (m_fileInfoList[n].fileName() == name) {\r
129             return index(n, 0);\r
130         }\r
131     }\r
132 \r
133     return QModelIndex();\r
134 }\r
135 \r
136 ///////////////////////////////////////////////////////////////////////////////\r
137 /// \brief FolderModel::pixmap\r
138 /// \param index    アイテムのインデックス\r
139 /// \param size     要求サイズ\r
140 /// \return 画像またはアイコンを返します。\r
141 ///\r
142 QPixmap FolderModel::pixmap(const QModelIndex &index, const QSize &size) const\r
143 {\r
144     QPixmap pixmap;\r
145     const_cast<FolderModel*>(this)->m_pixmapCacheMutex.lock();\r
146     if (m_pixmapCache.find(filePath(index)) != m_pixmapCache.end()) {\r
147         pixmap = m_pixmapCache[filePath(index)];\r
148     }\r
149     const_cast<FolderModel*>(this)->m_pixmapCacheMutex.unlock();\r
150 \r
151     if (!pixmap.isNull()) {\r
152         double scaleX = 1.0 * size.width() / pixmap.width();\r
153         double scaleY = 1.0 * size.height() / pixmap.height();\r
154         double scaleFactor = qMin(scaleX, scaleY);\r
155         if (scaleFactor > 1) {\r
156             return pixmap;\r
157         }\r
158         return pixmap.scaled(pixmap.size() * scaleFactor,\r
159                              Qt::IgnoreAspectRatio,\r
160                              Qt::SmoothTransformation);\r
161     }\r
162 \r
163     // とりあえずアイコンを返す。\r
164     return fileIcon(index).pixmap(32, 32);\r
165 }\r
166 \r
167 ///////////////////////////////////////////////////////////////////////////////\r
168 /// \brief FolderModel::search\r
169 /// \param value    検索する文字列\r
170 /// \param start    開始位置\r
171 /// \param step     ステップ数\r
172 /// \return 見つかったアイテムのインデックスを返します。\r
173 ///\r
174 QModelIndex FolderModel::search(const QString &value, const QModelIndex &start, int step)\r
175 {\r
176     qDebug() << "FolderModel::search()" << value << start << step;\r
177 \r
178     const QString searchText = value.toLower();\r
179     for (int n = start.row() + step; 0 <= n && n < rowCount(); n += step) {\r
180         if (m_fileInfoList[n].fileName().toLower().indexOf(searchText) != -1) {\r
181             return index(n, 0);\r
182         }\r
183     }\r
184 \r
185     return QModelIndex();\r
186 }\r
187 \r
188 ///////////////////////////////////////////////////////////////////////////////\r
189 /// \brief FolderModel::setHistoryAt\r
190 /// \param path 設定するパス\r
191 ///\r
192 /// 指定したパスに履歴を移動します。\r
193 ///\r
194 void FolderModel::setHistoryAt(const QString &path)\r
195 {\r
196     qDebug() << "FolderModel::setHistoryAt()" << path;\r
197 \r
198     for (int n = 0; n < m_history.size(); ++n) {\r
199         if (m_history[n] == path) {\r
200             m_historyPos = n;\r
201             setRootPath(path, false);\r
202             return;\r
203         }\r
204     }\r
205 }\r
206 \r
207 ///////////////////////////////////////////////////////////////////////////////\r
208 /// \brief FolderModel::setRootPath\r
209 /// \param path         設定するパス\r
210 /// \param addHistory   履歴に追加する場合はtrue\r
211 ///\r
212 /// ルートパスを設定します。\r
213 ///\r
214 void FolderModel::setRootPath(const QString &path, bool addHistory)\r
215 {\r
216     qDebug() << "FolderModel::setRootPath()" << path;\r
217 \r
218     beginResetModel();\r
219     setError();\r
220 \r
221     try {\r
222         if (!QFileInfo::exists(path)) {\r
223             throw tr("フォルダが存在しないか、利用できません:%1").arg(path);\r
224         }\r
225 \r
226         QDir dir(path);\r
227         dir.setFilter(m_dir.filter());\r
228         dir.setNameFilters(m_dir.nameFilters());\r
229         dir.setSorting(m_dir.sorting());\r
230 \r
231         QFileInfoList list = dir.entryInfoList();\r
232         if (list.isEmpty()) {\r
233             throw tr("ファイルリストを取得できません:%1").arg(path);\r
234         }\r
235 \r
236         m_fileInfoList.clear();\r
237         if (m_dir.absolutePath() != dir.absolutePath()) {\r
238             m_fsWatcher.removePath(m_dir.absolutePath());\r
239             m_fsWatcher.addPath(dir.absolutePath());\r
240             m_checkStates.clear();\r
241             m_dir.setPath(dir.absolutePath());\r
242             if (addHistory) {\r
243                 m_history.resize(m_historyPos + 1);\r
244                 m_history << m_dir.absolutePath();\r
245                 m_historyPos = m_history.size() - 1;\r
246             }\r
247             m_worker->clearPath();\r
248             m_pixmapCacheMutex.lock();\r
249             m_pixmapCache.clear();\r
250             m_pixmapCacheMutex.unlock();\r
251             m_lastModifiedCache.clear();\r
252         }\r
253 \r
254         foreach (const QFileInfo &fi, list) {\r
255             if (fi.fileName() == "..") {\r
256                 if (!m_dir.isRoot()) {\r
257                     m_fileInfoList.push_front(fi);\r
258                 }\r
259                 continue;\r
260             }\r
261             else if (!(filter() & QDir::System) &&\r
262                      Win32::hasSystemAttribute(fi.absoluteFilePath()))\r
263             {\r
264                 continue;\r
265             }\r
266 \r
267             m_fileInfoList << fi;\r
268             if (m_checkStates.find(fi.fileName()) == m_checkStates.end()) {\r
269                 m_checkStates[fi.fileName()] = Qt::Unchecked;\r
270             }\r
271             if (m_lastModifiedCache.find(fi.fileName()) == m_lastModifiedCache.end() ||\r
272                 m_lastModifiedCache[fi.fileName()] != fi.lastModified())\r
273             {\r
274                 m_lastModifiedCache[fi.fileName()] = fi.lastModified();\r
275                 m_worker->addPath(fi.absoluteFilePath());\r
276             }\r
277         }\r
278     }\r
279     catch (const QString &s) {\r
280         setError(s);\r
281     }\r
282 \r
283     endResetModel();\r
284 }\r
285 \r
286 ///////////////////////////////////////////////////////////////////////////////\r
287 /// \brief FolderModel::touch\r
288 /// \param name 作成するファイル名\r
289 /// \return 作成したファイルのインデックス\r
290 ///\r
291 /// 空のファイルを作成します。\r
292 ///\r
293 QModelIndex FolderModel::touch(const QString &name)\r
294 {\r
295     QFile file(m_dir.absoluteFilePath(name));\r
296     if (!file.open(QIODevice::WriteOnly)) {\r
297         return QModelIndex();\r
298     }\r
299     file.close();\r
300 \r
301     refresh();\r
302 \r
303     for (int n = 0; n < rowCount(); ++n) {\r
304         if (m_fileInfoList[n].fileName() == name) {\r
305             return index(n, 0);\r
306         }\r
307     }\r
308 \r
309     return QModelIndex();\r
310 }\r
311 \r
312 ///////////////////////////////////////////////////////////////////////////////\r
313 /// \brief FolderModel::updateAppearance\r
314 ///\r
315 /// 外観を変更します。\r
316 ///\r
317 void FolderModel::updateAppearance(const Preferences &prefs)\r
318 {\r
319     qDebug() << "FolderModel::updateAppearance()";\r
320 \r
321     m_font = prefs.getFolderViewFont();\r
322     m_Palette.setColor(QPalette::Base, prefs.folderViewBgColor(isActive()));\r
323     m_Palette.setColor(QPalette::Text, prefs.folderViewFgColor(isActive()));\r
324     m_Palette.setColor(QPalette::Highlight, prefs.folderViewMarkedBgColor(isActive()));\r
325     m_Palette.setColor(QPalette::HighlightedText, prefs.folderViewMarkedFgColor(isActive()));\r
326     m_Palette.setColor(QPalette::Dark, prefs.folderViewHiddenColor(isActive()));\r
327     m_Palette.setColor(QPalette::Light, prefs.folderViewReadOnlyColor(isActive()));\r
328     m_Palette.setColor(QPalette::Mid, prefs.folderViewSystemColor(isActive()));\r
329 }\r
330 \r
331 ///////////////////////////////////////////////////////////////////////////////\r
332 /// \brief FolderModel::activeModel\r
333 /// \return アクティブなモデルを返します。\r
334 ///\r
335 FolderModel *FolderModel::activeModel()\r
336 {\r
337     return m_activeModel;\r
338 }\r
339 \r
340 ///////////////////////////////////////////////////////////////////////////////\r
341 /// \brief FolderModel::onCdHome\r
342 ///\r
343 /// ホームフォルダに移動します。\r
344 ///\r
345 void FolderModel::onCdHome()\r
346 {\r
347     setRootPath(QDir::homePath());\r
348 }\r
349 \r
350 ///////////////////////////////////////////////////////////////////////////////\r
351 /// \brief FolderModel::onCdRoot\r
352 ///\r
353 /// ルートフォルダに移動します。\r
354 ///\r
355 void FolderModel::onCdRoot()\r
356 {\r
357     setRootPath(QDir::rootPath());\r
358 }\r
359 \r
360 ///////////////////////////////////////////////////////////////////////////////\r
361 /// \brief FolderModel::onCdUp\r
362 ///\r
363 /// 親フォルダに移動します。\r
364 ///\r
365 void FolderModel::onCdUp()\r
366 {\r
367     if (!m_dir.isRoot()) {\r
368         QDir dir(m_dir);\r
369         dir.cdUp();\r
370         setRootPath(dir.absolutePath());\r
371     }\r
372 }\r
373 \r
374 ///////////////////////////////////////////////////////////////////////////////\r
375 /// \brief FolderModel::onHistoryBack\r
376 ///\r
377 /// 履歴を戻ります。\r
378 ///\r
379 void FolderModel::onHistoryBack()\r
380 {\r
381     if (m_historyPos > 0) {\r
382         setRootPath(m_history[--m_historyPos], false);\r
383     }\r
384 }\r
385 \r
386 ///////////////////////////////////////////////////////////////////////////////\r
387 /// \brief FolderModel::onHistoryForward\r
388 ///\r
389 /// 履歴を進みます。\r
390 ///\r
391 void FolderModel::onHistoryForward()\r
392 {\r
393     if (m_historyPos < m_history.size() - 1) {\r
394         setRootPath(m_history[++m_historyPos], false);\r
395     }\r
396 }\r
397 \r
398 ///////////////////////////////////////////////////////////////////////////////\r
399 /// \brief FolderModel::onMarkAll\r
400 ///\r
401 /// 全てのマークをONにします。\r
402 ///\r
403 void FolderModel::onMarkAll()\r
404 {\r
405     CheckContainer::iterator it;\r
406     for (it = m_checkStates.begin(); it != m_checkStates.end(); ++it) {\r
407         it.value() = Qt::Checked;\r
408     }\r
409     emit dataChanged(index(0, 0), index(rowCount(), columnCount()));\r
410 }\r
411 \r
412 ///////////////////////////////////////////////////////////////////////////////\r
413 /// \brief FolderModel::onMarkAllFiles\r
414 ///\r
415 /// 全てのフォルダをマークOFF、ファイルをマークONにします。\r
416 ///\r
417 void FolderModel::onMarkAllFiles()\r
418 {\r
419     foreach (const QFileInfo &fi, m_fileInfoList) {\r
420         if (fi.fileName() == "..") {\r
421             continue;\r
422         }\r
423         if (fi.isDir()) {\r
424             m_checkStates[fi.fileName()] = Qt::Unchecked;\r
425         }\r
426         else {\r
427             m_checkStates[fi.fileName()] = Qt::Checked;\r
428         }\r
429     }\r
430     emit dataChanged(index(0, 0), index(rowCount(), columnCount()));\r
431 }\r
432 \r
433 ///////////////////////////////////////////////////////////////////////////////\r
434 /// \brief FolderModel::onMarkAllOff\r
435 ///\r
436 /// 全てのマークをOFFにします。\r
437 ///\r
438 void FolderModel::onMarkAllOff()\r
439 {\r
440     CheckContainer::iterator it;\r
441     for (it = m_checkStates.begin(); it != m_checkStates.end(); ++it) {\r
442         it.value() = Qt::Unchecked;\r
443     }\r
444     emit dataChanged(index(0, 0), index(rowCount(), columnCount()));\r
445 }\r
446 \r
447 ///////////////////////////////////////////////////////////////////////////////\r
448 /// \brief FolderModel::onMarkInvert\r
449 ///\r
450 /// 全てのマークを反転します。\r
451 ///\r
452 void FolderModel::onMarkInvert()\r
453 {\r
454     CheckContainer::iterator it;\r
455     for (it = m_checkStates.begin(); it != m_checkStates.end(); ++it) {\r
456         it.value() = (it.value() == Qt::Checked) ? Qt::Unchecked : Qt::Checked;\r
457     }\r
458     emit dataChanged(index(0, 0), index(rowCount(), columnCount()));\r
459 }\r
460 \r
461 ///////////////////////////////////////////////////////////////////////////////\r
462 /// \brief FolderModel::thumbnail_Ready\r
463 /// \param path     ファイルパス\r
464 /// \param pixmap   サムネイル画像\r
465 ///\r
466 /// サムネイルの生成終了時の処理を行います。\r
467 ///\r
468 void FolderModel::thumbnail_Ready(const QString &path, const QPixmap &pixmap)\r
469 {\r
470     qDebug() << "FolderModel::thumbnail_Ready()" << path;\r
471     QFileInfo fi(path);\r
472     if (fi.absolutePath() == m_dir.absolutePath()) {\r
473         m_pixmapCacheMutex.lock();\r
474         m_pixmapCache[path] = pixmap;\r
475         m_pixmapCacheMutex.unlock();\r
476 \r
477         QModelIndex index = search(fi.fileName());\r
478         if (index.isValid()) {\r
479             emit dataChanged(index, index);\r
480         }\r
481     }\r
482 }\r
483 \r
484 ///////////////////////////////////////////////////////////////////////////////\r
485 /// \brief FolderModel::rowCount\r
486 /// \param parent   (使用しません)\r
487 /// \return 行数を返します。\r
488 ///\r
489 int FolderModel::rowCount(const QModelIndex &parent) const\r
490 {\r
491     Q_UNUSED(parent);\r
492     return m_fileInfoList.size();\r
493 }\r
494 \r
495 ///////////////////////////////////////////////////////////////////////////////\r
496 /// \brief FolderModel::columnCount\r
497 /// \param parent   (使用しません)\r
498 /// \return 列数を返します。\r
499 ///\r
500 int FolderModel::columnCount(const QModelIndex &parent) const\r
501 {\r
502     Q_UNUSED(parent);\r
503     return ColumnCount;\r
504 }\r
505 \r
506 ///////////////////////////////////////////////////////////////////////////////\r
507 /// \brief FolderModel::data\r
508 /// \param index    インデックス\r
509 /// \param role     ロール\r
510 /// \return 該当のデータを返します。\r
511 ///\r
512 QVariant FolderModel::data(const QModelIndex &index, int role) const\r
513 {\r
514     if (!index.isValid()) {\r
515         return QVariant();\r
516     }\r
517 \r
518     switch (role) {\r
519     case Qt::DisplayRole:\r
520         switch (index.column()) {\r
521         case Name:\r
522             if (isDir(index) || isDotFile(index)) {\r
523                 return fileName(index);\r
524             }\r
525             return fileInfo(index).completeBaseName();\r
526 \r
527         case Extension:\r
528             if (isDir(index) || isDotFile(index)) {\r
529                 return QVariant();\r
530             }\r
531             return fileInfo(index).suffix();\r
532 \r
533         case Size: // サイズ\r
534             if (isDir(index)) {\r
535                 return QString("<DIR>");\r
536             }\r
537             return fileSizeToString(fileInfo(index).size());\r
538 \r
539         case LastModified: // 更新日時\r
540             return fileInfo(index).lastModified().toString("yy/MM/dd hh:mm");\r
541         }\r
542         break;\r
543 \r
544     case Qt::DecorationRole:\r
545         if (index.column() == Name) {\r
546             return fileIcon(index);\r
547         }\r
548         break;\r
549 \r
550     case Qt::FontRole:\r
551         return m_font;\r
552 \r
553     case Qt::TextAlignmentRole:\r
554         switch (index.column()) {\r
555         case Size:\r
556         case LastModified:\r
557             return Qt::AlignRight + Qt::AlignVCenter;\r
558         }\r
559         return Qt::AlignLeft + Qt::AlignVCenter;\r
560 \r
561     case Qt::BackgroundRole:\r
562         if (isMarked(index)) {\r
563             return marked();\r
564         }\r
565         return base();\r
566 \r
567     case Qt::ForegroundRole:\r
568         if (isMarked(index)) {\r
569             return markedText();\r
570         }\r
571         if (fileName(index) != ".." && Win32::hasSystemAttribute(filePath(index))) {\r
572             return system();\r
573         }\r
574         if (fileName(index) != ".." && fileInfo(index).isHidden()) {\r
575             return hidden();\r
576         }\r
577         if (fileName(index) != ".." && !fileInfo(index).isWritable()) {\r
578             return readOnly();\r
579         }\r
580         return text();\r
581 \r
582     case Qt::CheckStateRole:\r
583         if (index.column() == Name && fileName(index) != "..") {\r
584             return isMarked(index) ? Qt::Checked : Qt::Unchecked;\r
585         }\r
586         break;\r
587     }\r
588 \r
589     return QVariant();\r
590 }\r
591 \r
592 ///////////////////////////////////////////////////////////////////////////////\r
593 /// \brief FolderModel::flags\r
594 /// \param index    インデックス\r
595 /// \return フラグを返します。\r
596 ///\r
597 Qt::ItemFlags FolderModel::flags(const QModelIndex &index) const\r
598 {\r
599     Qt::ItemFlags flags = Qt::ItemIsEnabled | Qt::ItemIsSelectable;\r
600 \r
601     if (!index.isValid()) {\r
602         return flags | Qt::ItemIsDropEnabled;\r
603     }\r
604 \r
605     if (m_fileInfoList[index.row()].fileName() != "..") {\r
606         if (index.column() == Name) {\r
607             flags |= Qt::ItemIsUserCheckable;\r
608         }\r
609         flags |= Qt::ItemIsDropEnabled;\r
610     }\r
611     return flags;\r
612 }\r
613 \r
614 ///////////////////////////////////////////////////////////////////////////////\r
615 /// \brief FolderModel::setData\r
616 /// \param index    インデックス\r
617 /// \param value    値\r
618 /// \param role     ロール\r
619 /// \return 値を設定した場合はtrueを返します。\r
620 ///\r
621 bool FolderModel::setData(const QModelIndex &index, const QVariant &value, int role)\r
622 {\r
623     qDebug() << "FolderModel::setData()" << index;\r
624 \r
625     if (!index.isValid()) {\r
626         return false;\r
627     }\r
628 \r
629     switch (role) {\r
630     case Qt::CheckStateRole:\r
631         if (index.column() == Name && fileName(index) != "..") {\r
632             m_checkStates[fileName(index)] = value.toInt();\r
633             emit dataChanged(this->index(index.row(), 0),\r
634                              this->index(index.row(), ColumnCount - 1));\r
635             return true;\r
636         }\r
637         break;\r
638     }\r
639 \r
640     return false;\r
641 }\r
642 \r
643 ///////////////////////////////////////////////////////////////////////////////\r
644 /// \brief FolderModel::supportedDropActions\r
645 /// \return Qt::CopyActionを返します。\r
646 ///\r
647 Qt::DropActions FolderModel::supportedDropActions() const\r
648 {\r
649     qDebug() << "FolderModel::supportedDropActions()";\r
650 \r
651     return Qt::CopyAction;\r
652 }\r
653 \r
654 ///////////////////////////////////////////////////////////////////////////////\r
655 /// \brief FolderModel::mimeTypes\r
656 /// \return MIMEタイプのリストを返します。\r
657 ///\r
658 QStringList FolderModel::mimeTypes() const\r
659 {\r
660     qDebug() << "FolderModel::mimeTypes()";\r
661 \r
662     QStringList types;\r
663 \r
664     types << "text/uri-list";\r
665 \r
666     return types;\r
667 }\r