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);
90 void FolderView::refresh()
92 qDebug() << side() << "refresh";
94 int row = currentIndex().row();
96 setPath(m_model.absolutePath(), false);
101 else if (row >= m_model.rowCount()) {
102 row = m_model.rowCount() - 1;
104 setCurrentIndex(m_model.index(row, 0));
108 void FolderView::searchItem(const QString &text)
110 qDebug() << "FolderView::searchItem" << text;
112 for (int row = 0; row < m_model.rowCount(); row++) {
113 QModelIndex index = m_model.index(row, 0);
114 QString name = m_model.fileInfo(index).fileName().toLower();
115 if (name.indexOf(text.toLower()) != -1) {
116 setCurrentIndex(index);
125 void FolderView::searchNext(const QString &text)
127 qDebug() << "FolderView::searchNext" << text;
129 for (int row = currentIndex().row() + 1; row < m_model.rowCount(); row++) {
130 QModelIndex index = m_model.index(row, 0);
131 QString name = m_model.fileInfo(index).fileName().toLower();
132 if (name.indexOf(text.toLower()) != -1) {
133 setCurrentIndex(index);
142 void FolderView::searchPrev(const QString &text)
144 qDebug() << side() << "searchPrev" << text;
146 for (int row = currentIndex().row() - 1; row >= 0; row--) {
147 QModelIndex index = m_model.index(row, 0);
148 QString name = m_model.fileInfo(index).fileName().toLower();
149 if (name.indexOf(text.toLower()) != -1) {
150 setCurrentIndex(index);
159 void FolderView::setCheckStateAll(bool checked)
161 qDebug() << side() << "markAll();";
163 QModelIndex current = currentIndex();
165 setUpdatesEnabled(false);
166 m_model.setCheckStateAll(checked ? Qt::Checked : Qt::Unchecked);
167 setUpdatesEnabled(true);
169 setCurrentIndex(current);
172 void FolderView::setCheckStateAllFiles()
174 qDebug() << side() << "markAllFiles();";
176 QModelIndex current = currentIndex();
178 setUpdatesEnabled(false);
179 for (int n = 0; n < m_model.rowCount(); n++) {
180 QModelIndex index = m_model.index(n, 0);
181 QFileInfo info = m_model.fileInfo(index);
183 m_model.setCheckState(index, Qt::Unchecked);
186 m_model.setCheckState(index, Qt::Checked);
189 setUpdatesEnabled(true);
191 setCurrentIndex(current);
194 void FolderView::invertCheckState()
196 qDebug() << side() << "invertCheckState();";
198 QModelIndex current = currentIndex();
200 setUpdatesEnabled(false);
201 for (int n = 0; n < m_model.rowCount(); n++) {
202 QModelIndex index = m_model.index(n, 0);
203 if (m_model.checkState(index) == Qt::Checked) {
204 m_model.setCheckState(index, Qt::Unchecked);
207 m_model.setCheckState(index, Qt::Checked);
210 setUpdatesEnabled(true);
212 setCurrentIndex(current);
215 void FolderView::toggleCheckState(const QModelIndex &index)
217 QFileInfo info = m_model.fileInfo(index);
218 if (info.fileName() != "..") {
219 if (m_model.checkState(index) == Qt::Checked) {
220 m_model.setCheckState(index, Qt::Unchecked);
223 m_model.setCheckState(index, Qt::Checked);
226 // 最終行でなければ、次のアイテムに移動する
227 if (index.row() == m_model.rowCount() - 1) {
228 setCurrentIndex(index);
230 else if (index.row() < m_model.rowCount() - 1) {
231 setCurrentIndex(m_model.index(index.row() + 1, 1));
235 bool FolderView::historyBack()
237 if (!m_history.isBegin()) {
238 setPath(m_history.back(), false);
244 bool FolderView::historyForward()
246 if (!m_history.isEnd()) {
247 setPath(m_history.forward(), false);
253 QFileInfo FolderView::currentItem() const
255 qDebug() << "FolderView::currentItem";
257 Q_ASSERT(currentIndex().isValid());
259 return m_model.fileInfo(currentIndex());
262 QFileInfoList FolderView::checkedItems() const
264 qDebug() << side() << "checkedItems()";
266 return m_model.checkedItems();
269 QFileInfoList FolderView::selectedItems() const
271 qDebug() << side() << "selectedItems";
274 QFileInfoList list = m_model.checkedItems();
276 // 一つもマークされていなければ、カーソル位置のアイテムを取得する
277 if (list.isEmpty()) {
278 list << currentItem();
284 void FolderView::setPath(const QString &path, bool addHistory)
286 qDebug() << side() << "setPath" << path << addHistory;
288 Q_ASSERT(QFileInfo(path).isDir());
290 emit retrieveStarted(path);
292 setUpdatesEnabled(false);
293 m_model.setPath(path);
294 setCurrentIndex(m_model.index(0, 0));
295 setUpdatesEnabled(true);
301 emit retrieveFinished();
304 void FolderView::setFilter(QDir::Filters filter, bool enable)
306 qDebug() << side() << "setFilter" << enable;
309 m_model.setFilter(m_model.filter() | filter);
312 m_model.setFilter(m_model.filter() ^ filter);
316 void FolderView::setHistoryIndexAt(int index)
318 m_history.setAt(index);
319 setPath(m_history.current(), false);
322 void FolderView::setNameFilters(const QStringList &list)
324 m_model.setNameFilters(list);
328 void FolderView::setSorting(QDir::SortFlags flags)
330 m_model.setSorting(flags);
334 void FolderView::keyPressEvent(QKeyEvent *event)
336 qDebug() << side() << "keyPressEvent";
338 emit keyPressed(event);
340 if (!event->isAccepted()) {
341 QTableView::keyPressEvent(event);
344 qDebug() << "KeyEvent accepted.";
348 void FolderView::dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight, const QVector<int> &roles)
352 QTableView::dataChanged(topLeft, bottomRight, roles);
355 void FolderView::currentChanged(const QModelIndex ¤t, const QModelIndex &previous)
357 emit currentChanged(m_model.fileInfo(current));
359 QTableView::currentChanged(current, previous);
362 void FolderView::mousePressEvent(QMouseEvent *event)
364 if ((event->buttons() & Qt::LeftButton) || (event->buttons() & Qt::RightButton))
366 m_dragStartPos = event->pos();
369 QTableView::mousePressEvent(event);
372 void FolderView::mouseMoveEvent(QMouseEvent *event)
374 if (!(event->buttons() & Qt::LeftButton) &&
375 !(event->buttons() & Qt::RightButton))
377 QTableView::mouseMoveEvent(event);
380 if ((event->pos() - m_dragStartPos).manhattanLength()
381 < QApplication::startDragDistance())
383 QTableView::mouseMoveEvent(event);
387 QFileInfoList list = selectedItems();
388 if (list.isEmpty()) {
389 QTableView::mousePressEvent(event);
394 foreach (const QFileInfo &info, list) {
395 urls << QUrl::fromLocalFile(info.absoluteFilePath());
398 QDrag *drag = new QDrag(this);
399 QMimeData *mimeData = new QMimeData;
400 mimeData->setUrls(urls);
401 drag->setMimeData(mimeData);
404 if (event->buttons() & Qt::RightButton) {
405 drag->exec(Qt::CopyAction | Qt::MoveAction);
408 drag->exec(Qt::CopyAction);
413 void FolderView::dragEnterEvent(QDragEnterEvent *event)
415 if (event->mimeData()->hasUrls()) {
416 event->acceptProposedAction();
420 QTableView::dragEnterEvent(event);
423 void FolderView::dropEvent(QDropEvent *event)
425 qDebug() << side() << "dropEvent();";
433 foreach (const QUrl &url, event->mimeData()->urls()) {
434 QString path = QFileInfo(url.toLocalFile()).canonicalFilePath();
435 if (!path.isEmpty()) {
439 qDebug() << "path is empty." << url;
443 if (list.isEmpty()) {
448 event->acceptProposedAction();
450 emit dropAccepted(list);
454 void FolderView::contextMenuEvent(QContextMenuEvent *event)
456 qDebug() << side() << "contextMenuEvent();";
458 emit requestContextMenu(event);