OSDN Git Service

Ver0.21
authorMasayuki Satoh <miyabi.satoh@gmail.com>
Sun, 14 Sep 2014 14:34:21 +0000 (23:34 +0900)
committerMasayuki Satoh <miyabi.satoh@gmail.com>
Sun, 14 Sep 2014 14:34:21 +0000 (23:34 +0900)
12 files changed:
README.md
ReadMe.txt
foldermodel.cpp
foldermodel.h
folderpanel.cpp
folderpanel.h
folderpanel.ui
mainwindow.cpp
thumbnaildelegate.cpp
thumbnaildelegate.h
thumbnailview.cpp
thumbnailview.h

index 19ecaf7..13bb933 100644 (file)
--- 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ファイルのパスも変更したため、設定が初期化されます。
   * 画像ビューアの画質を向上。
index e9d99c0..c007e13 100644 (file)
  Twitter: https://twitter.com/miyabi_satoh\r
 \r
 ◇ 履歴 ◇\r
+#### 2014/09/15 Ver0.21\r
+  * 設定ダイアログを刷新。\r
+    * iniファイルのパスも変更したため、設定が初期化されます。\r
+  * 画像ビューアの画質を向上。\r
+  * アイコンを変更。\r
+  * フォルダビューの列ヘッダーを削除。\r
+  * 単画面モードを実装。\r
+  * サムネイルモードを実装。\r
+\r
 #### 2014/08/31 Ver0.20\r
   * ウィンドウ自体が非アクティブになったとき、両パネルとも暗くなっていたのを修正。\r
   * ドロップ時、コピー・移動・キャンセルのポップアップメニューを出すようにした。\r
index 4f7fbec..6b4cacc 100644 (file)
@@ -35,6 +35,20 @@ FolderModel::FolderModel(QObject *parent) :
 }\r
 \r
 ///////////////////////////////////////////////////////////////////////////////\r
+/// \brief FolderModel::clearPixmapCache\r
+///\r
+/// サムネイルキャッシュをクリアします。\r
+///\r
+void FolderModel::clearPixmapCache()\r
+{\r
+    beginResetModel();\r
+    m_pixmapCacheMutex.lock();\r
+    m_pixmapCache.clear();\r
+    m_pixmapCacheMutex.unlock();\r
+    endResetModel();\r
+}\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
 /// \brief FolderModel::fileIcon\r
 /// \param index    アイテムのインデックス\r
 /// \return アイコンを返します。\r
@@ -220,7 +234,6 @@ void FolderModel::setRootPath(const QString &path, bool addHistory)
                 m_history << m_dir.absolutePath();\r
                 m_historyPos = m_history.size() - 1;\r
             }\r
-\r
             m_pixmapCacheMutex.lock();\r
             m_pixmapCache.clear();\r
             m_pixmapCacheMutex.unlock();\r
index 1e36bbf..6e2d9da 100644 (file)
@@ -23,6 +23,7 @@ public:
 \r
     explicit FolderModel(QObject *parent = 0);\r
 \r
+    void            clearPixmapCache();\r
     QString         error() const;\r
     QIcon           fileIcon(const QModelIndex &index) const;\r
     QFileInfo       fileInfo(const QModelIndex &index) const;\r
index f8e0c84..78c1fd1 100644 (file)
@@ -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<QWidget*>(name)->setVisible(true);
+}
+
+///////////////////////////////////////////////////////////////////////////////
 /// \brief FolderPanel::showSearchResult
 /// \param index    検索されたアイテム
 ///
index 363abb0..d2ce27f 100644 (file)
@@ -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);
index 4c21d0d..39a5ffc 100644 (file)
    </item>
    <item>
     <widget class="ThumbnailView" name="thumbnailView">
+     <property name="verticalScrollBarPolicy">
+      <enum>Qt::ScrollBarAlwaysOn</enum>
+     </property>
      <property name="textElideMode">
       <enum>Qt::ElideMiddle</enum>
      </property>
index 7d933d9..c07fadb 100644 (file)
@@ -3,7 +3,6 @@
 #include "preferencedialog.h"\r
 #include "foldermodel.h"\r
 #include "folderpanel.h"\r
-//#include "folderview.h"\r
 #include "copymoveworker.h"\r
 #include "operationdialog.h"\r
 #include "overwritedialog.h"\r
