// ============================================================== // This file is part of Glest (www.glest.org) // // Copyright (C) 2001-2008 MartiƱo Figueroa // // You can redistribute this code and/or modify it under // the terms of the GNU General Public License as published // by the Free Software Foundation; either version 2 of the // License, or (at your option) any later version // ============================================================== #ifndef _GLEST_GAME_GRAPHCOMPONENT_H_ #define _GLEST_GAME_GRAPHCOMPONENT_H_ #ifdef WIN32 #include #include #endif #include #include #include #include #include "font.h" #include "texture.h" #include "leak_dumper.h" #include "vec.h" using std::string; using std::vector; using Shared::Graphics::Font2D; using Shared::Graphics::Font3D; using namespace Shared::Graphics; using Shared::Graphics::Vec3f; namespace Glest{ namespace Game{ class GraphicComponent; // =========================================================== // class GraphicComponent // // OpenGL renderer GUI components // =========================================================== class GraphicComponent : public FontChangedCallbackInterface { public: static const float animSpeed; static const float fadeSpeed; static std::map > registeredGraphicComponentList; protected: int x, y, w, h; string text; string textNativeTranslation; Font2D *font; Font3D *font3D; string font2DUniqueId; string font3DUniqueId; bool enabled; bool editable; bool visible; static float anim; static float fade; static Vec3f customTextColor; string containerName; string instanceName; string fontCallbackName; string getNewUUD(); virtual void FontChangedCallback(std::string fontUniqueId, Font *font); public: GraphicComponent(const std::string &containerName="", const std::string &objName="", bool registerControl=true); virtual ~GraphicComponent(); static void setCustomTextColor(Vec3f value) { customTextColor = value; } static Vec3f getCustomTextColor() { return customTextColor; } static void clearRegisteredComponents(std::string containerName=""); static void clearRegisterGraphicComponent(std::string containerName, std::string objName); static void clearRegisterGraphicComponent(std::string containerName, std::vector objNameList); virtual void registerGraphicComponent(std::string containerName, std::string objName); virtual void registerGraphicComponentOnlyFontCallbacks(std::string containerName, std::string objName); static GraphicComponent * findRegisteredComponent(std::string containerName, std::string objName); static void applyAllCustomProperties(std::string containerName); virtual void applyCustomProperties(std::string containerName); static bool saveAllCustomProperties(std::string containerName); virtual bool saveCustomProperties(std::string containerName); virtual void init(int x, int y, int w, int h); string getContainerName() const { return containerName; } string getInstanceName() const { return instanceName; } string getFontCallbackName() const { return fontCallbackName; } void setInstanceName(string value) { instanceName = value; } virtual int getX() const {return x;} virtual int getY() const {return y;} virtual int getW() const {return w;} virtual int getH() const {return h;} virtual const string &getText() const {return text;} virtual const string &getTextNativeTranslation() { return this->textNativeTranslation;} virtual Font2D *getFont() {return font;} virtual Font3D *getFont3D() {return font3D;} virtual bool getEnabled() const {return enabled;} virtual bool getEditable() const {return editable;} virtual bool getVisible() const {return visible;} virtual void setX(int x) {this->x= x;} virtual void setY(int y) {this->y= y;} virtual void setW(int w) {this->w= w;} virtual void setH(int h) {this->h= h;} virtual void setText(const string &text) {this->text= text;} virtual void setTextNativeTranslation(const string &text) {this->textNativeTranslation= text;} virtual void setFont(Font2D *font); virtual void setFont3D(Font3D *font); virtual void setEnabled(bool enabled) {this->enabled= enabled;} virtual void setEditable(bool editable) {this->editable= editable;} virtual void setVisible(bool value) {this->visible = value;} virtual void reloadFonts(); static void reloadFontsForRegisterGraphicComponents(std::string containerName); virtual bool eventMouseWheel(int x, int y,int zDelta); virtual bool mouseMove(int x, int y); virtual bool mouseClick(int x, int y); static void update(); static void resetFade(); static float getAnim() {return anim;} static float getFade() {return fade;} }; // =========================================================== // class GraphicLabel // =========================================================== class GraphicLabel: public GraphicComponent { public: static const int defH; static const int defW; private: bool centered; Vec3f textColor; bool wordWrap; int centeredW; int centeredH; bool editModeEnabled; int maxEditWidth; int maxEditRenderWidth; bool renderBackground; Vec4f backgroundColor; vector textCharLength; bool isPassword; Texture2D *texture; public: GraphicLabel(const std::string &containerName="", const std::string &objName="", bool registerControl=true); void init(int x, int y, int w=defW, int h=defH, bool centered= false, Vec3f textColor=GraphicComponent::customTextColor, bool wordWrap=false); virtual bool mouseMove(int x, int y); vector getTextCharLengthList() const { return textCharLength; } void setTextCharLengthList(vector value) { textCharLength = value; } void clearTextCharLengthList() { textCharLength.clear(); } void addTextCharLengthToList(int length) { textCharLength.push_back(length); } void deleteTextCharLengthFromList() { textCharLength.pop_back(); } bool getIsPassword() const { return isPassword; } void setIsPassword(bool value) { isPassword = value; } bool getCentered() const {return centered;} void setCentered(bool centered) {this->centered= centered;} bool getCenteredW() const; //void setCenteredW(bool centered); bool getCenteredH() const; //void setCenteredH(bool centered); Vec3f getTextColor() const {return textColor;} void setTextColor(Vec3f color) {this->textColor= color;} bool getWordWrap() const { return wordWrap; } void setWordWrap(bool value) { wordWrap = value; } void setEditModeEnabled(bool value) { editModeEnabled = value; } bool getEditModeEnabled() const { return editModeEnabled; } void setMaxEditWidth(int value) { maxEditWidth = value; } int getMaxEditWidth() const { return maxEditWidth; } void setRenderBackground(bool value) { renderBackground = value; } bool getRenderBackground() const { return renderBackground; } Vec4f getBackgroundColor() const {return backgroundColor;} void setBackgroundColor(Vec4f color) {this->backgroundColor= color;} void setMaxEditRenderWidth(int value) { maxEditRenderWidth = value; } int getMaxEditRenderWidth() const { return maxEditRenderWidth; } void setTexture(Texture2D *value) { texture = value; } Texture2D *getTexture() const { return texture; } }; // =========================================================== // class GraphicButton // =========================================================== class GraphicButton: public GraphicComponent { public: static const int defH; static const int defW; private: bool lighted; bool alwaysLighted; bool useCustomTexture; Texture *customTexture; public: GraphicButton(const std::string &containerName="", const std::string &objName="", bool registerControl=true); void init(int x, int y, int w=defW, int h=defH); bool getUseCustomTexture() const { return useCustomTexture; } Texture *getCustomTexture() const { return customTexture; } void setUseCustomTexture(bool value) { useCustomTexture=value; } void setCustomTexture(Texture *value) { customTexture=value; } bool getLighted() const {return lighted||alwaysLighted;} void setLighted(bool lighted) {this->lighted= lighted;} bool getAlwaysLighted() const {return alwaysLighted;} void setAlwaysLighted(bool value) {this->alwaysLighted= value;} virtual bool mouseMove(int x, int y); }; // =========================================================== // class GraphicScrollBar // =========================================================== class GraphicScrollBar: public GraphicComponent { public: static const int defLength; static const int defThickness; private: bool activated; bool lighted; bool horizontal; int elementCount; int visibleSize; int visibleStart; // position on component for renderer int visibleCompPosStart; int visibleCompPosEnd; public: GraphicScrollBar(const std::string &containerName="", const std::string &objName=""); void init(int x, int y, bool horizontal,int length=defLength, int thickness=defThickness); virtual bool mouseDown(int x, int y); virtual bool eventMouseWheel(int x, int y,int zDelta); virtual bool eventMouseWheel(int x, int y,int zDelta,bool ignorePos); virtual bool mouseMove(int x, int y); virtual void mouseUp(int x, int y); virtual bool mouseClick(int x, int y); bool getHorizontal() const {return horizontal;} int getLength() const; void setLength(int length) {horizontal?setW(length):setH(length);} //int getThickness() const; bool getLighted() const {return lighted;} void setLighted(bool lighted) {this->lighted= lighted;} int getElementCount() const {return elementCount;} void setElementCount(int elementCount); int getVisibleSize() const {return visibleSize;} void setVisibleSize(int visibleSize); int getVisibleStart() const {return visibleStart;} int getVisibleEnd() const {return visibleStart+visibleSize>elementCount-1?elementCount-1: visibleStart+visibleSize-1;} void setVisibleStart(int visibleStart); int getVisibleCompPosStart() const {return visibleCompPosStart;} int getVisibleCompPosEnd() const {return visibleCompPosEnd;} void arrangeComponents(vector &gcs); }; // =========================================================== // class GraphicListBox // =========================================================== class GraphicListBox: public GraphicComponent { public: static const int defH; static const int defW; private: GraphicButton graphButton1, graphButton2; vector items; vector translated_items; int selectedItemIndex; bool lighted; Vec3f textColor; bool leftControlled; public: GraphicListBox(const std::string &containerName="", const std::string &objName=""); void init(int x, int y, int w=defW, int h=defH, Vec3f textColor=GraphicComponent::customTextColor); int getItemCount() const {return (int)items.size();} string getItem(int index) const {return items[index];} int getSelectedItemIndex() const {return selectedItemIndex;} string getSelectedItem() const {return items[selectedItemIndex];} GraphicButton *getButton1() {return &graphButton1;} GraphicButton *getButton2() {return &graphButton2;} bool getLighted() const {return lighted;} void setLighted(bool lighted) {this->lighted= lighted;} bool getLeftControlled() const {return leftControlled;} void setLeftControlled(bool leftControlled); Vec3f getTextColor() const {return textColor;} void setTextColor(Vec3f color) {this->textColor= color;} void pushBackItem(string item, string translated_item=""); void clearItems(); vector & getItems() {return items;} void setItems(const vector &items, const vector translated_items=vector()); void setSelectedItemIndex(int index, bool errorOnMissing=true); void setSelectedItem(string item, bool errorOnMissing=true); void setEditable(bool editable); bool hasItem(string item) const; virtual void setX(int x); virtual void setY(int y); virtual bool mouseMove(int x, int y); virtual bool mouseClick(int x, int y, string advanceToItemStartingWith=""); virtual const string &getTextNativeTranslation(); }; // =========================================================== // class GraphicComboBox // =========================================================== typedef vector GraphicButtons; class GraphicComboBox: public GraphicComponent { public: static const int defH; static const int defW; private: GraphicScrollBar scrollBar; GraphicButtons popupButtons; GraphicButton dropDownButton; bool popupShowing; int preselectedItemIndex; int popupLineCount; int popupButtonHeight; vector items; vector translated_items; int selectedItemIndex; bool lighted; Vec3f textColor; public: GraphicComboBox(const std::string &containerName="", const std::string &objName=""); void init(int x, int y, int w=defW, int h=defH, Vec3f textColor=GraphicComponent::customTextColor); int getItemCount() const {return (int)items.size();} string getItem(int index) const {return items[index];} int getSelectedItemIndex() const {return selectedItemIndex;} string getSelectedItem() const { if (selectedItemIndex < 0) return ""; else return items[selectedItemIndex]; } GraphicButton *getButton() {return &dropDownButton;} GraphicScrollBar *getScrollbar() {return &scrollBar;} GraphicButtons *getPopupButtons() {return &popupButtons;} bool getLighted() const {return lighted;} void setLighted(bool lighted) {this->lighted= lighted;} Vec3f getTextColor() const {return textColor;} void setTextColor(Vec3f color) {this->textColor= color;} bool isDropDownShowing() {return this->popupShowing; } void pushBackItem(string item, string translated_item=""); void clearItems(); GraphicButton* createButton(string item); vector & getItems() {return items;} void setItems(const vector &items, const vector translated_items=vector()); void setSelectedItemIndex(int index, bool errorOnMissing=true); void setSelectedItem(string item, bool errorOnMissing=true); void setEditable(bool editable); bool hasItem(string item) const; virtual void setX(int x); virtual void setY(int y); virtual bool eventMouseWheel(int x, int y,int zDelta); virtual bool mouseMove(int x, int y); virtual bool mouseClick(int x, int y); virtual bool mouseDown(int x, int y); virtual void mouseUp(int x, int y); virtual const string &getTextNativeTranslation(); int getPopupLineCount() const {return popupLineCount;} void setPopupLineCount(int popupLineCount); int getPopupButtonHeight() const {return popupButtonHeight; } void setPopupButtonHeight(int popupButtonHeight) { this->popupButtonHeight = popupButtonHeight; scrollBar.setLength(popupLineCount * popupButtonHeight); } string getPreselectedItem() const { return items[preselectedItemIndex]; } int getPreselectedItemIndex() const { return preselectedItemIndex; } private: bool mouseMoveOverButtons(int x, int y); void setPreselectedItemIndex(int index) { this->preselectedItemIndex = index; } virtual const string &getTextNativeTranslation(int index); virtual void togglePopupVisibility(); void clearButtons(); void layoutButtons(); }; // =========================================================== // class GraphicMessageBox // =========================================================== class GraphicMessageBox: public GraphicComponent { public: static const int defH; static const int defW; private: GraphicButtons buttons; string header; bool autoWordWrap; private: void alignButtons(); public: GraphicMessageBox(const std::string &containerName="", const std::string &objName=""); virtual ~GraphicMessageBox(); void init(const string &button1Str, const string &button2Str, int newWidth=-1,int newHeight=-1); void init(const string &button1Str, int newWidth=-1,int newHeight=-1); void init(int newWidth=-1,int newHeight=-1); void removeButtons(); void addButton(const string &buttonStr, int width=-1,int height=-1); bool getAutoWordWrap() const { return autoWordWrap; } void setAutoWordWrap(bool value) { autoWordWrap = value; } int getButtonCount() const {return (int)buttons.size();} GraphicButton *getButton(int index) {return buttons[index];} string getHeader() const {return header;} virtual void setX(int x); virtual void setY(int y); void setHeader(string header) {this->header= header;} virtual bool mouseMove(int x, int y); virtual bool mouseClick(int x, int y); bool mouseClick(int x, int y, int &clickedButton); }; // =========================================================== // class GraphicLine // =========================================================== class GraphicLine: public GraphicComponent { public: static const int defH; static const int defW; private: bool horizontal; public: GraphicLine(const std::string &containerName="", const std::string &objName=""); void init(int x, int y, int w=defW, int h=defH); bool getHorizontal() const {return horizontal;} void setHorizontal(bool horizontal) {this->horizontal= horizontal;} }; // =========================================================== // class GraphicCheckBox // =========================================================== class GraphicCheckBox: public GraphicComponent { public: static const int defH; static const int defW; private: bool value; bool lighted; public: GraphicCheckBox(const std::string &containerName="", const std::string &objName=""); void init(int x, int y, int w=defW, int h=defH); bool getValue() const {return value;} void setValue(bool value) {this->value= value;} bool getLighted() const {return lighted;} void setLighted(bool lighted) {this->lighted= lighted;} virtual bool mouseMove(int x, int y); virtual bool mouseClick(int x, int y); }; // =========================================================== // class PopupMenu // =========================================================== class PopupMenu: public GraphicComponent { public: static const int defH; static const int defW; private: std::vector buttons; string header; public: PopupMenu(const std::string &containerName="", const std::string &objName=""); virtual ~PopupMenu(); void init(string menuHeader, std::vector menuItems); std::vector & getMenuItems() {return buttons;} string getHeader() const {return header;} virtual void setX(int x); virtual void setY(int y); void setHeader(string header) {this->header= header;} virtual bool mouseMove(int x, int y); virtual bool mouseClick(int x, int y); std::pair mouseClickedMenuItem(int x, int y); }; }}//end namespace #endif