Skip to content

Commit a19e6cf

Browse files
committed
Added file history, to easily open recent file
1 parent e2598b5 commit a19e6cf

File tree

3 files changed

+110
-10
lines changed

3 files changed

+110
-10
lines changed

UI/mainwindow.cpp

Lines changed: 84 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,7 @@ MainWindow::MainWindow(QWidget *parent) :
119119
QAction* act_loop = new QAction("Loop", this);
120120
act_loop->setCheckable(true);
121121

122+
// ===== File Edit =====
122123

123124
QAction* act_newFile = new QAction("New", this);
124125
act_newFile->setShortcut(QKeySequence::New);
@@ -128,6 +129,23 @@ MainWindow::MainWindow(QWidget *parent) :
128129
act_openFile->setShortcut(QKeySequence::Open);
129130
connect(act_openFile, SIGNAL(triggered()), this, SLOT(open()));
130131

132+
133+
QAction* act_clearRecentFiles = new QAction("Clear recent files", this);
134+
connect(act_clearRecentFiles, SIGNAL(triggered()), this, SLOT(clearRecentFiles()));
135+
136+
menu_openRecentFile = new QMenu("Open Recent", this);
137+
for (int i = 0; i < maxRecentFile; ++i)
138+
{
139+
recentFileActs[i] = new QAction(this);
140+
recentFileActs[i]->setVisible(false);
141+
connect(recentFileActs[i], SIGNAL(triggered()),
142+
this, SLOT(openRecent()));
143+
menu_openRecentFile->addAction(recentFileActs[i]);
144+
}
145+
menu_openRecentFile->addSeparator();
146+
menu_openRecentFile->addAction(act_clearRecentFiles);
147+
148+
131149
QAction* act_saveFile = new QAction("Save", this);
132150
act_saveFile->setShortcut(QKeySequence::Save);
133151
connect(act_saveFile, SIGNAL(triggered()), this, SLOT(save()));
@@ -154,6 +172,7 @@ MainWindow::MainWindow(QWidget *parent) :
154172

155173
ui->menuFile->addAction(act_newFile);
156174
ui->menuFile->addAction(act_openFile);
175+
ui->menuFile->addMenu(menu_openRecentFile);
157176
ui->menuFile->addAction(act_saveFile);
158177
ui->menuFile->addAction(act_saveAsFile);
159178
ui->menuFile->addSeparator();
@@ -216,7 +235,6 @@ MainWindow::MainWindow(QWidget *parent) :
216235
}");
217236

218237

219-
220238
setFileName("");
221239

222240
m_dirtyable = true;
@@ -249,9 +267,22 @@ void MainWindow::setFileName(QString fileName)
249267
else
250268
{
251269
m_windowTitle = fileName.mid(fileName.lastIndexOf('/') + 1);
270+
271+
// add new filename in recent files
272+
QSettings settings;
273+
QStringList files = settings.value("recentFileList").toStringList();
274+
files.removeAll(fileName);
275+
files.prepend(fileName);
276+
while (files.size() > maxRecentFile)
277+
files.removeLast();
278+
279+
settings.setValue("recentFileList", files);
280+
252281
}
253282
m_dirty = false;
254283
updateWindowTitle();
284+
285+
updateRecentFileActions();
255286
}
256287

257288
void MainWindow::closeEvent(QCloseEvent *event)
@@ -350,18 +381,29 @@ void MainWindow::open()
350381

351382
QString fileName = QFileDialog::getOpenFileName(this, "Open Project", ".", "Project (*.proj)");
352383

353-
if(QFile::exists(fileName))
354-
{
355-
m_dirtyable = false;
356-
qreal duration;
357-
ui->nodalView->load(fileName, duration);
358-
m_signal.setDuration(duration);
359-
m_dirtyable = true;
360-
setFileName(fileName);
361-
}
384+
openFile(fileName);
385+
}
386+
}
387+
388+
void MainWindow::openRecent()
389+
{
390+
QAction *action = qobject_cast<QAction *>(sender());
391+
if (action)
392+
{
393+
openFile(action->data().toString());
362394
}
363395
}
364396

