mirror of
https://gitlab.com/OpenMW/openmw.git
synced 2025-01-29 09:32:45 +00:00
Implemented all MW window layouts
This commit is contained in:
parent
3896fd218a
commit
b2d54a619e
2
.gitignore
vendored
2
.gitignore
vendored
@ -19,3 +19,5 @@ mwcompiler
|
||||
mwinterpreter
|
||||
clientconsole
|
||||
MyGUI.log
|
||||
mygui_test
|
||||
mygui_test.png
|
||||
|
101
CMakeLists.txt
101
CMakeLists.txt
@ -9,22 +9,22 @@ set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/)
|
||||
# source directory: apps
|
||||
|
||||
set(GAME
|
||||
apps/openmw/main.cpp
|
||||
apps/openmw/main.cpp
|
||||
apps/openmw/engine.cpp)
|
||||
set(GAME_HEADER
|
||||
apps/openmw/engine.hpp)
|
||||
source_group(game FILES ${GAME} ${GAME_HEADER})
|
||||
|
||||
set(GAMEREND
|
||||
apps/openmw/mwrender/mwscene.cpp
|
||||
apps/openmw/mwrender/mwscene.cpp
|
||||
apps/openmw/mwrender/cellimp.cpp
|
||||
apps/openmw/mwrender/interior.cpp
|
||||
apps/openmw/mwrender/sky.cpp)
|
||||
set(GAMEREND_HEADER
|
||||
apps/openmw/mwrender/cell.hpp
|
||||
apps/openmw/mwrender/cellimp.hpp
|
||||
apps/openmw/mwrender/cell.hpp
|
||||
apps/openmw/mwrender/cellimp.hpp
|
||||
apps/openmw/mwrender/mwscene.hpp
|
||||
apps/openmw/mwrender/interior.hpp
|
||||
apps/openmw/mwrender/interior.hpp
|
||||
apps/openmw/mwrender/playerpos.hpp
|
||||
apps/openmw/mwrender/sky.hpp)
|
||||
source_group(apps\\openmw\\mwrender FILES ${GAMEREND} ${GAMEREND_HEADER})
|
||||
@ -87,87 +87,88 @@ set(APPS_HEADER ${GAME_HEADER} ${GAMEREND_HEADER} ${GAMEINPUT_HEADER} ${GAMESCRI
|
||||
${GAMESOUND_HEADER} ${GAMEGUI_HEADER} ${GAMEWORLD_HEADER})
|
||||
|
||||
# source directory: components
|
||||
set(COMP_DIR ${CMAKE_SOURCE_DIR}/components)
|
||||
|
||||
set(BSA
|
||||
components/bsa/bsa_archive.cpp
|
||||
components/bsa/bsa_file.cpp)
|
||||
${COMP_DIR}/bsa/bsa_archive.cpp
|
||||
${COMP_DIR}/bsa/bsa_file.cpp)
|
||||
set(BSA_HEADER
|
||||
components/bsa/bsa_archive.hpp
|
||||
components/bsa/bsa_file.hpp)
|
||||
${COMP_DIR}/bsa/bsa_archive.hpp
|
||||
${COMP_DIR}/bsa/bsa_file.hpp)
|
||||
source_group(components\\bsa FILES ${BSA} ${BSA_HEADER})
|
||||
|
||||
set(NIF
|
||||
components/nif/nif_file.cpp)
|
||||
${COMP_DIR}/nif/nif_file.cpp)
|
||||
set(NIF_HEADER
|
||||
components/nif/controlled.hpp
|
||||
components/nif/effect.hpp
|
||||
components/nif/nif_types.hpp
|
||||
components/nif/record.hpp
|
||||
components/nif/controller.hpp
|
||||
components/nif/extra.hpp
|
||||
components/nif/node.hpp
|
||||
components/nif/record_ptr.hpp
|
||||
components/nif/data.hpp
|
||||
components/nif/nif_file.hpp
|
||||
components/nif/property.hpp)
|
||||
${COMP_DIR}/nif/controlled.hpp
|
||||
${COMP_DIR}/nif/effect.hpp
|
||||
${COMP_DIR}/nif/nif_types.hpp
|
||||
${COMP_DIR}/nif/record.hpp
|
||||
${COMP_DIR}/nif/controller.hpp
|
||||
${COMP_DIR}/nif/extra.hpp
|
||||
${COMP_DIR}/nif/node.hpp
|
||||
${COMP_DIR}/nif/record_ptr.hpp
|
||||
${COMP_DIR}/nif/data.hpp
|
||||
${COMP_DIR}/nif/nif_file.hpp
|
||||
${COMP_DIR}/nif/property.hpp)
|
||||
source_group(components\\nif FILES ${NIF} ${NIF_HEADER})
|
||||
|
||||
set(NIFOGRE
|
||||
components/nifogre/ogre_nif_loader.cpp)
|
||||
${COMP_DIR}/nifogre/ogre_nif_loader.cpp)
|
||||
set(NIFOGRE_HEADER
|
||||
components/nifogre/ogre_nif_loader.hpp)
|
||||
${COMP_DIR}/nifogre/ogre_nif_loader.hpp)
|
||||
source_group(components\\nifogre FILES ${NIFOGRE} ${NIFOGRE_HEADER})
|
||||
|
||||
set(ESM_STORE
|
||||
components/esm_store/store.cpp)
|
||||
${COMP_DIR}/esm_store/store.cpp)
|
||||
set(ESM_STORE_HEADER
|
||||
components/esm_store/cell_store.hpp
|
||||
components/esm_store/reclists.hpp
|
||||
components/esm_store/store.hpp)
|
||||
${COMP_DIR}/esm_store/cell_store.hpp
|
||||
${COMP_DIR}/esm_store/reclists.hpp
|
||||
${COMP_DIR}/esm_store/store.hpp)
|
||||
source_group(components\\esm_store FILES ${ESM_STORE} ${ESM_STORE_HEADER})
|
||||
|
||||
file(GLOB ESM_HEADER components/esm/*.hpp)
|
||||
file(GLOB ESM_HEADER ${COMP_DIR}/esm/*.hpp)
|
||||
source_group(components\\esm FILES ${ESM_HEADER})
|
||||
|
||||
set(OGRE
|
||||
${CMAKE_SOURCE_DIR}/components/engine/ogre/renderer.cpp)
|
||||
${COMP_DIR}/engine/ogre/renderer.cpp)
|
||||
set(OGRE_HEADER
|
||||
${CMAKE_SOURCE_DIR}/components/engine/ogre/renderer.hpp)
|
||||
${COMP_DIR}/engine/ogre/renderer.hpp)
|
||||
source_group(components\\engine\\ogre FILES ${OGRE} ${OGRE_HEADER})
|
||||
|
||||
set(INPUT
|
||||
components/engine/input/oismanager.cpp)
|
||||
${COMP_DIR}/engine/input/oismanager.cpp)
|
||||
set(INPUT_HEADER
|
||||
components/engine/input/oismanager.hpp
|
||||
components/engine/input/listener.hpp
|
||||
components/engine/input/func_binder.hpp
|
||||
components/engine/input/dispatch_map.hpp
|
||||
components/engine/input/dispatcher.hpp
|
||||
components/engine/input/poller.hpp)
|
||||
${COMP_DIR}/engine/input/oismanager.hpp
|
||||
${COMP_DIR}/engine/input/listener.hpp
|
||||
${COMP_DIR}/engine/input/func_binder.hpp
|
||||
${COMP_DIR}/engine/input/dispatch_map.hpp
|
||||
${COMP_DIR}/engine/input/dispatcher.hpp
|
||||
${COMP_DIR}/engine/input/poller.hpp)
|
||||
source_group(components\\engine\\input FILES ${INPUT} ${INPUT_HEADER})
|
||||
|
||||
set(COMMANDSERVER
|
||||
components/commandserver/command.hpp
|
||||
components/commandserver/server.hpp
|
||||
components/commandserver/server.cpp)
|
||||
${COMP_DIR}/commandserver/command.hpp
|
||||
${COMP_DIR}/commandserver/server.hpp
|
||||
${COMP_DIR}/commandserver/server.cpp)
|
||||
source_group(components\\commandserver FILES ${COMMANDSERVER})
|
||||
|
||||
set(MISC
|
||||
components/misc/stringops.cpp
|
||||
components/misc/fileops.cpp)
|
||||
${COMP_DIR}/misc/stringops.cpp
|
||||
${COMP_DIR}/misc/fileops.cpp)
|
||||
set(MISC_HEADER
|
||||
components/misc/fileops.hpp
|
||||
components/misc/slice_array.hpp
|
||||
components/misc/stringops.hpp
|
||||
components/misc/tsdeque.hpp)
|
||||
${COMP_DIR}/misc/fileops.hpp
|
||||
${COMP_DIR}/misc/slice_array.hpp
|
||||
${COMP_DIR}/misc/stringops.hpp
|
||||
${COMP_DIR}/misc/tsdeque.hpp)
|
||||
source_group(components\\misc FILES ${MISC} ${MISC_HEADER})
|
||||
|
||||
file(GLOB COMPILER components/compiler/*.cpp)
|
||||
file(GLOB COMPILER_HEADER components/compiler/*.hpp)
|
||||
file(GLOB COMPILER ${COMP_DIR}/compiler/*.cpp)
|
||||
file(GLOB COMPILER_HEADER ${COMP_DIR}/compiler/*.hpp)
|
||||
source_group(components\\compiler FILES ${COMPILER} ${COMPILER_HEADER})
|
||||
|
||||
file(GLOB INTERPRETER components/interpreter/*.cpp)
|
||||
file(GLOB INTERPRETER_HEADER components/interpreter/*.hpp)
|
||||
file(GLOB INTERPRETER ${COMP_DIR}/interpreter/*.cpp)
|
||||
file(GLOB INTERPRETER_HEADER ${COMP_DIR}/interpreter/*.hpp)
|
||||
source_group(components\\interpreter FILES ${INTERPRETER} ${INTERPRETER_HEADER})
|
||||
|
||||
set(COMPONENTS ${BSA} ${NIF} ${NIFOGRE} ${ESM_STORE} ${OGRE} ${INPUT} ${MISC}
|
||||
|
@ -1,7 +1,7 @@
|
||||
add_executable(mygui_test
|
||||
main.cpp
|
||||
${OGRE}
|
||||
${OGRE_HEADER}
|
||||
${BSA} ${BSA_HEADER}
|
||||
${OGRE} ${OGRE_HEADER}
|
||||
)
|
||||
target_link_libraries(mygui_test
|
||||
${OGRE_LIBRARIES}
|
||||
|
125
apps/mygui_dev/layout.hpp
Normal file
125
apps/mygui_dev/layout.hpp
Normal file
@ -0,0 +1,125 @@
|
||||
#ifndef ENGINE_MYGUI_LAYOUT_H
|
||||
#define ENGINE_MYGUI_LAYOUT_H
|
||||
|
||||
#include <assert.h>
|
||||
#include <MyGUI.h>
|
||||
|
||||
namespace GUI
|
||||
{
|
||||
/** The Layout class is an utility class used to load MyGUI layouts
|
||||
from xml files, and to manipulate member widgets.
|
||||
*/
|
||||
class Layout
|
||||
{
|
||||
public:
|
||||
Layout(const std::string & _layout, MyGUI::WidgetPtr _parent = nullptr)
|
||||
: mMainWidget(nullptr)
|
||||
{ initialise(_layout, _parent); }
|
||||
virtual ~Layout() { shutdown(); }
|
||||
|
||||
template <typename T>
|
||||
void getWidget(T * & _widget, const std::string & _name, bool _throw = true)
|
||||
{
|
||||
_widget = nullptr;
|
||||
for (MyGUI::VectorWidgetPtr::iterator iter=mListWindowRoot.begin();
|
||||
iter!=mListWindowRoot.end(); ++iter)
|
||||
{
|
||||
MyGUI::WidgetPtr find = (*iter)->findWidget(mPrefix + _name);
|
||||
if (nullptr != find)
|
||||
{
|
||||
T * cast = find->castType<T>(false);
|
||||
if (nullptr != cast)
|
||||
_widget = cast;
|
||||
else if (_throw)
|
||||
{
|
||||
MYGUI_EXCEPT("Error cast : dest type = '" << T::getClassTypeName()
|
||||
<< "' source name = '" << find->getName()
|
||||
<< "' source type = '" << find->getTypeName() << "' in layout '" << mLayoutName << "'");
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
MYGUI_ASSERT( ! _throw, "widget name '" << _name << "' in layout '" << mLayoutName << "' not found.");
|
||||
}
|
||||
|
||||
void initialise(const std::string & _layout,
|
||||
MyGUI::WidgetPtr _parent = nullptr)
|
||||
{
|
||||
const std::string MAIN_WINDOW = "_Main";
|
||||
mLayoutName = _layout;
|
||||
|
||||
if (mLayoutName.empty())
|
||||
mMainWidget = _parent;
|
||||
else
|
||||
{
|
||||
mPrefix = MyGUI::utility::toString(this, "_");
|
||||
mListWindowRoot = MyGUI::LayoutManager::getInstance().loadLayout(mLayoutName, mPrefix, _parent);
|
||||
|
||||
const std::string main_name = mPrefix + MAIN_WINDOW;
|
||||
for (MyGUI::VectorWidgetPtr::iterator iter=mListWindowRoot.begin(); iter!=mListWindowRoot.end(); ++iter)
|
||||
{
|
||||
if ((*iter)->getName() == main_name)
|
||||
{
|
||||
mMainWidget = (*iter);
|
||||
break;
|
||||
}
|
||||
}
|
||||
MYGUI_ASSERT(mMainWidget, "root widget name '" << MAIN_WINDOW << "' in layout '" << mLayoutName << "' not found.");
|
||||
}
|
||||
}
|
||||
|
||||
void shutdown()
|
||||
{
|
||||
for (VectorBasePtr::iterator iter=mListBase.begin(); iter!=mListBase.end(); ++iter) {
|
||||
delete (*iter);
|
||||
}
|
||||
mListBase.clear();
|
||||
|
||||
MyGUI::LayoutManager::getInstance().unloadLayout(mListWindowRoot);
|
||||
mListWindowRoot.clear();
|
||||
}
|
||||
|
||||
void setCoord(int x, int y, int w, int h)
|
||||
{
|
||||
mMainWidget->setCoord(x,y,w,h);
|
||||
}
|
||||
|
||||
void setVisible(bool b)
|
||||
{
|
||||
mMainWidget->setVisible(b);
|
||||
}
|
||||
|
||||
void setText(const std::string& name, const std::string& caption)
|
||||
{
|
||||
MyGUI::WidgetPtr pt;
|
||||
getWidget(pt, name);
|
||||
pt->setCaption(caption);
|
||||
}
|
||||
|
||||
void setTextColor(const std::string& name, float r, float g, float b)
|
||||
{
|
||||
MyGUI::WidgetPtr pt;
|
||||
getWidget(pt, name);
|
||||
MyGUI::StaticText *st = dynamic_cast<MyGUI::StaticText*>(pt);
|
||||
if(st != NULL)
|
||||
st->setTextColour(MyGUI::Colour(b,g,r));
|
||||
}
|
||||
|
||||
void setImage(const std::string& name, const std::string& imgName)
|
||||
{
|
||||
MyGUI::StaticImagePtr pt;
|
||||
getWidget(pt, name);
|
||||
pt->setImageTexture(imgName);
|
||||
}
|
||||
|
||||
protected:
|
||||
|
||||
MyGUI::WidgetPtr mMainWidget;
|
||||
std::string mPrefix;
|
||||
std::string mLayoutName;
|
||||
MyGUI::VectorWidgetPtr mListWindowRoot;
|
||||
typedef std::vector<Layout*> VectorBasePtr;
|
||||
VectorBasePtr mListBase;
|
||||
};
|
||||
}
|
||||
#endif
|
@ -1,13 +1,45 @@
|
||||
#include <iostream>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
using namespace std;
|
||||
|
||||
#include <MyGUI.h>
|
||||
#include <MyGUI_OgrePlatform.h>
|
||||
using namespace MyGUI;
|
||||
#include "manager.hpp"
|
||||
#include "layout.hpp"
|
||||
#include "mw_layouts.hpp"
|
||||
|
||||
#include <components/engine/ogre/renderer.hpp>
|
||||
#include <OgreResourceGroupManager.h>
|
||||
|
||||
#include <components/bsa/bsa_archive.hpp>
|
||||
|
||||
// Frame listener
|
||||
struct Listener : public Ogre::FrameListener
|
||||
{
|
||||
bool exit;
|
||||
float total;
|
||||
int step;
|
||||
|
||||
Listener() : exit(false), total(0.0), step(0) {}
|
||||
|
||||
bool frameStarted(const Ogre::FrameEvent &evt)
|
||||
{
|
||||
total += evt.timeSinceLastFrame;
|
||||
|
||||
// Countdown to exit
|
||||
const int MAX = 5;
|
||||
if(total >= step)
|
||||
{
|
||||
step++;
|
||||
if(step<MAX)
|
||||
cout << "Exit in " << (MAX-step) << endl;
|
||||
else
|
||||
exit = true;
|
||||
}
|
||||
|
||||
return !exit;
|
||||
}
|
||||
};
|
||||
|
||||
int main()
|
||||
{
|
||||
Render::OgreRenderer ogre;
|
||||
@ -15,21 +47,56 @@ int main()
|
||||
ogre.createWindow("MyGUI test");
|
||||
ogre.createScene();
|
||||
|
||||
// Disable MyGUI logging
|
||||
LogManager::initialise();
|
||||
LogManager::setSTDOutputEnabled(false);
|
||||
Listener listener;
|
||||
ogre.getRoot()->addFrameListener(&listener);
|
||||
|
||||
// Set up OGRE connection to MyGUI
|
||||
OgrePlatform *platform = new OgrePlatform();
|
||||
platform->initialise(ogre.getWindow(), ogre.getScene());
|
||||
|
||||
// Create GUI
|
||||
Gui *gui = new Gui();
|
||||
gui->initialise();
|
||||
|
||||
// Add the Morrowind windows resources
|
||||
cout << "Adding data path and BSA\n";
|
||||
// Add the Morrowind window resources
|
||||
Ogre::ResourceGroupManager::getSingleton().
|
||||
addResourceLocation("resources/mygui/", "FileSystem", "General");
|
||||
|
||||
// And add the BSA, since most of the window bitmaps are located
|
||||
// there
|
||||
addBSA("data/Morrowind.bsa");
|
||||
|
||||
// Make sure you load the data paths BEFORE you initialize the
|
||||
// GUI. MyGUI depends on finding core.xml in resources/mygui/.
|
||||
cout << "Setting up MyGUI\n";
|
||||
GUI::MyGUIManager gui(ogre.getWindow(), ogre.getScene());
|
||||
|
||||
int w = ogre.getWindow()->getWidth();
|
||||
int h = ogre.getWindow()->getHeight();
|
||||
|
||||
cout << "Setting up the window layouts\n";
|
||||
MWGUI::HUD hud(w,h);
|
||||
MWGUI::MapWindow map;
|
||||
MWGUI::MainMenu menu(w,h);
|
||||
MWGUI::StatsWindow stats;
|
||||
|
||||
hud.setVisible(true);
|
||||
map.setVisible(true);
|
||||
menu.setVisible(false);
|
||||
stats.setVisible(true);
|
||||
|
||||
cout << "Starting rendering loop\n";
|
||||
ogre.start();
|
||||
ogre.screenshot("mygui_test.png");
|
||||
|
||||
cout << "Done.\n";
|
||||
return 0;
|
||||
}
|
||||
|
||||
/// Old D function
|
||||
/*
|
||||
extern "C" MyGUI::WidgetPtr gui_createText(const char *skin,
|
||||
int32_t x, int32_t y,
|
||||
int32_t w, int32_t h,
|
||||
const char *layer)
|
||||
{
|
||||
return mGUI->createWidget<MyGUI::StaticText>
|
||||
(skin,
|
||||
x,y,w,h,
|
||||
MyGUI::ALIGN_LEFT | MyGUI::ALIGN_TOP,
|
||||
layer);
|
||||
}
|
||||
*/
|
||||
|
58
apps/mygui_dev/manager.hpp
Normal file
58
apps/mygui_dev/manager.hpp
Normal file
@ -0,0 +1,58 @@
|
||||
#ifndef ENGINE_MYGUI_MANAGER_H
|
||||
#define ENGINE_MYGUI_MANAGER_H
|
||||
|
||||
#include <assert.h>
|
||||
#include <MyGUI.h>
|
||||
#include <MyGUI_OgrePlatform.h>
|
||||
|
||||
namespace GUI
|
||||
{
|
||||
class MyGUIManager
|
||||
{
|
||||
MyGUI::OgrePlatform *mPlatform;
|
||||
MyGUI::Gui *mGui;
|
||||
|
||||
public:
|
||||
MyGUIManager() : mPlatform(NULL), mGui(NULL) {}
|
||||
MyGUIManager(Ogre::RenderWindow *wnd, Ogre::SceneManager *mgr, bool logging=false)
|
||||
{ setup(wnd,mgr,logging); }
|
||||
~MyGUIManager() { shutdown(); }
|
||||
|
||||
void setup(Ogre::RenderWindow *wnd, Ogre::SceneManager *mgr, bool logging=false)
|
||||
{
|
||||
assert(wnd);
|
||||
assert(mgr);
|
||||
|
||||
using namespace MyGUI;
|
||||
|
||||
// Enable/disable MyGUI logging to stdout. (Logging to MyGUI.log
|
||||
// is still enabled.) In order to do this we have to initialize
|
||||
// the log manager before the main gui system itself, otherwise
|
||||
// the main object will get the chance to spit out a few messages
|
||||
// before we can able to disable it.
|
||||
LogManager::initialise();
|
||||
LogManager::setSTDOutputEnabled(logging);
|
||||
|
||||
// Set up OGRE platform. We might make this more generic later.
|
||||
mPlatform = new OgrePlatform();
|
||||
mPlatform->initialise(wnd, mgr);
|
||||
|
||||
// Create GUI
|
||||
mGui = new Gui();
|
||||
mGui->initialise();
|
||||
}
|
||||
|
||||
void shutdown()
|
||||
{
|
||||
if(mGui) delete mGui;
|
||||
if(mPlatform)
|
||||
{
|
||||
mPlatform->shutdown();
|
||||
delete mPlatform;
|
||||
}
|
||||
mGui = NULL;
|
||||
mPlatform = NULL;
|
||||
}
|
||||
};
|
||||
}
|
||||
#endif
|
188
apps/mygui_dev/mw_layouts.hpp
Normal file
188
apps/mygui_dev/mw_layouts.hpp
Normal file
@ -0,0 +1,188 @@
|
||||
#ifndef MWGUI_LAYOUTS_H
|
||||
#define MWGUI_LAYOUTS_H
|
||||
|
||||
#include "layout.hpp"
|
||||
|
||||
namespace MWGUI
|
||||
{
|
||||
class HUD : public GUI::Layout
|
||||
{
|
||||
public:
|
||||
HUD(int width, int height)
|
||||
: Layout("openmw_hud_layout.xml")
|
||||
{
|
||||
setCoord(0,0, width, height);
|
||||
|
||||
// Energy bars
|
||||
getWidget(health, "Health");
|
||||
getWidget(magicka, "Magicka");
|
||||
getWidget(stamina, "Stamina");
|
||||
|
||||
// Item and spell images and status bars
|
||||
getWidget(weapImage, "WeapImage");
|
||||
getWidget(weapStatus, "WeapStatus");
|
||||
getWidget(spellImage, "SpellImage");
|
||||
getWidget(spellStatus, "SpellStatus");
|
||||
|
||||
getWidget(effectBox, "EffectBox");
|
||||
getWidget(effect1, "Effect1");
|
||||
|
||||
getWidget(minimap, "MiniMap");
|
||||
getWidget(compass, "Compass");
|
||||
|
||||
getWidget(crosshair, "Crosshair");
|
||||
|
||||
compass->setImageTexture("compass.dds");
|
||||
crosshair->setImageTexture("target.dds");
|
||||
|
||||
// These are just demo values, you should replace these with
|
||||
// real calls from outside the class later.
|
||||
setStats(60, 100,
|
||||
30, 100,
|
||||
80, 100);
|
||||
setWeapIcon("icons\\w\\tx_knife_iron.dds");
|
||||
setWeapStatus(90, 100);
|
||||
setSpellIcon("icons\\s\\b_tx_s_rstor_health.dds");
|
||||
setSpellStatus(65, 100);
|
||||
setEffect("icons\\s\\tx_s_chameleon.dds");
|
||||
}
|
||||
|
||||
void setStats(int h, int hmax, int m, int mmax, int s, int smax)
|
||||
{
|
||||
health->setProgressRange(hmax);
|
||||
health->setProgressPosition(h);
|
||||
magicka->setProgressRange(mmax);
|
||||
magicka->setProgressPosition(m);
|
||||
stamina->setProgressRange(smax);
|
||||
stamina->setProgressPosition(s);
|
||||
}
|
||||
|
||||
void setWeapIcon(const char *str)
|
||||
{ weapImage->setImageTexture(str); }
|
||||
void setSpellIcon(const char *str)
|
||||
{ spellImage->setImageTexture(str); }
|
||||
|
||||
void setWeapStatus(int s, int smax)
|
||||
{
|
||||
weapStatus->setProgressRange(smax);
|
||||
weapStatus->setProgressPosition(s);
|
||||
}
|
||||
void setSpellStatus(int s, int smax)
|
||||
{
|
||||
spellStatus->setProgressRange(smax);
|
||||
spellStatus->setProgressPosition(s);
|
||||
}
|
||||
|
||||
void setEffect(const char *img)
|
||||
{ effect1->setImageTexture(img); }
|
||||
|
||||
MyGUI::ProgressPtr health, magicka, stamina;
|
||||
|
||||
MyGUI::StaticImagePtr weapImage, spellImage;
|
||||
MyGUI::ProgressPtr weapStatus, spellStatus;
|
||||
|
||||
MyGUI::WidgetPtr effectBox;
|
||||
MyGUI::StaticImagePtr effect1;
|
||||
|
||||
MyGUI::StaticImagePtr minimap;
|
||||
MyGUI::StaticImagePtr compass;
|
||||
|
||||
MyGUI::StaticImagePtr crosshair;
|
||||
};
|
||||
|
||||
class MapWindow : public GUI::Layout
|
||||
{
|
||||
public:
|
||||
MapWindow()
|
||||
: Layout("openmw_map_window_layout.xml")
|
||||
{
|
||||
setCoord(500,0,320,300);
|
||||
setText("WorldButton", "World");
|
||||
setImage("Compass", "compass.dds");
|
||||
|
||||
// Obviously you should override this later on
|
||||
setCellName("No Cell Loaded");
|
||||
}
|
||||
|
||||
void setCellName(const std::string& cellName)
|
||||
{
|
||||
mMainWidget->setCaption(cellName);
|
||||
}
|
||||
};
|
||||
|
||||
class MainMenu : public GUI::Layout
|
||||
{
|
||||
public:
|
||||
MainMenu(int w, int h)
|
||||
: Layout("openmw_mainmenu_layout.xml")
|
||||
{
|
||||
setCoord(0,0,w,h);
|
||||
}
|
||||
};
|
||||
|
||||
class StatsWindow : public GUI::Layout
|
||||
{
|
||||
public:
|
||||
void setBar(const char* name, const char* tname, int val, int max)
|
||||
{
|
||||
MyGUI::ProgressPtr pt;
|
||||
getWidget(pt, name);
|
||||
pt->setProgressRange(max);
|
||||
pt->setProgressPosition(val);
|
||||
|
||||
std::stringstream out;
|
||||
out << val << "/" << max;
|
||||
setText(tname, out.str().c_str());
|
||||
}
|
||||
|
||||
StatsWindow()
|
||||
: Layout("openmw_stats_window_layout.xml")
|
||||
{
|
||||
setCoord(0,0,498, 342);
|
||||
|
||||
setText("Health_str", "Health");
|
||||
setText("Magicka_str", "Magicka");
|
||||
setText("Fatigue_str", "Fatigue");
|
||||
|
||||
setText("Level_str", "Level");
|
||||
setText("Race_str", "Race");
|
||||
setText("Class_str", "Class");
|
||||
|
||||
setText("Attrib1", "Strength");
|
||||
setText("Attrib2", "Intelligence");
|
||||
setText("Attrib3", "Willpower");
|
||||
setText("Attrib4", "Agility");
|
||||
setText("Attrib5", "Speed");
|
||||
setText("Attrib6", "Endurance");
|
||||
setText("Attrib7", "Personality");
|
||||
setText("Attrib8", "Luck");
|
||||
|
||||
// These are just demo values, you should replace these with
|
||||
// real calls from outside the class later.
|
||||
setPlayerName("ThePlayer");
|
||||
|
||||
setText("LevelText", "5");
|
||||
setText("RaceText", "Wood Elf");
|
||||
setText("ClassText", "Pilgrim");
|
||||
|
||||
setBar("HBar", "HBarT", 60, 100);
|
||||
setBar("MBar", "MBarT", 30, 100);
|
||||
setBar("FBar", "FBarT", 80, 100);
|
||||
|
||||
setText("AttribVal1", "30");
|
||||
setText("AttribVal2", "40");
|
||||
setText("AttribVal3", "30");
|
||||
setText("AttribVal4", "75");
|
||||
setText("AttribVal5", "50");
|
||||
setText("AttribVal6", "40");
|
||||
setText("AttribVal7", "50");
|
||||
setText("AttribVal8", "40");
|
||||
}
|
||||
|
||||
void setPlayerName(const std::string& playerName)
|
||||
{
|
||||
mMainWidget->setCaption(playerName);
|
||||
}
|
||||
};
|
||||
}
|
||||
#endif
|
@ -5,42 +5,42 @@ as around the sections of the stats window, or around popup info windows -->
|
||||
|
||||
<MyGUI type="Skin">
|
||||
<!-- Box borders -->
|
||||
<Skin name="IB_T" size="512 2" texture="menu_thin_border_top.dds">
|
||||
<Skin name="IB_T" size="512 2" texture="textures\menu_thin_border_top.dds">
|
||||
<BasisSkin type="MainSkin" offset = "0 0 512 2">
|
||||
<State name="normal" offset = "0 0 512 2"/>
|
||||
</BasisSkin>
|
||||
</Skin>
|
||||
<Skin name="IB_B" size="512 2" texture="menu_thin_border_bottom.dds">
|
||||
<Skin name="IB_B" size="512 2" texture="textures\menu_thin_border_bottom.dds">
|
||||
<BasisSkin type="MainSkin" offset = "0 0 512 2">
|
||||
<State name="normal" offset = "0 0 512 2"/>
|
||||
</BasisSkin>
|
||||
</Skin>
|
||||
<Skin name="IB_L" size="2 512" texture="menu_thin_border_left.dds">
|
||||
<Skin name="IB_L" size="2 512" texture="textures\menu_thin_border_left.dds">
|
||||
<BasisSkin type="MainSkin" offset = "0 0 2 512">
|
||||
<State name="normal" offset = "0 0 2 512"/>
|
||||
</BasisSkin>
|
||||
</Skin>
|
||||
<Skin name="IB_R" size="2 512" texture="menu_thin_border_right.dds">
|
||||
<Skin name="IB_R" size="2 512" texture="textures\menu_thin_border_right.dds">
|
||||
<BasisSkin type="MainSkin" offset = "0 0 2 512">
|
||||
<State name="normal" offset = "0 0 2 512"/>
|
||||
</BasisSkin>
|
||||
</Skin>
|
||||
<Skin name="IB_TL" size="2 2" texture="menu_thin_border_top_left_corner.dds">
|
||||
<Skin name="IB_TL" size="2 2" texture="textures\menu_thin_border_top_left_corner.dds">
|
||||
<BasisSkin type="MainSkin" offset = "0 0 2 2">
|
||||
<State name="normal" offset = "0 0 2 2"/>
|
||||
</BasisSkin>
|
||||
</Skin>
|
||||
<Skin name="IB_TR" size="2 2" texture="menu_thin_border_top_right_corner.dds">
|
||||
<Skin name="IB_TR" size="2 2" texture="textures\menu_thin_border_top_right_corner.dds">
|
||||
<BasisSkin type="MainSkin" offset = "0 0 2 2">
|
||||
<State name="normal" offset = "0 0 2 2"/>
|
||||
</BasisSkin>
|
||||
</Skin>
|
||||
<Skin name="IB_BL" size="2 2" texture="menu_thin_border_bottom_left_corner.dds">
|
||||
<Skin name="IB_BL" size="2 2" texture="textures\menu_thin_border_bottom_left_corner.dds">
|
||||
<BasisSkin type="MainSkin" offset = "0 0 2 2">
|
||||
<State name="normal" offset = "0 0 2 2"/>
|
||||
</BasisSkin>
|
||||
</Skin>
|
||||
<Skin name="IB_BR" size="2 2" texture="menu_thin_border_bottom_right_corner.dds">
|
||||
<Skin name="IB_BR" size="2 2" texture="textures\menu_thin_border_bottom_right_corner.dds">
|
||||
<BasisSkin type="MainSkin" offset = "0 0 2 2">
|
||||
<State name="normal" offset = "0 0 2 2"/>
|
||||
</BasisSkin>
|
||||
|
@ -2,42 +2,42 @@
|
||||
|
||||
<MyGUI type="Skin">
|
||||
<!-- Button graphics -->
|
||||
<Skin name="BTN_Top" size="128 4" texture="menu_button_frame_top.dds">
|
||||
<Skin name="BTN_Top" size="128 4" texture="textures\menu_button_frame_top.dds">
|
||||
<BasisSkin type="MainSkin" offset = "0 0 128 4">
|
||||
<State name="normal" offset = "0 0 128 4"/>
|
||||
</BasisSkin>
|
||||
</Skin>
|
||||
<Skin name="BTN_Bottom" size="128 4" texture="menu_button_frame_bottom.dds">
|
||||
<Skin name="BTN_Bottom" size="128 4" texture="textures\menu_button_frame_bottom.dds">
|
||||
<BasisSkin type="MainSkin" offset = "0 0 128 4">
|
||||
<State name="normal" offset = "0 0 128 4"/>
|
||||
</BasisSkin>
|
||||
</Skin>
|
||||
<Skin name="BTN_Left" size="4 16" texture="menu_button_frame_left.dds">
|
||||
<Skin name="BTN_Left" size="4 16" texture="textures\menu_button_frame_left.dds">
|
||||
<BasisSkin type="MainSkin" offset = "0 0 4 16">
|
||||
<State name="normal" offset = "0 0 4 16"/>
|
||||
</BasisSkin>
|
||||
</Skin>
|
||||
<Skin name="BTN_Right" size="4 16" texture="menu_button_frame_right.dds">
|
||||
<Skin name="BTN_Right" size="4 16" texture="textures\menu_button_frame_right.dds">
|
||||
<BasisSkin type="MainSkin" offset = "0 0 4 16">
|
||||
<State name="normal" offset = "0 0 4 16"/>
|
||||
</BasisSkin>
|
||||
</Skin>
|
||||
<Skin name="BTN_TopLeft" size="4 4" texture="menu_button_frame_top_left_corner.dds">
|
||||
<Skin name="BTN_TopLeft" size="4 4" texture="textures\menu_button_frame_top_left_corner.dds">
|
||||
<BasisSkin type="MainSkin" offset = "0 0 4 4">
|
||||
<State name="normal" offset = "0 0 4 4"/>
|
||||
</BasisSkin>
|
||||
</Skin>
|
||||
<Skin name="BTN_TopRight" size="4 4" texture="menu_button_frame_top_right_corner.dds">
|
||||
<Skin name="BTN_TopRight" size="4 4" texture="textures\menu_button_frame_top_right_corner.dds">
|
||||
<BasisSkin type="MainSkin" offset = "0 0 4 4">
|
||||
<State name="normal" offset = "0 0 4 4"/>
|
||||
</BasisSkin>
|
||||
</Skin>
|
||||
<Skin name="BTN_BottomLeft" size="4 4" texture="menu_button_frame_bottom_left_corner.dds">
|
||||
<Skin name="BTN_BottomLeft" size="4 4" texture="textures\menu_button_frame_bottom_left_corner.dds">
|
||||
<BasisSkin type="MainSkin" offset = "0 0 4 4">
|
||||
<State name="normal" offset = "0 0 4 4"/>
|
||||
</BasisSkin>
|
||||
</Skin>
|
||||
<Skin name="BTN_BottomRight" size="4 4" texture="menu_button_frame_bottom_right_corner.dds">
|
||||
<Skin name="BTN_BottomRight" size="4 4" texture="textures\menu_button_frame_bottom_right_corner.dds">
|
||||
<BasisSkin type="MainSkin" offset = "0 0 4 4">
|
||||
<State name="normal" offset = "0 0 4 4"/>
|
||||
</BasisSkin>
|
||||
|
@ -2,7 +2,7 @@
|
||||
|
||||
<MyGUI type="Skin">
|
||||
<!-- The 'box' frame that surrounds various HUD items and other elements -->
|
||||
<Skin name="HUD_Box" size="40 40" texture="menu_icon_equip.dds">
|
||||
<Skin name="HUD_Box" size="40 40" texture="textures\menu_icon_equip.dds">
|
||||
<BasisSkin type="SubSkin" offset="0 0 40 2" align= "ALIGN_TOP ALIGN_HSTRETCH">
|
||||
<State name="normal" offset="2 2 40 2"/>
|
||||
</BasisSkin>
|
||||
|
@ -2,17 +2,17 @@
|
||||
|
||||
<MyGUI type="Skin">
|
||||
<!-- Energy bar frame graphics -->
|
||||
<Skin name="HUD_Bar_Top" size="64 2" texture="menu_small_energy_bar_top.dds">
|
||||
<Skin name="HUD_Bar_Top" size="64 2" texture="textures\menu_small_energy_bar_top.dds">
|
||||
<BasisSkin type="MainSkin" offset = "0 0 64 2">
|
||||
<State name="normal" offset = "0 0 64 2"/>
|
||||
</BasisSkin>
|
||||
</Skin>
|
||||
<Skin name="HUD_Bar_Bottom" size="64 2" texture="menu_small_energy_bar_bottom.dds">
|
||||
<Skin name="HUD_Bar_Bottom" size="64 2" texture="textures\menu_small_energy_bar_bottom.dds">
|
||||
<BasisSkin type="MainSkin" offset = "0 0 64 2">
|
||||
<State name="normal" offset = "0 0 64 2"/>
|
||||
</BasisSkin>
|
||||
</Skin>
|
||||
<Skin name="HUD_Bar_Side" size="2 8" texture="menu_small_energy_bar_vert.dds">
|
||||
<Skin name="HUD_Bar_Side" size="2 8" texture="textures\menu_small_energy_bar_vert.dds">
|
||||
<BasisSkin type="MainSkin" offset = "0 0 2 8">
|
||||
<State name="normal" offset = "0 0 2 8"/>
|
||||
</BasisSkin>
|
||||
|
@ -1,32 +1,32 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
|
||||
<MyGUI type="Skin">
|
||||
<Skin name="ReturnButton" size="128 64" texture="menu_return.dds">
|
||||
<Skin name="ReturnButton" size="128 64" texture="textures\menu_return.dds">
|
||||
<BasisSkin type="MainSkin" offset = "0 0 128 64">
|
||||
<State name="normal" offset = "0 0 128 64"/>
|
||||
</BasisSkin>
|
||||
</Skin>
|
||||
<Skin name="NewButton" size="128 64" texture="menu_newgame.dds">
|
||||
<Skin name="NewButton" size="128 64" texture="textures\menu_newgame.dds">
|
||||
<BasisSkin type="MainSkin" offset = "0 0 128 64">
|
||||
<State name="normal" offset = "0 0 128 64"/>
|
||||
</BasisSkin>
|
||||
</Skin>
|
||||
<Skin name="SaveButton" size="128 64" texture="menu_savegame.dds">
|
||||
<Skin name="SaveButton" size="128 64" texture="textures\menu_savegame.dds">
|
||||
<BasisSkin type="MainSkin" offset = "0 0 128 64">
|
||||
<State name="normal" offset = "0 0 128 64"/>
|
||||
</BasisSkin>
|
||||
</Skin>
|
||||
<Skin name="LoadButton" size="128 64" texture="menu_loadgame.dds">
|
||||
<Skin name="LoadButton" size="128 64" texture="textures\menu_loadgame.dds">
|
||||
<BasisSkin type="MainSkin" offset = "0 0 128 64">
|
||||
<State name="normal" offset = "0 0 128 64"/>
|
||||
</BasisSkin>
|
||||
</Skin>
|
||||
<Skin name="OptionsButton" size="128 64" texture="menu_options.dds">
|
||||
<Skin name="OptionsButton" size="128 64" texture="textures\menu_options.dds">
|
||||
<BasisSkin type="MainSkin" offset = "0 0 128 64">
|
||||
<State name="normal" offset = "0 0 128 64"/>
|
||||
</BasisSkin>
|
||||
</Skin>
|
||||
<Skin name="ExitButton" size="128 64" texture="menu_exitgame.dds">
|
||||
<Skin name="ExitButton" size="128 64" texture="textures\menu_exitgame.dds">
|
||||
<BasisSkin type="MainSkin" offset = "0 0 128 64">
|
||||
<State name="normal" offset = "0 0 128 64"/>
|
||||
</BasisSkin>
|
||||
|
@ -9,28 +9,28 @@
|
||||
</Skin>
|
||||
|
||||
<!-- These define the window borders -->
|
||||
<Skin name="TB_B" size="512 4" texture="menu_thick_border_bottom.dds">
|
||||
<Skin name="TB_B" size="512 4" texture="textures\menu_thick_border_bottom.dds">
|
||||
<Property key="Pointer" value = "vresize" />
|
||||
<BasisSkin type="MainSkin" offset = "0 0 512 4">
|
||||
<State name="normal" offset = "0 0 512 4"/>
|
||||
</BasisSkin>
|
||||
</Skin>
|
||||
|
||||
<Skin name="TB_R" size="4 512" texture="menu_thick_border_right.dds">
|
||||
<Skin name="TB_R" size="4 512" texture="textures\menu_thick_border_right.dds">
|
||||
<Property key="Pointer" value = "hresize" />
|
||||
<BasisSkin type="MainSkin" offset = "0 0 4 512">
|
||||
<State name="normal" offset = "0 0 4 512"/>
|
||||
</BasisSkin>
|
||||
</Skin>
|
||||
|
||||
<Skin name="TB_T" size="512 4" texture="menu_thick_border_top.dds">
|
||||
<Skin name="TB_T" size="512 4" texture="textures\menu_thick_border_top.dds">
|
||||
<Property key="Pointer" value = "vresize" />
|
||||
<BasisSkin type="MainSkin" offset = "0 0 512 4">
|
||||
<State name="normal" offset = "0 0 512 4"/>
|
||||
</BasisSkin>
|
||||
</Skin>
|
||||
|
||||
<Skin name="TB_L" size="4 512" texture="menu_thick_border_left.dds">
|
||||
<Skin name="TB_L" size="4 512" texture="textures\menu_thick_border_left.dds">
|
||||
<Property key="Pointer" value = "hresize" />
|
||||
<BasisSkin type="MainSkin" offset = "0 0 4 512">
|
||||
<State name="normal" offset = "0 0 4 512"/>
|
||||
@ -38,25 +38,25 @@
|
||||
</Skin>
|
||||
|
||||
<!-- Window border corners -->
|
||||
<Skin name="TB_BR" size="4 4" texture="menu_thick_border_bottom_right_corner.dds">
|
||||
<Skin name="TB_BR" size="4 4" texture="textures\menu_thick_border_bottom_right_corner.dds">
|
||||
<Property key="Pointer" value = "dresize" />
|
||||
<BasisSkin type="MainSkin" offset = "0 0 4 4">
|
||||
<State name="normal" offset = "0 0 4 4"/>
|
||||
</BasisSkin>
|
||||
</Skin>
|
||||
<Skin name="TB_BL" size="4 4" texture="menu_thick_border_bottom_left_corner.dds">
|
||||
<Skin name="TB_BL" size="4 4" texture="textures\menu_thick_border_bottom_left_corner.dds">
|
||||
<Property key="Pointer" value = "dresize2" />
|
||||
<BasisSkin type="MainSkin" offset = "0 0 4 4">
|
||||
<State name="normal" offset = "0 0 4 4"/>
|
||||
</BasisSkin>
|
||||
</Skin>
|
||||
<Skin name="TB_TR" size="4 4" texture="menu_thick_border_top_right_corner.dds">
|
||||
<Skin name="TB_TR" size="4 4" texture="textures\menu_thick_border_top_right_corner.dds">
|
||||
<Property key="Pointer" value = "dresize2" />
|
||||
<BasisSkin type="MainSkin" offset = "0 0 4 4">
|
||||
<State name="normal" offset = "0 0 4 4"/>
|
||||
</BasisSkin>
|
||||
</Skin>
|
||||
<Skin name="TB_TL" size="4 4" texture="menu_thick_border_top_left_corner.dds">
|
||||
<Skin name="TB_TL" size="4 4" texture="textures\menu_thick_border_top_left_corner.dds">
|
||||
<Property key="Pointer" value = "dresize" />
|
||||
<BasisSkin type="MainSkin" offset = "0 0 4 4">
|
||||
<State name="normal" offset = "0 0 4 4"/>
|
||||
@ -64,52 +64,52 @@
|
||||
</Skin>
|
||||
|
||||
<!-- These parts defines the 'blocks' to the left and right of the caption -->
|
||||
<Skin name="HB_MID" size="256 16" texture="menu_head_block_middle.dds">
|
||||
<Skin name="HB_MID" size="256 16" texture="textures\menu_head_block_middle.dds">
|
||||
<BasisSkin type="MainSkin" offset = "0 0 256 16">
|
||||
<State name="normal" offset = "0 0 256 16"/>
|
||||
</BasisSkin>
|
||||
</Skin>
|
||||
|
||||
<Skin name="HB_TOP" size="256 2" texture="menu_head_block_top.dds">
|
||||
<Skin name="HB_TOP" size="256 2" texture="textures\menu_head_block_top.dds">
|
||||
<BasisSkin type="MainSkin" offset = "0 0 256 2">
|
||||
<State name="normal" offset = "0 0 256 2"/>
|
||||
</BasisSkin>
|
||||
</Skin>
|
||||
|
||||
<Skin name="HB_BOTTOM" size="256 2" texture="menu_head_block_bottom.dds">
|
||||
<Skin name="HB_BOTTOM" size="256 2" texture="textures\menu_head_block_bottom.dds">
|
||||
<BasisSkin type="MainSkin" offset = "0 0 256 2">
|
||||
<State name="normal" offset = "0 0 256 2"/>
|
||||
</BasisSkin>
|
||||
</Skin>
|
||||
|
||||
<Skin name="HB_LEFT" size="2 16" texture="menu_head_block_left.dds">
|
||||
<Skin name="HB_LEFT" size="2 16" texture="textures\menu_head_block_left.dds">
|
||||
<BasisSkin type="MainSkin" offset = "0 0 2 16">
|
||||
<State name="normal" offset = "0 0 2 16"/>
|
||||
</BasisSkin>
|
||||
</Skin>
|
||||
|
||||
<Skin name="HB_RIGHT" size="2 16" texture="menu_head_block_right.dds">
|
||||
<Skin name="HB_RIGHT" size="2 16" texture="textures\menu_head_block_right.dds">
|
||||
<BasisSkin type="MainSkin" offset = "0 0 2 16">
|
||||
<State name="normal" offset = "0 0 2 16"/>
|
||||
</BasisSkin>
|
||||
</Skin>
|
||||
|
||||
<Skin name="HB_TR" size="2 2" texture="menu_head_block_top_right_corner.dds">
|
||||
<Skin name="HB_TR" size="2 2" texture="textures\menu_head_block_top_right_corner.dds">
|
||||
<BasisSkin type="MainSkin" offset = "0 0 2 2">
|
||||
<State name="normal" offset = "0 0 2 2"/>
|
||||
</BasisSkin>
|
||||
</Skin>
|
||||
<Skin name="HB_TL" size="2 2" texture="menu_head_block_top_left_corner.dds">
|
||||
<Skin name="HB_TL" size="2 2" texture="textures\menu_head_block_top_left_corner.dds">
|
||||
<BasisSkin type="MainSkin" offset = "0 0 2 2">
|
||||
<State name="normal" offset = "0 0 2 2"/>
|
||||
</BasisSkin>
|
||||
</Skin>
|
||||
<Skin name="HB_BR" size="2 2" texture="menu_head_block_bottom_right_corner.dds">
|
||||
<Skin name="HB_BR" size="2 2" texture="textures\menu_head_block_bottom_right_corner.dds">
|
||||
<BasisSkin type="MainSkin" offset = "0 0 2 2">
|
||||
<State name="normal" offset = "0 0 2 2"/>
|
||||
</BasisSkin>
|
||||
</Skin>
|
||||
<Skin name="HB_BL" size="2 2" texture="menu_head_block_bottom_left_corner.dds">
|
||||
<Skin name="HB_BL" size="2 2" texture="textures\menu_head_block_bottom_left_corner.dds">
|
||||
<BasisSkin type="MainSkin" offset = "0 0 2 2">
|
||||
<State name="normal" offset = "0 0 2 2"/>
|
||||
</BasisSkin>
|
||||
|
@ -1,62 +0,0 @@
|
||||
/*
|
||||
OpenMW - The completely unofficial reimplementation of Morrowind
|
||||
Copyright (C) 2008 Nicolay Korslund
|
||||
Email: < korslund@gmail.com >
|
||||
WWW: http://openmw.snaptoad.com/
|
||||
|
||||
This file (bindings.d) is part of the OpenMW package.
|
||||
|
||||
OpenMW is distributed as free software: you can redistribute it
|
||||
and/or modify it under the terms of the GNU General Public License
|
||||
version 3, as published by the Free Software Foundation.
|
||||
|
||||
This program is distributed in the hope that it will be useful, but
|
||||
WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
version 3 along with this program. If not, see
|
||||
http://www.gnu.org/licenses/ .
|
||||
|
||||
*/
|
||||
|
||||
module gui.bindings;
|
||||
|
||||
extern(C):
|
||||
|
||||
// GUI functions. Under development. The corresponding C++ functions
|
||||
// are in cpp_mygui.cpp
|
||||
|
||||
typedef void* WidgetPtr;
|
||||
void gui_setupGUI(int debugOut);
|
||||
void gui_toggleGui();
|
||||
void gui_setCellName(char *str);
|
||||
void gui_showHUD();
|
||||
|
||||
// Console stuff
|
||||
void gui_toggleConsole();
|
||||
void gui_setConsoleFont(char*);
|
||||
void gui_clearConsole();
|
||||
|
||||
// Get the widget type, as a string
|
||||
char *gui_widgetType(WidgetPtr);
|
||||
|
||||
// Get the guiMode flag
|
||||
int *gui_getGuiModePtr();
|
||||
|
||||
// Get the height or width of a widget. If the argument is null,
|
||||
// return the size of the screen.
|
||||
int gui_getHeight(WidgetPtr);
|
||||
int gui_getWidth(WidgetPtr);
|
||||
|
||||
// Set various properties of a given widget
|
||||
void gui_setCaption(WidgetPtr, char*);
|
||||
void gui_setNeedMouseFocus(WidgetPtr, int);
|
||||
void gui_setTextColor(WidgetPtr, float,float,float);
|
||||
void gui_setCoord(WidgetPtr, int,int,int,int);
|
||||
|
||||
// Various ways to get or create widgets
|
||||
WidgetPtr gui_loadLayout(char *file, char *prefix, WidgetPtr parent);
|
||||
WidgetPtr gui_getChild(WidgetPtr, char*);
|
||||
WidgetPtr gui_createText(char *skin, int x, int y, int w, int h, char *layer);
|
@ -1,396 +1,3 @@
|
||||
/*
|
||||
OpenMW - The completely unofficial reimplementation of Morrowind
|
||||
Copyright (C) 2008 Nicolay Korslund
|
||||
Email: < korslund@gmail.com >
|
||||
WWW: http://openmw.snaptoad.com/
|
||||
|
||||
This file (cpp_mygui.cpp) is part of the OpenMW package.
|
||||
|
||||
OpenMW is distributed as free software: you can redistribute it
|
||||
and/or modify it under the terms of the GNU General Public License
|
||||
version 3, as published by the Free Software Foundation.
|
||||
|
||||
This program is distributed in the hope that it will be useful, but
|
||||
WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
version 3 along with this program. If not, see
|
||||
http://www.gnu.org/licenses/ .
|
||||
|
||||
*/
|
||||
|
||||
// TODO: KILLME
|
||||
std::string cellName;
|
||||
|
||||
extern "C" void gui_setCellName(char *str)
|
||||
{
|
||||
cellName = str;
|
||||
}
|
||||
|
||||
// Get the widget type, as a string
|
||||
extern "C" const char *gui_widgetType(MyGUI::WidgetPtr p)
|
||||
{ return p->getTypeName().c_str(); }
|
||||
|
||||
extern "C" int32_t gui_getHeight(MyGUI::WidgetPtr p)
|
||||
{
|
||||
if(p == NULL) mWindow->getHeight();
|
||||
return p->getHeight();
|
||||
}
|
||||
|
||||
extern "C" int32_t gui_getWidth(MyGUI::WidgetPtr p)
|
||||
{
|
||||
if(p == NULL) return mWindow->getWidth();
|
||||
return p->getWidth();
|
||||
}
|
||||
|
||||
// Set various properties of a given widget
|
||||
extern "C" void gui_setCaption(MyGUI::WidgetPtr p, char* s)
|
||||
{
|
||||
p->setCaption(s);
|
||||
}
|
||||
|
||||
extern "C" void gui_setNeedMouseFocus(MyGUI::WidgetPtr p, int32_t b)
|
||||
{ p->setNeedMouseFocus(b); }
|
||||
|
||||
extern "C" void gui_setTextColor(MyGUI::WidgetPtr p, float r,float g,float b)
|
||||
{
|
||||
MyGUI::StaticText *st = dynamic_cast<MyGUI::StaticText*>(p);
|
||||
if(st != NULL)
|
||||
st->setTextColour(Ogre::ColourValue(b,g,r));
|
||||
}
|
||||
|
||||
extern "C" void gui_setCoord(MyGUI::WidgetPtr p,
|
||||
int32_t x,int32_t y,int32_t w,int32_t h)
|
||||
{ p->setCoord(x,y,w,h); }
|
||||
|
||||
// Various ways to get or create widgets
|
||||
extern "C" MyGUI::WidgetPtr gui_loadLayout(char *file, char *prefix,
|
||||
MyGUI::WidgetPtr parent)
|
||||
{
|
||||
// Get the list of Widgets in this layout
|
||||
MyGUI::VectorWidgetPtr wlist;
|
||||
wlist = MyGUI::LayoutManager::getInstance().
|
||||
loadLayout(file, prefix, parent);
|
||||
|
||||
MyGUI::VectorWidgetPtr::iterator iter;
|
||||
iter = wlist.begin();
|
||||
|
||||
// Return null if the list is empty
|
||||
if(wlist.end() == iter)
|
||||
return NULL;
|
||||
|
||||
MyGUI::WidgetPtr res = *iter;
|
||||
|
||||
++iter;
|
||||
|
||||
if(iter != wlist.end())
|
||||
std::cout << "WARNING: Layout '" << file
|
||||
<< "' has more than one root widget. Ignored.\n";
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
extern "C" MyGUI::WidgetPtr gui_getChild(MyGUI::WidgetPtr p, char* name)
|
||||
{
|
||||
return p->findWidget(name);
|
||||
}
|
||||
|
||||
extern "C" MyGUI::WidgetPtr gui_createText(const char *skin,
|
||||
int32_t x, int32_t y,
|
||||
int32_t w, int32_t h,
|
||||
const char *layer)
|
||||
{
|
||||
return mGUI->createWidget<MyGUI::StaticText>
|
||||
(skin,
|
||||
x,y,w,h,
|
||||
MyGUI::ALIGN_LEFT | MyGUI::ALIGN_TOP,
|
||||
layer);
|
||||
}
|
||||
|
||||
// Copied from MyGUI demo code, with a few modifications
|
||||
class Layout
|
||||
{
|
||||
public:
|
||||
Layout(const std::string & _layout, MyGUI::WidgetPtr _parent = nullptr)
|
||||
: mMainWidget(nullptr)
|
||||
{
|
||||
initialise(_layout, _parent);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
void getWidget(T * & _widget, const std::string & _name, bool _throw = true)
|
||||
{
|
||||
_widget = nullptr;
|
||||
for (MyGUI::VectorWidgetPtr::iterator iter=mListWindowRoot.begin();
|
||||
iter!=mListWindowRoot.end(); ++iter)
|
||||
{
|
||||
MyGUI::WidgetPtr find = (*iter)->findWidget(mPrefix + _name);
|
||||
if (nullptr != find)
|
||||
{
|
||||
T * cast = find->castType<T>(false);
|
||||
if (nullptr != cast)
|
||||
_widget = cast;
|
||||
else if (_throw)
|
||||
{
|
||||
MYGUI_EXCEPT("Error cast : dest type = '" << T::getClassTypeName()
|
||||
<< "' source name = '" << find->getName()
|
||||
<< "' source type = '" << find->getTypeName() << "' in layout '" << mLayoutName << "'");
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
MYGUI_ASSERT( ! _throw, "widget name '" << _name << "' in layout '" << mLayoutName << "' not found.");
|
||||
}
|
||||
|
||||
void initialise(const std::string & _layout,
|
||||
MyGUI::WidgetPtr _parent = nullptr)
|
||||
{
|
||||
const std::string MAIN_WINDOW = "_Main";
|
||||
mLayoutName = _layout;
|
||||
|
||||
if (mLayoutName.empty())
|
||||
mMainWidget = _parent;
|
||||
else
|
||||
{
|
||||
mPrefix = MyGUI::utility::toString(this, "_");
|
||||
mListWindowRoot = MyGUI::LayoutManager::getInstance().loadLayout(mLayoutName, mPrefix, _parent);
|
||||
|
||||
const std::string main_name = mPrefix + MAIN_WINDOW;
|
||||
for (MyGUI::VectorWidgetPtr::iterator iter=mListWindowRoot.begin(); iter!=mListWindowRoot.end(); ++iter)
|
||||
{
|
||||
if ((*iter)->getName() == main_name)
|
||||
{
|
||||
mMainWidget = (*iter);
|
||||
break;
|
||||
}
|
||||
}
|
||||
MYGUI_ASSERT(mMainWidget, "root widget name '" << MAIN_WINDOW << "' in layout '" << mLayoutName << "' not found.");
|
||||
}
|
||||
}
|
||||
|
||||
void shutdown()
|
||||
{
|
||||
for (VectorBasePtr::iterator iter=mListBase.begin(); iter!=mListBase.end(); ++iter) {
|
||||
delete (*iter);
|
||||
}
|
||||
mListBase.clear();
|
||||
|
||||
MyGUI::LayoutManager::getInstance().unloadLayout(mListWindowRoot);
|
||||
mListWindowRoot.clear();
|
||||
}
|
||||
|
||||
void setCoord(int x, int y, int w, int h)
|
||||
{
|
||||
mMainWidget->setCoord(x,y,w,h);
|
||||
}
|
||||
|
||||
void setVisible(bool b)
|
||||
{
|
||||
mMainWidget->setVisible(b);
|
||||
}
|
||||
|
||||
virtual ~Layout()
|
||||
{
|
||||
shutdown();
|
||||
}
|
||||
|
||||
void setText(const char* name, const char* caption)
|
||||
{
|
||||
MyGUI::WidgetPtr pt;
|
||||
getWidget(pt, name);
|
||||
pt->setCaption(caption);
|
||||
}
|
||||
|
||||
void setColor(const char* name, float r, float g, float b)
|
||||
{
|
||||
MyGUI::WidgetPtr pt;
|
||||
getWidget(pt, name);
|
||||
gui_setTextColor(pt,r,g,b);
|
||||
}
|
||||
|
||||
void setImage(const char* name, const char* imgName)
|
||||
{
|
||||
MyGUI::StaticImagePtr pt;
|
||||
getWidget(pt, name);
|
||||
pt->setImageTexture(imgName);
|
||||
}
|
||||
|
||||
protected:
|
||||
|
||||
MyGUI::WidgetPtr mMainWidget;
|
||||
|
||||
std::string mPrefix;
|
||||
std::string mLayoutName;
|
||||
MyGUI::VectorWidgetPtr mListWindowRoot;
|
||||
typedef std::vector<Layout*> VectorBasePtr;
|
||||
VectorBasePtr mListBase;
|
||||
};
|
||||
|
||||
class HUD : public Layout
|
||||
{
|
||||
public:
|
||||
HUD()
|
||||
: Layout("openmw_hud_layout.xml")
|
||||
{
|
||||
setCoord(0,0,
|
||||
mWindow->getWidth(),
|
||||
mWindow->getHeight());
|
||||
|
||||
// Energy bars
|
||||
getWidget(health, "Health");
|
||||
getWidget(magicka, "Magicka");
|
||||
getWidget(stamina, "Stamina");
|
||||
|
||||
// Item and spell images and status bars
|
||||
getWidget(weapImage, "WeapImage");
|
||||
getWidget(weapStatus, "WeapStatus");
|
||||
getWidget(spellImage, "SpellImage");
|
||||
getWidget(spellStatus, "SpellStatus");
|
||||
|
||||
getWidget(effectBox, "EffectBox");
|
||||
getWidget(effect1, "Effect1");
|
||||
|
||||
getWidget(minimap, "MiniMap");
|
||||
getWidget(compass, "Compass");
|
||||
|
||||
getWidget(crosshair, "Crosshair");
|
||||
|
||||
compass->setImageTexture("compass.dds");
|
||||
crosshair->setImageTexture("target.dds");
|
||||
}
|
||||
|
||||
void setStats(int h, int hmax, int m, int mmax, int s, int smax)
|
||||
{
|
||||
health->setProgressRange(hmax);
|
||||
health->setProgressPosition(h);
|
||||
magicka->setProgressRange(mmax);
|
||||
magicka->setProgressPosition(m);
|
||||
stamina->setProgressRange(smax);
|
||||
stamina->setProgressPosition(s);
|
||||
}
|
||||
|
||||
void setWeapIcon(const char *str)
|
||||
{ weapImage->setImageTexture(str); }
|
||||
void setSpellIcon(const char *str)
|
||||
{ spellImage->setImageTexture(str); }
|
||||
|
||||
void setWeapStatus(int s, int smax)
|
||||
{
|
||||
weapStatus->setProgressRange(smax);
|
||||
weapStatus->setProgressPosition(s);
|
||||
}
|
||||
void setSpellStatus(int s, int smax)
|
||||
{
|
||||
spellStatus->setProgressRange(smax);
|
||||
spellStatus->setProgressPosition(s);
|
||||
}
|
||||
|
||||
void setEffect(const char *img)
|
||||
{ effect1->setImageTexture(img); }
|
||||
|
||||
MyGUI::ProgressPtr health, magicka, stamina;
|
||||
|
||||
MyGUI::StaticImagePtr weapImage, spellImage;
|
||||
MyGUI::ProgressPtr weapStatus, spellStatus;
|
||||
|
||||
MyGUI::WidgetPtr effectBox;
|
||||
MyGUI::StaticImagePtr effect1;
|
||||
|
||||
MyGUI::StaticImagePtr minimap;
|
||||
MyGUI::StaticImagePtr compass;
|
||||
|
||||
MyGUI::StaticImagePtr crosshair;
|
||||
};
|
||||
|
||||
class MapWindow : public Layout
|
||||
{
|
||||
public:
|
||||
MapWindow()
|
||||
: Layout("openmw_map_window_layout.xml")
|
||||
{
|
||||
setCoord(500,0,320,300);
|
||||
mMainWidget->setCaption(cellName);
|
||||
setText("WorldButton", "World");
|
||||
setImage("Compass", "compass.dds");
|
||||
}
|
||||
};
|
||||
|
||||
class MainMenu : public Layout
|
||||
{
|
||||
public:
|
||||
MainMenu()
|
||||
: Layout("openmw_mainmenu_layout.xml")
|
||||
{
|
||||
setCoord(0,0,
|
||||
mWindow->getWidth(),
|
||||
mWindow->getHeight());
|
||||
}
|
||||
};
|
||||
|
||||
class StatsWindow : public Layout
|
||||
{
|
||||
public:
|
||||
void setBar(const char* name, const char* tname, int val, int max)
|
||||
{
|
||||
MyGUI::ProgressPtr pt;
|
||||
getWidget(pt, name);
|
||||
pt->setProgressRange(max);
|
||||
pt->setProgressPosition(val);
|
||||
|
||||
std::stringstream out;
|
||||
out << val << "/" << max;
|
||||
setText(tname, out.str().c_str());
|
||||
}
|
||||
|
||||
StatsWindow()
|
||||
: Layout("openmw_stats_window_layout.xml")
|
||||
{
|
||||
setCoord(0,0,498, 342);
|
||||
mMainWidget->setCaption("Playername");
|
||||
|
||||
setText("Health_str", "Health");
|
||||
setText("Magicka_str", "Magicka");
|
||||
setText("Fatigue_str", "Fatigue");
|
||||
|
||||
setText("Level_str", "Level");
|
||||
setText("Race_str", "Race");
|
||||
setText("Class_str", "Class");
|
||||
|
||||
setText("LevelText", "5");
|
||||
setText("RaceText", "Wood Elf");
|
||||
setText("ClassText", "Pilgrim");
|
||||
|
||||
setBar("HBar", "HBarT", 60, 100);
|
||||
setBar("MBar", "MBarT", 30, 100);
|
||||
setBar("FBar", "FBarT", 80, 100);
|
||||
|
||||
setText("Attrib1", "Strength");
|
||||
setText("Attrib2", "Intelligence");
|
||||
setText("Attrib3", "Willpower");
|
||||
setText("Attrib4", "Agility");
|
||||
setText("Attrib5", "Speed");
|
||||
setText("Attrib6", "Endurance");
|
||||
setText("Attrib7", "Personality");
|
||||
setText("Attrib8", "Luck");
|
||||
|
||||
setText("AttribVal1", "30");
|
||||
setText("AttribVal2", "40");
|
||||
setText("AttribVal3", "30");
|
||||
setText("AttribVal4", "75");
|
||||
setText("AttribVal5", "50");
|
||||
setText("AttribVal6", "40");
|
||||
setText("AttribVal7", "50");
|
||||
setText("AttribVal8", "40");
|
||||
}
|
||||
};
|
||||
|
||||
HUD *hud;
|
||||
StatsWindow *stats;
|
||||
MapWindow *map;
|
||||
MyGUI::WidgetPtr FPSText;
|
||||
OIS::MouseState state;
|
||||
bool consoleMode = false;
|
||||
bool inventoryMode = false;
|
||||
|
||||
@ -429,8 +36,6 @@ void leaveGui()
|
||||
}
|
||||
}
|
||||
|
||||
#include "cpp_console.cpp"
|
||||
|
||||
extern "C" void gui_toggleGui()
|
||||
{
|
||||
if(inventoryMode)
|
||||
@ -453,49 +58,8 @@ extern "C" void gui_toggleGui()
|
||||
inventoryMode = !inventoryMode;
|
||||
}
|
||||
|
||||
extern "C" int32_t* gui_getGuiModePtr() { return &guiMode; }
|
||||
|
||||
extern "C" void gui_showHUD()
|
||||
{
|
||||
if(hud)
|
||||
hud->setVisible(true);
|
||||
}
|
||||
|
||||
extern "C" void gui_setupGUI(int32_t debugOut)
|
||||
{
|
||||
int mWidth = mWindow->getWidth();
|
||||
int mHeight = mWindow->getHeight();
|
||||
|
||||
stats = new StatsWindow();
|
||||
map = new MapWindow();
|
||||
cons = new Console();
|
||||
|
||||
// Hide all the windows at startup
|
||||
stats->setVisible(false);
|
||||
map->setVisible(false);
|
||||
cons->setVisible(false);
|
||||
guiMode = 1;
|
||||
leaveGui();
|
||||
|
||||
// Start the mouse in the middle of the screen
|
||||
state.X.abs = mWidth / 2;
|
||||
state.Y.abs = mHeight / 2;
|
||||
|
||||
// Set up the HUD
|
||||
hud = new HUD();
|
||||
|
||||
hud->setStats(60, 100,
|
||||
30, 100,
|
||||
80, 100);
|
||||
|
||||
hud->setWeapIcon("icons\\w\\tx_knife_iron.dds");
|
||||
hud->setWeapStatus(90, 100);
|
||||
hud->setSpellIcon("icons\\s\\b_tx_s_rstor_health.dds");
|
||||
hud->setSpellStatus(65, 100);
|
||||
|
||||
hud->setEffect("icons\\s\\tx_s_chameleon.dds");
|
||||
|
||||
hud->setVisible(false);
|
||||
|
||||
//new MainMenu();
|
||||
}
|
||||
|
@ -1,321 +0,0 @@
|
||||
/*
|
||||
OpenMW - The completely unofficial reimplementation of Morrowind
|
||||
Copyright (C) 2008-2009 Nicolay Korslund
|
||||
Email: < korslund@gmail.com >
|
||||
WWW: http://openmw.snaptoad.com/
|
||||
|
||||
This file (gui.d) is part of the OpenMW package.
|
||||
|
||||
OpenMW is distributed as free software: you can redistribute it
|
||||
and/or modify it under the terms of the GNU General Public License
|
||||
version 3, as published by the Free Software Foundation.
|
||||
|
||||
This program is distributed in the hope that it will be useful, but
|
||||
WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
version 3 along with this program. If not, see
|
||||
http://www.gnu.org/licenses/ .
|
||||
|
||||
*/
|
||||
|
||||
module gui.gui;
|
||||
|
||||
import monster.monster;
|
||||
import monster.vm.mclass;
|
||||
import monster.modules.console;
|
||||
import gui.bindings;
|
||||
import bullet.bindings;
|
||||
import std.string;
|
||||
import std.stdio;
|
||||
|
||||
// Widget class and gui module
|
||||
MonsterClass
|
||||
gmc, // GUI module
|
||||
wid_mc, // Widget
|
||||
but_mc, // Button
|
||||
tex_mc, // StaticText
|
||||
img_mc, // StaticImage
|
||||
pro_mc, // Progress
|
||||
win_mc; // Window
|
||||
|
||||
MWidget[WidgetPtr] gui_store;
|
||||
|
||||
class MWidget
|
||||
{
|
||||
WidgetPtr widget;
|
||||
MonsterObject *mo;
|
||||
|
||||
// Used for layouts
|
||||
bool isLayout;
|
||||
char[] prefix;
|
||||
|
||||
// For layouts
|
||||
this(char[] layout, WidgetPtr parent = null)
|
||||
{
|
||||
assert(layout.length);
|
||||
|
||||
isLayout = true;
|
||||
prefix = format("%s", cast(void*)this);
|
||||
|
||||
widget = gui_loadLayout(layout.toStringz(), prefix.toStringz(), parent);
|
||||
if(widget is null)
|
||||
fail("Layout " ~ layout ~ " is empty");
|
||||
|
||||
this();
|
||||
}
|
||||
|
||||
// For normal widgets
|
||||
this(WidgetPtr w)
|
||||
{
|
||||
isLayout = false;
|
||||
widget = w;
|
||||
assert(widget !is null);
|
||||
this();
|
||||
}
|
||||
|
||||
private this()
|
||||
{
|
||||
assert(widget !is null);
|
||||
|
||||
// Create the object from the right class
|
||||
mo = toClass(widget).createObject();
|
||||
// But store the pointer in the Widget's pointer slot
|
||||
mo.getExtra(wid_mc).obj = this;
|
||||
// Also store a lookup for later
|
||||
gui_store[widget] = this;
|
||||
}
|
||||
|
||||
MWidget getChild(char[] name)
|
||||
{
|
||||
if(prefix.length)
|
||||
name = prefix ~ name;
|
||||
|
||||
// Get the child widget
|
||||
auto pt = gui_getChild(widget, name.toStringz());
|
||||
|
||||
if(pt is null)
|
||||
fail("Widget has no child named " ~ name);
|
||||
|
||||
// Return the MWidget
|
||||
return get(pt);
|
||||
}
|
||||
|
||||
// Return the MonsterClass corresponding to a given widget.
|
||||
private static MonsterClass toClass(WidgetPtr p)
|
||||
{
|
||||
switch(widgetType(p))
|
||||
{
|
||||
/*
|
||||
case "Button": return but_mc;
|
||||
case "StaticText": return tex_mc;
|
||||
case "StaticImage": return img_mc;
|
||||
case "Progress": return pro_mc;
|
||||
case "Window": return win_mc;
|
||||
*/
|
||||
default:
|
||||
// Use "Widget" for all unimplemented types
|
||||
case "Widget": return wid_mc;
|
||||
}
|
||||
}
|
||||
|
||||
// Get the MWidget (and associatied MonsterObject) corresponding to
|
||||
// a given Widget.
|
||||
static MWidget get(WidgetPtr wid)
|
||||
{
|
||||
// First, check if the instance exists
|
||||
auto p = wid in gui_store;
|
||||
if(p) return *p;
|
||||
|
||||
// No MWidget exists. We have to create one.
|
||||
return new MWidget(wid);
|
||||
}
|
||||
};
|
||||
|
||||
char[] widgetType(WidgetPtr p)
|
||||
{
|
||||
return toString(gui_widgetType(p));
|
||||
}
|
||||
|
||||
MWidget getMWOwner(MonsterObject *mo)
|
||||
{
|
||||
return (cast(MWidget)mo.getExtra(wid_mc).obj);
|
||||
}
|
||||
MWidget getMWOwner()
|
||||
{
|
||||
return getMWOwner(params.obj());
|
||||
}
|
||||
WidgetPtr getOwner(MonsterObject *mo)
|
||||
{
|
||||
return getMWOwner(mo).widget;
|
||||
}
|
||||
WidgetPtr getOwner()
|
||||
{
|
||||
return getMWOwner().widget;
|
||||
}
|
||||
|
||||
// Widget functions
|
||||
void setCaption()
|
||||
{
|
||||
AIndex[] args = stack.popAArray();
|
||||
|
||||
char[] res;
|
||||
|
||||
foreach(AIndex ind; args)
|
||||
res ~= format("%s", arrays.getRef(ind).carr);
|
||||
|
||||
gui_setCaption(getOwner(), toStringz(res));
|
||||
}
|
||||
void setNeedMouseFocus()
|
||||
{ gui_setNeedMouseFocus(getOwner(), stack.popBool); }
|
||||
void setTextColor()
|
||||
{
|
||||
float b = stack.popFloat();
|
||||
float g = stack.popFloat();
|
||||
float r = stack.popFloat();
|
||||
gui_setTextColor(getOwner(), r,g,b);
|
||||
}
|
||||
void setCoord()
|
||||
{
|
||||
int h = stack.popInt();
|
||||
int w = stack.popInt();
|
||||
int y = stack.popInt();
|
||||
int x = stack.popInt();
|
||||
gui_setCoord(getOwner(), x,y,w,h);
|
||||
}
|
||||
|
||||
void get()
|
||||
{
|
||||
// Get the owner MWidget
|
||||
auto mw = getMWOwner();
|
||||
// Get the child
|
||||
mw = mw.getChild(stack.popString8());
|
||||
// Push the object
|
||||
stack.pushObject(mw.mo);
|
||||
}
|
||||
|
||||
// TODO: These are all written to be used with the 'gui' module. Later
|
||||
// they should be part of Widget, and create child widgets. When used
|
||||
// with 'gui' they create root widgets.
|
||||
|
||||
void loadLayout()
|
||||
{
|
||||
MWidget mw = new MWidget(stack.popString8());
|
||||
stack.pushObject(mw.mo);
|
||||
}
|
||||
|
||||
void text()
|
||||
{
|
||||
char[] layer = stack.popString8();
|
||||
int h = stack.popInt();
|
||||
int w = stack.popInt();
|
||||
int y = stack.popInt();
|
||||
int x = stack.popInt();
|
||||
char[] skin = stack.popString8();
|
||||
WidgetPtr ptr = gui_createText(skin.toStringz(),
|
||||
x,y,w,h,
|
||||
layer.toStringz());
|
||||
assert(widgetType(ptr) == "StaticText");
|
||||
MWidget mw = new MWidget(ptr);
|
||||
stack.pushObject(mw.mo);
|
||||
}
|
||||
|
||||
void getWidth()
|
||||
{
|
||||
stack.pushInt(gui_getWidth(null));
|
||||
}
|
||||
|
||||
void getHeight()
|
||||
{
|
||||
stack.pushInt(gui_getHeight(null));
|
||||
}
|
||||
|
||||
void initGUI(bool debugOut)
|
||||
{
|
||||
// Load the GUI system
|
||||
gui_setupGUI(debugOut);
|
||||
}
|
||||
|
||||
void startGUI()
|
||||
{
|
||||
gui_showHUD();
|
||||
|
||||
// Run GUI scripts
|
||||
// Create the HUD and windows
|
||||
vm.run("makegui.mn");
|
||||
|
||||
// Run the fps ticker
|
||||
vm.run("fpsticker.mn");
|
||||
}
|
||||
|
||||
void setupGUIScripts()
|
||||
{
|
||||
vm.addPath("mscripts/guiscripts/");
|
||||
vm.addPath("mscripts/guiscripts/module/");
|
||||
gmc = vm.load("gui", "gui.mn");
|
||||
wid_mc = vm.load("Widget", "widget.mn");
|
||||
/*
|
||||
but_mc = new MonsterClass("Button", "button.mn");
|
||||
tex_mc = new MonsterClass("Text", "text.mn");
|
||||
img_mc = new MonsterClass("Image", "image.mn");
|
||||
pro_mc = new MonsterClass("Progress", "progress.mn");
|
||||
win_mc = new MonsterClass("Window", "window.mn");
|
||||
*/
|
||||
|
||||
wid_mc.bind("setCaption", &setCaption);
|
||||
wid_mc.bind("setNeedMouseFocus", &setNeedMouseFocus);
|
||||
wid_mc.bind("setTextColor", &setTextColor);
|
||||
wid_mc.bind("setCoord", &setCoord);
|
||||
wid_mc.bind("get", &get);
|
||||
|
||||
gmc.bind("text", &text);
|
||||
gmc.bind("loadLayout", &loadLayout);
|
||||
gmc.bind("getWidth", &getWidth);
|
||||
gmc.bind("getHeight", &getHeight);
|
||||
|
||||
// Set up the console
|
||||
auto cmc = vm.load("Console");
|
||||
auto cmo = cmc.createObject;
|
||||
cons = new Console(cmo);
|
||||
|
||||
// Bind native functions
|
||||
cmc.bind("walk", { bullet_walk(); cons.putln("Walk mode enabled");});
|
||||
cmc.bind("fly", { bullet_fly(); cons.putln("Fly mode enabled");});
|
||||
cmc.bind("ghost", { bullet_ghost(); cons.putln("Ghost mode enabled");});
|
||||
cmc.bind("setfont",
|
||||
{
|
||||
char[] fnt = stack.popString8();
|
||||
gui_setConsoleFont(toStringz(fnt));
|
||||
cons.putln("Setting font " ~ fnt);
|
||||
});
|
||||
cmc.bind("clear", { gui_clearConsole(); });
|
||||
cmc.bind("exit", { exitProgram(); });
|
||||
cmc.bind("wireframe", { cons.putln("Wireframe mode not implemented yet"); });
|
||||
}
|
||||
|
||||
Console cons;
|
||||
|
||||
// Checked from input/events.d. Shouldn't really be here, but it's a
|
||||
// workaround for a DMD import issue.
|
||||
bool doExit = false;
|
||||
void exitProgram()
|
||||
{
|
||||
doExit = true;
|
||||
}
|
||||
|
||||
// Some glue code that will go away later when we use the C++
|
||||
// interface to Monster directly.
|
||||
extern(C):
|
||||
int console_input(char* str)
|
||||
{
|
||||
char[] dstr = toString(str);
|
||||
return cons.input(dstr);
|
||||
}
|
||||
|
||||
char* console_output()
|
||||
{
|
||||
char[] dstr = cons.output();
|
||||
return toStringz(dstr);
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user