pxmlw6n2f/Gazebo_Distributed_TCP/gazebo/gui/model/GraphView.cc

182 lines
4.6 KiB
C++

/*
* Copyright (C) 2015 Open Source Robotics Foundation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
#include <cstdlib>
#include "gazebo/common/Events.hh"
#include "gazebo/gui/model/GraphView.hh"
using namespace gazebo;
using namespace gui;
/////////////////////////////////////////////////
GraphView::GraphView(QWidget *_parent)
: QGraphicsView(_parent)
{
this->setObjectName("GraphView");
this->setTransformationAnchor(QGraphicsView::AnchorUnderMouse);
this->viewScale = 1.0;
}
/////////////////////////////////////////////////
void GraphView::scrollContentsBy(int _dx, int _dy)
{
QGraphicsView::scrollContentsBy(_dx, _dy);
}
/////////////////////////////////////////////////
void GraphView::resizeEvent(QResizeEvent */*_event*/)
{
}
/////////////////////////////////////////////////
void GraphView::contextMenuEvent(QContextMenuEvent *_event)
{
QGraphicsItem *item = this->scene()->itemAt(this->mapToScene(_event->pos()));
if (item)
{
QString itemData = item->data(0).toString();
if (!itemData.isEmpty())
{
emit customContextMenuRequested(itemData);
_event->accept();
return;
}
_event->ignore();
QGraphicsView::contextMenuEvent(_event);
return;
}
}
/////////////////////////////////////////////////
void GraphView::wheelEvent(QWheelEvent *_event)
{
int wheelIncr = 120;
int sign = (_event->delta() > 0) ? 1 : -1;
int delta = std::max(std::abs(_event->delta()), wheelIncr) * sign;
int numSteps = delta / wheelIncr;
QMatrix mat = matrix();
QPointF mousePosition = _event->pos();
mat.translate((width()/2) - mousePosition.x(), (height()/2) -
mousePosition.y());
double scaleFactor = 1.15;
if (numSteps > 0)
{
mat.scale(numSteps*scaleFactor, numSteps*scaleFactor);
this->viewScale *= numSteps*scaleFactor;
}
else
{
mat.scale(-1/(numSteps*scaleFactor), -1/(numSteps*scaleFactor));
this->viewScale *= -1/(numSteps*scaleFactor);
}
mat.translate(mousePosition.x() - (this->width()/2),
mousePosition.y() -(this->height()/2));
this->setMatrix(mat);
_event->accept();
}
/////////////////////////////////////////////////
void GraphView::mousePressEvent(QMouseEvent *_event)
{
_event->accept();
}
/////////////////////////////////////////////////
void GraphView::mouseReleaseEvent(QMouseEvent *_event)
{
if (_event->button() != Qt::LeftButton)
{
QGraphicsView::mouseReleaseEvent(_event);
return;
}
QGraphicsItem *item = this->scene()->itemAt(this->mapToScene(_event->pos()));
this->lastClickedItem = item;
if (item)
{
// multi-selection
if (QApplication::keyboardModifiers() & Qt::ControlModifier)
{
if (!item->isSelected())
{
QList<QGraphicsItem *> selectedItems = this->scene()->selectedItems();
if (!selectedItems.empty())
{
// select on links or joints but not both types
std::string selectedType =
selectedItems[0]->data(1).toString().toStdString();
std::string type = item->data(1).toString().toStdString();
if (selectedType != type)
this->scene()->clearSelection();
}
}
item->setSelected(!item->isSelected());
}
else
{
// select single item
this->scene()->clearSelection();
item->setSelected(true);
this->repaint();
}
_event->accept();
}
else
{
this->scene()->clearSelection();
event::Events::setSelectedEntity("", "normal");
}
}
/////////////////////////////////////////////////
void GraphView::mouseMoveEvent(QMouseEvent *_event)
{
QGraphicsView::mouseMoveEvent(_event);
}
/////////////////////////////////////////////////
void GraphView::keyPressEvent(QKeyEvent *_event)
{
QGraphicsView::keyPressEvent(_event);
}
/////////////////////////////////////////////////
void GraphView::mouseDoubleClickEvent(QMouseEvent *_event)
{
QGraphicsItem *item = this->scene()->itemAt(this->mapToScene(_event->pos()));
if (item)
{
QString itemData = item->data(0).toString();
if (!itemData.isEmpty())
{
emit itemDoubleClicked(itemData);
_event->accept();
return;
}
}
_event->ignore();
QGraphicsView::mouseDoubleClickEvent(_event);
}