Skip to content

Commit aaf4ded

Browse files
committed
ui: show tooltip for empire map objects
1 parent db86e86 commit aaf4ded

File tree

1 file changed

+31
-51
lines changed

1 file changed

+31
-51
lines changed

src/window/window_empire.cpp

+31-51
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ struct empire_window : public autoconfig_window_t<empire_window> {
6565
int selected_city = 1;
6666
vec2i min_pos, max_pos;
6767
vec2i draw_offset;
68+
vec2i last_mouse_pos;
6869
int is_scrolling;
6970
int finished_scroll;
7071
int trade_column_spacing;
@@ -81,6 +82,7 @@ struct empire_window : public autoconfig_window_t<empire_window> {
8182
image_desc image, bottom_image, horizontal_bar,
8283
vertical_bar, cross_bar, trade_amount,
8384
closed_trade_route_hl, open_trade_route, open_trade_route_hl;
85+
xstring hovered_object_tooltip;
8486
//svector<object_trade_info, 16> buying_goods;
8587
//svector<object_trade_info, 16> selling_goods;
8688

@@ -132,6 +134,7 @@ struct empire_window : public autoconfig_window_t<empire_window> {
132134
void draw_city_info(const empire_object *object);
133135
void draw_trade_resource(e_resource resource, int trade_now, int trade_max, vec2i offset, e_font font);
134136
void draw_trade_route(int route_id, e_empire_route_state effect);
137+
void draw_object_tooltip();
135138
};
136139

137140
empire_window g_empire_window;
@@ -424,6 +427,7 @@ int empire_window::ui_handle_mouse(const mouse *m) {
424427
const hotkeys *h = hotkey_state();
425428

426429
vec2i position;
430+
last_mouse_pos = { m->x, m->y };
427431
if (scroll_get_delta(m, &position, SCROLL_TYPE_EMPIRE)) {
428432
g_empire_map.scroll_map(position);
429433
}
@@ -479,6 +483,7 @@ void empire_window::draw_empire_object(const empire_object* obj) {
479483

480484
vec2i pos;
481485
int image_id;
486+
pcstr tooltip_text = "";
482487
if (scenario_empire_is_expanded()) {
483488
pos = obj->expanded.pos;
484489
image_id = obj->expanded.image_id;
@@ -510,17 +515,21 @@ void empire_window::draw_empire_object(const empire_object* obj) {
510515
int letter_height = get_letter_height((const uint8_t*)"H", FONT_SMALL_PLAIN);
511516
vec2i text_pos = draw_offset + pos + vec2i{0, -letter_height};
512517

518+
tooltip_text = ui::str(text_group, city->name_id);
519+
513520
switch (obj->text_align) {
514-
case 0: ui::label_colored(ui::str(text_group, city->name_id), text_pos, FONT_SMALL_PLAIN, COLOR_FONT_DARK_RED, obj->width); break;
515-
case 1: ui::label_colored(ui::str(text_group, city->name_id), text_pos, FONT_SMALL_PLAIN, COLOR_FONT_DARK_RED, obj->width); break;
516-
case 2: ui::label_colored(ui::str(text_group, city->name_id), text_pos, FONT_SMALL_PLAIN, COLOR_FONT_DARK_RED, obj->width); break;
517-
case 3: ui::label_colored(ui::str(text_group, city->name_id), text_pos, FONT_SMALL_PLAIN, COLOR_FONT_DARK_RED, obj->width); break;
521+
case 0: ui::label_colored(tooltip_text, text_pos, FONT_SMALL_PLAIN, COLOR_FONT_DARK_RED, obj->width); break;
522+
case 1: ui::label_colored(tooltip_text, text_pos, FONT_SMALL_PLAIN, COLOR_FONT_DARK_RED, obj->width); break;
523+
case 2: ui::label_colored(tooltip_text, text_pos, FONT_SMALL_PLAIN, COLOR_FONT_DARK_RED, obj->width); break;
524+
case 3: ui::label_colored(tooltip_text, text_pos, FONT_SMALL_PLAIN, COLOR_FONT_DARK_RED, obj->width); break;
518525
}
526+
519527
} else if (obj->type == EMPIRE_OBJECT_TEXT) {
520528
const full_empire_object* full = empire_get_full_object(obj->id);
521529
vec2i text_pos = draw_offset + pos;
522530

523-
ui::label_colored(ui::str(196, full->city_name_id), text_pos - vec2i{5, 0}, FONT_SMALL_PLAIN, COLOR_FONT_SHITTY_BROWN, 100);
531+
tooltip_text = ui::str(196, full->city_name_id);
532+
ui::label_colored(tooltip_text, text_pos - vec2i{5, 0}, FONT_SMALL_PLAIN, COLOR_FONT_SHITTY_BROWN, 100);
524533
return;
525534
}
526535

@@ -544,32 +553,37 @@ void empire_window::draw_empire_object(const empire_object* obj) {
544553
}
545554

546555
image_id = image_id_remap(image_id);
547-
const image_t *img = ui::eimage(image_id, draw_offset + pos);
556+
const vec2i draw_pos = draw_offset + pos;
557+
const image_t *img = ui::eimage(image_id, draw_pos);
558+
559+
if (last_mouse_pos.x > draw_pos.x && last_mouse_pos.y > draw_pos.y
560+
&& last_mouse_pos.x < draw_pos.x + img->width && last_mouse_pos.y < draw_pos.y + img->height) {
561+
hovered_object_tooltip = tooltip_text;
562+
}
548563

549564
if (img && img->animation.speed_id) {
550565
int new_animation = empire_object_update_animation(obj, image_id);
551-
ui::eimage({ PACK_GENERAL, image_id + new_animation }, draw_offset + pos + img->animation.sprite_offset);
566+
ui::eimage({ PACK_GENERAL, image_id + new_animation }, draw_pos + img->animation.sprite_offset);
552567
}
553568
}
554569

555570
void empire_window::draw_map() {
556-
painter ctx = game.painter();
557-
558571
graphics_set_clip_rectangle(min_pos + start_pos, vec2i{max_pos - min_pos} - finish_pos);
559572

560573
g_empire_map.set_viewport(max_pos - min_pos - finish_pos);
561574

562575
draw_offset = min_pos + start_pos;
563576
draw_offset = g_empire_map.adjust_scroll(draw_offset);
577+
hovered_object_tooltip = "";
564578

565-
ImageDraw::img_generic(ctx, image_group(image), draw_offset);
579+
ui::eimage(image, draw_offset);
566580

567581
empire_object_foreach([this] (const empire_object *obj) {
568582
draw_empire_object(obj);
569583
});
570584

571585
scenario_invasion_foreach_warning([&] (vec2i pos, int image_id) {
572-
ImageDraw::img_generic(ctx, image_id, draw_offset + pos);
586+
ui::eimage(image_id, draw_offset + pos);
573587
});
574588

575589
graphics_reset_clip_rectangle();
@@ -682,49 +696,15 @@ void empire_window::ui_draw_foreground() {
682696
ui.draw();
683697

684698
draw_object_info();
699+
draw_object_tooltip();
685700

686701
ui.end_widget();
687702
}
688703

689-
static void get_tooltip_trade_route_type(tooltip_context* c) {
690-
//auto &data = g_empire_window;
691-
//int selected_object = g_empire_map.selected_object();
692-
//if (!selected_object || empire_object_get(selected_object - 1)->type != EMPIRE_OBJECT_CITY)
693-
// return;
694-
//
695-
//data.selected_city = g_empire.get_city_for_object(selected_object - 1);
696-
//const empire_city* city = g_empire.city(data.selected_city);
697-
//if (city->type != EMPIRE_CITY_PHARAOH || city->is_open)
698-
// return;
699-
//
700-
//int x_offset = (data.min_pos.x + data.max_pos.x + 300) / 2;
701-
//int y_offset = data.max_pos.y - 41;
702-
//int y_offset_max = y_offset + 22 - 2 * city->is_sea_trade;
703-
//if (c->mpos.x >= x_offset && c->mpos.x < x_offset + 32 && c->mpos.y >= y_offset && c->mpos.y < y_offset_max) {
704-
// c->type = TOOLTIP_BUTTON;
705-
// c->text.group = 44;
706-
// c->text.id = 28 + city->is_sea_trade;
707-
//}
708-
}
709-
710-
static void window_empire_get_tooltip(tooltip_context* c) {
711-
//auto &data = g_empire_window;
712-
//if (data.focus_button_id) {
713-
// c->type = TOOLTIP_BUTTON;
714-
// switch (data.focus_button_id) {
715-
// case 1:
716-
// c->text.id = 1;
717-
// break;
718-
// case 2:
719-
// c->text.id = 2;
720-
// break;
721-
// case 3:
722-
// c->text.id = 70;
723-
// break;
724-
// }
725-
//} else {
726-
// get_tooltip_trade_route_type(c);
727-
//}
704+
void empire_window::draw_object_tooltip() {
705+
if (!!hovered_object_tooltip) {
706+
ui::set_tooltip(hovered_object_tooltip);
707+
}
728708
}
729709

730710
void window_empire_show() {
@@ -733,7 +713,7 @@ void window_empire_show() {
733713
[] { g_empire_window.draw_background(); },
734714
[] { g_empire_window.ui_draw_foreground(); },
735715
[] (const mouse *m, const hotkeys *h) { g_empire_window.ui_handle_mouse(m); },
736-
window_empire_get_tooltip
716+
nullptr
737717
};
738718

739719
g_empire_window.init();

0 commit comments

Comments
 (0)