support Ctrl+Shift+T to recover last closed files

Add config LastClosedFile in [shortcuts] of vnote.ini.
This commit is contained in:
Le Tan 2017-10-22 14:23:53 +08:00
parent f01131caff
commit ae19191917
7 changed files with 70 additions and 2 deletions

View File

@ -15,6 +15,8 @@ Quit VNote.
VNote supports `Ctrl+J` and `Ctrl+K` for navigation in the notebooks list, directories list, notes list, opened notes list, and outline list. VNote supports `Ctrl+J` and `Ctrl+K` for navigation in the notebooks list, directories list, notes list, opened notes list, and outline list.
- `Ctrl+Left Mouse` - `Ctrl+Left Mouse`
Scroll in all directions. Scroll in all directions.
- `Ctrl+Shift+T`
Recover last closed file.
### Read Mode ### Read Mode
- `Ctrl+W` - `Ctrl+W`

View File

@ -15,6 +15,8 @@
在笔记本列表、文件夹列表、笔记列表、已打开笔记列表和大纲目录中,均支持`Ctrl+J``Ctrl+K`导航。 在笔记本列表、文件夹列表、笔记列表、已打开笔记列表和大纲目录中,均支持`Ctrl+J``Ctrl+K`导航。
- `Ctrl+Left Mouse` - `Ctrl+Left Mouse`
任意滚动。 任意滚动。
- `Ctrl+Shift+T`
恢复上一个关闭的文件。
### 阅读模式 ### 阅读模式
- `Ctrl+W` - `Ctrl+W`

View File

@ -191,6 +191,8 @@ Find=Ctrl+F
FindNext=F3 FindNext=F3
; Find previous occurence ; Find previous occurence
FindPrevious=Shift+F3 FindPrevious=Shift+F3
; Recover last closed file
LastClosedFile=Ctrl+Shift+T
[captain_mode_shortcuts] [captain_mode_shortcuts]
; Define shortcuts in Captain mode here. ; Define shortcuts in Captain mode here.

View File

@ -70,6 +70,22 @@ void VEditArea::setupUI()
connect(m_findReplace, &VFindReplaceDialog::dialogClosed, connect(m_findReplace, &VFindReplaceDialog::dialogClosed,
this, &VEditArea::handleFindDialogClosed); this, &VEditArea::handleFindDialogClosed);
m_findReplace->hide(); m_findReplace->hide();
// Shortcut Ctrl+Shift+T to open last closed file.
QString keySeq = g_config->getShortcutKeySequence("LastClosedFile");
qDebug() << "set LastClosedFile shortcut to" << keySeq;
QShortcut *lastClosedFileShortcut = new QShortcut(QKeySequence(keySeq), this);
lastClosedFileShortcut->setContext(Qt::ApplicationShortcut);
connect(lastClosedFileShortcut, &QShortcut::activated,
this, [this]() {
if (!m_lastClosedFiles.isEmpty()) {
const VFileSessionInfo &file = m_lastClosedFiles.top();
QVector<VFileSessionInfo> files(1, file);
m_lastClosedFiles.pop();
openFiles(files);
}
});
} }
void VEditArea::insertSplitWindow(int idx) void VEditArea::insertSplitWindow(int idx)
@ -947,3 +963,16 @@ void VEditArea::evaluateMagicWordsByCaptain(void *p_target, void *p_data)
} }
} }
void VEditArea::recordClosedFile(const VFileSessionInfo &p_file)
{
for (auto it = m_lastClosedFiles.begin(); it != m_lastClosedFiles.end(); ++it) {
if (it->m_file == p_file.m_file) {
// Remove it.
m_lastClosedFiles.erase(it);
break;
}
}
m_lastClosedFiles.push(p_file);
qDebug() << "pushed closed file" << p_file.m_file;
}

View File