@@ -1958,6 +1957,7 @@ void MainWindow::setViewMode(Mode mode)
         ui->LPanel->setViewItem();\r
         ui->RPanel->setViewItem();\r
         if (m_viewMode == ModeFull) {\r
+            activePanel()->folderPanel()->setItemView(focusItemView()->objectName());\r
             activePanel()->folderPanel()->itemView()->setCurrentIndex(\r
                         focusItemView()->currentIndex());\r
             ui->FPanel->setModel(NULL);\r
@@ -1970,6 +1970,7 @@ void MainWindow::setViewMode(Mode mode)
             ui->FPanel->setModel(activeModel());\r
             ui->splitter->setVisible(false);\r
             ui->FPanel->setVisible(true);\r
+            ui->FPanel->folderPanel()->setItemView(focusItemView()->objectName());\r
             ui->FPanel->folderPanel()->itemView()->setCurrentIndex(\r
                             focusItemView()->currentIndex());\r
         }\r
@@ -2065,6 +2066,14 @@ void MainWindow::updateActions()
         if (w->objectName() == "thumbnailView") {\r
             ui->action_KeyLeft->setEnabled(false);\r
             ui->action_KeyRight->setEnabled(false);\r
+            ui->toggle_ThumbnailMode->blockSignals(true);\r
+            ui->toggle_ThumbnailMode->setChecked(true);\r
+            ui->toggle_ThumbnailMode->blockSignals(false);\r
+        }\r
+        else {\r
+            ui->toggle_ThumbnailMode->blockSignals(true);\r
+            ui->toggle_ThumbnailMode->setChecked(false);\r
+            ui->toggle_ThumbnailMode->blockSignals(false);\r
         }\r
     }\r
     else if (w->objectName() == "searchBox"){\r
index 17ae692..9eb4d1a 100644 (file)
@@ -7,18 +7,10 @@
 #include <QStylePainter>
 
 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<const FolderModel*>(index.model());
@@ -71,5 +63,5 @@ QSize ThumbnailDelegate::sizeHint(const QStyleOptionViewItem &option, const QMod
     const FolderModel *model = static_cast<const FolderModel*>(index.model());
     int pointSize = model->data(index, Qt::FontRole).value<QFont>().pointSize();
 
-    return QSize(pointSize * 10, pointSize * 10 * 3 / 4);
+    return QSize(pointSize * 10, pointSize * 10 * 3 / 4) * m_scaleFactor;
 }
index 75207b6..acaa531 100644 (file)
@@ -9,14 +9,16 @@ class ThumbnailDelegate : public QStyledItemDelegate
 public:
     explicit ThumbnailDelegate(QObject *parent = 0);
 
+    void    resetScale();
+    void    scaleDown();
+    void    scaleUp();
+
 private:
-    typedef QMap<QString, QPixmap> 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
index be1ef6c..335bd4a 100644 (file)
@@ -2,7 +2,11 @@
 #include "thumbnaildelegate.h"
 #include "thumbnailview.h"
 
+#include <QApplication>
 #include <QDebug>
+#include <QDrag>
+#include <QMimeData>
+#include <QMouseEvent>
 
 ///////////////////////////////////////////////////////////////////////////////
 /// \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<ThumbnailDelegate*>(itemDelegate())->scaleDown();
+    folderModel()->clearPixmapCache();
+}
+
+void ThumbnailView::scaleUp()
+{
+    qDebug() << "ThumbnailView::scaleUp()";
+
+    static_cast<ThumbnailDelegate*>(itemDelegate())->scaleUp();
+    folderModel()->clearPixmapCache();
 }
 
 void ThumbnailView::setModel(QAbstractItemModel *model)
 {
-    ThumbnailDelegate *delegate = static_cast<ThumbnailDelegate*>(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<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;
+    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<ThumbnailDelegate*>(itemDelegate())->resetScale();
+        folderModel()->clearPixmapCache();
+    }
+
+    QListView::setVisible(visible);
+}
index d5c3c27..63e341c 100644 (file)
@@ -2,23 +2,36 @@
 #define THUMBNAILVIEW_H
 
 #include "abstractview.h"
+#include "foldermodel.h"
 
 #include <QListView>
-
 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<FolderModel*>(model());
+}
+
 #endif // THUMBNAILVIEW_H