Skip to content

Commit

Permalink
Merge pull request #758 from furushchev/overlay-menu-pos
Browse files Browse the repository at this point in the history
Add property to set position of overlay menu
  • Loading branch information
k-okada authored Feb 26, 2020
2 parents 0210a67 + ffe75df commit e6ab429
Show file tree
Hide file tree
Showing 3 changed files with 111 additions and 13 deletions.
91 changes: 80 additions & 11 deletions jsk_rviz_plugins/src/overlay_menu_display.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -60,17 +60,33 @@ namespace jsk_rviz_plugins
ros::message_traits::datatype<jsk_rviz_plugins::OverlayMenu>(),
"jsk_rviz_plugins::OverlayMenu topic to subscribe to.",
this, SLOT( updateTopic() ));

left_property_ = new rviz::IntProperty("left", 128,
"left of the image window",
this, SLOT(updateLeft()));
left_property_->setMin(0);
top_property_ = new rviz::IntProperty("top", 128,
"top of the image window",
this, SLOT(updateTop()));
top_property_->setMin(0);
keep_centered_property_ = new rviz::BoolProperty("keep centered", true,
"enable automatic center adjustment",
this, SLOT(updateKeepCentered()));
}

OverlayMenuDisplay::~OverlayMenuDisplay()
{
onDisable();
delete update_topic_property_;
delete left_property_;
delete top_property_;
delete keep_centered_property_;
}

void OverlayMenuDisplay::onInitialize()
{
updateKeepCentered();
updateLeft();
updateTop();
require_update_texture_ = false;
animation_state_ = CLOSED;
}
Expand Down Expand Up @@ -330,13 +346,7 @@ namespace jsk_rviz_plugins
}
}
}
overlay_->setDimensions(overlay_->getTextureWidth(), overlay_->getTextureHeight());
int window_width = context_->getViewManager()->getRenderPanel()->width();
int window_height = context_->getViewManager()->getRenderPanel()->height();
double window_left = (window_width - (int)overlay_->getTextureWidth()) / 2.0;
double window_top = (window_height - (int)overlay_->getTextureHeight()) / 2.0;
overlay_->setPosition(window_left, window_top);

setMenuLocation();
current_menu_ = next_menu_;
}

Expand Down Expand Up @@ -389,19 +399,78 @@ namespace jsk_rviz_plugins
painter.end();
current_menu_ = next_menu_;
}
setMenuLocation();
}

void OverlayMenuDisplay::setMenuLocation()
{
overlay_->setDimensions(overlay_->getTextureWidth(), overlay_->getTextureHeight());
int window_width = context_->getViewManager()->getRenderPanel()->width();
int window_height = context_->getViewManager()->getRenderPanel()->height();
double window_left = (window_width - (int)overlay_->getTextureWidth()) / 2.0;
double window_top = (window_height - (int)overlay_->getTextureHeight()) / 2.0;
overlay_->setPosition(window_left, window_top);
if (keep_centered_)
{
left_ = (window_width - (int)overlay_->getTextureWidth()) / 2.0;
top_ = (window_height - (int)overlay_->getTextureHeight()) / 2.0;
}
left_ = std::max(0, std::min(window_width - (int)overlay_->getTextureWidth(), left_));
top_ = std::max(0, std::min(window_height - (int)overlay_->getTextureHeight(), top_));
overlay_->setPosition(left_, top_);
}

void OverlayMenuDisplay::updateTopic()
{
boost::mutex::scoped_lock lock(mutex_);
unsubscribe();
subscribe();
}

void OverlayMenuDisplay::updateLeft()
{
boost::mutex::scoped_lock lock(mutex_);
left_ = left_property_->getInt();
}

void OverlayMenuDisplay::updateTop()
{
boost::mutex::scoped_lock lock(mutex_);
top_ = top_property_->getInt();
}

void OverlayMenuDisplay::updateKeepCentered()
{
if (keep_centered_ &&
!keep_centered_property_->getBool()) {
updateLeft();
updateTop();
}
boost::mutex::scoped_lock lock(mutex_);
keep_centered_ = keep_centered_property_->getBool();
}

