2 #include "copymoveworker.h"
\r
3 #include "deleteworker.h"
\r
4 #include "filetablemodel.h"
\r
5 #include "filetableview.h"
\r
6 #include "historydialog.h"
\r
7 #include "mainwindow.h"
\r
8 #include "operationdialog.h"
\r
9 #include "overwritedialog.h"
\r
10 #include "renamemultidialog.h"
\r
11 #include "renamesingledialog.h"
\r
12 #include "renameworker.h"
\r
13 #include "sortdialog.h"
\r
16 #include <QDesktopServices>
\r
17 #include <QInputDialog>
\r
18 #include <QMessageBox>
\r
22 #include <QSettings>
\r
23 #include <QFileDialog>
\r
24 #include <QKeyEvent>
\r
25 #include <QStatusBar>
\r
27 #define CHECK_FOCUS { \
\r
28 if (!hasFocus()) { return; } \
\r
31 #define MENU_TRRIGGERED(x) \
\r
32 getMainWnd()->findChild<QAction*>(#x), SIGNAL(triggered())
\r
33 #define MENU_TOGGLED(x) \
\r
34 getMainWnd()->findChild<QAction*>(#x), SIGNAL(toggled(bool))
\r
36 FileTableView::FileTableView(QWidget *parent) :
\r
42 connect(MENU_TRRIGGERED(action_Open), this, SLOT(setPath()));
\r
43 connect(MENU_TRRIGGERED(action_Exec), this, SLOT(openUrl()));
\r
44 connect(MENU_TRRIGGERED(action_OpenEditor), this, SLOT(XXX()));
\r
45 connect(MENU_TRRIGGERED(action_Command), this, SLOT(kickProcess()));
\r
47 connect(MENU_TRRIGGERED(mark_Toggle), this, SLOT(toggleChecked()));
\r
48 connect(MENU_TRRIGGERED(mark_All), this, SLOT(checkAllItems()));
\r
49 connect(MENU_TRRIGGERED(mark_AllFiles), this, SLOT(checkAllFiles()));
\r
50 connect(MENU_TRRIGGERED(mark_AllOff), this, SLOT(uncheckAllItems()));
\r
51 connect(MENU_TRRIGGERED(mark_Invert), this, SLOT(invertAllChecked()));
\r
53 connect(MENU_TRRIGGERED(view_FromOther), this, SLOT(setPathFromOther()));
\r
54 connect(MENU_TRRIGGERED(view_ToOther), this, SLOT(setPathToOther()));
\r
55 connect(MENU_TRRIGGERED(view_Swap), this, SLOT(swapPath()));
\r
56 connect(MENU_TRRIGGERED(view_Sort), this, SLOT(setSort()));
\r
57 connect(MENU_TRRIGGERED(view_Refresh), this, SLOT(refresh()));
\r
59 connect(MENU_TRRIGGERED(move_Back), this, SLOT(back()));
\r
60 connect(MENU_TRRIGGERED(move_Forward), this, SLOT(forward()));
\r
61 connect(MENU_TRRIGGERED(move_History), this, SLOT(showHidtory()));
\r
62 connect(MENU_TRRIGGERED(move_Home), this, SLOT(jumpToHome()));
\r
63 connect(MENU_TRRIGGERED(move_Parent), this, SLOT(jumpToParent()));
\r
64 connect(MENU_TRRIGGERED(move_Root), this, SLOT(jumpToRoot()));
\r
65 connect(MENU_TRRIGGERED(move_Jump), this, SLOT(jumpTo()));
\r
66 connect(MENU_TRRIGGERED(move_Down), this, SLOT(cursorDown()));
\r
67 connect(MENU_TRRIGGERED(move_Up), this, SLOT(cursorUp()));
\r
68 connect(MENU_TRRIGGERED(move_Begin), this, SLOT(cursorToBegin()));
\r
69 connect(MENU_TRRIGGERED(move_End), this, SLOT(cursorToEnd()));
\r
71 connect(MENU_TRRIGGERED(cmd_Copy), this, SLOT(cmdCopy()));
\r
72 connect(MENU_TRRIGGERED(cmd_Move), this, SLOT(cmdMove()));
\r
73 connect(MENU_TRRIGGERED(cmd_Delete), this, SLOT(cmdDelete()));
\r
74 connect(MENU_TRRIGGERED(cmd_Rename), this, SLOT(cmdRename()));
\r
75 connect(MENU_TRRIGGERED(cmd_NewFile), this, SLOT(newFile()));
\r
76 connect(MENU_TRRIGGERED(cmd_NewFolder), this, SLOT(newFolder()));
\r
78 connect(getMainWnd(), SIGNAL(showHiddenFiles(bool)),
\r
79 this, SLOT(showHiddenFiles(bool)));
\r
80 connect(getMainWnd(), SIGNAL(showSystemFiles(bool)),
\r
81 this, SLOT(showSystemFiles(bool)));
\r
83 connect(this, SIGNAL(doubleClicked(QModelIndex)),
\r
84 this, SLOT(setRootIndex(QModelIndex)));
\r
87 FileTableView::~FileTableView()
\r
90 FileTableModel *m = static_cast<FileTableModel*>(model());
\r
92 settings.setValue(side() + slash + IniKey_Dir, m->absolutePath());
\r
95 QString FileTableView::side() const
\r
100 void FileTableView::setSide(const QString &side)
\r
104 // コンストラクタではステータスバーが生成されていないため
\r
105 // このタイミングでconnectする
\r
106 connect(this, SIGNAL(indexChanged(QString)),
\r
107 getMainWnd()->statusBar(), SLOT(showMessage(QString)));
\r
110 void FileTableView::setRootPath(const QString &path, bool addHistory)
\r
112 FileTableModel *m = static_cast<FileTableModel*>(model());
\r
113 QFileInfo info(path);
\r
115 if (info.isDir()) {
\r
116 getMainWnd()->statusBar()->showMessage(tr("ファイルリストの取得中..."));
\r
118 setUpdatesEnabled(false);
\r
119 m->setPath(info.absoluteFilePath());
\r
120 setUpdatesEnabled(true);
\r
123 m_history.add(info.absoluteFilePath());
\r
127 getMainWnd()->statusBar()->showMessage(tr("レディ"), 5000);
\r
131 QFileInfoList FileTableView::selectedItems() const
\r
133 FileTableModel *m = static_cast<FileTableModel*>(model());
\r
134 QFileInfoList list = m->checkedItems();
\r
135 if (list.isEmpty()) {
\r
136 QFileInfo info = m->fileInfo(currentIndex());
\r
137 if (info.fileName() != "..") {
\r
145 void FileTableView::updateMenu()
\r
147 if (m_history.isEmpty()) {
\r
148 getMainWnd()->findChild<QAction*>("move_Back")->setEnabled(false);
\r
149 getMainWnd()->findChild<QAction*>("move_Forward")->setEnabled(false);
\r
153 getMainWnd()->findChild<QAction*>("move_Back")
\r
154 ->setEnabled(!m_history.isBegin());
\r
155 getMainWnd()->findChild<QAction*>("move_Forward")
\r
156 ->setEnabled(!m_history.isEnd());
\r
160 void FileTableView::setPath()
\r
164 setRootIndex(currentIndex());
\r
167 void FileTableView::openUrl()
\r
171 QFileInfoList list = selectedItems();
\r
172 foreach (const QFileInfo &info, list) {
\r
173 QString path = QDir::toNativeSeparators(info.absoluteFilePath());
\r
174 QDesktopServices::openUrl(QUrl("file:///" + path));
\r
178 void FileTableView::kickProcess()
\r
182 QFileInfoList list = selectedItems();
\r
183 QString command = QString::null;
\r
184 foreach (const QFileInfo &info, list) {
\r
185 if (info.isExecutable()) {
\r
186 command = QQ(info.fileName()) + " " + command;
\r
189 command += " " + QQ(info.fileName());
\r
193 QInputDialog dlg(this);
\r
194 dlg.setInputMode(QInputDialog::TextInput);
\r
195 dlg.setWindowTitle(tr("コマンドを実行"));
\r
196 dlg.setLabelText(tr("コマンド:"));
\r
197 dlg.setTextValue(command);
\r
199 QSize szMainWnd = getMainWnd()->size();
\r
200 QSize szDialog = dlg.size();
\r
201 szDialog.setWidth(szMainWnd.width() * 0.8);
\r
202 dlg.resize(szDialog);
\r
204 int ret = dlg.exec();
\r
205 command = dlg.textValue();
\r
206 if (ret == QDialog::Accepted && !command.isEmpty()) {
\r
207 FileTableModel *m = static_cast<FileTableModel*>(model());
\r
208 QProcess process(this);
\r
209 process.setWorkingDirectory(m->absolutePath());
\r
210 if (!process.startDetached(command)) {
\r
211 QMessageBox::critical(
\r
213 tr("コマンドの実行に失敗しました。<br/>") + command);
\r
218 void FileTableView::toggleChecked()
\r
222 FileTableModel *m = static_cast<FileTableModel*>(model());
\r
224 QModelIndex index = currentIndex();
\r
226 QFileInfo info = m->fileInfo(index);
\r
227 if (info.fileName() != "..") {
\r
228 if (m->checkState(index) == Qt::Checked) {
\r
229 m->setCheckState(index, Qt::Unchecked);
\r
232 m->setCheckState(index, Qt::Checked);
\r
235 // 最終行でなければ、次のアイテムに移動する
\r
236 if (index.row() == m->rowCount() - 1) {
\r
237 setCurrentIndex(index);
\r
239 else if (index.row() < m->rowCount() - 1) {
\r
240 qDebug() << "set = " << index.row() + 1;
\r
241 setCurrentIndex(m->index(index.row() + 1, 1));
\r
245 void FileTableView::checkAllItems()
\r
249 QModelIndex index = currentIndex();
\r
250 FileTableModel *m = static_cast<FileTableModel*>(model());
\r
251 setUpdatesEnabled(false);
\r
252 m->setCheckStateAll(Qt::Checked);
\r
253 setUpdatesEnabled(true);
\r
254 setCurrentIndex(index);
\r
257 void FileTableView::checkAllFiles()
\r
261 QModelIndex index = currentIndex();
\r
262 FileTableModel *m = static_cast<FileTableModel*>(model());
\r
263 setUpdatesEnabled(false);
\r
264 for (int n = 0; n < m->rowCount(); n++) {
\r
265 QModelIndex index = m->index(n, 0);
\r
266 QFileInfo info = m->fileInfo(index);
\r
267 if (info.isDir()) {
\r
268 m->setCheckState(index, Qt::Unchecked);
\r
271 m->setCheckState(index, Qt::Checked);
\r
275 setUpdatesEnabled(true);
\r
276 setCurrentIndex(index);
\r
279 void FileTableView::uncheckAllItems()
\r
283 QModelIndex index = currentIndex();
\r
284 FileTableModel *m = static_cast<FileTableModel*>(model());
\r
285 setUpdatesEnabled(false);
\r
286 m->setCheckStateAll(Qt::Unchecked);
\r
287 setUpdatesEnabled(true);
\r
288 setCurrentIndex(index);
\r
291 void FileTableView::invertAllChecked()
\r
295 QModelIndex index = currentIndex();
\r
296 FileTableModel *m = static_cast<FileTableModel*>(model());
\r
297 setUpdatesEnabled(false);
\r
298 for (int n = 0; n < m->rowCount(); n++) {
\r
299 QModelIndex index = m->index(n, 0);
\r
300 if (m->checkState(index) == Qt::Checked) {
\r
301 m->setCheckState(index, Qt::Unchecked);
\r
304 m->setCheckState(index, Qt::Checked);
\r
308 setUpdatesEnabled(true);
\r
309 setCurrentIndex(index);
\r
312 void FileTableView::setPathFromOther()
\r
316 FileTableView *other = getMainWnd()->otherSideView(this);
\r
317 if (other == NULL) {
\r
321 FileTableModel *mOther = static_cast<FileTableModel*>(other->model());
\r
323 setRootPath(mOther->absolutePath(), true);
\r
326 void FileTableView::setPathToOther()
\r
330 FileTableView *other = getMainWnd()->otherSideView(this);
\r
331 if (other == NULL) {
\r
335 FileTableModel *m = static_cast<FileTableModel*>(model());
\r
337 other->setRootPath(m->absolutePath(), true);
\r
340 void FileTableView::swapPath()
\r
344 FileTableView *other = getMainWnd()->otherSideView(this);
\r
345 if (other == NULL) {
\r
349 FileTableModel *m = static_cast<FileTableModel*>(model());
\r
350 FileTableModel *mOther = static_cast<FileTableModel*>(other->model());
\r
352 QString path = m->absolutePath();
\r
353 QString pathOther = mOther->absolutePath();
\r
355 setRootPath(pathOther, true);
\r
356 other->setRootPath(path, true);
\r
359 void FileTableView::showHiddenFiles(bool show)
\r
361 FileTableModel *m = static_cast<FileTableModel*>(model());
\r
363 m->setFilter(m->filter() | QDir::Hidden);
\r
366 m->setFilter(m->filter() ^ QDir::Hidden);
\r
369 setUpdatesEnabled(false);
\r
371 setUpdatesEnabled(true);
\r
374 void FileTableView::showSystemFiles(bool show)
\r
376 FileTableModel *m = static_cast<FileTableModel*>(model());
\r
378 m->setFilter(m->filter() | QDir::System);
\r
381 m->setFilter(m->filter() ^ QDir::System);
\r
384 setUpdatesEnabled(false);
\r
386 setUpdatesEnabled(true);
\r
389 void FileTableView::setSort()
\r
393 SortDialog dlg(this);
\r
394 dlg.setRightOrLeft(side());
\r
395 if (dlg.exec() == QDialog::Accepted) {
\r
396 QSettings settings;
\r
397 FileTableModel *m = static_cast<FileTableModel*>(model());
\r
398 m->setSorting(QDir::Name); // 0
\r
400 int sortBy = settings.value(side() + slash + IniKey_SortBy, 0).toInt();
\r
402 case SortByDate: m->setSorting(m->sorting() | QDir::Time); break;
\r
403 case SortBySize: m->setSorting(m->sorting() | QDir::Size); break;
\r
404 case SortByType: m->setSorting(m->sorting() | QDir::Type); break;
\r
405 default: m->setSorting(m->sorting() | QDir::Name); break;
\r
408 // デフォルトだと文字列は昇順で、数値は降順…orz
\r
409 int orderBy = settings.value(side() + slash + IniKey_OrderBy, 0).toInt();
\r
410 if (((sortBy == SortByName || sortBy == SortByType) && orderBy == OrderByDesc) ||
\r
411 ((sortBy == SortByDate || sortBy == SortBySize) && orderBy == OrderByAsc))
\r
413 m->setSorting(m->sorting() | QDir::Reversed);
\r
416 switch (settings.value(side() + slash + IniKey_PutDirs, 0).toInt()) {
\r
417 case PutDirsFirst: m->setSorting(m->sorting() | QDir::DirsFirst); break;
\r
418 case PutDirsLast: m->setSorting(m->sorting() | QDir::DirsLast); break;
\r
421 if (settings.value(side() + slash + IniKey_IgnoreCase, true).toBool()) {
\r
422 m->setSorting(m->sorting() | QDir::IgnoreCase);
\r
425 setUpdatesEnabled(false);
\r
427 setUpdatesEnabled(true);
\r
431 void FileTableView::refresh()
\r
433 FileTableModel *m = static_cast<FileTableModel*>(model());
\r
434 int row = currentIndex().row();
\r
435 setRootPath(m->absolutePath(), false);
\r
436 if (m->rowCount() <= row) {
\r
437 row = m->rowCount() - 1;
\r
439 setCurrentIndex(m->index(row, 0));
\r
443 void FileTableView::back()
\r
447 if (!m_history.isBegin()) {
\r
448 const QString &path = m_history.back();
\r
449 setRootPath(path, false);
\r
455 void FileTableView::forward()
\r
459 if (!m_history.isEnd()) {
\r
460 const QString &path = m_history.forward();
\r
461 setRootPath(path, false);
\r
467 void FileTableView::showHidtory()
\r
471 FileTableView *other = getMainWnd()->otherSideView(this);
\r
473 HistoryDialog dlg(this);
\r
474 if (side() == "Left") {
\r
475 dlg.setDefaultLeft(true);
\r
476 dlg.setHistory(&m_history, other->history());
\r
479 dlg.setDefaultLeft(false);
\r
480 dlg.setHistory(other->history(), &m_history);
\r
483 QSize szMainWnd = getMainWnd()->size();
\r
484 QSize szDialog = dlg.size();
\r
485 szDialog.setWidth(szMainWnd.width() * 0.8);
\r
486 dlg.resize(szDialog);
\r
487 if (dlg.exec() == QDialog::Accepted) {
\r
488 if (side() == dlg.selectedSide()) {
\r
489 m_history.setAt(dlg.selectedIndex());
\r
490 setRootPath(m_history.current(), false);
\r
493 setRootPath(other->history()->at(dlg.selectedIndex()), true);
\r
496 qDebug() << dlg.selectedIndex();
\r
500 void FileTableView::jumpToHome()
\r
504 setRootPath(QDir::homePath(), true);
\r
507 void FileTableView::jumpToParent()
\r
511 FileTableModel *m = static_cast<FileTableModel*>(model());
\r
512 QDir dir(m->absolutePath());
\r
515 setRootPath(dir.absolutePath(), true);
\r
518 void FileTableView::jumpToRoot()
\r
522 setRootPath(QDir::rootPath(), true);
\r
525 void FileTableView::jumpTo()
\r
529 FileTableModel *m = static_cast<FileTableModel*>(model());
\r
530 QString path = QFileDialog::getExistingDirectory(
\r
531 this, tr("フォルダを選択"), m->absolutePath());
\r
532 if (!path.isEmpty()) {
\r
533 setRootPath(path, true);
\r
537 void FileTableView::cursorDown()
\r
541 int row = currentIndex().row();
\r
542 if (row < model()->rowCount() - 1) {
\r
543 setCurrentIndex(model()->index(row + 1, 1));
\r
547 void FileTableView::cursorUp()
\r
551 int row = currentIndex().row();
\r
553 setCurrentIndex(model()->index(row - 1, 1));
\r
557 void FileTableView::cursorToBegin()
\r
561 setCurrentIndex(model()->index(0, 1));
\r
564 void FileTableView::cursorToEnd()
\r
568 setCurrentIndex(model()->index(model()->rowCount() - 1, 1));
\r
571 void FileTableView::cmdCopy()
\r
575 QFileInfoList list = selectedItems();
\r
576 if (list.isEmpty()) {
\r
580 FileTableView *other = getMainWnd()->otherSideView(this);
\r
581 FileTableModel *mOther = static_cast<FileTableModel*>(other->model());
\r
582 CopyMoveWorker *worker = new CopyMoveWorker();
\r
583 connect(worker, SIGNAL(askOverWrite(bool*,int*,int*,QString*,QString,QString)),
\r
584 this, SLOT(askOverWrite(bool*,int*,int*,QString*,QString,QString)));
\r
585 worker->setCopyList(&list);
\r
586 worker->setTargetDir(mOther->absolutePath());
\r
587 worker->setMoveMode(false);
\r
589 OperationDialog opDlg(this);
\r
590 opDlg.setWindowTitle(tr("コピー"));
\r
591 opDlg.setWorker(worker);
\r
596 void FileTableView::cmdMove()
\r
600 QFileInfoList list = selectedItems();
\r
601 if (list.isEmpty()) {
\r
605 FileTableView *other = getMainWnd()->otherSideView(this);
\r
606 FileTableModel *mOther = static_cast<FileTableModel*>(other->model());
\r
607 CopyMoveWorker *worker = new CopyMoveWorker();
\r
608 connect(worker, SIGNAL(askOverWrite(bool*,int*,int*,QString*,QString,QString)),
\r
609 this, SLOT(askOverWrite(bool*,int*,int*,QString*,QString,QString)));
\r
610 worker->setCopyList(&list);
\r
611 worker->setTargetDir(mOther->absolutePath());
\r
612 worker->setMoveMode(true);
\r
614 OperationDialog opDlg(this);
\r
615 opDlg.setWindowTitle(tr("移動"));
\r
616 opDlg.setWorker(worker);
\r
621 void FileTableView::cmdDelete()
\r
625 QFileInfoList list = selectedItems();
\r
626 if (list.isEmpty()) {
\r
631 if (list.size() == 1) {
\r
632 msg = list[0].fileName();
\r
635 msg = tr("%1個のアイテム").arg(list.size());
\r
637 int ret = QMessageBox::question(
\r
639 msg + tr("を削除します<br/>よろしいですか?"));
\r
640 if (ret == QMessageBox::Yes) {
\r
641 DeleteWorker *worker = new DeleteWorker();
\r
642 worker->setDeleteList(&list);
\r
644 OperationDialog opDlg(this);
\r
645 opDlg.setWindowTitle(tr("削除"));
\r
646 opDlg.setWorker(worker);
\r
651 void FileTableView::cmdRename()
\r
655 QFileInfoList list = selectedItems();
\r
656 if (list.isEmpty()) {
\r
660 IRenameDialog *dlg;
\r
661 if (list.size() == 1) {
\r
662 dlg = new RenameSingleDialog(this);
\r
665 dlg = new RenameMultiDialog(this);
\r
667 FileTableModel *m = static_cast<FileTableModel*>(model());
\r
668 dlg->setWorkingDirectory(m->absolutePath());
\r
669 dlg->setNames(list);
\r
670 int dlgResult = dlg->exec();
\r
671 if (dlgResult == QDialog::Accepted && !dlg->renameMap().isEmpty()) {
\r
672 RenameWorker *worker = new RenameWorker();
\r
673 worker->setRenameMap(&dlg->renameMap());
\r
675 OperationDialog opDlg(this);
\r
676 opDlg.setWindowTitle(tr("名前を変更"));
\r
677 opDlg.setWorker(worker);
\r
682 void FileTableView::newFile()
\r
687 QString name = QInputDialog::getText(
\r
688 this, tr("ファイルを作成"), tr("ファイル名:"),
\r
689 QLineEdit::Normal, "", &bOk);
\r
690 if (bOk && !name.isEmpty()) {
\r
691 FileTableModel *m = static_cast<FileTableModel*>(model());
\r
692 QDir dir(m->absolutePath());
\r
693 QFile file(dir.absoluteFilePath(name));
\r
694 if (!file.open(QIODevice::WriteOnly)) {
\r
695 QMessageBox::critical(
\r
697 tr("ファイルの作成に失敗しました。"));
\r
705 void FileTableView::newFolder()
\r
710 QString name = QInputDialog::getText(
\r
711 this, tr("フォルダを作成"), tr("フォルダ名:"),
\r
712 QLineEdit::Normal, "", &bOk);
\r
713 if (bOk && !name.isEmpty()) {
\r
714 FileTableModel *m = static_cast<FileTableModel*>(model());
\r
715 QDir dir(m->absolutePath());
\r
716 if (!dir.mkpath(name)) {
\r
717 QMessageBox::critical(
\r
719 tr("フォルダの作成に失敗しました。"));
\r
724 void FileTableView::XXX()
\r
728 qDebug() << sender()->objectName() << "に対するスロットは未実装です。";
\r
731 void FileTableView::askOverWrite(bool *bOk, int *prevCopyMethod, int *copyMethod,
\r
732 QString *alias, const QString &srcPath,
\r
733 const QString &tgtPath)
\r
735 OverWriteDialog dlg;
\r
736 dlg.setCopyMethod(*prevCopyMethod);
\r
737 dlg.setSameMethodChecked(*copyMethod != OverWriteDialog::Undefined);
\r
738 dlg.setFileInfo(srcPath, tgtPath);
\r
739 if (dlg.exec() == QDialog::Rejected) {
\r
743 *prevCopyMethod = dlg.copyMethod();
\r
744 if (dlg.isSameMethodChecked()) {
\r
745 *copyMethod = *prevCopyMethod;
\r
747 *alias = dlg.alias();
\r
750 CopyMoveWorker *worker = static_cast<CopyMoveWorker*>(sender());
\r
751 worker->endAsking();
\r
754 void FileTableView::setRootIndex(const QModelIndex &index)
\r
756 if (!index.isValid()) {
\r
760 FileTableModel *m = static_cast<FileTableModel*>(model());
\r
762 if (m->isDir(index)) {
\r
763 setRootPath(m->absoluteFilePath(index), true);
\r
767 void FileTableView::keyPressEvent(QKeyEvent *event)
\r
769 // Macでアクションが処理されないケースがあるため、
\r
770 // キーイベントを拾ってアクションシグナルを起動する
\r
771 QString modifier = QString::null;
\r
772 if (event->modifiers() & Qt::ShiftModifier) { modifier += "Shift+"; }
\r
773 if (event->modifiers() & Qt::ControlModifier) { modifier += "Ctrl+"; }
\r
774 if (event->modifiers() & Qt::AltModifier) { modifier += "Alt+"; }
\r
775 if (event->modifiers() & Qt::MetaModifier) { modifier += "Meta+"; }
\r
777 QString key = QKeySequence(event->key()).toString();
\r
778 QString ksq = QKeySequence(modifier + key).toString();
\r
780 if (!ksq.isEmpty()) {
\r
781 foreach (QObject *obj, getMainWnd()->children()) {
\r
782 QAction *action = qobject_cast<QAction*>(obj);
\r
784 foreach (const QKeySequence &keySeq, action->shortcuts()) {
\r
785 if (ksq == keySeq.toString()) {
\r
786 qDebug() << "emit " << ksq << " " << action->objectName();
\r
787 emit action->triggered();
\r
796 if (!ksq.isEmpty() && ksq != "Down" && ksq != "Up") {
\r
799 QTableView::keyPressEvent(event);
\r
802 void FileTableView::focusInEvent(QFocusEvent *event)
\r
806 QTableView::focusInEvent(event);
\r
809 void FileTableView::currentChanged(const QModelIndex ¤t, const QModelIndex &previous)
\r
811 Q_UNUSED(previous);
\r
813 FileTableModel *m = static_cast<FileTableModel*>(model());
\r
814 emit indexChanged(m->absoluteFilePath(current));
\r
816 QTableView::currentChanged(current, previous);
\r