void Menu::draw_item(DrawingContext& context, int index) { float menu_height = get_height(); float menu_width = get_width(); MenuItem* pitem = items[index].get(); float x_pos = pos.x - menu_width/2; float y_pos = pos.y + 24*index - menu_height/2 + 12; pitem->draw(context, Vector(x_pos, y_pos), menu_width, active_item == index); if(active_item == index) { float blink = (sinf(real_time * M_PI * 1.0f)/2.0f + 0.5f) * 0.5f + 0.25f; context.draw_filled_rect(Rectf(Vector(pos.x - menu_width/2 + 10 - 2, y_pos - 12 - 2), Vector(pos.x + menu_width/2 - 10 + 2, y_pos + 12 + 2)), Color(1.0f, 1.0f, 1.0f, blink), 14.0f, LAYER_GUI-10); context.draw_filled_rect(Rectf(Vector(pos.x - menu_width/2 + 10, y_pos - 12), Vector(pos.x + menu_width/2 - 10, y_pos + 12)), Color(1.0f, 1.0f, 1.0f, 0.5f), 12.0f, LAYER_GUI-10); } }
void Menu::draw(DrawingContext& context) { if (!items[active_item]->help.empty()) { int text_width = (int) Resources::normal_font->get_text_width(items[active_item]->help); int text_height = (int) Resources::normal_font->get_text_height(items[active_item]->help); Rectf text_rect(pos.x - text_width/2 - 8, SCREEN_HEIGHT - 48 - text_height/2 - 4, pos.x + text_width/2 + 8, SCREEN_HEIGHT - 48 + text_height/2 + 4); context.draw_filled_rect(Rectf(text_rect.p1 - Vector(4,4), text_rect.p2 + Vector(4,4)), Color(0.2f, 0.3f, 0.4f, 0.8f), 16.0f, LAYER_GUI-10); context.draw_filled_rect(text_rect, Color(0.6f, 0.7f, 0.8f, 0.5f), 16.0f, LAYER_GUI-10); context.draw_text(Resources::normal_font, items[active_item]->help, Vector(pos.x, SCREEN_HEIGHT - 48 - text_height/2), ALIGN_CENTER, LAYER_GUI); } for(unsigned int i = 0; i < items.size(); ++i) { draw_item(context, i); } }
void draw(DrawingContext& context) { float p = m_effect_progress; Rectf rect = m_to_rect; if (m_is_active) { rect.p1.x = (m_to_rect.p1.x * p) + (m_from_rect.p1.x * (1.0f - p)); rect.p1.y = (m_to_rect.p1.y * p) + (m_from_rect.p1.y * (1.0f - p)); rect.p2.x = (m_to_rect.p2.x * p) + (m_from_rect.p2.x * (1.0f - p)); rect.p2.y = (m_to_rect.p2.y * p) + (m_from_rect.p2.y * (1.0f - p)); } // draw menu background rectangles context.draw_filled_rect(Rectf(rect.p1.x - 4, rect.p1.y - 10-4, rect.p2.x + 4, rect.p2.y + 10 + 4), Color(0.2f, 0.3f, 0.4f, 0.8f), 20.0f, LAYER_GUI-10); context.draw_filled_rect(Rectf(rect.p1.x, rect.p1.y - 10, rect.p2.x, rect.p2.y + 10), Color(0.6f, 0.7f, 0.8f, 0.5f), 16.0f, LAYER_GUI-10); }
void EditorLayersGui::draw(DrawingContext& context) { if (object_tip) { object_tip->draw_up(context, get_layer_coords(hovered_layer)); } context.draw_filled_rect(Rectf(Vector(0, Ypos), Vector(Width, SCREEN_HEIGHT)), Color(0.9f, 0.9f, 1.0f, 0.6f), 0.0f, LAYER_GUI-10); switch (hovered_item) { case HI_SPAWNPOINTS: context.draw_filled_rect(Rectf(Vector(0, Ypos), Vector(Xpos, SCREEN_HEIGHT)), Color(0.9f, 0.9f, 1.0f, 0.6f), 0.0f, LAYER_GUI-5); break; case HI_SECTOR: context.draw_filled_rect(Rectf(Vector(Xpos, Ypos), Vector(sector_text_width + Xpos, SCREEN_HEIGHT)), Color(0.9f, 0.9f, 1.0f, 0.6f), 0.0f, LAYER_GUI-5); break; case HI_LAYERS: { Vector coords = get_layer_coords(hovered_layer); context.draw_filled_rect(Rectf(coords, coords + Vector(32, 32)), Color(0.9f, 0.9f, 1.0f, 0.6f), 0.0f, LAYER_GUI-5); } break; default: break; } if (!Editor::current()->levelloaded) { return; } context.draw_text(Resources::normal_font, sector_text, Vector(35, Ypos+5), ALIGN_LEFT, LAYER_GUI, ColorScheme::Menu::default_color); int pos = 0; for(auto it = layers.begin(); it != layers.end(); ++it) { LayerIcon* layer_icon = (*it).get(); if (layer_icon->is_valid()) { layer_icon->draw(context, get_layer_coords(pos)); } else { auto it2 = it; it++; layers.erase(it2); it--; } pos++; } }
void ItemHorizontalLine::draw(DrawingContext& context, Vector pos, int menu_width, bool active) { // TODO /* Draw a horizontal line with a little 3d effect */ context.draw_filled_rect(Vector(pos.x, pos.y - 6), Vector(menu_width, 4), Color(0.6f, 0.7f, 1.0f, 1.0f), LAYER_GUI); context.draw_filled_rect(Vector(pos.x, pos.y - 6), Vector(menu_width, 2), Color(1.0f, 1.0f, 1.0f, 1.0f), LAYER_GUI); }
void TextObject::draw(DrawingContext& context) { context.push_transform(); context.set_translation(Vector(0, 0)); if(fading > 0) { context.set_alpha((fadetime-fading) / fadetime); } else if(fading < 0) { context.set_alpha(-fading / fadetime); } else if(!visible) { context.pop_transform(); return; } float width = 500; float height = 70; Vector spos = pos + get_anchor_pos(Rectf(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT), width, height, anchor); context.draw_filled_rect(spos, Vector(width, height), Color(0.6f, 0.7f, 0.8f, 0.5f), LAYER_GUI-50); if (centered) { context.draw_center_text(font, text, spos, LAYER_GUI-40, TextObject::default_color); } else { context.draw_text(font, text, spos + Vector(10, 10), ALIGN_LEFT, LAYER_GUI-40, TextObject::default_color); } context.pop_transform(); }
void Sector::draw(DrawingContext& context) { context.set_ambient_color( ambient_light ); context.push_transform(); context.set_translation(camera->get_translation()); for(auto i = gameobjects.begin(); i != gameobjects.end(); ++i) { GameObjectPtr& object = *i; if(!object->is_valid()) continue; if (draw_solids_only) { TileMap* tm = dynamic_cast<TileMap*>(object.get()); if (tm && !tm->is_solid()) continue; } object->draw(context); } if(show_collrects) { Color color(1.0f, 0.0f, 0.0f, 0.75f); for(auto i = moving_objects.begin(); i != moving_objects.end(); ++i) { MovingObject* object = *i; const Rectf& rect = object->get_bbox(); context.draw_filled_rect(rect, color, LAYER_FOREGROUND1 + 10); } } context.pop_transform(); }
void InfoBox::draw(DrawingContext& context) { float x1 = 200; float y1 = 100; float width = 400; float height = 200; context.draw_filled_rect(Vector(x1, y1), Vector(width, height), Color(0.6f, 0.7f, 0.8f, 0.5f), LAYER_GUI-1); float y = y1; for(size_t i = firstline; i < lines.size(); ++i) { if(y >= y1 + height) break; lines[i]->draw(context, Vector(x1, y), LAYER_GUI); y += lines[i]->get_height(); // draw the scrolling arrows if (arrow_scrollup && firstline > 0) context.draw_surface(arrow_scrollup, Vector( x1 + width - arrow_scrollup->get_width(), // top-right corner of box y1), LAYER_GUI); if (arrow_scrolldown && firstline < lines.size()-1) context.draw_surface(arrow_scrolldown, Vector( x1 + width - arrow_scrolldown->get_width(), // bottom-light corner of box y1 + height - arrow_scrolldown->get_height()), LAYER_GUI); } }
void GameSession::draw_pause(DrawingContext& context) { context.draw_filled_rect( Vector(0,0), Vector(SCREEN_WIDTH, SCREEN_HEIGHT), Color(0.0f, 0.0f, 0.0f, .25f), LAYER_FOREGROUND1); }
void ItemColorChannel::draw(DrawingContext& context, const Vector& pos, int menu_width, bool active) { MenuItem::draw(context, pos, menu_width, active); float lw = float(menu_width - 32) * (*number); context.draw_filled_rect(Rectf(pos + Vector(16, 6), pos + Vector(16 + lw, 16)), channel, 0.0f, LAYER_GUI-1); }
void Particles::draw(DrawingContext& context) { // draw particles for(auto& particle : particles) { context.draw_filled_rect(particle->pos, Vector(size,size), color, drawing_layer); } }
void Particles::draw(DrawingContext& context) { // draw particles for(auto i = particles.begin(); i != particles.end(); ++i) { context.draw_filled_rect((*i)->pos, Vector(size,size), color,drawing_layer); } }
void SequenceTrigger::draw(DrawingContext& context) { if (Editor::is_active()) { context.draw_filled_rect(bbox, Color(1.0f, 0.0f, 0.0f, 0.6f), 0.0f, LAYER_OBJECTS); } }
void AmbientSound::draw(DrawingContext& context) { if (Editor::is_active()) { context.draw_filled_rect(bbox, Color(0.0f, 0.0f, 1.0f, 0.6f), 0.0f, LAYER_OBJECTS); } }
void Particles::draw(DrawingContext& context) { // draw particles for(std::vector<Particle*>::iterator i = particles.begin(); i != particles.end(); i++) { context.draw_filled_rect((*i)->pos, Vector(size,size), color,drawing_layer); } }
void FadeOut::draw(DrawingContext& context) { Color col = color; col.alpha = accum_time / fade_time; context.draw_filled_rect(Vector(0, 0), Vector(SCREEN_WIDTH, SCREEN_HEIGHT), col, LAYER_GUI+1); }
void LevelIntro::draw(DrawingContext& context) { const Statistics& stats = level->stats; int py = static_cast<int>(SCREEN_HEIGHT / 2 - Resources::normal_font->get_height() / 2); context.draw_filled_rect(Vector(0, 0), Vector(SCREEN_WIDTH, SCREEN_HEIGHT), Color(0.0f, 0.0f, 0.0f, 1.0f), 0); { context.draw_center_text(Resources::normal_font, level->get_name(), Vector(0, py), LAYER_FOREGROUND1, LevelIntro::header_color); py += static_cast<int>(Resources::normal_font->get_height()); } std::string author = level->get_author(); if ((author != "") && (author != "SuperTux Team")) { std::string author_text = std::string(_("contributed by ")) + author; context.draw_center_text(Resources::small_font, author_text, Vector(0, py), LAYER_FOREGROUND1, LevelIntro::author_color); py += static_cast<int>(Resources::small_font->get_height()); } py += 32; { player_sprite->draw(context, Vector((SCREEN_WIDTH - player_sprite->get_current_hitbox_width()) / 2, py + player_sprite_py), LAYER_FOREGROUND1); py += static_cast<int>(player_sprite->get_current_hitbox_height()); } py += 32; { context.draw_center_text(Resources::normal_font, std::string("- ") + _("Best Level Statistics") + std::string(" -"), Vector(0, py), LAYER_FOREGROUND1, LevelIntro::stat_hdr_color); py += static_cast<int>(Resources::normal_font->get_height()); } { std::stringstream ss; ss << _("Coins") << ": " << Statistics::coins_to_string((best_level_statistics && (best_level_statistics->coins >= 0)) ? best_level_statistics->coins : 0, stats.total_coins); context.draw_center_text(Resources::normal_font, ss.str(), Vector(0, py), LAYER_FOREGROUND1, LevelIntro::stat_color); py += static_cast<int>(Resources::normal_font->get_height()); } { std::stringstream ss; ss << _("Secrets") << ": " << Statistics::secrets_to_string((best_level_statistics && (best_level_statistics->coins >= 0)) ? best_level_statistics->secrets : 0, stats.total_secrets); context.draw_center_text(Resources::normal_font, ss.str(), Vector(0, py), LAYER_FOREGROUND1,LevelIntro::stat_color); py += static_cast<int>(Resources::normal_font->get_height()); } { std::stringstream ss; ss << _("Time") << ": " << Statistics::time_to_string((best_level_statistics && (best_level_statistics->coins >= 0)) ? best_level_statistics->time : 0); context.draw_center_text(Resources::normal_font, ss.str(), Vector(0, py), LAYER_FOREGROUND1,LevelIntro::stat_color); py += static_cast<int>(Resources::normal_font->get_height()); } }
void MagicBlock::draw(DrawingContext& context) { //Ask for update about lightmap at center of this block context.get_light( center, &light ); //Draw the Sprite. MovingSprite::draw(context); //Add the color. context.draw_filled_rect( bbox, color, layer); }
void EditorScroller::draw(DrawingContext& context) { if (!rendered) return; context.draw_filled_rect(Rectf(Vector(0, 0), Vector(SIZE, SIZE)), Color(0.9f, 0.9f, 1.0f, 0.6f), MIDDLE, LAYER_GUI-10); context.draw_filled_rect(Rectf(Vector(40, 40), Vector(56, 56)), Color(0.9f, 0.9f, 1.0f, 0.6f), 8, LAYER_GUI-20); if (can_scroll()) { draw_arrow(context, mouse_pos); } draw_arrow(context, Vector(TOPLEFT, MIDDLE)); draw_arrow(context, Vector(BOTTOMRIGHT, MIDDLE)); draw_arrow(context, Vector(MIDDLE, TOPLEFT)); draw_arrow(context, Vector(MIDDLE, BOTTOMRIGHT)); }
void Thunderstorm::draw(DrawingContext& context) { if (!flash_display_timer.started()) return; float alpha = 0.33f; context.push_transform(); context.set_translation(Vector(0, 0)); context.draw_filled_rect(Vector(0, 0), Vector(SCREEN_WIDTH, SCREEN_HEIGHT), Color(1, 1, 1, alpha), layer); context.pop_transform(); }
void ShrinkFade::draw(DrawingContext& context) { Color black(0, 0, 0); float left = speedleft * accum_time; float top = speedtop * accum_time; float right = SCREEN_WIDTH - speedright * accum_time; float bottom = SCREEN_HEIGHT - speedbottom * accum_time; context.draw_filled_rect(Vector(0, 0), Vector(left, SCREEN_HEIGHT), black, LAYER_GUI+1); context.draw_filled_rect(Vector(0, 0), Vector(SCREEN_WIDTH, top), black, LAYER_GUI+1); context.draw_filled_rect(Vector(right, 0), Vector(SCREEN_WIDTH, SCREEN_HEIGHT), black, LAYER_GUI+1); context.draw_filled_rect(Vector(0, bottom), Vector(SCREEN_WIDTH, SCREEN_HEIGHT), black, LAYER_GUI+1); }
void DisplayEffect::draw(DrawingContext& context) { context.push_transform(); context.set_translation(Vector(0, 0)); if(black || screen_fade != NO_FADE) { float alpha; if(black) { alpha = 1.0f; } else { switch(screen_fade) { case FADE_IN: alpha = screen_fading / screen_fadetime; break; case FADE_OUT: alpha = (screen_fadetime - screen_fading) / screen_fadetime; break; default: alpha = 0; assert(false); } } context.draw_filled_rect(Vector(0, 0), Vector(SCREEN_WIDTH, SCREEN_HEIGHT), Color(0, 0, 0, alpha), LAYER_GUI-10); } if (borders) { context.draw_filled_rect(Vector(0, 0), Vector(SCREEN_WIDTH, border_size), Color(0, 0, 0, 1.0f), LAYER_GUI-10); context.draw_filled_rect(Vector(0, SCREEN_HEIGHT - border_size), Vector(SCREEN_WIDTH, border_size), Color(0, 0, 0, 1.0f), LAYER_GUI-10); } context.pop_transform(); }
void InfoBlock::draw(DrawingContext& context) { Block::draw(context); if (shown_pct <= 0) return; context.push_transform(); //context.set_translation(Vector(0, 0)); context.set_alpha(shown_pct); //float x1 = SCREEN_WIDTH/2-200; //float y1 = SCREEN_HEIGHT/2-200; float border = 8; float width = 400; // this is the text width only float height = lines_height; // this is the text height only float x1 = (bbox.p1.x + bbox.p2.x)/2 - width/2; float x2 = (bbox.p1.x + bbox.p2.x)/2 + width/2; float y1 = original_y - height; if(x1 < 0) { x1 = 0; x2 = width; } if(x2 > Sector::current()->get_width()) { x2 = Sector::current()->get_width(); x1 = x2 - width; } // lines_height includes one ITEMS_SPACE too much, so the bottom border is reduced by 4px context.draw_filled_rect(Vector(x1-border, y1-border), Vector(width+2*border, height+2*border-4), Color(0.6f, 0.7f, 0.8f, 0.5f), LAYER_GUI-50); float y = y1; for(size_t i = 0; i < lines.size(); ++i) { if(y >= y1 + height) { //log_warning << "Too many lines of text in InfoBlock" << std::endl; //dest_pct = 0; //shown_pct = 0; break; } lines[i]->draw(context, Rectf(x1, y, x2, y), LAYER_GUI-50+1); y += lines[i]->get_height(); } context.pop_transform(); }
void Editor::draw(DrawingContext& context) { if (levelloaded) { currentsector->draw(context); context.draw_filled_rect(Rectf(Vector(0, 0), Vector(SCREEN_WIDTH, SCREEN_HEIGHT)), Color(0.0f, 0.0f, 0.0f), 0.0f, std::numeric_limits<int>::min()); } else { context.draw_surface_part(bgr_surface, Rectf(Vector(0, 0), bgr_surface->get_size()), Rectf(Vector(0, 0), Vector(SCREEN_WIDTH, SCREEN_HEIGHT)), -100); } inputcenter.draw(context); tileselect.draw(context); layerselect.draw(context); scroller.draw(context); MouseCursor::current()->draw(context); }
void TextScroller::draw(DrawingContext& context) { context.draw_filled_rect(Vector(0, 0), Vector(SCREEN_WIDTH, SCREEN_HEIGHT), Color(0.6f, 0.7f, 0.8f, 0.5f), 0); context.draw_surface(background, Vector(SCREEN_WIDTH/2 - background->get_width()/2 , SCREEN_HEIGHT/2 - background->get_height()/2), 0); float y = SCREEN_HEIGHT - scroll; for(size_t i = 0; i < lines.size(); i++) { if (y + lines[i]->get_height() >= 0 && SCREEN_HEIGHT - y >= 0) { lines[i]->draw(context, Rectf(LEFT_BORDER, y, SCREEN_WIDTH - 2*LEFT_BORDER, y), LAYER_GUI); } y += lines[i]->get_height(); } if(y < 0 && !fading ) { fading = true; g_screen_manager->exit_screen(new FadeOut(0.5)); } }
void TextScroller::draw(DrawingContext& context) { context.draw_filled_rect(Vector(0, 0), Vector(SCREEN_WIDTH, SCREEN_HEIGHT), Color(0.6f, 0.7f, 0.8f, 0.5f), 0); context.draw_surface_part(background, Rectf(0, 0, background->get_width(), background->get_height()), Rectf(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT), 0); float y = SCREEN_HEIGHT - scroll; for (auto& line : lines) { if (y + line->get_height() >= 0 && SCREEN_HEIGHT - y >= 0) { line->draw(context, Rectf(LEFT_BORDER, y, SCREEN_WIDTH - 2*LEFT_BORDER, y), LAYER_GUI); } y += line->get_height(); } if(y < 0 && !fading ) { fading = true; ScreenManager::current()->pop_screen(std::unique_ptr<ScreenFade>(new FadeOut(0.5))); } }
void InfoBox::draw(DrawingContext& context) { float x1 = SCREEN_WIDTH/2-200; float y1 = SCREEN_HEIGHT/2-200; float width = 400; float height = 200; context.draw_filled_rect(Vector(x1, y1), Vector(width, height), Color(0.6f, 0.7f, 0.8f, 0.5f), LAYER_GUI-1); float y = y1; bool linesLeft = false; for(size_t i = firstline; i < lines.size(); ++i) { if(y >= y1 + height) { linesLeft = true; break; } lines[i]->draw(context, Rectf(x1, y, x1+width, y), LAYER_GUI); y += lines[i]->get_height(); } { // draw the scrolling arrows if (arrow_scrollup.get() && firstline > 0) context.draw_surface(arrow_scrollup, Vector( x1 + width - arrow_scrollup->get_width(), // top-right corner of box y1), LAYER_GUI); if (arrow_scrolldown.get() && linesLeft && firstline < lines.size()-1) context.draw_surface(arrow_scrolldown, Vector( x1 + width - arrow_scrolldown->get_width(), // bottom-light corner of box y1 + height - arrow_scrolldown->get_height()), LAYER_GUI); } }
void EditorInputCenter::draw(DrawingContext& context) { draw_tile_tip(context); draw_path(context); if (render_grid) { draw_tile_grid(context); } if (object_tip) { object_tip->draw(context, mouse_pos); } if (dragging && Editor::current()->tileselect.select_mode->get_mode() == 1 && !dragging_right) { // Draw selection rectangle... Vector p0 = drag_start - Editor::current()->currentsector->camera->get_translation(); Vector p1 = Vector(drag_start.x, sector_pos.y) - Editor::current()->currentsector->camera->get_translation(); Vector p2 = Vector(sector_pos.x, drag_start.y) - Editor::current()->currentsector->camera->get_translation(); context.draw_filled_rect(Rectf(p0, p1 + Vector(2, 2)), Color(0.0f, 1.0f, 0.0f, 1.0f), 0.0f, LAYER_GUI-5); context.draw_filled_rect(Rectf(p2, mouse_pos + Vector(2, 2)), Color(0.0f, 1.0f, 0.0f, 1.0f), 0.0f, LAYER_GUI-5); context.draw_filled_rect(Rectf(p0, p2 + Vector(2, 2)), Color(0.0f, 1.0f, 0.0f, 1.0f), 0.0f, LAYER_GUI-5); context.draw_filled_rect(Rectf(p1, mouse_pos + Vector(2, 2)), Color(0.0f, 1.0f, 0.0f, 1.0f), 0.0f, LAYER_GUI-5); context.draw_filled_rect(Rectf(p0, mouse_pos), Color(0.0f, 1.0f, 0.0f, 0.2f), 0.0f, LAYER_GUI-5); } if (dragging && dragging_right) { context.draw_filled_rect(selection_draw_rect(), Color(0.2f, 0.4f, 1.0f, 0.6f), 0.0f, LAYER_GUI-13); } }
void Dialog::draw(DrawingContext& ctx) { Rectf bg_rect(Vector(SCREEN_WIDTH/2 - m_text_size.width/2, SCREEN_HEIGHT/2 - m_text_size.height/2), Sizef(m_text_size.width, m_text_size.height + 44)); // draw background rect ctx.draw_filled_rect(bg_rect.grown(12.0f), Color(0.2f, 0.3f, 0.4f, 0.8f), 16.0f, LAYER_GUI-10); ctx.draw_filled_rect(bg_rect.grown(8.0f), Color(0.6f, 0.7f, 0.8f, 0.5f), 16.0f, LAYER_GUI-10); // draw text ctx.draw_text(Resources::normal_font, m_text, Vector(bg_rect.p1.x + bg_rect.get_width()/2.0f, bg_rect.p1.y), ALIGN_CENTER, LAYER_GUI); // draw HL line ctx.draw_filled_rect(Vector(bg_rect.p1.x, bg_rect.p2.y - 35), Vector(bg_rect.get_width(), 4), Color(0.6f, 0.7f, 1.0f, 1.0f), LAYER_GUI); ctx.draw_filled_rect(Vector(bg_rect.p1.x, bg_rect.p2.y - 35), Vector(bg_rect.get_width(), 2), Color(1.0f, 1.0f, 1.0f, 1.0f), LAYER_GUI); // draw buttons for(int i = 0; i < static_cast<int>(m_buttons.size()); ++i) { float segment_width = bg_rect.get_width() / m_buttons.size(); float button_width = segment_width; float button_height = 24.0f; Vector pos(bg_rect.p1.x + segment_width/2.0f + i * segment_width, bg_rect.p2.y - 12); if (i == m_selected_button) { float blink = (sinf(real_time * M_PI * 1.0f)/2.0f + 0.5f) * 0.5f + 0.25f; ctx.draw_filled_rect(Rectf(Vector(pos.x - button_width/2, pos.y - button_height/2), Vector(pos.x + button_width/2, pos.y + button_height/2)).grown(2.0f), Color(1.0f, 1.0f, 1.0f, blink), 14.0f, LAYER_GUI-10); ctx.draw_filled_rect(Rectf(Vector(pos.x - button_width/2, pos.y - button_height/2), Vector(pos.x + button_width/2, pos.y + button_height/2)), Color(1.0f, 1.0f, 1.0f, 0.5f), 12.0f, LAYER_GUI-10); } ctx.draw_text(Resources::normal_font, m_buttons[i].text, Vector(pos.x, pos.y - int(Resources::normal_font->get_height()/2)), ALIGN_CENTER, LAYER_GUI, i == m_selected_button ? ColorScheme::Menu::active_color : ColorScheme::Menu::default_color); } }
void Menu::draw_item(DrawingContext& context, int index) { float menu_height = get_height(); float menu_width = get_width(); MenuItem& pitem = *(items[index]); Color text_color = ColorScheme::Menu::default_color; float x_pos = pos.x; float y_pos = pos.y + 24*index - menu_height/2 + 12; int text_width = int(Resources::normal_font->get_text_width(pitem.text)); int input_width = int(Resources::normal_font->get_text_width(pitem.input) + 10); int list_width = 0; float left = pos.x - menu_width/2 + 16; float right = pos.x + menu_width/2 - 16; if(pitem.list.size() > 0) { list_width = (int) Resources::normal_font->get_text_width(pitem.list[pitem.selected]); } if (arrange_left) x_pos += 24 - menu_width/2 + (text_width + input_width + list_width)/2; if(index == active_item) { text_color = ColorScheme::Menu::active_color; } if(active_item == index) { float blink = (sinf(real_time * M_PI * 1.0f)/2.0f + 0.5f) * 0.5f + 0.25f; context.draw_filled_rect(Rectf(Vector(pos.x - menu_width/2 + 10 - 2, y_pos - 12 - 2), Vector(pos.x + menu_width/2 - 10 + 2, y_pos + 12 + 2)), Color(1.0f, 1.0f, 1.0f, blink), 14.0f, LAYER_GUI-10); context.draw_filled_rect(Rectf(Vector(pos.x - menu_width/2 + 10, y_pos - 12), Vector(pos.x + menu_width/2 - 10, y_pos + 12)), Color(1.0f, 1.0f, 1.0f, 0.5f), 12.0f, LAYER_GUI-10); } switch (pitem.kind) { case MN_INACTIVE: { context.draw_text(Resources::normal_font, pitem.text, Vector(pos.x, y_pos - int(Resources::normal_font->get_height()/2)), ALIGN_CENTER, LAYER_GUI, ColorScheme::Menu::inactive_color); break; } case MN_HL: { // TODO float x = pos.x - menu_width/2; float y = y_pos - 12; /* Draw a horizontal line with a little 3d effect */ context.draw_filled_rect(Vector(x, y + 6), Vector(menu_width, 4), Color(0.6f, 0.7f, 1.0f, 1.0f), LAYER_GUI); context.draw_filled_rect(Vector(x, y + 6), Vector(menu_width, 2), Color(1.0f, 1.0f, 1.0f, 1.0f), LAYER_GUI); break; } case MN_LABEL: { context.draw_text(Resources::big_font, pitem.text, Vector(pos.x, y_pos - int(Resources::big_font->get_height()/2)), ALIGN_CENTER, LAYER_GUI, ColorScheme::Menu::label_color); break; } case MN_TEXTFIELD: case MN_NUMFIELD: case MN_CONTROLFIELD: { if(pitem.kind == MN_TEXTFIELD || pitem.kind == MN_NUMFIELD) { if(active_item == index) context.draw_text(Resources::normal_font, pitem.get_input_with_symbol(true), Vector(right, y_pos - int(Resources::normal_font->get_height()/2)), ALIGN_RIGHT, LAYER_GUI, ColorScheme::Menu::field_color); else context.draw_text(Resources::normal_font, pitem.get_input_with_symbol(false), Vector(right, y_pos - int(Resources::normal_font->get_height()/2)), ALIGN_RIGHT, LAYER_GUI, ColorScheme::Menu::field_color); } else context.draw_text(Resources::normal_font, pitem.input, Vector(right, y_pos - int(Resources::normal_font->get_height()/2)), ALIGN_RIGHT, LAYER_GUI, ColorScheme::Menu::field_color); context.draw_text(Resources::normal_font, pitem.text, Vector(left, y_pos - int(Resources::normal_font->get_height()/2)), ALIGN_LEFT, LAYER_GUI, text_color); break; } case MN_STRINGSELECT: { float roff = Resources::arrow_left->get_width(); // Draw left side context.draw_text(Resources::normal_font, pitem.text, Vector(left, y_pos - int(Resources::normal_font->get_height()/2)), ALIGN_LEFT, LAYER_GUI, text_color); // Draw right side context.draw_surface(Resources::arrow_left, Vector(right - list_width - roff - roff, y_pos - 8), LAYER_GUI); context.draw_surface(Resources::arrow_right, Vector(right - roff, y_pos - 8), LAYER_GUI); context.draw_text(Resources::normal_font, pitem.list[pitem.selected], Vector(right - roff, y_pos - int(Resources::normal_font->get_height()/2)), ALIGN_RIGHT, LAYER_GUI, text_color); break; } case MN_BACK: { context.draw_text(Resources::Resources::normal_font, pitem.text, Vector(pos.x, y_pos - int(Resources::normal_font->get_height()/2)), ALIGN_CENTER, LAYER_GUI, text_color); context.draw_surface(Resources::back, Vector(x_pos + text_width/2 + 16, y_pos - 8), LAYER_GUI); break; } case MN_TOGGLE: { context.draw_text(Resources::normal_font, pitem.text, Vector(pos.x - menu_width/2 + 16, y_pos - (Resources::normal_font->get_height()/2)), ALIGN_LEFT, LAYER_GUI, text_color); if(pitem.toggled) context.draw_surface(Resources::checkbox_checked, Vector(x_pos + (menu_width/2-16) - Resources::checkbox->get_width(), y_pos - 8), LAYER_GUI + 1); else context.draw_surface(Resources::checkbox, Vector(x_pos + (menu_width/2-16) - Resources::checkbox->get_width(), y_pos - 8), LAYER_GUI + 1); break; } case MN_ACTION: context.draw_text(Resources::normal_font, pitem.text, Vector(pos.x, y_pos - int(Resources::normal_font->get_height()/2)), ALIGN_CENTER, LAYER_GUI, text_color); break; case MN_GOTO: context.draw_text(Resources::normal_font, pitem.text, Vector(pos.x, y_pos - int(Resources::normal_font->get_height()/2)), ALIGN_CENTER, LAYER_GUI, text_color); break; } }