bool OverlayMenuDisplay::isInRegion(int x, int y)
{
return (overlay_ && overlay_->isTextureReady() &&
top_ < y && top_ + overlay_->getTextureHeight() > y &&
left_ < x && left_ + overlay_->getTextureWidth() > x);
}

void OverlayMenuDisplay::movePosition(int x, int y)
{
if (!keep_centered_)
{
top_ = y;
left_ = x;
}
}

void OverlayMenuDisplay::setPosition(int x, int y)
{
if (!keep_centered_)
{
top_property_->setValue(y);
left_property_->setValue(x);
}
}
}

#include <pluginlib/class_list_macros.h>
Expand Down
23 changes: 21 additions & 2 deletions jsk_rviz_plugins/src/overlay_menu_display.h
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,8 @@
#include <QPainter>

#include <rviz/properties/ros_topic_property.h>
#include <rviz/properties/int_property.h>
#include <rviz/properties/bool_property.h>

#include <jsk_rviz_plugins/OverlayMenu.h>

Expand All @@ -66,16 +68,30 @@ namespace jsk_rviz_plugins
OPENING,
CLOSING,
};


// methods for OverlayPickerTool
virtual bool isInRegion(int x, int y);
virtual void movePosition(int x, int y);
virtual void setPosition(int x, int y);
virtual int getX() { return left_; };
virtual int getY() { return top_; };

protected:
boost::mutex mutex_;
OverlayObject::Ptr overlay_;
ros::Subscriber sub_;
rviz::RosTopicProperty* update_topic_property_;
rviz::IntProperty* left_property_;
rviz::IntProperty* top_property_;
rviz::BoolProperty* keep_centered_property_;
AnimationState animation_state_;
bool require_update_texture_;
bool keep_centered_;
int left_, top_;
jsk_rviz_plugins::OverlayMenu::ConstPtr current_menu_;
jsk_rviz_plugins::OverlayMenu::ConstPtr next_menu_;
double animation_t_;

virtual void prepareOverlay();
virtual void openingAnimation();
virtual std::string getMenuString(
Expand All @@ -98,9 +114,12 @@ namespace jsk_rviz_plugins
virtual void unsubscribe();
virtual void processMessage
(const jsk_rviz_plugins::OverlayMenu::ConstPtr& msg);
virtual void setMenuLocation();
protected Q_SLOTS:
void updateTopic();

void updateLeft();
void updateTop();
void updateKeepCentered();
};

}
Expand Down
10 changes: 10 additions & 0 deletions jsk_rviz_plugins/src/overlay_picker_tool.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@
#include "pie_chart_display.h"
#include "overlay_image_display.h"
#include "overlay_diagnostic_display.h"
#include "overlay_menu_display.h"

namespace jsk_rviz_plugins
{
Expand Down Expand Up @@ -112,6 +113,9 @@ namespace jsk_rviz_plugins
else if (startMovement<OverlayDiagnosticDisplay>(property, event, "overlay_diagnostic_display")) {
return true;
}
else if (startMovement<OverlayMenuDisplay>(property, event, "overlay_menu_display")) {
return true;
}
else {
return false;
}
Expand Down Expand Up @@ -149,6 +153,9 @@ namespace jsk_rviz_plugins
else if (target_property_type_ == "overlay_diagnostic_display") {
movePosition<OverlayDiagnosticDisplay>(event);
}
else if (target_property_type_ == "overlay_menu_display") {
movePosition<OverlayMenuDisplay>(event);
}
}
}

Expand All @@ -173,6 +180,9 @@ namespace jsk_rviz_plugins
else if (target_property_type_ == "overlay_diagnostic_display") {
setPosition<OverlayDiagnosticDisplay>(event);
}
else if (target_property_type_ == "overlay_menu_display") {
setPosition<OverlayMenuDisplay>(event);
}
}
// clear cache
target_property_ = NULL;
Expand Down

0 comments on commit e6ab429

Please sign in to comment.