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

347 lines
12 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 _EDITOR_VIEW_HH_
#define _EDITOR_VIEW_HH_
#include <map>
#include <string>
#include <vector>
#include "gazebo/gui/qt.h"
#include "gazebo/common/Event.hh"
#include "gazebo/util/system.hh"
namespace gazebo
{
namespace gui
{
class EditorItem;
class GrabberHandle;
class WindowItem;
class StairsItem;
class DoorItem;
class WallSegmentItem;
class FloorItem;
class BuildingMaker;
class LevelInspectorDialog;
class GridLines;
/// \class Level EditorView.hh
/// \brief A convenient structure for storing level information
class GZ_GUI_VISIBLE Level
{
/// \brief Constructor
public: Level() : level(0), name("level"), baseHeight(0),
// 2.4384m == 8ft, standard room height in US
height(2.4384),
backgroundPixmap(NULL),
floorItem(NULL) {}
/// \brief Level number
public: int level;
/// \brief Level name
public: std::string name;
/// \brief Level height from ground
public: double baseHeight;
/// \brief Level height
public: double height;
/// \brief Background pixmap for a level
public: QGraphicsPixmapItem *backgroundPixmap;
/// \brief Level's floor item
public: FloorItem *floorItem;
};
/// \addtogroup gazebo_gui
/// \{
/// \class EditorView EditorView.hh
/// \brief Control the editor view and manage contents in the editor scene.
class GZ_GUI_VISIBLE EditorView : public QGraphicsView
{
Q_OBJECT
/// \enum DrawModes
/// \brief Unique identifiers for all drawing modes within the editor.
public: enum DrawModes {
/// \brief None mode
NONE,
/// \brief Wall mode
WALL,
/// \brief Window mode
WINDOW,
/// \brief Door mode
DOOR,
/// \brief Stairs mode
STAIRS,
/// \brief Color mode
COLOR,
/// \brief Texture mode
TEXTURE
};
/// \brief Constructor
/// \param[in] _parent Parent Widget.
public: EditorView(QWidget *_parent = 0);
/// \brief Destructor
public: ~EditorView();
/// \brief Create a 3D visual from a 2D editor item.
public: void Create3DVisual(EditorItem *_item);
/// \brief Delete an editor item.
/// \param[in] _item Item to be deleted.
public: void DeleteItem(EditorItem *_item);
/// \brief Set the graphics view background image.
/// \param[in] _filename Name of the image file.
/// \param[in] _scale Image scale, in meters/pixel.
public: void SetBackgroundImage(const std::string &_filename,
double _scale);
/// \brief Qt resize event received when the parent widget changes size.
/// \param[in] _event Qt resize event
private: void resizeEvent(QResizeEvent *_event);
/// \brief Qt event received when the editor view is being scrolled.
/// \param[in] _dx Change in X position of the scrollbar.
/// \param[in] _dx Change in Y position of the scrollbar.
private: void scrollContentsBy(int _dx, int _dy);
/// \brief Qt context menu received on a mouse right click.
/// \param[in] _event Qt context menu event.
private: void contextMenuEvent(QContextMenuEvent *_event);
/// \brief Qt wheel event received when the mouse wheel is being scrolled.
/// \param[in] _event Qt wheel event.
private: void wheelEvent(QWheelEvent *_event);
/// \brief Qt mouse move event.
/// \param[in] _event Qt mouse event.
private: void mouseMoveEvent(QMouseEvent *_event);
/// \brief Qt mouse press event.
/// \param[in] _event Qt mouse event.
private: void mousePressEvent(QMouseEvent *_event);
/// \brief Qt mouse release event.
/// \param[in] _event Qt mouse event.
private: void mouseReleaseEvent(QMouseEvent *_event);
/// \brief Qt mouse double click event.
/// \param[in] _event Qt mouse event.
private: void mouseDoubleClickEvent(QMouseEvent *_event);
/// \brief Qt leave event.
/// \param[in] _event Qt mouse event.
private: void leaveEvent(QEvent *_event);
/// \brief Qt key press event.
/// \param[in] _event Qt key event.
private: void keyPressEvent(QKeyEvent *_event);
/// \brief Draw a wall in the scene.
/// \param[in] _pos Start position of the wall in pixel coordinates.
private: void DrawWall(const QPoint &_pos);
/// \brief Draw a window in the scene.
/// \param[in] _pos Scene position in pixel coordinates to draw the
/// window.
private: void DrawWindow(const QPoint &_pos);
/// \brief Draw a door in the scene
/// \param[in] _pos Scene position in pixel coordinates to draw the
/// door.
private: void DrawDoor(const QPoint &_pos);
/// \brief Draw a staircase in the scene
/// \param[in] _pos Scene position in pixel coordinates to draw the
/// staircase.
private: void DrawStairs(const QPoint &_pos);
/// \brief Callback triggered when the user chooses to draw an editor item
/// in the scene
/// \param[in] _type Type of editor item to be created.
private: void OnCreateEditorItem(const std::string &_type);
/// \brief Callback triggered when the user chooses a color on the
/// palette.
/// \param[in] _color Selected color.
private: void OnColorSelected(QColor _color);
/// \brief Callback triggered when the user chooses a texture on the
/// palette.
/// \param[in] _texture Selected texture.
private: void OnTextureSelected(QString _texture);
/// \brief Callback received when the model has been completed and
/// uploaded onto the server.
private: void OnFinishModel();
/// \brief Callback received when the model has been discarded.
private: void OnDiscardModel();
/// \brief Qt callback when a level is to be added to the building model.
private slots: void OnAddLevel();
/// \brief Qt callback when a level is to be deleted from the building
/// model.
private slots: void OnDeleteLevel();
/// \brief Qt callback when changes to a building level are to be applied.
private slots: void OnLevelApply();
/// \brief Qt Callback for opening the building level inspector.
private slots: void OnOpenLevelInspector();
/// \brief Callback received when a level on a building model is to
/// be changed.
/// \param[in] _level The level that is currently being edited.
private: void OnChangeLevel(int _level);
/// \brief Delete a level from the building model
/// \param[in] _level Level number to delete.
private: void DeleteLevel(int _level);
/// \brief Cancel the current drawing operation.
private: void CancelDrawMode();
/// \brief Toggle visibility of background floorplan.
private: void OnShowFloorplan();
/// \brief Toggle visibility of editor items.
private: void OnShowElements();
/// \brief Show current level items if not currently hiding.
private: void ShowCurrentLevelItems();
/// \brief Link grabbers so they move together.
/// \param[in] _grabber1 First grabber to be liked.
/// \param[in] _grabber2 Second grabber to be unliked.
private: void LinkGrabbers(GrabberHandle *_grabber1,
GrabberHandle *_grabber2);
/// \brief Unlink grabbers so they don't move together anymore. If only
/// one grabber is input, that grabber is unliked from all its current
/// links.
/// \param[in] _grabber1 First grabber to be unliked.
/// \param[in] _grabber2 Second grabber to be unliked.
private: void UnlinkGrabbers(GrabberHandle *_grabber1,
GrabberHandle *_grabber2 = NULL);
/// \brief Current draw mode
private: int drawMode;
/// \brief Indicate whether or not a drawing operation is taking place.
private: bool drawInProgress;
/// \brief Indicate whether or not the floorplan is visible.
private: bool floorplanVisible;
/// \brief Indicate whether or not the editor items are visible.
private: bool elementsVisible;
/// \brief A list of wall segment items in the scene.
private: std::vector<WallSegmentItem*> wallSegmentList;
/// \brief A list of window items in the scene.
private: std::vector<WindowItem*> windowList;
/// \brief A list of door items in the scene.
private: std::vector<DoorItem*> doorList;
/// \brief A list of staircase items in the scene.
private: std::vector<StairsItem*> stairsList;
/// \brief A list of floor items in the scene.
private: std::vector<FloorItem*> floorList;
/// \brief Mapping between 2D editor items to 3D visuals.
private: std::map<EditorItem *, std::string> itemToVisualMap;
/// \brief A list of gui editor events connected to this view.
private: std::vector<event::ConnectionPtr> connections;
/// \brief Editor item currently attached to the mouse during a drawing
/// operation.
private: QGraphicsItem *currentMouseItem;
/// \brief Currently selected editor item.
private: QGraphicsItem *currentSelectedItem;
/// \brief Building maker manages the creation of 3D visuals
private: BuildingMaker *buildingMaker;
/// \brief Current building level associated to the view.
private: int currentLevel;
/// \brief A list of building levels in the scene.
private: std::vector<Level *> levels;
/// \brief A counter that holds the total number of levels in the building
/// model.
private: int levelCounter;
/// \brief Default height for levels
private: double levelDefaultHeight;
/// \brief Qt action for opening a building level inspector.
private: QAction *openLevelInspectorAct;
/// \brief Qt action for adding a level to the building model.
private: QAction *addLevelAct;
/// \brief Qt action for deleting a level from the building model.
private: QAction *deleteLevelAct;
/// \brief Rotation in degrees when a mouse is pressed and dragged for
/// rotating an item.
private: double mousePressRotation;
/// \brief Inspector for a building level.
private: LevelInspectorDialog *levelInspector;
/// \brief Grid lines drawn on the background of the editor.
private: GridLines *gridLines;
/// \brief Scale (zoom level) of the editor view.
private: double viewScale;
/// \brief Indicate whether or not the wall will snap to a grabber
/// during a draw wall operation.
private: bool snapToGrabber;
/// \brief Existing grabber to snap towards.
private: GrabberHandle *snapGrabberOther = NULL;
/// \brief Currently held grabber which will be snapped.
private: GrabberHandle *snapGrabberCurrent = NULL;
/// \brief Text tooltip to follow the mouse.
private: QGraphicsTextItem *mouseTooltip;
};
/// \}
}
}
#endif