History

Merge pull request #10798 from humbletim/add-persistent-console-history

Save JS "Console..." history across sessions

Chris Collins committed 9 years ago

Commit ceb218f2 parents bec7f7c 300b9262 files · +34 −8Browse files

Showing the changes to interface/src/ui/JSConsole.cpp (1 of 2 files). Show all

Unified · Split

interface/src/ui/JSConsole.cpp+33−8
@@ -24,13 +24,14 @@ · 23 unmodified lines
2424 #include "ScriptHighlighting.h"
2525
2626 const int NO_CURRENT_HISTORY_COMMAND = -1;
27−const int MAX_HISTORY_SIZE = 64;
27+const int MAX_HISTORY_SIZE = 256;
28+const QString HISTORY_FILENAME = "JSConsole.history.json";
2829
2930 const QString COMMAND_STYLE = "color: #266a9b;";
3031
3132 const QString RESULT_SUCCESS_STYLE = "color: #677373;";
3233 const QString RESULT_INFO_STYLE = "color: #223bd1;";
33−const QString RESULT_WARNING_STYLE = "color: #d13b22;";
34+const QString RESULT_WARNING_STYLE = "color: #999922;";
3435 const QString RESULT_ERROR_STYLE = "color: #d13b22;";
3536
3637 const QString GUTTER_PREVIOUS_COMMAND = "<span style=\"color: #57b8bb;\">&lt;</span>";
@@ -38,14 +39,35 @@ const QString GUTTER_ERROR = "<span style=\"color: #d13b22;\">X</span>"; · 1 unmodified line
3839
3940 const QString JSConsole::_consoleFileName { "about:console" };
4041
42+const QString JSON_KEY = "entries";
43+QList<QString> _readLines(const QString& filename) {
44+ QFile file(filename);
45+ file.open(QFile::ReadOnly);
46+ auto json = QTextStream(&file).readAll().toUtf8();
47+ auto root = QJsonDocument::fromJson(json).object();
48+ // TODO: check root["version"]
49+ return root[JSON_KEY].toVariant().toStringList();
50+}
51+
52+void _writeLines(const QString& filename, const QList<QString>& lines) {
53+ QFile file(filename);
54+ file.open(QFile::WriteOnly);
55+ auto root = QJsonObject();
56+ root["version"] = 1.0;
57+ root["last-modified"] = QDateTime::currentDateTime().toTimeSpec(Qt::OffsetFromUTC).toString(Qt::ISODate);
58+ root[JSON_KEY] = QJsonArray::fromStringList(lines);
59+ auto json = QJsonDocument(root).toJson();
60+ QTextStream(&file) << json;
61+}
62+
4163 JSConsole::JSConsole(QWidget* parent, ScriptEngine* scriptEngine) :
4264 QWidget(parent),
4365 _ui(new Ui::Console),
4466 _currentCommandInHistory(NO_CURRENT_HISTORY_COMMAND),
45− _commandHistory(),
67+ _savedHistoryFilename(QStandardPaths::writableLocation(QStandardPaths::DataLocation) + "/" + HISTORY_FILENAME),
68+ _commandHistory(_readLines(_savedHistoryFilename)),
4669 _ownScriptEngine(scriptEngine == NULL),
4770 _scriptEngine(NULL) {
48−
4971 _ui->setupUi(this);
5072 _ui->promptTextEdit->setLineWrapMode(QTextEdit::NoWrap);
5173 _ui->promptTextEdit->setWordWrapMode(QTextOption::NoWrap);
@@ -101,9 +123,12 @@ void JSConsole::setScriptEngine(ScriptEngine* scriptEngine) { · 49 unmodified lines
101123 }
102124
103125 void JSConsole::executeCommand(const QString& command) {
104− _commandHistory.prepend(command);
105− if (_commandHistory.length() > MAX_HISTORY_SIZE) {
106− _commandHistory.removeLast();
126+ if (_commandHistory.isEmpty() || _commandHistory.constFirst() != command) {
127+ _commandHistory.prepend(command);
128+ if (_commandHistory.length() > MAX_HISTORY_SIZE) {
129+ _commandHistory.removeLast();
130+ }
131+ _writeLines(_savedHistoryFilename, _commandHistory);
107132 }
108133
109134 _ui->promptTextEdit->setDisabled(true);
@@ -182,7 +207,7 @@ bool JSConsole::eventFilter(QObject* sender, QEvent* event) { · 72 unmodified lines
182207 // a new QTextBlock isn't created.
183208 keyEvent->setModifiers(keyEvent->modifiers() & ~Qt::ShiftModifier);
184209 } else {
185− QString command = _ui->promptTextEdit->toPlainText().trimmed();
210+ QString command = _ui->promptTextEdit->toPlainText().replace("\r\n","\n").trimmed();
186211
187212 if (!command.isEmpty()) {
188213 QTextCursor cursor = _ui->promptTextEdit->textCursor();

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t