void OverlayMenuDisplay::openingAnimation() { ROS_DEBUG("openningAnimation"); prepareOverlay(); int current_width = animation_t_ / animate_duration * overlay_->getTextureWidth(); int current_height = animation_t_ / animate_duration * overlay_->getTextureHeight(); { ScopedPixelBuffer buffer = overlay_->getBuffer(); QColor bg_color(0, 0, 0, 255.0 / 2.0); QColor transparent(0, 0, 0, 0.0); QImage Hud = buffer.getQImage(*overlay_); for (int i = 0; i < overlay_->getTextureWidth(); i++) { for (int j = 0; j < overlay_->getTextureHeight(); j++) { if (i > (overlay_->getTextureWidth() - current_width) / 2.0 && i < overlay_->getTextureWidth() - (overlay_->getTextureWidth() - current_width) / 2.0 && j > (overlay_->getTextureHeight() - current_height) / 2.0 && j < overlay_->getTextureHeight() - (overlay_->getTextureHeight() - current_height) / 2.0) { Hud.setPixel(i, j, bg_color.rgba()); } else { Hud.setPixel(i, j, transparent.rgba()); } } } } 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); current_menu_ = next_menu_; }
WidgetEngine::WidgetEngine( const Device::Display& display, Device::Input& input ) : display( display ), input( input ), inputManager( std::make_shared< InputManager >( *this ) ) { prepareOverlay(); root = RootContainer::create(); buildDefaultStylesheet(); eventManager.REFLOW_REQUIRED.listen( this, std::bind( &WidgetEngine::refreshStylesheet, this ) ); }
void OverlayMenuDisplay::redraw() { ROS_DEBUG("redraw"); prepareOverlay(); { ScopedPixelBuffer buffer = overlay_->getBuffer(); QColor bg_color(0, 0, 0, 255.0 / 2.0); QColor fg_color(25, 255, 240, 255.0); QImage Hud = buffer.getQImage(*overlay_, bg_color); QPainter painter( &Hud ); painter.setRenderHint(QPainter::Antialiasing, true); painter.setPen(QPen(fg_color, 1, Qt::SolidLine)); painter.setFont(font()); int line_height = fontMetrics().height(); int w = drawAreaWidth(next_menu_); painter.drawText(menu_padding_x, menu_padding_y, w, line_height, Qt::TextWordWrap | Qt::AlignLeft | Qt::AlignTop, next_menu_->title.c_str()); for (size_t i = 0; i < next_menu_->menus.size(); i++) { std::string menu = getMenuString(next_menu_, i); painter.drawText(menu_padding_x, line_height * ( 1 + i ) + menu_padding_y + menu_last_padding_y, w, line_height, Qt::TextWordWrap | Qt::AlignLeft | Qt::AlignTop, menu.c_str()); } if (next_menu_->current_index <= next_menu_->menus.size()) { // draw '>' painter.drawText(menu_padding_x - fontMetrics().width(">") * 2, line_height * ( 1 + next_menu_->current_index ) + menu_padding_y + menu_last_padding_y, w, line_height, Qt::TextWordWrap | Qt::AlignLeft | Qt::AlignTop, ">"); } // draw line int texture_width = overlay_->getTextureWidth(); int texture_height = overlay_->getTextureHeight(); painter.drawLine(menu_padding_x / 2, menu_last_padding_y / 2 + line_height, menu_padding_x / 2, texture_height - menu_last_padding_y / 2); painter.drawLine(texture_width - menu_padding_x / 2, menu_last_padding_y / 2 + line_height, texture_width - menu_padding_x / 2, texture_height - menu_last_padding_y / 2); painter.drawLine(menu_padding_x / 2, menu_last_padding_y / 2 + line_height, texture_width - menu_padding_x / 2, menu_last_padding_y / 2 + line_height); painter.drawLine(menu_padding_x / 2, texture_height - menu_last_padding_y / 2, texture_width - menu_padding_x / 2, texture_height - menu_last_padding_y / 2); painter.end(); current_menu_ = next_menu_; } 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); }