qcanvas passage

This commit is contained in:
AndreaRigoni
2026-03-22 13:55:06 +00:00
parent d87f3a984e
commit b52ae808b8
3 changed files with 95 additions and 4 deletions

View File

@@ -17,6 +17,12 @@
#include <Gtypes.h>
#include <TVirtualX.h>
#include <TEnv.h>
#include <QMenu>
#include <QAction>
#include <TClass.h>
#include <TMethod.h>
#include <TList.h>
#include <TInterpreter.h>
namespace uLib {
namespace Root {
@@ -116,9 +122,14 @@ void QCanvas::mousePressEvent(QMouseEvent* event) {
case Qt::LeftButton:
m_canvas->HandleInput(kButton1Down, pos.x(), pos.y());
break;
case Qt::RightButton:
case Qt::RightButton: {
m_canvas->HandleInput(kButton3Down, pos.x(), pos.y());
TObject *obj = m_canvas->GetSelected();
if (obj) {
ShowContextMenu(obj, event->globalPosition().toPoint());
}
break;
}
case Qt::MiddleButton:
m_canvas->HandleInput(kButton2Down, pos.x(), pos.y());
break;
@@ -128,6 +139,51 @@ void QCanvas::mousePressEvent(QMouseEvent* event) {
}
}
void QCanvas::ShowContextMenu(TObject* obj, const QPoint& globalPos) {
if (!obj) return;
QMenu menu(this);
menu.setTitle(obj->GetName());
TClass* cl = obj->IsA();
if (!cl) return;
TList* methods = cl->GetListOfMethods();
if (!methods) return;
TIter next(methods);
TObject* m_obj;
while ((m_obj = next())) {
TMethod* method = (TMethod*)m_obj;
if (method->IsMenuItem()) {
QString label = QString::fromStdString(method->GetName());
if (strlen(method->GetTitle()) > 0) {
label += " (" + QString::fromStdString(method->GetTitle()) + ")";
}
QAction* action = menu.addAction(label);
connect(action, &QAction::triggered, [this, obj, method]() {
// For now, only support methods without arguments for simplicity
// or methods that can be called via TInterpreter
if (method->GetNargs() == 0) {
obj->Execute((char*)method->GetName(), (char*)"");
if (m_canvas) {
m_canvas->Modified();
m_canvas->Update();
}
} else {
// TODO: Handle methods with arguments if needed
std::cout << "DEBUG: Method " << method->GetName() << " requires arguments." << std::endl;
}
});
}
}
if (!menu.actions().isEmpty()) {
menu.exec(globalPos);
}
}
void QCanvas::mouseReleaseEvent(QMouseEvent* event) {
if (m_canvas) {
auto pos = event->position();

View File

@@ -3,10 +3,11 @@
#ifdef HAVE_QT
#include <QWidget>
class TCanvas;
class QPaintEvent;
class QResizeEvent;
class QMouseEvent;
class QPoint;
class TObject;
class TCanvas;
namespace uLib {
namespace Root {
@@ -21,6 +22,7 @@ public:
void SetCanvas(TCanvas* c);
protected:
void ShowContextMenu(TObject* obj, const QPoint& globalPos);
void paintEvent(QPaintEvent* event) override;
void resizeEvent(QResizeEvent* event) override;
void mouseMoveEvent(QMouseEvent* event) override;

View File

@@ -0,0 +1,33 @@
#include <TClass.h>
#include <TMethod.h>
#include <TList.h>
#include <TH1F.h>
#include <iostream>
#include <TMethodCall.h>
#include <TSystem.h>
int main() {
TH1F *h = new TH1F("h", "h", 10, 0, 10);
TClass *cl = h->IsA();
if (!cl) {
std::cout << "No class found" << std::endl;
return 1;
}
TList *methods = cl->GetListOfMethods();
if (!methods) {
std::cout << "No methods found" << std::endl;
return 2;
}
TIter next(methods);
TObject *obj;
int count = 0;
while ((obj = next())) {
TMethod *method = dynamic_cast<TMethod*>(obj);
if (method && method->IsMenuItem()) {
std::cout << "Menu item: " << method->GetName() << " (" << method->GetTitle() << ")" << std::endl;
count++;
if (count > 5) break; // Just show a few
}
}
return 0;
}