OSDN Git Service

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