397+
void MainWindow::clearRecentFiles()
398+
{
399+
QSettings settings;
400+
QStringList files = settings.value("recentFileList").toStringList();
401+
files.clear();
402+
settings.setValue("recentFileList", files);
403+
404+
updateRecentFileActions();
405+
}
406+
365407
void MainWindow::about()
366408
{
367409
QMessageBox box(QMessageBox::NoIcon, "About " + Utils::AppName,
@@ -446,6 +488,19 @@ void MainWindow::createMenus()
446488

447489
}
448490

491+
void MainWindow::openFile(QString fileName)
492+
{
493+
if(QFile::exists(fileName))
494+
{
495+
m_dirtyable = false;
496+
qreal duration;
497+
ui->nodalView->load(fileName, duration);
498+
m_signal.setDuration(duration);
499+
m_dirtyable = true;
500+
setFileName(fileName);
501+
}
502+
}
503+
449504
void MainWindow::saveFile(QString fileName)
450505
{
451506
setFileName(fileName);
@@ -465,3 +520,22 @@ void MainWindow::updateWindowTitle()
465520
{
466521
setWindowTitle(Utils::AppName + " [" + m_windowTitle + (m_dirty ? " *" : "") + "]");
467522
}
523+
524+
void MainWindow::updateRecentFileActions()
525+
{
526+
QSettings settings;
527+
QStringList files = settings.value("recentFileList").toStringList();
528+
529+
int numRecentFiles = qMin(files.size(), maxRecentFile);
530+
531+
for (int i = 0; i < numRecentFiles; ++i) {
532+
QString text = QString("&%1 %2").arg(i + 1).arg(QFileInfo(files[i]).fileName());
533+
recentFileActs[i]->setText(text);
534+
recentFileActs[i]->setData(files[i]);
535+
recentFileActs[i]->setVisible(true);
536+
}
537+
for (int j = numRecentFiles; j < maxRecentFile; ++j)
538+
recentFileActs[j]->setVisible(false);
539+
540+
menu_openRecentFile->setEnabled(numRecentFiles > 0);
541+
}

UI/mainwindow.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,8 @@ public slots:
5858
void save();
5959
void saveAs();
6060
void open();
61+
void openRecent();
62+
void clearRecentFiles();
6163
void about();
6264
void exportWAV();
6365
void quit();
@@ -69,11 +71,15 @@ public slots:
6971
private:
7072
void createActions();
7173
void createMenus();
74+
void openFile(QString fileName);
7275
void saveFile(QString fileName);
7376
QMessageBox::StandardButton askSaveChanges(QString action);
7477
void updateWindowTitle();
78+
void updateRecentFileActions();
7579

7680
private:
81+
static const int maxRecentFile = 10;
82+
7783
Ui::MainWindow *ui;
7884
QGraphicsScene* scene;
7985

@@ -84,6 +90,9 @@ public slots:
8490
bool m_dirtyable;
8591

8692
QString m_windowTitle;
93+
94+
QAction* recentFileActs[maxRecentFile];
95+
QMenu* menu_openRecentFile;
8796
};
8897

8998
#endif // MAINWINDOW_H

UI/mainwindow.ui

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -505,6 +505,23 @@ QMenu
505505
background: rgb(50, 50, 50);
506506
}
507507

508+
QMenu::separator
509+
{
510+
height: 1px;
511+
background-color: rgb(100, 100, 100);
512+
margin: 5px, 5px, 5px, 5px;
513+
}
514+
515+
QMenu:disabled
516+
{
517+
color: rgb(100, 100, 100);
518+
}
519+
520+
QAction:disabled
521+
{
522+
color: rgb(100, 100, 100);
523+
}
524+
508525
/* QToolBar */
509526
QToolBar
510527
{

0 commit comments

Comments
 (0)