pxmlw6n2f/Gazebo_Distributed_TCP/gazebo/gui/building/BuildingEditor.cc

189 lines
6.1 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.
*
*/
#include <boost/bind.hpp>
#include "gazebo/gui/qt.h"
#include "gazebo/gui/Actions.hh"
#include "gazebo/gui/MainWindow.hh"
#include "gazebo/gui/RenderWidget.hh"
#include "gazebo/gui/building/BuildingEditorWidget.hh"
#include "gazebo/gui/building/BuildingEditorEvents.hh"
#include "gazebo/gui/building/BuildingEditorPalette.hh"
#include "gazebo/gui/building/BuildingEditor.hh"
using namespace gazebo;
using namespace gui;
/////////////////////////////////////////////////
BuildingEditor::BuildingEditor(MainWindow *_mainWindow)
: Editor(_mainWindow)
{
// Tips
this->tipsLabel = new QLabel(tr(
"<font size=4 color='white'><b>?</b></font>"));
this->tipsLabel->setToolTip(tr("<font size=3><p><b> Tips: </b></b>"
"<p>Double-click an object to open an Inspector with configuration "
"options.</p>"
"<p>Currently, windows & doors are simple holes in the wall.</p>"
"<p>Because Gazebo only supports simple primitive shapes, all floors "
"will be rectangular.</p>"));
this->tipsLabel->installEventFilter(this);
// Create the building editor tab
this->buildingPalette = new BuildingEditorPalette;
this->Init("buildingEditorTab", "Building Editor", this->buildingPalette,
this->tipsLabel);
this->newAct = new QAction(tr("&New"), this->mainWindow);
this->newAct->setStatusTip(tr("New"));
this->newAct->setShortcut(tr("Ctrl+N"));
this->newAct->setCheckable(false);
connect(this->newAct, SIGNAL(triggered()), this, SLOT(New()));
this->saveAct = new QAction(tr("&Save"), this->mainWindow);
this->saveAct->setStatusTip(tr("Save"));
this->saveAct->setShortcut(tr("Ctrl+S"));
this->saveAct->setCheckable(false);
connect(this->saveAct, SIGNAL(triggered()), this, SLOT(Save()));
this->saveAsAct = new QAction(tr("&Save As"), this->mainWindow);
this->saveAsAct->setStatusTip(tr("Save As"));
this->saveAsAct->setShortcut(tr("Ctrl+SHIFT+S"));
this->saveAsAct->setCheckable(false);
connect(this->saveAsAct, SIGNAL(triggered()), this, SLOT(SaveAs()));
this->exitAct = new QAction(tr("E&xit Building Editor"), this->mainWindow);
this->exitAct->setStatusTip(tr("Exit Building Editor"));
this->exitAct->setShortcut(tr("Ctrl+X"));
this->exitAct->setCheckable(false);
connect(this->exitAct, SIGNAL(triggered()), this, SLOT(Exit()));
connect(g_editBuildingAct, SIGNAL(toggled(bool)), this, SLOT(OnEdit(bool)));
this->connections.push_back(
gui::editor::Events::ConnectFinishBuildingModel(
boost::bind(&BuildingEditor::OnFinish, this)));
this->buildingEditorWidget = new BuildingEditorWidget(
this->mainWindow->RenderWidget());
this->buildingEditorWidget->setSizePolicy(QSizePolicy::Expanding,
QSizePolicy::Expanding);
this->buildingEditorWidget->hide();
this->mainWindow->RenderWidget()->InsertWidget(0,
this->buildingEditorWidget);
this->menuBar = NULL;
}
/////////////////////////////////////////////////
BuildingEditor::~BuildingEditor()
{
}
////////////////////////////////////////////////
void BuildingEditor::Save()
{
gui::editor::Events::saveBuildingEditor();
}
////////////////////////////////////////////////
void BuildingEditor::SaveAs()
{
gui::editor::Events::saveAsBuildingEditor();
}
/////////////////////////////////////////////////
void BuildingEditor::New()
{
gui::editor::Events::newBuildingEditor();
}
/////////////////////////////////////////////////
void BuildingEditor::Exit()
{
gui::editor::Events::exitBuildingEditor();
}
/////////////////////////////////////////////////
void BuildingEditor::OnFinish()
{
g_editBuildingAct->setChecked(!g_editBuildingAct->isChecked());
this->OnEdit(false);
}
/////////////////////////////////////////////////
void BuildingEditor::CreateMenus()
{
if (this->menuBar)
return;
this->menuBar = new QMenuBar;
this->menuBar->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
QMenu *fileMenu = this->menuBar->addMenu(tr("&File"));
fileMenu->addAction(this->newAct);
fileMenu->addAction(this->saveAct);
fileMenu->addAction(this->saveAsAct);
fileMenu->addAction(this->exitAct);
}
/////////////////////////////////////////////////
void BuildingEditor::OnEdit(bool _checked)
{
if (_checked)
{
this->CreateMenus();
this->mainWindowPaused = this->mainWindow->IsPaused();
this->mainWindow->Pause();
this->mainWindow->ShowLeftColumnWidget("buildingEditorTab");
this->mainWindow->ShowMenuBar(this->menuBar);
this->buildingEditorWidget->show();
this->mainWindow->RenderWidget()->DisplayOverlayMsg(
"Building is View Only");
this->mainWindow->RenderWidget()->ShowTimePanel(false);
this->mainWindow->RenderWidget()->ShowToolbar(false);
}
else
{
this->buildingPalette->CustomColorDialog()->reject();
this->mainWindow->ShowLeftColumnWidget();
this->buildingEditorWidget->hide();
this->mainWindow->RenderWidget()->DisplayOverlayMsg("");
this->mainWindow->RenderWidget()->ShowTimePanel(true);
this->mainWindow->RenderWidget()->ShowToolbar(true);
this->mainWindow->ShowMenuBar();
if (!this->mainWindowPaused)
this->mainWindow->Play();
}
gui::editor::Events::toggleEditMode(_checked);
}
/////////////////////////////////////////////////
bool BuildingEditor::eventFilter(QObject *_obj, QEvent *_event)
{
QLabel *label = qobject_cast<QLabel *>(_obj);
if (label && label == this->tipsLabel &&
_event->type() == QEvent::MouseButtonRelease)
{
QToolTip::showText(this->tipsLabel->mapToGlobal(QPoint()),
this->tipsLabel->toolTip());
return true;
}
return false;
}