diff --git a/src/dialogxml/dialogs/dialog.cpp b/src/dialogxml/dialogs/dialog.cpp index f030c4b3..017032ff 100644 --- a/src/dialogxml/dialogs/dialog.cpp +++ b/src/dialogxml/dialogs/dialog.cpp @@ -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(*node); + auto field = parse(*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(*node)).first; + inserted = controls.insert(parse(*node, *this)).first; else if(type == "pict") - inserted = controls.insert(parse(*node)).first; + inserted = controls.insert(parse(*node, *this)).first; else if(type == "slider") - inserted = controls.insert(parse(*node)).first; + inserted = controls.insert(parse(*node, *this)).first; else if(type == "button") - inserted = controls.insert(parse(*node)).first; + inserted = controls.insert(parse(*node, *this)).first; else if(type == "led") - inserted = controls.insert(parse(*node)).first; + inserted = controls.insert(parse(*node, *this)).first; else if(type == "group") - inserted = controls.insert(parse(*node)).first; + inserted = controls.insert(parse(*node, *this)).first; else if(type == "stack") { - auto parsed = parse(*node); + auto parsed = parse(*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(*node); + auto parsed = parse(*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(*node); + auto parsed = parse(*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(); } @@ -1190,4 +1189,8 @@ void preview_dialog_xml(fs::path dialog_xml) { }catch(std::string& x){ showError(x); } -} \ No newline at end of file +} + +sf::Color cParentless::getDefTextClr() const { + return cDialog::defaultBackground == cDialog::BG_DARK ? sf::Color::White : sf::Color::Black; +} diff --git a/src/dialogxml/dialogs/dialog.hpp b/src/dialogxml/dialogs/dialog.hpp index 54820f8e..904c33c7 100644 --- a/src/dialogxml/dialogs/dialog.hpp +++ b/src/dialogxml/dialogs/dialog.hpp @@ -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::iterator ctrlIter; std::map 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 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 std::pair parse(ticpp::Element& who, Container* parent) { + template std::pair parse(ticpp::Element& who, iComponent& parent) { std::pair 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 std::pair parse(ticpp::Element& who) { - return parse(who, this); - } cDialogIterator begin() { return cDialogIterator(this); } diff --git a/src/dialogxml/dialogs/dlogevt.hpp b/src/dialogxml/dialogs/dlogevt.hpp index f378762e..4ab228a4 100644 --- a/src/dialogxml/dialogs/dlogevt.hpp +++ b/src/dialogxml/dialogs/dlogevt.hpp @@ -68,4 +68,23 @@ template<> struct event_fcn { using type = std::function; }; +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 diff --git a/src/dialogxml/widgets/button.cpp b/src/dialogxml/widgets/button.cpp index b11c834e..8bbdfe63 100644 --- a/src/dialogxml/widgets/button.cpp +++ b/src/dialogxml/widgets/button.cpp @@ -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); } } diff --git a/src/dialogxml/widgets/button.hpp b/src/dialogxml/widgets/button.hpp index 0183f41f..09cd9610 100644 --- a/src/dialogxml/widgets/button.hpp +++ b/src/dialogxml/widgets/button.hpp @@ -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); diff --git a/src/dialogxml/widgets/container.cpp b/src/dialogxml/widgets/container.cpp index 674f45ae..3e00855a 100644 --- a/src/dialogxml/widgets/container.cpp +++ b/src/dialogxml/widgets/container.cpp @@ -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& controls, std::string& id, std::string fname) { ctrlIter inserted; std::string tag = elem.Value(); if(tag == "field") { - auto field = parent->parse(elem, this); + auto field = getDialog()->parse(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(elem, this); + auto text = getDialog()->parse(elem, *this); inserted = controls.insert(text).first; id = text.first; } else if(tag == "pict") { - auto pict = parent->parse(elem, this); + auto pict = getDialog()->parse(elem, *this); inserted = controls.insert(pict).first; id = pict.first; } else if(tag == "slider") { - auto slide = parent->parse(elem, this); + auto slide = getDialog()->parse(elem, *this); inserted = controls.insert(slide).first; id = slide.first; } else if(tag == "button") { - auto button = parent->parse(elem, this); + auto button = getDialog()->parse(elem, *this); inserted = controls.insert(button).first; id = button.first; } else if(tag == "led") { - auto led = parent->parse(elem, this); + auto led = getDialog()->parse(elem, *this); inserted = controls.insert(led).first; id = led.first; } else if(tag == "group") { - auto group = parent->parse(elem, this); + auto group = getDialog()->parse(elem, *this); inserted = controls.insert(group).first; id = group.first; } else return false; @@ -59,7 +63,6 @@ bool cContainer::parseChildControl(ticpp::Element& elem, std::mapsetName(prevCtrl.first); return true; } diff --git a/src/dialogxml/widgets/container.hpp b/src/dialogxml/widgets/container.hpp index 7617291c..79faba96 100644 --- a/src/dialogxml/widgets/container.hpp +++ b/src/dialogxml/widgets/container.hpp @@ -14,7 +14,7 @@ typedef std::map::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::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& 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 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(*this).getChild(id);} diff --git a/src/dialogxml/widgets/control.cpp b/src/dialogxml/widgets/control.cpp index 61df8750..59efcbac 100644 --- a/src/dialogxml/widgets/control.cpp +++ b/src/dialogxml/widgets/control.cpp @@ -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(parent)) { + return container->getDialog(); + } else if(auto dlog = dynamic_cast(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 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 attr; Iterator 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(&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; diff --git a/src/dialogxml/widgets/control.hpp b/src/dialogxml/widgets/control.hpp index 17e2f5d8..83b6dc39 100644 --- a/src/dialogxml/widgets/control.hpp +++ b/src/dialogxml/widgets/control.hpp @@ -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; 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 event_handlers; + iComponent* parent; // Transient values only used during parsing ePosition horz = POS_ABS, vert = POS_ABS; std::string anchor; diff --git a/src/dialogxml/widgets/field.cpp b/src/dialogxml/widgets/field.cpp index 24429d9a..34e67c89 100644 --- a/src/dialogxml/widgets/field.cpp +++ b/src/dialogxml/widgets/field.cpp @@ -41,7 +41,7 @@ bool cTextField::callHandler(event_fcn::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 rects = draw_string_hilite(*inWindow, text_rect, dummy_str, style, {tmp_hilite}, {0,0,0}); + std::vector 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) { diff --git a/src/dialogxml/widgets/field.hpp b/src/dialogxml/widgets/field.hpp index cec28d18..30eeb7be 100644 --- a/src/dialogxml/widgets/field.hpp +++ b/src/dialogxml/widgets/field.hpp @@ -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; diff --git a/src/dialogxml/widgets/led.cpp b/src/dialogxml/widgets/led.cpp index 9d0b702f..885b608b 100644 --- a/src/dialogxml/widgets/led.cpp +++ b/src/dialogxml/widgets/led.cpp @@ -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 { diff --git a/src/dialogxml/widgets/led.hpp b/src/dialogxml/widgets/led.hpp index 11fc50cd..8ac1e089 100644 --- a/src/dialogxml/widgets/led.hpp +++ b/src/dialogxml/widgets/led.hpp @@ -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. diff --git a/src/dialogxml/widgets/ledgroup.cpp b/src/dialogxml/widgets/ledgroup.cpp index 7d259e5c..b1cff7a8 100644 --- a/src/dialogxml/widgets/ledgroup.cpp +++ b/src/dialogxml/widgets/ledgroup.cpp @@ -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(dynamic_cast(content)); + auto led = getDialog()->parse(dynamic_cast(content), *this); addChoice(led.second, led.first); return true; } else if(type == TiXmlNode::TEXT) { diff --git a/src/dialogxml/widgets/ledgroup.hpp b/src/dialogxml/widgets/ledgroup.hpp index 6db4e85e..9cb7ce95 100644 --- a/src/dialogxml/widgets/ledgroup.hpp +++ b/src/dialogxml/widgets/ledgroup.hpp @@ -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; diff --git a/src/dialogxml/widgets/message.cpp b/src/dialogxml/widgets/message.cpp index e60166ce..5f048435 100644 --- a/src/dialogxml/widgets/message.cpp +++ b/src/dialogxml/widgets/message.cpp @@ -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& attrs, const std::multiset& 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); } } diff --git a/src/dialogxml/widgets/message.hpp b/src/dialogxml/widgets/message.hpp index 7098a721..e134cbfa 100644 --- a/src/dialogxml/widgets/message.hpp +++ b/src/dialogxml/widgets/message.hpp @@ -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; diff --git a/src/dialogxml/widgets/pict.cpp b/src/dialogxml/widgets/pict.cpp index bf0d48ee..e017a818 100644 --- a/src/dialogxml/widgets/pict.cpp +++ b/src/dialogxml/widgets/pict.cpp @@ -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 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 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 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 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 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 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 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 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 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 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 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 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 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 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); diff --git a/src/dialogxml/widgets/pict.hpp b/src/dialogxml/widgets/pict.hpp index 2b169751..17f92c06 100644 --- a/src/dialogxml/widgets/pict.hpp +++ b/src/dialogxml/widgets/pict.hpp @@ -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; diff --git a/src/dialogxml/widgets/scrollbar.cpp b/src/dialogxml/widgets/scrollbar.cpp index 8ef15fc1..cc196682 100644 --- a/src/dialogxml/widgets/scrollbar.cpp +++ b/src/dialogxml/widgets/scrollbar.cpp @@ -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,8 +49,10 @@ void cScrollbar::setPosition(long newPos, bool record) { if(record && recording){ std::map info; info["name"] = name; - if(info["name"].empty() && pane != nullptr){ - info["name"] = pane->getName(); + if(info["name"].empty()) { + if(auto pane = dynamic_cast(&getParent())){ + info["name"] = pane->getName(); + } } // Might as well record newPos before it gets clamped, so replays will verify that clamping // still works. @@ -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(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 { diff --git a/src/dialogxml/widgets/scrollbar.hpp b/src/dialogxml/widgets/scrollbar.hpp index f9c42aaf..0b1fb87d 100644 --- a/src/dialogxml/widgets/scrollbar.hpp +++ b/src/dialogxml/widgets/scrollbar.hpp @@ -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& attrs, const std::multiset& 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; diff --git a/src/dialogxml/widgets/scrollpane.cpp b/src/dialogxml/widgets/scrollpane.cpp index 083a5890..d015b38e 100644 --- a/src/dialogxml/widgets/scrollpane.cpp +++ b/src/dialogxml/widgets/scrollpane.cpp @@ -16,8 +16,7 @@ #include "gfx/render_shapes.hpp" #include -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); diff --git a/src/dialogxml/widgets/scrollpane.hpp b/src/dialogxml/widgets/scrollpane.hpp index 219ebbfe..a1bb29db 100644 --- a/src/dialogxml/widgets/scrollpane.hpp +++ b/src/dialogxml/widgets/scrollpane.hpp @@ -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; diff --git a/src/dialogxml/widgets/stack.cpp b/src/dialogxml/widgets/stack.cpp index 16090a75..56b8cb71 100644 --- a/src/dialogxml/widgets/stack.cpp +++ b/src/dialogxml/widgets/stack.cpp @@ -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& specificTabs, std::vector& 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 callback) { for(auto ctrl : controls) diff --git a/src/dialogxml/widgets/stack.hpp b/src/dialogxml/widgets/stack.hpp index d630be62..d8c645ce 100644 --- a/src/dialogxml/widgets/stack.hpp +++ b/src/dialogxml/widgets/stack.hpp @@ -80,8 +80,8 @@ public: /// Meant for internal use. void fillTabOrder(std::vector& specificTabs, std::vector& 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 diff --git a/src/dialogxml/widgets/tilemap.cpp b/src/dialogxml/widgets/tilemap.cpp index e0ae9ff2..ba18f922 100644 --- a/src/dialogxml/widgets/tilemap.cpp +++ b/src/dialogxml/widgets/tilemap.cpp @@ -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& specificTabs, std::vector& re } } -cTilemap::cTilemap(cDialog& parent) : cContainer(CTRL_MAP, parent) {} +cTilemap::cTilemap(iComponent& parent) + : cContainer(CTRL_MAP, parent) +{} void cTilemap::forEach(std::function callback) { for(auto ctrl : controls) diff --git a/src/dialogxml/widgets/tilemap.hpp b/src/dialogxml/widgets/tilemap.hpp index c138b86a..7f61f2ec 100644 --- a/src/dialogxml/widgets/tilemap.hpp +++ b/src/dialogxml/widgets/tilemap.hpp @@ -52,8 +52,8 @@ public: /// Meant for internal use. void fillTabOrder(std::vector& specificTabs, std::vector& 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 diff --git a/src/game/boe.main.cpp b/src/game/boe.main.cpp index 2aec00ff..af28cff0 100644 --- a/src/game/boe.main.cpp +++ b/src/game/boe.main.cpp @@ -245,7 +245,8 @@ int main(int argc, char* argv[]) { } static void init_sbar(std::shared_ptr& 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& 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(); diff --git a/src/game/boe.town.cpp b/src/game/boe.town.cpp index 822c6bf4..138b4b10 100644 --- a/src/game/boe.town.cpp +++ b/src/game/boe.town.cpp @@ -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); diff --git a/src/scenedit/scen.main.cpp b/src/scenedit/scen.main.cpp index 7f67468c..8e61f116 100644 --- a/src/scenedit/scen.main.cpp +++ b/src/scenedit/scen.main.cpp @@ -215,7 +215,8 @@ int main(int argc, char* argv[]) { } static void init_sbar(std::shared_ptr& 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);