diff options
author | xyzz <zhuravlevilya@ya.ru> | 2012-11-12 11:50:58 -0800 |
---|---|---|
committer | xyzz <zhuravlevilya@ya.ru> | 2012-11-12 11:50:58 -0800 |
commit | 5292476841430c55d889b1707cf890638a3dd2a2 (patch) | |
tree | 91a992eabb8b01e7db2fa03f6791ee1245329821 | |
parent | 1db033478797f0c98afa53896fd7767d7566d69e (diff) | |
parent | 8e5167d72622dec428477a7fff529b7dbc974106 (diff) | |
download | minetest-5292476841430c55d889b1707cf890638a3dd2a2.tar.gz minetest-5292476841430c55d889b1707cf890638a3dd2a2.tar.bz2 minetest-5292476841430c55d889b1707cf890638a3dd2a2.zip |
Merge pull request #284 from RealBadAngel/master
Adding backgrounds to formspec
-rw-r--r-- | doc/lua_api.txt | 5 | ||||
-rw-r--r-- | src/guiFormSpecMenu.cpp | 45 | ||||
-rw-r--r-- | src/guiFormSpecMenu.h | 1 |
3 files changed, 49 insertions, 2 deletions
diff --git a/doc/lua_api.txt b/doc/lua_api.txt index 301832618..500b514d9 100644 --- a/doc/lua_api.txt +++ b/doc/lua_api.txt @@ -694,6 +694,11 @@ image[<X>,<Y>;<W>,<H>;<texture name>] ^ Show an image ^ Position and size units are inventory slots +background[<X>,<Y>;<W>,<H>;<texture name>] +^ Use a background. Inventory rectangles are not drawn then. +^ Position and size units are inventory slots +^ Example for formspec 8x4 in 16x resolution: image shall be sized 8*16px x 4*16px + field[<X>,<Y>;<W>,<H>;<name>;<label>;<default>] ^ Textual field; will be sent to server when a button is clicked ^ x and y position the field relative to the top left of the menu diff --git a/src/guiFormSpecMenu.cpp b/src/guiFormSpecMenu.cpp index affbd1a34..7815089b2 100644 --- a/src/guiFormSpecMenu.cpp +++ b/src/guiFormSpecMenu.cpp @@ -199,6 +199,7 @@ void GUIFormSpecMenu::regenerateGui(v2u32 screensize) m_inventorylists.clear(); m_images.clear(); + m_backgrounds.clear(); m_fields.clear(); Strfnd f(m_formspec_string); @@ -278,9 +279,26 @@ void GUIFormSpecMenu::regenerateGui(v2u32 screensize) <<", geom=("<<geom.X<<","<<geom.Y<<")" <<std::endl; if(bp_set != 2) - errorstream<<"WARNING: invalid use of button without a size[] element"<<std::endl; + errorstream<<"WARNING: invalid use of image without a size[] element"<<std::endl; m_images.push_back(ImageDrawSpec(name, pos, geom)); } + else if(type == "background") + { + v2s32 pos = basepos; + pos.X += stof(f.next(",")) * (float)spacing.X - ((float)spacing.X-(float)imgsize.X)/2; + pos.Y += stof(f.next(";")) * (float)spacing.Y - ((float)spacing.Y-(float)imgsize.Y)/2; + v2s32 geom; + geom.X = stof(f.next(",")) * (float)spacing.X; + geom.Y = stof(f.next(";")) * (float)spacing.Y; + std::string name = f.next("]"); + infostream<<"image name="<<name + <<", pos=("<<pos.X<<","<<pos.Y<<")" + <<", geom=("<<geom.X<<","<<geom.Y<<")" + <<std::endl; + if(bp_set != 2) + errorstream<<"WARNING: invalid use of background without a size[] element"<<std::endl; + m_backgrounds.push_back(ImageDrawSpec(name, pos, geom)); + } else if(type == "field") { std::string fname = f.next(";"); @@ -692,6 +710,26 @@ void GUIFormSpecMenu::drawMenu() m_tooltip_element->setVisible(false); /* + Draw backgrounds + */ + for(u32 i=0; i<m_backgrounds.size(); i++) + { + const ImageDrawSpec &spec = m_backgrounds[i]; + video::ITexture *texture = + m_gamedef->tsrc()->getTextureRaw(spec.name); + // Image size on screen + core::rect<s32> imgrect(0, 0, spec.geom.X, spec.geom.Y); + // Image rectangle on screen + core::rect<s32> rect = imgrect + spec.pos; + const video::SColor color(255,255,255,255); + const video::SColor colors[] = {color,color,color,color}; + driver->draw2DImage(texture, rect, + core::rect<s32>(core::position2d<s32>(0,0), + core::dimension2di(texture->getOriginalSize())), + NULL/*&AbsoluteClippingRect*/, colors, true); + } + + /* Draw images */ for(u32 i=0; i<m_images.size(); i++) @@ -715,8 +753,11 @@ void GUIFormSpecMenu::drawMenu() Draw items Phase 0: Item slot rectangles Phase 1: Item images; prepare tooltip + If backgrounds used, do not draw Item slot rectangles */ - for(int phase=0; phase<=1; phase++) + int start_phase=0; + if (m_backgrounds.size() > 0) start_phase=1; + for(int phase=start_phase; phase<=1; phase++) for(u32 i=0; i<m_inventorylists.size(); i++) { drawList(m_inventorylists[i], phase); diff --git a/src/guiFormSpecMenu.h b/src/guiFormSpecMenu.h index 5c01bdcd2..890b54d61 100644 --- a/src/guiFormSpecMenu.h +++ b/src/guiFormSpecMenu.h @@ -206,6 +206,7 @@ protected: TextDest *m_text_dst; core::array<ListDrawSpec> m_inventorylists; + core::array<ImageDrawSpec> m_backgrounds; core::array<ImageDrawSpec> m_images; core::array<FieldSpec> m_fields; |