1 #include "folderpanel.h"
\r
2 #include "mainwindow.h"
\r
3 #include "ui_folderpanel.h"
\r
5 #include <QMessageBox>
\r
9 #include <QDesktopServices>
\r
11 FolderPanel::FolderPanel(QWidget *parent) :
\r
13 ui(new Ui::FolderPanel),
\r
16 m_fsWatcher(new QFileSystemWatcher(this)),
\r
21 // MainWindowのスロットに接続する
\r
22 MainWindow *mainWnd = this->mainWindow();
\r
24 connect(ui->fileTable, SIGNAL(cellDoubleClicked(int,int)), mainWnd, SLOT(onActionOpen()));
\r
29 labels << tr("") << tr("名前") << tr("サイズ") << tr("更新日時");
\r
30 ui->fileTable->setHorizontalHeaderLabels(labels);
\r
33 ui->fileTable->installEventFilter(this);
\r
36 ui->fileTable->horizontalHeader()->setSectionResizeMode(0, QHeaderView::ResizeToContents);
\r
37 ui->fileTable->horizontalHeader()->setSectionResizeMode(1, QHeaderView::Stretch);
\r
38 ui->fileTable->horizontalHeader()->setSectionResizeMode(2, QHeaderView::ResizeToContents);
\r
39 ui->fileTable->horizontalHeader()->setSectionResizeMode(3, QHeaderView::ResizeToContents);
\r
42 m_dir.setFilter(QDir::NoDot | QDir::AllEntries);
\r
43 m_dir.setSorting(QDir::DirsFirst | QDir::Name);
\r
46 FolderPanel::~FolderPanel()
\r
52 QTableWidget* FolderPanel::fileTable()
\r
54 return ui->fileTable;
\r
57 const QTableWidget* FolderPanel::fileTable() const
\r
59 return ui->fileTable;
\r
62 MainWindow* FolderPanel::mainWindow()
\r
64 foreach (QWidget *w, qApp->topLevelWidgets()) {
\r
65 if (w->objectName() == "MainWindow") {
\r
66 return static_cast<MainWindow*>(w);
\r
72 bool FolderPanel::eventFilter(QObject *obj, QEvent *event)
\r
74 if (this->mainWindow() && event->type() == QEvent::KeyPress) {
\r
75 QKeyEvent *keyEvent = static_cast<QKeyEvent*>(event);
\r
76 switch (keyEvent->key()) {
\r
80 if (keyEvent->modifiers() == Qt::NoModifier) {
\r
81 this->mainWindow()->onMarkAllFiles();
\r
85 else if (keyEvent->modifiers() == Qt::ShiftModifier) {
\r
86 this->mainWindow()->onMarkAll();
\r
93 // Ctrl + C ファイルをコピー
\r
94 if (keyEvent->modifiers() == Qt::ControlModifier) {
\r
95 this->mainWindow()->onCmdCopy();
\r
102 // Ctrl + D ファイルを削除
\r
103 if (keyEvent->modifiers() == Qt::ControlModifier) {
\r
104 this->mainWindow()->onCmdDelete();
\r
105 keyEvent->accept();
\r
112 // Ctrl + E ファイルを作成
\r
113 if (keyEvent->modifiers() == Qt::NoModifier) {
\r
115 else if (keyEvent->modifiers() == Qt::ControlModifier) {
\r
116 this->mainWindow()->onCmdNewFile();
\r
117 keyEvent->accept();
\r
124 // Shift + G カーソルを末尾に移動
\r
125 if (keyEvent->modifiers() == Qt::NoModifier) {
\r
126 this->mainWindow()->onMoveCursorBegin();
\r
127 keyEvent->accept();
\r
130 else if (keyEvent->modifiers() == Qt::ShiftModifier) {
\r
131 this->mainWindow()->onMoveCursorEnd();
\r
132 keyEvent->accept();
\r
139 // Shift + H 隠しファイルを表示/非表示
\r
140 if (keyEvent->modifiers() == Qt::NoModifier) {
\r
141 this->mainWindow()->onMoveHome();
\r
142 keyEvent->accept();
\r
145 else if (keyEvent->modifiers() == Qt::ShiftModifier) {
\r
146 this->mainWindow()->onViewHidden();
\r
147 keyEvent->accept();
\r
154 if (keyEvent->modifiers() == Qt::NoModifier) {
\r
155 this->mainWindow()->onMarkInvert();
\r
156 keyEvent->accept();
\r
163 // Shift + J フォルダを選択して移動
\r
164 if (keyEvent->modifiers() == Qt::NoModifier) {
\r
165 this->mainWindow()->onMoveCursorDown();
\r
166 keyEvent->accept();
\r
169 else if (keyEvent->modifiers() == Qt::ShiftModifier) {
\r
170 this->mainWindow()->onMoveJump();
\r
171 keyEvent->accept();
\r
178 // Ctrl + K フォルダを作成
\r
179 if (keyEvent->modifiers() == Qt::NoModifier) {
\r
180 this->mainWindow()->onMoveCursorUp();
\r
181 keyEvent->accept();
\r
184 else if (keyEvent->modifiers() == Qt::ControlModifier) {
\r
185 this->mainWindow()->onCmdNewFolder();
\r
186 keyEvent->accept();
\r
193 // Shift + M アプリケーションで開く
\r
194 // Ctrl + M ファイルの移動
\r
195 if (keyEvent->modifiers() == Qt::NoModifier) {
\r
196 this->mainWindow()->onActionOpen();
\r
197 keyEvent->accept();
\r
200 else if (keyEvent->modifiers() == Qt::ShiftModifier) {
\r
201 this->mainWindow()->onActionExec();
\r
202 keyEvent->accept();
\r
205 else if (keyEvent->modifiers() == Qt::ControlModifier) {
\r
206 this->mainWindow()->onCmdMove();
\r
207 keyEvent->accept();
\r
213 // O 隣のパネルと同じフォルダを表示
\r
214 // Shift + O 隣のパネルに同じフォルダを表示
\r
215 if (keyEvent->modifiers() == Qt::NoModifier) {
\r
216 this->mainWindow()->onViewFromOther();
\r
217 keyEvent->accept();
\r
220 else if (keyEvent->modifiers() == Qt::ShiftModifier) {
\r
221 this->mainWindow()->onViewToOther();
\r
222 keyEvent->accept();
\r
229 if (keyEvent->modifiers() == Qt::NoModifier) {
\r
230 this->mainWindow()->onActionQuit();
\r
231 keyEvent->accept();
\r
239 if (keyEvent->modifiers() == Qt::NoModifier) {
\r
241 else if (keyEvent->modifiers() == Qt::ControlModifier) {
\r
242 this->mainWindow()->onCmdRename();
\r
243 keyEvent->accept();
\r
250 if (keyEvent->modifiers() == Qt::NoModifier) {
\r
251 this->mainWindow()->onMarkAllOff();
\r
252 keyEvent->accept();
\r
259 if (keyEvent->modifiers() == Qt::NoModifier) {
\r
260 this->mainWindow()->onViewSwap();
\r
261 keyEvent->accept();
\r
268 if (keyEvent->modifiers() == Qt::NoModifier) {
\r
269 this->mainWindow()->onActionCommand();
\r
270 keyEvent->accept();
\r
275 case Qt::Key_Question:
\r
277 if (keyEvent->modifiers() == Qt::NoModifier) {
\r
278 this->mainWindow()->onHelpAbout();
\r
279 keyEvent->accept();
\r
284 case Qt::Key_Space:
\r
286 if (keyEvent->modifiers() == Qt::NoModifier) {
\r
287 this->mainWindow()->onMarkToggle();
\r
288 keyEvent->accept();
\r
295 if (keyEvent->modifiers() == Qt::NoModifier) {
\r
296 this->mainWindow()->onMoveOther();
\r
297 keyEvent->accept();
\r
302 case Qt::Key_Backspace:
\r
304 // Shift + BS ルートフォルダに移動
\r
305 if (keyEvent->modifiers() == Qt::NoModifier) {
\r
306 this->mainWindow()->onMoveParent();
\r
307 keyEvent->accept();
\r
310 else if (keyEvent->modifiers() == Qt::ShiftModifier) {
\r
311 this->mainWindow()->onMoveRoot();
\r
312 keyEvent->accept();
\r
317 case Qt::Key_Return:
\r
319 // Shift + RET アプリケーションで開く
\r
320 if (keyEvent->modifiers() == Qt::NoModifier) {
\r
321 this->mainWindow()->onActionOpen();
\r
322 keyEvent->accept();
\r
325 else if (keyEvent->modifiers() == Qt::ShiftModifier) {
\r
326 this->mainWindow()->onActionExec();
\r
327 keyEvent->accept();
\r
334 return QWidget::eventFilter(obj, event);
\r
337 void FolderPanel::setCurrentFolder(const QString &path)
\r
339 mainWindow()->setStatusText(tr("ファイルリストを更新中..."));
\r
340 QString curDir = m_dir.absolutePath();
\r
341 m_dir.setPath(QDir::cleanPath(path));
\r
342 m_dir.canonicalPath();
\r
343 QFileInfoList list = m_dir.entryInfoList();
\r
345 if (list.empty()) {
\r
346 QMessageBox::critical(
\r
349 tr("フォルダが存在しないか利用できません。"));
\r
350 m_dir.setPath(curDir);
\r
351 ui->locationField->setText(curDir);
\r
352 mainWindow()->setStatusText(tr("レディ"));
\r
359 m_bUpdating = true;
\r
360 ui->fileTable->model()->removeRows(0, ui->fileTable->rowCount());
\r
361 for (int i = 0; i < list.size(); i++) {
\r
362 QFileInfo info = list.at(i);
\r
363 if (info.fileName() == ".." && m_dir.isRoot()) {
\r
367 int row = ui->fileTable->rowCount();
\r
368 ui->fileTable->insertRow(row);
\r
371 QTableWidgetItem *iName = new QTableWidgetItem(info.fileName());
\r
372 iName->setFlags(iName->flags() ^ Qt::ItemIsEditable);
\r
373 if (info.fileName() == "..") {
\r
374 iName->setIcon(QIcon(":/images/Up.png"));
\r
377 iName->setIcon(m_IconFactory.icon(info));
\r
379 ui->fileTable->setItem(row, 1, iName);
\r
383 if (info.isDir()) {
\r
386 else if (info.size() >= 1024 * 1024 * 1024) {
\r
387 str = tr("%1GB").arg(int(info.size() / (1024 * 1024 * 1024)));
\r
389 else if (info.size() >= 1024 * 1024) {
\r
390 str = tr("%1MB").arg(int(info.size() / (1024 * 1024)));
\r
392 else if (info.size() >= 1024) {
\r
393 str = tr("%1KB").arg(int(info.size() / 1024));
\r
396 str = tr("%1B").arg(info.size());
\r
398 QTableWidgetItem *iSize = new QTableWidgetItem(str);
\r
399 iSize->setFlags(iSize->flags() ^ Qt::ItemIsEditable);
\r
400 iSize->setTextAlignment(Qt::AlignRight | Qt::AlignVCenter);
\r
402 ui->fileTable->setItem(row, 2, iSize);
\r
405 QTableWidgetItem *iDateTime = new QTableWidgetItem(
\r
406 info.lastModified().toString("yy/MM/dd hh:mm"));
\r
407 iDateTime->setFlags(iDateTime->flags() ^ Qt::ItemIsEditable);
\r
408 ui->fileTable->setItem(row, 3, iDateTime);
\r
410 // シグナル処理の関係で、チェックボックスは最後に追加する
\r
411 QTableWidgetItem *iCheck = new QTableWidgetItem(tr(""));
\r
412 iCheck->setFlags(iCheck->flags() ^ Qt::ItemIsEditable);
\r
413 if (info.fileName() != "..") {
\r
414 iCheck->setFlags(iCheck->flags() | Qt::ItemIsUserCheckable);
\r
415 iCheck->setCheckState(Qt::Unchecked);
\r
417 ui->fileTable->setItem(row, 0, iCheck);
\r
420 ui->fileTable->selectRow(0);
\r
421 ui->fileTable->resizeRowsToContents();
\r
423 ui->locationField->setText(m_dir.absolutePath());
\r
424 mainWindow()->setStatusText(tr("レディ"));
\r
425 m_bUpdating = false;
\r
428 void FolderPanel::InstallWatcher()
\r
430 UninstallWatcher();
\r
432 m_fsWatcher = new QFileSystemWatcher(this);
\r
433 m_fsWatcher->addPath(m_dir.absolutePath());
\r
434 connect(m_fsWatcher, SIGNAL(directoryChanged(QString)),
\r
435 this, SLOT(on_directoryChanged(QString)));
\r
438 void FolderPanel::UninstallWatcher()
\r
440 if (m_fsWatcher != NULL) {
\r
441 delete m_fsWatcher;
\r
443 m_fsWatcher = NULL;
\r
446 void FolderPanel::on_fileTable_cellChanged(int row, int column)
\r
449 if (ui->fileTable->item(row, 0)->checkState() == Qt::Checked) {
\r
450 for (int n = 0; n < 4; n++) {
\r
451 ui->fileTable->item(row, n)->setForeground(Qt::red);
\r
452 ui->fileTable->item(row, n)->setBackground(Qt::green);
\r
456 for (int n = 0; n < 4; n++) {
\r
457 ui->fileTable->item(row, n)->setForeground(Qt::black);
\r
458 ui->fileTable->item(row, n)->setBackground(Qt::white);
\r
461 ui->fileTable->selectRow(row);
\r
465 void FolderPanel::on_locationField_editingFinished()
\r
467 ui->locationField->blockSignals(true);
\r
469 QString path = ui->locationField->text();
\r
470 setCurrentFolder(path);
\r
472 ui->locationField->blockSignals(false);
\r
475 void FolderPanel::on_directoryChanged(QString)
\r
477 int row = ui->fileTable->currentRow();
\r
478 this->setCurrentFolder(m_dir.absolutePath());
\r
479 if (row >= ui->fileTable->rowCount()) {
\r
480 row = ui->fileTable->rowCount() - 1;
\r
482 ui->fileTable->selectRow(row);
\r
485 void FolderPanel::on_fileTable_itemSelectionChanged()
\r
491 int row = ui->fileTable->currentRow();
\r
492 if (0 <= row && row < ui->fileTable->rowCount()) {
\r
493 mainWindow()->setStatusText(ui->fileTable->item(row, 1)->text());
\r