aboutsummaryrefslogtreecommitdiffstats
path: root/gui/line_editor.cc
diff options
context:
space:
mode:
authorMiodrag Milanovic <mmicko@gmail.com>2018-07-13 19:56:11 +0200
committerMiodrag Milanovic <mmicko@gmail.com>2018-07-13 19:56:11 +0200
commit07ff5ad8b8e4d0f87770b81b8478aa257567c504 (patch)
tree805d62b8e63e92919da29b86e3ed0290d0182dd4 /gui/line_editor.cc
parent013cfebcc5ccdf0fda9cedddd94e5b70ec20a029 (diff)
downloadnextpnr-07ff5ad8b8e4d0f87770b81b8478aa257567c504.tar.gz
nextpnr-07ff5ad8b8e4d0f87770b81b8478aa257567c504.tar.bz2
nextpnr-07ff5ad8b8e4d0f87770b81b8478aa257567c504.zip
Made python console use edit line and better
Diffstat (limited to 'gui/line_editor.cc')
-rw-r--r--gui/line_editor.cc56
1 files changed, 53 insertions, 3 deletions
diff --git a/gui/line_editor.cc b/gui/line_editor.cc
index 9d9dac25..3c7ebe94 100644
--- a/gui/line_editor.cc
+++ b/gui/line_editor.cc
@@ -2,6 +2,7 @@
* nextpnr -- Next Generation Place and Route
*
* Copyright (C) 2018 Miodrag Milanovic <miodrag@symbioticeda.com>
+ * Copyright (C) 2018 Alex Tsui
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
@@ -17,12 +18,18 @@
*
*/
+#ifndef NO_PYTHON
+
#include "line_editor.h"
#include <QKeyEvent>
+#include <QToolTip>
+#include "ColumnFormatter.h"
+#include "Utils.h"
+#include "pyinterpreter.h"
NEXTPNR_NAMESPACE_BEGIN
-LineEditor::LineEditor(QWidget *parent) : QLineEdit(parent), index(0)
+LineEditor::LineEditor(ParseHelper *helper, QWidget *parent) : QLineEdit(parent), index(0), parseHelper(helper)
{
setContextMenuPolicy(Qt::CustomContextMenu);
QAction *clearAction = new QAction("Clear &history", this);
@@ -38,10 +45,12 @@ LineEditor::LineEditor(QWidget *parent) : QLineEdit(parent), index(0)
void LineEditor::keyPressEvent(QKeyEvent *ev)
{
+
if (ev->key() == Qt::Key_Up || ev->key() == Qt::Key_Down) {
+ QToolTip::hideText();
if (lines.empty())
return;
-
+ printf("Key_Up\n");
if (ev->key() == Qt::Key_Up)
index--;
if (ev->key() == Qt::Key_Down)
@@ -56,12 +65,21 @@ void LineEditor::keyPressEvent(QKeyEvent *ev)
}
setText(lines[index]);
} else if (ev->key() == Qt::Key_Escape) {
+ QToolTip::hideText();
clear();
return;
+ } else if (ev->key() == Qt::Key_Tab) {
+ autocomplete();
+ return;
}
+ QToolTip::hideText();
+
QLineEdit::keyPressEvent(ev);
}
+// This makes TAB work
+bool LineEditor::focusNextPrevChild(bool next) { return false; }
+
void LineEditor::textInserted()
{
if (lines.empty() || lines.back() != text())
@@ -82,4 +100,36 @@ void LineEditor::clearHistory()
clear();
}
-NEXTPNR_NAMESPACE_END \ No newline at end of file
+void LineEditor::autocomplete()
+{
+ QString line = text();
+ const std::list<std::string> &suggestions = pyinterpreter_suggest(line.toStdString());
+ if (suggestions.size() == 1) {
+ line = suggestions.back().c_str();
+ } else {
+ // try to complete to longest common prefix
+ std::string prefix = LongestCommonPrefix(suggestions.begin(), suggestions.end());
+ if (prefix.size() > (size_t)line.size()) {
+ line = prefix.c_str();
+ } else {
+ ColumnFormatter fmt;
+ fmt.setItems(suggestions.begin(), suggestions.end());
+ fmt.format(width() / 5);
+ QString out = "";
+ for (auto &it : fmt.formattedOutput()) {
+ if (!out.isEmpty())
+ out += "\n";
+ out += it.c_str();
+ }
+ QToolTip::setFont(font());
+ if (!out.trimmed().isEmpty())
+ QToolTip::showText(mapToGlobal(QPoint(0, 0)), out);
+ }
+ }
+ // set up the next line on the console
+ setText(line);
+}
+
+NEXTPNR_NAMESPACE_END
+
+#endif // NO_PYTHON