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 (event->type() == QEvent::KeyPress) {
\r
75 QKeyEvent *keyEvent = static_cast<QKeyEvent*>(event);
\r
76 switch (keyEvent->key()) {
\r
80 MainWindow *mainWnd = this->mainWindow();
\r
82 if (keyEvent->modifiers() & Qt::ShiftModifier) {
\r
83 mainWnd->onMarkAll();
\r
86 mainWnd->onMarkAllFiles();
\r
94 MainWindow *mainWnd = this->mainWindow();
\r
96 if (keyEvent->modifiers() & Qt::ControlModifier) {
\r
97 mainWnd->onCmdDelete();
\r
100 keyEvent->accept();
\r
105 // Ctrl + E ファイルを作成
\r
106 MainWindow *mainWnd = this->mainWindow();
\r
108 if (keyEvent->modifiers() & Qt::ControlModifier) {
\r
109 mainWnd->onCmdNewFile();
\r
114 keyEvent->accept();
\r
119 // Shift + G カーソルを末尾に移動
\r
120 MainWindow *mainWnd = this->mainWindow();
\r
122 if (keyEvent->modifiers() & Qt::ShiftModifier) {
\r
123 mainWnd->onMoveCursorEnd();
\r
126 mainWnd->onMoveCursorBegin();
\r
129 keyEvent->accept();
\r
134 // Shift + H 隠しファイルを表示/非表示
\r
135 MainWindow *mainWnd = this->mainWindow();
\r
137 if (keyEvent->modifiers() & Qt::ShiftModifier) {
\r
138 mainWnd->onViewHidden();
\r
141 mainWnd->onMoveHome();
\r
144 keyEvent->accept();
\r
149 MainWindow *mainWnd = this->mainWindow();
\r
151 mainWnd->onMarkInvert();
\r
153 keyEvent->accept();
\r
158 // Shift + J フォルダを選択して移動
\r
159 MainWindow *mainWnd = this->mainWindow();
\r
161 if (keyEvent->modifiers() & Qt::ShiftModifier) {
\r
162 mainWnd->onMoveJump();
\r
165 mainWnd->onMoveCursorDown();
\r
168 keyEvent->accept();
\r
173 // Ctrl + K フォルダを作成
\r
174 MainWindow *mainWnd = this->mainWindow();
\r
176 if (keyEvent->modifiers() & Qt::ControlModifier) {
\r
177 mainWnd->onCmdNewFolder();
\r
180 mainWnd->onMoveCursorUp();
\r
183 keyEvent->accept();
\r
187 // O 隣のパネルと同じフォルダを表示
\r
188 // Shift + O 隣のパネルに同じフォルダを表示
\r
189 MainWindow *mainWnd = this->mainWindow();
\r
191 if (keyEvent->modifiers() & Qt::ShiftModifier) {
\r
192 mainWnd->onViewToOther();
\r
195 mainWnd->onViewFromOther();
\r
198 keyEvent->accept();
\r
203 MainWindow *mainWnd = this->mainWindow();
\r
205 mainWnd->onActionQuit();
\r
207 keyEvent->accept();
\r
213 MainWindow *mainWnd = this->mainWindow();
\r
215 if (keyEvent->modifiers() & Qt::ControlModifier) {
\r
216 mainWnd->onCmdRename();
\r
222 keyEvent->accept();
\r
227 MainWindow *mainWnd = this->mainWindow();
\r
229 mainWnd->onMarkAllOff();
\r
231 keyEvent->accept();
\r
236 MainWindow *mainWnd = this->mainWindow();
\r
238 mainWnd->onViewSwap();
\r
240 keyEvent->accept();
\r
245 MainWindow *mainWnd = this->mainWindow();
\r
247 mainWnd->onActionCommand();
\r
249 keyEvent->accept();
\r
252 case Qt::Key_Question: {
\r
254 MainWindow *mainWnd = this->mainWindow();
\r
256 mainWnd->onHelpAbout();
\r
258 keyEvent->accept();
\r
261 case Qt::Key_Space: {
\r
263 MainWindow *mainWnd = this->mainWindow();
\r
265 mainWnd->onMarkToggle();
\r
267 keyEvent->accept();
\r
270 case Qt::Key_Tab: {
\r
272 MainWindow *mainWnd = this->mainWindow();
\r
274 mainWnd->onMoveOther();
\r
276 keyEvent->accept();
\r
279 case Qt::Key_Backspace: {
\r
281 // Shift + BS ルートフォルダに移動
\r
282 MainWindow *mainWnd = this->mainWindow();
\r
284 if (keyEvent->modifiers() & Qt::ShiftModifier) {
\r
285 mainWnd->onMoveRoot();
\r
288 mainWnd->onMoveParent();
\r
291 keyEvent->accept();
\r
294 case Qt::Key_Return: {
\r
296 // Shift + RET アプリケーションで開く
\r
297 MainWindow *mainWnd = this->mainWindow();
\r
299 if (keyEvent->modifiers() & Qt::ShiftModifier) {
\r
300 mainWnd->onActionExec();
\r
303 mainWnd->onActionOpen();
\r
306 keyEvent->accept();
\r
311 return QWidget::eventFilter(obj, event);
\r
314 void FolderPanel::setCurrentFolder(const QString &path)
\r
316 mainWindow()->setStatusText(tr("ファイルリストを更新中..."));
\r
317 QString curDir = m_dir.absolutePath();
\r
318 m_dir.setPath(QDir::cleanPath(path));
\r
319 m_dir.canonicalPath();
\r
320 QFileInfoList list = m_dir.entryInfoList();
\r
322 if (list.empty()) {
\r
323 QMessageBox::critical(
\r
326 tr("フォルダが存在しないか利用できません。"));
\r
327 m_dir.setPath(curDir);
\r
328 ui->locationField->setText(curDir);
\r
329 mainWindow()->setStatusText(tr("レディ"));
\r
336 m_bUpdating = true;
\r
337 ui->fileTable->model()->removeRows(0, ui->fileTable->rowCount());
\r
338 for (int i = 0; i < list.size(); i++) {
\r
339 QFileInfo info = list.at(i);
\r
340 if (info.fileName() == ".." && m_dir.isRoot()) {
\r
344 int row = ui->fileTable->rowCount();
\r
345 ui->fileTable->insertRow(row);
\r
348 QTableWidgetItem *iName = new QTableWidgetItem(info.fileName());
\r
349 iName->setFlags(iName->flags() ^ Qt::ItemIsEditable);
\r
350 if (info.fileName() == "..") {
\r
351 iName->setIcon(QIcon(":/images/Up.png"));
\r
354 iName->setIcon(m_IconFactory.icon(info));
\r
356 ui->fileTable->setItem(row, 1, iName);
\r
360 if (info.isDir()) {
\r
363 else if (info.size() >= 1024 * 1024 * 1024) {
\r
364 str = tr("%1GB").arg(int(info.size() / (1024 * 1024 * 1024)));
\r
366 else if (info.size() >= 1024 * 1024) {
\r
367 str = tr("%1MB").arg(int(info.size() / (1024 * 1024)));
\r
369 else if (info.size() >= 1024) {
\r
370 str = tr("%1KB").arg(int(info.size() / 1024));
\r
373 str = tr("%1B").arg(info.size());
\r
375 QTableWidgetItem *iSize = new QTableWidgetItem(str);
\r
376 iSize->setFlags(iSize->flags() ^ Qt::ItemIsEditable);
\r
377 iSize->setTextAlignment(Qt::AlignRight | Qt::AlignVCenter);
\r
379 ui->fileTable->setItem(row, 2, iSize);
\r
382 QTableWidgetItem *iDateTime = new QTableWidgetItem(
\r
383 info.lastModified().toString("yy/MM/dd hh:mm"));
\r
384 iDateTime->setFlags(iDateTime->flags() ^ Qt::ItemIsEditable);
\r
385 ui->fileTable->setItem(row, 3, iDateTime);
\r
387 // シグナル処理の関係で、チェックボックスは最後に追加する
\r
388 QTableWidgetItem *iCheck = new QTableWidgetItem(tr(""));
\r
389 iCheck->setFlags(iCheck->flags() ^ Qt::ItemIsEditable);
\r
390 if (info.fileName() != "..") {
\r
391 iCheck->setFlags(iCheck->flags() | Qt::ItemIsUserCheckable);
\r
392 iCheck->setCheckState(Qt::Unchecked);
\r
394 ui->fileTable->setItem(row, 0, iCheck);
\r
397 ui->fileTable->selectRow(0);
\r
398 ui->fileTable->resizeRowsToContents();
\r
400 ui->locationField->setText(m_dir.absolutePath());
\r
401 mainWindow()->setStatusText(tr("レディ"));
\r
402 m_bUpdating = false;
\r
405 void FolderPanel::InstallWatcher()
\r
407 UninstallWatcher();
\r
409 m_fsWatcher = new QFileSystemWatcher(this);
\r
410 m_fsWatcher->addPath(m_dir.absolutePath());
\r
411 connect(m_fsWatcher, SIGNAL(directoryChanged(QString)),
\r
412 this, SLOT(on_directoryChanged(QString)));
\r
415 void FolderPanel::UninstallWatcher()
\r
417 if (m_fsWatcher != NULL) {
\r
418 delete m_fsWatcher;
\r
420 m_fsWatcher = NULL;
\r
423 void FolderPanel::on_fileTable_cellChanged(int row, int column)
\r
426 if (ui->fileTable->item(row, 0)->checkState() == Qt::Checked) {
\r
427 for (int n = 0; n < 4; n++) {
\r
428 ui->fileTable->item(row, n)->setForeground(Qt::red);
\r
429 ui->fileTable->item(row, n)->setBackground(Qt::green);
\r
433 for (int n = 0; n < 4; n++) {
\r
434 ui->fileTable->item(row, n)->setForeground(Qt::black);
\r
435 ui->fileTable->item(row, n)->setBackground(Qt::white);
\r
438 ui->fileTable->selectRow(row);
\r
442 void FolderPanel::on_locationField_editingFinished()
\r
444 ui->locationField->blockSignals(true);
\r
446 QString path = ui->locationField->text();
\r
447 setCurrentFolder(path);
\r
449 ui->locationField->blockSignals(false);
\r
452 void FolderPanel::on_directoryChanged(QString)
\r
454 int row = ui->fileTable->currentRow();
\r
455 this->setCurrentFolder(m_dir.absolutePath());
\r
456 if (row >= ui->fileTable->rowCount()) {
\r
457 row = ui->fileTable->rowCount() - 1;
\r
459 ui->fileTable->selectRow(row);
\r
462 void FolderPanel::on_fileTable_itemSelectionChanged()
\r
468 int row = ui->fileTable->currentRow();
\r
469 if (0 <= row && row < ui->fileTable->rowCount()) {
\r
470 mainWindow()->setStatusText(ui->fileTable->item(row, 1)->text());
\r