SXXXXXXX_PyBusMonitor1553/cpp/GrifoScope/QgScope/qgpythonconsoledockwidget.cpp
2025-12-17 07:59:30 +01:00

391 lines
10 KiB
C++

#include "qgpythonconsoledockwidget.h"
#include "ui_qgpythonconsoledockwidget.h"
#include "qgpythonsandbox.h"
#include "qgpythoninterface.h"
//#include "qgpython.h"
//#include "qgscopeworkbench.h"
//#include "qgpyeditdialog.h"
//#include "qglogger.h"
#include <QPlainTextEdit>
#include <QLineEdit>
#include <QDebug>
#include <QDropEvent>
#include <QDragEnterEvent>
#include <QMimeData>
#include <QClipboard>
#include <QMessageBox>
class QgPythonConsoleDockWidget::Implementation
{
public:
//QgPyEditDialog* miniEditor;
//QgLogger logger;
QgPythonSandbox sb;
//QPlainTextEdit* miniEditor;
//PythonQtScriptingConsole* pythonConsole;
Implementation(QWidget* /*parent*/)
//miniEditor(0),
//: logger("PY")
{
//miniEditor=new QgPyEditDialog(parent);
}
void showMiniEditor()
{
#if 0
if (!miniEditor)
{
miniEditor=new QgPyEditDialog;
miniEditor->setWindowTitle("Python Editor");
}
miniEditor->show();
#endif
}
};
QgPythonConsoleDockWidget::QgPythonConsoleDockWidget(QWidget *parent) :
QDockWidget(parent),
ui(new Ui::QgPythonConsoleDockWidget),
m_qtdbg(false),
p_(*new Implementation(this))
{
ui->setupUi(this);
ui->verticalLayout->addWidget(p_.sb.pyhtonStdWidgets()->createConsole());
//PythonQt& pyqt=QgPython::instance().self();
//ui->verticalLayout->addWidget(p_.pythonConsole);
connect(ui->lineEdit, &QLineEdit::returnPressed, this,
[this]()
{
QString tmp=ui->lineEdit->text();
//qDebug()<<"evalScript:"<<tmp;
//ui->pyStdOut->append("<p><font color=\"green\">"+tmp+"<font color=\"black\"></p>");
//ui->pyStdOut->append("");
//ui->pyStdOut->executeCode(tmp);
//QgPython::instance().mainContext().evalScript(tmp);
p_.sb.evalScript(tmp);
}
);
connect(ui->tbMiniEditor, &QToolButton::clicked, this,
[this]()
{
p_.showMiniEditor();
}
);
#if 0
connect(p_.miniEditor, &QgPyEditDialog::accepted, this,
[this]()
{
QString tmp=p_.miniEditor->text();
if (!tmp.isEmpty())
ui->pyStdOut->executeCode(tmp); //QgPython::instance().mainContext().evalScript(tmp);
else
{
tmp=p_.miniEditor->execFile();
if (!tmp.isEmpty())
{
ui->pyStdOut->executeFile(tmp); //QgPython::instance().mainContext().evalFile(tmp);
}
}
}
);
QgPython::instance().mainContext().addObject("pypanel", this);
QgPython::instance().mainContext().evalScript("import sys\npypanel.pyhtonVersion=sys.version");
#endif
setWindowTitle(QString("PythonQT - %1").arg(m_pyver));
//QgScopeWorkbench::instance().log(QString("Python ready"));
setAcceptDrops(true);
}
void QgPythonConsoleDockWidget::miniEditor()
{
p_.showMiniEditor();
}
QgPythonConsoleDockWidget::~QgPythonConsoleDockWidget()
{
delete ui;
}
void QgPythonConsoleDockWidget::QgPythonConsoleDockWidget::forwardToQDbg(const QString& str, bool err)
{
static QString accumulator;
if (!m_qtdbg)
return;
if (!err && m_qtdbg)
qDebug()<<"PY:"<<str;
else
{
accumulator+=str;
if (str.contains('\n') || (str.size()>1024))
{
//qWarning()<<"PYERR:"<<accumulator;
accumulator.clear();
}
}
}
void QgPythonConsoleDockWidget::dropEvent(QDropEvent* evn)
{
if (!evn)
{
const QClipboard *clipboard = QApplication::clipboard();
if (clipboard)
{
const QMimeData *mimeData = clipboard->mimeData();
if (mimeData)
{
if (mimeData->hasText())
{
//p_.miniEditor->setMimeInfo(mimeData);
//p_.miniEditor->show();
return;
}
}
}
QMessageBox::warning(this, "Paste from clipboad", "Invalid or empty clipboard conetnts");
return;
}
if (true) //(evn->keyboardModifiers() & Qt::ShiftModifier) || (evn->dropAction()==Qt::MoveAction))
{
evn->setDropAction(Qt::CopyAction);
//QgVtDropDialog dlg(this);
//p_.miniEditor->setMimeInfo(evn->mimeData());
evn->accept();
//p_.miniEditor->show();
}
}
void QgPythonConsoleDockWidget::dragEnterEvent(QDragEnterEvent *event)
{
qDebug()<<"DRAG";
//if (event->mimeData()->hasFormat("text/plain"))
if (event->mimeData()->hasText() || event->mimeData()->hasUrls())
event->acceptProposedAction();
else
qDebug()<<"Unsupported Drop format:"<<event->mimeData()->formats();
}
#if 0
#include "qgpythonconsoledockwidget.h"
#include "ui_qgpythonconsoledockwidget.h"
#include "qgpython.h"
#include "qgscopeworkbench.h"
#include "qgpyeditdialog.h"
#include "qglogger.h"
#include <QPlainTextEdit>
#include <QLineEdit>
#include <QDebug>
#include <QDropEvent>
#include <QDragEnterEvent>
#include <QMimeData>
#include <QClipboard>
#include <QMessageBox>
class QgPythonConsoleDockWidget::Implementation
{
public:
QgPyEditDialog* miniEditor;
QgLogger logger;
//PythonQtScriptingConsole* pythonConsole;
Implementation(QWidget* parent):
miniEditor(0),
logger("PY")
{
miniEditor=new QgPyEditDialog(parent);
}
void showMiniEditor()
{
if (!miniEditor)
{
miniEditor=new QgPyEditDialog;
miniEditor->setWindowTitle("Python Editor");
}
miniEditor->show();
}
};
QgPythonConsoleDockWidget::QgPythonConsoleDockWidget(QWidget *parent) :
QDockWidget(parent),
ui(new Ui::QgPythonConsoleDockWidget),
m_qtdbg(false),
p_(*new Implementation(this))
{
ui->setupUi(this);
PythonQt& pyqt=QgPython::instance().self();
//ui->verticalLayout->addWidget(p_.pythonConsole);
#if 0
connect(&pyqt, &PythonQt::pythonStdOut, this,
[this](const QString& str)
{
ui->pyStdOut->moveCursor(QTextCursor::End);
ui->pyStdOut->insertPlainText (str);
//ui->pyStdOut->setTextCursor (&prev_cursor);
//ui->pyStdOut->appendPlainText(str);
forwardToQDbg(str);
}
);
connect(&pyqt, &PythonQt::pythonStdErr, this,
[this](const QString& str)
{
ui->pyStdOut->moveCursor (QTextCursor::End);
ui->pyStdOut->insertPlainText (str);
forwardToQDbg(str, true);
}
);
#endif
connect(ui->lineEdit, &QLineEdit::returnPressed, this,
[this]()
{
QString tmp=ui->lineEdit->text();
//qDebug()<<"evalScript:"<<tmp;
ui->pyStdOut->append("<p><font color=\"green\">"+tmp+"<font color=\"black\"></p>");
ui->pyStdOut->append("");
ui->pyStdOut->executeCode(tmp);
//QgPython::instance().mainContext().evalScript(tmp);
}
);
connect(ui->tbMiniEditor, &QToolButton::clicked, this,
[this]()
{
p_.showMiniEditor();
}
);
connect(p_.miniEditor, &QgPyEditDialog::accepted, this,
[this]()
{
QString tmp=p_.miniEditor->text();
if (!tmp.isEmpty())
ui->pyStdOut->executeCode(tmp); //QgPython::instance().mainContext().evalScript(tmp);
else
{
tmp=p_.miniEditor->execFile();
if (!tmp.isEmpty())
{
ui->pyStdOut->executeFile(tmp); //QgPython::instance().mainContext().evalFile(tmp);
}
}
}
);
QgPython::instance().mainContext().addObject("pypanel", this);
QgPython::instance().mainContext().evalScript("import sys\npypanel.pyhtonVersion=sys.version");
setWindowTitle(QString("PythonQT - %1").arg(m_pyver));
QgScopeWorkbench::instance().log(QString("Python ready"));
setAcceptDrops(true);
}
void QgPythonConsoleDockWidget::miniEditor()
{
p_.showMiniEditor();
}
QgPythonConsoleDockWidget::~QgPythonConsoleDockWidget()
{
delete ui;
}
void QgPythonConsoleDockWidget::QgPythonConsoleDockWidget::forwardToQDbg(const QString& str, bool err)
{
static QString accumulator;
if (!m_qtdbg)
return;
if (!err && m_qtdbg)
qDebug()<<"PY:"<<str;
else
{
accumulator+=str;
if (str.contains('\n') || (str.size()>1024))
{
//qWarning()<<"PYERR:"<<accumulator;
accumulator.clear();
}
}
}
void QgPythonConsoleDockWidget::dropEvent(QDropEvent* evn)
{
if (!evn)
{
const QClipboard *clipboard = QApplication::clipboard();
if (clipboard)
{
const QMimeData *mimeData = clipboard->mimeData();
if (mimeData)
{
if (mimeData->hasText())
{
p_.miniEditor->setMimeInfo(mimeData);
p_.miniEditor->show();
return;
}
}
}
QMessageBox::warning(this, "Paste from clipboad", "Invalid or empty clipboard conetnts");
return;
}
if (true) //(evn->keyboardModifiers() & Qt::ShiftModifier) || (evn->dropAction()==Qt::MoveAction))
{
evn->setDropAction(Qt::CopyAction);
//QgVtDropDialog dlg(this);
p_.miniEditor->setMimeInfo(evn->mimeData());
evn->accept();
p_.miniEditor->show();
}
}
void QgPythonConsoleDockWidget::dragEnterEvent(QDragEnterEvent *event)
{
qDebug()<<"DRAG";
//if (event->mimeData()->hasFormat("text/plain"))
if (event->mimeData()->hasText() || event->mimeData()->hasUrls())
event->acceptProposedAction();
else
qDebug()<<"Unsupported Drop format:"<<event->mimeData()->formats();
}
#endif