diff --git a/jsk_rviz_plugins/src/overlay_menu_display.cpp b/jsk_rviz_plugins/src/overlay_menu_display.cpp index 2929094e1..be3c15c7f 100644 --- a/jsk_rviz_plugins/src/overlay_menu_display.cpp +++ b/jsk_rviz_plugins/src/overlay_menu_display.cpp @@ -60,17 +60,33 @@ namespace jsk_rviz_plugins ros::message_traits::datatype(), "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; } @@ -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_; } @@ -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 diff --git a/jsk_rviz_plugins/src/overlay_menu_display.h b/jsk_rviz_plugins/src/overlay_menu_display.h index eb8b119ff..3ce772797 100644 --- a/jsk_rviz_plugins/src/overlay_menu_display.h +++ b/jsk_rviz_plugins/src/overlay_menu_display.h @@ -44,6 +44,8 @@ #include #include +#include +#include #include @@ -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( @@ -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(); }; } diff --git a/jsk_rviz_plugins/src/overlay_picker_tool.cpp b/jsk_rviz_plugins/src/overlay_picker_tool.cpp index 8b653bda4..33eab4b8a 100644 --- a/jsk_rviz_plugins/src/overlay_picker_tool.cpp +++ b/jsk_rviz_plugins/src/overlay_picker_tool.cpp @@ -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 { @@ -112,6 +113,9 @@ namespace jsk_rviz_plugins else if (startMovement(property, event, "overlay_diagnostic_display")) { return true; } + else if (startMovement(property, event, "overlay_menu_display")) { + return true; + } else { return false; } @@ -149,6 +153,9 @@ namespace jsk_rviz_plugins else if (target_property_type_ == "overlay_diagnostic_display") { movePosition(event); } + else if (target_property_type_ == "overlay_menu_display") { + movePosition(event); + } } } @@ -173,6 +180,9 @@ namespace jsk_rviz_plugins else if (target_property_type_ == "overlay_diagnostic_display") { setPosition(event); } + else if (target_property_type_ == "overlay_menu_display") { + setPosition(event); + } } // clear cache target_property_ = NULL;