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 setPath(settings.value(side() + slash + IniKey_Dir).toString(), true);
69 header = horizontalHeader();
70 header->setSectionResizeMode(0, QHeaderView::Fixed);
71 header->setSectionResizeMode(1, QHeaderView::Stretch);
72 header->setSectionResizeMode(2, QHeaderView::ResizeToContents);
73 header->setSectionResizeMode(3, QHeaderView::ResizeToContents);
74 header->setSectionResizeMode(4, QHeaderView::ResizeToContents);
77 void FolderView::updateAppearance()
79 qDebug() << side() << "updateAppearance";
80 m_model.updateAppearance();
83 QPalette pal = palette();
84 pal.setColor(QPalette::Base, settings.value(IniKey_ViewColorBgNormal).value<QColor>());
88 QHeaderView *header = verticalHeader();
89 header->setDefaultSectionSize(QFontMetrics(m_model.font()).height() * 1.5);
92 header = horizontalHeader();
93 header->setSectionResizeMode(0, QHeaderView::Fixed);
94 header->setSectionResizeMode(1, QHeaderView::Stretch);
95 header->setSectionResizeMode(2, QHeaderView::ResizeToContents);
96 header->setSectionResizeMode(3, QHeaderView::ResizeToContents);
97 header->setSectionResizeMode(4, QHeaderView::ResizeToContents);
102 void FolderView::refresh()
104 qDebug() << side() << "refresh";
106 int row = currentIndex().row();
108 setPath(m_model.absolutePath(), false);
113 else if (row >= m_model.rowCount()) {
114 row = m_model.rowCount() - 1;
116 setCurrentIndex(m_model.index(row, 0));
120 void FolderView::searchItem(const QString &text)
122 qDebug() << "FolderView::searchItem" << text;
124 for (int row = 0; row < m_model.rowCount(); row++) {
125 QModelIndex index = m_model.index(row, 0);
126 QString name = m_model.fileInfo(index).fileName().toLower();
127 if (name.indexOf(text.toLower()) != -1) {
128 setCurrentIndex(index);
137 void FolderView::searchNext(const QString &text)
139 qDebug() << "FolderView::searchNext" << text;
141 for (int row = currentIndex().row() + 1; row < m_model.rowCount(); row++) {
142 QModelIndex index = m_model.index(row, 0);
143 QString name = m_model.fileInfo(index).fileName().toLower();
144 if (name.indexOf(text.toLower()) != -1) {
145 setCurrentIndex(index);
154 void FolderView::searchPrev(const QString &text)
156 qDebug() << side() << "searchPrev" << text;
158 for (int row = currentIndex().row() - 1; row >= 0; row--) {
159 QModelIndex index = m_model.index(row, 0);
160 QString name = m_model.fileInfo(index).fileName().toLower();
161 if (name.indexOf(text.toLower()) != -1) {
162 setCurrentIndex(index);
171 void FolderView::setCheckStateAll(bool checked)
173 qDebug() << side() << "markAll();";
175 QModelIndex current = currentIndex();
177 setUpdatesEnabled(false);
178 m_model.setCheckStateAll(checked ? Qt::Checked : Qt::Unchecked);
179 setUpdatesEnabled(true);
181 setCurrentIndex(current);
184 void FolderView::setCheckStateAllFiles()
186 qDebug() << side() << "markAllFiles();";
188 QModelIndex current = currentIndex();
190 setUpdatesEnabled(false);
191 for (int n = 0; n < m_model.rowCount(); n++) {
192 QModelIndex index = m_model.index(n, 0);
193 QFileInfo info = m_model.fileInfo(index);
195 m_model.setCheckState(index, Qt::Unchecked);
198 m_model.setCheckState(index, Qt::Checked);
201 setUpdatesEnabled(true);
203 setCurrentIndex(current);
206 void FolderView::invertCheckState()
208 qDebug() << side() << "invertCheckState();";
210 QModelIndex current = currentIndex();
212 setUpdatesEnabled(false);
213 for (int n = 0; n < m_model.rowCount(); n++) {
214 QModelIndex index = m_model.index(n, 0);
215 if (m_model.checkState(index) == Qt::Checked) {
216 m_model.setCheckState(index, Qt::Unchecked);
219 m_model.setCheckState(index, Qt::Checked);
222 setUpdatesEnabled(true);
224 setCurrentIndex(current);
227 void FolderView::toggleCheckState(const QModelIndex &index)
229 QFileInfo info = m_model.fileInfo(index);
230 if (info.fileName() != "..") {
231 if (m_model.checkState(index) == Qt::Checked) {
232 m_model.setCheckState(index, Qt::Unchecked);
235 m_model.setCheckState(index, Qt::Checked);
238 // 最終行でなければ、次のアイテムに移動する
239 if (index.row() == m_model.rowCount() - 1) {
240 setCurrentIndex(index);
242 else if (index.row() < m_model.rowCount() - 1) {
243 setCurrentIndex(m_model.index(index.row() + 1, 1));
247 bool FolderView::historyBack()
249 if (!m_history.isBegin()) {
250 setPath(m_history.back(), false);
256 bool FolderView::historyForward()
258 if (!m_history.isEnd()) {
259 setPath(m_history.forward(), false);
265 QFileInfo FolderView::currentItem() const
267 qDebug() << "FolderView::currentItem";
269 Q_ASSERT(currentIndex().isValid());
271 return m_model.fileInfo(currentIndex());
274 QFileInfoList FolderView::checkedItems() const
276 qDebug() << side() << "checkedItems()";
278 return m_model.checkedItems();
281 QFileInfoList FolderView::selectedItems() const
283 qDebug() << side() << "selectedItems";
286 QFileInfoList list = m_model.checkedItems();
288 // 一つもマークされていなければ、カーソル位置のアイテムを取得する
289 if (list.isEmpty()) {
290 list << currentItem();
296 void FolderView::setPath(const QString &path, bool addHistory)
298 qDebug() << side() << "setPath" << path << addHistory;
300 Q_ASSERT(QFileInfo(path).isDir());
302 emit retrieveStarted(path);
304 setUpdatesEnabled(false);
305 m_model.setPath(path);
306 setCurrentIndex(m_model.index(0, 0));
307 setUpdatesEnabled(true);
313 emit retrieveFinished();
316 void FolderView::setFilter(QDir::Filters filter, bool enable)
318 qDebug() << side() << "setFilter" << enable;
321 m_model.setFilter(m_model.filter() | filter);
324 m_model.setFilter(m_model.filter() ^ filter);
328 void FolderView::setHistoryIndexAt(int index)
330 m_history.setAt(index);
331 setPath(m_history.current(), false);
334 void FolderView::setNameFilters(const QStringList &list)
336 m_model.setNameFilters(list);
340 void FolderView::setSorting(QDir::SortFlags flags)
342 m_model.setSorting(flags);
346 void FolderView::keyPressEvent(QKeyEvent *event)
348 qDebug() << side() << "keyPressEvent";
350 emit keyPressed(event);
352 if (!event->isAccepted()) {
353 QTableView::keyPressEvent(event);
356 qDebug() << "KeyEvent accepted.";
360 void FolderView::dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight, const QVector<int> &roles)
364 QTableView::dataChanged(topLeft, bottomRight, roles);
367 void FolderView::currentChanged(const QModelIndex ¤t, const QModelIndex &previous)
369 emit currentChanged(m_model.fileInfo(current));
371 QTableView::currentChanged(current, previous);
374 void FolderView::mousePressEvent(QMouseEvent *event)
376 if ((event->buttons() & Qt::LeftButton) || (event->buttons() & Qt::RightButton))
378 m_dragStartPos = event->pos();
381 QTableView::mousePressEvent(event);
384 void FolderView::mouseMoveEvent(QMouseEvent *event)
386 if (!(event->buttons() & Qt::LeftButton) &&
387 !(event->buttons() & Qt::RightButton))
389 QTableView::mouseMoveEvent(event);
392 if ((event->pos() - m_dragStartPos).manhattanLength()
393 < QApplication::startDragDistance())
395 QTableView::mouseMoveEvent(event);
399 QFileInfoList list = selectedItems();
400 if (list.isEmpty()) {
401 QTableView::mousePressEvent(event);
406 foreach (const QFileInfo &info, list) {
407 urls << QUrl::fromLocalFile(info.absoluteFilePath());
410 QDrag *drag = new QDrag(this);
411 QMimeData *mimeData = new QMimeData;
412 mimeData->setUrls(urls);
413 drag->setMimeData(mimeData);
416 if (event->buttons() & Qt::RightButton) {
417 drag->exec(Qt::CopyAction | Qt::MoveAction);
420 drag->exec(Qt::CopyAction);
425 void FolderView::dragEnterEvent(QDragEnterEvent *event)
427 if (event->mimeData()->hasUrls()) {
428 event->acceptProposedAction();
432 QTableView::dragEnterEvent(event);
435 void FolderView::dropEvent(QDropEvent *event)
437 qDebug() << side() << "dropEvent();";
445 foreach (const QUrl &url, event->mimeData()->urls()) {
446 QString path = QFileInfo(url.toLocalFile()).canonicalFilePath();
447 if (!path.isEmpty()) {
451 qDebug() << "path is empty." << url;
455 if (list.isEmpty()) {
460 event->acceptProposedAction();
462 emit dropAccepted(list);
466 void FolderView::contextMenuEvent(QContextMenuEvent *event)
468 qDebug() << side() << "contextMenuEvent();";
470 emit requestContextMenu(event);