Gefu is an Experimental File Utility.
-#### Ver0.21
+#### 2014/09/15 Ver0.21
* 設定ダイアログを刷新。
* iniファイルのパスも変更したため、設定が初期化されます。
* 画像ビューアの画質を向上。
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
}\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
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
\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
}
///////////////////////////////////////////////////////////////////////////////
+/// \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 検索されたアイテム
///
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);
</item>
<item>
<widget class="ThumbnailView" name="thumbnailView">
+ <property name="verticalScrollBarPolicy">
+ <enum>Qt::ScrollBarAlwaysOn</enum>
+ </property>
<property name="textElideMode">
<enum>Qt::ElideMiddle</enum>
</property>
#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
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
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
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
#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());
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;
}
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:
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
#include "thumbnaildelegate.h"
#include "thumbnailview.h"
+#include <QApplication>
#include <QDebug>
+#include <QDrag>
+#include <QMimeData>
+#include <QMouseEvent>
///////////////////////////////////////////////////////////////////////////////
/// \brief ThumbnailView::ThumbnailView
{
setItemDelegate(new ThumbnailDelegate(this));
setSpacing(12);
+ setDragEnabled(true);
+ setAcceptDrops(true);
+ setDropIndicatorShown(true);
+ setContextMenuPolicy(Qt::DefaultContextMenu);
}
///////////////////////////////////////////////////////////////////////////////
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);
+}
#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:
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