2 #include "folderview.h"
9 #include <QApplication>
13 QString FilesizeToString(quint64 size)
15 if (size >= 1024 * 1024 * 1024) {
16 return QString("%1GB").arg(int(10 * size / (1024 * 1024 * 1024)) / 10);
18 if (size >= 1024 * 1024) {
19 return QString("%1MB").arg(int(10 * size / (1024 * 1024)) / 10);
22 return QString("%1KB").arg(int(10 * size / (1024)) / 10);
24 return QString("%1B").arg(size);
27 FolderView::FolderView(QWidget *parent) :
34 connect(&m_model, SIGNAL(dataChanged(QModelIndex,QModelIndex)), this, SLOT(dataChanged(QModelIndex,QModelIndex)));
38 setDropIndicatorShown(true);
40 setContextMenuPolicy(Qt::DefaultContextMenu);
43 QString FolderView::side() const
45 if (this->objectName() == "folderView1") {
46 return QString("Left");
49 Q_ASSERT(this->objectName() == "folderView2");
50 return QString("Right");
54 void FolderView::initialize()
56 qDebug() << side() << "initialize";
58 setColumnWidth(0, 30);
62 header = horizontalHeader();
63 header->setSectionResizeMode(QHeaderView::ResizeToContents);
64 header->setSectionResizeMode(0, QHeaderView::Fixed);
65 header->setSectionResizeMode(1, QHeaderView::Stretch);
69 setPath(settings.value(side() + slash + IniKey_Dir).toString(), true);
75 void FolderView::updateAppearance()
77 qDebug() << side() << "updateAppearance";
78 m_model.updateAppearance();
81 QPalette pal = palette();
82 pal.setColor(QPalette::Base, settings.value(IniKey_ViewColorBgNormal).value<QColor>());
86 QHeaderView *header = verticalHeader();
87 header->setDefaultSectionSize(QFontMetrics(m_model.font()).height() * 1.5);
92 void FolderView::refresh()
94 qDebug() << side() << "refresh";
96 int row = currentIndex().row();
98 setPath(m_model.absolutePath(), false);
103 else if (row >= m_model.rowCount()) {
104 row = m_model.rowCount() - 1;
106 setCurrentIndex(m_model.index(row, 0));
110 void FolderView::searchItem(const QString &text)
112 qDebug() << "FolderView::searchItem" << text;
114 for (int row = 0; row < m_model.rowCount(); row++) {
115 QModelIndex index = m_model.index(row, 0);
116 QString name = m_model.fileInfo(index).fileName().toLower();
117 if (name.indexOf(text.toLower()) != -1) {
118 setCurrentIndex(index);
127 void FolderView::searchNext(const QString &text)
129 qDebug() << "FolderView::searchNext" << text;
131 for (int row = currentIndex().row() + 1; row < m_model.rowCount(); row++) {
132 QModelIndex index = m_model.index(row, 0);
133 QString name = m_model.fileInfo(index).fileName().toLower();
134 if (name.indexOf(text.toLower()) != -1) {
135 setCurrentIndex(index);
144 void FolderView::searchPrev(const QString &text)
146 qDebug() << side() << "searchPrev" << text;
148 for (int row = currentIndex().row() - 1; row >= 0; row--) {
149 QModelIndex index = m_model.index(row, 0);
150 QString name = m_model.fileInfo(index).fileName().toLower();
151 if (name.indexOf(text.toLower()) != -1) {
152 setCurrentIndex(index);
161 void FolderView::setCheckStateAll(bool checked)
163 qDebug() << side() << "markAll();";
165 QModelIndex current = currentIndex();
167 setUpdatesEnabled(false);
168 m_model.setCheckStateAll(checked ? Qt::Checked : Qt::Unchecked);
169 setUpdatesEnabled(true);
171 setCurrentIndex(current);
174 void FolderView::setCheckStateAllFiles()
176 qDebug() << side() << "markAllFiles();";
178 QModelIndex current = currentIndex();
180 setUpdatesEnabled(false);
181 for (int n = 0; n < m_model.rowCount(); n++) {
182 QModelIndex index = m_model.index(n, 0);
183 QFileInfo info = m_model.fileInfo(index);
185 m_model.setCheckState(index, Qt::Unchecked);
188 m_model.setCheckState(index, Qt::Checked);
191 setUpdatesEnabled(true);
193 setCurrentIndex(current);
196 void FolderView::invertCheckState()
198 qDebug() << side() << "invertCheckState();";
200 QModelIndex current = currentIndex();
202 setUpdatesEnabled(false);
203 for (int n = 0; n < m_model.rowCount(); n++) {
204 QModelIndex index = m_model.index(n, 0);
205 if (m_model.checkState(index) == Qt::Checked) {
206 m_model.setCheckState(index, Qt::Unchecked);
209 m_model.setCheckState(index, Qt::Checked);
212 setUpdatesEnabled(true);
214 setCurrentIndex(current);
217 void FolderView::toggleCheckState(const QModelIndex &index)
219 QFileInfo info = m_model.fileInfo(index);
220 if (info.fileName() != "..") {
221 if (m_model.checkState(index) == Qt::Checked) {
222 m_model.setCheckState(index, Qt::Unchecked);
225 m_model.setCheckState(index, Qt::Checked);
228 // 最終行でなければ、次のアイテムに移動する
229 if (index.row() == m_model.rowCount() - 1) {
230 setCurrentIndex(index);
232 else if (index.row() < m_model.rowCount() - 1) {
233 setCurrentIndex(m_model.index(index.row() + 1, 1));
237 bool FolderView::historyBack()
239 if (!m_history.isBegin()) {
240 setPath(m_history.back(), false);
246 bool FolderView::historyForward()
248 if (!m_history.isEnd()) {
249 setPath(m_history.forward(), false);
255 QFileInfo FolderView::currentItem() const
257 qDebug() << "FolderView::currentItem";
259 Q_ASSERT(currentIndex().isValid());
261 return m_model.fileInfo(currentIndex());
264 QFileInfoList FolderView::checkedItems() const
266 qDebug() << side() << "checkedItems()";
268 return m_model.checkedItems();
271 QFileInfoList FolderView::selectedItems() const
273 qDebug() << side() << "selectedItems";
276 QFileInfoList list = m_model.checkedItems();
278 // 一つもマークされていなければ、カーソル位置のアイテムを取得する
279 if (list.isEmpty()) {
280 list << currentItem();
286 void FolderView::setPath(const QString &path, bool addHistory)
288 qDebug() << side() << "setPath" << path << addHistory;
290 Q_ASSERT(QFileInfo(path).isDir());
292 emit retrieveStarted(path);
294 setUpdatesEnabled(false);
295 m_model.setPath(path);
296 setCurrentIndex(m_model.index(0, 0));
297 setUpdatesEnabled(true);
303 emit retrieveFinished();
306 void FolderView::setFilter(QDir::Filters filter, bool enable)
308 qDebug() << side() << "setFilter" << enable;
311 m_model.setFilter(m_model.filter() | filter);
314 m_model.setFilter(m_model.filter() ^ filter);
318 void FolderView::setHistoryIndexAt(int index)
320 m_history.setAt(index);
321 setPath(m_history.current(), false);
324 void FolderView::setNameFilters(const QStringList &list)
326 m_model.setNameFilters(list);
330 void FolderView::setSorting(QDir::SortFlags flags)
332 m_model.setSorting(flags);
336 void FolderView::keyPressEvent(QKeyEvent *event)
338 qDebug() << side() << "keyPressEvent";
340 emit keyPressed(event);
342 if (!event->isAccepted()) {
343 QTableView::keyPressEvent(event);
346 qDebug() << "KeyEvent accepted.";
350 void FolderView::dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight, const QVector<int> &roles)
354 QTableView::dataChanged(topLeft, bottomRight, roles);
357 void FolderView::currentChanged(const QModelIndex ¤t, const QModelIndex &previous)
359 emit currentChanged(m_model.fileInfo(current));
361 QTableView::currentChanged(current, previous);
364 void FolderView::mousePressEvent(QMouseEvent *event)
366 if ((event->buttons() & Qt::LeftButton) || (event->buttons() & Qt::RightButton))
368 m_dragStartPos = event->pos();
371 QTableView::mousePressEvent(event);
374 void FolderView::mouseMoveEvent(QMouseEvent *event)
376 if (!(event->buttons() & Qt::LeftButton) &&
377 !(event->buttons() & Qt::RightButton))
379 QTableView::mouseMoveEvent(event);
382 if ((event->pos() - m_dragStartPos).manhattanLength()
383 < QApplication::startDragDistance())
385 QTableView::mouseMoveEvent(event);
389 QFileInfoList list = selectedItems();
390 if (list.isEmpty()) {
391 QTableView::mousePressEvent(event);
396 foreach (const QFileInfo &info, list) {
397 urls << QUrl::fromLocalFile(info.absoluteFilePath());
400 QDrag *drag = new QDrag(this);
401 QMimeData *mimeData = new QMimeData;
402 mimeData->setUrls(urls);
403 drag->setMimeData(mimeData);
406 if (event->buttons() & Qt::RightButton) {
407 drag->exec(Qt::CopyAction | Qt::MoveAction);
410 drag->exec(Qt::CopyAction);
415 void FolderView::dragEnterEvent(QDragEnterEvent *event)
417 if (event->mimeData()->hasUrls()) {
418 event->acceptProposedAction();
422 QTableView::dragEnterEvent(event);
425 void FolderView::dropEvent(QDropEvent *event)
427 qDebug() << side() << "dropEvent();";
435 foreach (const QUrl &url, event->mimeData()->urls()) {
436 QString path = QFileInfo(url.toLocalFile()).canonicalFilePath();
437 if (!path.isEmpty()) {
441 qDebug() << "path is empty." << url;
445 if (list.isEmpty()) {
450 event->acceptProposedAction();
452 emit dropAccepted(list);
456 void FolderView::contextMenuEvent(QContextMenuEvent *event)
458 qDebug() << side() << "contextMenuEvent();";
460 emit requestContextMenu(event);