add support to store the 5 most recent files and add them to the file menu

This commit is contained in:
Axel Kohlmeyer
2023-08-09 22:22:17 -04:00
parent f1ba4227dc
commit cb4eee809d
5 changed files with 123 additions and 14 deletions

View File

@ -8,11 +8,8 @@ LAMMPS-GUI TODO list:
handle "&" continuation and multiline strings with """ like C style comments in Qt docs example
- add CTRL-q hotkey to log windows so you can exit the entire application (add do you really want to? dialog to this)
- add "syntax check" with enabled "-skiprun" flag
- add multi-tab settings dialog where certain properties can be set through customizing the LAMMPS command line
+ select Font
- add list of 5(?) most recently opened/saved files to file dialog (and also write to settings state on exit) (note: must store full path!)
- need to handle "label" and "jump" commands from within
- switch processing of input to line based commands
- need to handle "label" and "jump" commands from within ?
- switch processing of input to line based commands or?
- switch input file editor to read-only while loop is running
# Long term ideas

View File

@ -55,6 +55,7 @@
#endif
static const QString blank(" ");
static constexpr int MAXRECENT = 5;
// duplicate string
static char *mystrdup(const std::string &text)
@ -72,19 +73,21 @@ LammpsGui::LammpsGui(QWidget *parent, const char *filename) :
// enforce using the plain ASCII C locale within the GUI.
QLocale::setDefault(QLocale("C"));
// register QList<QString>
qRegisterMetaTypeStreamOperators<QList<QString>>("QList<QString>");
ui->setupUi(this);
this->setCentralWidget(ui->textEdit);
highlighter = new Highlighter(ui->textEdit->document());
capturer = new StdCapture;
current_file.clear();
current_dir = QDir(".").absolutePath();
recent_files.clear();
QCoreApplication::setOrganizationName("The LAMMPS Developers");
QCoreApplication::setOrganizationDomain("lammps.org");
QCoreApplication::setApplicationName("LAMMPS GUI");
// restorge and initialize settings
// restore and initialize settings
QSettings settings;
// switch configured accelerator back to "none" if needed.
@ -160,6 +163,8 @@ LammpsGui::LammpsGui(QWidget *parent, const char *filename) :
ui->textEdit->document()->setDefaultFont(text_font);
ui->textEdit->setMinimumSize(600, 400);
update_recents();
connect(ui->actionNew, &QAction::triggered, this, &LammpsGui::new_document);
connect(ui->actionOpen, &QAction::triggered, this, &LammpsGui::open);
connect(ui->actionSave, &QAction::triggered, this, &LammpsGui::save);
@ -180,6 +185,11 @@ LammpsGui::LammpsGui(QWidget *parent, const char *filename) :
connect(ui->actionDefaults, &QAction::triggered, this, &LammpsGui::defaults);
connect(ui->actionView_Log_Window, &QAction::triggered, this, &LammpsGui::view_log);
connect(ui->actionView_Graph_Window, &QAction::triggered, this, &LammpsGui::view_chart);
connect(ui->action_1, &QAction::triggered, this, &LammpsGui::open_recent);
connect(ui->action_2, &QAction::triggered, this, &LammpsGui::open_recent);
connect(ui->action_3, &QAction::triggered, this, &LammpsGui::open_recent);
connect(ui->action_4, &QAction::triggered, this, &LammpsGui::open_recent);
connect(ui->action_5, &QAction::triggered, this, &LammpsGui::open_recent);
connect(ui->textEdit->document(), &QTextDocument::modificationChanged, this,
&LammpsGui::modified);
@ -260,6 +270,66 @@ void LammpsGui::open()
open_file(fileName);
}
void LammpsGui::open_recent()
{
QAction *act = qobject_cast<QAction *>(sender());
if (act) open_file(act->data().toString());
}
void LammpsGui::update_recents(const QString &filename)
{
QSettings settings;
recent = settings.value("recent").value<QList<QString>>();
for (int i = 0; i < recent.size(); ++i) {
QFileInfo fi(recent[i]);
if (!fi.isReadable()) {
recent.removeAt(i);
i = 0;
}
}
if (!filename.isEmpty() && !recent.contains(filename)) recent.prepend(filename);
if (recent.size() > 5) recent.removeLast();
settings.setValue("recent", QVariant::fromValue(recent));
ui->action_1->setVisible(false);
if ((recent.size() > 0) && !recent[0].isEmpty()) {
QFileInfo fi(recent[0]);
ui->action_1->setText(QString("1. ") + fi.fileName());
ui->action_1->setData(recent[0]);
ui->action_1->setVisible(true);
}
ui->action_2->setVisible(false);
if ((recent.size() > 1) && !recent[1].isEmpty()) {
QFileInfo fi(recent[1]);
ui->action_2->setText(QString("2. ") + fi.fileName());
ui->action_2->setData(recent[1]);
ui->action_2->setVisible(true);
}
ui->action_3->setVisible(false);
if ((recent.size() > 2) && !recent[2].isEmpty()) {
QFileInfo fi(recent[2]);
ui->action_3->setText(QString("3. ") + fi.fileName());
ui->action_3->setData(recent[2]);
ui->action_3->setVisible(true);
}
ui->action_4->setVisible(false);
if ((recent.size() > 3) && !recent[3].isEmpty()) {
QFileInfo fi(recent[3]);
ui->action_4->setText(QString("4. ") + fi.fileName());
ui->action_4->setData(recent[0]);
ui->action_4->setVisible(true);
}
ui->action_5->setVisible(false);
if ((recent.size() > 4) && !recent[4].isEmpty()) {
QFileInfo fi(recent[4]);
ui->action_5->setText(QString("5. ") + fi.fileName());
ui->action_5->setData(recent[0]);
ui->action_5->setVisible(true);
}
}
// open file and switch CWD to path of file
void LammpsGui::open_file(const QString &fileName)
{
@ -291,6 +361,8 @@ void LammpsGui::open_file(const QString &fileName)
current_dir = path.absolutePath();
QFile file(path.absoluteFilePath());
update_recents(path.absoluteFilePath());
QDir::setCurrent(current_dir);
if (!file.open(QIODevice::ReadOnly | QFile::Text)) {
QMessageBox::warning(this, "Warning",
@ -310,16 +382,19 @@ void LammpsGui::open_file(const QString &fileName)
void LammpsGui::write_file(const QString &fileName)
{
QFile file(fileName);
QFileInfo path(file);
QFileInfo path(fileName);
current_file = path.fileName();
current_dir = path.absolutePath();
QFile file(path.absoluteFilePath());
if (!file.open(QIODevice::WriteOnly | QFile::Text)) {
QMessageBox::warning(this, "Warning", "Cannot save file: " + file.errorString());
return;
}
setWindowTitle(QString("LAMMPS-GUI - " + current_file));
update_recents(path.absoluteFilePath());
QTextStream out(&file);
QString text = ui->textEdit->toPlainText();
out << text;

View File

@ -56,12 +56,14 @@ public:
protected:
void open_file(const QString &filename);
void write_file(const QString &filename);
void update_recents(const QString &filename = "");
void start_lammps();
void run_done();
private slots:
void new_document();
void open();
void open_recent();
void save();
void save_as();
void quit();
@ -101,10 +103,11 @@ private:
QString current_file;
QString current_dir;
QList<QString> recent;
LammpsWrapper lammps;
std::string plugin_path;
bool is_running;
QList<QString> recent_files;
std::vector<char *> lammps_args;
};
#endif // LAMMPSGUI_H

View File

@ -27,7 +27,7 @@
<x>0</x>
<y>0</y>
<width>600</width>
<height>23</height>
<height>24</height>
</rect>
</property>
<widget class="QMenu" name="menuFile">
@ -35,8 +35,15 @@
<string>&amp;File</string>
</property>
<addaction name="actionNew"/>
<addaction name="separator"/>
<addaction name="actionOpen"/>
<addaction name="separator"/>
<addaction name="action_1"/>
<addaction name="action_2"/>
<addaction name="action_3"/>
<addaction name="action_4"/>
<addaction name="action_5"/>
<addaction name="separator"/>
<addaction name="actionSave"/>
<addaction name="actionSave_As"/>
<addaction name="separator"/>
@ -356,7 +363,8 @@
</action>
<action name="actionView_Log_Window">
<property name="icon">
<iconset theme="utilities-terminal"/>
<iconset theme="utilities-terminal">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="text">
<string>&amp;Log Window</string>
@ -364,12 +372,38 @@
</action>
<action name="actionView_Graph_Window">
<property name="icon">
<iconset theme="x-office-drawing"/>
<iconset theme="x-office-drawing">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="text">
<string>&amp;Chart Window</string>
</property>
</action>
<action name="action_1">
<property name="text">
<string>&amp;1.</string>
</property>
</action>
<action name="action_2">
<property name="text">
<string>&amp;2.</string>
</property>
</action>
<action name="action_3">
<property name="text">
<string>&amp;3.</string>
</property>
</action>
<action name="action_4">
<property name="text">
<string>&amp;4.</string>
</property>
</action>
<action name="action_5">
<property name="text">
<string>&amp;5.</string>
</property>
</action>
</widget>
<customwidgets>
<customwidget>

View File

@ -32,7 +32,7 @@ public:
emit resultReady();
}
// transfer info to worker thread
// transfer info to worker thread and reset LAMMPS instance
void setup_run(LammpsWrapper *_lammps, const char *_input)
{
lammps = _lammps;