X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=folderpanel.cpp;h=0b168c837bf6881af61328fd978912ac46babfe0;hb=606ff8dc1c1abcd474d99f32eab21c6869554ed7;hp=17ee31e9e55d3e99d53efc3f3d119b70771d019c;hpb=c5f45e82f79afadea849070fff223c6475b541d9;p=gefu%2FGefu.git diff --git a/folderpanel.cpp b/folderpanel.cpp index 17ee31e..0b168c8 100644 --- a/folderpanel.cpp +++ b/folderpanel.cpp @@ -1,495 +1,324 @@ -#include "folderpanel.h" -#include "mainwindow.h" -#include "ui_folderpanel.h" -#include -#include -#include -#include -#include -#include - -FolderPanel::FolderPanel(QWidget *parent) : - QWidget(parent), - ui(new Ui::FolderPanel), - m_dir(), - m_IconFactory(), - m_fsWatcher(new QFileSystemWatcher(this)), - m_bUpdating(false) -{ - ui->setupUi(this); - - // MainWindowのスロットに接続する - MainWindow *mainWnd = this->mainWindow(); - if (mainWnd) { - connect(ui->fileTable, SIGNAL(cellDoubleClicked(int,int)), mainWnd, SLOT(onActionOpen())); - } - - // ヘッダーラベルを設定する - QStringList labels; - labels << tr("") << tr("名前") << tr("サイズ") << tr("更新日時"); - ui->fileTable->setHorizontalHeaderLabels(labels); - - // イベントフィルタを設定する - ui->fileTable->installEventFilter(this); - - // リサイズ時の動作を設定する - ui->fileTable->horizontalHeader()->setSectionResizeMode(0, QHeaderView::ResizeToContents); - ui->fileTable->horizontalHeader()->setSectionResizeMode(1, QHeaderView::Stretch); - ui->fileTable->horizontalHeader()->setSectionResizeMode(2, QHeaderView::ResizeToContents); - ui->fileTable->horizontalHeader()->setSectionResizeMode(3, QHeaderView::ResizeToContents); - - // フォルダの要素を表示 - m_dir.setFilter(QDir::NoDot | QDir::AllEntries); - m_dir.setSorting(QDir::DirsFirst | QDir::Name); -} - -FolderPanel::~FolderPanel() -{ - UninstallWatcher(); - delete ui; -} - -QTableWidget* FolderPanel::fileTable() -{ - return ui->fileTable; -} - -const QTableWidget* FolderPanel::fileTable() const -{ - return ui->fileTable; -} - -MainWindow* FolderPanel::mainWindow() -{ - foreach (QWidget *w, qApp->topLevelWidgets()) { - if (w->objectName() == "MainWindow") { - return static_cast(w); - } - } - return NULL; -} - -bool FolderPanel::eventFilter(QObject *obj, QEvent *event) -{ - if (this->mainWindow() && event->type() == QEvent::KeyPress) { - QKeyEvent *keyEvent = static_cast(event); - switch (keyEvent->key()) { - case Qt::Key_A: - // A すべてのファイルをマーク - // Shift + A すべてマーク - if (keyEvent->modifiers() == Qt::NoModifier) { - this->mainWindow()->onMarkAllFiles(); - keyEvent->accept(); - return true; - } - else if (keyEvent->modifiers() == Qt::ShiftModifier) { - this->mainWindow()->onMarkAll(); - keyEvent->accept(); - return true; - } - break; - - case Qt::Key_C: - // Ctrl + C ファイルをコピー - if (keyEvent->modifiers() == Qt::ControlModifier) { - this->mainWindow()->onCmdCopy(); - keyEvent->accept(); - return true; - } - break; - - case Qt::Key_D: - // Ctrl + D ファイルを削除 - if (keyEvent->modifiers() == Qt::ControlModifier) { - this->mainWindow()->onCmdDelete(); - keyEvent->accept(); - return true; - } - break; - - case Qt::Key_E: - // E エディタで開く - // Ctrl + E ファイルを作成 - if (keyEvent->modifiers() == Qt::NoModifier) { - } - else if (keyEvent->modifiers() == Qt::ControlModifier) { - this->mainWindow()->onCmdNewFile(); - keyEvent->accept(); - return true; - } - break; - - case Qt::Key_G: - // G カーソルを先頭に移動 - // Shift + G カーソルを末尾に移動 - if (keyEvent->modifiers() == Qt::NoModifier) { - this->mainWindow()->onMoveCursorBegin(); - keyEvent->accept(); - return true; - } - else if (keyEvent->modifiers() == Qt::ShiftModifier) { - this->mainWindow()->onMoveCursorEnd(); - keyEvent->accept(); - return true; - } - break; - - case Qt::Key_H: - // H ホームフォルダに移動 - // Shift + H 隠しファイルを表示/非表示 - if (keyEvent->modifiers() == Qt::NoModifier) { - this->mainWindow()->onMoveHome(); - keyEvent->accept(); - return true; - } - else if (keyEvent->modifiers() == Qt::ShiftModifier) { - this->mainWindow()->onViewHidden(); - keyEvent->accept(); - return true; - } - break; - - case Qt::Key_I: - // I マークを反転 - if (keyEvent->modifiers() == Qt::NoModifier) { - this->mainWindow()->onMarkInvert(); - keyEvent->accept(); - return true; - } - break; - - case Qt::Key_J: - // J カーソルを下に移動 - // Shift + J フォルダを選択して移動 - if (keyEvent->modifiers() == Qt::NoModifier) { - this->mainWindow()->onMoveCursorDown(); - keyEvent->accept(); - return true; - } - else if (keyEvent->modifiers() == Qt::ShiftModifier) { - this->mainWindow()->onMoveJump(); - keyEvent->accept(); - return true; - } - break; - - case Qt::Key_K: - // K カーソルを上に移動 - // Ctrl + K フォルダを作成 - if (keyEvent->modifiers() == Qt::NoModifier) { - this->mainWindow()->onMoveCursorUp(); - keyEvent->accept(); - return true; - } - else if (keyEvent->modifiers() == Qt::ControlModifier) { - this->mainWindow()->onCmdNewFolder(); - keyEvent->accept(); - return true; - } - break; - - case Qt::Key_M: - // M 開く - // Shift + M アプリケーションで開く - // Ctrl + M ファイルの移動 - if (keyEvent->modifiers() == Qt::NoModifier) { - this->mainWindow()->onActionOpen(); - keyEvent->accept(); - return true; - } - else if (keyEvent->modifiers() == Qt::ShiftModifier) { - this->mainWindow()->onActionExec(); - keyEvent->accept(); - return true; - } - else if (keyEvent->modifiers() == Qt::ControlModifier) { - this->mainWindow()->onCmdMove(); - keyEvent->accept(); - return true; - } - break; - - case Qt::Key_O: - // O 隣のパネルと同じフォルダを表示 - // Shift + O 隣のパネルに同じフォルダを表示 - if (keyEvent->modifiers() == Qt::NoModifier) { - this->mainWindow()->onViewFromOther(); - keyEvent->accept(); - return true; - } - else if (keyEvent->modifiers() == Qt::ShiftModifier) { - this->mainWindow()->onViewToOther(); - keyEvent->accept(); - return true; - } - break; - - case Qt::Key_Q: - // Q アプリケーションを終了 - if (keyEvent->modifiers() == Qt::NoModifier) { - this->mainWindow()->onActionQuit(); - keyEvent->accept(); - return true; - } - break; - - case Qt::Key_R: - // R 履歴を表示 - // Ctrl + R 名前を変更 - if (keyEvent->modifiers() == Qt::NoModifier) { - } - else if (keyEvent->modifiers() == Qt::ControlModifier) { - this->mainWindow()->onCmdRename(); - keyEvent->accept(); - return true; - } - break; - - case Qt::Key_U: - // U すべてのマークを解除 - if (keyEvent->modifiers() == Qt::NoModifier) { - this->mainWindow()->onMarkAllOff(); - keyEvent->accept(); - return true; - } - break; - - case Qt::Key_W: - // W 表示フォルダを交換 - if (keyEvent->modifiers() == Qt::NoModifier) { - this->mainWindow()->onViewSwap(); - keyEvent->accept(); - return true; - } - break; - - case Qt::Key_X: - // X コマンドを実行 - if (keyEvent->modifiers() == Qt::NoModifier) { - this->mainWindow()->onActionCommand(); - keyEvent->accept(); - return true; - } - break; - - case Qt::Key_Question: - // ? アプリケーション情報を表示 - if (keyEvent->modifiers() == Qt::NoModifier) { - this->mainWindow()->onHelpAbout(); - keyEvent->accept(); - return true; - } - break; - - case Qt::Key_Space: - // マーク/解除 - if (keyEvent->modifiers() == Qt::NoModifier) { - this->mainWindow()->onMarkToggle(); - keyEvent->accept(); - return true; - } - break; - - case Qt::Key_Tab: - // 隣のパネルに移動 - if (keyEvent->modifiers() == Qt::NoModifier) { - this->mainWindow()->onMoveOther(); - keyEvent->accept(); - return true; - } - break; - - case Qt::Key_Backspace: - // BS 親フォルダに移動 - // Shift + BS ルートフォルダに移動 - if (keyEvent->modifiers() == Qt::NoModifier) { - this->mainWindow()->onMoveParent(); - keyEvent->accept(); - return true; - } - else if (keyEvent->modifiers() == Qt::ShiftModifier) { - this->mainWindow()->onMoveRoot(); - keyEvent->accept(); - return true; - } - break; - - case Qt::Key_Return: - // RET 開く - // Shift + RET アプリケーションで開く - if (keyEvent->modifiers() == Qt::NoModifier) { - this->mainWindow()->onActionOpen(); - keyEvent->accept(); - return true; - } - else if (keyEvent->modifiers() == Qt::ShiftModifier) { - this->mainWindow()->onActionExec(); - keyEvent->accept(); - return true; - } - break; - } - } - - return QWidget::eventFilter(obj, event); -} - -void FolderPanel::setCurrentFolder(const QString &path) -{ - mainWindow()->setStatusText(tr("ファイルリストを更新中...")); - QString curDir = m_dir.absolutePath(); - m_dir.setPath(QDir::cleanPath(path)); - m_dir.canonicalPath(); - QFileInfoList list = m_dir.entryInfoList(); - - if (list.empty()) { - QMessageBox::critical( - this, - tr("エラー"), - tr("フォルダが存在しないか利用できません。")); - m_dir.setPath(curDir); - ui->locationField->setText(curDir); - mainWindow()->setStatusText(tr("レディ")); - return; - } - - // フォルダの変更監視 - InstallWatcher(); - - m_bUpdating = true; - ui->fileTable->model()->removeRows(0, ui->fileTable->rowCount()); - for (int i = 0; i < list.size(); i++) { - QFileInfo info = list.at(i); - if (info.fileName() == ".." && m_dir.isRoot()) { - continue; - } - - int row = ui->fileTable->rowCount(); - ui->fileTable->insertRow(row); - - // ファイル名とアイコン - QTableWidgetItem *iName = new QTableWidgetItem(info.fileName()); - iName->setFlags(iName->flags() ^ Qt::ItemIsEditable); - if (info.fileName() == "..") { - iName->setIcon(QIcon(":/images/Up.png")); - } - else { - iName->setIcon(m_IconFactory.icon(info)); - } - ui->fileTable->setItem(row, 1, iName); - - // サイズ - QString str; - if (info.isDir()) { - str = tr(""); - } - else if (info.size() >= 1024 * 1024 * 1024) { - str = tr("%1GB").arg(int(info.size() / (1024 * 1024 * 1024))); - } - else if (info.size() >= 1024 * 1024) { - str = tr("%1MB").arg(int(info.size() / (1024 * 1024))); - } - else if (info.size() >= 1024) { - str = tr("%1KB").arg(int(info.size() / 1024)); - } - else { - str = tr("%1B").arg(info.size()); - } - QTableWidgetItem *iSize = new QTableWidgetItem(str); - iSize->setFlags(iSize->flags() ^ Qt::ItemIsEditable); - iSize->setTextAlignment(Qt::AlignRight | Qt::AlignVCenter); - - ui->fileTable->setItem(row, 2, iSize); - - // 最終更新日時 - QTableWidgetItem *iDateTime = new QTableWidgetItem( - info.lastModified().toString("yy/MM/dd hh:mm")); - iDateTime->setFlags(iDateTime->flags() ^ Qt::ItemIsEditable); - ui->fileTable->setItem(row, 3, iDateTime); - - // シグナル処理の関係で、チェックボックスは最後に追加する - QTableWidgetItem *iCheck = new QTableWidgetItem(tr("")); - iCheck->setFlags(iCheck->flags() ^ Qt::ItemIsEditable); - if (info.fileName() != "..") { - iCheck->setFlags(iCheck->flags() | Qt::ItemIsUserCheckable); - iCheck->setCheckState(Qt::Unchecked); - } - ui->fileTable->setItem(row, 0, iCheck); - - } - ui->fileTable->selectRow(0); - ui->fileTable->resizeRowsToContents(); - - ui->locationField->setText(m_dir.absolutePath()); - mainWindow()->setStatusText(tr("レディ")); - m_bUpdating = false; -} - -void FolderPanel::InstallWatcher() -{ - UninstallWatcher(); - - m_fsWatcher = new QFileSystemWatcher(this); - m_fsWatcher->addPath(m_dir.absolutePath()); - connect(m_fsWatcher, SIGNAL(directoryChanged(QString)), - this, SLOT(on_directoryChanged(QString))); -} - -void FolderPanel::UninstallWatcher() -{ - if (m_fsWatcher != NULL) { - delete m_fsWatcher; - } - m_fsWatcher = NULL; -} - -void FolderPanel::on_fileTable_cellChanged(int row, int column) -{ - if (column == 0) { - if (ui->fileTable->item(row, 0)->checkState() == Qt::Checked) { - for (int n = 0; n < 4; n++) { - ui->fileTable->item(row, n)->setForeground(Qt::red); - ui->fileTable->item(row, n)->setBackground(Qt::green); - } - } - else { - for (int n = 0; n < 4; n++) { - ui->fileTable->item(row, n)->setForeground(Qt::black); - ui->fileTable->item(row, n)->setBackground(Qt::white); - } - } - ui->fileTable->selectRow(row); - } -} - -void FolderPanel::on_locationField_editingFinished() -{ - ui->locationField->blockSignals(true); - - QString path = ui->locationField->text(); - setCurrentFolder(path); - - ui->locationField->blockSignals(false); -} - -void FolderPanel::on_directoryChanged(QString) -{ - int row = ui->fileTable->currentRow(); - this->setCurrentFolder(m_dir.absolutePath()); - if (row >= ui->fileTable->rowCount()) { - row = ui->fileTable->rowCount() - 1; - } - ui->fileTable->selectRow(row); -} - -void FolderPanel::on_fileTable_itemSelectionChanged() -{ - if (m_bUpdating) { - return; - } - - int row = ui->fileTable->currentRow(); - if (0 <= row && row < ui->fileTable->rowCount()) { - mainWindow()->setStatusText(ui->fileTable->item(row, 1)->text()); - } -} +#include "global.h" +#include "preferences.h" +#include "mainwindow.h" +#include "folderpanel.h" +#include "ui_folderpanel.h" + +#include +#include +#include + +/////////////////////////////////////////////////////////////////////////////// +/// \brief FolderPanel::FolderPanel +/// \param parent 親ウィジェット +/// +/// コンストラクタ +/// +FolderPanel::FolderPanel(QWidget *parent) : + QWidget(parent), + ui(new Ui::FolderPanel), + m_mainWnd(NULL) +{ + ui->setupUi(this); + ui->searchBox->setText(""); + ui->searchBox->setVisible(false); + ui->thumbnailView->setVisible(false); +} + +/////////////////////////////////////////////////////////////////////////////// +/// \brief FolderPanel::~FolderPanel +/// +/// デストラクタ +/// +FolderPanel::~FolderPanel() +{ + delete ui; +} + +/////////////////////////////////////////////////////////////////////////////// +/// \brief FolderPanel::initialize +/// \param w メインウィンドウオブジェクト +/// +/// 初期化処理を行います。 +/// +void FolderPanel::initialize(MainWindow *w) +{ + qDebug() << "FolderPanel::initialize();"; + + // フォルダビューを初期化する + ui->folderView->initialize(w); + // サムネイルビューを初期化する + ui->thumbnailView->initialize(w); + + connect(ui->bookmarkBtn, SIGNAL(clicked()), w, SLOT(onAddBookmark())); +} + +/////////////////////////////////////////////////////////////////////////////// +/// \brief FolderPanel::itemView +/// \return アイテムビューを返します。 +/// +QAbstractItemView *FolderPanel::itemView() const +{ + if (ui->thumbnailView->isVisible()) { + return ui->thumbnailView; + } + return ui->folderView; +} + +/////////////////////////////////////////////////////////////////////////////// +/// \brief FolderPanel::model +/// \return 関連付けられたフォルダモデルを返します。 +/// +FolderModel *FolderPanel::model() const +{ + return static_cast(ui->folderView->model()); +} + +/////////////////////////////////////////////////////////////////////////////// +/// \brief FolderPanel::setModel +/// \param m 設定するモデル +/// +/// モデルを設定します。 +/// +void FolderPanel::setModel(FolderModel *m) +{ + qDebug() << "FolderPanel::setModel()" << m; + if (model()) { + model()->disconnect(this); + } + + ui->folderView->setModel(m); + ui->thumbnailView->setModel(m); + + if (model()) { + connect(model(), SIGNAL(dataChanged(QModelIndex,QModelIndex)), + this, SLOT(model_dataChanged(QModelIndex,QModelIndex))); + connect(model(), SIGNAL(modelReset()), this, SLOT(model_Reset())); + + model_Reset(); + model_dataChanged(QModelIndex(), QModelIndex()); + } +} + +/////////////////////////////////////////////////////////////////////////////// +/// \brief FolderPanel::toggleSearch +/// \param checked メニューのチェック状態 +/// +/// 検索ボックスの表示/非表示を切り替えます。 +/// +void FolderPanel::toggleSearch(bool checked) +{ + qDebug() << "FolderPanel::toggleSearch()" << checked; + if (!isVisible()) { + return; + } + + if (checked) { + if (!model()->isActive()) { + return; + } + + ui->searchBox->setVisible(true); + ui->searchBox->setFocus(); + ui->searchBox->selectAll(); + } + else { + if (!ui->searchBox->isVisible()) { + return; + } + + if (ui->searchBox->hasFocus()) { + itemView()->setFocus(); + } + ui->searchBox->setVisible(false); + } +} + +/////////////////////////////////////////////////////////////////////////////// +/// \brief FolderPanel::toggleView +/// \param checked メニューのチェック状態 +/// +/// リスト/サムネイルを切り替えます。 +/// +void FolderPanel::toggleView(bool checked) +{ + QModelIndex index = itemView()->currentIndex(); + if (checked) { + ui->folderView->setVisible(false); + ui->thumbnailView->setVisible(true); + ui->thumbnailView->setFocus(); + } + else { + ui->thumbnailView->setVisible(false); + ui->folderView->setVisible(true); + ui->folderView->setFocus(); + } + itemView()->setCurrentIndex(index); +} + +/////////////////////////////////////////////////////////////////////////////// +/// \brief FolderPanel::updateAppearance +/// +/// 外観を変更します。 +/// +void FolderPanel::updateAppearance(const Preferences &prefs) +{ + qDebug() << "FolderPanel::updateAppearance()"; + + QPalette pal; + + pal = ui->filterLabel->palette(); + pal.setColor(ui->filterLabel->backgroundRole(), prefs.folderViewBgColor(model()->isActive())); + pal.setColor(ui->filterLabel->foregroundRole(), prefs.folderViewFgColor(model()->isActive())); + ui->filterLabel->setAutoFillBackground(true); + ui->filterLabel->setPalette(pal); + + pal = ui->locationBox->palette(); + pal.setColor(QPalette::Base, prefs.locationBoxBgColor(model()->isActive())); + pal.setColor(QPalette::Text, prefs.locationBoxFgColor(model()->isActive())); + ui->locationBox->setPalette(pal); + ui->locationBox->setFont(prefs.getLocationBoxFont()); + + pal = ui->searchBox->palette(); + pal.setColor(QPalette::Base, prefs.getSearchBoxBgColor()); + pal.setColor(QPalette::Text, prefs.getSearchBoxFgColor()); + ui->searchBox->setPalette(pal); + ui->searchBox->setFont(prefs.getSearchBoxFont()); + + pal = ui->folderView->palette(); + pal.setColor(QPalette::Base, prefs.folderViewBgColor(model()->isActive())); + ui->folderView->setPalette(pal); + + pal = ui->thumbnailView->palette(); + pal.setColor(QPalette::Base, prefs.folderViewBgColor(model()->isActive())); + ui->thumbnailView->setPalette(pal); + + QHeaderView *header = ui->folderView->verticalHeader(); + QFont font = prefs.getFolderViewFont(); + header->setDefaultSectionSize(QFontMetrics(font).height() * prefs.getLineHeight()); +} + +/////////////////////////////////////////////////////////////////////////////// +/// \brief FolderPanel::searchNext +/// \param step 次なら1, 前なら-1 +/// +/// 次または前のアイテムを検索します。 +/// +void FolderPanel::searchNext(int step) +{ + qDebug() << "FolderPanel::searchNext()" << step; + + QModelIndex index = model()->search(ui->searchBox->text(), + itemView()->currentIndex(), + step); + showSearchResult(index); +} + +/////////////////////////////////////////////////////////////////////////////// +/// \brief FolderPanel::setItemView +/// \param name "folderView"または"thumbnailView" +/// +/// 指定されたビューを可視状態にします。 +/// +void FolderPanel::setItemView(const QString &name) +{ + ui->folderView->setVisible(false); + ui->thumbnailView->setVisible(false); + findChild(name)->setVisible(true); +} + +/////////////////////////////////////////////////////////////////////////////// +/// \brief FolderPanel::showSearchResult +/// \param index 検索されたアイテム +/// +/// 検索結果を表示します。 +/// +void FolderPanel::showSearchResult(const QModelIndex &index) +{ + Preferences prefs(this); + + QPalette pal = ui->searchBox->palette(); + if (index.isValid()) { + itemView()->setCurrentIndex(index); + pal.setColor(QPalette::Base, prefs.getSearchBoxBgColor()); + pal.setColor(QPalette::Text, prefs.getSearchBoxFgColor()); + } + else { + pal.setColor(QPalette::Base, prefs.getSearchBoxUnmatchBgColor()); + pal.setColor(QPalette::Text, prefs.getSearchBoxUnmatchFgColor()); + } + ui->searchBox->setPalette(pal); +} + +/////////////////////////////////////////////////////////////////////////////// +/// \brief FolderPanel::model_dataChanged +/// \param topLeft (使用しません) +/// \param bottomRight (使用しません) +/// +/// アイテムの選択状態変更に伴う処理を行います。 +/// +void FolderPanel::model_dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight) +{ + Q_UNUSED(topLeft); + Q_UNUSED(bottomRight); + + QFileInfoList list = model()->markedItems(); + if (list.isEmpty()) { + ui->filterLabel->setText(tr("フィルタ:%1").arg(model()->nameFilters().join(" "))); + } + else { + int numFolders = 0; + int numFiles = 0; + qint64 totalSize = 0; + foreach (const QFileInfo &fi, list) { + if (fi.isDir()) { + ++numFolders; + } + else { + ++numFiles; + totalSize += fi.size(); + } + } + + QString text; + if (numFolders > 0) { + text += tr("%1個のフォルダ ").arg(numFolders); + } + if (numFiles > 0) { + text += tr("%1個のファイル ").arg(numFiles); + } + if (!text.isEmpty()) { + text += tr("を選択 合計%1").arg(fileSizeToString(totalSize)); + } + ui->filterLabel->setText(text); + } +} + +/////////////////////////////////////////////////////////////////////////////// +/// \brief FolderPanel::model_Reset +/// +/// モデルリセット後の処理を行います。 +/// +void FolderPanel::model_Reset() +{ + ui->locationBox->setText(model()->rootPath()); + ui->filterLabel->setText(tr("フィルタ:%1").arg(model()->nameFilters().join(" "))); +} + +/////////////////////////////////////////////////////////////////////////////// +/// \brief FolderPanel::on_searchBox_textEdited +/// \param arg1 入力テキスト +/// +/// 検索ボックスのテキストが変更された場合の処理を行います。 +/// +void FolderPanel::on_searchBox_textEdited(const QString &arg1) +{ + if (arg1.right(1) == "/") { + ui->searchBox->setText(arg1.left(arg1.size() - 1)); + // 検索終了 + itemView()->setFocus(); + } + else { + showSearchResult(model()->search(arg1)); + } +}