From 1a810f6d6b65ede246e2312140d90951ac14d7e5 Mon Sep 17 00:00:00 2001 From: Yuki Furuta Date: Tue, 7 Jan 2020 10:41:48 +0900 Subject: [PATCH 1/2] Add property to set position of overlay menu --- jsk_rviz_plugins/src/overlay_menu_display.cpp | 81 ++++++++++++++++--- jsk_rviz_plugins/src/overlay_menu_display.h | 23 +++++- jsk_rviz_plugins/src/overlay_picker_tool.cpp | 10 +++ 3 files changed, 101 insertions(+), 13 deletions(-) diff --git a/jsk_rviz_plugins/src/overlay_menu_display.cpp b/jsk_rviz_plugins/src/overlay_menu_display.cpp index 2929094e1..29430b43c 100644 --- a/jsk_rviz_plugins/src/overlay_menu_display.cpp +++ b/jsk_rviz_plugins/src/overlay_menu_display.cpp @@ -60,13 +60,24 @@ 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())); + top_property_ = new rviz::IntProperty("top", 128, + "top of the image window", + this, SLOT(updateTop())); + 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() @@ -330,13 +341,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 +394,73 @@ 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() + { + 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; From 1db71bcf3e50127bdf80f844667583248ec3ba79 Mon Sep 17 00:00:00 2001 From: Iki Yo Date: Thu, 6 Feb 2020 10:51:17 +0900 Subject: [PATCH 2/2] Fixed minor bugs. --- jsk_rviz_plugins/src/overlay_menu_display.cpp | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/jsk_rviz_plugins/src/overlay_menu_display.cpp b/jsk_rviz_plugins/src/overlay_menu_display.cpp index 29430b43c..be3c15c7f 100644 --- a/jsk_rviz_plugins/src/overlay_menu_display.cpp +++ b/jsk_rviz_plugins/src/overlay_menu_display.cpp @@ -63,9 +63,11 @@ namespace jsk_rviz_plugins 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())); @@ -82,6 +84,9 @@ namespace jsk_rviz_plugins void OverlayMenuDisplay::onInitialize() { + updateKeepCentered(); + updateLeft(); + updateTop(); require_update_texture_ = false; animation_state_ = CLOSED; } @@ -433,6 +438,11 @@ namespace jsk_rviz_plugins void OverlayMenuDisplay::updateKeepCentered() { + if (keep_centered_ && + !keep_centered_property_->getBool()) { + updateLeft(); + updateTop(); + } boost::mutex::scoped_lock lock(mutex_); keep_centered_ = keep_centered_property_->getBool(); }