OSDN Git Service

Ver0.21
[gefu/Gefu.git] / thumbnailview.cpp
1 #include "mainwindow.h"
2 #include "thumbnaildelegate.h"
3 #include "thumbnailview.h"
4
5 #include <QApplication>
6 #include <QDebug>
7 #include <QDrag>
8 #include <QMimeData>
9 #include <QMouseEvent>
10
11 ///////////////////////////////////////////////////////////////////////////////
12 /// \brief ThumbnailView::ThumbnailView
13 /// \param parent   親ウィジェット
14 ///
15 /// コンストラクタ
16 ///
17 ThumbnailView::ThumbnailView(QWidget *parent) :
18     QListView(parent)
19 {
20     setItemDelegate(new ThumbnailDelegate(this));
21     setSpacing(12);
22     setDragEnabled(true);
23     setAcceptDrops(true);
24     setDropIndicatorShown(true);
25     setContextMenuPolicy(Qt::DefaultContextMenu);
26 }
27
28 ///////////////////////////////////////////////////////////////////////////////
29 /// \brief ThumbnailView::initialize
30 /// \param w    メインウィンドウオブジェクト
31 ///
32 /// 初期化処理を行います。
33 ///
34 void ThumbnailView::initialize(MainWindow *w)
35 {
36     qDebug() << "ThumbnailView::initialize()";
37
38     connect(this, SIGNAL(doubleClicked(QModelIndex)), w, SLOT(onOpen(QModelIndex)));
39     connect(selectionModel(), SIGNAL(currentChanged(QModelIndex,QModelIndex)),
40             w, SLOT(view_currentChanged(QModelIndex,QModelIndex)));
41
42     installEventFilter(w);
43     viewport()->installEventFilter(w);
44 }
45 ///////////////////////////////////////////////////////////////////////////////
46 /// \brief ThumbnailView::selectedItems
47 /// \return
48 ///
49 QFileInfoList ThumbnailView::selectedItems() const
50 {
51     QFileInfoList list = folderModel()->markedItems();
52     if (list.isEmpty()) {
53         list << folderModel()->fileInfo(currentIndex());
54     }
55
56     return list;
57 }
58
59 ///////////////////////////////////////////////////////////////////////////////
60 /// \brief ThumbnailView::model_PreReset
61 ///
62 /// モデルリセット前の処理
63 ///
64 void ThumbnailView::model_PreReset()
65 {
66     qDebug() << "ThumbnailView::model_PreReset()";
67
68     // 現在行と名前を保存しておく
69     if (model() && currentIndex().isValid()) {
70         m_saveRow = currentIndex().row();
71         m_saveName = folderModel()->fileName(currentIndex());
72         m_savePath = folderModel()->rootPath();
73     }
74     else {
75         m_saveRow = 0;
76         m_saveName = QString::null;
77         m_savePath = QString::null;
78     }
79 }
80
81 ///////////////////////////////////////////////////////////////////////////////
82 /// \brief ThumbnailView::model_PostReset
83 ///
84 /// モデルリセット後の処理
85 ///
86 void ThumbnailView::model_PostReset()
87 {
88     qDebug() << "ThumbnailView::model_PostReset()";
89
90     // フォルダが変わった場合は先頭行を選択する
91     if (m_savePath != folderModel()->rootPath()) {
92         setCurrentIndex(model()->index(0, 0));
93         return;
94     }
95
96     // 保存した名前と同名アイテムが見つかれば、再選択する
97     for (int row = 0; row < model()->rowCount(); row++) {
98         QModelIndex index = model()->index(row, 0);
99         if (folderModel()->fileName(index) == m_saveName) {
100             setCurrentIndex(index);
101             return;
102         }
103     }
104
105     // 同名アイテムが見つからなければ、行を維持する
106     if (m_saveRow >= model()->rowCount()) {
107         m_saveRow = model()->rowCount() - 1;
108     }
109     setCurrentIndex(model()->index(m_saveRow, 1));
110
111 }
112
113 void ThumbnailView::scaleDown()
114 {
115     qDebug() << "ThumbnailView::scaleDown()";
116
117     static_cast<ThumbnailDelegate*>(itemDelegate())->scaleDown();
118     folderModel()->clearPixmapCache();
119 }
120
121 void ThumbnailView::scaleUp()
122 {
123     qDebug() << "ThumbnailView::scaleUp()";
124
125     static_cast<ThumbnailDelegate*>(itemDelegate())->scaleUp();
126     folderModel()->clearPixmapCache();
127 }
128
129 void ThumbnailView::setModel(QAbstractItemModel *model)
130 {
131     if (this->model()) {
132         this->model()->disconnect(this);
133     }
134
135     QListView::setModel(model);
136
137     if (this->model()) {
138         connect(this->model(), SIGNAL(modelAboutToBeReset()), this, SLOT(model_PreReset()));
139         connect(this->model(), SIGNAL(modelReset()), this, SLOT(model_PostReset()));
140     }
141 }
142
143
144 void ThumbnailView::mousePressEvent(QMouseEvent *event)
145 {
146     m_dragStartPos = QPoint();
147     if ((event->buttons() & Qt::LeftButton) ||
148         (event->buttons() & Qt::RightButton))
149     {
150         QModelIndex index = indexAt(event->pos());
151         if (index.isValid() && folderModel()->fileName(index) != "..") {
152             m_dragStartPos = event->pos();
153         }
154     }
155
156     QListView::mousePressEvent(event);
157 }
158
159 void ThumbnailView::mouseMoveEvent(QMouseEvent *event)
160 {
161     if (!(event->buttons() & Qt::LeftButton) &&
162         !(event->buttons() & Qt::RightButton))
163     {
164         QListView::mouseMoveEvent(event);
165         return;
166     }
167     if (m_dragStartPos.isNull() ||
168         (event->pos() - m_dragStartPos).manhattanLength() < qApp->startDragDistance())
169     {
170         QListView::mouseMoveEvent(event);
171         return;
172     }
173
174     QFileInfoList list = selectedItems();
175     if (list.size() == 1 && list[0].fileName() == "..") {
176         QListView::mouseMoveEvent(event);
177         return;
178     }
179
180     QList<QUrl> urls;
181     foreach (const QFileInfo &info, list) {
182         urls << QUrl::fromLocalFile(info.absoluteFilePath());
183     }
184
185     QDrag *drag = new QDrag(this);
186     QMimeData *mimeData = new QMimeData;
187     mimeData->setUrls(urls);
188     drag->setMimeData(mimeData);
189
190     m_dragging = true;
191     drag->exec(Qt::CopyAction);
192     m_dragging = false;
193     m_dragStartPos = QPoint();
194
195 }
196
197 void ThumbnailView::dragEnterEvent(QDragEnterEvent *event)
198 {
199     if (event->mimeData()->hasUrls()) {
200         event->acceptProposedAction();
201         return;
202     }
203
204     QListView::dragEnterEvent(event);
205 }
206
207 void ThumbnailView::setVisible(bool visible)
208 {
209     if (visible) {
210         static_cast<ThumbnailDelegate*>(itemDelegate())->resetScale();
211         folderModel()->clearPixmapCache();
212     }
213
214     QListView::setVisible(visible);
215 }