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
58 connect(MENU_TRRIGGERED(move_Back), this, SLOT(back()));
\r
59 connect(MENU_TRRIGGERED(move_Forward), this, SLOT(forward()));
\r
60 connect(MENU_TRRIGGERED(move_History), this, SLOT(showHidtory()));
\r
61 connect(MENU_TRRIGGERED(move_Home), this, SLOT(jumpToHome()));
\r
62 connect(MENU_TRRIGGERED(move_Parent), this, SLOT(jumpToParent()));
\r
63 connect(MENU_TRRIGGERED(move_Root), this, SLOT(jumpToRoot()));
\r
64 connect(MENU_TRRIGGERED(move_Jump), this, SLOT(jumpTo()));
\r
65 connect(MENU_TRRIGGERED(move_Down), this, SLOT(cursorDown()));
\r
66 connect(MENU_TRRIGGERED(move_Up), this, SLOT(cursorUp()));
\r
67 connect(MENU_TRRIGGERED(move_Begin), this, SLOT(cursorToBegin()));
\r
68 connect(MENU_TRRIGGERED(move_End), this, SLOT(cursorToEnd()));
\r
70 connect(MENU_TRRIGGERED(cmd_Copy), this, SLOT(cmdCopy()));
\r
71 connect(MENU_TRRIGGERED(cmd_Move), this, SLOT(cmdMove()));
\r
72 connect(MENU_TRRIGGERED(cmd_Delete), this, SLOT(cmdDelete()));
\r
73 connect(MENU_TRRIGGERED(cmd_Rename), this, SLOT(cmdRename()));
\r
74 connect(MENU_TRRIGGERED(cmd_NewFile), this, SLOT(newFile()));
\r
75 connect(MENU_TRRIGGERED(cmd_NewFolder), this, SLOT(newFolder()));
\r
77 connect(getMainWnd(), SIGNAL(showHiddenFiles(bool)),
\r
78 this, SLOT(showHiddenFiles(bool)));
\r
79 connect(getMainWnd(), SIGNAL(showSystemFiles(bool)),
\r
80 this, SLOT(showSystemFiles(bool)));
\r
82 connect(this, SIGNAL(doubleClicked(QModelIndex)),
\r
83 this, SLOT(setRootIndex(QModelIndex)));
\r
86 FileTableView::~FileTableView()
\r
89 FileTableModel *m = static_cast<FileTableModel*>(model());
\r
91 settings.setValue(side() + slash + IniKey_Dir, m->absolutePath());
\r
94 QString FileTableView::side() const
\r
99 void FileTableView::setSide(const QString &side)
\r
103 // コンストラクタではステータスバーが生成されていないため
\r
104 // このタイミングでconnectする
\r
105 connect(this, SIGNAL(indexChanged(QString)),
\r
106 getMainWnd()->statusBar(), SLOT(showMessage(QString)));
\r
109 void FileTableView::setRootPath(const QString &path, bool addHistory)
\r
111 FileTableModel *m = static_cast<FileTableModel*>(model());
\r
112 QFileInfo info(path);
\r
113 if (info.isDir()) {
\r
114 setUpdatesEnabled(false);
\r
115 m->setPath(info.absoluteFilePath());
\r
116 setUpdatesEnabled(true);
\r
119 m_history.add(info.absoluteFilePath());
\r
123 setCurrentIndex(m->index(0, 0));
\r
127 QFileInfoList FileTableView::selectedItems() const
\r
129 FileTableModel *m = static_cast<FileTableModel*>(model());
\r
130 QFileInfoList list = m->checkedItems();
\r
131 if (list.isEmpty()) {
\r
132 QFileInfo info = m->fileInfo(currentIndex());
\r
133 if (info.fileName() != "..") {
\r
141 void FileTableView::updateMenu()
\r
143 if (m_history.isEmpty()) {
\r
144 getMainWnd()->findChild<QAction*>("move_Back")->setEnabled(false);
\r
145 getMainWnd()->findChild<QAction*>("move_Forward")->setEnabled(false);
\r
149 getMainWnd()->findChild<QAction*>("move_Back")
\r
150 ->setEnabled(!m_history.isBegin());
\r
151 getMainWnd()->findChild<QAction*>("move_Forward")
\r
152 ->setEnabled(!m_history.isEnd());
\r
156 void FileTableView::setPath()
\r
160 setRootIndex(currentIndex());
\r
163 void FileTableView::openUrl()
\r
167 QFileInfoList list = selectedItems();
\r
168 foreach (const QFileInfo &info, list) {
\r
169 QString path = QDir::toNativeSeparators(info.absoluteFilePath());
\r
170 QDesktopServices::openUrl(QUrl("file:///" + path));
\r
174 void FileTableView::kickProcess()
\r
178 QFileInfoList list = selectedItems();
\r
179 QString command = QString::null;
\r
180 foreach (const QFileInfo &info, list) {
\r
181 if (info.isExecutable()) {
\r
182 command = QQ(info.fileName()) + " " + command;
\r
185 command += " " + QQ(info.fileName());
\r
189 QInputDialog dlg(this);
\r
190 dlg.setInputMode(QInputDialog::TextInput);
\r
191 dlg.setWindowTitle(tr("コマンドを実行"));
\r
192 dlg.setLabelText(tr("コマンド:"));
\r
193 dlg.setTextValue(command);
\r
194 dlg.resize(500, 100);
\r
195 int ret = dlg.exec();
\r
196 command = dlg.textValue();
\r
197 if (ret == QDialog::Accepted && !command.isEmpty()) {
\r
198 FileTableModel *m = static_cast<FileTableModel*>(model());
\r
199 QProcess process(this);
\r
200 process.setWorkingDirectory(m->absolutePath());
\r
201 if (!process.startDetached(command)) {
\r
202 QMessageBox::critical(
\r
204 tr("コマンドの実行に失敗しました。<br/>") + command);
\r
209 void FileTableView::toggleChecked()
\r
213 FileTableModel *m = static_cast<FileTableModel*>(model());
\r
215 QModelIndex index = currentIndex();
\r
217 QFileInfo info = m->fileInfo(index);
\r
218 if (info.fileName() != "..") {
\r
219 if (m->checkState(index) == Qt::Checked) {
\r
220 m->setCheckState(index, Qt::Unchecked);
\r
223 m->setCheckState(index, Qt::Checked);
\r
226 // 最終行でなければ、次のアイテムに移動する
\r
227 if (index.row() == m->rowCount() - 1) {
\r
228 setCurrentIndex(index);
\r
230 else if (index.row() < m->rowCount() - 1) {
\r
231 qDebug() << "set = " << index.row() + 1;
\r
232 setCurrentIndex(m->index(index.row() + 1, 1));
\r
236 void FileTableView::checkAllItems()
\r
240 QModelIndex index = currentIndex();
\r
241 FileTableModel *m = static_cast<FileTableModel*>(model());
\r
242 setUpdatesEnabled(false);
\r
243 m->setCheckStateAll(Qt::Checked);
\r
244 setUpdatesEnabled(true);
\r
245 setCurrentIndex(index);
\r
248 void FileTableView::checkAllFiles()
\r
252 QModelIndex index = currentIndex();
\r
253 FileTableModel *m = static_cast<FileTableModel*>(model());
\r
254 setUpdatesEnabled(false);
\r
255 for (int n = 0; n < m->rowCount(); n++) {
\r
256 QModelIndex index = m->index(n, 0);
\r
257 QFileInfo info = m->fileInfo(index);
\r
258 if (info.isDir()) {
\r
259 m->setCheckState(index, Qt::Unchecked);
\r
262 m->setCheckState(index, Qt::Checked);
\r
266 setUpdatesEnabled(true);
\r
267 setCurrentIndex(index);
\r
270 void FileTableView::uncheckAllItems()
\r
274 QModelIndex index = currentIndex();
\r
275 FileTableModel *m = static_cast<FileTableModel*>(model());
\r
276 setUpdatesEnabled(false);
\r
277 m->setCheckStateAll(Qt::Unchecked);
\r
278 setUpdatesEnabled(true);
\r
279 setCurrentIndex(index);
\r
282 void FileTableView::invertAllChecked()
\r
286 QModelIndex index = currentIndex();
\r
287 FileTableModel *m = static_cast<FileTableModel*>(model());
\r
288 setUpdatesEnabled(false);
\r
289 for (int n = 0; n < m->rowCount(); n++) {
\r
290 QModelIndex index = m->index(n, 0);
\r
291 if (m->checkState(index) == Qt::Checked) {
\r
292 m->setCheckState(index, Qt::Unchecked);
\r
295 m->setCheckState(index, Qt::Checked);
\r
299 setUpdatesEnabled(true);
\r
300 setCurrentIndex(index);
\r
303 void FileTableView::setPathFromOther()
\r
307 FileTableView *other = getMainWnd()->otherSideView(this);
\r
308 if (other == NULL) {
\r
312 FileTableModel *mOther = static_cast<FileTableModel*>(other->model());
\r
314 setRootPath(mOther->absolutePath(), true);
\r
317 void FileTableView::setPathToOther()
\r
321 FileTableView *other = getMainWnd()->otherSideView(this);
\r
322 if (other == NULL) {
\r
326 FileTableModel *m = static_cast<FileTableModel*>(model());
\r
328 other->setRootPath(m->absolutePath(), true);
\r
331 void FileTableView::swapPath()
\r
335 FileTableView *other = getMainWnd()->otherSideView(this);
\r
336 if (other == NULL) {
\r
340 FileTableModel *m = static_cast<FileTableModel*>(model());
\r
341 FileTableModel *mOther = static_cast<FileTableModel*>(other->model());
\r
343 QString path = m->absolutePath();
\r
344 QString pathOther = mOther->absolutePath();
\r
346 setRootPath(pathOther, true);
\r
347 other->setRootPath(path, true);
\r
350 void FileTableView::showHiddenFiles(bool show)
\r
352 FileTableModel *m = static_cast<FileTableModel*>(model());
\r
354 m->setFilter(m->filter() | QDir::Hidden);
\r
357 m->setFilter(m->filter() ^ QDir::Hidden);
\r
360 setUpdatesEnabled(false);
\r
362 setUpdatesEnabled(true);
\r
365 void FileTableView::showSystemFiles(bool show)
\r
367 FileTableModel *m = static_cast<FileTableModel*>(model());
\r
369 m->setFilter(m->filter() | QDir::System);
\r
372 m->setFilter(m->filter() ^ QDir::System);
\r
375 setUpdatesEnabled(false);
\r
377 setUpdatesEnabled(true);
\r
380 void FileTableView::setSort()
\r
384 SortDialog dlg(this);
\r
385 dlg.setRightOrLeft(side());
\r
386 if (dlg.exec() == QDialog::Accepted) {
\r
387 QSettings settings;
\r
388 FileTableModel *m = static_cast<FileTableModel*>(model());
\r
389 m->setSorting(QDir::Name); // 0
\r
391 int sortBy = settings.value(side() + slash + IniKey_SortBy, 0).toInt();
\r
393 case SortByDate: m->setSorting(m->sorting() | QDir::Time); break;
\r
394 case SortBySize: m->setSorting(m->sorting() | QDir::Size); break;
\r
395 case SortByType: m->setSorting(m->sorting() | QDir::Type); break;
\r
396 default: m->setSorting(m->sorting() | QDir::Name); break;
\r
399 // デフォルトだと文字列は昇順で、数値は降順…orz
\r
400 int orderBy = settings.value(side() + slash + IniKey_OrderBy, 0).toInt();
\r
401 if (((sortBy == SortByName || sortBy == SortByType) && orderBy == OrderByDesc) ||
\r
402 ((sortBy == SortByDate || sortBy == SortBySize) && orderBy == OrderByAsc))
\r
404 m->setSorting(m->sorting() | QDir::Reversed);
\r
407 switch (settings.value(side() + slash + IniKey_PutDirs, 0).toInt()) {
\r
408 case PutDirsFirst: m->setSorting(m->sorting() | QDir::DirsFirst); break;
\r
409 case PutDirsLast: m->setSorting(m->sorting() | QDir::DirsLast); break;
\r
412 if (settings.value(side() + slash + IniKey_IgnoreCase, true).toBool()) {
\r
413 m->setSorting(m->sorting() | QDir::IgnoreCase);
\r
416 setUpdatesEnabled(false);
\r
418 setUpdatesEnabled(true);
\r
422 void FileTableView::back()
\r
426 if (!m_history.isBegin()) {
\r
427 const QString &path = m_history.back();
\r
428 setRootPath(path, false);
\r
434 void FileTableView::forward()
\r
438 if (!m_history.isEnd()) {
\r
439 const QString &path = m_history.forward();
\r
440 setRootPath(path, false);
\r
446 void FileTableView::showHidtory()
\r
450 FileTableView *other = getMainWnd()->otherSideView(this);
\r
452 HistoryDialog dlg(this);
\r
453 if (side() == "Left") {
\r
454 dlg.setDefaultLeft(true);
\r
455 dlg.setHistory(&m_history, other->history());
\r
458 dlg.setDefaultLeft(false);
\r
459 dlg.setHistory(other->history(), &m_history);
\r
462 QSize szMainWnd = getMainWnd()->size();
\r
463 QSize szDialog = dlg.size();
\r
464 szDialog.setWidth(szMainWnd.width() * 0.8);
\r
465 dlg.resize(szDialog);
\r
466 if (dlg.exec() == QDialog::Accepted) {
\r
467 if (side() == dlg.selectedSide()) {
\r
468 m_history.setAt(dlg.selectedIndex());
\r
469 setRootPath(m_history.current(), false);
\r
472 setRootPath(other->history()->at(dlg.selectedIndex()), true);
\r
475 qDebug() << dlg.selectedIndex();
\r
479 void FileTableView::jumpToHome()
\r
483 setRootPath(QDir::homePath(), true);
\r
486 void FileTableView::jumpToParent()
\r
490 FileTableModel *m = static_cast<FileTableModel*>(model());
\r
491 QDir dir(m->absolutePath());
\r
494 setRootPath(dir.absolutePath(), true);
\r
497 void FileTableView::jumpToRoot()
\r
501 setRootPath(QDir::rootPath(), true);
\r
504 void FileTableView::jumpTo()
\r
508 FileTableModel *m = static_cast<FileTableModel*>(model());
\r
509 QString path = QFileDialog::getExistingDirectory(
\r
510 this, tr("フォルダを選択"), m->absolutePath());
\r
511 if (!path.isEmpty()) {
\r
512 setRootPath(path, true);
\r
516 void FileTableView::cursorDown()
\r
520 int row = currentIndex().row();
\r
521 if (row < model()->rowCount() - 1) {
\r
522 setCurrentIndex(model()->index(row + 1, 1));
\r
526 void FileTableView::cursorUp()
\r
530 int row = currentIndex().row();
\r
532 setCurrentIndex(model()->index(row - 1, 1));
\r
536 void FileTableView::cursorToBegin()
\r
540 setCurrentIndex(model()->index(0, 1));
\r
543 void FileTableView::cursorToEnd()
\r
547 setCurrentIndex(model()->index(model()->rowCount() - 1, 1));
\r
550 void FileTableView::cmdCopy()
\r
554 QFileInfoList list = selectedItems();
\r
555 if (list.isEmpty()) {
\r
559 FileTableView *other = getMainWnd()->otherSideView(this);
\r
560 FileTableModel *mOther = static_cast<FileTableModel*>(other->model());
\r
561 CopyMoveWorker *worker = new CopyMoveWorker();
\r
562 connect(worker, SIGNAL(askOverWrite(bool*,int*,int*,QString*,QString,QString)),
\r
563 this, SLOT(askOverWrite(bool*,int*,int*,QString*,QString,QString)));
\r
564 worker->setCopyList(&list);
\r
565 worker->setTargetDir(mOther->absolutePath());
\r
566 worker->setMoveMode(false);
\r
568 OperationDialog opDlg(this);
\r
569 opDlg.setWindowTitle(tr("コピー"));
\r
570 opDlg.setWorker(worker);
\r
575 void FileTableView::cmdMove()
\r
579 QFileInfoList list = selectedItems();
\r
580 if (list.isEmpty()) {
\r
584 FileTableView *other = getMainWnd()->otherSideView(this);
\r
585 FileTableModel *mOther = static_cast<FileTableModel*>(other->model());
\r
586 CopyMoveWorker *worker = new CopyMoveWorker();
\r
587 connect(worker, SIGNAL(askOverWrite(bool*,int*,int*,QString*,QString,QString)),
\r
588 this, SLOT(askOverWrite(bool*,int*,int*,QString*,QString,QString)));
\r
589 worker->setCopyList(&list);
\r
590 worker->setTargetDir(mOther->absolutePath());
\r
591 worker->setMoveMode(true);
\r
593 OperationDialog opDlg(this);
\r
594 opDlg.setWindowTitle(tr("移動"));
\r
595 opDlg.setWorker(worker);
\r
600 void FileTableView::cmdDelete()
\r
604 QFileInfoList list = selectedItems();
\r
605 if (list.isEmpty()) {
\r
610 if (list.size() == 1) {
\r
611 msg = list[0].fileName();
\r
614 msg = tr("%1個のアイテム").arg(list.size());
\r
616 int ret = QMessageBox::question(
\r
618 msg + tr("を削除します<br/>よろしいですか?"));
\r
619 if (ret == QMessageBox::Yes) {
\r
620 DeleteWorker *worker = new DeleteWorker();
\r
621 worker->setDeleteList(&list);
\r
623 OperationDialog opDlg(this);
\r
624 opDlg.setWindowTitle(tr("削除"));
\r
625 opDlg.setWorker(worker);
\r
630 void FileTableView::cmdRename()
\r
634 QFileInfoList list = selectedItems();
\r
635 if (list.isEmpty()) {
\r
639 IRenameDialog *dlg;
\r
640 if (list.size() == 1) {
\r
641 dlg = new RenameSingleDialog(this);
\r
644 dlg = new RenameMultiDialog(this);
\r
646 FileTableModel *m = static_cast<FileTableModel*>(model());
\r
647 dlg->setWorkingDirectory(m->absolutePath());
\r
648 dlg->setNames(list);
\r
649 int dlgResult = dlg->exec();
\r
650 if (dlgResult == QDialog::Accepted && !dlg->renameMap().isEmpty()) {
\r
651 RenameWorker *worker = new RenameWorker();
\r
652 worker->setRenameMap(&dlg->renameMap());
\r
654 OperationDialog opDlg(this);
\r
655 opDlg.setWindowTitle(tr("名前を変更"));
\r
656 opDlg.setWorker(worker);
\r
661 void FileTableView::newFile()
\r
666 QString name = QInputDialog::getText(
\r
667 this, tr("ファイルを作成"), tr("ファイル名:"),
\r
668 QLineEdit::Normal, "", &bOk);
\r
669 if (bOk && !name.isEmpty()) {
\r
670 FileTableModel *m = static_cast<FileTableModel*>(model());
\r
671 QDir dir(m->absolutePath());
\r
672 QFile file(dir.absoluteFilePath(name));
\r
673 if (!file.open(QIODevice::WriteOnly)) {
\r
674 QMessageBox::critical(
\r
676 tr("ファイルの作成に失敗しました。"));
\r
684 void FileTableView::newFolder()
\r
689 QString name = QInputDialog::getText(
\r
690 this, tr("フォルダを作成"), tr("フォルダ名:"),
\r
691 QLineEdit::Normal, "", &bOk);
\r
692 if (bOk && !name.isEmpty()) {
\r
693 FileTableModel *m = static_cast<FileTableModel*>(model());
\r
694 QDir dir(m->absolutePath());
\r
695 if (!dir.mkpath(name)) {
\r
696 QMessageBox::critical(
\r
698 tr("フォルダの作成に失敗しました。"));
\r
703 void FileTableView::XXX()
\r
707 qDebug() << sender()->objectName() << "に対するスロットは未実装です。";
\r
710 void FileTableView::askOverWrite(bool *bOk, int *prevCopyMethod, int *copyMethod,
\r
711 QString *alias, const QString &srcPath,
\r
712 const QString &tgtPath)
\r
714 OverWriteDialog dlg;
\r
715 dlg.setCopyMethod(*prevCopyMethod);
\r
716 dlg.setSameMethodChecked(*copyMethod != OverWriteDialog::Undefined);
\r
717 dlg.setFileInfo(srcPath, tgtPath);
\r
718 if (dlg.exec() == QDialog::Rejected) {
\r
722 *prevCopyMethod = dlg.copyMethod();
\r
723 if (dlg.isSameMethodChecked()) {
\r
724 *copyMethod = *prevCopyMethod;
\r
726 *alias = dlg.alias();
\r
729 CopyMoveWorker *worker = static_cast<CopyMoveWorker*>(sender());
\r
730 worker->endAsking();
\r
733 void FileTableView::setRootIndex(const QModelIndex &index)
\r
735 if (!index.isValid()) {
\r
739 FileTableModel *m = static_cast<FileTableModel*>(model());
\r
741 if (m->isDir(index)) {
\r
742 setRootPath(m->absoluteFilePath(index), true);
\r
746 void FileTableView::keyPressEvent(QKeyEvent *event)
\r
748 // Macでアクションが処理されないケースがあるため、
\r
749 // キーイベントを拾ってアクションシグナルを起動する
\r
750 QString modifier = QString::null;
\r
751 if (event->modifiers() & Qt::ShiftModifier) { modifier += "Shift+"; }
\r
752 if (event->modifiers() & Qt::ControlModifier) { modifier += "Ctrl+"; }
\r
753 if (event->modifiers() & Qt::AltModifier) { modifier += "Alt+"; }
\r
754 if (event->modifiers() & Qt::MetaModifier) { modifier += "Meta+"; }
\r
756 QString key = QKeySequence(event->key()).toString();
\r
757 QString ksq = QKeySequence(modifier + key).toString();
\r
759 if (!ksq.isEmpty()) {
\r
760 foreach (QObject *obj, getMainWnd()->children()) {
\r
761 QAction *action = qobject_cast<QAction*>(obj);
\r
763 foreach (const QKeySequence &keySeq, action->shortcuts()) {
\r
764 if (ksq == keySeq.toString()) {
\r
765 qDebug() << "emit " << ksq << " " << action->objectName();
\r
766 emit action->triggered();
\r
775 if (!ksq.isEmpty()) {
\r
778 QTableView::keyPressEvent(event);
\r
781 void FileTableView::focusInEvent(QFocusEvent *event)
\r
785 QTableView::focusInEvent(event);
\r
788 void FileTableView::currentChanged(const QModelIndex ¤t, const QModelIndex &previous)
\r
790 Q_UNUSED(previous);
\r
791 selectRow(current.row());
\r
792 QTableView::currentChanged(current, previous);
\r
794 const FileTableModel *m = static_cast<const FileTableModel*>(current.model());
\r
795 emit indexChanged(m->fileInfo(current).absoluteFilePath());
\r