Files
oboe/osx/dialogxml/dialog.h
Celtic Minstrel 56f73cb156 Lots of little tweaks and fixes to various things, mostly dialog stuff.
- LED groups now trigger their own click handler in addition to the clicked LED's click handler (provided the latter returns true). If the handler returns false, the click has no effect.
- LED groups now cancel the selection change if their focus handler returns false; this mimics the behaviour when an individual LED's focus handler returns false.
- Move the dialog getResult() definitions inline - since there's only two of them now that I'm using boost::any, having them in a separate file is pointless.
- Changed how the pict choice dialog returns its result - now it returns only whether the user clicked cancel and provides getters to obtain the number and type.
- Pict and string choice dialogs now hide the arrow buttons when there is only one page of options.
- Fix pict choice dialog always returning the initially selected value (similar to how the string choice dialog did before I fixed it)
- When passed an invalid starting selection, the pict choice dialog now always starts with the first icon selected
- Fix wrong bounds for several typs of custom graphics in dialogs
- Fix wrong /source/ bounds for custom 28x36 graphics /everywhere in the game/.
- Fix select PC graphic dialog having a second page with an invalid graphic that can be selected.
2014-12-05 23:48:07 -05:00

140 lines
4.0 KiB
C++

/*
* dialog.h
* BoE
*
* Created by Celtic Minstrel on 11/05/09.
*
*/
#ifndef DIALOG_H
#define DIALOG_H
#include <SFML/Graphics.hpp>
#include <string>
#include <map>
#include <vector>
#include <exception>
#include "ticpp.h"
#include "dialog.keys.h"
#include "location.h"
#include <boost/any.hpp>
class cControl;
class cTextField;
enum eLabelPos {
LABEL_LEFT, LABEL_ABOVE, LABEL_RIGHT, LABEL_BELOW,
};
class cDialog {
typedef std::map<std::string,cControl*>::iterator ctrlIter;
std::map<std::string,cControl*> controls;
short bg;
sf::Color defTextClr;
template<class T> std::pair<std::string,T*> parse(ticpp::Element& who);
sf::Color parseColor(std::string what);
cKey parseKey(std::string what);
sf::RenderWindow win;
std::string currentFocus;
cDialog* parent;
void loadFromFile(std::string path);
template<typename Iter> void handleTabOrder(std::string& itemHit, Iter begin, Iter end);
std::vector<std::pair<std::string,cTextField*>> tabOrder;
public:
static void init();
static bool noAction(cDialog&,std::string,eKeyMod) {return true;}
static const short BG_LIGHT, BG_DARK;
static short defaultBackground;
explicit cDialog(cDialog* p = NULL); // dialog with no items
explicit cDialog(std::string path); // cd_create_dialog
cDialog(std::string path,cDialog* p); // cd_create_dialog_parent_num
~cDialog(); // cd_kill_dialog
bool add(cControl* what, RECT ctrl_frame, std::string key); // returns false if the key is used, true if the control was added
bool remove(std::string key); // returns true if the key existed and was removed, false if the key did not exist
bool addLabelFor(std::string key, std::string label, eLabelPos where, short offset, bool bold); // returns true if the label was added
void run(); // cd_run_dialog
template<typename type> type getResult(){
return boost::any_cast<type>(result);
}
template<typename type> void setResult(const type& val){
result = val;
}
void setBg(short n);
void setDefTextClr(sf::Color clr);
void setDefBtn(std::string defBtn);
sf::Color getDefTextClr();
bool setFocus(cTextField* newFocus, bool force = false); // Setting force = true skips focus handlers
bool toast(bool triggerFocus);
cControl& getControl(std::string id);
cControl& operator[](std::string id);
void recalcRect();
// TODO: It seems like a bad thing for these two to not use the typedefs...
void attachClickHandlers(std::function<bool(cDialog&,std::string,eKeyMod)> handler, std::vector<std::string> controls);
void attachFocusHandlers(std::function<bool(cDialog&,std::string,bool)> handler, std::vector<std::string> controls);
RECT getBounds() {return winRect;}
cDialog& operator=(cDialog& other) = delete;
cDialog(cDialog& other) = delete;
private:
void draw();
std::string process_keystroke(cKey keyHit);
std::string process_click(location where);
bool dialogNotToast;
RECT winRect;
std::string defaultButton;
boost::any result;
std::string fname;
friend class cControl;
friend class cButton;
friend class cLed;
friend class cLedGroup;
friend class cPict;
friend class cTextField;
friend class cTextMsg;
friend class cScrollbar;
friend class _init;
};
class xBadNode : std::exception {
std::string type, dlg;
int row, col;
const char* msg;
public:
xBadNode(std::string t, int r, int c, std::string dlg) throw();
~xBadNode() throw();
const char* what() throw();
};
class xBadAttr : std::exception {
std::string type, name, dlg;
int row, col;
const char* msg;
public:
xBadAttr(std::string t,std::string n, int r, int c, std::string dlg) throw();
~xBadAttr() throw();
const char* what() throw();
};
class xMissingAttr : std::exception {
std::string type, name, dlg;
int row, col;
const char* msg;
public:
xMissingAttr(std::string t,std::string n, int r, int c, std::string dlg) throw();
~xMissingAttr() throw();
const char* what() throw();
};
class xBadVal : std::exception {
std::string type, name, val, dlg;
int row, col;
const char* msg;
public:
xBadVal(std::string t,std::string n,std::string v, int r, int c, std::string dlg) throw();
~xBadVal() throw();
const char* what() throw();
};
#endif