Skip to content

Commit 06fcc1e

Browse files
committed
Create a list of recent files
1 parent 92840bf commit 06fcc1e

File tree

15 files changed

+98
-23
lines changed

15 files changed

+98
-23
lines changed

qrgui/mainWindow/mainWindow.cpp

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,7 @@ MainWindow::MainWindow(const QString &fileToOpen)
111111
, mRootIndex(QModelIndex())
112112
, mPreferencesDialog(new gui::PreferencesDialog(this))
113113
, mRecentProjectsLimit(SettingsManager::value("recentProjectsLimit").toInt())
114+
, mRecentFilesLimit(SettingsManager::value("recentFilesLimit").toInt())
114115
, mSceneCustomizer(new SceneCustomizer())
115116
, mInitialFileToOpen(fileToOpen)
116117
{
@@ -614,6 +615,26 @@ void MainWindow::openRecentProjectsMenu()
614615
}
615616
}
616617

618+
void MainWindow::openRecentFilesMenu()
619+
{
620+
mRecentFilesMenu->clear();
621+
const QString stringList = SettingsManager::value("recentFiles").toString();
622+
QStringList recentFiles = stringList.split(";", QString::SkipEmptyParts);
623+
mRecentFilesLimit = SettingsManager::value("recentFilesLimit", mRecentFilesLimit).toInt();
624+
while (recentFiles.size() > mRecentFilesLimit) {
625+
recentFiles.pop_front();
626+
}
627+
628+
for (const QString &filePath : recentFiles) {
629+
const QFileInfo fileInfo(filePath);
630+
if (fileInfo.exists() && fileInfo.isFile()) {
631+
mRecentFilesMenu->addAction(filePath);
632+
QObject::connect(mRecentFilesMenu->actions().last(), &QAction::triggered
633+
, &*mProjectManager, [this, filePath](){ mProjectManager->openExisting(filePath);});
634+
}
635+
}
636+
}
637+
617638
void MainWindow::tryToSave()
618639
{
619640
if(!mProjectManager->saveText() && !mProjectManager->saveOrSuggestToSaveAs()) {
@@ -2117,6 +2138,10 @@ void MainWindow::initRecentProjectsMenu()
21172138
mRecentProjectsMenu = new QMenu(tr("Recent projects"), mUi->menu_File);
21182139
mUi->menu_File->insertMenu(mUi->menu_File->actions().at(1), mRecentProjectsMenu);
21192140
connect(mRecentProjectsMenu, &QMenu::aboutToShow, this, &MainWindow::openRecentProjectsMenu);
2141+
2142+
mRecentFilesMenu = new QMenu(tr("Recent files"), mUi->menu_File);
2143+
mUi->menu_File->insertMenu(mUi->menu_File->actions().at(2), mRecentFilesMenu);
2144+
connect(mRecentFilesMenu, &QMenu::aboutToShow, this, &MainWindow::openRecentFilesMenu);
21202145
}
21212146

21222147
void MainWindow::saveDiagramAsAPictureToFile(const QString &fileName)

qrgui/mainWindow/mainWindow.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -230,6 +230,7 @@ private slots:
230230
void hideBottomDocks();
231231

232232
void openRecentProjectsMenu();
233+
void openRecentFilesMenu();
233234

234235
void tryToSave();
235236
void saveDiagramAsAPicture();
@@ -395,7 +396,9 @@ private slots:
395396
qReal::gui::PreferencesDialog *mPreferencesDialog; //Has ownership
396397

397398
int mRecentProjectsLimit {};
399+
int mRecentFilesLimit {};
398400
QMenu *mRecentProjectsMenu {}; // Has ownership
401+
QMenu *mRecentFilesMenu {}; // Has ownership
399402

400403
QScopedPointer<FindManager> mFindHelper;
401404
StartWidget *mStartWidget {}; // Has ownership

qrgui/mainWindow/projectManager/projectManagerWrapper.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ bool ProjectManagerWrapper::open(const QString &fileName)
106106
} else if (fileInfo.exists()) {
107107
Id localActiveDiagram = mMainWindow->activeDiagram();
108108
mMainWindow->closeStartTab();
109-
mTextManager->showInTextEditor(fileInfo, text::Languages::pickByExtension(fileInfo.suffix()));
109+
mTextManager->showInTextEditor(fileInfo, text::Languages::pickByExtension(fileInfo.suffix()), true);
110110
if (localActiveDiagram.isNull() && !mMainWindow->activeDiagram().isNull()) {
111111
emit afterOpen(fileName);
112112
}

qrgui/systemFacade/components/nullTextManager.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,8 +112,9 @@ void NullTextManager::showInTextEditor(const QFileInfo &fileInfo
112112
Q_UNUSED(language)
113113
}
114114

115-
void NullTextManager::showInTextEditor(const QFileInfo &fileInfo, const text::LanguageInfo &language)
115+
void NullTextManager::showInTextEditor(const QFileInfo &fileInfo, const text::LanguageInfo &language, bool onOpen)
116116
{
117+
Q_UNUSED(onOpen)
117118
Q_UNUSED(fileInfo)
118119
Q_UNUSED(language)
119120
}

qrgui/systemFacade/components/nullTextManager.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,8 @@ class QRGUI_SYSTEM_FACADE_EXPORT NullTextManager : public TextManagerInterface
4646

4747
void showInTextEditor(const QFileInfo &fileInfo, const QString &genName
4848
, const text::LanguageInfo &language) override;
49-
void showInTextEditor(const QFileInfo &fileInfo, const text::LanguageInfo &language) override;
49+
50+
void showInTextEditor(const QFileInfo &fileInfo, const text::LanguageInfo &language, bool onOpen) override;
5051

5152
bool saveText(bool saveAs) override;
5253

qrgui/textEditor/textManager.cpp

Lines changed: 33 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,8 @@ using namespace qReal;
3030
using namespace text;
3131

3232
TextManager::TextManager(SystemEvents &systemEvents, gui::MainWindowInterpretersInterface &mainWindow)
33-
: mMainWindow(mainWindow)
33+
: mRecentFilesLimit(SettingsManager::value("recentFilesLimit").toInt())
34+
, mMainWindow(mainWindow)
3435
, mSystemEvents(systemEvents)
3536
{
3637
connect(&mSystemEvents, &SystemEvents::codeTabClosed, this, &TextManager::onTabClosed);
@@ -238,7 +239,32 @@ void TextManager::showInTextEditor(const QFileInfo &fileInfo
238239
}
239240
}
240241

241-
void TextManager::showInTextEditor(const QFileInfo &fileInfo, const text::LanguageInfo &language)
242+
void TextManager::refreshRecentFilesList(const QString &fileName) {
243+
QString previousString = SettingsManager::value("recentFiles").toString();
244+
QStringList previousList = previousString.split(";", QString::SkipEmptyParts);
245+
previousList.removeOne(fileName);
246+
247+
if (!previousList.isEmpty() && (previousList.size() == mRecentFilesLimit)) {
248+
previousList.removeLast();
249+
}
250+
251+
previousString.clear();
252+
if (mRecentFilesLimit > 0) {
253+
previousList.push_front(fileName);
254+
QStringListIterator iterator(previousList);
255+
while (iterator.hasNext()) {
256+
const auto recentFileName = iterator.next();
257+
const QFileInfo fileInfo(recentFileName);
258+
if (fileInfo.exists() && fileInfo.isFile()) {
259+
previousString = previousString + recentFileName + ";";
260+
}
261+
}
262+
}
263+
264+
SettingsManager::setValue("recentFiles", previousString);
265+
}
266+
267+
void TextManager::showInTextEditor(const QFileInfo &fileInfo, const text::LanguageInfo &language, bool onOpen)
242268
{
243269
Q_ASSERT(!fileInfo.completeBaseName().isEmpty());
244270

@@ -254,6 +280,9 @@ void TextManager::showInTextEditor(const QFileInfo &fileInfo, const text::Langua
254280
return;
255281
}
256282

283+
if (onOpen) {
284+
refreshRecentFilesList(filePath);
285+
}
257286
area->show();
258287

259288
// Need to bind diagram and code file only if code is just generated
@@ -289,7 +318,6 @@ bool TextManager::saveText(bool saveAs)
289318

290319
if (!fileInfo.fileName().isEmpty()) {
291320
mMainWindow.setTabText(area, fileInfo.fileName());
292-
293321
utils::OutFile out(fileInfo.absoluteFilePath());
294322

295323
out() << area->text();
@@ -304,6 +332,8 @@ bool TextManager::saveText(bool saveAs)
304332
if (saveAs && !diagram.isNull()) {
305333
emit mSystemEvents.codePathChanged(diagram, path(area), fileInfo);
306334
}
335+
336+
refreshRecentFilesList(fileInfo.absoluteFilePath());
307337
}
308338

309339
return true;

qrgui/textEditor/textManager.h

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
#include <QtCore/QObject>
1818
#include <QtCore/QMap>
1919
#include <QtCore/QMultiHash>
20-
20+
#include <qrkernel/settingsManager.h>
2121
#include "qrgui/textEditor/textEditorDeclSpec.h"
2222
#include "qrgui/textEditor/textManagerInterface.h"
2323
#include "qrgui/textEditor/codeBlockManager.h"
@@ -68,7 +68,7 @@ class QRGUI_TEXT_EDITOR_EXPORT TextManager : public TextManagerInterface
6868

6969
/// Opens new tab with file
7070
/// @param fileInfo A filepath to file with text
71-
void showInTextEditor(const QFileInfo &fileInfo, const LanguageInfo &language) override;
71+
void showInTextEditor(const QFileInfo &fileInfo, const LanguageInfo &language, bool onOpen) override;
7272

7373
/// Saves text from tab to another or same file
7474
/// @param saveAs Defines what to do: save to the same file or in another
@@ -82,12 +82,14 @@ private slots:
8282
void onTabClosed(const QFileInfo &file);
8383

8484
private:
85+
86+
void refreshRecentFilesList(const QString &fileName);
8587
QMap<QString, text::QScintillaTextEdit*> mText; // No ownership
8688
QMap<text::QScintillaTextEdit*, QString> mPath; // No ownership
8789

8890
/// If default path - true.
8991
QMap<QString, bool> mPathType;
90-
92+
int mRecentFilesLimit {};
9193
/// Contains names of generator, which generate each file
9294
QMap<QString, QString> mGeneratorName;
9395

qrgui/textEditor/textManagerInterface.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ class QRGUI_TEXT_EDITOR_EXPORT TextManagerInterface : public QObject
5050
virtual bool isModifiedEver(const QString &path) const = 0;
5151
virtual void showInTextEditor(const QFileInfo &fileInfo
5252
, const QString &genName, const text::LanguageInfo &language) = 0;
53-
virtual void showInTextEditor(const QFileInfo &fileInfo, const text::LanguageInfo &language) = 0;
53+
virtual void showInTextEditor(const QFileInfo &fileInfo, const text::LanguageInfo &language, bool onOpen=false) = 0;
5454
virtual bool saveText(bool saveAs) = 0;
5555
virtual QString generatorName(const QString &filepath) const = 0;
5656

qrkernel/settingsDefaultValues

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ pythonPath=python
6767
generationTimeout=100
6868
nodesStateButtonExpands=true
6969
recentProjectsLimit=5
70+
recentFilesLimit=7
7071
dragArea = 12
7172
touchMode=false
7273
scriptInterpretation=false

qrtest/unitTests/mocks/qrgui/textEditor/textManagerInterfaceMock.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ class TextManagerInterfaceMock : public qReal::TextManagerInterface
4141
MOCK_CONST_METHOD1(isModified, bool(const QString &));
4242
MOCK_CONST_METHOD1(isModifiedEver, bool(const QString &));
4343
MOCK_METHOD3(showInTextEditor, void(const QFileInfo &, const QString &, const qReal::text::LanguageInfo &));
44-
MOCK_METHOD2(showInTextEditor, void(const QFileInfo &, const qReal::text::LanguageInfo &));
44+
MOCK_METHOD3(showInTextEditor, void(const QFileInfo &, const qReal::text::LanguageInfo &, bool));
4545
MOCK_METHOD1(saveText, bool(bool));
4646
MOCK_CONST_METHOD1(generatorName, QString(const QString &));
4747
};

0 commit comments

Comments
 (0)