2 #include "mainwindow.h"
3 #include "folderview.h"
10 #include <QApplication>
14 QString FilesizeToString(quint64 size)
16 if (size >= 1024 * 1024 * 1024) {
17 return QString("%1GB").arg(int(10 * size / (1024 * 1024 * 1024)) / 10);
19 if (size >= 1024 * 1024) {
20 return QString("%1MB").arg(int(10 * size / (1024 * 1024)) / 10);
23 return QString("%1KB").arg(int(10 * size / (1024)) / 10);
25 return QString("%1B").arg(size);
28 FolderView::FolderView(QWidget *parent) :
35 connect(&m_model, SIGNAL(dataChanged(QModelIndex,QModelIndex)), this, SLOT(dataChanged(QModelIndex,QModelIndex)));
39 setDropIndicatorShown(true);
41 setContextMenuPolicy(Qt::DefaultContextMenu);
44 QString FolderView::side() const
46 if (this->objectName() == "folderView1") {
47 return QString("Left");
50 Q_ASSERT(this->objectName() == "folderView2");
51 return QString("Right");
55 void FolderView::initialize()
57 qDebug() << side() << "initialize";
59 setColumnWidth(0, 30);
63 setPath(settings.value(side() + slash + IniKey_Dir).toString(), true);
70 header = horizontalHeader();
71 header->setSectionResizeMode(0, QHeaderView::Fixed);
72 header->setSectionResizeMode(1, QHeaderView::Stretch);
73 header->setSectionResizeMode(2, QHeaderView::ResizeToContents);
74 header->setSectionResizeMode(3, QHeaderView::ResizeToContents);
75 header->setSectionResizeMode(4, QHeaderView::ResizeToContents);
78 void FolderView::updateAppearance()
80 qDebug() << side() << "updateAppearance";
81 m_model.updateAppearance();
84 QPalette pal = palette();
85 pal.setColor(QPalette::Base, settings.value(IniKey_ViewColorBgNormal).value<QColor>());
89 QHeaderView *header = verticalHeader();
90 header->setDefaultSectionSize(QFontMetrics(m_model.font()).height() * 1.5);
93 header = horizontalHeader();
94 header->setSectionResizeMode(0, QHeaderView::Fixed);
95 header->setSectionResizeMode(1, QHeaderView::Stretch);
96 header->setSectionResizeMode(2, QHeaderView::ResizeToContents);
97 header->setSectionResizeMode(3, QHeaderView::ResizeToContents);
98 header->setSectionResizeMode(4, QHeaderView::ResizeToContents);
103 void FolderView::refresh()
105 qDebug() << side() << "refresh";
107 int row = currentIndex().row();
109 setPath(m_model.absolutePath(), false);
114 else if (row >= m_model.rowCount()) {
115 row = m_model.rowCount() - 1;
117 setCurrentIndex(m_model.index(row, 0));
121 void FolderView::searchItem(const QString &text)
123 qDebug() << "FolderView::searchItem" << text;
125 for (int row = 0; row < m_model.rowCount(); row++) {
126 QModelIndex index = m_model.index(row, 0);
127 QString name = m_model.fileInfo(index).fileName().toLower();
128 if (name.indexOf(text.toLower()) != -1) {
129 setCurrentIndex(index);
138 void FolderView::searchNext(const QString &text)
140 qDebug() << "FolderView::searchNext" << text;
142 for (int row = currentIndex().row() + 1; row < m_model.rowCount(); row++) {
143 QModelIndex index = m_model.index(row, 0);
144 QString name = m_model.fileInfo(index).fileName().toLower();
145 if (name.indexOf(text.toLower()) != -1) {
146 setCurrentIndex(index);
155 void FolderView::searchPrev(const QString &text)
157 qDebug() << side() << "searchPrev" << text;
159 for (int row = currentIndex().row() - 1; row >= 0; row--) {
160 QModelIndex index = m_model.index(row, 0);
161 QString name = m_model.fileInfo(index).fileName().toLower();
162 if (name.indexOf(text.toLower()) != -1) {
163 setCurrentIndex(index);
172 void FolderView::setCheckStateAll(bool checked)
174 qDebug() << side() << "markAll();";
176 QModelIndex current = currentIndex();
178 setUpdatesEnabled(false);
179 m_model.setCheckStateAll(checked ? Qt::Checked : Qt::Unchecked);
180 setUpdatesEnabled(true);
182 setCurrentIndex(current);
185 void FolderView::setCheckStateAllFiles()
187 qDebug() << side() << "markAllFiles();";
189 QModelIndex current = currentIndex();
191 setUpdatesEnabled(false);
192 for (int n = 0; n < m_model.rowCount(); n++) {
193 QModelIndex index = m_model.index(n, 0);
194 QFileInfo info = m_model.fileInfo(index);
196 m_model.setCheckState(index, Qt::Unchecked);
199 m_model.setCheckState(index, Qt::Checked);
202 setUpdatesEnabled(true);
204 setCurrentIndex(current);
207 void FolderView::invertCheckState()
209 qDebug() << side() << "invertCheckState();";
211 QModelIndex current = currentIndex();
213 setUpdatesEnabled(false);
214 for (int n = 0; n < m_model.rowCount(); n++) {
215 QModelIndex index = m_model.index(n, 0);
216 if (m_model.checkState(index) == Qt::Checked) {
217 m_model.setCheckState(index, Qt::Unchecked);
220 m_model.setCheckState(index, Qt::Checked);
223 setUpdatesEnabled(true);
225 setCurrentIndex(current);
228 void FolderView::toggleCheckState(const QModelIndex &index)
230 QFileInfo info = m_model.fileInfo(index);
231 if (info.fileName() != "..") {
232 if (m_model.checkState(index) == Qt::Checked) {
233 m_model.setCheckState(index, Qt::Unchecked);
236 m_model.setCheckState(index, Qt::Checked);
239 // 最終行でなければ、次のアイテムに移動する
240 if (index.row() == m_model.rowCount() - 1) {
241 setCurrentIndex(index);
243 else if (index.row() < m_model.rowCount() - 1) {
244 setCurrentIndex(m_model.index(index.row() + 1, 1));
248 bool FolderView::historyBack()
250 if (!m_history.isBegin()) {
251 setPath(m_history.back(), false);
257 bool FolderView::historyForward()
259 if (!m_history.isEnd()) {
260 setPath(m_history.forward(), false);
266 QFileInfo FolderView::currentItem() const
268 qDebug() << "FolderView::currentItem";
270 Q_ASSERT(currentIndex().isValid());
272 return m_model.fileInfo(currentIndex());
275 QFileInfoList FolderView::checkedItems() const
277 qDebug() << side() << "checkedItems()";
279 return m_model.checkedItems();
282 QFileInfoList FolderView::selectedItems() const
284 qDebug() << side() << "selectedItems";
287 QFileInfoList list = m_model.checkedItems();
289 // 一つもマークされていなければ、カーソル位置のアイテムを取得する
290 if (list.isEmpty()) {
291 list << currentItem();
297 void FolderView::setPath(const QString &path, bool addHistory)
299 qDebug() << side() << "setPath" << path << addHistory;
301 Q_ASSERT(QFileInfo(path).isDir());
303 emit retrieveStarted(path);
305 setUpdatesEnabled(false);
306 m_model.setPath(path);
307 setCurrentIndex(m_model.index(0, 0));
308 setUpdatesEnabled(true);
314 emit retrieveFinished();
317 void FolderView::setFilter(QDir::Filters filter, bool enable)
319 qDebug() << side() << "setFilter" << enable;
322 m_model.setFilter(m_model.filter() | filter);
325 m_model.setFilter(m_model.filter() ^ filter);
329 void FolderView::setHistoryIndexAt(int index)
331 m_history.setAt(index);
332 setPath(m_history.current(), false);
335 void FolderView::setNameFilters(const QStringList &list)
337 m_model.setNameFilters(list);
341 void FolderView::setSorting(QDir::SortFlags flags)
343 m_model.setSorting(flags);
347 void FolderView::keyPressEvent(QKeyEvent *event)
349 qDebug() << side() << "keyPressEvent";
351 // emit keyPressed(event);
353 // if (!event->isAccepted()) {
354 // QTableView::keyPressEvent(event);
357 // qDebug() << "KeyEvent accepted.";
359 QString ksq = KeyEventToSequence(event);
360 if (ProcessShortcut(ksq, getMainWnd())) {
365 QTableView::keyPressEvent(event);
368 void FolderView::dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight, const QVector<int> &roles)
372 QTableView::dataChanged(topLeft, bottomRight, roles);
375 void FolderView::currentChanged(const QModelIndex ¤t, const QModelIndex &previous)
377 emit currentChanged(m_model.fileInfo(current));
379 QTableView::currentChanged(current, previous);
382 void FolderView::mousePressEvent(QMouseEvent *event)
384 if ((event->buttons() & Qt::LeftButton) || (event->buttons() & Qt::RightButton))
386 m_dragStartPos = event->pos();
389 QTableView::mousePressEvent(event);
392 void FolderView::mouseMoveEvent(QMouseEvent *event)
394 if (!(event->buttons() & Qt::LeftButton) &&
395 !(event->buttons() & Qt::RightButton))
397 QTableView::mouseMoveEvent(event);
400 if ((event->pos() - m_dragStartPos).manhattanLength()
401 < QApplication::startDragDistance())
403 QTableView::mouseMoveEvent(event);
407 QFileInfoList list = selectedItems();
408 if (list.isEmpty()) {
409 QTableView::mousePressEvent(event);
414 foreach (const QFileInfo &info, list) {
415 urls << QUrl::fromLocalFile(info.absoluteFilePath());
418 QDrag *drag = new QDrag(this);
419 QMimeData *mimeData = new QMimeData;
420 mimeData->setUrls(urls);
421 drag->setMimeData(mimeData);
424 if (event->buttons() & Qt::RightButton) {
425 drag->exec(Qt::CopyAction | Qt::MoveAction);
428 drag->exec(Qt::CopyAction);
433 void FolderView::dragEnterEvent(QDragEnterEvent *event)
435 if (event->mimeData()->hasUrls()) {
436 event->acceptProposedAction();
440 QTableView::dragEnterEvent(event);
443 void FolderView::dropEvent(QDropEvent *event)
445 qDebug() << side() << "dropEvent();";
453 foreach (const QUrl &url, event->mimeData()->urls()) {
454 QString path = QFileInfo(url.toLocalFile()).canonicalFilePath();
455 if (!path.isEmpty()) {
459 qDebug() << "path is empty." << url;
463 if (list.isEmpty()) {
468 event->acceptProposedAction();
470 emit dropAccepted(list);
474 void FolderView::contextMenuEvent(QContextMenuEvent *event)
476 qDebug() << side() << "contextMenuEvent();";
478 emit requestContextMenu(event);