-#include "folderpanel.h"\r
-#include "mainwindow.h"\r
-#include "ui_folderpanel.h"\r
-#include <QFileIconProvider>\r
-#include <QCheckBox>\r
-#include <QMessageBox>\r
-#include <QKeyEvent>\r
-#include <QDebug>\r
-#include <QDateTime>\r
-#include <QDesktopServices>\r
-\r
-FolderPanel::FolderPanel(QWidget *parent) :\r
- QWidget(parent),\r
- ui(new Ui::FolderPanel)\r
-{\r
- ui->setupUi(this);\r
-\r
- // MainWindowのスロットに接続する\r
- MainWindow *mainWnd = this->mainWindow();\r
- if (mainWnd) {\r
- connect(ui->fileTable, SIGNAL(cellDoubleClicked(int,int)), mainWnd, SLOT(on_action_Open_triggered()));\r
- }\r
-\r
- // ヘッダーラベルを設定する\r
- QStringList labels;\r
- labels << tr("") << tr("Name") << tr("Size") << tr("Date");\r
- ui->fileTable->setHorizontalHeaderLabels(labels);\r
-\r
- // イベントフィルタを設定する\r
- ui->fileTable->installEventFilter(this);\r
-\r
- // リサイズ時の動作を設定する\r
- ui->fileTable->horizontalHeader()->setSectionResizeMode(0, QHeaderView::ResizeToContents);\r
- ui->fileTable->horizontalHeader()->setSectionResizeMode(1, QHeaderView::Stretch);\r
- ui->fileTable->horizontalHeader()->setSectionResizeMode(2, QHeaderView::ResizeToContents);\r
- ui->fileTable->horizontalHeader()->setSectionResizeMode(3, QHeaderView::ResizeToContents);\r
-\r
- // フォルダの要素を表示\r
- m_dir.setFilter(QDir::NoDot | QDir::AllEntries);\r
- m_dir.setSorting(QDir::DirsFirst | QDir::Name);\r
- setCurrentFolder(QDir::homePath());\r
- ui->fileTable->resizeColumnsToContents();\r
-}\r
-\r
-FolderPanel::~FolderPanel()\r
-{\r
- delete ui;\r
-}\r
-\r
-QTableWidget* FolderPanel::fileTable()\r
-{\r
- return ui->fileTable;\r
-}\r
-\r
-const QTableWidget* FolderPanel::fileTable() const\r
-{\r
- return ui->fileTable;\r
-}\r
-\r
-MainWindow* FolderPanel::mainWindow()\r
-{\r
- foreach (QWidget *w, qApp->topLevelWidgets()) {\r
- if (w->objectName() == "MainWindow") {\r
- return static_cast<MainWindow*>(w);\r
- }\r
- }\r
- return NULL;\r
-}\r
-\r
-bool FolderPanel::eventFilter(QObject *obj, QEvent *event)\r
-{\r
- if (event->type() == QEvent::KeyPress) {\r
- QKeyEvent *keyEvent = static_cast<QKeyEvent*>(event);\r
- switch (keyEvent->key()) {\r
- case Qt::Key_A: {\r
- MainWindow *mainWnd = this->mainWindow();\r
- if (mainWnd) {\r
- if (keyEvent->modifiers() & Qt::ShiftModifier) {\r
- mainWnd->onMarkAllOff();\r
- }\r
- else {\r
- mainWnd->onMarkAllFiles();\r
- }\r
- }\r
- keyEvent->accept();\r
- return true; }\r
-\r
- case Qt::Key_I: {\r
- MainWindow *mainWnd = this->mainWindow();\r
- if (mainWnd) {\r
- mainWnd->onMarkInvert();\r
- }\r
- keyEvent->accept();\r
- return true; }\r
-\r
- case Qt::Key_J: {\r
- MainWindow *mainWnd = this->mainWindow();\r
- if (mainWnd) {\r
- mainWnd->onMoveDown();\r
- }\r
- keyEvent->accept();\r
- return true; }\r
-\r
- case Qt::Key_K: {\r
- MainWindow *mainWnd = this->mainWindow();\r
- if (mainWnd) {\r
- mainWnd->onMoveUp();\r
- }\r
- keyEvent->accept();\r
- return true; }\r
-\r
- case Qt::Key_O: {\r
- MainWindow *mainWnd = this->mainWindow();\r
- if (mainWnd) {\r
- mainWnd->onViewFromOther();\r
- }\r
- keyEvent->accept();\r
- return true; }\r
-\r
- case Qt::Key_Q:\r
- qApp->quit();\r
- keyEvent->accept();\r
- return true;\r
-\r
- case Qt::Key_W: {\r
- MainWindow *mainWnd = this->mainWindow();\r
- if (mainWnd) {\r
- mainWnd->onViewSwap();\r
- }\r
- keyEvent->accept();\r
- return true; }\r
-\r
- case Qt::Key_Space: {\r
- MainWindow *mainWnd = this->mainWindow();\r
- if (mainWnd) {\r
- mainWnd->onMarkToggle();\r
- }\r
- keyEvent->accept();\r
- return true; }\r
-\r
- case Qt::Key_Tab: {\r
- MainWindow *mainWnd = this->mainWindow();\r
- if (mainWnd) {\r
- mainWnd->onMoveOther();\r
- }\r
- keyEvent->accept();\r
- return true; }\r
-\r
- case Qt::Key_Backspace: {\r
- MainWindow *mainWnd = this->mainWindow();\r
- if (mainWnd) {\r
- mainWnd->onMoveParent();\r
- }\r
- keyEvent->accept();\r
- return true; }\r
- }\r
- }\r
-\r
- return QWidget::eventFilter(obj, event);\r
-}\r
-\r
-void FolderPanel::setCurrentFolder(const QString &path)\r
-{\r
- m_dir.setPath(QDir::cleanPath(path));\r
- QFileInfoList list = m_dir.entryInfoList();\r
-\r
- if (list.empty()) {\r
- QMessageBox::critical(\r
- this,\r
- tr("エラー"),\r
- tr("フォルダが存在しないか利用できません。"));\r
- return;\r
- }\r
-\r
- ui->fileTable->model()->removeRows(0, ui->fileTable->rowCount());\r
- for (int i = 0; i < list.size(); i++) {\r
- QFileInfo info = list.at(i);\r
- if (info.fileName() == ".." && m_dir.isRoot()) {\r
- continue;\r
- }\r
-\r
- int row = ui->fileTable->rowCount();\r
- ui->fileTable->insertRow(row);\r
-\r
- // ファイル名とアイコン\r
- QTableWidgetItem *iName = new QTableWidgetItem(info.fileName());\r
- iName->setFlags(iName->flags() ^ Qt::ItemIsEditable);\r
- if (info.fileName() == "..") {\r
- iName->setIcon(QIcon(":/images/Up.png"));\r
- }\r
- else {\r
- iName->setIcon(QFileIconProvider().icon(info));\r
- }\r
- ui->fileTable->setItem(row, 1, iName);\r
-\r
- // サイズ\r
- QString str;\r
- if (info.isDir()) {\r
- str = tr("<DIR>");\r
- }\r
- else if (info.size() >= 1024 * 1024 * 1024) {\r
- str = tr("%1GB").arg(int(info.size() / (1024 * 1024 * 1024)));\r
- }\r
- else if (info.size() >= 1024 * 1024) {\r
- str = tr("%1MB").arg(int(info.size() / (1024 * 1024)));\r
- }\r
- else if (info.size() >= 1024) {\r
- str = tr("%1KB").arg(int(info.size() / 1024));\r
- }\r
- else {\r
- str = tr("%1B").arg(info.size());\r
- }\r
- QTableWidgetItem *iSize = new QTableWidgetItem(str);\r
- iSize->setFlags(iSize->flags() ^ Qt::ItemIsEditable);\r
- iSize->setTextAlignment(Qt::AlignRight | Qt::AlignVCenter);\r
-\r
- ui->fileTable->setItem(row, 2, iSize);\r
-\r
- // 最終更新日時\r
- QTableWidgetItem *iDateTime = new QTableWidgetItem(\r
- info.lastModified().toString("yy/MM/dd hh:mm"));\r
- iDateTime->setFlags(iDateTime->flags() ^ Qt::ItemIsEditable);\r
- ui->fileTable->setItem(row, 3, iDateTime);\r
-\r
- // シグナル処理の関係で、チェックボックスは最後に追加する\r
- QTableWidgetItem *iCheck = new QTableWidgetItem(tr(""));\r
- iCheck->setFlags(iCheck->flags() ^ Qt::ItemIsEditable);\r
- if (info.fileName() != "..") {\r
- iCheck->setFlags(iCheck->flags() | Qt::ItemIsUserCheckable);\r
- iCheck->setCheckState(Qt::Unchecked);\r
- }\r
- ui->fileTable->setItem(row, 0, iCheck);\r
-\r
- }\r
- ui->fileTable->selectRow(0);\r
- ui->fileTable->resizeRowsToContents();\r
-\r
- ui->locationField->setText(m_dir.absolutePath());\r
-}\r
-\r
-void FolderPanel::on_fileTable_cellChanged(int row, int column)\r
-{\r
- if (column == 0) {\r
- if (ui->fileTable->item(row, 0)->checkState() == Qt::Checked) {\r
- for (int n = 0; n < 4; n++) {\r
- ui->fileTable->item(row, n)->setForeground(Qt::red);\r
- ui->fileTable->item(row, n)->setBackground(Qt::green);\r
- }\r
- }\r
- else {\r
- for (int n = 0; n < 4; n++) {\r
- ui->fileTable->item(row, n)->setForeground(Qt::black);\r
- ui->fileTable->item(row, n)->setBackground(Qt::white);\r
- }\r
- }\r
- ui->fileTable->selectRow(row);\r
- }\r
-}\r
-\r
-//void FolderPanel::on_fileTable_doubleClicked(const QModelIndex &index)\r
-//{\r
-// QString strName = ui->fileTable->item(index.row(), 1)->text();\r
-// QString strPath = m_dir.absoluteFilePath(strName);\r
-// QFileInfo info(strPath);\r
-\r
-// if (info.isDir()) {\r
-// setCurrentFolder(strPath);\r
-// }\r
-// else {\r
-// // TODO:ファイルの場合はどうしよう?\r
-// }\r
-//}\r
-\r
-void FolderPanel::on_locationField_editingFinished()\r
-{\r
- ui->locationField->blockSignals(true);\r
-\r
- QString path = ui->locationField->text();\r
- setCurrentFolder(path);\r
-\r
- ui->locationField->blockSignals(false);\r
-}\r
+#include "common.h"
+#include "mainwindow.h"
+#include "searchbox.h"
+#include "locationbox.h"
+#include "folderpanel.h"
+#include "ui_folderpanel.h"
+
+#include <QDebug>
+
+FolderPanel::FolderPanel(QWidget *parent) :
+ QWidget(parent),
+ ui(new Ui::FolderPanel)
+{
+ ui->setupUi(this);
+}
+
+FolderPanel::~FolderPanel()
+{
+ delete ui;
+}
+
+void FolderPanel::initialize(MainWindow *mainWnd)
+{
+ qDebug() << "FolderPanel::initialize();";
+
+ // シグナル&スロット
+ connect(ui->folderView, SIGNAL(dataChanged()), this, SLOT(dataChange()));
+ connect(ui->folderView, SIGNAL(doubleClicked(QModelIndex)), mainWnd, SLOT(open(QModelIndex)));
+ connect(ui->folderView, SIGNAL(dropAccepted(QFileInfoList)), mainWnd, SLOT(dropAccept(QFileInfoList)));
+ connect(ui->folderView, SIGNAL(currentChanged(QFileInfo)), mainWnd, SLOT(currentChange(QFileInfo)));
+ connect(ui->folderView, SIGNAL(itemFound()), mainWnd, SLOT(itemFound()));
+ connect(ui->folderView, SIGNAL(itemNotFound()), mainWnd, SLOT(itemNotFound()));
+ connect(ui->folderView, SIGNAL(retrieveFinished()), mainWnd, SLOT(retrieveFinish()));
+ connect(ui->folderView, SIGNAL(requestContextMenu(QContextMenuEvent*)), mainWnd, SLOT(showContextMenu(QContextMenuEvent*)));
+ connect(ui->folderView, SIGNAL(retrieveStarted(QString)), mainWnd, SLOT(retrieveStart(QString)));
+ connect(ui->folderView, SIGNAL(retrieveStarted(QString)), ui->locationBox, SLOT(setText(QString)));
+ connect(ui->searchBox, SIGNAL(textEdited(QString)), mainWnd, SLOT(searchItem(QString)));
+ connect(ui->searchBox, SIGNAL(returnPressed()), mainWnd, SLOT(returnPressInSearchBox()));
+
+ // 初期状態では検索ボックスは非表示
+ ui->searchBox->setVisible(false);
+
+ // ロケーションボックスを初期化する
+ ui->locationBox->initialize();
+
+ // フォルダビューを初期化する
+ ui->folderView->initialize();
+}
+
+LocationBox *FolderPanel::locationBox() const
+{
+ return ui->locationBox;
+}
+
+FolderView *FolderPanel::folderView() const
+{
+ return ui->folderView;
+}
+
+SearchBox *FolderPanel::searchBox() const
+{
+ return ui->searchBox;
+}
+
+QLabel *FolderPanel::filterLabel() const
+{
+ return ui->filterLabel;
+}
+
+void FolderPanel::setNameFilters(const QString &filters)
+{
+ QStringList list = filters.split(" ", QString::SkipEmptyParts);
+ if (list.isEmpty()) {
+ list << "*";
+ }
+ ui->folderView->setNameFilters(list);
+ showNameFilters();
+}
+
+void FolderPanel::showNameFilters()
+{
+ ui->filterLabel->setText(tr("フィルタ:") + ui->folderView->nameFilters().join(" "));
+}
+
+void FolderPanel::dataChange()
+{
+ qDebug() << "FolderPanel::dataChange();";
+
+ FolderView *view = static_cast<FolderView*>(sender());
+ Q_CHECK_PTR(view);
+
+ QFileInfoList list = view->checkedItems();
+ if (list.isEmpty()) {
+ showNameFilters();
+ }
+ else {
+ int numFolders = 0;
+ int numFiles = 0;
+ quint64 size = 0;
+ foreach (const QFileInfo &info, list) {
+ if (info.isDir()) {
+ numFolders++;
+ }
+ else {
+ numFiles++;
+ size += info.size();
+ }
+ }
+
+ QString msg = QString::null;
+ if (numFolders > 0) {
+ msg += tr("%1個のフォルダ ").arg(numFolders);
+ }
+ if (numFiles > 0) {
+ msg += tr("%1個のファイル ").arg(numFiles);
+ }
+
+ if (!msg.isEmpty()) {
+ msg += tr("を選択 合計%1").arg(FilesizeToString(size));
+ }
+
+ ui->filterLabel->setText(msg);
+ }
+}
+
+void FolderPanel::focusInEvent(QFocusEvent *)
+{
+ qDebug() << "FolderPanel::focusInEvent();";
+
+ ui->folderView->setFocus();
+}