ScenEditor: create a class to store some static buttons and scrollbars
+ begin to use it, to be continued...
This commit is contained in:
File diff suppressed because it is too large
Load Diff
@@ -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();
|
||||
|
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
@@ -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;
|
||||
|
@@ -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;
|
||||
|
@@ -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;
|
||||
|
@@ -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();
|
||||
|
@@ -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:
|
||||
|
Reference in New Issue
Block a user