pxmlw6n2f/Gazebo_Distributed_TCP/gazebo/gui/building/RectItem.hh

300 lines
10 KiB
C++

/*
* Copyright (C) 2012 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.
*
*/
#ifndef _GAZEBO_GUI_BUILDING_RECTITEM_HH_
#define _GAZEBO_GUI_BUILDING_RECTITEM_HH_
#include <memory>
#include <vector>
#include <ignition/math/Vector2.hh>
#include <ignition/math/Vector3.hh>
#include "gazebo/common/Color.hh"
#include "gazebo/gui/qt.h"
#include "gazebo/gui/building/EditorItem.hh"
#include "gazebo/util/system.hh"
namespace gazebo
{
namespace gui
{
class GrabberHandle;
class MeasureItem;
class RotateHandle;
// Forward declare private data.
class RectItemPrivate;
/// \addtogroup gazebo_gui
/// \{
/// \class RectItem RectItem.hh
/// \brief 2D rectangle.
class GZ_GUI_VISIBLE RectItem :
public EditorItem, public QGraphicsRectItem
{
Q_OBJECT
/// \brief Resize flags used to indicate which dimension can be resized.
public: enum ResizeFlags
{
/// \brief No dimensions.
NONE = 0x00,
/// \brief Width
ITEM_WIDTH = 0x01,
/// \brief Height
ITEM_HEIGHT = 0x02
};
/// \brief Constructor
public: RectItem();
/// \brief Destructor
public: virtual ~RectItem();
/// \brief Set the width of the rect item.
/// \param[in] _width Width of the rect item in pixels.
public: void SetWidth(const int _width);
/// \brief Set the height of the rect item.
/// \param[in] _height Height of the rect item in pixels.
public: void SetHeight(const int _height);
/// \brief Set the size of the rect item.
/// \param[in] _size Size of the rect item in pixels.
public: void SetSize(const ignition::math::Vector2i &_size);
/// \brief Get the width of the rect item.
/// \return Width of the rect item in pixels.
public: double Width() const;
/// \brief Get the height of the rect item.
/// \return Height of the rect item in pixels.
public: double Height() const;
/// \brief Set the position of this item inside its parent wall.
/// \param[in] _positionOnWall New normalized position on wall.
public: void SetPositionOnWall(const double _positionOnWall);
/// \brief Get the position of this item inside its parent wall.
/// \return Normalized position on parent wall.
public: double PositionOnWall() const;
/// \brief Set the angle of this item inside its parent wall.
/// \param[in] _angleOnWall New angle on wall, either 0 or 180 degrees.
public: void SetAngleOnWall(const double _angleOnWall);
/// \brief Get the angle of this item inside its parent wall.
/// \return Angle on parent wall in degrees.
public: double AngleOnWall() const;
/// \brief Show the grabber and rotate handles of the rect item.
/// \param[in] _show True to draw the handles, and false to hide them.
public: void ShowHandles(const bool _show);
// Documentation inherited
public: void SetHighlighted(const bool _highlighted);
/// \brief Detach the rect item from its parent.
public: void DetachFromParent();
/// \brief Helper method for Updating the corner positions of the rect
/// item.
protected: void UpdateCornerPositions();
/// \brief Draw bounding box
/// \param[in] _painter Qt painter object.
protected: void DrawBoundingBox(QPainter *_painter);
/// \brief Set the position of the rect item
/// \param[in] _pos Position in pixel coordinates.
public: virtual void SetPosition(const ignition::math::Vector2d &_pos);
/// \brief Set the position of the rect item
/// \param[in] _x X position in pixel coordinates.
/// \param[in] _y Y position in pixel coordinates.
public: virtual void SetPosition(const double _x, const double _y);
/// \brief Set the rotation of the rect item.
/// \param[in] _angle Rotation angle in degrees.
public: virtual void SetRotation(const double _angle);
/// \brief Set the resize flag of the rect item.
/// \param[in] _flag Resize flag which controls how the item can be
/// resized.
public: virtual void SetResizeFlag(const unsigned int _flag);
/// \brief Get the rotation of the rect item
/// \return Rotation in degrees.
public: virtual double Rotation() const;
// Documentation inherited
public: virtual ignition::math::Vector3d Size() const;
// Documentation inherited
public: virtual ignition::math::Vector3d ScenePosition() const;
// Documentation inherited
public: virtual double SceneRotation() const;
/// \brief Get the bounding box of the rect item.
/// \return The bounding box of the rect item.
protected: virtual QRectF boundingRect() const;
/// \brief Update this item's measures.
protected: void UpdateMeasures();
/// \brief Filter Qt events and redirect them to the rotate handle.
/// \param[in] _rotateHandle Rotate handle that will handle the event.
/// \param[in] _event Qt event
private: virtual bool RotateEventFilter(RotateHandle *_rotateHandle,
QEvent *_event);
/// \brief Filter Qt events and redirect them to the grabber handle.
/// \param[in] _grabber Grabber handle that will handle the event.
/// \param[in] _event Qt event
private: virtual bool GrabberEventFilter(GrabberHandle *_grabber,
QEvent *_event);
/// \brief Qt paint function for drawing the rect item.
/// \param[in] _painter Qt painter object.
/// \param[in] _option Qt style options for the item.
/// \param[in] _widget Qt widget being painted on.
private: virtual void paint(QPainter *_painter,
const QStyleOptionGraphicsItem *_option, QWidget *_widget);
/// \brief Qt mouse hover enter event.
/// \param[in] _event Qt mouse hover event.
private: void hoverEnterEvent(QGraphicsSceneHoverEvent *_event);
/// \brief Qt mouse hover move event.
/// \param[in] _event Qt mouse hover event.
private: void hoverMoveEvent(QGraphicsSceneHoverEvent *_event);
/// \brief Qt mouse hover leave event.
/// \param[in] _event Qt mouse hover event.
private: void hoverLeaveEvent(QGraphicsSceneHoverEvent *_event);
/// \brief Qt mouse move event.
/// \param[in] _event Qt mouse event.
private: virtual void mouseMoveEvent(QGraphicsSceneMouseEvent *_event);
/// \brief Qt mouse press event.
/// \param[in] _event Qt mouse event.
private: virtual void mousePressEvent(QGraphicsSceneMouseEvent *_event);
/// \brief Qt mouse release event.
/// \param[in] _event Qt mouse event.
private: virtual void mouseReleaseEvent(
QGraphicsSceneMouseEvent *_event);
/// \brief Qt mouse press event during drag and drop.
/// \param[in] _event Qt mouse drag and drop event.
private: virtual void mousePressEvent(
QGraphicsSceneDragDropEvent *_event);
/// \brief Qt mouse move event during drag and drop.
/// \param[in] _event Qt mouse drag and drop event.
private: virtual void mouseMoveEvent(
QGraphicsSceneDragDropEvent *_event);
/// \brief Qt mouse double click event.
/// \param[in] _event Qt mouse event.
private: virtual void mouseDoubleClickEvent(
QGraphicsSceneMouseEvent *_event);
/// \brief Filter Qt events and redirect them to another item.
/// \param[in] _watched Item that handle that will handle the event.
/// \param[in] _event Qt event.
private: virtual bool sceneEventFilter(QGraphicsItem *_watched,
QEvent *_event);
/// \brief React to item changes notified by Qt.
/// \param[in] _change Qt change type, e.g. selected change, position
/// change.
/// \param[in] _value Value to changed to.
private: QVariant itemChange(GraphicsItemChange _change,
const QVariant &_value);
/// \brief Qt context menu event received on a mouse right click.
/// \param[in] Qt context menu event.
private: virtual void contextMenuEvent(
QGraphicsSceneContextMenuEvent *_event);
/// brief Emit size changed Qt signals.
private: virtual void SizeChanged();
/// brief Helper function for resizing the rect item.
/// \param[in] _x Change in x (width).
/// \param[in] _y Change in y (height).
private: void AdjustSize(const double _x, const double _y);
/// \brief Qt callback for opening the item inspector
private slots: virtual void OnOpenInspector();
/// \brief Qt callback when the item is being deleted.
private slots: virtual void OnDeleteItem();
/// \brief Width of rect item in pixels.
protected: double width;
/// \brief Height of rect item in pixels.
protected: double height;
/// \brief Actual width of rect item drawn in pixels.
protected: double drawingWidth;
/// \brief Actual height of rect item drawn in pixels.
protected: double drawingHeight;
/// \brief X origin of the rect item in pixels.
protected: double drawingOriginX;
/// \brief Y origin of the rect item in pixels.
protected: double drawingOriginY;
/// \brief Border color of the rect item.
protected: common::Color borderColor;
/// \brief Rotation angle of the rect item in degrees.
protected: double rotationAngle;
/// \brief Qt action for opening the inspector.
protected: QAction *openInspectorAct;
/// \brief Qt action for deleting the item.
protected: QAction *deleteItemAct;
/// \brief A vector containing this item's measure items.
/// Currently only used for windows and doors, containing one measure
/// towards each end of this item's parent wall.
protected: std::vector<MeasureItem *> measures;
/// \internal
/// \brief Pointer to private data.
private: std::unique_ptr<RectItemPrivate> dataPtr;
};
/// \}
}
}
#endif