mirror of
https://github.com/jkriege2/JKQtPlotter.git
synced 2024-12-24 09:31:40 +08:00
reworked how context-menus are specified/activated
prepared for future reworks some renames
This commit is contained in:
parent
75d8fc8314
commit
17a4473e4f
@ -102,11 +102,11 @@ TestUserInteraction::TestUserInteraction(QWidget *parent) :
|
||||
cmbLeftNoModMouseAction->addItem("PanPlotOnMove");
|
||||
cmbLeftNoModMouseAction->addItem("PanPlotOnRelease");
|
||||
cmbLeftNoModMouseAction->addItem("ZoomRectangle");
|
||||
cmbLeftNoModMouseAction->addItem("RectangleEvents");
|
||||
cmbLeftNoModMouseAction->addItem("CircleEvents");
|
||||
cmbLeftNoModMouseAction->addItem("EllipseEvents");
|
||||
cmbLeftNoModMouseAction->addItem("LineEvents");
|
||||
cmbLeftNoModMouseAction->addItem("ScribbleEvents");
|
||||
cmbLeftNoModMouseAction->addItem("DrawRectangleForEvent");
|
||||
cmbLeftNoModMouseAction->addItem("DrawCircleForEvent");
|
||||
cmbLeftNoModMouseAction->addItem("DrawEllipseForEvent");
|
||||
cmbLeftNoModMouseAction->addItem("DrawLineForEvent");
|
||||
cmbLeftNoModMouseAction->addItem("ScribbleForEvents");
|
||||
cmbLeftNoModMouseAction->addItem("NoMouseAction");
|
||||
cmbLeftNoModMouseAction->setCurrentIndex(2);
|
||||
connect(cmbLeftNoModMouseAction, SIGNAL(currentIndexChanged(int)), this, SLOT(setLeftMouseAction(int)));
|
||||
@ -118,11 +118,11 @@ TestUserInteraction::TestUserInteraction(QWidget *parent) :
|
||||
cmbLeftCtrlModMouseAction->addItem("PanPlotOnMove");
|
||||
cmbLeftCtrlModMouseAction->addItem("PanPlotOnRelease");
|
||||
cmbLeftCtrlModMouseAction->addItem("ZoomRectangle");
|
||||
cmbLeftCtrlModMouseAction->addItem("RectangleEvents");
|
||||
cmbLeftCtrlModMouseAction->addItem("CircleEvents");
|
||||
cmbLeftCtrlModMouseAction->addItem("EllipseEvents");
|
||||
cmbLeftCtrlModMouseAction->addItem("LineEvents");
|
||||
cmbLeftCtrlModMouseAction->addItem("ScribbleEvents");
|
||||
cmbLeftCtrlModMouseAction->addItem("DrawRectangleForEvent");
|
||||
cmbLeftCtrlModMouseAction->addItem("DrawCircleForEvent");
|
||||
cmbLeftCtrlModMouseAction->addItem("DrawEllipseForEvent");
|
||||
cmbLeftCtrlModMouseAction->addItem("DrawLineForEvent");
|
||||
cmbLeftCtrlModMouseAction->addItem("ScribbleForEvents");
|
||||
cmbLeftCtrlModMouseAction->addItem("NoMouseAction");
|
||||
cmbLeftCtrlModMouseAction->setCurrentIndex(0);
|
||||
connect(cmbLeftCtrlModMouseAction, SIGNAL(currentIndexChanged(int)), this, SLOT(setLeftCtrlMouseAction(int)));
|
||||
@ -134,21 +134,32 @@ TestUserInteraction::TestUserInteraction(QWidget *parent) :
|
||||
cmbRightNoModMouseAction->addItem("PanPlotOnMove");
|
||||
cmbRightNoModMouseAction->addItem("PanPlotOnRelease");
|
||||
cmbRightNoModMouseAction->addItem("ZoomRectangle");
|
||||
cmbRightNoModMouseAction->addItem("RectangleEvents");
|
||||
cmbRightNoModMouseAction->addItem("CircleEvents");
|
||||
cmbRightNoModMouseAction->addItem("EllipseEvents");
|
||||
cmbRightNoModMouseAction->addItem("LineEvents");
|
||||
cmbRightNoModMouseAction->addItem("ScribbleEvents");
|
||||
cmbRightNoModMouseAction->addItem("DrawRectangleForEvent");
|
||||
cmbRightNoModMouseAction->addItem("DrawCircleForEvent");
|
||||
cmbRightNoModMouseAction->addItem("DrawEllipseForEvent");
|
||||
cmbRightNoModMouseAction->addItem("DrawLineForEvent");
|
||||
cmbRightNoModMouseAction->addItem("ScribbleForEvents");
|
||||
cmbRightNoModMouseAction->addItem("ContextMenu");
|
||||
cmbRightNoModMouseAction->setCurrentIndex(5);
|
||||
connect(cmbRightNoModMouseAction, SIGNAL(currentIndexChanged(int)), this, SLOT(setRightMouseAction(int)));
|
||||
setRightMouseAction(cmbRightNoModMouseAction->currentIndex());
|
||||
|
||||
// add a QComboBox that allows to set whether the right mouse button may show the context menu on a single click
|
||||
chkRightClickShowsContextMenu=new QCheckBox(this);
|
||||
chkRightClickShowsContextMenu->setChecked(plot->isRightClickShowsContextMenuEnabled());
|
||||
layForm->addRow("mouse action: right-click shows context menu:", chkRightClickShowsContextMenu);
|
||||
connect(chkRightClickShowsContextMenu, SIGNAL(toggled(bool)), plot, SLOT(enableRightClickShowsContextMenu(bool)));
|
||||
cmbRightClickContextMenu=new QComboBox(this);
|
||||
cmbRightClickContextMenu->addItem("StandardContextMenu");
|
||||
cmbRightClickContextMenu->addItem("SpecialContextMenu");
|
||||
cmbRightClickContextMenu->addItem("StandardAndSpecialContextMenu");
|
||||
cmbRightClickContextMenu->addItem("NoContextMenu");
|
||||
cmbRightClickContextMenu->setCurrentIndex(0);
|
||||
layForm->addRow("mouse action: right-click context menu:", cmbRightClickContextMenu);
|
||||
connect(cmbRightClickContextMenu, SIGNAL(currentIndexChanged(int)), this, SLOT(setRightClickContextMenu(int)));
|
||||
// ... and add a special context menu
|
||||
QMenu* special=new QMenu(plot);
|
||||
special->addAction("Special entry 1 (no action!)");
|
||||
special->addAction("Special entry 2 (no action!)");
|
||||
special->addAction("Special entry 3 (no action!)");
|
||||
special->addMenu("Special submenu")->addAction("Special subentry 1 (no action!)");
|
||||
plot->setSpecialContextMenu(special);
|
||||
|
||||
// and add a QLabel to show the different events of the JKQTPlotter:
|
||||
labMouseMoved=new QLabel(this);
|
||||
@ -177,19 +188,19 @@ TestUserInteraction::TestUserInteraction(QWidget *parent) :
|
||||
void TestUserInteraction::setLeftMouseAction(int index)
|
||||
{
|
||||
if (index==cmbLeftNoModMouseAction->count()-1) plot->deregisterMouseDragAction(Qt::LeftButton, Qt::NoModifier);
|
||||
else plot->registerMouseDragAction(Qt::LeftButton, Qt::NoModifier, static_cast<JKQTPlotter::MouseActionMode>(index));
|
||||
else plot->registerMouseDragAction(Qt::LeftButton, Qt::NoModifier, static_cast<JKQTPlotter::MouseDragActions>(index));
|
||||
}
|
||||
|
||||
void TestUserInteraction::setLeftCtrlMouseAction(int index)
|
||||
{
|
||||
if (index==cmbLeftCtrlModMouseAction->count()-1) plot->deregisterMouseDragAction(Qt::LeftButton, Qt::ControlModifier);
|
||||
else plot->registerMouseDragAction(Qt::LeftButton, Qt::ControlModifier, static_cast<JKQTPlotter::MouseActionMode>(index));
|
||||
else plot->registerMouseDragAction(Qt::LeftButton, Qt::ControlModifier, static_cast<JKQTPlotter::MouseDragActions>(index));
|
||||
}
|
||||
|
||||
void TestUserInteraction::setRightMouseAction(int index)
|
||||
{
|
||||
if (index==cmbRightNoModMouseAction->count()-1) plot->deregisterMouseDragAction(Qt::RightButton, Qt::NoModifier);
|
||||
else plot->registerMouseDragAction(Qt::RightButton, Qt::NoModifier, static_cast<JKQTPlotter::MouseActionMode>(index));
|
||||
else plot->registerMouseDragAction(Qt::RightButton, Qt::NoModifier, static_cast<JKQTPlotter::MouseDragActions>(index));
|
||||
}
|
||||
|
||||
void TestUserInteraction::setPlotMagnification(int index)
|
||||
@ -197,6 +208,11 @@ void TestUserInteraction::setPlotMagnification(int index)
|
||||
plot->setMagnification(cmbMagnification->itemData(index).toDouble());
|
||||
}
|
||||
|
||||
void TestUserInteraction::setRightClickContextMenu(int index)
|
||||
{
|
||||
plot->setContextMenuMode(static_cast<JKQTPlotter::ContextMenuModes>(index));
|
||||
}
|
||||
|
||||
void TestUserInteraction::plotMouseMove(double x, double y)
|
||||
{
|
||||
labMouseMoved->setText(QString("plotMouseMove(%1, %2)").arg(x).arg(y));
|
||||
|
@ -25,6 +25,7 @@ class TestUserInteraction : public QMainWindow
|
||||
void setLeftCtrlMouseAction(int index);
|
||||
void setRightMouseAction(int index);
|
||||
void setPlotMagnification(int index);
|
||||
void setRightClickContextMenu(int index);
|
||||
|
||||
void plotMouseMove(double x, double y);
|
||||
void plotMouseClicked(double x, double y, Qt::KeyboardModifiers modifiers, Qt::MouseButton button);
|
||||
@ -51,7 +52,7 @@ class TestUserInteraction : public QMainWindow
|
||||
QComboBox* cmbLeftNoModMouseAction;
|
||||
QComboBox* cmbLeftCtrlModMouseAction;
|
||||
QComboBox* cmbRightNoModMouseAction;
|
||||
QCheckBox* chkRightClickShowsContextMenu;
|
||||
QComboBox* cmbRightClickContextMenu;
|
||||
QCheckBox* chkLogX;
|
||||
QCheckBox* chkLogY;
|
||||
QCheckBox* chkZoomByMouseWheel;
|
||||
|
@ -106,9 +106,9 @@ void JKQTPlotter::init(bool datastore_internal, QWidget* parent, JKQTPDatastore*
|
||||
displayMousePosition=true;
|
||||
displayToolbar=true;
|
||||
toolbarAlwaysOn=false;
|
||||
rightClickShowsContextMenu=true;
|
||||
registerMouseDragAction(Qt::LeftButton, Qt::NoModifier, MouseActionMode::ZoomRectangle);
|
||||
registerMouseDragAction(Qt::LeftButton, Qt::ControlModifier, MouseActionMode::PanPlotOnMove);
|
||||
contextMenuMode=ContextMenuModes::StandardContextMenu;
|
||||
registerMouseDragAction(Qt::LeftButton, Qt::NoModifier, MouseDragActions::ZoomRectangle);
|
||||
registerMouseDragAction(Qt::LeftButton, Qt::ControlModifier, MouseDragActions::PanPlotOnMove);
|
||||
|
||||
zoomByMouseWheel=true;
|
||||
|
||||
@ -273,22 +273,22 @@ void JKQTPlotter::paintUserAction() {
|
||||
double y2=plotter->y2p(mouseDragRectYEnd)*magnification;
|
||||
double dx=x2-x1;
|
||||
double dy=y2-y1;
|
||||
if ((currentMouseDragAction.mode==JKQTPlotter::ZoomRectangle) || (currentMouseDragAction.mode==JKQTPlotter::RectangleEvents)) {
|
||||
if ((currentMouseDragAction.mode==JKQTPlotter::ZoomRectangle) || (currentMouseDragAction.mode==JKQTPlotter::DrawRectangleForEvent)) {
|
||||
painter.setOpacity(0.2);
|
||||
painter.fillRect(QRectF(x1, y1, x2-x1, y2-y1), QBrush(userActionColor));
|
||||
painter.setOpacity(1.0);
|
||||
painter.drawRect(QRectF(x1, y1, x2-x1, y2-y1));
|
||||
} else if (currentMouseDragAction.mode==JKQTPlotter::CircleEvents) {
|
||||
} else if (currentMouseDragAction.mode==JKQTPlotter::DrawCircleForEvent) {
|
||||
QColor zc=userActionColor;
|
||||
zc.setAlphaF(0.2);
|
||||
painter.setBrush(QBrush(zc));
|
||||
painter.drawEllipse(QPointF(x1, y1), qMin(fabs(dx), fabs(dy)), qMin(fabs(dx), fabs(dy)));
|
||||
} else if (currentMouseDragAction.mode==JKQTPlotter::EllipseEvents) {
|
||||
} else if (currentMouseDragAction.mode==JKQTPlotter::DrawEllipseForEvent) {
|
||||
QColor zc=userActionColor;
|
||||
zc.setAlphaF(0.2);
|
||||
painter.setBrush(QBrush(zc));
|
||||
painter.drawEllipse(QPointF(x1, y1), fabs(dx), fabs(dy));
|
||||
} else if (currentMouseDragAction.mode==JKQTPlotter::LineEvents) {
|
||||
} else if (currentMouseDragAction.mode==JKQTPlotter::DrawLineForEvent) {
|
||||
QPen pp=p;
|
||||
pp.setColor(userActionColor);
|
||||
painter.setPen(pp);
|
||||
@ -321,16 +321,16 @@ void JKQTPlotter::mouseMoveEvent ( QMouseEvent * event ) {
|
||||
}
|
||||
if (currentMouseDragAction.isValid()) {
|
||||
if (( (currentMouseDragAction.mode==JKQTPlotter::ZoomRectangle) ||
|
||||
(currentMouseDragAction.mode==JKQTPlotter::RectangleEvents) ||
|
||||
(currentMouseDragAction.mode==JKQTPlotter::CircleEvents) ||
|
||||
(currentMouseDragAction.mode==JKQTPlotter::EllipseEvents) ||
|
||||
(currentMouseDragAction.mode==JKQTPlotter::ScribbleEvents) ||
|
||||
(currentMouseDragAction.mode==JKQTPlotter::DrawRectangleForEvent) ||
|
||||
(currentMouseDragAction.mode==JKQTPlotter::DrawCircleForEvent) ||
|
||||
(currentMouseDragAction.mode==JKQTPlotter::DrawEllipseForEvent) ||
|
||||
(currentMouseDragAction.mode==JKQTPlotter::ScribbleForEvents) ||
|
||||
(currentMouseDragAction.mode==JKQTPlotter::PanPlotOnMove) ||
|
||||
(currentMouseDragAction.mode==JKQTPlotter::PanPlotOnRelease) ||
|
||||
(currentMouseDragAction.mode==JKQTPlotter::LineEvents) ) &&
|
||||
(currentMouseDragAction.mode==JKQTPlotter::DrawLineForEvent) ) &&
|
||||
mouseDragingRectangle)
|
||||
{
|
||||
if (currentMouseDragAction.mode==JKQTPlotter::ScribbleEvents || currentMouseDragAction.mode==JKQTPlotter::PanPlotOnMove) {
|
||||
if (currentMouseDragAction.mode==JKQTPlotter::ScribbleForEvents || currentMouseDragAction.mode==JKQTPlotter::PanPlotOnMove) {
|
||||
// start is last event position
|
||||
mouseDragRectXStart=mouseDragRectXEnd;
|
||||
mouseDragRectYStart=mouseDragRectYEnd;
|
||||
@ -347,7 +347,7 @@ void JKQTPlotter::mouseMoveEvent ( QMouseEvent * event ) {
|
||||
if (currentMouseDragAction.mode==JKQTPlotter::ZoomRectangle) {
|
||||
emit plotNewZoomRectangle(mouseDragRectXStart, mouseDragRectXEnd, mouseDragRectYStart, mouseDragRectYEnd, event->modifiers());
|
||||
}
|
||||
if ((currentMouseDragAction.mode==JKQTPlotter::ScribbleEvents) && ((mouseDragRectXStart!=mouseDragRectXEnd) || (mouseDragRectYStart!=mouseDragRectYEnd)) ) {
|
||||
if ((currentMouseDragAction.mode==JKQTPlotter::ScribbleForEvents) && ((mouseDragRectXStart!=mouseDragRectXEnd) || (mouseDragRectYStart!=mouseDragRectYEnd)) ) {
|
||||
emit userScribbleClick(mouseDragRectXEnd, mouseDragRectYEnd, event->modifiers(), false, false);
|
||||
}
|
||||
if ((currentMouseDragAction.mode==JKQTPlotter::PanPlotOnMove) && ((mouseDragRectXStart!=mouseDragRectXEnd) || (mouseDragRectYStart!=mouseDragRectYEnd)) ) {
|
||||
@ -393,9 +393,9 @@ void JKQTPlotter::mousePressEvent ( QMouseEvent * event ){
|
||||
mouseDragRectYEndPixel=mouseDragRectYStartPixel=event->y();
|
||||
mouseDragingRectangle=true;
|
||||
oldImage=image;
|
||||
if (currentMouseDragAction.mode==JKQTPlotter::ScribbleEvents) emit userScribbleClick(mouseDragRectXStart, mouseDragRectYStart, event->modifiers(), true, false);
|
||||
if (currentMouseDragAction.mode==JKQTPlotter::ScribbleForEvents) emit userScribbleClick(mouseDragRectXStart, mouseDragRectYStart, event->modifiers(), true, false);
|
||||
event->accept();
|
||||
} else if (event->button()==Qt::RightButton && event->modifiers()==Qt::NoModifier && rightClickShowsContextMenu) {
|
||||
} else if (event->button()==Qt::RightButton && event->modifiers()==Qt::NoModifier && contextMenuMode!=NoContextMenu) {
|
||||
mouseLastClickX=event->x();
|
||||
mouseLastClickY=event->y();
|
||||
openContextMenu(event->x(), event->y());
|
||||
@ -450,18 +450,18 @@ void JKQTPlotter::mouseReleaseEvent ( QMouseEvent * event ){
|
||||
zoomRect.translate(mouseDragRectXStartPixel-mouseDragRectXEndPixel, mouseDragRectYStartPixel-mouseDragRectYEndPixel);
|
||||
}
|
||||
setXY(plotter->p2x(zoomRect.left()), plotter->p2x(zoomRect.right()), plotter->p2y(zoomRect.bottom()), plotter->p2y(zoomRect.top()));
|
||||
} else if (currentMouseDragAction.mode==JKQTPlotter::RectangleEvents) {
|
||||
} else if (currentMouseDragAction.mode==JKQTPlotter::DrawRectangleForEvent) {
|
||||
emit userRectangleFinished(x1, y1, x2-x1, y2-y1, event->modifiers());
|
||||
} else if (currentMouseDragAction.mode==JKQTPlotter::CircleEvents) {
|
||||
} else if (currentMouseDragAction.mode==JKQTPlotter::DrawCircleForEvent) {
|
||||
emit userCircleFinished(x1, y1, qMin(fabs(x2-x1), fabs(y2-y1)), event->modifiers());
|
||||
} else if (currentMouseDragAction.mode==JKQTPlotter::EllipseEvents) {
|
||||
} else if (currentMouseDragAction.mode==JKQTPlotter::DrawEllipseForEvent) {
|
||||
emit userEllipseFinished(x1, y1, fabs(x2-x1), fabs(y2-y1), event->modifiers());
|
||||
} else if (currentMouseDragAction.mode==JKQTPlotter::LineEvents) {
|
||||
} else if (currentMouseDragAction.mode==JKQTPlotter::DrawLineForEvent) {
|
||||
emit userLineFinished(x1, y1, x2, y2, event->modifiers());
|
||||
}
|
||||
}
|
||||
if (currentMouseDragAction.mode!=JKQTPlotter::ZoomRectangle) update();
|
||||
if (currentMouseDragAction.mode==JKQTPlotter::ScribbleEvents) emit userScribbleClick(x1, y1, event->modifiers(), false, true);
|
||||
if (currentMouseDragAction.mode==JKQTPlotter::ScribbleForEvents) emit userScribbleClick(x1, y1, event->modifiers(), false, true);
|
||||
event->accept();
|
||||
}
|
||||
|
||||
@ -478,7 +478,7 @@ void JKQTPlotter::mouseDoubleClickEvent ( QMouseEvent * event ){
|
||||
mouseLastClickY=event->y();
|
||||
if (event->button()==Qt::LeftButton) {
|
||||
if (leftDoubleClickAction==LeftDoubleClickContextMenu) {
|
||||
openContextMenu(event->x(), event->y());
|
||||
openStandardContextMenu(event->x(), event->y());
|
||||
event->accept();
|
||||
} else if (leftDoubleClickAction==LeftDoubleClickSpecialContextMenu) {
|
||||
openSpecialContextMenu(event->x(), event->y());
|
||||
@ -631,25 +631,25 @@ void JKQTPlotter::updateCursor() {
|
||||
static QBitmap cursor(":/JKQTPlotter/jkqtp_cursor_zoom.png");
|
||||
static QBitmap mask(":/JKQTPlotter/jkqtp_cursor_zoom_mask.png");
|
||||
setCursor(QCursor(cursor, mask, 9, 14));
|
||||
} else if (currentMouseDragAction.mode==JKQTPlotter::RectangleEvents) {
|
||||
} else if (currentMouseDragAction.mode==JKQTPlotter::DrawRectangleForEvent) {
|
||||
static QBitmap cursor(":/JKQTPlotter/jkqtp_cursor_rectangle.png");
|
||||
static QBitmap mask(":/JKQTPlotter/jkqtp_cursor_rectangle_mask.png");
|
||||
setCursor(QCursor(cursor, mask, 9, 14));
|
||||
} else if (currentMouseDragAction.mode==JKQTPlotter::PanPlotOnMove || currentMouseDragAction.mode==JKQTPlotter::PanPlotOnRelease) {
|
||||
setCursor(QCursor(Qt::ClosedHandCursor));
|
||||
} else if (currentMouseDragAction.mode==JKQTPlotter::CircleEvents) {
|
||||
} else if (currentMouseDragAction.mode==JKQTPlotter::DrawCircleForEvent) {
|
||||
static QBitmap cursor(":/JKQTPlotter/jkqtp_cursor_circle.png");
|
||||
static QBitmap mask(":/JKQTPlotter/jkqtp_cursor_circle_mask.png");
|
||||
setCursor(QCursor(cursor, mask, 9, 14));
|
||||
} else if (currentMouseDragAction.mode==JKQTPlotter::EllipseEvents) {
|
||||
} else if (currentMouseDragAction.mode==JKQTPlotter::DrawEllipseForEvent) {
|
||||
static QBitmap cursor(":/JKQTPlotter/jkqtp_cursor_ellipse.png");
|
||||
static QBitmap mask(":/JKQTPlotter/jkqtp_cursor_ellipse_mask.png");
|
||||
setCursor(QCursor(cursor, mask, 9, 14));
|
||||
} else if (currentMouseDragAction.mode==JKQTPlotter::LineEvents) {
|
||||
} else if (currentMouseDragAction.mode==JKQTPlotter::DrawLineForEvent) {
|
||||
static QBitmap cursor(":/JKQTPlotter/jkqtp_cursor_line.png");
|
||||
static QBitmap mask(":/JKQTPlotter/jkqtp_cursor_line_mask.png");
|
||||
setCursor(QCursor(cursor, mask, 9, 14));
|
||||
} else if (currentMouseDragAction.mode==JKQTPlotter::ScribbleEvents) {
|
||||
} else if (currentMouseDragAction.mode==JKQTPlotter::ScribbleForEvents) {
|
||||
static QBitmap cursor(":/JKQTPlotter/jkqtp_cursor_scribble.png");
|
||||
static QBitmap mask(":/JKQTPlotter/jkqtp_cursor_scribble_mask.png");
|
||||
setCursor(QCursor(cursor, mask, 9, 14));
|
||||
@ -878,15 +878,10 @@ void JKQTPlotter::setRightMouseButtonAction(const JKQTPlotter::RightMouseButtonA
|
||||
this->rightMouseButtonAction = __value;
|
||||
}
|
||||
|
||||
void JKQTPlotter::enableRightClickShowsContextMenu(bool enabled)
|
||||
{
|
||||
this->rightClickShowsContextMenu=enabled;
|
||||
void JKQTPlotter::setContextMenuMode(JKQTPlotter::ContextMenuModes mode) {
|
||||
contextMenuMode=mode;
|
||||
}
|
||||
|
||||
void JKQTPlotter::disableRightClickShowsContextMenu(bool disabled)
|
||||
{
|
||||
enableRightClickShowsContextMenu(!disabled);
|
||||
}
|
||||
|
||||
JKQTPlotter::RightMouseButtonAction JKQTPlotter::getActionRightMouseButton() const
|
||||
{
|
||||
@ -903,11 +898,11 @@ JKQTPlotter::LeftDoubleClickAction JKQTPlotter::getActionLeftDoubleClick() const
|
||||
return this->leftDoubleClickAction;
|
||||
}
|
||||
|
||||
QMenu *JKQTPlotter::getMenuSpecialContextMenu() const {
|
||||
QMenu *JKQTPlotter::getSpecialContextMenu() const {
|
||||
return this->menuSpecialContextMenu;
|
||||
}
|
||||
|
||||
void JKQTPlotter::setMenuSpecialContextMenu(QMenu *menu)
|
||||
void JKQTPlotter::setSpecialContextMenu(QMenu *menu)
|
||||
{
|
||||
menuSpecialContextMenu=menu;
|
||||
if (menuSpecialContextMenu) {
|
||||
@ -942,9 +937,8 @@ int JKQTPlotter::getMouseLastClickY() const {
|
||||
return this->mouseLastClickY;
|
||||
}
|
||||
|
||||
bool JKQTPlotter::isRightClickShowsContextMenuEnabled() const
|
||||
{
|
||||
return this->rightClickShowsContextMenu;
|
||||
JKQTPlotter::ContextMenuModes JKQTPlotter::getContextMenuMode() const {
|
||||
return contextMenuMode;
|
||||
}
|
||||
|
||||
void JKQTPlotter::setMagnification(double m)
|
||||
@ -980,13 +974,30 @@ void JKQTPlotter::populateToolbar(QToolBar *toolbar) const
|
||||
|
||||
}
|
||||
|
||||
|
||||
void JKQTPlotter::openContextMenu()
|
||||
{
|
||||
openContextMenu(mouseLastClickX, mouseLastClickY);
|
||||
|
||||
}
|
||||
|
||||
void JKQTPlotter::openContextMenu(int x, int y)
|
||||
{
|
||||
if (contextMenuMode==ContextMenuModes::StandardContextMenu) {
|
||||
openStandardContextMenu(x,y);
|
||||
} else if (contextMenuMode==ContextMenuModes::SpecialContextMenu) {
|
||||
openSpecialContextMenu(x,y);
|
||||
} else if (contextMenuMode==ContextMenuModes::StandardAndSpecialContextMenu) {
|
||||
openStandardAndSpecialContextMenu(x,y);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void JKQTPlotter::openStandardContextMenu()
|
||||
{
|
||||
openStandardContextMenu(mouseLastClickX, mouseLastClickY);
|
||||
}
|
||||
|
||||
void JKQTPlotter::openStandardContextMenu(int x, int y)
|
||||
{
|
||||
//qDebug()<<"openContextMenu("<<x<<y<<contextMenu<<")";
|
||||
mouseContextX=plotter->p2x(x/magnification);
|
||||
@ -1022,7 +1033,34 @@ void JKQTPlotter::openSpecialContextMenu(int x, int y)
|
||||
}
|
||||
}
|
||||
|
||||
QHash<QPair<Qt::MouseButton,Qt::KeyboardModifier>, JKQTPlotter::MouseActionMode>::const_iterator JKQTPlotter::findMatchingMouseDragAction(Qt::MouseButton button, Qt::KeyboardModifiers modifiers) const
|
||||
void JKQTPlotter::openStandardAndSpecialContextMenu()
|
||||
{
|
||||
openStandardAndSpecialContextMenu(mouseLastClickX, mouseLastClickY);
|
||||
}
|
||||
|
||||
void JKQTPlotter::openStandardAndSpecialContextMenu(int x, int y)
|
||||
{
|
||||
//qDebug()<<"openContextMenu("<<x<<y<<contextMenu<<")";
|
||||
mouseContextX=plotter->p2x(x/magnification);
|
||||
mouseContextY=plotter->p2y((y-getPlotYOffset())/magnification);
|
||||
contextMenu->close();
|
||||
initContextMenu();
|
||||
|
||||
if (menuSpecialContextMenu) {
|
||||
contextMenu->addSeparator();
|
||||
for (QAction* act: menuSpecialContextMenu->actions()) {
|
||||
contextMenu->addAction(act);
|
||||
}
|
||||
}
|
||||
|
||||
contextMenu->popup(mapToGlobal(QPoint(x,y)));
|
||||
//qDebug()<<" -> "<<mapToGlobal(QPoint(x,y))<<contextMenu->size()<<contextMenu->pos()<<contextMenu->parent();
|
||||
emit contextMenuOpened(mouseContextX, mouseContextY, contextMenu);
|
||||
//qDebug()<<"openContextMenu("<<x<<y<<contextMenu<<") ... DONE";
|
||||
|
||||
}
|
||||
|
||||
QHash<QPair<Qt::MouseButton,Qt::KeyboardModifier>, JKQTPlotter::MouseDragActions>::const_iterator JKQTPlotter::findMatchingMouseDragAction(Qt::MouseButton button, Qt::KeyboardModifiers modifiers) const
|
||||
{
|
||||
if (modifiers.testFlag(Qt::ShiftModifier)) {
|
||||
return registeredMouseActionModes.find(qMakePair<Qt::MouseButton, Qt::KeyboardModifier>(button, Qt::ShiftModifier));
|
||||
@ -1051,7 +1089,7 @@ void JKQTPlotter::setPlotUpdateEnabled(bool enable)
|
||||
//qDebug()<<objectName()<<" doDrawing="<<doDrawing;
|
||||
}
|
||||
|
||||
void JKQTPlotter::registerMouseDragAction(Qt::MouseButton button, Qt::KeyboardModifier modifier, JKQTPlotter::MouseActionMode action)
|
||||
void JKQTPlotter::registerMouseDragAction(Qt::MouseButton button, Qt::KeyboardModifier modifier, JKQTPlotter::MouseDragActions action)
|
||||
{
|
||||
registeredMouseActionModes[qMakePair<Qt::MouseButton, Qt::KeyboardModifier>(button, modifier)]=action;
|
||||
}
|
||||
@ -1078,7 +1116,7 @@ JKQTPlotter::MouseDragAction::MouseDragAction():
|
||||
|
||||
}
|
||||
|
||||
JKQTPlotter::MouseDragAction::MouseDragAction(Qt::MouseButton _mouseButton, Qt::KeyboardModifier _modifier, JKQTPlotter::MouseActionMode _mode):
|
||||
JKQTPlotter::MouseDragAction::MouseDragAction(Qt::MouseButton _mouseButton, Qt::KeyboardModifier _modifier, JKQTPlotter::MouseDragActions _mode):
|
||||
mode(_mode), modifier(_modifier), mouseButton(_mouseButton), valid(true)
|
||||
{
|
||||
|
||||
|
@ -171,7 +171,9 @@ LIB_EXPORT void initJKQTPlotterResources();
|
||||
* .
|
||||
*
|
||||
* The right mouse button has a special role: If it is single-clicked and no JKQTPlotter::MouseActionMode is specified
|
||||
* for the vent, it opens the context menu, unless you call \c enableRightClickShowsContextMenu(false) .
|
||||
* for the vent, it opens the context menu, unless you call \c setContextMenuMoode(JKQTPlotter::NoContextMenu) .
|
||||
* You can also use setContextMenuMoode() to specify which type of context menu is shown. See JKQTPlotter::ContextMenuModes
|
||||
* for details on the available modes.
|
||||
*
|
||||
* For any mouse-click, one of the following signals is emitted:
|
||||
* - plotMouseClicked() for any single-click (during the pressDown-Event!)
|
||||
@ -211,19 +213,47 @@ LIB_EXPORT void initJKQTPlotterResources();
|
||||
class LIB_EXPORT JKQTPlotter: public QWidget {
|
||||
Q_OBJECT
|
||||
public:
|
||||
/** \brief availble user-action mode this JKQtPlotter use when mouse events occur.
|
||||
/** \brief Availble action this JKQtPlotter can perform when mouse events occur.
|
||||
* This allows you to e.g. draw rectangles or lines over the plot and receive a signal, when the drawing finishes */
|
||||
enum MouseActionMode {
|
||||
enum MouseDragActions {
|
||||
PanPlotOnMove=0, /*!< \brief the user can drag the current plot window while keeping the left mouse-button pushed down (=panning), the new widow is applied/displayed whenever the mouse moves */
|
||||
PanPlotOnRelease, /*!< \brief the user can drag the current plot window while keeping the left mouse-button pushed down (=panning), the new widow is applied/displayed when the left mouse button is released */
|
||||
ZoomRectangle, /*!< \brief draw a rectangle and when finish zoom to that rectangle */
|
||||
RectangleEvents, /*!< \brief draw a rectangle and when finished execute the signal userRectangleFinished() */
|
||||
CircleEvents, /*!< \brief draw a circle and when finished execute the signal userCircleFinished() */
|
||||
EllipseEvents, /*!< \brief draw an ellipse and when finished execute the signal userEllipseFinished() */
|
||||
LineEvents, /*!< \brief draw a line and when finished execute the signal userLineFinished() */
|
||||
ScribbleEvents, /*!< \brief let the user scribble on the plot (left mouse button is kept pressed) and call userScribbleClick() for each new position */
|
||||
DrawRectangleForEvent, /*!< \brief draw a rectangle and when finished execute the signal userRectangleFinished() */
|
||||
DrawCircleForEvent, /*!< \brief draw a circle and when finished execute the signal userCircleFinished() */
|
||||
DrawEllipseForEvent, /*!< \brief draw an ellipse and when finished execute the signal userEllipseFinished() */
|
||||
DrawLineForEvent, /*!< \brief draw a line and when finished execute the signal userLineFinished() */
|
||||
ScribbleForEvents, /*!< \brief let the user scribble on the plot (left mouse button is kept pressed) and call userScribbleClick() for each new position */
|
||||
};
|
||||
|
||||
/** \brief actions that can be bound to a double-click of the mouse */
|
||||
enum MouseDoubleClickActions {
|
||||
ClickZoomsIn=0, /*!< \brief a (double-)click zooms into the plot at the current mouse location */
|
||||
ClickZoomsOut, /*!< \brief a (double-)click zooms out of the plot at the current mouse location */
|
||||
ClickOpensContextMenu, /*!< \brief a (double-)click opens the context menu */
|
||||
ClickOpensSpecialContextMenu, /*!< \brief a (double-)click opens the special context menu \see setSpecialContextMenu() */
|
||||
NoClickAction, /*!< \brief no action is performed */
|
||||
};
|
||||
|
||||
/** \brief actions that can be bound to a mouse wheel event */
|
||||
enum MouseWheelActions {
|
||||
ZoomByWheel=0, /*!< \brief use the mouse-wheel for zooming */
|
||||
PanByWheel, /*!< \brief use the mouse-wheel for panning the plot */
|
||||
NoWheelAction, /*!< \brief no mouse-wheel action */
|
||||
};
|
||||
|
||||
/** \brief modes for the context menu */
|
||||
enum ContextMenuModes {
|
||||
StandardContextMenu=0, /*!< \brief only show the standard context menu */
|
||||
SpecialContextMenu, /*!< \brief only show the special context menu \see setSpecialContextMenu() */
|
||||
StandardAndSpecialContextMenu, /*!< \brief show the standard context menu, with the special context menu incorporated \see setSpecialContextMenu() */
|
||||
NoContextMenu, /*!< \brief don't show a context menu at all */
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/** \brief options of how to react to a right mouse button click */
|
||||
enum RightMouseButtonAction {
|
||||
RightMouseButtonNone=0, /*!< \brief do not perform any action on a right mouse button click */
|
||||
@ -369,7 +399,7 @@ class LIB_EXPORT JKQTPlotter: public QWidget {
|
||||
|
||||
/** \brief registeres a certain mouse action \a action to be executed when a mouse drag operation is
|
||||
* initialized with the given \a button and \a modifier */
|
||||
void registerMouseDragAction(Qt::MouseButton button, Qt::KeyboardModifier modifier, MouseActionMode action);
|
||||
void registerMouseDragAction(Qt::MouseButton button, Qt::KeyboardModifier modifier, MouseDragActions action);
|
||||
/** \brief deregisteres the mouse action to be executed when a mouse drag operation is
|
||||
* initialized with the given \a button and \a modifier */
|
||||
void deregisterMouseDragAction(Qt::MouseButton button, Qt::KeyboardModifier modifier);
|
||||
@ -383,11 +413,11 @@ class LIB_EXPORT JKQTPlotter: public QWidget {
|
||||
\details Description of the parameter leftDoubleClickAction is: <BLOCKQUOTE>\copydoc leftDoubleClickAction </BLOCKQUOTE>
|
||||
\see leftDoubleClickAction for more information */
|
||||
LeftDoubleClickAction getActionLeftDoubleClick() const;
|
||||
/*! \brief returns the property menuSpecialContextMenu ( \copybrief menuSpecialContextMenu ). \details Description of the parameter menuSpecialContextMenu is: <BLOCKQUOTE>\copydoc menuSpecialContextMenu </BLOCKQUOTE>. \see menuSpecialContextMenu for more information */
|
||||
QMenu *getMenuSpecialContextMenu() const;
|
||||
/*! \brief returns the currently set special context menu object */
|
||||
QMenu *getSpecialContextMenu() const;
|
||||
|
||||
/*! \brief set the property menuSpecialContextMenu ( \copybrief menuSpecialContextMenu ). \details Description of the parameter menuSpecialContextMenu is: <BLOCKQUOTE>\copydoc menuSpecialContextMenu </BLOCKQUOTE>. \see menuSpecialContextMenu for more information */
|
||||
void setMenuSpecialContextMenu(QMenu* menu);
|
||||
/*! \brief sets a QMenu object to be used as special context menu */
|
||||
void setSpecialContextMenu(QMenu* menu);
|
||||
/*! \brief returns the property zoomByMouseWheel ( \copybrief zoomByMouseWheel ).
|
||||
\details Description of the parameter zoomByMouseWheel is: <BLOCKQUOTE>\copydoc zoomByMouseWheel </BLOCKQUOTE>
|
||||
\see zoomByMouseWheel for more information */
|
||||
@ -502,11 +532,9 @@ class LIB_EXPORT JKQTPlotter: public QWidget {
|
||||
return getConstplotter()->getKeyFontSize();
|
||||
}
|
||||
|
||||
/** \brief returns the currently set mode for the context menu \see ContextMenuModes, JKQTPLOTTER_USERMOUSEINTERACTION */
|
||||
ContextMenuModes getContextMenuMode() const;
|
||||
|
||||
/** \brief checks, whether showing the context menu on a right-button click on the mouse is enabled
|
||||
* \see enableRightClickShowsContextMenu(), disableRightClickShowsContextMenu(), JKQTPLOTTER_USERMOUSEINTERACTION
|
||||
*/
|
||||
bool isRightClickShowsContextMenuEnabled() const;
|
||||
|
||||
public slots:
|
||||
/** \brief set the current plot magnification */
|
||||
@ -626,14 +654,9 @@ class LIB_EXPORT JKQTPlotter: public QWidget {
|
||||
\see rightMouseButtonAction for more information */
|
||||
void setRightMouseButtonAction(const RightMouseButtonAction & __value);
|
||||
|
||||
/** \brief enables showing the context menu on a right-button click on the mouse
|
||||
* \see disableRightClickShowsContextMenu(), JKQTPLOTTER_USERMOUSEINTERACTION
|
||||
*/
|
||||
void enableRightClickShowsContextMenu(bool enabled=true);
|
||||
/** \brief disables showing the context menu on a right-button click on the mouse
|
||||
* \see enableRightClickShowsContextMenu(), JKQTPLOTTER_USERMOUSEINTERACTION
|
||||
*/
|
||||
void disableRightClickShowsContextMenu(bool disabled=true);
|
||||
|
||||
/** \brief sets the mode if the standard context menu \see ContextMenuModes, JKQTPLOTTER_USERMOUSEINTERACTION */
|
||||
void setContextMenuMode(ContextMenuModes mode);
|
||||
|
||||
/** \brief may be connected to zoomChangedLocally() of a different plot and synchronizes the local x-axis to the other x-axis */
|
||||
void synchronizeXAxis(double newxmin, double newxmax, double newymin, double newymax, JKQTPlotter* sender);
|
||||
@ -650,11 +673,20 @@ class LIB_EXPORT JKQTPlotter: public QWidget {
|
||||
void openContextMenu();
|
||||
/** \brief open the context menu at the mouse position \a x and \a y */
|
||||
void openContextMenu(int x, int y);
|
||||
|
||||
/** \brief open the standard context menu at the mouse position of the last click */
|
||||
void openStandardContextMenu();
|
||||
/** \brief open the standard context menu at the mouse position \a x and \a y */
|
||||
void openStandardContextMenu(int x, int y);
|
||||
/** \brief open the special context menu at the mouse position of the last click */
|
||||
void openSpecialContextMenu();
|
||||
/** \brief open the special context menu at the mouse position \a x and \a y */
|
||||
void openSpecialContextMenu(int x, int y);
|
||||
|
||||
/** \brief open the standard context menu with the special context menu integrated at the mouse position of the last click */
|
||||
void openStandardAndSpecialContextMenu();
|
||||
/** \brief open the standard context menu with the special context menu integrated at the mouse position \a x and \a y */
|
||||
void openStandardAndSpecialContextMenu(int x, int y);
|
||||
|
||||
/** \brief sets absolute minimum and maximum x-value to plot */
|
||||
inline void setAbsoluteX(double xminn, double xmaxx) { plotter->setAbsoluteX(xminn, xmaxx); }
|
||||
@ -794,8 +826,8 @@ class LIB_EXPORT JKQTPlotter: public QWidget {
|
||||
struct LIB_EXPORT MouseDragAction {
|
||||
/** \brief constructs an invalid object */
|
||||
MouseDragAction();
|
||||
MouseDragAction(Qt::MouseButton _mouseButton, Qt::KeyboardModifier _modifier, MouseActionMode _mode);
|
||||
MouseActionMode mode;
|
||||
MouseDragAction(Qt::MouseButton _mouseButton, Qt::KeyboardModifier _modifier, MouseDragActions _mode);
|
||||
MouseDragActions mode;
|
||||
Qt::KeyboardModifier modifier;
|
||||
Qt::MouseButton mouseButton;
|
||||
bool isValid() const;
|
||||
@ -808,13 +840,10 @@ class LIB_EXPORT JKQTPlotter: public QWidget {
|
||||
MouseDragAction currentMouseDragAction;
|
||||
|
||||
/** \brief lists all availble mouse action modes */
|
||||
QHash<QPair<Qt::MouseButton,Qt::KeyboardModifier>, MouseActionMode> registeredMouseActionModes;
|
||||
QHash<QPair<Qt::MouseButton,Qt::KeyboardModifier>, MouseDragActions> registeredMouseActionModes;
|
||||
|
||||
/** \brief searches registeredMouseActionModes for a matching action */
|
||||
QHash<QPair<Qt::MouseButton,Qt::KeyboardModifier>, MouseActionMode>::const_iterator findMatchingMouseDragAction(Qt::MouseButton button, Qt::KeyboardModifiers modifiers) const;
|
||||
|
||||
/** \brief specifies whether to show the context menu, when the right button of the mouse is clicked */
|
||||
bool rightClickShowsContextMenu;
|
||||
QHash<QPair<Qt::MouseButton,Qt::KeyboardModifier>, MouseDragActions>::const_iterator findMatchingMouseDragAction(Qt::MouseButton button, Qt::KeyboardModifiers modifiers) const;
|
||||
|
||||
/** \brief you may overwrite this method to modify the given context emnu before it is displayed.
|
||||
*
|
||||
@ -1014,12 +1043,15 @@ class LIB_EXPORT JKQTPlotter: public QWidget {
|
||||
|
||||
double mousePosX;
|
||||
double mousePosY;
|
||||
|
||||
/** \brief magnification factor for the display of the plot */
|
||||
double magnification;
|
||||
|
||||
QSize minSize;
|
||||
|
||||
/** \brief the context menu object used by this JKQTPlotter */
|
||||
QMenu* contextMenu;
|
||||
/** \brief current mode for the default context menu (i.e. the right-click context menu) */
|
||||
ContextMenuModes contextMenuMode;
|
||||
/** \brief x-position of the mouse (in plot coordinates) when a user mouse-action was started (e.g. drawing a rectangle) */
|
||||
double mouseContextX;
|
||||
/** \brief y-position of the mouse (in plot coordinates) when a user mouse-action was started (e.g. drawing a rectangle) */
|
||||
@ -1029,8 +1061,9 @@ class LIB_EXPORT JKQTPlotter: public QWidget {
|
||||
/** \brief y-position of the last mouse-click (in screen pixels) */
|
||||
int mouseLastClickY;
|
||||
QList<QMenu*> contextSubMenus;
|
||||
/** \brief fills the member contextMenu with all default and additionally registered actions, also calls modifyContextMenu() */
|
||||
void initContextMenu();
|
||||
|
||||
/** \brief set the current mouse cursor shappe according to currentMouseDragAction */
|
||||
void updateCursor();
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user