ScenEditor: create a class to store some static buttons and scrollbars

+ begin to use it, to be continued...
This commit is contained in:
ALONSO Laurent
2021-10-31 14:19:53 +01:00
committed by Celtic Minstrel
parent 8efa23debb
commit 386632131c
8 changed files with 899 additions and 868 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -2,7 +2,6 @@
#include "scen.global.hpp"
#include "undo.hpp"
void init_screen_locs();
void handle_action(location the_point,sf::Event event);
void flash_rect(rectangle to_flash);
void swap_terrain();

View File

@@ -1,92 +1,205 @@
#include <array>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <cstdio>
#include <memory>
#include <string>
#include "drawable_manager.hpp"
#include "event_listener.hpp"
#include "render_image.hpp"
#include "render_shapes.hpp"
#include "render_text.hpp"
#include "res_image.hpp"
#include "tiling.hpp"
#include "scen.global.hpp"
#include "scen.graphics.hpp"
#include "scen.btnmg.hpp"
#include "scrollbar.hpp"
extern rectangle right_sbar_rect;
cScenButtonsBars scen_controls;
extern rectangle right_buttons[NRSONPAGE];
extern sf::RenderWindow mainPtr;
extern cDrawableManager drawable_mgr;
extern rectangle terrain_buttons_rect;
extern std::array<lb_t,NLS> left_button_status;
extern std::vector<rb_t> right_button_status;
extern std::shared_ptr<cScrollbar> right_sbar;
// for following, lb stands for left button(s)
void init_lb() {
void cScenButtonsBars::init()
{
// left_buttons
static rectangle left_button_base = {5,5,21,280};
for(short i = 0; i < NLS; i++) {
left_button_status[i] = {LB_CLEAR, LB_NO_ACTION, ""};
auto &button_rects=left_buttons_rectangles[i];
button_rects[0] = left_button_base;
button_rects[0].offset(0,i * 16);
button_rects[1] = button_rects[0];
button_rects[1].top += 1;
button_rects[1].bottom -= 1;
button_rects[1].left += 0;
button_rects[1].right = button_rects[1].left + 16;
}
// right_button
rectangle right_button_base;
right_button_base.left = RIGHT_AREA_UL_X + 1;
right_button_base.top = RIGHT_AREA_UL_Y + 1;
right_button_base.bottom = right_button_base.top + 12;
right_button_base.right = right_button_base.left + RIGHT_AREA_WIDTH - 20;
for(short i = 0; i < NRSONPAGE; i++) {
right_buttons_rectangles[i] = right_button_base;
right_buttons_rectangles[i].offset(0,i * 12);
}
// terrains
terrain_rectangle = {0,0,340,272};
terrain_rectangle.offset(TER_RECT_UL_X, TER_RECT_UL_Y);
for(auto &rect : terrain_border_rects)
rect = scen_controls.terrain_rectangle;
terrain_border_rects[0].bottom = terrain_border_rects[0].top + 8;
terrain_border_rects[1].right = terrain_border_rects[1].left + 8;
terrain_border_rects[2].top = terrain_border_rects[2].bottom - 8;
terrain_border_rects[3].left = terrain_border_rects[3].right - 8;
static rectangle terrain_rect_base = {0,0,16,16};
for(short i = 0; i < 256; i++) {
terrain_rects[i] = terrain_rect_base;
terrain_rects[i].offset(3 + (i % 16) * (terrain_rect_base.right + 1),
3 + (i / 16) * (terrain_rect_base.bottom + 1));
}
// scrollbars
rectangle right_bar_rect;
right_bar_rect.top = RIGHT_AREA_UL_Y - 1;
right_bar_rect.left = RIGHT_AREA_UL_X + RIGHT_AREA_WIDTH - 1 - 16;
right_bar_rect.bottom = RIGHT_AREA_UL_Y + RIGHT_AREA_HEIGHT + 1;
right_bar_rect.right = RIGHT_AREA_UL_X + RIGHT_AREA_WIDTH - 1;
init_bar(right_bar, "right_sbar", right_bar_rect, { 5, 287, 405, 577 }, NRSONPAGE - 1);
right_bar->setPosition(0);
rectangle pal_bar_rect = terrain_buttons_rect;
pal_bar_rect.offset(RIGHT_AREA_UL_X,RIGHT_AREA_UL_Y);
pal_bar_rect.left = pal_bar_rect.right - 16;
pal_bar_rect.height() = 17 * 16;
init_bar(palette_bar, "pal_sbar", pal_bar_rect, { 5, 287, 279, 581 }, 16);
}
void reset_lb() {
for(short i = 0; i < NLS; i++) {
left_button_status[i] = {LB_CLEAR, LB_NO_ACTION, ""};
draw_lb_slot(i,0);
}
void cScenButtonsBars::draw_left_buttons() {
for(short i = 0; i < NLS; i++)
draw_left_slot(i,0);
}
// mode 0 normal 1 click
void cScenButtonsBars::draw_left_slot (short which,short mode) {
rectangle text_rect,from_rect;
auto const &button=left_buttons[which];
auto const &button_rects=left_buttons_rectangles[which];
tileImage(mainPtr,button_rects[0],bg[20]);
if(button.mode == LB_CLEAR)
return;
text_rect = button_rects[0];
if(button.action != LB_NO_ACTION) {
text_rect.left += 18;
static rectangle const blue_button_from = {120,235,134,251};
from_rect = blue_button_from;
if(mode > 0)
from_rect.offset(0,from_rect.height());
auto const &edbuttons=*ResMgr::textures.get("edbuttons");
rect_draw_some_item(edbuttons,from_rect,mainPtr,button_rects[1]);
}
if(button.mode == LB_INDENT)
text_rect.left += 16;
TextStyle style;
if(button.mode == LB_TITLE) {
style.pointSize = 14;
}
else text_rect.offset(0,2);
if(mode > 0)
style.colour = Colours::BLUE;
style.lineHeight = 12;
win_draw_string(mainPtr,text_rect,button.label,eTextMode::WRAP,style);
}
// is slot >= 0, force that slot
// if -1, use 1st free slot
void set_lb(short slot, eLBMode mode, eLBAction action, std::string label, bool do_draw) {
void cScenButtonsBars::set_left_button(short slot, eLBMode mode, eLBAction action, std::string const &label, bool do_draw) {
if(slot < 0) {
auto iter = std::find_if(left_button_status.begin(), left_button_status.end(), [](const lb_t& btn) {
auto iter = std::find_if(left_buttons.begin(), left_buttons.end(), [](const lb_t& btn) {
return btn.mode == LB_CLEAR;
});
if(iter == left_button_status.end())
if(iter == left_buttons.end())
return;
slot = iter - left_button_status.begin();
slot = iter - left_buttons.begin();
}
left_button_status[slot].mode = mode;
left_button_status[slot].action = action;
left_button_status[slot].label = label;
left_buttons[slot]={mode, action, label};
if(do_draw)
draw_lb_slot(slot,0);
draw_left_slot(slot,0);
}
void init_rb() {
right_sbar->setPosition(0);
right_button_status.clear();
void cScenButtonsBars::reset_left_buttons() {
lb_t const defButtons;
for (auto &button : left_buttons)
button = defButtons;
}
void reset_rb() {
right_button_status.clear();
draw_rb();
right_sbar->setMaximum(0);
right_sbar->setPosition(0);
void cScenButtonsBars::draw_right_buttons() const {
long pos = right_bar->getPosition();
for(long i = pos; i < pos + NRSONPAGE && i < right_buttons.size(); i++)
draw_right_slot(i,0);
}
// mode 0 normal 1 pressed
void cScenButtonsBars::draw_right_slot(short which,short mode) const {
long pos = right_bar->getPosition();
if(which < pos || which >= pos + NRSONPAGE || which >= right_buttons.size())
return;
auto const &rect=right_buttons_rectangles[which - pos];
tileImage(mainPtr,rect,bg[17]);
if(right_buttons[which].action == RB_CLEAR)
return;
TextStyle style;
if(mode > 0)
style.colour = Colours::RED;
style.lineHeight = 12;
win_draw_string(mainPtr,rect,right_buttons[which].label,eTextMode::WRAP,style);
}
// is slot >= 0, force that slot
// if -1, use 1st free slot
void set_rb(short slot, eRBAction action, int n, std::string label, bool do_draw) {
void cScenButtonsBars::set_right_button(short slot, eRBAction action, int n, std::string const &label, bool do_draw) {
if(slot < 0) {
for(short i = 0; i < NRS; i++)
if(right_button_status[i].action == RB_CLEAR) {
for(short i = 0; i < right_buttons.size(); i++)
if(right_buttons[i].action == RB_CLEAR) {
slot = i;
break;
}
}
if(slot >= NRS)
right_button_status.resize(slot + 1);
right_button_status[slot].action = action;
right_button_status[slot].i = n;
right_button_status[slot].label = label;
for(char& c : right_button_status[slot].label) {
if(c == '|')
c = ' ';
}
if(slot >= right_buttons.size())
right_buttons.resize(slot + 1);
right_buttons[slot]={action, n, label};
std::replace(right_buttons[slot].label.begin(), right_buttons[slot].label.end(), '|', ' ');
if(do_draw)
draw_rb_slot(slot,0);
draw_right_slot(slot,0);
}
void cScenButtonsBars::reset_right_bar_and_buttons() {
right_buttons.clear();
draw_right_buttons();
right_bar->setMaximum(0);
right_bar->setPosition(0);
}
void cScenButtonsBars::init_bar(std::shared_ptr<cScrollbar>& sbar, const std::string& name, rectangle const &rect, rectangle const &events_rect, int pgSz) {
sbar.reset(new cScrollbar(mainPtr));
sbar->setBounds(rect);
sbar->set_wheel_event_rect(events_rect);
sbar->setPageSize(pgSz);
sbar->hide();
drawable_mgr.add_drawable(UI_LAYER_DEFAULT, name, sbar);
event_listeners[name] = std::dynamic_pointer_cast<iEventListener>(sbar);
}

View File

@@ -1,3 +1,9 @@
#include <array>
#include <memory>
#include <unordered_map>
#include <vector>
#include "scrollbar.hpp"
enum eLBAction {
LB_NO_ACTION,
@@ -52,6 +58,12 @@ struct lb_t {
eLBMode mode;
eLBAction action;
std::string label;
lb_t(eLBMode newMode=LB_CLEAR, eLBAction newAction=LB_NO_ACTION, std::string const &newLabel="")
: mode(newMode)
, action(newAction)
, label(newLabel) {
}
};
struct rb_t {
@@ -60,9 +72,52 @@ struct rb_t {
std::string label;
};
void init_lb();
void reset_lb();
void set_lb(short slot, eLBMode mode, eLBAction action, std::string label, bool do_draw = false);
void init_rb() ;
void reset_rb() ;
void set_rb(short slot, eRBAction action, int i, std::string label, bool do_draw = false);
class iEventListener;
class cScenButtonsBars {
public:
void init();
void show_palette_bar(bool show=true) {
if (!palette_bar)
return;
if (show)
palette_bar->show();
else
palette_bar->hide();
}
void show_right_bar(bool show=true) {
if (!right_bar)
return;
if (show)
right_bar->show();
else
right_bar->hide();
}
void draw_left_buttons();
void draw_left_slot(short which,short mode);
void set_left_button(short slot, eLBMode mode, eLBAction action, std::string const &label, bool do_draw = false);
void reset_left_buttons();
void draw_right_buttons() const;
void draw_right_slot(short which,short mode) const ;
void set_right_button(short slot, eRBAction action, int i, std::string const &label, bool do_draw = false);
void reset_right_bar_and_buttons();
protected:
void init_bar(std::shared_ptr<cScrollbar>& sbar, const std::string& name, rectangle const &rect, rectangle const &events_rect, int pgSz);
public:
std::array<lb_t,NLS> left_buttons;
std::array<rectangle[2],NLS> left_buttons_rectangles; // 0 - whole, 1 - blue button
std::vector<rb_t> right_buttons;
std::array<rectangle,NRSONPAGE> right_buttons_rectangles;
rectangle terrain_rectangle; // the terrain main rectangle
rectangle terrain_border_rects[4]; // border rects order: top, left, bottom, right
rectangle terrain_rects[256];
std::shared_ptr<cScrollbar> right_bar, palette_bar;
std::unordered_map<std::string, std::shared_ptr<iEventListener>> event_listeners;
};
extern cScenButtonsBars scen_controls;

View File

@@ -8,7 +8,6 @@ const int BITMAP_HEIGHT = 36;
const int NUM_DLOG_B = 53;
const int NLS = 26; // number of left slots for buttons
#define NRS right_button_status.size() // number of right slots for scrolling list
const int NRSONPAGE = 33; // number of right slots for scrolling list on page at 1 time
const int RIGHT_AREA_UL_X = 287;

View File

@@ -42,11 +42,7 @@ eDrawMode draw_mode = DRAW_TERRAIN;
extern bool editing_town;
extern cScenario scenario;
extern sf::Texture bg_gworld;
extern rectangle right_buttons[NRSONPAGE];
extern std::shared_ptr<cScrollbar> right_sbar, pal_sbar;
extern std::array<lb_t,NLS> left_button_status;
extern std::vector<rb_t> right_button_status;
short mini_map_scales[3] = {12, 6, 4};
extern location cur_out, mouse_spot;
extern ter_num_t current_ground;
@@ -55,18 +51,12 @@ cCustomGraphics spec_scen_g;
const sf::Color hilite_colour = {0xff, 0x00, 0x80, 0x40};
// begin new stuff
rectangle blue_button_from = {120,235,134,251};
rectangle base_small_button_from = {120,0,127,7};
extern rectangle palette_buttons[10][6];
extern ePalBtn town_buttons[6][10], out_buttons[6][10];
static rectangle palette_button_base = {0,0,18,26};
rectangle terrain_buttons_rect = {0,0,410,294};
extern rectangle left_buttons[NLS][2]; // 0 - whole, 1 - blue button
static rectangle left_button_base = {5,5,21,280};
static rectangle right_button_base = {RIGHT_AREA_UL_Y,RIGHT_AREA_UL_X,17,RIGHT_AREA_UL_Y};
rectangle terrain_rect = {0,0,340,272};
std::string current_string[2];
extern rectangle terrain_rects[256];
static short get_small_icon(ter_num_t ter){
short icon = -1;
@@ -301,7 +291,6 @@ static std::vector<short> get_small_icons(location at, ter_num_t t_to_draw) {
}
void Set_up_win() {
terrain_rect.offset(TER_RECT_UL_X, TER_RECT_UL_Y);
terrain_buttons_rect.offset(RIGHT_AREA_UL_X, RIGHT_AREA_UL_Y);
palette_button_base.offset(RIGHT_AREA_UL_X, RIGHT_AREA_UL_Y);
@@ -319,24 +308,6 @@ void Set_up_win() {
for(short i = 0; i < 10; i++)
for(short j = /*4*/0; j < 6; j++)
palette_buttons[i][j].offset(0, 3);
for(short i = 0; i < NLS; i++) {
left_buttons[i][0] = left_button_base;
left_buttons[i][0].offset(0,i * 16);
left_buttons[i][1] = left_buttons[i][0];
left_buttons[i][1].top += 1;
left_buttons[i][1].bottom -= 1;
left_buttons[i][1].left += 0;
left_buttons[i][1].right = left_buttons[i][1].left + 16;
}
right_button_base.left = RIGHT_AREA_UL_X + 1;
right_button_base.top = RIGHT_AREA_UL_Y + 1;
right_button_base.bottom = right_button_base.top + 12;
right_button_base.right = right_button_base.left + RIGHT_AREA_WIDTH - 20;
for(short i = 0; i < NRSONPAGE; i++) {
right_buttons[i] = right_button_base;
right_buttons[i].offset(0,i * 12);
}
}
void run_startup_g() {
@@ -393,12 +364,10 @@ void redraw_screen() {
}
void draw_main_screen() {
rectangle draw_rect;
draw_lb();
scen_controls.draw_left_buttons();
// draw right buttons (only when not editing terrain)
if(overall_mode >= MODE_MAIN_SCREEN) {
rectangle draw_rect;
draw_rect.left = RIGHT_AREA_UL_X;
draw_rect.top = RIGHT_AREA_UL_Y;
draw_rect.right = RIGHT_AREA_UL_X + RIGHT_AREA_WIDTH - 16;
@@ -408,85 +377,18 @@ void draw_main_screen() {
draw_rect.inset(1,1);
tileImage(mainPtr,draw_rect,bg[17]);
draw_rb();
scen_controls.draw_right_buttons();
}
// draw terrain palette
if((overall_mode < MODE_MAIN_SCREEN) || (overall_mode == MODE_EDIT_TYPES)) {
if(overall_mode < MODE_MAIN_SCREEN || overall_mode == MODE_EDIT_TYPES) {
place_location();
set_up_terrain_buttons(false);
}
}
void draw_lb() {
for(short i = 0; i < NLS; i++)
draw_lb_slot(i,0);
}
// mode 0 normal 1 click
void draw_lb_slot (short which,short mode) {
rectangle text_rect,from_rect;
tileImage(mainPtr,left_buttons[which][0],bg[20]);
if(left_button_status[which].mode == LB_CLEAR)
return;
text_rect = left_buttons[which][0];
if(left_button_status[which].action != LB_NO_ACTION) {
text_rect.left += 18;
from_rect = blue_button_from;
if(mode > 0)
from_rect.offset(0,from_rect.height());
auto const &edbuttons=*ResMgr::textures.get("edbuttons");
rect_draw_some_item(edbuttons,from_rect,mainPtr,left_buttons[which][1]);
}
if(left_button_status[which].mode == LB_INDENT)
text_rect.left += 16;
TextStyle style;
if(left_button_status[which].mode == LB_TITLE) {
style.pointSize = 14;
}
else text_rect.offset(0,2);
if(mode > 0)
style.colour = Colours::BLUE;
style.lineHeight = 12;
win_draw_string(mainPtr,text_rect,left_button_status[which].label,eTextMode::WRAP,style);
}
void draw_rb() {
long pos = right_sbar->getPosition();
for(long i = pos; i < pos + NRSONPAGE && i < NRS; i++)
draw_rb_slot(i,0);
}
// mode 0 normal 1 pressed
void draw_rb_slot (short which,short mode) {
rectangle text_rect;
long pos;
pos = right_sbar->getPosition();
if(which < pos || which >= pos + NRSONPAGE || which >= NRS)
return;
tileImage(mainPtr,right_buttons[which - pos],bg[17]);
if(right_button_status[which].action == RB_CLEAR)
return;
text_rect = right_buttons[which - pos];
TextStyle style;
if(mode > 0)
style.colour = Colours::RED;
style.lineHeight = 12;
win_draw_string(mainPtr,text_rect,right_button_status[which].label,eTextMode::WRAP,style);
}
void set_up_terrain_buttons(bool reset) {
short pic,small_i;
rectangle ter_from,ter_from_base = {0,0,36,28}, ter_plus_from = {148,235,164,251};
rectangle tiny_from,tiny_to;
rectangle palette_from,palette_to = palette_button_base;
int max;
switch(draw_mode) {
case DRAW_TERRAIN: max = scenario.ter_types.size(); break;
@@ -496,17 +398,24 @@ void set_up_terrain_buttons(bool reset) {
}
if(overall_mode == MODE_EDIT_TYPES) max++;
if(reset) pal_sbar->setPosition(0);
pal_sbar->setMaximum((max - 241) / 16);
auto &controls=scen_controls;
auto &palette_bar=scen_controls.palette_bar;
if(reset) palette_bar->setPosition(0);
palette_bar->setMaximum((max - 241) / 16);
int first = pal_sbar->getPosition() * 16;
int first = palette_bar->getPosition() * 16;
if(draw_mode == DRAW_MONST) first++, max++;
int end = min(first + 256, max);
rectangle palette_from,palette_to = palette_button_base;
short pic,small_i;
rectangle ter_from,ter_from_base = {0,0,36,28}, ter_plus_from = {148,235,164,251};
rectangle tiny_from,tiny_to;
// first make terrain buttons
auto const &editor_mixed = *ResMgr::textures.get("edbuttons");
for(short i = first; i < end; i++) {
rectangle draw_rect = terrain_rects[i - first];
rectangle draw_rect = controls.terrain_rects[i - first];
draw_rect.offset(RIGHT_AREA_UL_X, RIGHT_AREA_UL_Y);
switch(draw_mode){
case DRAW_TERRAIN: {
@@ -639,7 +548,7 @@ void set_up_terrain_buttons(bool reset) {
}
if(overall_mode < MODE_MAIN_SCREEN) {
palette_to.offset(5,terrain_rects[255].bottom + 14);
palette_to.offset(5,controls.terrain_rects[255].bottom + 14);
for(short i = 0; i < 10; i++){
for(short j = 0; j < 6; j++){
auto cur_palette_buttons = editing_town ? town_buttons : out_buttons;
@@ -669,9 +578,10 @@ void draw_terrain(){
if(overall_mode >= MODE_MAIN_SCREEN)
return;
auto const &controls=scen_controls;
if(cur_viewing_mode == 0) {
tileImage(mainPtr,terrain_rect,bg[17]);
frame_rect(mainPtr, terrain_rect, sf::Color::Black);
tileImage(mainPtr, controls.terrain_rectangle,bg[17]);
frame_rect(mainPtr, controls.terrain_rectangle, sf::Color::Black);
// limits for town: only town and for outside terrain: sector+one outside bordering
int const limits[]={editing_town ? 4 : 3, int(editing_town ? town->max_dim-1 : 48)-4};
// if the position is outside, resets it to center of the map
@@ -916,15 +826,15 @@ void draw_terrain(){
frame_rect(mainPtr, draw_rect, Colours::RED);
}
}
clip_rect(mainPtr, terrain_rect);
clip_rect(mainPtr, controls.terrain_rectangle);
//if(cur_viewing_mode == 0)
// draw_frames();
}
else {
tileImage(mainPtr, terrain_rect,bg[17]);
frame_rect(mainPtr, terrain_rect, sf::Color::Black);
tileImage(mainPtr, controls.terrain_rectangle,bg[17]);
frame_rect(mainPtr, controls.terrain_rectangle, sf::Color::Black);
// Width available: 64 4x4 tiles, 42 6x6 tiles, or 21 12x12 tiles -- 256 pixels
// Height available: 81 4x4 tiles, 54 6x6 tiles, or 27 12x12 tiles -- 324 pixels
short const size = cur_viewing_mode<=3 ? mini_map_scales[cur_viewing_mode - 1] : 12;
@@ -1191,17 +1101,18 @@ void place_location() {
frame_rect(mainPtr, terrain_buttons_rect, sf::Color::Black);
location mouse = translate_mouse_coordinates(sf::Mouse::getPosition(mainPtr));
auto &controls=scen_controls;
draw_rect = text_rect;
draw_rect.offset({5, terrain_rects[255].top + 18});
draw_rect.offset({5, controls.terrain_rects[255].top + 18});
if(overall_mode < MODE_MAIN_SCREEN) {
// std::cout << "Mouse: " << mouse << " Buttons: " << terrain_buttons_rect << " Terrain: " << terrain_rect << std::endl;
if(mouse.in(terrain_buttons_rect)) {
location rel_mouse = mouse;
rel_mouse.x -= RIGHT_AREA_UL_X;
rel_mouse.y -= RIGHT_AREA_UL_Y;
int first = scen_controls.palette_bar->getPosition() * 16;
for(int i = 0; i < 256; i++) {
if(rel_mouse.in(terrain_rects[i])) {
int first = pal_sbar->getPosition() * 16;
if(rel_mouse.in(controls.terrain_rects[i])) {
switch(draw_mode) {
case DRAW_TERRAIN:
if(first+i >= 0 && first + i < scenario.ter_types.size())
@@ -1219,7 +1130,7 @@ void place_location() {
break;
}
}
} else if(mouse.in(terrain_rect) && mouse_spot.x >= 0) {
} else if(mouse.in(controls.terrain_rectangle) && mouse_spot.x >= 0) {
if(cur_viewing_mode <= 0 || cur_viewing_mode>=4)
sout << "Under mouse: x = " << (cen_x - 4 + mouse_spot.x)
<< ", y = " << (cen_y - 4 + mouse_spot.y);
@@ -1240,21 +1151,21 @@ void place_location() {
sout.str("");
draw_rect = text_rect;
draw_rect.offset({260 ,terrain_rects[255].top + 18});
draw_rect.offset({260 ,controls.terrain_rects[255].top + 18});
sout << current_terrain_type;
win_draw_string(mainPtr, draw_rect, sout.str(), eTextMode::LEFT_TOP, style);
sout.str("");
if(overall_mode < MODE_MAIN_SCREEN) {
draw_rect = text_rect;
draw_rect.offset({5,terrain_rects[255].bottom + 121});
draw_rect.offset({5,controls.terrain_rects[255].bottom + 121});
win_draw_string(mainPtr, draw_rect, current_string[0], eTextMode::LEFT_TOP, style);
draw_rect = text_rect;
draw_rect.offset({RIGHT_AREA_WIDTH / 2,terrain_rects[255].bottom + 121});
draw_rect.offset({RIGHT_AREA_WIDTH / 2,controls.terrain_rects[255].bottom + 121});
win_draw_string(mainPtr, draw_rect, current_string[1], eTextMode::LEFT_TOP, style);
}
draw_rect.top = palette_buttons[0][0].top + terrain_rects[255].bottom + 5;
draw_rect.top = palette_buttons[0][0].top + controls.terrain_rects[255].bottom + 5;
draw_rect.left = palette_buttons[9][0].right + 10; // + 17;
draw_rect.bottom = draw_rect.top + 36;
draw_rect.right = draw_rect.left + 28;

View File

@@ -10,10 +10,6 @@ void run_startup_g();
void load_graphics();
void draw_main_screen();
void redraw_screen();
void draw_lb();
void draw_lb_slot (short which,short mode) ;
void draw_rb();
void draw_rb_slot (short which,short mode) ;
void set_up_terrain_buttons(bool reset);
void draw_terrain();
void draw_monsts();

View File

@@ -51,7 +51,6 @@ bool mouse_button_held = false,editing_town = false;
short cur_viewing_mode = 0;
short cen_x, cen_y;
eScenMode overall_mode = MODE_INTRO_SCREEN;
std::shared_ptr<cScrollbar> right_sbar, pal_sbar;
short mode_count = 0;
cOutdoors* current_terrain;
@@ -78,13 +77,10 @@ void save_prefs();
bool prefs_event_filter (cDialog& me, std::string id, eKeyMod);
cScenario scenario;
rectangle right_sbar_rect;
extern rectangle terrain_buttons_rect;
extern void set_up_apple_events(int argc, char* argv[]);
// TODO: these should be members of some global entity instead of being here
std::unordered_map<std::string, std::shared_ptr <iEventListener>> event_listeners;
cDrawableManager drawable_mgr;
//Changed to ISO C specified argument and return type.
@@ -116,34 +112,6 @@ int main(int argc, char* argv[]) {
}
}
static void init_sbar(std::shared_ptr<cScrollbar>& sbar, const std::string& name, rectangle rect, rectangle events_rect, int pgSz) {
sbar.reset(new cScrollbar(mainPtr));
sbar->setBounds(rect);
sbar->set_wheel_event_rect(events_rect);
sbar->setPageSize(pgSz);
sbar->hide();
drawable_mgr.add_drawable(UI_LAYER_DEFAULT, name, sbar);
event_listeners[name] = std::dynamic_pointer_cast<iEventListener>(sbar);
}
static void init_scrollbars() {
right_sbar_rect.top = RIGHT_AREA_UL_Y - 1;
right_sbar_rect.left = RIGHT_AREA_UL_X + RIGHT_AREA_WIDTH - 1 - 16;
right_sbar_rect.bottom = RIGHT_AREA_UL_Y + RIGHT_AREA_HEIGHT + 1;
right_sbar_rect.right = RIGHT_AREA_UL_X + RIGHT_AREA_WIDTH - 1;
rectangle pal_sbar_rect = terrain_buttons_rect;
pal_sbar_rect.offset(RIGHT_AREA_UL_X,RIGHT_AREA_UL_Y);
pal_sbar_rect.left = pal_sbar_rect.right - 16;
pal_sbar_rect.height() = 17 * 16;
rectangle const right_sbar_event_rect { 5, 287, 405, 577 };
rectangle const pal_sbar_event_rect { 5, 287, 279, 581 };
init_sbar(right_sbar, "right_sbar", right_sbar_rect, right_sbar_event_rect, NRSONPAGE - 1);
init_sbar(pal_sbar, "pal_sbar", pal_sbar_rect, pal_sbar_event_rect, 16);
}
sf::FloatRect compute_viewport(const sf::RenderWindow & mainPtr, float ui_scale) {
// See compute_viewport() in boe.graphics.cpp
@@ -220,13 +188,10 @@ void init_scened(int argc, char* argv[]) {
cen_x = 18;
cen_y = 18;
init_scrollbars();
init_lb();
init_rb();
scen_controls.init();
Set_up_win();
init_screen_locs();
load_graphics();
cDialog::init();
if(get_bool_pref("ShowStartupLogo", true))
@@ -300,7 +265,7 @@ void handle_events() {
void handle_one_event(const sf::Event& event) {
// Check if any of the event listeners want this event.
for (auto& listener : event_listeners) {
for (auto& listener : scen_controls.event_listeners) {
if(listener.second->handle_event(event)) return;
}
@@ -351,6 +316,7 @@ void handle_menu_choice(eMenu item_hit) {
std::string helpDlog;
fs::path file_to_load;
cKey editKey = {true};
auto &controls=scen_controls;
switch(item_hit) {
case eMenu::NONE: return;
case eMenu::FILE_OPEN:
@@ -394,8 +360,8 @@ void handle_menu_choice(eMenu item_hit) {
if(!save_check("save-before-close"))
break;
overall_mode = MODE_INTRO_SCREEN;
right_sbar->hide();
pal_sbar->hide();
controls.show_right_bar(false);
controls.show_palette_bar(false);
shut_down_menus(0);
set_up_start_screen();
undo_list.clear();
@@ -476,15 +442,15 @@ void handle_menu_choice(eMenu item_hit) {
change_made = true;
break;
case eMenu::SCEN_SPECIALS:
right_sbar->setPosition(0);
controls.right_bar->setPosition(0);
start_special_editing(0,0);
break;
case eMenu::SCEN_TEXT:
right_sbar->setPosition(0);
controls.right_bar->setPosition(0);
start_string_editing(STRS_SCEN,0);
break;
case eMenu::SCEN_JOURNALS:
right_sbar->setPosition(0);
controls.right_bar->setPosition(0);
start_string_editing(STRS_JOURNAL,0);
break;
case eMenu::TOWN_IMPORT:
@@ -568,7 +534,7 @@ void handle_menu_choice(eMenu item_hit) {
change_made = true;
break;
case eMenu::TOWN_AREAS:
right_sbar->setPosition(0);
controls.right_bar->setPosition(0);
start_string_editing(STRS_TOWN_RECT,0);
break;
case eMenu::TOWN_ITEMS_RANDOM:
@@ -592,15 +558,15 @@ void handle_menu_choice(eMenu item_hit) {
change_made = true;
break;
case eMenu::TOWN_SPECIALS:
right_sbar->setPosition(0);
controls.right_bar->setPosition(0);
start_special_editing(2,0);
break;
case eMenu::TOWN_TEXT:
right_sbar->setPosition(0);
controls.right_bar->setPosition(0);
start_string_editing(STRS_TOWN,0);
break;
case eMenu::TOWN_SIGNS:
right_sbar->setPosition(0);
controls.right_bar->setPosition(0);
start_string_editing(STRS_TOWN_SIGN,0);
break;
case eMenu::TOWN_ADVANCED:
@@ -624,7 +590,7 @@ void handle_menu_choice(eMenu item_hit) {
change_made = true;
break;
case eMenu::OUT_AREAS:
right_sbar->setPosition(0);
controls.right_bar->setPosition(0);
start_string_editing(STRS_OUT_RECT,0);
break;
case eMenu::OUT_START:
@@ -632,15 +598,15 @@ void handle_menu_choice(eMenu item_hit) {
set_string("Select party starting location.","");
break;
case eMenu::OUT_SPECIALS:
right_sbar->setPosition(0);
controls.right_bar->setPosition(0);
start_special_editing(1,0);
break;
case eMenu::OUT_TEXT:
right_sbar->setPosition(0);
controls.right_bar->setPosition(0);
start_string_editing(STRS_OUT,0);
break;
case eMenu::OUT_SIGNS:
right_sbar->setPosition(0);
controls.right_bar->setPosition(0);
start_string_editing(STRS_OUT_SIGN,0);
break;
case eMenu::ABOUT: