Rework parentage and naming of dialog controls.

All controls now store a reference to their direct parent,
whether it be the dialog itself or a container control.

Every dialog control now has a guaranteed parent, which abstracts away
the three possible types of parents (dialog, container, and plain window).

The control name is now stored in the control from the moment it is parsed from the XML.
This means that it's set before the parseContent function, though after parseAttribute.
This commit is contained in:
2025-03-01 00:15:32 -05:00
committed by Celtic Minstrel
parent 5861268e8c
commit 9b05c23d15
30 changed files with 351 additions and 323 deletions

View File

@@ -199,7 +199,7 @@ void cDialog::loadFromFile(const DialogDefn& file){
// In this situation, it's actually easier that way; the reason being, the
// map key is obtained from the name attribute of each element.
if(type == "field") {
auto field = parse<cTextField>(*node);
auto field = parse<cTextField>(*node, *this);
inserted = controls.insert(field).first;
tabOrder.push_back(field);
if(field.second->tabOrder > 0)
@@ -207,29 +207,29 @@ void cDialog::loadFromFile(const DialogDefn& file){
else if(field.second->tabOrder < 0)
reverseTabs.push_back(field.second->tabOrder);
} else if(type == "text")
inserted = controls.insert(parse<cTextMsg>(*node)).first;
inserted = controls.insert(parse<cTextMsg>(*node, *this)).first;
else if(type == "pict")
inserted = controls.insert(parse<cPict>(*node)).first;
inserted = controls.insert(parse<cPict>(*node, *this)).first;
else if(type == "slider")
inserted = controls.insert(parse<cScrollbar>(*node)).first;
inserted = controls.insert(parse<cScrollbar>(*node, *this)).first;
else if(type == "button")
inserted = controls.insert(parse<cButton>(*node)).first;
inserted = controls.insert(parse<cButton>(*node, *this)).first;
else if(type == "led")
inserted = controls.insert(parse<cLed>(*node)).first;
inserted = controls.insert(parse<cLed>(*node, *this)).first;
else if(type == "group")
inserted = controls.insert(parse<cLedGroup>(*node)).first;
inserted = controls.insert(parse<cLedGroup>(*node, *this)).first;
else if(type == "stack") {
auto parsed = parse<cStack>(*node);
auto parsed = parse<cStack>(*node, *this);
inserted = controls.insert(parsed).first;
// Now, if it contains any fields, their tab order must be accounted for
parsed.second->fillTabOrder(specificTabs, reverseTabs);
} else if(type == "pane") {
auto parsed = parse<cScrollPane>(*node);
auto parsed = parse<cScrollPane>(*node, *this);
inserted = controls.insert(parsed).first;
// TODO: Now, if it contains any fields, their tab order must be accounted for
//parsed.second->fillTabOrder(specificTabs, reverseTabs);
} else if(type == "tilemap") {
auto parsed = parse<cTilemap>(*node);
auto parsed = parse<cTilemap>(*node, *this);
inserted = controls.insert(parsed).first;
parsed.second->fillTabOrder(specificTabs, reverseTabs);
} else throw xBadNode(type,node->Row(),node->Column(),fname);
@@ -243,7 +243,6 @@ void cDialog::loadFromFile(const DialogDefn& file){
}
}
prevCtrl = *inserted;
prevCtrl.second->setName(prevCtrl.first);
// Needed to correctly resolve relative positioning
inserted->second->recalcRect();
}
@@ -1191,3 +1190,7 @@ void preview_dialog_xml(fs::path dialog_xml) {
showError(x);
}
}
sf::Color cParentless::getDefTextClr() const {
return cDialog::defaultBackground == cDialog::BG_DARK ? sf::Color::White : sf::Color::Black;
}

View File

@@ -55,7 +55,7 @@ protected:
};
/// Defines a fancy dialog box with various controls.
class cDialog {
class cDialog : public iComponent, public iNameGiver {
friend class cDialogIterator;
typedef std::map<std::string,cControl*>::iterator ctrlIter;
std::map<std::string,cControl*> controls;
@@ -67,7 +67,7 @@ class cDialog {
std::string currentFocus;
cDialog* parent;
cControl* findControl(std::string id);
std::string generateId(const std::string& explicitId) const;
std::string generateId(const std::string& explicitId) const override;
void loadFromFile(const DialogDefn& file);
void handleTab(bool reverse);
template<typename Iter> void handleTabOrder(std::string& itemHit, Iter begin, Iter end);
@@ -160,7 +160,9 @@ public:
void setDefTextClr(sf::Color clr);
/// Get the default text colour applied to new dialogs when loading from a file.
/// @return The text colour.
sf::Color getDefTextClr() const;
sf::Color getDefTextClr() const override;
/// Get the window the dialog occupies;
sf::RenderWindow& getWindow() override { return win; }
/// Set the focused text field.
/// @param newFocus A pointer to the text field to receive focus.
/// @param force If true, the change will be forced.
@@ -240,21 +242,16 @@ public:
/// Adds a new control described by the passed XML element.
/// @tparam Ctrl The type of control to add.
/// @param who The XML element describing the control.
/// @param parent The parent control, if any. Omit if there is no parent.
/// @param parent The parent control or dialog.
/// @note It is up to the caller to ensure that that the element
/// passed describes the type of control being requested.
template<class Ctrl, class Container> std::pair<std::string,Ctrl*> parse(ticpp::Element& who, Container* parent) {
template<class Ctrl> std::pair<std::string,Ctrl*> parse(ticpp::Element& who, iComponent& parent) {
std::pair<std::string,Ctrl*> p;
p.second = new Ctrl(*this);
p.first = p.second->parse(who, fname);
do{
p.first = parent->generateId(p.first);
}while(controls.find(p.first) != controls.end());
p.second = new Ctrl(parent);
p.second->parse(who, fname);
p.first = p.second->getName();
return p;
}
template<class Ctrl> std::pair<std::string,Ctrl*> parse(ticpp::Element& who) {
return parse<Ctrl, cDialog>(who, this);
}
cDialogIterator begin() {
return cDialogIterator(this);
}

View File

@@ -68,4 +68,23 @@ template<> struct event_fcn<EVT_SCROLL> {
using type = std::function<bool(cDialog&, std::string, int)>;
};
struct iNameGiver {
virtual std::string generateId(const std::string& base) const = 0;
virtual ~iNameGiver() {}
};
struct iComponent {
virtual sf::RenderWindow& getWindow() = 0;
virtual sf::Color getDefTextClr() const = 0;
virtual ~iComponent() {}
};
class cParentless : public iComponent {
sf::RenderWindow* win;
public:
cParentless(sf::RenderWindow& win) : win(&win) {}
sf::RenderWindow& getWindow() override { return *win; }
sf::Color getDefTextClr() const override; // Defined in dialog.cpp
};
#endif

View File

@@ -18,16 +18,7 @@
extern sf::Texture bg_gworld;
cButton::cButton(sf::RenderWindow& parent) :
cControl(CTRL_BTN,parent),
wrapLabel(false),
type(BTN_REG),
textSize(defaultTextSize(type)),
textClr(sf::Color::Black),
fromList("none") {
}
cButton::cButton(cDialog& parent) :
cButton::cButton(iComponent& parent) :
cControl(CTRL_BTN,parent),
wrapLabel(false),
type(BTN_REG),
@@ -37,7 +28,7 @@ cButton::cButton(cDialog& parent) :
}
/* This constructor is only called for LEDs. */
cButton::cButton(cDialog& parent,eControlType t) :
cButton::cButton(iComponent& parent,eControlType t) :
cControl(t,parent),
fromList("none"),
wrapLabel(false) {
@@ -66,7 +57,7 @@ const int TINY_TEXT_OFFSET = 18;
void cButton::draw(){
rectangle from_rect, to_rect;
inWindow->setActive(false);
getWindow().setActive(false);
if(visible){
TextStyle style;
@@ -77,7 +68,7 @@ void cButton::draw(){
to_rect.right = to_rect.left + 14;
to_rect.bottom = to_rect.top + 10;
}
rect_draw_some_item(*ResMgr::graphics.get(buttons[btnGW[type]]),from_rect,*inWindow,to_rect,sf::BlendAlpha);
rect_draw_some_item(*ResMgr::graphics.get(buttons[btnGW[type]]),from_rect,getWindow(),to_rect,sf::BlendAlpha);
style.colour = sf::Color::Black;
style.lineHeight = 8;
eTextMode textMode = eTextMode::CENTRE;
@@ -102,13 +93,13 @@ void cButton::draw(){
to_rect.offset(0, (-style.pointSize/2) * (forced_lines.size() - 1));
}
for(std::string line : forced_lines){
win_draw_string(*inWindow,to_rect,line,textMode,style);
win_draw_string(getWindow(),to_rect,line,textMode,style);
to_rect.offset(0, style.pointSize);
}
// frame default button, to provide a visual cue that it's the default
if(key.spec && key.k == key_enter) drawFrame(2,frameStyle);
}
inWindow->setActive();
getWindow().setActive();
}
bool cButton::manageFormat(eFormat prop, bool set, boost::any* val) {
@@ -195,7 +186,7 @@ void cButton::validatePostParse(ticpp::Element& elem, std::string fname, const s
initPreset();
if(labelledButtons.count(type)) {
if(!attrs.count("color") && !attrs.count("colour") && parent->getBg() == cDialog::BG_DARK)
if(!attrs.count("color") && !attrs.count("colour") && getDialog()->getBg() == cDialog::BG_DARK)
setColour(sf::Color::White);
}
}

View File

@@ -49,11 +49,8 @@ public:
/// @return The button type.
eBtnType getBtnType() const;
/// Create a new button.
/// @param parent The parent dialog.
explicit cButton(cDialog& parent);
/// Create a button outside of a dialog
/// @param parent The parent window
explicit cButton(sf::RenderWindow& parent);
/// @param parent The parent.
explicit cButton(iComponent& parent);
bool isClickable() const override;
bool isFocusable() const override;
bool isScrollable() const override;
@@ -73,7 +70,7 @@ protected:
/// Construct a new button.
/// @param parent The parent dialog.
/// @param t The type of control. Should be either CTRL_LED or CTRL_BTN.
cButton(cDialog& parent,eControlType t);
cButton(iComponent& parent,eControlType t);
private:
bool manageFormat(eFormat prop, bool set, boost::any* val) override;
static short defaultTextSize(eBtnType type);

View File

@@ -16,36 +16,40 @@
#include "dialogxml/widgets/scrollbar.hpp"
#include "replay.hpp"
std::string cContainer::generateId(const std::string& explicitId) const {
return explicitId.empty() ? generateRandomString() : explicitId;
}
bool cContainer::parseChildControl(ticpp::Element& elem, std::map<std::string,cControl*>& controls, std::string& id, std::string fname) {
ctrlIter inserted;
std::string tag = elem.Value();
if(tag == "field") {
auto field = parent->parse<cTextField>(elem, this);
auto field = getDialog()->parse<cTextField>(elem, *this);
inserted = controls.insert(field).first;
parent->tabOrder.push_back(field);
getDialog()->tabOrder.push_back(field);
id = field.first;
} else if(tag == "text") {
auto text = parent->parse<cTextMsg>(elem, this);
auto text = getDialog()->parse<cTextMsg>(elem, *this);
inserted = controls.insert(text).first;
id = text.first;
} else if(tag == "pict") {
auto pict = parent->parse<cPict>(elem, this);
auto pict = getDialog()->parse<cPict>(elem, *this);
inserted = controls.insert(pict).first;
id = pict.first;
} else if(tag == "slider") {
auto slide = parent->parse<cScrollbar>(elem, this);
auto slide = getDialog()->parse<cScrollbar>(elem, *this);
inserted = controls.insert(slide).first;
id = slide.first;
} else if(tag == "button") {
auto button = parent->parse<cButton>(elem, this);
auto button = getDialog()->parse<cButton>(elem, *this);
inserted = controls.insert(button).first;
id = button.first;
} else if(tag == "led") {
auto led = parent->parse<cLed>(elem, this);
auto led = getDialog()->parse<cLed>(elem, *this);
inserted = controls.insert(led).first;
id = led.first;
} else if(tag == "group") {
auto group = parent->parse<cLedGroup>(elem, this);
auto group = getDialog()->parse<cLedGroup>(elem, *this);
inserted = controls.insert(group).first;
id = group.first;
} else return false;
@@ -59,7 +63,6 @@ bool cContainer::parseChildControl(ticpp::Element& elem, std::map<std::string,cC
}
}
prevCtrl = *inserted;
prevCtrl.second->setName(prevCtrl.first);
return true;
}

View File

@@ -14,7 +14,7 @@
typedef std::map<std::string,cControl*>::iterator ctrlIter;
/// A superclass to represent a control that contains other controls.
class cContainer : public cControl {
class cContainer : public cControl, public iNameGiver {
void callHandler(event_fcn<EVT_CLICK>::type onClick, cDialog& me, std::string id, eKeyMod mods) override;
protected:
std::string clicking;
@@ -25,14 +25,10 @@ protected:
/// @return true if the element was a valid control, false otherwise.
bool parseChildControl(ticpp::Element& elem, std::map<std::string,cControl*>& controls, std::string& id, std::string fname);
public:
/// Create a new container control attached to an arbitrary window, rather than a dialog.
/// Create a new container control.
/// @param t The type of the control.
/// @param p The parent window.
cContainer(eControlType t, sf::RenderWindow& p) : cControl(t, p) {}
/// Create a new container control attached to a dialog.
/// @param t The type of the control.
/// @param p The parent dialog.
cContainer(eControlType t, cDialog& p) : cControl(t, p) {}
/// @param p The parent.
cContainer(eControlType t, iComponent& p) : cControl(t, p) {}
/// Check if a control exists with a given ID.
/// @param id The unique key of the control.
/// @return true if it exists.
@@ -46,6 +42,10 @@ public:
/// @param callback A function taking a string as its first argument
/// and a control reference as its second argument.
virtual void forEach(std::function<void(std::string,cControl&)> callback) = 0;
/// Generate a unique ID for a child control. The explicitId is the ID specified in the XML, if any.
/// This may be called more than once, so it should not return the same value twice in a row,
/// unless it can guarantee the value is not already assigned to another control.
virtual std::string generateId(const std::string& explicitId) const override;
/// @copydoc getChild()
cControl& operator[](std::string id) {return getChild(id);}
const cControl& operator[](std::string id) const {return const_cast<cContainer&>(*this).getChild(id);}

View File

@@ -8,6 +8,7 @@
#include "control.hpp"
#include "dialogxml/dialogs/dialog.hpp"
#include "dialogxml/widgets/container.hpp"
#include "sounds.hpp"
#include "button.hpp"
#include "led.hpp"
@@ -25,10 +26,6 @@
extern void launchURL(std::string url);
std::mt19937 cControl::ui_rand;
std::string cControl::generateId(const std::string& explicitId) const {
return explicitId.empty() ? generateRandomString() : explicitId;
}
std::string cControl::generateRandomString() {
// Not bothering to seed, because it doesn't actually matter if it's truly random.
int n_chars = ui_rand() % 100;
@@ -141,8 +138,29 @@ void cControl::hide(){
if(labelCtrl) labelCtrl->hide();
}
cDialog* cControl::getDialog() const {
if(auto container = dynamic_cast<cContainer*>(parent)) {
return container->getDialog();
} else if(auto dlog = dynamic_cast<cDialog*>(parent)) {
return dlog;
}
return nullptr;
}
sf::RenderWindow& cControl::getWindow() {
return parent->getWindow();
}
iComponent& cControl::getParent() const {
return *parent;
}
sf::Color cControl::getDefTextClr() const {
return parent ? parent->getDefTextClr() : sf::Color::Black;
}
bool cControl::isVisible() const {
if(!parent || parent->dialogNotToast)
if(!getDialog() || getDialog()->dialogNotToast)
return visible;
else return false;
}
@@ -228,7 +246,7 @@ bool cControl::manageFormat(eFormat, bool, boost::any*) {
void cControl::redraw() {
// If there's no parent dialog, we're not responsible for redrawing
if(parent) parent->draw();
if(getDialog()) getDialog()->draw();
}
void cControl::playClickSound(){
@@ -244,21 +262,21 @@ void cControl::playClickSound(){
bool cControl::handleClick(location, cFramerateLimiter& fps_limiter){
sf::Event e;
bool done = false, clicked = false;
inWindow->setActive();
getWindow().setActive();
depressed = true;
while(!done){
redraw();
while(pollEvent(inWindow, e)){
while(pollEvent(getWindow(), e)){
if(e.type == sf::Event::MouseButtonReleased){
done = true;
location clickPos(e.mouseButton.x, e.mouseButton.y);
clickPos = inWindow->mapPixelToCoords(clickPos);
clickPos = getWindow().mapPixelToCoords(clickPos);
clicked = frame.contains(clickPos);
depressed = false;
} else if(e.type == sf::Event::MouseMoved){
restore_cursor();
location toPos(e.mouseMove.x, e.mouseMove.y);
toPos = inWindow->mapPixelToCoords(toPos);
toPos = getWindow().mapPixelToCoords(toPos);
depressed = frame.contains(toPos);
}
}
@@ -335,10 +353,13 @@ void cControl::detachKey(){
this->key.c = 0;
}
cControl::cControl(eControlType t, cDialog& p) : parent(&p), inWindow(&p.win), type(t), visible(true), key({false, 0, mod_none}), frameStyle(FRM_INSET) {}
cControl::cControl(eControlType t, sf::RenderWindow& p) : parent(nullptr), inWindow(&p), type(t), visible(true), key({false, 0, mod_none}), frameStyle(FRM_INSET) {}
cControl::cControl(eControlType t, iComponent& p)
: parent(&p)
, type(t)
, visible(true)
, key({false, 0, mod_none})
, frameStyle(FRM_INSET)
{}
void cControl::attachClickHandler(std::function<bool(cDialog&,std::string,eKeyMod)> f) {
if(!f) {
@@ -390,7 +411,7 @@ void cControl::drawFrame(short amt, eFrameStyle frameStyle){
static sf::Color lt_gray = {224,224,224},dk_gray = {48,48,48};
rectangle rect = frame, ul_rect;
inWindow->setActive();
getWindow().setActive();
rect.inset(-amt,-amt);
ul_rect = rect;
@@ -403,20 +424,20 @@ void cControl::drawFrame(short amt, eFrameStyle frameStyle){
ul_rect.left += 1;
}
frame_rect(*inWindow, rect, dk_gray);
frame_rect(getWindow(), rect, dk_gray);
if(frameStyle == FRM_OUTSET || frameStyle == FRM_INSET) {
clip_rect(*inWindow, ul_rect);
frame_rect(*inWindow, rect, lt_gray);
undo_clip(*inWindow);
clip_rect(getWindow(), ul_rect);
frame_rect(getWindow(), rect, lt_gray);
undo_clip(getWindow());
} else if(frameStyle == FRM_DOUBLE) {
rect.inset(-amt, -amt);
frame_rect(*inWindow, rect, dk_gray);
frame_rect(getWindow(), rect, dk_gray);
}
}
std::string cControl::parse(ticpp::Element& who, std::string fname) {
void cControl::parse(ticpp::Element& who, std::string fname) {
using namespace ticpp;
std::string tagName, id;
std::string tagName;
who.GetValue(&tagName);
Iterator<Attribute> attr;
Iterator<Node> node;
@@ -427,7 +448,7 @@ std::string cControl::parse(ticpp::Element& who, std::string fname) {
for(attr = attr.begin(&who); attr != attr.end(); attr++){
std::string attrName = attr->Name();
foundAttrs.insert(attrName);
if(attrName == "name") attr->GetValue(&id);
if(attrName == "name") attr->GetValue(&name);
else if(attrName == "top") attr->GetValue(&frame.top);
else if(attrName == "left") attr->GetValue(&frame.left);
else if(attrName == "width") attr->GetValue(&width);
@@ -435,6 +456,9 @@ std::string cControl::parse(ticpp::Element& who, std::string fname) {
else if(!parseAttribute(*attr, tagName, fname))
throw xBadAttr(tagName, attrName, attr->Row(), attr->Column(), fname);
}
if(auto namer = dynamic_cast<iNameGiver*>(&getParent())) {
name = namer->generateId(name);
}
std::string text;
for(node = node.begin(&who); node != node.end(); node++){
int type = node->Type();
@@ -463,8 +487,6 @@ std::string cControl::parse(ticpp::Element& who, std::string fname) {
return false;
});
}
return id;
}
bool cControl::parseAttribute(ticpp::Attribute& attr, std::string tagName, std::string fname) {
@@ -575,9 +597,9 @@ bool cControl::parseAttribute(ticpp::Attribute& attr, std::string tagName, std::
std::string val = attr.Value();
if(val == "link") {
// TODO: Would be nice if it could work for other backgrounds too...
if(parent->getBg() == cDialog::BG_DARK)
if(getDialog()->getBg() == cDialog::BG_DARK)
setColour({0x7f, 0xd7, 0xFF});
if(parent->getBg() == cDialog::BG_LIGHT)
if(getDialog()->getBg() == cDialog::BG_LIGHT)
setColour({0x00, 0x00, 0xFF});
is_link = true;

View File

@@ -26,6 +26,8 @@
#include "location.hpp"
class cContainer;
// TinyXML forward declarations
namespace ticpp {
class Attribute;
@@ -106,9 +108,9 @@ public:
/// triggerClickHandler() if a click occurs, either because handleClick() returns true or because
/// a keyboard event is received that should trigger the control.
///
/// All control subclasses must have a constructor that takes a single cDialog& parameter,
/// All control subclasses must have a constructor that takes a single iComponent* parameter,
/// in order for the parsing template to work.
class cControl {
class cControl : public iComponent {
public:
using storage_t = std::map<std::string, boost::any>;
static const char KEY_PLACEHOLDER = '\a';
@@ -117,9 +119,8 @@ protected:
/// Most controls probably don't need to override this. Override parseAttribute() and parseContent() instead.
/// @param who A reference to the XML element being parsed.
/// @param fname The file being parsed, for error messages.
/// @return The unique ID of the widget.
/// @throw xBadNode if an unsupported sub-element is detected, or if text is found in an element that does not support it
virtual std::string parse(ticpp::Element& who, std::string fname);
virtual void parse(ticpp::Element& who, std::string fname);
/// Parses an attribute on the XML element representing this control.
/// All controls should defer to cControl::parseAttribute if they don't recognize the attribute.
/// @param attr A reference to the XML attribute being parsed.
@@ -350,20 +351,20 @@ public:
/// Restore the control to a previous state.
/// @param to A state previously returned from store()
virtual void restore(storage_t to);
/// Create a new control attached to an arbitrary window, rather than a dialog.
/// Create a new control.
/// @param t The type of the control.
/// @param p The parent window.
cControl(eControlType t, sf::RenderWindow& p);
/// Create a new control attached to a dialog.
/// @param t The type of the control.
/// @param p The parent dialog.
cControl(eControlType t, cDialog& p);
/// @param p The parent dialog, container control, or window.
cControl(eControlType t, iComponent& parent);
virtual ~cControl();
/// Draw the control into its parent window.
virtual void draw() = 0;
cControl& operator=(cControl& other) = delete;
cControl(cControl& other) = delete;
protected:
/// Create a new control attached to a dialog.
/// @param t The type of the control.
/// @param p The parent container.
cControl(eControlType t, iComponent* p);
/// If the control automatically determines its rect based on certain criteria, override this.
/// It will automatically be called during parsing.
/// When overridden, it should normally be public.
@@ -436,12 +437,17 @@ protected:
static std::string dlogStringFilter(std::string toFilter);
/// The parent dialog of the control.
/// May be null, if the control was created via cControl(eControlType,sf::RenderWindow&).
cDialog* parent;
cDialog* getDialog() const;
/// The direct parent of this control.
iComponent& getParent() const;
/// This control's labelling control.
cControl* labelCtrl = nullptr;
/// The parent window of the control.
/// This is for use in implementing draw().
sf::RenderWindow* inWindow;
sf::RenderWindow& getWindow() override;
/// Get the default text colour applied to new dialogs when loading from a file.
/// @return The text colour.
sf::Color getDefTextClr() const override;
/// Whether the control is visible
bool visible, depressed = false; ///< Whether the control is depressed; only applicable for clickable controls
/// The control's bounding rect.
@@ -463,10 +469,6 @@ protected:
void redraw();
/// Plays the proper sound for this control being clicked on
void playClickSound();
/// Generate a unique ID for a control. The explicitId is the ID specified in the XML, if any.
/// This may be called more than once, so it should not return the same value twice in a row,
/// unless it can guarantee the value is not already assigned to another control.
virtual std::string generateId(const std::string& explicitId) const;
static std::string generateRandomString();
private:
friend class cDialog; // This is so it can access parseColour and anchor
@@ -475,6 +477,7 @@ private:
std::string lbl;
eControlType type;
std::map<eDlogEvt, boost::any> event_handlers;
iComponent* parent;
// Transient values only used during parsing
ePosition horz = POS_ABS, vert = POS_ABS;
std::string anchor;

View File

@@ -41,7 +41,7 @@ bool cTextField::callHandler(event_fcn<EVT_DEFOCUS>::type onFocus, cDialog& me,
{FLD_UINT, "a non-negative integer"},
{FLD_REAL, "a number"},
};
showError("You need to enter " + typeNames.at(field_type) + "!","",parent);
showError("You need to enter " + typeNames.at(field_type) + "!","",getDialog());
return false;
}
}
@@ -140,7 +140,7 @@ void cTextField::replay_selection(ticpp::Element& next_action) {
}
bool cTextField::handleClick(location clickLoc, cFramerateLimiter& fps_limiter) {
if(!haveFocus && parent && !parent->setFocus(this)) return true;
if(!haveFocus && getDialog() && !getDialog()->setFocus(this)) return true;
haveFocus = true;
redraw(); // This ensures the snippets array is populated.
std::string contents = getText();
@@ -163,13 +163,13 @@ bool cTextField::handleClick(location clickLoc, cFramerateLimiter& fps_limiter)
int initial_ip = insertionPoint, initial_sp = selectionPoint;
while(!done) {
redraw();
while(pollEvent(inWindow, e)){
while(pollEvent(getWindow(), e)){
if(e.type == sf::Event::MouseButtonReleased){
done = true;
} else if(e.type == sf::Event::MouseMoved){
restore_cursor();
location newLoc(e.mouseMove.x, e.mouseMove.y);
newLoc = inWindow->mapPixelToCoords(newLoc);
newLoc = getWindow().mapPixelToCoords(newLoc);
set_ip(newLoc, &cTextField::selectionPoint);
if(is_double) {
if(selectionPoint > initial_ip) {
@@ -228,7 +228,7 @@ bool cTextField::hasFocus() const {
return haveFocus;
}
cTextField::cTextField(cDialog& parent) :
cTextField::cTextField(iComponent& parent) :
cControl(CTRL_FIELD,parent),
color(sf::Color::Black),
insertionPoint(-1),
@@ -241,11 +241,11 @@ cTextField::~cTextField(){}
void cTextField::draw(){
if(!visible) return;
static const sf::Color hiliteClr = {127,127,127}, ipClr = {92, 92, 92};
inWindow->setActive();
getWindow().setActive();
rectangle outline = frame;
outline.inset(-2,-2);
fill_rect(*inWindow, outline, sf::Color::White);
frame_rect(*inWindow, outline, sf::Color::Black);
fill_rect(getWindow(), outline, sf::Color::White);
frame_rect(getWindow(), outline, sf::Color::Black);
std::string contents = getText();
TextStyle style;
style.font = FONT_PLAIN;
@@ -259,13 +259,13 @@ void cTextField::draw(){
text_rect = frame;
text_rect.inset(2,2);
// Determine which line the insertion and selection points are on
clip_rect(*inWindow, {0,0,0,0}); // To prevent drawing
clip_rect(getWindow(), {0,0,0,0}); // To prevent drawing
hilite_t tmp_hilite = hilite;
// Manipulate this to ensure that there is a hilited area
std::string dummy_str = contents + " ";
if(tmp_hilite.first >= tmp_hilite.second)
tmp_hilite.second = tmp_hilite.first + 1;
std::vector<rectangle> rects = draw_string_hilite(*inWindow, text_rect, dummy_str, style, {tmp_hilite}, {0,0,0});
std::vector<rectangle> rects = draw_string_hilite(getWindow(), text_rect, dummy_str, style, {tmp_hilite}, {0,0,0});
if(!rects.empty()) {
// We only care about the first and last rects. Furthermore, we only really need one point
location ip_pos = rects[0].centre(), sp_pos = rects[rects.size() - 1].centre();
@@ -285,13 +285,13 @@ void cTextField::draw(){
sp_pos.y += shift;
}
}
undo_clip(*inWindow);
undo_clip(getWindow());
changeMade = false;
}
clip_rect(*inWindow, frame);
clip_rect(getWindow(), frame);
ip_col = ip_row = -1;
if(haveFocus) {
snippets = draw_string_sel(*inWindow, text_rect, contents, style, {hilite}, hiliteClr);
snippets = draw_string_sel(getWindow(), text_rect, contents, style, {hilite}, hiliteClr);
int iSnippet = -1, sum = 0;
ip_offset = insertionPoint;
for(size_t i = 0; i < snippets.size(); i++) {
@@ -311,7 +311,7 @@ void cTextField::draw(){
if(iSnippet >= 0)
ipRect.offset(snippets[iSnippet].at.x + ip_offset, snippets[iSnippet].at.y + 1);
else ipRect.offset(frame.topLeft()), ipRect.offset(3,2);
fill_rect(*inWindow, ipRect, ipClr);
fill_rect(getWindow(), ipRect, ipClr);
} else if(ip_timer.getElapsedTime().asMilliseconds() > 1000) {
// printf("Blink off (%d); ", ip_timer.getElapsedTime().asMilliseconds());
ip_timer.restart();
@@ -322,9 +322,9 @@ void cTextField::draw(){
} else {
rectangle text_rect = frame;
text_rect.inset(2,2);
win_draw_string(*inWindow, text_rect, contents, eTextMode::WRAP, style);
win_draw_string(getWindow(), text_rect, contents, eTextMode::WRAP, style);
}
undo_clip(*inWindow);
undo_clip(getWindow());
}
static cKey divineFunction(cKey key) {

View File

@@ -53,8 +53,8 @@ public:
/// @param newType The new input type.
void setInputType(eFldType newType);
/// Create a new editable text field.
/// @param parent The parent dialog.
explicit cTextField(cDialog& parent);
/// @param parent The parent.
explicit cTextField(iComponent& parent);
bool isClickable() const override;
bool isFocusable() const override;
bool isScrollable() const override;

View File

@@ -25,10 +25,11 @@ void cLed::init(){
}
}
cLed::cLed(cDialog& parent) :
cButton(parent,CTRL_LED),
state(led_off),
textFont(FONT_BOLD) {
cLed::cLed(iComponent& parent)
: cButton(parent,CTRL_LED)
, state(led_off)
, textFont(FONT_BOLD)
{
textSize = 10;
type = BTN_LED;
using namespace std::placeholders;
@@ -91,7 +92,7 @@ const int LED_TEXT_SPACE = 4; // Possibly could be 6
void cLed::draw(){
rectangle from_rect, to_rect;
inWindow->setActive(false);
getWindow().setActive(false);
if(visible){
TextStyle style;
@@ -105,23 +106,23 @@ void cLed::draw(){
if(textOnRight){
to_rect.right = to_rect.left + from_rect.width();
to_rect.bottom = to_rect.top + from_rect.height();
rect_draw_some_item(*ResMgr::graphics.get(buttons[btnGW[BTN_LED]]),from_rect,*inWindow,to_rect);
rect_draw_some_item(*ResMgr::graphics.get(buttons[btnGW[BTN_LED]]),from_rect,getWindow(),to_rect);
}else{
to_rect.right = text_width;
win_draw_string(*inWindow,to_rect,getText(),wrapLabel ? eTextMode::WRAP : eTextMode::LEFT_TOP,style);
win_draw_string(getWindow(),to_rect,getText(),wrapLabel ? eTextMode::WRAP : eTextMode::LEFT_TOP,style);
}
if(textOnRight){
to_rect.left = frame.left + from_rect.width() + LED_TEXT_SPACE;
to_rect.right = frame.right;
win_draw_string(*inWindow,to_rect,getText(),wrapLabel ? eTextMode::WRAP : eTextMode::LEFT_TOP,style);
win_draw_string(getWindow(),to_rect,getText(),wrapLabel ? eTextMode::WRAP : eTextMode::LEFT_TOP,style);
}else{
to_rect.left = frame.left + text_width + LED_TEXT_SPACE;
to_rect.right = to_rect.left + from_rect.width();
rect_draw_some_item(*ResMgr::graphics.get(buttons[btnGW[BTN_LED]]),from_rect,*inWindow,to_rect);
rect_draw_some_item(*ResMgr::graphics.get(buttons[btnGW[BTN_LED]]),from_rect,getWindow(),to_rect);
}
}
inWindow->setActive();
getWindow().setActive();
}
cControl::storage_t cLed::store() const {

View File

@@ -36,8 +36,8 @@ public:
storage_t store() const override;
void restore(storage_t to) override;
/// Create a new LED button.
/// @param parent The parent dialog.
explicit cLed(cDialog& parent);
/// @param parent The parent.
explicit cLed(iComponent& parent);
virtual ~cLed();
/// Set the LED's current state,.
/// @param to The new state.

View File

@@ -15,9 +15,10 @@
#include "replay.hpp"
cLedGroup::cLedGroup(cDialog& parent) :
cContainer(CTRL_GROUP,parent),
fromList("none") {}
cLedGroup::cLedGroup(iComponent& parent)
: cContainer(CTRL_GROUP,parent)
, fromList("none")
{}
cLedGroup::~cLedGroup(){
ledIter iter = choices.begin();
@@ -166,7 +167,7 @@ void cLedGroup::setSelected(std::string id){
if(curSelect == "") return;
eLedState was = choices[curSelect]->getState();
choices[curSelect]->setState(led_off);
if(choices[curSelect]->triggerFocusHandler(*parent,curSelect,true))
if(choices[curSelect]->triggerFocusHandler(*getDialog(),curSelect,true))
curSelect = "";
else
choices[curSelect]->setState(was);
@@ -177,7 +178,7 @@ void cLedGroup::setSelected(std::string id){
if(iter == choices.end()) throw std::invalid_argument(id + " does not exist in the ledgroup.");
if(curSelect == ""){
if(iter->second->triggerFocusHandler(*parent,curSelect,false)){
if(iter->second->triggerFocusHandler(*getDialog(),curSelect,false)){
iter->second->setState(led_red);
curSelect = iter->first;
}
@@ -187,12 +188,12 @@ void cLedGroup::setSelected(std::string id){
b = iter->second->getState();
choices[curSelect]->setState(led_off);
iter->second->setState(led_red);
if(!choices[curSelect]->triggerFocusHandler(*parent,curSelect,true)){
if(!choices[curSelect]->triggerFocusHandler(*getDialog(),curSelect,true)){
choices[curSelect]->setState(a);
iter->second->setState(b);
return;
}
if(!iter->second->triggerFocusHandler(*parent,curSelect,false)){
if(!iter->second->triggerFocusHandler(*getDialog(),curSelect,false)){
choices[curSelect]->setState(a);
iter->second->setState(b);
return;
@@ -241,7 +242,7 @@ bool cLedGroup::parseContent(ticpp::Node& content, int n, std::string tagName, s
std::string val = content.Value();
int type = content.Type();
if(type == TiXmlNode::ELEMENT && val == "led"){
auto led = parent->parse<cLed>(dynamic_cast<ticpp::Element&>(content));
auto led = getDialog()->parse<cLed>(dynamic_cast<ticpp::Element&>(content), *this);
addChoice(led.second, led.first);
return true;
} else if(type == TiXmlNode::TEXT) {

View File

@@ -78,8 +78,8 @@ public:
/// @param id The unique key of the choice.
void show(std::string id);
/// Create a new LED group.
/// @param parent The parent dialog.
explicit cLedGroup(cDialog& parent);
/// @param parent The parent.
explicit cLedGroup(iComponent& parent);
bool isClickable() const override;
bool isFocusable() const override;
bool isScrollable() const override;

View File

@@ -94,7 +94,7 @@ bool cTextMsg::parseContent(ticpp::Node& content, int n, std::string tagName, st
void cTextMsg::validatePostParse(ticpp::Element& who, std::string fname, const std::set<std::string>& attrs, const std::multiset<std::string>& nodes) {
cControl::validatePostParse(who, fname, attrs, nodes);
if(!attrs.count("color") && !attrs.count("colour") && parent->getBg() == cDialog::BG_DARK)
if(!attrs.count("color") && !attrs.count("colour") && getDialog()->getBg() == cDialog::BG_DARK)
setColour(sf::Color::White);
if(attrs.count("width")) fixedWidth = true;
if(attrs.count("height")) fixedHeight = true;
@@ -116,8 +116,8 @@ void cTextMsg::calculate_layout() {
for(const auto& key : keyRefs) {
size_t pos = msg.find_first_of(KEY_PLACEHOLDER);
if(pos == std::string::npos) break;
if(key && !parent->hasControl(*key)) continue;
cControl& ctrl = key ? parent->getControl(*key) : *this;
if(key && !getDialog()->hasControl(*key)) continue;
cControl& ctrl = key ? getDialog()->getControl(*key) : *this;
msg.replace(pos, 1, ctrl.getAttachedKeyDescription());
}
if(to_rect.bottom - to_rect.top < 20 && msg.find("|") == std::string::npos){
@@ -197,7 +197,7 @@ void cTextMsg::recalcRect() {
calculate_layout();
}
cTextMsg::cTextMsg(cDialog& parent) :
cTextMsg::cTextMsg(iComponent& parent) :
cControl(CTRL_TEXT,parent),
textFont(FONT_BOLD),
textSize(10),
@@ -206,15 +206,6 @@ cTextMsg::cTextMsg(cDialog& parent) :
setFormat(TXT_FRAME, FRM_NONE);
}
cTextMsg::cTextMsg(sf::RenderWindow& parent) :
cControl(CTRL_TEXT,parent),
textFont(FONT_BOLD),
textSize(10),
color(cDialog::defaultBackground == cDialog::BG_DARK ? sf::Color::White : sf::Color::Black),
fromList("none") {
setFormat(TXT_FRAME, FRM_NONE);
}
bool cTextMsg::isClickable() const {
return haveHandler(EVT_CLICK);
}
@@ -230,7 +221,7 @@ bool cTextMsg::isScrollable() const {
void cTextMsg::draw(){
rectangle to_rect = frame;
inWindow->setActive();
getWindow().setActive();
if(visible){
drawFrame(2, frameStyle);
@@ -242,7 +233,7 @@ void cTextMsg::draw(){
}
style.colour = draw_color;
if (!calculated) calculate_layout();
win_draw_string(*inWindow,to_rect,msg,text_mode,style,break_info,right_align);
win_draw_string(getWindow(),to_rect,msg,text_mode,style,break_info,right_align);
}
}

View File

@@ -29,10 +29,7 @@ public:
bool manageFormat(eFormat prop, bool set, boost::any* val) override;
/// Create a new text message.
/// @param parent The parent dialog.
explicit cTextMsg(cDialog& parent);
/// Create a new text message without a parent dialog.
/// @param parent The parent window.
explicit cTextMsg(sf::RenderWindow& parent);
explicit cTextMsg(iComponent& parent);
bool isClickable() const override;
bool isFocusable() const override;
bool isScrollable() const override;

View File

@@ -134,16 +134,11 @@ ePicType cPict::getPicType() const {
return picType;
}
cPict::cPict(cDialog& parent) :
cPict::cPict(iComponent& parent) :
cControl(CTRL_PICT,parent) {
setFormat(TXT_FRAME, FRM_SOLID);
}
cPict::cPict(sf::RenderWindow& parent) :
cControl(CTRL_PICT, parent) {
setFormat(TXT_FRAME, FRM_SOLID);
}
bool cPict::isClickable() const {
return haveHandler(EVT_CLICK);
}
@@ -705,12 +700,12 @@ std::shared_ptr<const sf::Texture> cPict::getSheetInternal(eSheetType type, size
void cPict::draw(){
sf::Color store_color;
rectangle rect = frame;
inWindow->setActive();
getWindow().setActive();
if(!visible) return;
if(picNum == BLANK) // Just fill with black
fill_rect(*inWindow, rect, sf::Color::Black);
fill_rect(getWindow(), rect, sf::Color::Black);
else (this->*drawPict()[picType])(picNum,rect);
drawFrame(2, frameStyle);
@@ -727,7 +722,7 @@ void cPict::drawPresetTer(short num, rectangle to_rect){
rectangle from_rect = calc_rect(num % 10, num / 10);
if(to_rect.right - to_rect.left > 28)
to_rect.inset(4,0);
rect_draw_some_item(*from_gw, from_rect, *inWindow, to_rect);
rect_draw_some_item(*from_gw, from_rect, getWindow(), to_rect);
}
void cPict::drawPresetTerAnim(short num, rectangle to_rect){
@@ -738,7 +733,7 @@ void cPict::drawPresetTerAnim(short num, rectangle to_rect){
to_rect.inset(4,0);
to_rect.right = to_rect.left + 28;
}
rect_draw_some_item(*from_gw, from_rect, *inWindow, to_rect);
rect_draw_some_item(*from_gw, from_rect, getWindow(), to_rect);
}
static rectangle calcDefMonstRect(short i, short animFrame){
@@ -765,84 +760,84 @@ void cPict::drawPresetMonstSm(short num, rectangle to_rect){
rectangle from_rect = calcDefMonstRect(m_start_pic, animFrame);
to_rect.right = to_rect.left + 28;
to_rect.bottom = to_rect.top + 36;
if(filled) fill_rect(*inWindow, to_rect, sf::Color::Black);
rect_draw_some_item(*from_gw, from_rect, *inWindow, to_rect, sf::BlendAlpha);
if(filled) fill_rect(getWindow(), to_rect, sf::Color::Black);
rect_draw_some_item(*from_gw, from_rect, getWindow(), to_rect, sf::BlendAlpha);
}
void cPict::drawPresetMonstWide(short num, rectangle to_rect){
rectangle small_monst_rect = {0,0,18,14};
to_rect.right = to_rect.left + 28; to_rect.bottom = to_rect.top + 36;
if(filled) fill_rect(*inWindow, to_rect, sf::Color::Black);
if(filled) fill_rect(getWindow(), to_rect, sf::Color::Black);
short m_start_pic = m_pic_index[num].i;
auto from_gw = getSheet(SHEET_MONST, m_start_pic / 20);
if(!from_gw) return;
rectangle from_rect = calcDefMonstRect(m_start_pic % 20, animFrame);
small_monst_rect.offset(to_rect.left,to_rect.top + 7);
rect_draw_some_item(*from_gw, from_rect, *inWindow, small_monst_rect, sf::BlendAlpha);
rect_draw_some_item(*from_gw, from_rect, getWindow(), small_monst_rect, sf::BlendAlpha);
m_start_pic = m_pic_index[num].i + 1;
from_gw = getSheet(SHEET_MONST, m_start_pic / 20);
if(!from_gw) return;
from_rect = calcDefMonstRect(m_start_pic % 20, animFrame);
small_monst_rect.offset(14,0);
rect_draw_some_item(*from_gw, from_rect, *inWindow, small_monst_rect, sf::BlendAlpha);
rect_draw_some_item(*from_gw, from_rect, getWindow(), small_monst_rect, sf::BlendAlpha);
}
void cPict::drawPresetMonstTall(short num, rectangle to_rect){
rectangle small_monst_rect = {0,0,18,14};
to_rect.right = to_rect.left + 28;
to_rect.bottom = to_rect.top + 36;
if(filled) fill_rect(*inWindow, to_rect, sf::Color::Black);
if(filled) fill_rect(getWindow(), to_rect, sf::Color::Black);
short m_start_pic = m_pic_index[num].i;
auto from_gw = getSheet(SHEET_MONST, m_start_pic / 20);
if(!from_gw) return;
rectangle from_rect = calcDefMonstRect(m_start_pic % 20, animFrame);
small_monst_rect.offset(to_rect.left + 7,to_rect.top);
rect_draw_some_item(*from_gw, from_rect, *inWindow, small_monst_rect, sf::BlendAlpha);
rect_draw_some_item(*from_gw, from_rect, getWindow(), small_monst_rect, sf::BlendAlpha);
m_start_pic = m_pic_index[num].i + 1;
from_gw = getSheet(SHEET_MONST, m_start_pic / 20);
if(!from_gw) return;
from_rect = calcDefMonstRect(m_start_pic % 20, animFrame);
small_monst_rect.offset(0,18);
rect_draw_some_item(*from_gw, from_rect, *inWindow, small_monst_rect, sf::BlendAlpha);
rect_draw_some_item(*from_gw, from_rect, getWindow(), small_monst_rect, sf::BlendAlpha);
}
void cPict::drawPresetMonstLg(short num, rectangle to_rect){
rectangle small_monst_rect = {0,0,18,14};
to_rect.right = to_rect.left + 28;
to_rect.bottom = to_rect.top + 36;
if(filled) fill_rect(*inWindow, to_rect, sf::Color::Black);
if(filled) fill_rect(getWindow(), to_rect, sf::Color::Black);
short m_start_pic = m_pic_index[num].i;
auto from_gw = getSheet(SHEET_MONST, m_start_pic / 20);
if(!from_gw) return;
rectangle from_rect = calcDefMonstRect(m_start_pic % 20, animFrame);
small_monst_rect.offset(to_rect.left,to_rect.top);
rect_draw_some_item(*from_gw, from_rect, *inWindow, small_monst_rect, sf::BlendAlpha);
rect_draw_some_item(*from_gw, from_rect, getWindow(), small_monst_rect, sf::BlendAlpha);
m_start_pic = m_pic_index[num].i + 1;
from_gw = getSheet(SHEET_MONST, m_start_pic / 20);
if(!from_gw) return;
from_rect = calcDefMonstRect(m_start_pic % 20, animFrame);
small_monst_rect.offset(14,0);
rect_draw_some_item(*from_gw, from_rect, *inWindow, small_monst_rect, sf::BlendAlpha);
rect_draw_some_item(*from_gw, from_rect, getWindow(), small_monst_rect, sf::BlendAlpha);
m_start_pic = m_pic_index[num].i + 2;
from_gw = getSheet(SHEET_MONST, m_start_pic / 20);
if(!from_gw) return;
from_rect = calcDefMonstRect(m_start_pic % 20, animFrame);
small_monst_rect.offset(-14,18);
rect_draw_some_item(*from_gw, from_rect, *inWindow, small_monst_rect, sf::BlendAlpha);
rect_draw_some_item(*from_gw, from_rect, getWindow(), small_monst_rect, sf::BlendAlpha);
m_start_pic = m_pic_index[num].i + 3;
from_gw = getSheet(SHEET_MONST, m_start_pic / 20);
if(!from_gw) return;
from_rect = calcDefMonstRect(m_start_pic % 20, animFrame);
small_monst_rect.offset(14,0);
rect_draw_some_item(*from_gw, from_rect, *inWindow, small_monst_rect, sf::BlendAlpha);
rect_draw_some_item(*from_gw, from_rect, getWindow(), small_monst_rect, sf::BlendAlpha);
}
void cPict::drawPresetDlog(short num, rectangle to_rect){
@@ -851,7 +846,7 @@ void cPict::drawPresetDlog(short num, rectangle to_rect){
auto from_gw = getSheet(SHEET_DLOG);
rectangle from_rect = {0,0,36,36};
from_rect.offset(36 * (num % 4),36 * (num / 4));
rect_draw_some_item(*from_gw, from_rect, *inWindow, to_rect);
rect_draw_some_item(*from_gw, from_rect, getWindow(), to_rect);
}
void cPict::drawPresetDlogLg(short num, rectangle to_rect){
@@ -860,7 +855,7 @@ void cPict::drawPresetDlogLg(short num, rectangle to_rect){
auto from_gw = getSheet(SHEET_DLOG);
rectangle from_rect = {0,0,72,72};
from_rect.offset(36 * (num % 4),36 * (num / 4));
rect_draw_some_item(*from_gw, from_rect, *inWindow, to_rect);
rect_draw_some_item(*from_gw, from_rect, getWindow(), to_rect);
}
void cPict::drawPresetTalk(short num, rectangle to_rect){
@@ -869,7 +864,7 @@ void cPict::drawPresetTalk(short num, rectangle to_rect){
auto from_gw = getSheet(SHEET_TALK);
rectangle from_rect = {0,0,32,32};
from_rect.offset(32 * (num % 10),32 * (num / 10));
rect_draw_some_item(*from_gw, from_rect, *inWindow, to_rect);
rect_draw_some_item(*from_gw, from_rect, getWindow(), to_rect);
}
void cPict::drawPresetScen(short num, rectangle to_rect){
@@ -878,7 +873,7 @@ void cPict::drawPresetScen(short num, rectangle to_rect){
from_rect.offset(32 * (num % 5),32 * (num / 5));
to_rect.right = to_rect.left + 32;
to_rect.bottom = to_rect.top + 32;
rect_draw_some_item(*from_gw, from_rect, *inWindow, to_rect);
rect_draw_some_item(*from_gw, from_rect, getWindow(), to_rect);
}
void cPict::drawPresetScenLg(short num, rectangle to_rect){
@@ -887,13 +882,13 @@ void cPict::drawPresetScenLg(short num, rectangle to_rect){
to_rect.bottom = to_rect.top + (drawScaled ? getBounds().height() : 64);
rectangle from_rect = {0,0,64,64};
from_rect.offset(num * 64, 0);
rect_draw_some_item(*from_gw, from_rect, *inWindow, to_rect);
rect_draw_some_item(*from_gw, from_rect, getWindow(), to_rect);
}
void cPict::drawPresetItem(short num, rectangle to_rect){
to_rect.right = to_rect.left + 28;
to_rect.bottom = to_rect.top + 36;
if(filled) fill_rect(*inWindow, to_rect, sf::Color::Black);
if(filled) fill_rect(getWindow(), to_rect, sf::Color::Black);
std::shared_ptr<const sf::Texture> from_gw;
rectangle from_rect = {0,0,18,18};
if(num < 55) {
@@ -904,17 +899,17 @@ void cPict::drawPresetItem(short num, rectangle to_rect){
to_rect.inset(5,9);
from_rect.offset(18 * (num % 10), 18 * (num / 10));
}
rect_draw_some_item(*from_gw, from_rect, *inWindow, to_rect, sf::BlendAlpha);
rect_draw_some_item(*from_gw, from_rect, getWindow(), to_rect, sf::BlendAlpha);
}
void cPict::drawPresetTinyItem(short num, rectangle to_rect){
to_rect.right = to_rect.left + 18;
to_rect.bottom = to_rect.top + 18;
if(filled) fill_rect(*inWindow, to_rect, sf::Color::Black);
if(filled) fill_rect(getWindow(), to_rect, sf::Color::Black);
rectangle from_rect = {0,0,18,18};
auto from_gw = getSheet(SHEET_TINY_ITEM);
from_rect.offset(18 * (num % 10), 18 * (num / 10));
rect_draw_some_item(*from_gw, from_rect, *inWindow, to_rect, sf::BlendAlpha);
rect_draw_some_item(*from_gw, from_rect, getWindow(), to_rect, sf::BlendAlpha);
}
void cPict::drawPresetPc(short num, rectangle to_rect){
@@ -922,8 +917,8 @@ void cPict::drawPresetPc(short num, rectangle to_rect){
rectangle from_rect = calc_rect(2 * (num / 8), num % 8);
to_rect.right = to_rect.left + 28;
to_rect.bottom = to_rect.top + 36;
if(filled) fill_rect(*inWindow, to_rect, sf::Color::Black);
rect_draw_some_item(*from_gw, from_rect, *inWindow, to_rect, sf::BlendAlpha);
if(filled) fill_rect(getWindow(), to_rect, sf::Color::Black);
rect_draw_some_item(*from_gw, from_rect, getWindow(), to_rect, sf::BlendAlpha);
}
void cPict::drawPresetField(short num, rectangle to_rect){
@@ -931,8 +926,8 @@ void cPict::drawPresetField(short num, rectangle to_rect){
rectangle from_rect = calc_rect(num % 8, num / 8);
to_rect.right = to_rect.left + 28;
to_rect.bottom = to_rect.top + 36;
if(filled) fill_rect(*inWindow, to_rect, sf::Color::Black);
rect_draw_some_item(*from_gw, from_rect, *inWindow, to_rect, sf::BlendAlpha);
if(filled) fill_rect(getWindow(), to_rect, sf::Color::Black);
rect_draw_some_item(*from_gw, from_rect, getWindow(), to_rect, sf::BlendAlpha);
}
void cPict::drawPresetBoom(short num, rectangle to_rect){
@@ -943,8 +938,8 @@ void cPict::drawPresetBoom(short num, rectangle to_rect){
// TODO: Be smarter about this - we know the first row is static booms and subsequent rows are animated booms.
to_rect.right = to_rect.left + 28;
to_rect.bottom = to_rect.top + 36;
if(filled) fill_rect(*inWindow, to_rect, sf::Color::Black);
rect_draw_some_item(*from_gw, from_rect, *inWindow, to_rect, sf::BlendAlpha);
if(filled) fill_rect(getWindow(), to_rect, sf::Color::Black);
rect_draw_some_item(*from_gw, from_rect, getWindow(), to_rect, sf::BlendAlpha);
}
void cPict::drawFullSheet(short num, rectangle to_rect){
@@ -955,7 +950,7 @@ void cPict::drawFullSheet(short num, rectangle to_rect){
to_rect.right = to_rect.left + (from_rect.right - from_rect.left);
to_rect.bottom = to_rect.top + (from_rect.bottom - from_rect.top);
}
rect_draw_some_item(*from_gw, from_rect, *inWindow, to_rect);
rect_draw_some_item(*from_gw, from_rect, getWindow(), to_rect);
}
void cPict::drawPresetMissile(short num, rectangle to_rect){
@@ -963,10 +958,10 @@ void cPict::drawPresetMissile(short num, rectangle to_rect){
auto from_gw = getSheet(SHEET_MISSILE);
to_rect.right = to_rect.left + 18;
to_rect.bottom = to_rect.top + 18;
if(filled) fill_rect(*inWindow, to_rect, sf::Color::Black);
if(filled) fill_rect(getWindow(), to_rect, sf::Color::Black);
short i = animFrame % 8;
from_rect.offset(18 * i, 18 * num);
rect_draw_some_item(*from_gw, from_rect, *inWindow, to_rect, sf::BlendAlpha);
rect_draw_some_item(*from_gw, from_rect, getWindow(), to_rect, sf::BlendAlpha);
}
void cPict::drawPresetTerMap(short num, rectangle to_rect){
@@ -978,7 +973,7 @@ void cPict::drawPresetTerMap(short num, rectangle to_rect){
if(num >= 960)
from_rect.offset(12 * 20, 12 * (num - 960));
else from_rect.offset(12 * (num % 20), 12 * (num / 20));
rect_draw_some_item(*from_gw, from_rect, *inWindow, to_rect);
rect_draw_some_item(*from_gw, from_rect, getWindow(), to_rect);
}
void cPict::drawStatusIcon(short num, rectangle to_rect){
@@ -990,9 +985,9 @@ void cPict::drawStatusIcon(short num, rectangle to_rect){
if(getFormat(TXT_FRAME)) {
rectangle pat_rect = to_rect;
pat_rect.inset(-1,-1);
tileImage(*inWindow, pat_rect, bg[6]);
tileImage(getWindow(), pat_rect, bg[6]);
}
rect_draw_some_item(*from_gw, from_rect, *inWindow, to_rect, sf::BlendAlpha);
rect_draw_some_item(*from_gw, from_rect, getWindow(), to_rect, sf::BlendAlpha);
}
void cPict::drawCustomTer(short num, rectangle to_rect){
@@ -1001,7 +996,7 @@ void cPict::drawCustomTer(short num, rectangle to_rect){
rectangle from_rect;
std::shared_ptr<const sf::Texture> from_gw;
graf_pos_ref(from_gw, from_rect) = spec_scen_g.find_graphic(num);
rect_draw_some_item(*from_gw, from_rect, *inWindow, to_rect);
rect_draw_some_item(*from_gw, from_rect, getWindow(), to_rect);
}
void cPict::drawCustomTerAnim(short num, rectangle to_rect){
@@ -1011,7 +1006,7 @@ void cPict::drawCustomTerAnim(short num, rectangle to_rect){
rectangle from_rect;
std::shared_ptr<const sf::Texture> from_gw;
graf_pos_ref(from_gw, from_rect) = spec_scen_g.find_graphic(num);
rect_draw_some_item(*from_gw, from_rect, *inWindow, to_rect);
rect_draw_some_item(*from_gw, from_rect, getWindow(), to_rect);
}
void cPict::drawCustomMonstSm(short num, rectangle to_rect){
@@ -1019,12 +1014,12 @@ void cPict::drawCustomMonstSm(short num, rectangle to_rect){
num += adj[animFrame % 4];
to_rect.right = to_rect.left + 28;
to_rect.bottom = to_rect.top + 36;
if(filled) fill_rect(*inWindow, to_rect, sf::Color::Black);
if(filled) fill_rect(getWindow(), to_rect, sf::Color::Black);
rectangle from_rect;
std::shared_ptr<const sf::Texture> from_gw;
graf_pos_ref(from_gw, from_rect) = spec_scen_g.find_graphic(num);
rect_draw_some_item(*from_gw, from_rect, *inWindow, to_rect, sf::BlendAlpha);
rect_draw_some_item(*from_gw, from_rect, getWindow(), to_rect, sf::BlendAlpha);
}
void cPict::drawCustomMonstWide(short num, rectangle to_rect){
@@ -1033,17 +1028,17 @@ void cPict::drawCustomMonstWide(short num, rectangle to_rect){
rectangle small_monst_rect = {0,0,18,14};
to_rect.right = to_rect.left + 28;
to_rect.bottom = to_rect.top + 36;
if(filled) fill_rect(*inWindow, to_rect, sf::Color::Black);
if(filled) fill_rect(getWindow(), to_rect, sf::Color::Black);
rectangle from_rect;
std::shared_ptr<const sf::Texture> from_gw;
graf_pos_ref(from_gw, from_rect) = spec_scen_g.find_graphic(num);
small_monst_rect.offset(to_rect.left,to_rect.top + 7);
rect_draw_some_item(*from_gw, from_rect, *inWindow, small_monst_rect, sf::BlendAlpha);
rect_draw_some_item(*from_gw, from_rect, getWindow(), small_monst_rect, sf::BlendAlpha);
graf_pos_ref(from_gw, from_rect) = spec_scen_g.find_graphic(num+1);
small_monst_rect.offset(14,0);
rect_draw_some_item(*from_gw, from_rect, *inWindow, small_monst_rect, sf::BlendAlpha);
rect_draw_some_item(*from_gw, from_rect, getWindow(), small_monst_rect, sf::BlendAlpha);
}
void cPict::drawCustomMonstTall(short num, rectangle to_rect){
@@ -1052,17 +1047,17 @@ void cPict::drawCustomMonstTall(short num, rectangle to_rect){
rectangle small_monst_rect = {0,0,18,14};
to_rect.right = to_rect.left + 28;
to_rect.bottom = to_rect.top + 36;
if(filled) fill_rect(*inWindow, to_rect, sf::Color::Black);
if(filled) fill_rect(getWindow(), to_rect, sf::Color::Black);
rectangle from_rect;
std::shared_ptr<const sf::Texture> from_gw;
graf_pos_ref(from_gw, from_rect) = spec_scen_g.find_graphic(num);
small_monst_rect.offset(to_rect.left + 7,to_rect.top);
rect_draw_some_item(*from_gw, from_rect, *inWindow, small_monst_rect, sf::BlendAlpha);
rect_draw_some_item(*from_gw, from_rect, getWindow(), small_monst_rect, sf::BlendAlpha);
graf_pos_ref(from_gw, from_rect) = spec_scen_g.find_graphic(num+1);
small_monst_rect.offset(0,18);
rect_draw_some_item(*from_gw, from_rect, *inWindow, small_monst_rect, sf::BlendAlpha);
rect_draw_some_item(*from_gw, from_rect, getWindow(), small_monst_rect, sf::BlendAlpha);
}
void cPict::drawCustomMonstLg(short num, rectangle to_rect){
@@ -1071,25 +1066,25 @@ void cPict::drawCustomMonstLg(short num, rectangle to_rect){
rectangle small_monst_rect = {0,0,18,14};
to_rect.right = to_rect.left + 28;
to_rect.bottom = to_rect.top + 36;
if(filled) fill_rect(*inWindow, to_rect, sf::Color::Black);
if(filled) fill_rect(getWindow(), to_rect, sf::Color::Black);
rectangle from_rect;
std::shared_ptr<const sf::Texture> from_gw;
graf_pos_ref(from_gw, from_rect) = spec_scen_g.find_graphic(num);
small_monst_rect.offset(to_rect.left,to_rect.top);
rect_draw_some_item(*from_gw, from_rect, *inWindow, small_monst_rect, sf::BlendAlpha);
rect_draw_some_item(*from_gw, from_rect, getWindow(), small_monst_rect, sf::BlendAlpha);
graf_pos_ref(from_gw, from_rect) = spec_scen_g.find_graphic(num+1);
small_monst_rect.offset(14,0);
rect_draw_some_item(*from_gw, from_rect, *inWindow, small_monst_rect, sf::BlendAlpha);
rect_draw_some_item(*from_gw, from_rect, getWindow(), small_monst_rect, sf::BlendAlpha);
graf_pos_ref(from_gw, from_rect) = spec_scen_g.find_graphic(num+2);
small_monst_rect.offset(-14,18);
rect_draw_some_item(*from_gw, from_rect, *inWindow, small_monst_rect, sf::BlendAlpha);
rect_draw_some_item(*from_gw, from_rect, getWindow(), small_monst_rect, sf::BlendAlpha);
graf_pos_ref(from_gw, from_rect) = spec_scen_g.find_graphic(num+3);
small_monst_rect.offset(14,0);
rect_draw_some_item(*from_gw, from_rect, *inWindow, small_monst_rect, sf::BlendAlpha);
rect_draw_some_item(*from_gw, from_rect, getWindow(), small_monst_rect, sf::BlendAlpha);
}
// This is a super-hacky way to wedge in scaled form, but at least it should work.
@@ -1103,13 +1098,13 @@ void cPict::drawCustomDlog(short num, rectangle to_rect){
to_rect.bottom = to_rect.top + dlog_to_h;
from_rect.right = from_rect.left + 18;
from_rect.bottom = from_rect.top + 36;
rect_draw_some_item(*from_gw, from_rect, *inWindow, to_rect);
rect_draw_some_item(*from_gw, from_rect, getWindow(), to_rect);
graf_pos_ref(from_gw, from_rect) = spec_scen_g.find_graphic(num+1);
to_rect.offset(dlog_to_w,0);
from_rect.right = from_rect.left + 18;
from_rect.bottom = from_rect.top + 36;
rect_draw_some_item(*from_gw, from_rect, *inWindow, to_rect);
rect_draw_some_item(*from_gw, from_rect, getWindow(), to_rect);
}
void cPict::drawCustomDlogLg(short num, rectangle to_rect){
@@ -1138,13 +1133,13 @@ void cPict::drawCustomTalk(short num, rectangle to_rect){
to_rect.bottom = to_rect.top + 32;
from_rect.right = from_rect.left + 16;
from_rect.bottom = from_rect.top + 32;
rect_draw_some_item(*from_gw, from_rect, *inWindow, to_rect);
rect_draw_some_item(*from_gw, from_rect, getWindow(), to_rect);
graf_pos_ref(from_gw, from_rect) = spec_scen_g.find_graphic(num+1);
to_rect.offset(16,0);
from_rect.right = from_rect.left + 16;
from_rect.bottom = from_rect.top + 32;
rect_draw_some_item(*from_gw, from_rect, *inWindow, to_rect);
rect_draw_some_item(*from_gw, from_rect, getWindow(), to_rect);
}
void cPict::drawCustomItem(short num, rectangle to_rect){
@@ -1153,8 +1148,8 @@ void cPict::drawCustomItem(short num, rectangle to_rect){
rectangle from_rect;
std::shared_ptr<const sf::Texture> from_gw;
graf_pos_ref(from_gw, from_rect) = spec_scen_g.find_graphic(num);
if(filled) fill_rect(*inWindow, to_rect, sf::Color::Black);
rect_draw_some_item(*from_gw, from_rect, *inWindow, to_rect, sf::BlendAlpha);
if(filled) fill_rect(getWindow(), to_rect, sf::Color::Black);
rect_draw_some_item(*from_gw, from_rect, getWindow(), to_rect, sf::BlendAlpha);
}
void cPict::drawCustomTinyItem(short num, rectangle to_rect){
@@ -1163,8 +1158,8 @@ void cPict::drawCustomTinyItem(short num, rectangle to_rect){
rectangle from_rect;
std::shared_ptr<const sf::Texture> from_gw;
graf_pos_ref(from_gw, from_rect) = spec_scen_g.find_graphic(num);
if(filled) fill_rect(*inWindow, to_rect, sf::Color::Black);
rect_draw_some_item(*from_gw, from_rect, *inWindow, to_rect, sf::BlendAlpha);
if(filled) fill_rect(getWindow(), to_rect, sf::Color::Black);
rect_draw_some_item(*from_gw, from_rect, getWindow(), to_rect, sf::BlendAlpha);
}
void cPict::drawCustomBoom(short num, rectangle to_rect){
@@ -1173,8 +1168,8 @@ void cPict::drawCustomBoom(short num, rectangle to_rect){
rectangle from_rect;
std::shared_ptr<const sf::Texture> from_gw;
graf_pos_ref(from_gw, from_rect) = spec_scen_g.find_graphic(num + animFrame % 8);
if(filled) fill_rect(*inWindow, to_rect, sf::Color::Black);
rect_draw_some_item(*from_gw, from_rect, *inWindow, to_rect, sf::BlendAlpha);
if(filled) fill_rect(getWindow(), to_rect, sf::Color::Black);
rect_draw_some_item(*from_gw, from_rect, getWindow(), to_rect, sf::BlendAlpha);
}
void cPict::drawCustomMissile(short num, rectangle to_rect){
@@ -1185,9 +1180,9 @@ void cPict::drawCustomMissile(short num, rectangle to_rect){
from_rect.right = from_rect.left + 18;
from_rect.bottom = from_rect.top + 18;
if(animFrame >= 4) from_rect.offset(0, 18);
if(filled) fill_rect(*inWindow, to_rect, sf::Color::Black);
if(filled) fill_rect(getWindow(), to_rect, sf::Color::Black);
to_rect.inset(5,9);
rect_draw_some_item(*from_gw, from_rect, *inWindow, to_rect, sf::BlendAlpha);
rect_draw_some_item(*from_gw, from_rect, getWindow(), to_rect, sf::BlendAlpha);
}
void cPict::drawCustomTerMap(short num, rectangle to_rect){
@@ -1200,7 +1195,7 @@ void cPict::drawCustomTerMap(short num, rectangle to_rect){
from_rect.offset((num / 3) * 12, (num % 3) * 12);
to_rect.right = to_rect.left + 24;
to_rect.bottom = to_rect.top + 24;
rect_draw_some_item(*from_gw, from_rect, *inWindow, to_rect);
rect_draw_some_item(*from_gw, from_rect, getWindow(), to_rect);
}
void cPict::drawPartyMonstSm(short num, rectangle to_rect){
@@ -1210,67 +1205,67 @@ void cPict::drawPartyMonstSm(short num, rectangle to_rect){
rectangle from_rect;
graf_pos_ref(from_gw, from_rect) = spec_scen_g.find_graphic(num, true);
if(filled) fill_rect(*inWindow, to_rect, sf::Color::Black);
rect_draw_some_item(*from_gw, from_rect, *inWindow, to_rect, sf::BlendAlpha);
if(filled) fill_rect(getWindow(), to_rect, sf::Color::Black);
rect_draw_some_item(*from_gw, from_rect, getWindow(), to_rect, sf::BlendAlpha);
}
void cPict::drawPartyMonstWide(short num, rectangle to_rect){
rectangle small_monst_rect = {0,0,18,14};
to_rect.right = to_rect.left + 28;
to_rect.bottom = to_rect.top + 36;
if(filled) fill_rect(*inWindow, to_rect, sf::Color::Black);
if(filled) fill_rect(getWindow(), to_rect, sf::Color::Black);
std::shared_ptr<const sf::Texture> from_gw;
rectangle from_rect;
graf_pos_ref(from_gw, from_rect) = spec_scen_g.find_graphic(num, true);
small_monst_rect.offset(to_rect.left,to_rect.top + 7);
rect_draw_some_item(*from_gw, from_rect, *inWindow, small_monst_rect, sf::BlendAlpha);
rect_draw_some_item(*from_gw, from_rect, getWindow(), small_monst_rect, sf::BlendAlpha);
graf_pos_ref(from_gw, from_rect) = spec_scen_g.find_graphic(num+1, true);
small_monst_rect.offset(14,0);
rect_draw_some_item(*from_gw, from_rect, *inWindow, small_monst_rect, sf::BlendAlpha);
rect_draw_some_item(*from_gw, from_rect, getWindow(), small_monst_rect, sf::BlendAlpha);
}
void cPict::drawPartyMonstTall(short num, rectangle to_rect){
rectangle small_monst_rect = {0,0,18,14};
to_rect.right = to_rect.left + 28;
to_rect.bottom = to_rect.top + 36;
if(filled) fill_rect(*inWindow, to_rect, sf::Color::Black);
if(filled) fill_rect(getWindow(), to_rect, sf::Color::Black);
std::shared_ptr<const sf::Texture> from_gw;
rectangle from_rect;
graf_pos_ref(from_gw, from_rect) = spec_scen_g.find_graphic(num, true);
small_monst_rect.offset(to_rect.left + 7,to_rect.top);
rect_draw_some_item(*from_gw, from_rect, *inWindow, small_monst_rect, sf::BlendAlpha);
rect_draw_some_item(*from_gw, from_rect, getWindow(), small_monst_rect, sf::BlendAlpha);
small_monst_rect.offset(0,18);
graf_pos_ref(from_gw, from_rect) = spec_scen_g.find_graphic(num+1, true);
rect_draw_some_item(*from_gw, from_rect, *inWindow, small_monst_rect, sf::BlendAlpha);
rect_draw_some_item(*from_gw, from_rect, getWindow(), small_monst_rect, sf::BlendAlpha);
}
void cPict::drawPartyMonstLg(short num, rectangle to_rect){
rectangle small_monst_rect = {0,0,18,14};
to_rect.right = to_rect.left + 28;
to_rect.bottom = to_rect.top + 36;
if(filled) fill_rect(*inWindow, to_rect, sf::Color::Black);
if(filled) fill_rect(getWindow(), to_rect, sf::Color::Black);
std::shared_ptr<const sf::Texture> from_gw;
rectangle from_rect;
graf_pos_ref(from_gw, from_rect) = spec_scen_g.find_graphic(num, true);
small_monst_rect.offset(to_rect.left,to_rect.top);
rect_draw_some_item(*from_gw, from_rect, *inWindow, small_monst_rect, sf::BlendAlpha);
rect_draw_some_item(*from_gw, from_rect, getWindow(), small_monst_rect, sf::BlendAlpha);
small_monst_rect.offset(14,0);
graf_pos_ref(from_gw, from_rect) = spec_scen_g.find_graphic(num+1, true);
rect_draw_some_item(*from_gw, from_rect, *inWindow, small_monst_rect, sf::BlendAlpha);
rect_draw_some_item(*from_gw, from_rect, getWindow(), small_monst_rect, sf::BlendAlpha);
small_monst_rect.offset(-14,18);
graf_pos_ref(from_gw, from_rect) = spec_scen_g.find_graphic(num+2, true);
rect_draw_some_item(*from_gw, from_rect, *inWindow, small_monst_rect, sf::BlendAlpha);
rect_draw_some_item(*from_gw, from_rect, getWindow(), small_monst_rect, sf::BlendAlpha);
small_monst_rect.offset(14,0);
graf_pos_ref(from_gw, from_rect) = spec_scen_g.find_graphic(num+3, true);
rect_draw_some_item(*from_gw, from_rect, *inWindow, small_monst_rect, sf::BlendAlpha);
rect_draw_some_item(*from_gw, from_rect, getWindow(), small_monst_rect, sf::BlendAlpha);
}
void cPict::drawPartyScen(short num, rectangle to_rect){
@@ -1279,7 +1274,7 @@ void cPict::drawPartyScen(short num, rectangle to_rect){
from_rect.offset(32 * (num % 5),32 * (num / 5));
to_rect.right = to_rect.left + 32;
to_rect.bottom = to_rect.top + 32;
rect_draw_some_item(*from_gw, from_rect, *inWindow, to_rect);
rect_draw_some_item(*from_gw, from_rect, getWindow(), to_rect);
}
void cPict::drawPartyItem(short num, rectangle to_rect){
@@ -1289,8 +1284,8 @@ void cPict::drawPartyItem(short num, rectangle to_rect){
rectangle from_rect;
graf_pos_ref(from_gw, from_rect) = spec_scen_g.find_graphic(num, true);
if(filled) fill_rect(*inWindow, to_rect, sf::Color::Black);
rect_draw_some_item(*from_gw, from_rect, *inWindow, to_rect, sf::BlendAlpha);
if(filled) fill_rect(getWindow(), to_rect, sf::Color::Black);
rect_draw_some_item(*from_gw, from_rect, getWindow(), to_rect, sf::BlendAlpha);
}
void cPict::drawPartyPc(short num, rectangle to_rect){
@@ -1300,14 +1295,15 @@ void cPict::drawPartyPc(short num, rectangle to_rect){
rectangle from_rect;
graf_pos_ref(from_gw, from_rect) = spec_scen_g.find_graphic(num, true);
if(filled) fill_rect(*inWindow, to_rect, sf::Color::Black);
rect_draw_some_item(*from_gw, from_rect, *inWindow, to_rect, sf::BlendAlpha);
if(filled) fill_rect(getWindow(), to_rect, sf::Color::Black);
rect_draw_some_item(*from_gw, from_rect, getWindow(), to_rect, sf::BlendAlpha);
}
cPict::~cPict() {}
void cPict::drawAt(sf::RenderWindow& win, rectangle dest, pic_num_t which_g, ePicType type_g, bool framed) {
cPict pic(win);
cParentless wrapper(win);
cPict pic(wrapper);
pic.frame = dest;
pic.setPict(which_g, type_g);
pic.setFormat(TXT_FRAME, framed ? FRM_SOLID : FRM_NONE);

View File

@@ -56,11 +56,8 @@ public:
/// @return The type of the current icon.
ePicType getPicType() const;
/// Create a new icon.
/// @param parent The parent dialog.
explicit cPict(cDialog& parent);
/// Create a new icon without a parent dialog.
/// @param parent The parent window.
explicit cPict(sf::RenderWindow& parent);
/// @param parent The parent.
explicit cPict(iComponent& parent);
bool isClickable() const override;
bool isFocusable() const override;
bool isScrollable() const override;

View File

@@ -8,6 +8,7 @@
#include "scrollbar.hpp"
#include "dialogxml/dialogs/dialog.hpp"
#include "dialogxml/widgets/container.hpp"
#include "fileio/resmgr/res_image.hpp"
#include "gfx/render_image.hpp"
#include "gfx/render_shapes.hpp"
@@ -22,9 +23,12 @@ std::string cScrollbar::scroll_textures[NUM_STYLES] = {
"dlogscrollled",
};
cScrollbar::cScrollbar(cDialog& parent) : cControl(CTRL_SCROLL, parent), pos(0), max(0), pgsz(10) {}
cScrollbar::cScrollbar(sf::RenderWindow& parent) : cControl(CTRL_SCROLL, parent), pos(0), max(0), pgsz(10) {}
cScrollbar::cScrollbar(iComponent& parent)
: cControl(CTRL_SCROLL, parent)
, pos(0)
, max(0)
, pgsz(10)
{}
void cScrollbar::init() {
}
@@ -45,9 +49,11 @@ void cScrollbar::setPosition(long newPos, bool record) {
if(record && recording){
std::map<std::string,std::string> info;
info["name"] = name;
if(info["name"].empty() && pane != nullptr){
if(info["name"].empty()) {
if(auto pane = dynamic_cast<cContainer*>(&getParent())){
info["name"] = pane->getName();
}
}
// Might as well record newPos before it gets clamped, so replays will verify that clamping
// still works.
info["newPos"] = boost::lexical_cast<std::string>(newPos);
@@ -108,7 +114,7 @@ eScrollStyle cScrollbar::getStyle() const {
// TODO: centralize this translation somewhere
// Translate raw x/y position using the view of the current rendering target
location cScrollbar::translated_location(const sf::Vector2i point) const {
return location { this->inWindow->mapPixelToCoords(point) };
return location { const_cast<cScrollbar*>(this)->getWindow().mapPixelToCoords(point) };
}
bool cScrollbar::handle_event(const sf::Event& event) {
@@ -319,14 +325,14 @@ bool cScrollbar::handleClick(location where, cFramerateLimiter& fps_limiter) {
int diff = clickPos - thumbPos;
while(!done){
redraw();
while(pollEvent(inWindow, e)){
location mouseLoc = sf::Mouse::getPosition(*inWindow);
mouseLoc = inWindow->mapPixelToCoords(mouseLoc);
while(pollEvent(getWindow(), e)){
location mouseLoc = sf::Mouse::getPosition(getWindow());
mouseLoc = getWindow().mapPixelToCoords(mouseLoc);
int mousePos = vert ? mouseLoc.y : mouseLoc.x;
if(e.type == sf::Event::MouseButtonReleased){
done = true;
location clickLoc(e.mouseButton.x, e.mouseButton.y);
clickLoc = inWindow->mapPixelToCoords(clickLoc);
clickLoc = getWindow().mapPixelToCoords(clickLoc);
clicked = frame.contains(clickLoc);
depressed = false;
handlePressedPart(pressedPart);
@@ -354,11 +360,11 @@ bool cScrollbar::handleClick(location where, cFramerateLimiter& fps_limiter) {
break;
}
location toLoc(e.mouseMove.x, e.mouseMove.y);
toLoc = inWindow->mapPixelToCoords(toLoc);
toLoc = getWindow().mapPixelToCoords(toLoc);
if(pressedPart != PART_THUMB && !frame.contains(toLoc)) depressed = false;
}
if(parent && !link.empty())
parent->getControl(link).setTextToNum(pos);
if(getDialog() && !link.empty())
getDialog()->getControl(link).setTextToNum(pos);
thumbPos = bar_start;
thumbPos += btn_size + pos * (bar_size - btn_size) / max;
thumbPos = minmax(mousePos,bar_end - btn_size * 2,thumbPos);
@@ -389,13 +395,13 @@ const rectangle cScrollbar::bar_rect[NUM_STYLES][4] = {
void cScrollbar::draw_horizontal() {
int btn_size = up_rect[style][HORZ].width();
int bar_width = frame.width() - btn_size * 2;
inWindow->setActive();
getWindow().setActive();
rectangle draw_rect = frame, from_rect = up_rect[style][HORZ];
draw_rect.width() = btn_size;
if(depressed && pressedPart == PART_UP)
from_rect = up_rect[style][HORZ_PRESSED];
sf::Texture scroll_gw = *ResMgr::graphics.get(scroll_textures[style]);
rect_draw_some_item(scroll_gw, from_rect, *inWindow, draw_rect);
rect_draw_some_item(scroll_gw, from_rect, getWindow(), draw_rect);
if(pos > 0) {
from_rect = bar_rect[style][HORZ];
int left = draw_rect.right, width = pos * (bar_width - btn_size) / max;
@@ -404,7 +410,7 @@ void cScrollbar::draw_horizontal() {
draw_rect.left = left;
while(draw_rect.left - left < width) {
draw_rect.right = draw_rect.left + btn_size;
rect_draw_some_item(scroll_gw, from_rect, *inWindow, draw_rect);
rect_draw_some_item(scroll_gw, from_rect, getWindow(), draw_rect);
draw_rect.left = draw_rect.right;
}
draw_rect.right = left + width;
@@ -415,7 +421,7 @@ void cScrollbar::draw_horizontal() {
from_rect = thumb_rect[style][HORZ];
if(depressed && pressedPart == PART_THUMB)
from_rect = thumb_rect[style][HORZ_PRESSED];
rect_draw_some_item(scroll_gw, from_rect, *inWindow, draw_rect);
rect_draw_some_item(scroll_gw, from_rect, getWindow(), draw_rect);
}
if(pos < max || max == 0) {
from_rect = bar_rect[style][HORZ];
@@ -430,13 +436,13 @@ void cScrollbar::draw_horizontal() {
rectangle clip_rec = frame;
clip_rec.left = left;
clip_rec.right = draw_rect.right;
clip_rect(*inWindow, clip_rec);
rect_draw_some_item(scroll_gw, from_rect, *inWindow, draw_rect);
undo_clip(*inWindow);
clip_rect(getWindow(), clip_rec);
rect_draw_some_item(scroll_gw, from_rect, getWindow(), draw_rect);
undo_clip(getWindow());
draw_rect.left += btn_size;
while(draw_rect.left < right) {
draw_rect.right = draw_rect.left + btn_size;
rect_draw_some_item(scroll_gw, from_rect, *inWindow, draw_rect);
rect_draw_some_item(scroll_gw, from_rect, getWindow(), draw_rect);
draw_rect.left = draw_rect.right;
}
draw_rect.right = right;
@@ -446,19 +452,19 @@ void cScrollbar::draw_horizontal() {
from_rect = down_rect[style][HORZ];
if(depressed && pressedPart == PART_DOWN)
from_rect = down_rect[style][HORZ_PRESSED];
rect_draw_some_item(scroll_gw, from_rect, *inWindow, draw_rect);
rect_draw_some_item(scroll_gw, from_rect, getWindow(), draw_rect);
}
void cScrollbar::draw_vertical() {
int btn_size = up_rect[style][VERT].height();
int bar_height = frame.height() - btn_size * 2;
inWindow->setActive();
getWindow().setActive();
rectangle draw_rect = frame, from_rect = up_rect[style][VERT];
draw_rect.height() = btn_size;
if(depressed && pressedPart == PART_UP)
from_rect = up_rect[style][VERT_PRESSED];
sf::Texture scroll_gw = *ResMgr::graphics.get(scroll_textures[style]);
rect_draw_some_item(scroll_gw, from_rect, *inWindow, draw_rect);
rect_draw_some_item(scroll_gw, from_rect, getWindow(), draw_rect);
if(pos > 0) {
from_rect = bar_rect[style][VERT];
int top = draw_rect.bottom, height = pos * (bar_height - btn_size) / max;
@@ -467,7 +473,7 @@ void cScrollbar::draw_vertical() {
draw_rect.top = top;
while(draw_rect.top - top < height) {
draw_rect.bottom = draw_rect.top + btn_size;
rect_draw_some_item(scroll_gw, from_rect, *inWindow, draw_rect);
rect_draw_some_item(scroll_gw, from_rect, getWindow(), draw_rect);
draw_rect.top = draw_rect.bottom;
}
draw_rect.bottom = top + height;
@@ -478,7 +484,7 @@ void cScrollbar::draw_vertical() {
from_rect = thumb_rect[style][VERT];
if(depressed && pressedPart == PART_THUMB)
from_rect = thumb_rect[style][VERT_PRESSED];
rect_draw_some_item(scroll_gw, from_rect, *inWindow, draw_rect);
rect_draw_some_item(scroll_gw, from_rect, getWindow(), draw_rect);
}
if(pos < max || max == 0) {
from_rect = bar_rect[style][VERT];
@@ -493,13 +499,13 @@ void cScrollbar::draw_vertical() {
rectangle clip_rec = frame;
clip_rec.top = top;
clip_rec.bottom = draw_rect.bottom;
clip_rect(*inWindow, clip_rec);
rect_draw_some_item(scroll_gw, from_rect, *inWindow, draw_rect);
undo_clip(*inWindow);
clip_rect(getWindow(), clip_rec);
rect_draw_some_item(scroll_gw, from_rect, getWindow(), draw_rect);
undo_clip(getWindow());
draw_rect.top += btn_size;
while(draw_rect.top < bottom) {
draw_rect.bottom = draw_rect.top + btn_size;
rect_draw_some_item(scroll_gw, from_rect, *inWindow, draw_rect);
rect_draw_some_item(scroll_gw, from_rect, getWindow(), draw_rect);
draw_rect.top = draw_rect.bottom;
}
draw_rect.bottom = bottom;
@@ -509,7 +515,7 @@ void cScrollbar::draw_vertical() {
from_rect = down_rect[style][VERT];
if(depressed && pressedPart == PART_DOWN)
from_rect = down_rect[style][VERT_PRESSED];
rect_draw_some_item(scroll_gw, from_rect, *inWindow, draw_rect);
rect_draw_some_item(scroll_gw, from_rect, getWindow(), draw_rect);
}
void cScrollbar::draw() {
@@ -577,8 +583,8 @@ void cScrollbar::validatePostParse(ticpp::Element& who, std::string fname, const
else frame.height() = thickness;
}
*/
if(parent->hasControl(link))
parent->getControl(link).setTextToNum(pos);
if(getDialog()->hasControl(link))
getDialog()->getControl(link).setTextToNum(pos);
}
location cScrollbar::getPreferredSize() const {

View File

@@ -27,7 +27,6 @@ enum eScrollStyle {
/// using the methods to get the scrollbar's position.
/// Alternatively, it can be used as a slider control.
class cScrollbar : public cControl, public iEventListener, public iDrawable {
cControl* pane;
int pos, max, pgsz;
std::string link;
// Make sure this is equal to the number of constants in eScrollStyle
@@ -66,16 +65,12 @@ class cScrollbar : public cControl, public iEventListener, public iDrawable {
public:
/// @copydoc cDialog::init()
static void init();
inline void setPane(cControl* pane) { this->pane = pane; }
bool parseAttribute(ticpp::Attribute& attr, std::string tagName, std::string fname) override;
void validatePostParse(ticpp::Element& who, std::string fname, const std::set<std::string>& attrs, const std::multiset<std::string>& nodes) override;
location getPreferredSize() const override;
/// Create a new scrollbar without a parent dialog.
/// @param parent The parent window.
explicit cScrollbar(sf::RenderWindow& parent);
/// Create a new scrollbar.
/// @param parent The parent dialog.
explicit cScrollbar(cDialog& parent);
/// @param parent The parent.
explicit cScrollbar(iComponent& parent);
bool handleClick(location where, cFramerateLimiter& fps_limiter) override;
storage_t store() const override;
void restore(storage_t to) override;

View File

@@ -16,8 +16,7 @@
#include "gfx/render_shapes.hpp"
#include <climits>
cScrollPane::cScrollPane(cDialog& parent) : cContainer(CTRL_PANE, parent), scroll(parent) {
scroll.setPane(this);
cScrollPane::cScrollPane(iComponent& parent) : cContainer(CTRL_PANE, parent), scroll(*this) {
recalcRect();
}
@@ -139,8 +138,8 @@ void cScrollPane::addChild(cControl* ctrl, std::string key) {
void cScrollPane::draw() {
if(!visible) return;
inWindow->setActive();
clip_rect(*inWindow, getBounds());
getWindow().setActive();
clip_rect(getWindow(), getBounds());
for(auto& ctrl : contents) {
rectangle localBounds = ctrl.second->getBounds();
rectangle globalBounds = localBounds;
@@ -149,7 +148,7 @@ void cScrollPane::draw() {
ctrl.second->draw();
ctrl.second->setBounds(localBounds);
}
undo_clip(*inWindow);
undo_clip(getWindow());
scroll.draw();
if(framed)
drawFrame(4, frameStyle);

View File

@@ -24,7 +24,7 @@ class cScrollPane : public cContainer {
bool manageFormat(eFormat prop, bool set, boost::any* val) override;
public:
/// Create a new scroll pane
explicit cScrollPane(cDialog& parent);
explicit cScrollPane(iComponent& parent);
inline cScrollbar& getScroll() { return scroll; }
bool parseAttribute(ticpp::Attribute& attr, std::string tagName, std::string fname) override;
bool parseContent(ticpp::Node& content, int n, std::string tagName, std::string fname, std::string& text) override;

View File

@@ -61,7 +61,7 @@ void cStack::draw() {
bool cStack::setPage(size_t n) {
if(n >= nPages) return false;
if(n == curPage) return true;
cTextField* focus = parent->getFocus();
cTextField* focus = getDialog()->getFocus();
bool failed = false;
for(auto p : controls) {
const std::string& id = p.first;
@@ -69,11 +69,11 @@ bool cStack::setPage(size_t n) {
// Only trigger focus handlers if the current page still exists.
if(curPage < nPages) {
storage[curPage][id] = ctrl.store();
if(!ctrl.triggerFocusHandler(*parent, id, true))
if(!ctrl.triggerFocusHandler(*getDialog(), id, true))
failed = true;
if(!failed) {
ctrl.restore(storage[n][id]);
if(focus == &ctrl && !ctrl.triggerFocusHandler(*parent, id, false)) {
if(focus == &ctrl && !ctrl.triggerFocusHandler(*getDialog(), id, false)) {
failed = true;
ctrl.restore(storage[curPage][id]);
}
@@ -145,7 +145,11 @@ void cStack::fillTabOrder(std::vector<int>& specificTabs, std::vector<int>& reve
}
}
cStack::cStack(cDialog& parent) : cContainer(CTRL_STACK, parent), curPage(0), nPages(0) {}
cStack::cStack(iComponent& parent)
: cContainer(CTRL_STACK, parent)
, curPage(0)
, nPages(0)
{}
void cStack::forEach(std::function<void(std::string,cControl&)> callback) {
for(auto ctrl : controls)

View File

@@ -80,8 +80,8 @@ public:
/// Meant for internal use.
void fillTabOrder(std::vector<int>& specificTabs, std::vector<int>& reverseTabs);
/// Create a new stack
/// @param parent The parent dialog.
cStack(cDialog& parent);
/// @param parent The parent.
cStack(iComponent& parent);
/// @copydoc cControl::getSupportedHandlers
///
/// @todo Document possible handlers

View File

@@ -19,7 +19,7 @@
std::string cTilemap::generateId(const std::string& baseId) const {
if(baseId.empty()) {
if(id_tries++ == 0) return current_cell;
return cControl::generateId(baseId) + "-" + current_cell;
return cContainer::generateId(baseId) + "-" + current_cell;
}
return baseId + "-" + current_cell;
}
@@ -201,7 +201,9 @@ void cTilemap::fillTabOrder(std::vector<int>& specificTabs, std::vector<int>& re
}
}
cTilemap::cTilemap(cDialog& parent) : cContainer(CTRL_MAP, parent) {}
cTilemap::cTilemap(iComponent& parent)
: cContainer(CTRL_MAP, parent)
{}
void cTilemap::forEach(std::function<void(std::string,cControl&)> callback) {
for(auto ctrl : controls)

View File

@@ -52,8 +52,8 @@ public:
/// Meant for internal use.
void fillTabOrder(std::vector<int>& specificTabs, std::vector<int>& reverseTabs);
/// Create a new tilemap
/// @param parent The parent dialog.
cTilemap(cDialog& parent);
/// @param parent The parent.
cTilemap(iComponent& parent);
/// @copydoc cControl::getSupportedHandlers
///
/// @todo Document possible handlers

View File

@@ -245,7 +245,8 @@ 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 max, int pgSz, int start = 0) {
sbar.reset(new cScrollbar(mainPtr));
static cParentless mainWin(mainPtr);
sbar.reset(new cScrollbar(mainWin));
sbar->setName(name);
sbar->setBounds(rect);
sbar->setMaximum(max);
@@ -283,7 +284,8 @@ static void init_scrollbars() {
}
static void init_btn(std::shared_ptr<cButton>& btn, eBtnType type, location loc) {
btn.reset(new cButton(mainPtr));
static cParentless mainWin(mainPtr);
btn.reset(new cButton(mainWin));
btn->setBtnType(type);
btn->relocate(loc);
btn->hide();

View File

@@ -1473,7 +1473,8 @@ void draw_map(bool need_refresh) {
the_rect = rectangle(mini_map);
tileImage(mini_map, the_rect,bg[4]);
cPict theGraphic(mini_map);
cParentless mapWin(mini_map);
cPict theGraphic(mapWin);
theGraphic.setBounds(dlogpicrect);
theGraphic.setPict(21, PIC_DLOG);
theGraphic.setFormat(TXT_FRAME, FRM_NONE);

View File

@@ -215,7 +215,8 @@ 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));
static cParentless mainWin(mainPtr);
sbar.reset(new cScrollbar(mainWin));
sbar->setBounds(rect);
sbar->set_wheel_event_rect(events_rect);
sbar->setPageSize(pgSz);