\r
endResetModel();\r
\r
- emit rootChanged(m_dir.absolutePath());\r
- stateChanged();\r
+// emit rootChanged(m_dir.absolutePath());\r
+// stateChanged();\r
\r
+ emit dataChanged(QModelIndex(), QModelIndex());\r
return !m_fileInfoList.isEmpty();\r
}\r
\r
endResetModel();;\r
emit dataChanged(index, this->index(index.row(), 3));\r
\r
- stateChanged();\r
+// stateChanged();\r
}\r
\r
void FileTableModel::setCheckStateAll(Qt::CheckState state)\r
m_checkStates[0] = Qt::Unchecked;\r
}\r
endResetModel();\r
+ emit dataChanged(QModelIndex(), QModelIndex());\r
\r
- stateChanged();\r
+// stateChanged();\r
}\r
\r
QFileInfo FileTableModel::fileInfo(const QModelIndex &index) const\r
setPath(path);\r
}\r
\r
-void FileTableModel::stateChanged()\r
-{\r
- int numFolder = 0;\r
- int numFile = 0;\r
- quint64 totalSize = 0;\r
- for (int n = 0; n < m_checkStates.size(); n++) {\r
- if (m_checkStates[n] == Qt::Checked) {\r
- if (m_fileInfoList[n].isDir()) {\r
- numFolder++;\r
- }\r
- else {\r
- numFile++;\r
- totalSize += m_fileInfoList[n].size();\r
- }\r
- }\r
- }\r
-\r
- emit stateChanged(numFolder, numFile, totalSize);\r
-}\r
+//void FileTableModel::stateChanged()\r
+//{\r
+// int numFolder = 0;\r
+// int numFile = 0;\r
+// quint64 totalSize = 0;\r
+// for (int n = 0; n < m_checkStates.size(); n++) {\r
+// if (m_checkStates[n] == Qt::Checked) {\r
+// if (m_fileInfoList[n].isDir()) {\r
+// numFolder++;\r
+// }\r
+// else {\r
+// numFile++;\r
+// totalSize += m_fileInfoList[n].size();\r
+// }\r
+// }\r
+// }\r
+\r
+// emit selectionChanged(numFolder, numFile, totalSize);\r
+//}\r
\r
QFileInfoList FileTableModel::checkedItems() const\r
{\r
if (index.column() == 0) {\r
m_checkStates[index.row()] = static_cast<Qt::CheckState>(value.toInt());\r
emit dataChanged(index, this->index(index.row(), 3));\r
- stateChanged();\r
+// stateChanged();\r
return true;\r
}\r
break;\r
QFont font() const { return m_font; }\r
\r
signals:\r
- void rootChanged(const QString &root);\r
- void stateChanged(int checkedFoldrs, int checkedFiles, quint64 totalSize);\r
+// void rootChanged(const QString &root);\r
+ void selectionChanged(int checkedFoldrs, int checkedFiles, quint64 totalSize);\r
\r
public slots:\r
void directoryChange(const QString &path);\r
QBrush m_HiddenBrush;\r
QBrush m_ReadonlyBrush;\r
\r
- void stateChanged();\r
+// void stateChanged();\r
\r
// QAbstractItemModel interface\r
public:\r
#include <QHeaderView>
#include <QKeyEvent>
#include <QSettings>
+#include <QMimeData>
+#include <QApplication>
+#include <QDrag>
QString FilesizeToString(quint64 size)
{
FolderView::FolderView(QWidget *parent) :
QTableView(parent),
- m_model()
+ m_model(),
+ m_dragStartPos(),
+ m_dragging(false)
{
setModel(&m_model);
+ connect(&m_model, SIGNAL(dataChanged(QModelIndex,QModelIndex)), this, SLOT(dataChanged(QModelIndex,QModelIndex)));
+
+ setDragEnabled(true);
+ setAcceptDrops(true);
+ setDropIndicatorShown(true);
}
QString FolderView::side() const
header->setSectionResizeMode(QHeaderView::ResizeToContents);
header->setSectionResizeMode(1, QHeaderView::Stretch);
- // 行の高さを設定する
- header = verticalHeader();
- header->setDefaultSectionSize(QFontMetrics(m_model.font()).height() * 1.5);
-
// 前回終了時のパスを開く
QSettings settings;
setPath(settings.value(side() + slash + IniKey_Dir).toString(), true);
QPalette pal = palette();
pal.setColor(QPalette::Base, settings.value(IniKey_ViewColorBgNormal).value<QColor>());
setPalette(pal);
+
+ // 行の高さを設定する
+ QHeaderView *header = verticalHeader();
+ header->setDefaultSectionSize(QFontMetrics(m_model.font()).height() * 1.5);
}
void FolderView::refresh()
row = m_model.rowCount() - 1;
}
setCurrentIndex(m_model.index(row, 0));
+ selectRow(row);
}
void FolderView::searchItem(const QString &text)
QString name = m_model.fileInfo(index).fileName().toLower();
if (name.indexOf(text.toLower()) != -1) {
setCurrentIndex(index);
- emit itemFound(this);
+ emit itemFound();
return;
}
}
- emit itemNotFound(this);
+ emit itemNotFound();
}
void FolderView::searchNext(const QString &text)
QString name = m_model.fileInfo(index).fileName().toLower();
if (name.indexOf(text.toLower()) != -1) {
setCurrentIndex(index);
- emit itemFound(this);
+ emit itemFound();
return;
}
}
- emit itemNotFound(this);
+ emit itemNotFound();
}
void FolderView::searchPrev(const QString &text)
QString name = m_model.fileInfo(index).fileName().toLower();
if (name.indexOf(text.toLower()) != -1) {
setCurrentIndex(index);
- emit itemFound(this);
+ emit itemFound();
return;
}
}
- emit itemNotFound(this);
+ emit itemNotFound();
}
void FolderView::setCheckStateAll(bool checked)
return m_model.fileInfo(currentIndex());
}
+QFileInfoList FolderView::checkedItems() const
+{
+ qDebug() << side() << "checkedItems()";
+
+ return m_model.checkedItems();
+}
+
QFileInfoList FolderView::selectedItems() const
{
qDebug() << side() << "selectedItems";
{
qDebug() << side() << "keyPressEvent";
- emit keyPressed(this, event);
+ emit keyPressed(event);
if (!event->isAccepted()) {
QTableView::keyPressEvent(event);
qDebug() << "KeyEvent accepted.";
}
}
+
+void FolderView::dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight, const QVector<int> &roles)
+{
+ Q_UNUSED(topLeft);
+ Q_UNUSED(bottomRight);
+ Q_UNUSED(roles);
+
+ emit dataChanged();
+}
+
+void FolderView::currentChanged(const QModelIndex ¤t, const QModelIndex &previous)
+{
+ Q_UNUSED(previous);
+
+ emit currentChanged(m_model.fileInfo(current).absoluteFilePath());
+}
+
+void FolderView::mousePressEvent(QMouseEvent *event)
+{
+ if ((event->buttons() & Qt::LeftButton) || (event->buttons() & Qt::RightButton))
+ {
+ m_dragStartPos = event->pos();
+ }
+
+ QTableView::mousePressEvent(event);
+}
+
+void FolderView::mouseMoveEvent(QMouseEvent *event)
+{
+ if (!(event->buttons() & Qt::LeftButton) &&
+ !(event->buttons() & Qt::RightButton))
+ {
+ QTableView::mouseMoveEvent(event);
+ return;
+ }
+ if ((event->pos() - m_dragStartPos).manhattanLength()
+ < QApplication::startDragDistance())
+ {
+ QTableView::mouseMoveEvent(event);
+ return;
+ }
+
+ QFileInfoList list = selectedItems();
+ if (list.isEmpty()) {
+ QTableView::mousePressEvent(event);
+ return;
+ }
+
+ QList<QUrl> urls;
+ foreach (const QFileInfo &info, list) {
+ urls << QUrl::fromLocalFile(info.absoluteFilePath());
+ }
+
+ QDrag *drag = new QDrag(this);
+ QMimeData *mimeData = new QMimeData;
+ mimeData->setUrls(urls);
+ drag->setMimeData(mimeData);
+
+ m_dragging = true;
+ if (event->buttons() & Qt::RightButton) {
+ drag->exec(Qt::CopyAction | Qt::MoveAction);
+ }
+ else {
+ drag->exec(Qt::CopyAction);
+ }
+ m_dragging = false;
+}
+
+void FolderView::dragEnterEvent(QDragEnterEvent *event)
+{
+ if (event->mimeData()->hasUrls()) {
+ event->acceptProposedAction();
+ return;
+ }
+
+ QTableView::dragEnterEvent(event);
+}
+
+void FolderView::dropEvent(QDropEvent *event)
+{
+ qDebug() << side() << "dropEvent();";
+
+ if (m_dragging) {
+ event->ignore();
+ return;
+ }
+
+ QFileInfoList list;
+ foreach (const QUrl &url, event->mimeData()->urls()) {
+ QString path = QFileInfo(url.toLocalFile()).canonicalFilePath();
+ if (!path.isEmpty()) {
+ list << path;
+ }
+ else {
+ qDebug() << "path is empty." << url;
+ }
+ }
+
+ if (list.isEmpty()) {
+ event->ignore();
+ return;
+ }
+
+ event->acceptProposedAction();
+
+ emit dropAccepted(list);
+}
// getter
QFileInfo currentItem() const;
QString dir() const { return m_model.absolutePath(); }
+ QFileInfoList checkedItems() const;
QFileInfoList selectedItems() const;
const History* history() const { return &m_history; }
QStringList nameFilters() const { return m_model.nameFilters(); }
private:
FileTableModel m_model;
History m_history;
-
+ QPoint m_dragStartPos;
+ bool m_dragging;
signals:
- void itemFound(FolderView *view);
- void itemNotFound(FolderView *view);
+ void currentChanged(const QString &path);
+ void dataChanged();
+ void dropAccepted(const QFileInfoList &list);
+ void itemFound();
+ void itemNotFound();
void retrieveStarted(const QString &path);
void retrieveFinished();
- void keyPressed(FolderView *view, QKeyEvent *event);
+ void keyPressed(QKeyEvent *event);
public slots:
+ // QAbstractItemView interface
+protected slots:
+ void currentChanged(const QModelIndex ¤t, const QModelIndex &previous);
+ void dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight, const QVector<int> &roles = QVector<int>());
// QWidget interface
protected:
void keyPressEvent(QKeyEvent *event);
-
+ void mousePressEvent(QMouseEvent *event);
+ void mouseMoveEvent(QMouseEvent *event);
+ void dragEnterEvent(QDragEnterEvent *event);
+ void dropEvent(QDropEvent *event);
};
#endif // FOLDERVIEW_H
\r
// シグナル&スロット\r
connect(folderView, SIGNAL(doubleClicked(QModelIndex)), this, SLOT(open(QModelIndex)));\r
- connect(folderView, SIGNAL(itemFound(FolderView*)), this, SLOT(itemFound(FolderView*)));\r
- connect(folderView, SIGNAL(itemNotFound(FolderView*)), this, SLOT(itemNotFound(FolderView*)));\r
- connect(folderView, SIGNAL(keyPressed(FolderView*,QKeyEvent*)), this, SLOT(keyPress(FolderView*,QKeyEvent*)));\r
+ connect(folderView, SIGNAL(dataChanged()), this, SLOT(dataChange()));\r
+ connect(folderView, SIGNAL(dropAccepted(QFileInfoList)), this, SLOT(dropAccept(QFileInfoList)));\r
+ connect(folderView, SIGNAL(currentChanged(QString)), ui->statusBar, SLOT(showMessage(QString)));\r
+ connect(folderView, SIGNAL(itemFound()), this, SLOT(itemFound()));\r
+ connect(folderView, SIGNAL(itemNotFound()), this, SLOT(itemNotFound()));\r
+ connect(folderView, SIGNAL(keyPressed(QKeyEvent*)), this, SLOT(keyPress(QKeyEvent*)));\r
connect(folderView, SIGNAL(retrieveFinished()), this, SLOT(retrieveFinish()));\r
connect(folderView, SIGNAL(retrieveStarted(QString)), this, SLOT(retrieveStart(QString)));\r
connect(searchBox, SIGNAL(textEdited(QString)), this, SLOT(searchItem(QString)));\r
checkUpdate(true);\r
}\r
\r
- ui->folderView1->repaint();\r
- ui->folderView2->repaint();\r
+ ui->folderView1->refresh();\r
+ ui->folderView2->refresh();\r
}\r
\r
MainWindow::~MainWindow()\r
void MainWindow::focusChange(QWidget *old, QWidget *now)\r
{\r
Q_UNUSED(old);\r
- Q_UNUSED(now);\r
qDebug() << "MainWindow::focusChange";\r
\r
+ if (now == ui->folderView1 || now == ui->folderView2) {\r
+ ui->statusBar->showMessage(folderView()->currentItem().absoluteFilePath());\r
+ }\r
+\r
updateActions();\r
}\r
\r
}\r
}\r
\r
-void MainWindow::itemFound(FolderView *view)\r
+void MainWindow::itemFound()\r
{\r
qDebug() << "MainWindow::itemFound";\r
\r
- SearchBox *box = searchBox(view);\r
+ SearchBox *box = searchBox(static_cast<FolderView*>(sender()));\r
QPalette pal = box->palette();\r
pal.setColor(QPalette::Text, QPalette().text().color());\r
box->setPalette(pal);\r
}\r
\r
-void MainWindow::itemNotFound(FolderView *view)\r
+void MainWindow::itemNotFound()\r
{\r
qDebug() << "MainWindow::itemNotFound";\r
\r
- SearchBox *box = searchBox(view);\r
+ SearchBox *box = searchBox(static_cast<FolderView*>(sender()));\r
QPalette pal = box->palette();\r
pal.setColor(QPalette::Text, Qt::red);\r
box->setPalette(pal);\r
ui->folderView2->refresh();\r
}\r
\r
-void MainWindow::keyPress(FolderView *view, QKeyEvent *event)\r
+void MainWindow::keyPress(QKeyEvent *event)\r
{\r
QString ksq = KeyEventToSequence(event);\r
if (ksq == "") {\r
}\r
\r
if (ksq == "Left" || ksq == "Right") {\r
+ FolderView *view = static_cast<FolderView*>(sender());\r
if (view->side() == ksq) {\r
setPathToParent();\r
}\r
worker->endAsking();\r
}\r
\r
+void MainWindow::dataChange()\r
+{\r
+ FolderView *view = static_cast<FolderView*>(sender());\r
+ QFileInfoList list = view->checkedItems();\r
+ if (list.isEmpty()) {\r
+ showNameFilters(view);\r
+ }\r
+ else {\r
+ int numFolders = 0;\r
+ int numFiles = 0;\r
+ quint64 size = 0;\r
+ foreach (const QFileInfo &info, list) {\r
+ if (info.isDir()) {\r
+ numFolders++;\r
+ }\r
+ else {\r
+ numFiles++;\r
+ size += info.size();\r
+ }\r
+ }\r
+\r
+ QString msg = QString::null;\r
+ if (numFolders > 0) {\r
+ msg += tr("%1個のフォルダ ").arg(numFolders);\r
+ }\r
+ if (numFiles > 0) {\r
+ msg += tr("%1個のファイル ").arg(numFiles);\r
+ }\r
+\r
+ if (!msg.isEmpty()) {\r
+ msg += tr("を選択 合計%1").arg(FilesizeToString(size));\r
+ }\r
+\r
+ filterLabel(view)->setText(msg);\r
+ }\r
+}\r
+\r
+void MainWindow::dropAccept(const QFileInfoList &list)\r
+{\r
+ copyItems(list, static_cast<FolderView*>(sender())->dir());\r
+}\r
+\r
+void MainWindow::copyItems(const QFileInfoList &list, const QString &tgtDir)\r
+{\r
+ QSettings settings;\r
+ if (settings.value(IniKey_ConfirmCopy).toBool()) {\r
+ if (QMessageBox::question(this, tr("確認"), tr("コピーを実行しますか?"))\r
+ != QMessageBox::Yes)\r
+ {\r
+ return;\r
+ }\r
+ }\r
+\r
+ // 上書き確認ダイアログを初期化する\r
+ m_overwriteDialog->reset();\r
+\r
+ // ワーカースレッドを作成する\r
+ CopyMoveWorker *worker = new CopyMoveWorker();\r
+ connect(worker, SIGNAL(askOverWrite(QString*,QString*,QString,QString)),\r
+ this, SLOT(askOverWrite(QString*,QString*,QString,QString)));\r
+ worker->setCopyList(&list);\r
+ worker->setTargetDir(tgtDir);\r
+ worker->setMoveMode(false);\r
+\r
+ // 進捗ダイアログを表示して、処理を開始する\r
+ OperationDialog opDlg(this);\r
+ opDlg.setWindowTitle(tr("コピー"));\r
+ opDlg.setWorker(worker);\r
+ opDlg.setAutoClose(settings.value(IniKey_AutoCloseCopy).toBool());\r
+\r
+ opDlg.exec();\r
+\r
+ settings.setValue(IniKey_AutoCloseCopy, opDlg.autoClose());\r
+\r
+ // 念のため、リフレッシュ\r
+ ui->folderView1->refresh();\r
+ ui->folderView2->refresh();\r
+}\r
+\r
void MainWindow::copyItems()\r
{\r
qDebug() << "MainWindow::copyItems";\r
return;\r
}\r
\r
+ FolderView *other = otherSideView(v);\r
+ copyItems(list, other->dir());\r
+#if 0\r
QSettings settings;\r
if (settings.value(IniKey_ConfirmCopy).toBool()) {\r
if (QMessageBox::question(this, tr("確認"), tr("コピーを実行しますか?"))\r
// 念のため、リフレッシュ\r
ui->folderView1->refresh();\r
ui->folderView2->refresh();\r
+#endif\r
}\r
\r
void MainWindow::createFile()\r
view->setSorting(flags);\r
}\r
\r
+void MainWindow::showNameFilters(FolderView *view)\r
+{\r
+ filterLabel(view)->setText(tr("フィルタ:") + view->nameFilters().join(" "));\r
+}\r
+\r
void MainWindow::searchItem(const QString &text)\r
{\r
qDebug() << "MainWindow::searchItem" << text;\r
list << "*";\r
}\r
view->setNameFilters(list);\r
- filterLabel(view)->setText(tr("フィルタ:") + list.join(" "));\r
+ showNameFilters(view);\r
}\r
\r
QLabel *MainWindow::filterLabel(const FolderView *view) const\r
void askOverWrite(QString *copyMethod, QString *alias,\r
const QString &srcPath, const QString &tgtPath);\r
\r
+ void dataChange();\r
+ void dropAccept(const QFileInfoList &list);\r
void focusChange(QWidget * old, QWidget * now);\r
- void keyPress(FolderView *view, QKeyEvent *event);\r
+ void keyPress(QKeyEvent *event);\r
void returnPressInSearchBox();\r
\r
+ void about();\r
+ void checkUpdate(bool silent = false);\r
+ void checkUpdateFinished(QNetworkReply *reply, bool silent = false);\r
+ void checkUpdateFinishedSilent(QNetworkReply *reply);\r
void chooseFolder();\r
void copyFilenameToClipboard();\r
void copyFullpathTpClipboard();\r
void executeCommand();\r
void historyBack();\r
void historyForward();\r
- void itemFound(FolderView *view);\r
- void itemNotFound(FolderView *view);\r
+ void itemFound();\r
+ void itemNotFound();\r
void markAll();\r
void markAllFiles();\r
void markAllOff();\r
void shellExecute();\r
void showFilterDialog();\r
void showHistoryDialog();\r
+ void showPreferenceDialog();\r
void showSortDialog();\r
void swapView();\r
void toggleSearchBox(bool checked);\r
-\r
-\r
-\r
-\r
- void openRequest(const QFileInfo &info);\r
- void showPreferenceDialog();\r
- void about();\r
void toggleShowHiddenFiles(bool checked);\r
void toggleShowSystemFiles(bool checked);\r
- void checkUpdate(bool silent = false);\r
- void checkUpdateFinished(QNetworkReply *reply, bool silent = false);\r
- void checkUpdateFinishedSilent(QNetworkReply *reply);\r
+\r
+ void openRequest(const QFileInfo &info);\r
void viewFinish(QWidget *sender);\r
\r
private:\r
void setEnabledAllActions(bool enable);\r
void setNameFilters(FolderView *view, const QString& filters = QString());\r
void setSorting(FolderView *view);\r
+ void showNameFilters(FolderView *view);\r
+ void copyItems(const QFileInfoList &list, const QString &tgtDir);\r
\r
// getter\r
QLabel* filterLabel(const FolderView *view) const;\r
FolderView* folderView() const;\r
SearchBox* searchBox(FolderView *view) const;\r
\r
-\r
// QWidget interface\r
protected:\r
void closeEvent(QCloseEvent *event);\r
m_convJIS->setShortcut(QKeySequence("J"));
m_convSJIS->setShortcut(QKeySequence("S"));
m_convUTF8->setShortcut(QKeySequence("U"));
- m_convUTF8->setShortcut(QKeySequence("I"));
+ m_convUTF16->setShortcut(QKeySequence("I"));
m_convUTF16BE->setShortcut(QKeySequence("J"));
m_convUTF16LE->setShortcut(QKeySequence("N"));
m_back->setShortcut(QKeySequence("Return"));