From: Masayuki Satoh Date: Sun, 14 Sep 2014 14:34:21 +0000 (+0900) Subject: Ver0.21 X-Git-Url: http://git.osdn.net/view?p=gefu%2FGefu.git;a=commitdiff_plain;h=33fe545cc3664842edd38d2030e961451972bf3f Ver0.21 --- diff --git a/README.md b/README.md index 19ecaf7..13bb933 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ Gefu Gefu is an Experimental File Utility. -#### Ver0.21 +#### 2014/09/15 Ver0.21 * 設定ダイアログを刷新。 * iniファイルのパスも変更したため、設定が初期化されます。 * 画像ビューアの画質を向上。 diff --git a/ReadMe.txt b/ReadMe.txt index e9d99c0..c007e13 100644 --- a/ReadMe.txt +++ b/ReadMe.txt @@ -101,6 +101,15 @@ Twitter: https://twitter.com/miyabi_satoh ◇ 履歴 ◇ +#### 2014/09/15 Ver0.21 + * 設定ダイアログを刷新。 + * iniファイルのパスも変更したため、設定が初期化されます。 + * 画像ビューアの画質を向上。 + * アイコンを変更。 + * フォルダビューの列ヘッダーを削除。 + * 単画面モードを実装。 + * サムネイルモードを実装。 + #### 2014/08/31 Ver0.20 * ウィンドウ自体が非アクティブになったとき、両パネルとも暗くなっていたのを修正。 * ドロップ時、コピー・移動・キャンセルのポップアップメニューを出すようにした。 diff --git a/foldermodel.cpp b/foldermodel.cpp index 4f7fbec..6b4cacc 100644 --- a/foldermodel.cpp +++ b/foldermodel.cpp @@ -35,6 +35,20 @@ FolderModel::FolderModel(QObject *parent) : } /////////////////////////////////////////////////////////////////////////////// +/// \brief FolderModel::clearPixmapCache +/// +/// サムネイルキャッシュをクリアします。 +/// +void FolderModel::clearPixmapCache() +{ + beginResetModel(); + m_pixmapCacheMutex.lock(); + m_pixmapCache.clear(); + m_pixmapCacheMutex.unlock(); + endResetModel(); +} + +/////////////////////////////////////////////////////////////////////////////// /// \brief FolderModel::fileIcon /// \param index アイテムのインデックス /// \return アイコンを返します。 @@ -220,7 +234,6 @@ void FolderModel::setRootPath(const QString &path, bool addHistory) m_history << m_dir.absolutePath(); m_historyPos = m_history.size() - 1; } - m_pixmapCacheMutex.lock(); m_pixmapCache.clear(); m_pixmapCacheMutex.unlock(); diff --git a/foldermodel.h b/foldermodel.h index 1e36bbf..6e2d9da 100644 --- a/foldermodel.h +++ b/foldermodel.h @@ -23,6 +23,7 @@ public: explicit FolderModel(QObject *parent = 0); + void clearPixmapCache(); QString error() const; QIcon fileIcon(const QModelIndex &index) const; QFileInfo fileInfo(const QModelIndex &index) const; diff --git a/folderpanel.cpp b/folderpanel.cpp index f8e0c84..78c1fd1 100644 --- a/folderpanel.cpp +++ b/folderpanel.cpp @@ -214,6 +214,19 @@ void FolderPanel::searchNext(int step) } /////////////////////////////////////////////////////////////////////////////// +/// \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 検索されたアイテム /// diff --git a/folderpanel.h b/folderpanel.h index 363abb0..d2ce27f 100644 --- a/folderpanel.h +++ b/folderpanel.h @@ -24,6 +24,7 @@ public: QAbstractItemView* itemView() const; FolderModel* model() const; void searchNext(int step = 1); + void setItemView(const QString &name); void setModel(FolderModel *m); void toggleSearch(bool checked); void toggleView(bool checked); diff --git a/folderpanel.ui b/folderpanel.ui index 4c21d0d..39a5ffc 100644 --- a/folderpanel.ui +++ b/folderpanel.ui @@ -114,6 +114,9 @@ + + Qt::ScrollBarAlwaysOn + Qt::ElideMiddle diff --git a/mainwindow.cpp b/mainwindow.cpp index 7d933d9..c07fadb 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -3,7 +3,6 @@ #include "preferencedialog.h" #include "foldermodel.h" #include "folderpanel.h" -//#include "folderview.h" #include "copymoveworker.h" #include "operationdialog.h" #include "overwritedialog.h" @@ -1958,6 +1957,7 @@ void MainWindow::setViewMode(Mode mode) ui->LPanel->setViewItem(); ui->RPanel->setViewItem(); if (m_viewMode == ModeFull) { + activePanel()->folderPanel()->setItemView(focusItemView()->objectName()); activePanel()->folderPanel()->itemView()->setCurrentIndex( focusItemView()->currentIndex()); ui->FPanel->setModel(NULL); @@ -1970,6 +1970,7 @@ void MainWindow::setViewMode(Mode mode) ui->FPanel->setModel(activeModel()); ui->splitter->setVisible(false); ui->FPanel->setVisible(true); + ui->FPanel->folderPanel()->setItemView(focusItemView()->objectName()); ui->FPanel->folderPanel()->itemView()->setCurrentIndex( focusItemView()->currentIndex()); } @@ -2065,6 +2066,14 @@ void MainWindow::updateActions() if (w->objectName() == "thumbnailView") { ui->action_KeyLeft->setEnabled(false); ui->action_KeyRight->setEnabled(false); + ui->toggle_ThumbnailMode->blockSignals(true); + ui->toggle_ThumbnailMode->setChecked(true); + ui->toggle_ThumbnailMode->blockSignals(false); + } + else { + ui->toggle_ThumbnailMode->blockSignals(true); + ui->toggle_ThumbnailMode->setChecked(false); + ui->toggle_ThumbnailMode->blockSignals(false); } } else if (w->objectName() == "searchBox"){ diff --git a/thumbnaildelegate.cpp b/thumbnaildelegate.cpp index 17ae692..9eb4d1a 100644 --- a/thumbnaildelegate.cpp +++ b/thumbnaildelegate.cpp @@ -7,18 +7,10 @@ #include ThumbnailDelegate::ThumbnailDelegate(QObject *parent) : - QStyledItemDelegate(parent), - m_pixmapCache() + QStyledItemDelegate(parent) { } -void ThumbnailDelegate::model_Reset() -{ - qDebug() << "ThumbnailDelegate::model_Reset()"; - - m_pixmapCache.clear(); -} - void ThumbnailDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const { const FolderModel *model = static_cast(index.model()); @@ -71,5 +63,5 @@ QSize ThumbnailDelegate::sizeHint(const QStyleOptionViewItem &option, const QMod const FolderModel *model = static_cast(index.model()); int pointSize = model->data(index, Qt::FontRole).value().pointSize(); - return QSize(pointSize * 10, pointSize * 10 * 3 / 4); + return QSize(pointSize * 10, pointSize * 10 * 3 / 4) * m_scaleFactor; } diff --git a/thumbnaildelegate.h b/thumbnaildelegate.h index 75207b6..acaa531 100644 --- a/thumbnaildelegate.h +++ b/thumbnaildelegate.h @@ -9,14 +9,16 @@ class ThumbnailDelegate : public QStyledItemDelegate public: explicit ThumbnailDelegate(QObject *parent = 0); + void resetScale(); + void scaleDown(); + void scaleUp(); + private: - typedef QMap ImageMap; - ImageMap m_pixmapCache; + double m_scaleFactor; signals: public slots: - void model_Reset(); // QAbstractItemDelegate interface public: @@ -24,4 +26,19 @@ public: QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const; }; +inline void ThumbnailDelegate::resetScale() +{ + m_scaleFactor = 1.0; +} + +inline void ThumbnailDelegate::scaleDown() +{ + m_scaleFactor *= 0.8; +} + +inline void ThumbnailDelegate::scaleUp() +{ + m_scaleFactor *= 1.25; +} + #endif // THUMBNAILDELEGATE_H diff --git a/thumbnailview.cpp b/thumbnailview.cpp index be1ef6c..335bd4a 100644 --- a/thumbnailview.cpp +++ b/thumbnailview.cpp @@ -2,7 +2,11 @@ #include "thumbnaildelegate.h" #include "thumbnailview.h" +#include #include +#include +#include +#include /////////////////////////////////////////////////////////////////////////////// /// \brief ThumbnailView::ThumbnailView @@ -15,6 +19,10 @@ ThumbnailView::ThumbnailView(QWidget *parent) : { setItemDelegate(new ThumbnailDelegate(this)); setSpacing(12); + setDragEnabled(true); + setAcceptDrops(true); + setDropIndicatorShown(true); + setContextMenuPolicy(Qt::DefaultContextMenu); } /////////////////////////////////////////////////////////////////////////////// @@ -34,28 +42,174 @@ void ThumbnailView::initialize(MainWindow *w) installEventFilter(w); viewport()->installEventFilter(w); } +/////////////////////////////////////////////////////////////////////////////// +/// \brief ThumbnailView::selectedItems +/// \return +/// +QFileInfoList ThumbnailView::selectedItems() const +{ + QFileInfoList list = folderModel()->markedItems(); + if (list.isEmpty()) { + list << folderModel()->fileInfo(currentIndex()); + } -void ThumbnailView::scaleUp() + return list; +} + +/////////////////////////////////////////////////////////////////////////////// +/// \brief ThumbnailView::model_PreReset +/// +/// モデルリセット前の処理 +/// +void ThumbnailView::model_PreReset() +{ + qDebug() << "ThumbnailView::model_PreReset()"; + + // 現在行と名前を保存しておく + if (model() && currentIndex().isValid()) { + m_saveRow = currentIndex().row(); + m_saveName = folderModel()->fileName(currentIndex()); + m_savePath = folderModel()->rootPath(); + } + else { + m_saveRow = 0; + m_saveName = QString::null; + m_savePath = QString::null; + } +} + +/////////////////////////////////////////////////////////////////////////////// +/// \brief ThumbnailView::model_PostReset +/// +/// モデルリセット後の処理 +/// +void ThumbnailView::model_PostReset() { - // TODO + qDebug() << "ThumbnailView::model_PostReset()"; + + // フォルダが変わった場合は先頭行を選択する + if (m_savePath != folderModel()->rootPath()) { + setCurrentIndex(model()->index(0, 0)); + return; + } + + // 保存した名前と同名アイテムが見つかれば、再選択する + for (int row = 0; row < model()->rowCount(); row++) { + QModelIndex index = model()->index(row, 0); + if (folderModel()->fileName(index) == m_saveName) { + setCurrentIndex(index); + return; + } + } + + // 同名アイテムが見つからなければ、行を維持する + if (m_saveRow >= model()->rowCount()) { + m_saveRow = model()->rowCount() - 1; + } + setCurrentIndex(model()->index(m_saveRow, 1)); + } void ThumbnailView::scaleDown() { - // TODO + qDebug() << "ThumbnailView::scaleDown()"; + + static_cast(itemDelegate())->scaleDown(); + folderModel()->clearPixmapCache(); +} + +void ThumbnailView::scaleUp() +{ + qDebug() << "ThumbnailView::scaleUp()"; + + static_cast(itemDelegate())->scaleUp(); + folderModel()->clearPixmapCache(); } void ThumbnailView::setModel(QAbstractItemModel *model) { - ThumbnailDelegate *delegate = static_cast(itemDelegate()); if (this->model()) { - this->model()->disconnect(delegate); + this->model()->disconnect(this); } QListView::setModel(model); if (this->model()) { - connect(this->model(), SIGNAL(modelReset()), delegate, SLOT(model_Reset())); + connect(this->model(), SIGNAL(modelAboutToBeReset()), this, SLOT(model_PreReset())); + connect(this->model(), SIGNAL(modelReset()), this, SLOT(model_PostReset())); + } +} + + +void ThumbnailView::mousePressEvent(QMouseEvent *event) +{ + m_dragStartPos = QPoint(); + if ((event->buttons() & Qt::LeftButton) || + (event->buttons() & Qt::RightButton)) + { + QModelIndex index = indexAt(event->pos()); + if (index.isValid() && folderModel()->fileName(index) != "..") { + m_dragStartPos = event->pos(); + } } + + QListView::mousePressEvent(event); } +void ThumbnailView::mouseMoveEvent(QMouseEvent *event) +{ + if (!(event->buttons() & Qt::LeftButton) && + !(event->buttons() & Qt::RightButton)) + { + QListView::mouseMoveEvent(event); + return; + } + if (m_dragStartPos.isNull() || + (event->pos() - m_dragStartPos).manhattanLength() < qApp->startDragDistance()) + { + QListView::mouseMoveEvent(event); + return; + } + + QFileInfoList list = selectedItems(); + if (list.size() == 1 && list[0].fileName() == "..") { + QListView::mouseMoveEvent(event); + return; + } + + QList 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; + drag->exec(Qt::CopyAction); + m_dragging = false; + m_dragStartPos = QPoint(); + +} + +void ThumbnailView::dragEnterEvent(QDragEnterEvent *event) +{ + if (event->mimeData()->hasUrls()) { + event->acceptProposedAction(); + return; + } + + QListView::dragEnterEvent(event); +} + +void ThumbnailView::setVisible(bool visible) +{ + if (visible) { + static_cast(itemDelegate())->resetScale(); + folderModel()->clearPixmapCache(); + } + + QListView::setVisible(visible); +} diff --git a/thumbnailview.h b/thumbnailview.h index d5c3c27..63e341c 100644 --- a/thumbnailview.h +++ b/thumbnailview.h @@ -2,23 +2,36 @@ #define THUMBNAILVIEW_H #include "abstractview.h" +#include "foldermodel.h" #include - class MainWindow; class ThumbnailView : public QListView, public AbstractView { Q_OBJECT + Q_PROPERTY(bool dragging MEMBER m_dragging READ isDragging()) + public: explicit ThumbnailView(QWidget *parent = 0); - void initialize(MainWindow *w); + void initialize(MainWindow *w); + bool isDragging(); + FolderModel* folderModel() const; + QFileInfoList selectedItems() const; -signals: +private: + QPoint m_dragStartPos; + bool m_dragging; + int m_saveRow; + QString m_savePath; + QString m_saveName; -public slots: +signals: +private slots: + void model_PreReset(); + void model_PostReset(); // AbstractView interface public: @@ -29,6 +42,25 @@ public: public: void setModel(QAbstractItemModel *model); + // QWidget interface +protected: + void mousePressEvent(QMouseEvent *event); + void mouseMoveEvent(QMouseEvent *event); + void dragEnterEvent(QDragEnterEvent *event); + + // QWidget interface +public slots: + void setVisible(bool visible); }; +inline bool ThumbnailView::isDragging() +{ + return m_dragging; +} + +inline FolderModel *ThumbnailView::folderModel() const +{ + return static_cast(model()); +} + #endif // THUMBNAILVIEW_H