1 #include "foldermodel.h"
2 #include "folderview_private.h"
6 #include <QDragEnterEvent>
11 ///////////////////////////////////////////////////////////////////////////////
12 /// \brief FolderView_Private::FolderView_Private
13 /// \param parent 親オブジェクト
17 FolderView_Private::FolderView_Private(QAbstractItemView *parent) :
26 m_view->setDragEnabled(true);
27 m_view->setAcceptDrops(true);
28 m_view->setDropIndicatorShown(true);
29 m_view->setContextMenuPolicy(Qt::DefaultContextMenu);
32 ///////////////////////////////////////////////////////////////////////////////
33 /// \brief FolderView_Private::onDragEnter
34 /// \param obj イベントが発生したオブジェクト
35 /// \param e ドラッグエンターイベントオブジェクト
36 /// \return 処理した場合はtrueを返します。
38 bool FolderView_Private::onDragEnter(QObject *obj, QDragEnterEvent *e)
42 if (e->mimeData()->hasUrls()) {
43 e->acceptProposedAction();
49 ///////////////////////////////////////////////////////////////////////////////
50 /// \brief FolderView_Private::onDrop
51 /// \param obj イベントが発生したオブジェクト
52 /// \param e ドロップイベントオブジェクト
53 /// \return 処理した場合はtrueを返します。
55 bool FolderView_Private::onDrop(QObject *obj, QDropEvent *e)
65 foreach (const QUrl &url, e->mimeData()->urls()) {
66 QString path = QFileInfo(url.toLocalFile()).canonicalFilePath();
67 if (!path.isEmpty()) {
71 qDebug() << "drop path is empty." << url;
76 // ローカルファイルのドロップでなければ何もしない
80 e->acceptProposedAction();
83 QAction *actCopy = menu.addAction(tr("コピー"));
84 QAction *actMove = menu.addAction(tr("移動"));
86 menu.addAction(tr("キャンセル"));
88 QAction *selected = menu.exec(m_view->mapToGlobal(e->pos()));
89 FolderModel *model = static_cast<FolderModel*>(m_view->model());
90 if (selected == actMove) {
91 emit moveItems(list, model->rootPath());
93 else if (selected == actCopy) {
94 emit copyItems(list, model->rootPath());
99 ///////////////////////////////////////////////////////////////////////////////
100 /// \brief FolderView_Private::onMouseMove
101 /// \param obj イベントが発生したオブジェクト
102 /// \param e マウスイベントオブジェクト
103 /// \return 処理した場合はtrueを返します。
105 bool FolderView_Private::onMouseMove(QObject *obj, QMouseEvent *e)
109 if (!(e->buttons() & Qt::LeftButton) && !(e->buttons() & Qt::RightButton))
114 if (m_dragStartPos.isNull() ||
115 (e->pos() - m_dragStartPos).manhattanLength() < 5)
120 FolderModel *model = static_cast<FolderModel*>(m_view->model());
121 QFileInfoList list = model->markedItems();
122 if (list.isEmpty()) {
123 list << model->fileInfo(m_view->currentIndex());
125 if (list.size() == 1 && list[0].fileName() == "..") {
130 foreach (const QFileInfo &info, list) {
131 urls << QUrl::fromLocalFile(info.absoluteFilePath());
134 QDrag *drag = new QDrag(this);
135 QMimeData *mimeData = new QMimeData;
136 mimeData->setUrls(urls);
137 drag->setMimeData(mimeData);
140 drag->exec(Qt::CopyAction);
142 m_dragStartPos = QPoint();
147 ///////////////////////////////////////////////////////////////////////////////
148 /// \brief FolderView_Private::onMousePress
149 /// \param obj イベントが発生したオブジェクト
150 /// \param e マウスイベントオブジェクト
151 /// \return 処理した場合はtrueを返します。
153 bool FolderView_Private::onMousePress(QObject *obj, QMouseEvent *e)
157 m_dragStartPos = QPoint();
158 if ((e->buttons() & Qt::LeftButton) || (e->buttons() & Qt::RightButton))
160 FolderModel *model = static_cast<FolderModel*>(m_view->model());
161 QModelIndex index = m_view->indexAt(e->pos());
162 if (index.isValid() && model->fileName(index) != "..") {
163 m_dragStartPos = e->pos();
171 ///////////////////////////////////////////////////////////////////////////////
172 /// \brief FolderView_Private::model_PostReset
176 void FolderView_Private::model_PostReset()
178 FolderModel *model = static_cast<FolderModel*>(sender());
180 // フォルダが変わった場合は先頭行を選択する
181 if (m_savePath != model->rootPath()) {
182 m_view->setCurrentIndex(model->index(0, 0));
186 // 保存した名前と同名アイテムが見つかれば、再選択する
187 for (int row = 0; row < model->rowCount(); row++) {
188 QModelIndex index = model->index(row, 0);
189 if (model->fileName(index) == m_saveName) {
190 m_view->setCurrentIndex(index);
195 // 同名アイテムが見つからなければ、行を維持する
196 if (m_saveRow >= model->rowCount()) {
197 m_saveRow = model->rowCount() - 1;
199 m_view->setCurrentIndex(model->index(m_saveRow, 1));
202 ///////////////////////////////////////////////////////////////////////////////
203 /// \brief FolderView_Private::model_PreReset
207 void FolderView_Private::model_PreReset()
210 if (m_view->model() && m_view->currentIndex().isValid()) {
211 FolderModel *model = static_cast<FolderModel*>(m_view->model());
212 m_saveRow = m_view->currentIndex().row();
213 m_saveName = model->fileName(m_view->currentIndex());
214 m_savePath = model->rootPath();
218 m_saveName = QString::null;
219 m_savePath = QString::null;
223 ///////////////////////////////////////////////////////////////////////////////
224 /// \brief FolderView_Private::eventFilter
225 /// \param obj イベントが発生したオブジェクト
226 /// \param e イベントオブジェクト
227 /// \return 処理した場合はtrueを返します。
229 bool FolderView_Private::eventFilter(QObject *obj, QEvent *e)
231 if (e->type() == QEvent::MouseButtonPress) {
232 return onMousePress(obj, static_cast<QMouseEvent*>(e));
234 else if (e->type() == QEvent::MouseMove) {
235 return onMouseMove(obj, static_cast<QMouseEvent*>(e));
237 else if (e->type() == QEvent::DragEnter) {
238 return onDragEnter(obj, static_cast<QDragEnterEvent*>(e));
240 else if (e->type() == QEvent::Drop) {
241 return onDrop(obj, static_cast<QDropEvent*>(e));