@ -8,11 +8,12 @@
#include <QDir> #include <QDir>
#include <QVector> #include <QVector>
#include <QPair> #include <QPair>
#include <QtDebug>
#include <QSplitter> #include <QSplitter>
#include <QStack>
#include "vnotebook.h" #include "vnotebook.h"
#include "veditwindow.h" #include "veditwindow.h"
#include "vnavigationmode.h" #include "vnavigationmode.h"
#include "vfilesessioninfo.h"
class VFile; class VFile;
class VDirectory; class VDirectory;
@ -76,6 +77,9 @@ public:
// Open files @p_files. // Open files @p_files.
int openFiles(const QVector<VFileSessionInfo> &p_files); int openFiles(const QVector<VFileSessionInfo> &p_files);
// Record a closed file in the stack.
void recordClosedFile(const VFileSessionInfo &p_file);
signals: signals:
// Emit when current window's tab status updated. // Emit when current window's tab status updated.
void tabStatusUpdated(const VEditTabInfo &p_info); void tabStatusUpdated(const VEditTabInfo &p_info);
@ -199,6 +203,9 @@ private:
QSplitter *splitter; QSplitter *splitter;
VFindReplaceDialog *m_findReplace; VFindReplaceDialog *m_findReplace;
// Last closed files stack.
QStack<VFileSessionInfo> m_lastClosedFiles;
// Navigation Mode. // Navigation Mode.
// Map second key to VEditWindow. // Map second key to VEditWindow.
QMap<QChar, VEditWindow *> m_keyMap; QMap<QChar, VEditWindow *> m_keyMap;

View File

@ -302,18 +302,25 @@ bool VEditWindow::closeFile(const VFile *p_file, bool p_forced)
VEditTab *editor = getTab(idx); VEditTab *editor = getTab(idx);
Q_ASSERT(editor); Q_ASSERT(editor);
VEditTabInfo tabInfo = editor->fetchTabInfo();
VFileSessionInfo info = VFileSessionInfo::fromEditTabInfo(&tabInfo);
if (!p_forced) { if (!p_forced) {
setCurrentIndex(idx); setCurrentIndex(idx);
updateTabStatus(idx); updateTabStatus(idx);
} }
// Even p_forced is true we need to delete unused images. // Even p_forced is true we need to delete unused images.
bool ok = editor->closeFile(p_forced); bool ok = editor->closeFile(p_forced);
if (ok) { if (ok) {
removeEditTab(idx); removeEditTab(idx);
m_editArea->recordClosedFile(info);
} }
if (count() == 0) { if (count() == 0) {
emit requestRemoveSplit(this); emit requestRemoveSplit(this);
} }
return ok; return ok;
} }
@ -362,22 +369,30 @@ bool VEditWindow::closeAllFiles(bool p_forced)
for (int i = 0; i < nrTab; ++i) { for (int i = 0; i < nrTab; ++i) {
VEditTab *editor = getTab(0); VEditTab *editor = getTab(0);
VEditTabInfo tabInfo = editor->fetchTabInfo();
VFileSessionInfo info = VFileSessionInfo::fromEditTabInfo(&tabInfo);
if (!p_forced) { if (!p_forced) {
setCurrentIndex(0); setCurrentIndex(0);
updateTabStatus(0); updateTabStatus(0);
} }
// Even p_forced is true we need to delete unused images. // Even p_forced is true we need to delete unused images.
bool ok = editor->closeFile(p_forced); bool ok = editor->closeFile(p_forced);
if (ok) { if (ok) {
removeEditTab(0); removeEditTab(0);
m_editArea->recordClosedFile(info);
} else { } else {
ret = false; ret = false;
break; break;
} }
} }
if (count() == 0) { if (count() == 0) {
emit requestRemoveSplit(this); emit requestRemoveSplit(this);
} }
return ret; return ret;
} }
@ -420,9 +435,13 @@ bool VEditWindow::closeTab(int p_index)
{ {
VEditTab *editor = getTab(p_index); VEditTab *editor = getTab(p_index);
Q_ASSERT(editor); Q_ASSERT(editor);
VEditTabInfo tabInfo = editor->fetchTabInfo();
VFileSessionInfo info = VFileSessionInfo::fromEditTabInfo(&tabInfo);
bool ok = editor->closeFile(false); bool ok = editor->closeFile(false);
if (ok) { if (ok) {
removeEditTab(p_index); removeEditTab(p_index);
m_editArea->recordClosedFile(info);
} }
// User clicks the close button. We should make this window // User clicks the close button. We should make this window
@ -431,6 +450,7 @@ bool VEditWindow::closeTab(int p_index)
if (count() == 0) { if (count() == 0) {
emit requestRemoveSplit(this); emit requestRemoveSplit(this);
} }
return ok; return ok;
} }

View File

@ -343,7 +343,13 @@ VFile *VNote::getFile(const QString &p_path)
{ {
VFile *file = getInternalFile(p_path); VFile *file = getInternalFile(p_path);
if (!file) { if (!file) {
QFileInfo fi(p_path);
if (fi.isNativePath()) {
file = getOrphanFile(p_path, true, false); file = getOrphanFile(p_path, true, false);
} else {
// File in Qt resource system.
file = getOrphanFile(p_path, false, true);
}
} }
return file; return file;