sync LAMMPS-GUI with state from develop branch
This commit is contained in:
@ -23,18 +23,22 @@
|
||||
// workaround for Qt-5.12
|
||||
#if QT_VERSION < QT_VERSION_CHECK(5, 14, 0)
|
||||
namespace QColorConstants {
|
||||
const QColor Red = QColor::fromRgb(0xff, 0x00, 0x00);
|
||||
const QColor Red = QColor::fromRgb(0xff, 0x00, 0x00);
|
||||
const QColor Blue = QColor::fromRgb(0x00, 0x00, 0xff);
|
||||
} // namespace QColorConstants
|
||||
#endif
|
||||
|
||||
FlagWarnings::FlagWarnings(QLabel *label, QTextDocument *parent) :
|
||||
QSyntaxHighlighter(parent), isWarning(QStringLiteral("^(ERROR|WARNING).*$")), summary(label),
|
||||
QSyntaxHighlighter(parent), isWarning(QStringLiteral("^(ERROR|WARNING).*$")),
|
||||
isURL(QStringLiteral("^.*(https://docs.lammps.org/err[0-9]+).*$")), summary(label),
|
||||
document(parent)
|
||||
{
|
||||
nwarnings = nlines = 0;
|
||||
|
||||
formatWarning.setForeground(QColorConstants::Red);
|
||||
formatWarning.setFontWeight(QFont::Bold);
|
||||
formatURL.setForeground(QColorConstants::Blue);
|
||||
formatURL.setFontWeight(QFont::Bold);
|
||||
}
|
||||
|
||||
void FlagWarnings::highlightBlock(const QString &text)
|
||||
@ -42,11 +46,20 @@ void FlagWarnings::highlightBlock(const QString &text)
|
||||
// nothing to do for empty lines
|
||||
if (text.isEmpty()) return;
|
||||
|
||||
// highlight errors or warnings
|
||||
auto match = isWarning.match(text);
|
||||
if (match.hasMatch()) {
|
||||
++nwarnings;
|
||||
setFormat(match.capturedStart(0), match.capturedLength(0), formatWarning);
|
||||
}
|
||||
|
||||
// highlight ErrorURL links
|
||||
match = isURL.match(text);
|
||||
if (match.hasMatch()) {
|
||||
setFormat(match.capturedStart(1), match.capturedLength(1), formatURL);
|
||||
}
|
||||
|
||||
// update error summary label
|
||||
if (document && summary) {
|
||||
summary->setText(
|
||||
QString("%1 Warnings / Errors - %2 Lines").arg(nwarnings).arg(document->lineCount()));
|
||||
|
||||
@ -33,7 +33,9 @@ protected:
|
||||
|
||||
private:
|
||||
QRegularExpression isWarning;
|
||||
QRegularExpression isURL;
|
||||
QTextCharFormat formatWarning;
|
||||
QTextCharFormat formatURL;
|
||||
QLabel *summary;
|
||||
QTextDocument *document;
|
||||
int nwarnings, nlines;
|
||||
|
||||
@ -783,6 +783,7 @@ fix_wall.html fix wall/morse
|
||||
fix_wall.html fix wall/table
|
||||
fix_wall_srd.html fix wall/srd
|
||||
fix_widom.html fix widom
|
||||
geturl.html geturl
|
||||
group2ndx.html group2ndx
|
||||
group2ndx.html ndx2group
|
||||
group.html group
|
||||
|
||||
@ -63,6 +63,8 @@
|
||||
Add text fields for editing plot title and axis labels for charts
|
||||
Add option to automatically open tutorial websites (enabled by default)
|
||||
Add preferences tab for charts to set default for title, plot colors, smooth/raw plot, smooth params
|
||||
Highlight error URLs with pointers to additional explanations in log window
|
||||
Double-click on highlighted URL opens it in web browser. Also available via context menu.
|
||||
</description>
|
||||
</release>
|
||||
<release version="1.6.12" timestamp="1734890080">
|
||||
|
||||
@ -18,6 +18,7 @@
|
||||
|
||||
#include <QAction>
|
||||
#include <QApplication>
|
||||
#include <QDesktopServices>
|
||||
#include <QFile>
|
||||
#include <QFileDialog>
|
||||
#include <QGridLayout>
|
||||
@ -37,6 +38,7 @@
|
||||
|
||||
const QString LogWindow::yaml_regex =
|
||||
QStringLiteral("^(keywords:.*$|data:$|---$|\\.\\.\\.$| - \\[.*\\]$)");
|
||||
const QString LogWindow::url_regex = QStringLiteral("^.*(https://docs.lammps.org/err[0-9]+).*$");
|
||||
|
||||
LogWindow::LogWindow(const QString &_filename, QWidget *parent) :
|
||||
QPlainTextEdit(parent), filename(_filename), warnings(nullptr)
|
||||
@ -198,8 +200,53 @@ void LogWindow::extract_yaml()
|
||||
file.close();
|
||||
}
|
||||
|
||||
void LogWindow::open_errorurl()
|
||||
{
|
||||
if (!errorurl.isEmpty()) QDesktopServices::openUrl(QUrl(errorurl));
|
||||
}
|
||||
|
||||
void LogWindow::mouseDoubleClickEvent(QMouseEvent *event)
|
||||
{
|
||||
if (event->button() == Qt::LeftButton) {
|
||||
// select the entire word (non-space text) under the cursor
|
||||
// we need to do it in this complicated way, since QTextCursor does not recognize
|
||||
// special characters as part of a word.
|
||||
auto cursor = textCursor();
|
||||
auto line = cursor.block().text();
|
||||
int begin = qMin(cursor.positionInBlock(), line.length() - 1);
|
||||
|
||||
while (begin >= 0) {
|
||||
if (line[begin].isSpace()) break;
|
||||
--begin;
|
||||
}
|
||||
|
||||
int end = begin + 1;
|
||||
while (end < line.length()) {
|
||||
if (line[end].isSpace()) break;
|
||||
++end;
|
||||
}
|
||||
cursor.setPosition(cursor.position() - cursor.positionInBlock() + begin + 1);
|
||||
cursor.movePosition(QTextCursor::NextCharacter, QTextCursor::KeepAnchor, end - begin - 1);
|
||||
|
||||
auto text = cursor.selectedText();
|
||||
auto url = QRegularExpression(url_regex).match(text);
|
||||
if (url.hasMatch()) {
|
||||
errorurl = url.captured(1);
|
||||
if (!errorurl.isEmpty()) {
|
||||
QDesktopServices::openUrl(QUrl(errorurl));
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
// forward event to parent class for all unhandled cases
|
||||
QPlainTextEdit::mouseDoubleClickEvent(event);
|
||||
}
|
||||
|
||||
void LogWindow::contextMenuEvent(QContextMenuEvent *event)
|
||||
{
|
||||
// reposition the cursor here, but only if there is no active selection
|
||||
if (!textCursor().hasSelection()) setTextCursor(cursorForPosition(event->pos()));
|
||||
|
||||
// show augmented context menu
|
||||
auto *menu = createStandardContextMenu();
|
||||
menu->addSeparator();
|
||||
@ -214,6 +261,15 @@ void LogWindow::contextMenuEvent(QContextMenuEvent *event)
|
||||
action->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_Y));
|
||||
connect(action, &QAction::triggered, this, &LogWindow::extract_yaml);
|
||||
}
|
||||
|
||||
// process line of text where the cursor is
|
||||
auto text = textCursor().block().text().replace('\t', ' ').trimmed();
|
||||
auto url = QRegularExpression(url_regex).match(text);
|
||||
if (url.hasMatch()) {
|
||||
errorurl = url.captured(1);
|
||||
action = menu->addAction("Open &URL in Web Browser", this, &LogWindow::open_errorurl);
|
||||
action->setIcon(QIcon(":/icons/help-browser.png"));
|
||||
}
|
||||
action = menu->addAction("&Jump to next warning or error", this, &LogWindow::next_warning);
|
||||
action->setIcon(QIcon(":/icons/warning.png"));
|
||||
action->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_N));
|
||||
|
||||
@ -32,16 +32,20 @@ private slots:
|
||||
void save_as();
|
||||
void stop_run();
|
||||
void next_warning();
|
||||
void open_errorurl();
|
||||
|
||||
protected:
|
||||
void closeEvent(QCloseEvent *event) override;
|
||||
void mouseDoubleClickEvent(QMouseEvent *event) override;
|
||||
void contextMenuEvent(QContextMenuEvent *event) override;
|
||||
bool eventFilter(QObject *watched, QEvent *event) override;
|
||||
bool check_yaml();
|
||||
|
||||
private:
|
||||
QString filename;
|
||||
QString errorurl;
|
||||
static const QString yaml_regex;
|
||||
static const QString url_regex;
|
||||
FlagWarnings *warnings;
|
||||
QLabel *summary;
|
||||
};
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
id: org.lammps.lammps-gui
|
||||
runtime: org.kde.Platform
|
||||
runtime-version: "5.15-23.08"
|
||||
runtime-version: "5.15-24.08"
|
||||
sdk: org.kde.Sdk
|
||||
command: lammps-gui
|
||||
finish-args:
|
||||
|
||||
Reference in New Issue
Block a user