forked from mirror/openmw-tes3mp
Merge branch 'master' into water
This commit is contained in:
commit
044d649edd
18 changed files with 1159 additions and 896 deletions
|
@ -25,6 +25,7 @@ add_openmw_dir (mwinput
|
||||||
add_openmw_dir (mwgui
|
add_openmw_dir (mwgui
|
||||||
layouts text_input widgets race class birth review window_manager console dialogue
|
layouts text_input widgets race class birth review window_manager console dialogue
|
||||||
dialogue_history window_base stats_window messagebox journalwindow charactercreation
|
dialogue_history window_base stats_window messagebox journalwindow charactercreation
|
||||||
|
map_window window_pinnable_base
|
||||||
)
|
)
|
||||||
|
|
||||||
add_openmw_dir (mwdialogue
|
add_openmw_dir (mwdialogue
|
||||||
|
|
|
@ -31,6 +31,11 @@ HUD::HUD(int width, int height, int fpsLevel)
|
||||||
, fpscounter(NULL)
|
, fpscounter(NULL)
|
||||||
, trianglecounter(NULL)
|
, trianglecounter(NULL)
|
||||||
, batchcounter(NULL)
|
, batchcounter(NULL)
|
||||||
|
, hmsBaseLeft(0)
|
||||||
|
, weapBoxBaseLeft(0)
|
||||||
|
, spellBoxBaseLeft(0)
|
||||||
|
, effectBoxBaseRight(0)
|
||||||
|
, minimapBoxBaseRight(0)
|
||||||
{
|
{
|
||||||
setCoord(0,0, width, height);
|
setCoord(0,0, width, height);
|
||||||
|
|
||||||
|
@ -38,16 +43,25 @@ HUD::HUD(int width, int height, int fpsLevel)
|
||||||
getWidget(health, "Health");
|
getWidget(health, "Health");
|
||||||
getWidget(magicka, "Magicka");
|
getWidget(magicka, "Magicka");
|
||||||
getWidget(stamina, "Stamina");
|
getWidget(stamina, "Stamina");
|
||||||
|
hmsBaseLeft = health->getLeft();
|
||||||
|
|
||||||
// Item and spell images and status bars
|
// Item and spell images and status bars
|
||||||
|
getWidget(weapBox, "WeapBox");
|
||||||
getWidget(weapImage, "WeapImage");
|
getWidget(weapImage, "WeapImage");
|
||||||
getWidget(weapStatus, "WeapStatus");
|
getWidget(weapStatus, "WeapStatus");
|
||||||
|
weapBoxBaseLeft = weapBox->getLeft();
|
||||||
|
|
||||||
|
getWidget(spellBox, "SpellBox");
|
||||||
getWidget(spellImage, "SpellImage");
|
getWidget(spellImage, "SpellImage");
|
||||||
getWidget(spellStatus, "SpellStatus");
|
getWidget(spellStatus, "SpellStatus");
|
||||||
|
spellBoxBaseLeft = spellBox->getLeft();
|
||||||
|
|
||||||
getWidget(effectBox, "EffectBox");
|
getWidget(effectBox, "EffectBox");
|
||||||
getWidget(effect1, "Effect1");
|
getWidget(effect1, "Effect1");
|
||||||
|
effectBoxBaseRight = effectBox->getRight();
|
||||||
|
|
||||||
|
getWidget(minimapBox, "MiniMapBox");
|
||||||
|
minimapBoxBaseRight = minimapBox->getRight();
|
||||||
getWidget(minimap, "MiniMap");
|
getWidget(minimap, "MiniMap");
|
||||||
getWidget(compass, "Compass");
|
getWidget(compass, "Compass");
|
||||||
|
|
||||||
|
@ -163,15 +177,21 @@ void HUD::setValue(const std::string& id, const MWMechanics::DynamicStat<int>& v
|
||||||
|
|
||||||
void HUD::setPlayerDir(const float x, const float y)
|
void HUD::setPlayerDir(const float x, const float y)
|
||||||
{
|
{
|
||||||
|
if (!minimapBox->getVisible() || (x == mLastPositionX && y == mLastPositionY)) return;
|
||||||
|
|
||||||
MyGUI::ISubWidget* main = compass->getSubWidgetMain();
|
MyGUI::ISubWidget* main = compass->getSubWidgetMain();
|
||||||
MyGUI::RotatingSkin* rotatingSubskin = main->castType<MyGUI::RotatingSkin>();
|
MyGUI::RotatingSkin* rotatingSubskin = main->castType<MyGUI::RotatingSkin>();
|
||||||
rotatingSubskin->setCenter(MyGUI::IntPoint(16,16));
|
rotatingSubskin->setCenter(MyGUI::IntPoint(16,16));
|
||||||
float angle = std::atan2(x,y);
|
float angle = std::atan2(x,y);
|
||||||
rotatingSubskin->setAngle(angle);
|
rotatingSubskin->setAngle(angle);
|
||||||
|
mLastPositionX = x;
|
||||||
|
mLastPositionY = y;
|
||||||
}
|
}
|
||||||
|
|
||||||
void HUD::setPlayerPos(const float x, const float y)
|
void HUD::setPlayerPos(const float x, const float y)
|
||||||
{
|
{
|
||||||
|
if (!minimapBox->getVisible() || (x == mLastDirectionX && y == mLastDirectionY)) return;
|
||||||
|
|
||||||
MyGUI::IntSize size = minimap->getCanvasSize();
|
MyGUI::IntSize size = minimap->getCanvasSize();
|
||||||
MyGUI::IntPoint middle = MyGUI::IntPoint((1/3.f + x/3.f)*size.width,(1/3.f + y/3.f)*size.height);
|
MyGUI::IntPoint middle = MyGUI::IntPoint((1/3.f + x/3.f)*size.width,(1/3.f + y/3.f)*size.height);
|
||||||
MyGUI::IntCoord viewsize = minimap->getCoord();
|
MyGUI::IntCoord viewsize = minimap->getCoord();
|
||||||
|
@ -179,99 +199,39 @@ void HUD::setPlayerPos(const float x, const float y)
|
||||||
|
|
||||||
minimap->setViewOffset(pos);
|
minimap->setViewOffset(pos);
|
||||||
compass->setPosition(MyGUI::IntPoint(x*512-16, y*512-16));
|
compass->setPosition(MyGUI::IntPoint(x*512-16, y*512-16));
|
||||||
|
|
||||||
|
mLastDirectionX = x;
|
||||||
|
mLastDirectionY = y;
|
||||||
}
|
}
|
||||||
|
|
||||||
MapWindow::MapWindow()
|
void HUD::setBottomLeftVisibility(bool hmsVisible, bool weapVisible, bool spellVisible)
|
||||||
: Layout("openmw_map_window_layout.xml")
|
|
||||||
, mGlobal(false)
|
|
||||||
, mVisible(false)
|
|
||||||
{
|
{
|
||||||
setCoord(500,0,320,300);
|
int weapDx = 0, spellDx = 0;
|
||||||
setText("WorldButton", "World");
|
if (!hmsVisible)
|
||||||
setImage("Compass", "textures\\compass.dds");
|
spellDx = weapDx = weapBoxBaseLeft - hmsBaseLeft;
|
||||||
|
|
||||||
// Obviously you should override this later on
|
if (!weapVisible)
|
||||||
setCellName("No Cell Loaded");
|
spellDx -= spellBoxBaseLeft - weapBoxBaseLeft;
|
||||||
|
|
||||||
getWidget(mLocalMap, "LocalMap");
|
health->setVisible(hmsVisible);
|
||||||
getWidget(mGlobalMap, "GlobalMap");
|
stamina->setVisible(hmsVisible);
|
||||||
getWidget(mPlayerArrow, "Compass");
|
magicka->setVisible(hmsVisible);
|
||||||
|
weapBox->setPosition(weapBoxBaseLeft - weapDx, weapBox->getTop());
|
||||||
getWidget(mButton, "WorldButton");
|
weapBox->setVisible(weapVisible);
|
||||||
mButton->eventMouseButtonClick += MyGUI::newDelegate(this, &MapWindow::onWorldButtonClicked);
|
spellBox->setPosition(spellBoxBaseLeft - spellDx, spellBox->getTop());
|
||||||
|
spellBox->setVisible(spellVisible);
|
||||||
MyGUI::Button* eventbox;
|
|
||||||
getWidget(eventbox, "EventBox");
|
|
||||||
eventbox->eventMouseDrag += MyGUI::newDelegate(this, &MapWindow::onMouseDrag);
|
|
||||||
eventbox->eventMouseButtonPressed += MyGUI::newDelegate(this, &MapWindow::onDragStart);
|
|
||||||
|
|
||||||
LocalMapBase::init(mLocalMap, this);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void MapWindow::setVisible(bool b)
|
void HUD::setBottomRightVisibility(bool effectBoxVisible, bool minimapBoxVisible)
|
||||||
{
|
{
|
||||||
mMainWidget->setVisible(b);
|
// effect box can have variable width -> variable left coordinate
|
||||||
if (b)
|
int effectsDx = 0;
|
||||||
mVisible = true;
|
if (!minimapBoxVisible)
|
||||||
else
|
effectsDx = minimapBoxBaseRight - effectBoxBaseRight;
|
||||||
mVisible = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void MapWindow::setCellName(const std::string& cellName)
|
minimapBox->setVisible(minimapBoxVisible);
|
||||||
{
|
effectBox->setPosition(effectBoxBaseRight - effectBox->getWidth() + effectsDx, effectBox->getTop());
|
||||||
static_cast<MyGUI::Window*>(mMainWidget)->setCaption(cellName);
|
effectBox->setVisible(effectBoxVisible);
|
||||||
adjustWindowCaption();
|
|
||||||
}
|
|
||||||
|
|
||||||
void MapWindow::setPlayerPos(const float x, const float y)
|
|
||||||
{
|
|
||||||
if (mGlobal || mVisible) return;
|
|
||||||
MyGUI::IntSize size = mLocalMap->getCanvasSize();
|
|
||||||
MyGUI::IntPoint middle = MyGUI::IntPoint((1/3.f + x/3.f)*size.width,(1/3.f + y/3.f)*size.height);
|
|
||||||
MyGUI::IntCoord viewsize = mLocalMap->getCoord();
|
|
||||||
MyGUI::IntPoint pos(0.5*viewsize.width - middle.left, 0.5*viewsize.height - middle.top);
|
|
||||||
mLocalMap->setViewOffset(pos);
|
|
||||||
|
|
||||||
mPlayerArrow->setPosition(MyGUI::IntPoint(x*512-16, y*512-16));
|
|
||||||
}
|
|
||||||
|
|
||||||
void MapWindow::setPlayerDir(const float x, const float y)
|
|
||||||
{
|
|
||||||
if (!mVisible) return;
|
|
||||||
MyGUI::ISubWidget* main = mPlayerArrow->getSubWidgetMain();
|
|
||||||
MyGUI::RotatingSkin* rotatingSubskin = main->castType<MyGUI::RotatingSkin>();
|
|
||||||
rotatingSubskin->setCenter(MyGUI::IntPoint(16,16));
|
|
||||||
float angle = std::atan2(x,y);
|
|
||||||
rotatingSubskin->setAngle(angle);
|
|
||||||
}
|
|
||||||
|
|
||||||
void MapWindow::onDragStart(MyGUI::Widget* _sender, int _left, int _top, MyGUI::MouseButton _id)
|
|
||||||
{
|
|
||||||
if (_id!=MyGUI::MouseButton::Left) return;
|
|
||||||
if (!mGlobal)
|
|
||||||
mLastDragPos = MyGUI::IntPoint(_left, _top);
|
|
||||||
}
|
|
||||||
|
|
||||||
void MapWindow::onMouseDrag(MyGUI::Widget* _sender, int _left, int _top, MyGUI::MouseButton _id)
|
|
||||||
{
|
|
||||||
if (_id!=MyGUI::MouseButton::Left) return;
|
|
||||||
|
|
||||||
if (!mGlobal)
|
|
||||||
{
|
|
||||||
MyGUI::IntPoint diff = MyGUI::IntPoint(_left, _top) - mLastDragPos;
|
|
||||||
mLocalMap->setViewOffset( mLocalMap->getViewOffset() + diff );
|
|
||||||
|
|
||||||
mLastDragPos = MyGUI::IntPoint(_left, _top);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void MapWindow::onWorldButtonClicked(MyGUI::Widget* _sender)
|
|
||||||
{
|
|
||||||
mGlobal = !mGlobal;
|
|
||||||
mGlobalMap->setVisible(mGlobal);
|
|
||||||
mLocalMap->setVisible(!mGlobal);
|
|
||||||
|
|
||||||
mButton->setCaption( mGlobal ? "Local" : "World" );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
LocalMapBase::LocalMapBase()
|
LocalMapBase::LocalMapBase()
|
||||||
|
@ -283,6 +243,10 @@ LocalMapBase::LocalMapBase()
|
||||||
, mPrefix()
|
, mPrefix()
|
||||||
, mChanged(true)
|
, mChanged(true)
|
||||||
, mLayout(NULL)
|
, mLayout(NULL)
|
||||||
|
, mLastPositionX(0.0f)
|
||||||
|
, mLastPositionY(0.0f)
|
||||||
|
, mLastDirectionX(0.0f)
|
||||||
|
, mLastDirectionY(0.0f)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -53,6 +53,11 @@ namespace MWGui
|
||||||
void applyFogOfWar();
|
void applyFogOfWar();
|
||||||
|
|
||||||
OEngine::GUI::Layout* mLayout;
|
OEngine::GUI::Layout* mLayout;
|
||||||
|
|
||||||
|
float mLastPositionX;
|
||||||
|
float mLastPositionY;
|
||||||
|
float mLastDirectionX;
|
||||||
|
float mLastDirectionY;
|
||||||
};
|
};
|
||||||
|
|
||||||
class HUD : public OEngine::GUI::Layout, public LocalMapBase
|
class HUD : public OEngine::GUI::Layout, public LocalMapBase
|
||||||
|
@ -71,11 +76,14 @@ namespace MWGui
|
||||||
void setBatchCount(size_t count);
|
void setBatchCount(size_t count);
|
||||||
void setPlayerDir(const float x, const float y);
|
void setPlayerDir(const float x, const float y);
|
||||||
void setPlayerPos(const float x, const float y);
|
void setPlayerPos(const float x, const float y);
|
||||||
|
void setBottomLeftVisibility(bool hmsVisible, bool weapVisible, bool spellVisible);
|
||||||
|
void setBottomRightVisibility(bool effectBoxVisible, bool minimapVisible);
|
||||||
|
|
||||||
MyGUI::ProgressPtr health, magicka, stamina;
|
MyGUI::ProgressPtr health, magicka, stamina;
|
||||||
|
MyGUI::Widget *weapBox, *spellBox;
|
||||||
MyGUI::ImageBox *weapImage, *spellImage;
|
MyGUI::ImageBox *weapImage, *spellImage;
|
||||||
MyGUI::ProgressPtr weapStatus, spellStatus;
|
MyGUI::ProgressPtr weapStatus, spellStatus;
|
||||||
MyGUI::WidgetPtr effectBox;
|
MyGUI::Widget *effectBox, *minimapBox;
|
||||||
MyGUI::ImageBox* effect1;
|
MyGUI::ImageBox* effect1;
|
||||||
MyGUI::ScrollView* minimap;
|
MyGUI::ScrollView* minimap;
|
||||||
MyGUI::ImageBox* compass;
|
MyGUI::ImageBox* compass;
|
||||||
|
@ -85,30 +93,12 @@ namespace MWGui
|
||||||
MyGUI::TextBox* fpscounter;
|
MyGUI::TextBox* fpscounter;
|
||||||
MyGUI::TextBox* trianglecounter;
|
MyGUI::TextBox* trianglecounter;
|
||||||
MyGUI::TextBox* batchcounter;
|
MyGUI::TextBox* batchcounter;
|
||||||
};
|
|
||||||
|
|
||||||
class MapWindow : public OEngine::GUI::Layout, public LocalMapBase
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
MapWindow();
|
|
||||||
virtual ~MapWindow(){}
|
|
||||||
|
|
||||||
void setVisible(bool b);
|
|
||||||
void setPlayerPos(const float x, const float y);
|
|
||||||
void setPlayerDir(const float x, const float y);
|
|
||||||
void setCellName(const std::string& cellName);
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void onDragStart(MyGUI::Widget* _sender, int _left, int _top, MyGUI::MouseButton _id);
|
// bottom left elements
|
||||||
void onMouseDrag(MyGUI::Widget* _sender, int _left, int _top, MyGUI::MouseButton _id);
|
int hmsBaseLeft, weapBoxBaseLeft, spellBoxBaseLeft;
|
||||||
void onWorldButtonClicked(MyGUI::Widget* _sender);
|
// bottom right elements
|
||||||
|
int minimapBoxBaseRight, effectBoxBaseRight;
|
||||||
MyGUI::ScrollView* mGlobalMap;
|
|
||||||
MyGUI::ImageBox* mPlayerArrow;
|
|
||||||
MyGUI::Button* mButton;
|
|
||||||
MyGUI::IntPoint mLastDragPos;
|
|
||||||
bool mVisible;
|
|
||||||
bool mGlobal;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
class MainMenu : public OEngine::GUI::Layout
|
class MainMenu : public OEngine::GUI::Layout
|
||||||
|
|
106
apps/openmw/mwgui/map_window.cpp
Normal file
106
apps/openmw/mwgui/map_window.cpp
Normal file
|
@ -0,0 +1,106 @@
|
||||||
|
#include "map_window.hpp"
|
||||||
|
#include "window_manager.hpp"
|
||||||
|
/*
|
||||||
|
#include "../mwmechanics/mechanicsmanager.hpp"
|
||||||
|
|
||||||
|
#include <cmath>
|
||||||
|
#include <algorithm>
|
||||||
|
#include <iterator>
|
||||||
|
|
||||||
|
#undef min
|
||||||
|
#undef max
|
||||||
|
*/
|
||||||
|
using namespace MWGui;
|
||||||
|
|
||||||
|
MapWindow::MapWindow(WindowManager& parWindowManager) :
|
||||||
|
MWGui::WindowPinnableBase("openmw_map_window_layout.xml", parWindowManager),
|
||||||
|
mGlobal(false)
|
||||||
|
{
|
||||||
|
setCoord(500,0,320,300);
|
||||||
|
setText("WorldButton", "World");
|
||||||
|
setImage("Compass", "textures\\compass.dds");
|
||||||
|
|
||||||
|
// Obviously you should override this later on
|
||||||
|
setCellName("No Cell Loaded");
|
||||||
|
|
||||||
|
getWidget(mLocalMap, "LocalMap");
|
||||||
|
getWidget(mGlobalMap, "GlobalMap");
|
||||||
|
getWidget(mPlayerArrow, "Compass");
|
||||||
|
|
||||||
|
getWidget(mButton, "WorldButton");
|
||||||
|
mButton->eventMouseButtonClick += MyGUI::newDelegate(this, &MapWindow::onWorldButtonClicked);
|
||||||
|
|
||||||
|
MyGUI::Button* eventbox;
|
||||||
|
getWidget(eventbox, "EventBox");
|
||||||
|
eventbox->eventMouseDrag += MyGUI::newDelegate(this, &MapWindow::onMouseDrag);
|
||||||
|
eventbox->eventMouseButtonPressed += MyGUI::newDelegate(this, &MapWindow::onDragStart);
|
||||||
|
|
||||||
|
LocalMapBase::init(mLocalMap, this);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MapWindow::setCellName(const std::string& cellName)
|
||||||
|
{
|
||||||
|
static_cast<MyGUI::Window*>(mMainWidget)->setCaption(cellName);
|
||||||
|
adjustWindowCaption();
|
||||||
|
}
|
||||||
|
|
||||||
|
void MapWindow::setPlayerPos(const float x, const float y)
|
||||||
|
{
|
||||||
|
if (mGlobal || !mVisible || (x == mLastPositionX && y == mLastPositionY)) return;
|
||||||
|
MyGUI::IntSize size = mLocalMap->getCanvasSize();
|
||||||
|
MyGUI::IntPoint middle = MyGUI::IntPoint((1/3.f + x/3.f)*size.width,(1/3.f + y/3.f)*size.height);
|
||||||
|
MyGUI::IntCoord viewsize = mLocalMap->getCoord();
|
||||||
|
MyGUI::IntPoint pos(0.5*viewsize.width - middle.left, 0.5*viewsize.height - middle.top);
|
||||||
|
mLocalMap->setViewOffset(pos);
|
||||||
|
|
||||||
|
mPlayerArrow->setPosition(MyGUI::IntPoint(x*512-16, y*512-16));
|
||||||
|
mLastPositionX = x;
|
||||||
|
mLastPositionY = y;
|
||||||
|
}
|
||||||
|
|
||||||
|
void MapWindow::setPlayerDir(const float x, const float y)
|
||||||
|
{
|
||||||
|
if (!mVisible || (x == mLastDirectionX && y == mLastDirectionY)) return;
|
||||||
|
MyGUI::ISubWidget* main = mPlayerArrow->getSubWidgetMain();
|
||||||
|
MyGUI::RotatingSkin* rotatingSubskin = main->castType<MyGUI::RotatingSkin>();
|
||||||
|
rotatingSubskin->setCenter(MyGUI::IntPoint(16,16));
|
||||||
|
float angle = std::atan2(x,y);
|
||||||
|
rotatingSubskin->setAngle(angle);
|
||||||
|
|
||||||
|
mLastDirectionX = x;
|
||||||
|
mLastDirectionY = y;
|
||||||
|
}
|
||||||
|
|
||||||
|
void MapWindow::onDragStart(MyGUI::Widget* _sender, int _left, int _top, MyGUI::MouseButton _id)
|
||||||
|
{
|
||||||
|
if (_id!=MyGUI::MouseButton::Left) return;
|
||||||
|
if (!mGlobal)
|
||||||
|
mLastDragPos = MyGUI::IntPoint(_left, _top);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MapWindow::onMouseDrag(MyGUI::Widget* _sender, int _left, int _top, MyGUI::MouseButton _id)
|
||||||
|
{
|
||||||
|
if (_id!=MyGUI::MouseButton::Left) return;
|
||||||
|
|
||||||
|
if (!mGlobal)
|
||||||
|
{
|
||||||
|
MyGUI::IntPoint diff = MyGUI::IntPoint(_left, _top) - mLastDragPos;
|
||||||
|
mLocalMap->setViewOffset( mLocalMap->getViewOffset() + diff );
|
||||||
|
|
||||||
|
mLastDragPos = MyGUI::IntPoint(_left, _top);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void MapWindow::onWorldButtonClicked(MyGUI::Widget* _sender)
|
||||||
|
{
|
||||||
|
mGlobal = !mGlobal;
|
||||||
|
mGlobalMap->setVisible(mGlobal);
|
||||||
|
mLocalMap->setVisible(!mGlobal);
|
||||||
|
|
||||||
|
mButton->setCaption( mGlobal ? "Local" : "World" );
|
||||||
|
}
|
||||||
|
|
||||||
|
void MapWindow::onPinToggled()
|
||||||
|
{
|
||||||
|
mWindowManager.setMinimapVisibility(!mPinned);
|
||||||
|
}
|
34
apps/openmw/mwgui/map_window.hpp
Normal file
34
apps/openmw/mwgui/map_window.hpp
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
#ifndef MWGUI_MAPWINDOW_H
|
||||||
|
#define MWGUI_MAPWINDOW_H
|
||||||
|
|
||||||
|
#include "layouts.hpp"
|
||||||
|
#include "window_pinnable_base.hpp"
|
||||||
|
|
||||||
|
namespace MWGui
|
||||||
|
{
|
||||||
|
class MapWindow : public MWGui::WindowPinnableBase, public LocalMapBase
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
MapWindow(WindowManager& parWindowManager);
|
||||||
|
virtual ~MapWindow(){}
|
||||||
|
|
||||||
|
void setPlayerPos(const float x, const float y);
|
||||||
|
void setPlayerDir(const float x, const float y);
|
||||||
|
void setCellName(const std::string& cellName);
|
||||||
|
|
||||||
|
private:
|
||||||
|
void onDragStart(MyGUI::Widget* _sender, int _left, int _top, MyGUI::MouseButton _id);
|
||||||
|
void onMouseDrag(MyGUI::Widget* _sender, int _left, int _top, MyGUI::MouseButton _id);
|
||||||
|
void onWorldButtonClicked(MyGUI::Widget* _sender);
|
||||||
|
|
||||||
|
MyGUI::ScrollView* mGlobalMap;
|
||||||
|
MyGUI::ImageBox* mPlayerArrow;
|
||||||
|
MyGUI::Button* mButton;
|
||||||
|
MyGUI::IntPoint mLastDragPos;
|
||||||
|
bool mGlobal;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
virtual void onPinToggled();
|
||||||
|
};
|
||||||
|
}
|
||||||
|
#endif
|
|
@ -12,7 +12,7 @@ using namespace MWGui;
|
||||||
const int StatsWindow::lineHeight = 18;
|
const int StatsWindow::lineHeight = 18;
|
||||||
|
|
||||||
StatsWindow::StatsWindow (WindowManager& parWindowManager)
|
StatsWindow::StatsWindow (WindowManager& parWindowManager)
|
||||||
: WindowBase("openmw_stats_window_layout.xml", parWindowManager)
|
: WindowPinnableBase("openmw_stats_window_layout.xml", parWindowManager)
|
||||||
, skillAreaWidget(NULL)
|
, skillAreaWidget(NULL)
|
||||||
, skillClientWidget(NULL)
|
, skillClientWidget(NULL)
|
||||||
, skillScrollerWidget(NULL)
|
, skillScrollerWidget(NULL)
|
||||||
|
@ -381,3 +381,8 @@ void StatsWindow::updateScroller()
|
||||||
skillScrollerWidget->setScrollRange(std::max(clientHeight - skillClientWidget->getHeight(), 0));
|
skillScrollerWidget->setScrollRange(std::max(clientHeight - skillClientWidget->getHeight(), 0));
|
||||||
skillScrollerWidget->setScrollPage(std::max(skillClientWidget->getHeight() - lineHeight, 0));
|
skillScrollerWidget->setScrollPage(std::max(skillClientWidget->getHeight() - lineHeight, 0));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void StatsWindow::onPinToggled()
|
||||||
|
{
|
||||||
|
mWindowManager.setHMSVisibility(!mPinned);
|
||||||
|
}
|
||||||
|
|
|
@ -9,13 +9,13 @@
|
||||||
#include <utility>
|
#include <utility>
|
||||||
|
|
||||||
#include "../mwmechanics/stat.hpp"
|
#include "../mwmechanics/stat.hpp"
|
||||||
#include "window_base.hpp"
|
#include "window_pinnable_base.hpp"
|
||||||
|
|
||||||
namespace MWGui
|
namespace MWGui
|
||||||
{
|
{
|
||||||
class WindowManager;
|
class WindowManager;
|
||||||
|
|
||||||
class StatsWindow : public WindowBase
|
class StatsWindow : public WindowPinnableBase
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
typedef std::pair<std::string, int> Faction;
|
typedef std::pair<std::string, int> Faction;
|
||||||
|
@ -74,6 +74,9 @@ namespace MWGui
|
||||||
std::string birthSignId;
|
std::string birthSignId;
|
||||||
int reputation, bounty;
|
int reputation, bounty;
|
||||||
std::vector<MyGUI::WidgetPtr> skillWidgets; //< Skills and other information
|
std::vector<MyGUI::WidgetPtr> skillWidgets; //< Skills and other information
|
||||||
|
|
||||||
|
protected:
|
||||||
|
virtual void onPinToggled();
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -4,6 +4,7 @@
|
||||||
#include "review.hpp"
|
#include "review.hpp"
|
||||||
#include "dialogue.hpp"
|
#include "dialogue.hpp"
|
||||||
#include "dialogue_history.hpp"
|
#include "dialogue_history.hpp"
|
||||||
|
#include "map_window.hpp"
|
||||||
#include "stats_window.hpp"
|
#include "stats_window.hpp"
|
||||||
#include "messagebox.hpp"
|
#include "messagebox.hpp"
|
||||||
|
|
||||||
|
@ -71,7 +72,7 @@ WindowManager::WindowManager(MWWorld::Environment& environment,
|
||||||
|
|
||||||
hud = new HUD(w,h, showFPSLevel);
|
hud = new HUD(w,h, showFPSLevel);
|
||||||
menu = new MainMenu(w,h);
|
menu = new MainMenu(w,h);
|
||||||
map = new MapWindow();
|
map = new MapWindow(*this);
|
||||||
stats = new StatsWindow(*this);
|
stats = new StatsWindow(*this);
|
||||||
console = new Console(w,h, environment, extensions);
|
console = new Console(w,h, environment, extensions);
|
||||||
mJournal = new JournalWindow(*this);
|
mJournal = new JournalWindow(*this);
|
||||||
|
@ -456,6 +457,16 @@ void WindowManager::setPlayerDir(const float x, const float y)
|
||||||
hud->setPlayerDir(x,y);
|
hud->setPlayerDir(x,y);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void WindowManager::setHMSVisibility(bool visible)
|
||||||
|
{
|
||||||
|
hud->setBottomLeftVisibility(visible, hud->weapBox->getVisible(), hud->spellBox->getVisible());
|
||||||
|
}
|
||||||
|
|
||||||
|
void WindowManager::setMinimapVisibility(bool visible)
|
||||||
|
{
|
||||||
|
hud->setBottomRightVisibility(hud->effectBox->getVisible(), visible);
|
||||||
|
}
|
||||||
|
|
||||||
void WindowManager::toggleFogOfWar()
|
void WindowManager::toggleFogOfWar()
|
||||||
{
|
{
|
||||||
map->toggleFogOfWar();
|
map->toggleFogOfWar();
|
||||||
|
|
|
@ -162,6 +162,11 @@ namespace MWGui
|
||||||
void setInteriorMapTexture(const int x, const int y);
|
void setInteriorMapTexture(const int x, const int y);
|
||||||
///< set the index of the map texture that should be used (for interiors)
|
///< set the index of the map texture that should be used (for interiors)
|
||||||
|
|
||||||
|
// sets the visibility of the hud health/magicka/stamina bars
|
||||||
|
void setHMSVisibility(bool visible);
|
||||||
|
// sets the visibility of the hud minimap
|
||||||
|
void setMinimapVisibility(bool visible);
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
void removeDialog(T*& dialog); ///< Casts to OEngine::GUI::Layout and calls removeDialog, then resets pointer to nullptr.
|
void removeDialog(T*& dialog); ///< Casts to OEngine::GUI::Layout and calls removeDialog, then resets pointer to nullptr.
|
||||||
void removeDialog(OEngine::GUI::Layout* dialog); ///< Hides dialog and schedules dialog to be deleted.
|
void removeDialog(OEngine::GUI::Layout* dialog); ///< Hides dialog and schedules dialog to be deleted.
|
||||||
|
|
33
apps/openmw/mwgui/window_pinnable_base.cpp
Normal file
33
apps/openmw/mwgui/window_pinnable_base.cpp
Normal file
|
@ -0,0 +1,33 @@
|
||||||
|
#include "window_pinnable_base.hpp"
|
||||||
|
#include "window_manager.hpp"
|
||||||
|
|
||||||
|
using namespace MWGui;
|
||||||
|
|
||||||
|
WindowPinnableBase::WindowPinnableBase(const std::string& parLayout, WindowManager& parWindowManager)
|
||||||
|
: WindowBase(parLayout, parWindowManager), mPinned(false), mVisible(false)
|
||||||
|
{
|
||||||
|
MyGUI::WindowPtr t = static_cast<MyGUI::WindowPtr>(mMainWidget);
|
||||||
|
t->eventWindowButtonPressed += MyGUI::newDelegate(this, &WindowPinnableBase::onWindowButtonPressed);
|
||||||
|
}
|
||||||
|
|
||||||
|
void WindowPinnableBase::setVisible(bool b)
|
||||||
|
{
|
||||||
|
// Pinned windows can not be hidden
|
||||||
|
if (mPinned && !b)
|
||||||
|
return;
|
||||||
|
|
||||||
|
WindowBase::setVisible(b);
|
||||||
|
mVisible = b;
|
||||||
|
}
|
||||||
|
|
||||||
|
void WindowPinnableBase::onWindowButtonPressed(MyGUI::Window* sender, const std::string& eventName)
|
||||||
|
{
|
||||||
|
if ("PinToggle" == eventName)
|
||||||
|
{
|
||||||
|
mPinned = !mPinned;
|
||||||
|
onPinToggled();
|
||||||
|
}
|
||||||
|
|
||||||
|
eventDone(this);
|
||||||
|
}
|
||||||
|
|
28
apps/openmw/mwgui/window_pinnable_base.hpp
Normal file
28
apps/openmw/mwgui/window_pinnable_base.hpp
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
#ifndef MWGUI_WINDOW_PINNABLE_BASE_H
|
||||||
|
#define MWGUI_WINDOW_PINNABLE_BASE_H
|
||||||
|
|
||||||
|
#include "window_base.hpp"
|
||||||
|
|
||||||
|
namespace MWGui
|
||||||
|
{
|
||||||
|
class WindowManager;
|
||||||
|
|
||||||
|
class WindowPinnableBase: public WindowBase
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
WindowPinnableBase(const std::string& parLayout, WindowManager& parWindowManager);
|
||||||
|
void setVisible(bool b);
|
||||||
|
|
||||||
|
private:
|
||||||
|
void onWindowButtonPressed(MyGUI::Window* sender, const std::string& eventName);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
virtual void onPinToggled() = 0;
|
||||||
|
|
||||||
|
bool mPinned;
|
||||||
|
bool mVisible;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
|
@ -12,7 +12,7 @@ void tab() { cout << " "; }
|
||||||
// write one number with a space in front of it and a comma after it
|
// write one number with a space in front of it and a comma after it
|
||||||
void num(unsigned char i, bool last)
|
void num(unsigned char i, bool last)
|
||||||
{
|
{
|
||||||
cout << " 0x" << (unsigned)i;
|
cout << " (char)0x" << (unsigned)i;
|
||||||
if(!last) cout << ",";
|
if(!last) cout << ",";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -11,22 +11,24 @@
|
||||||
align="Left Bottom" name="Stamina"/>
|
align="Left Bottom" name="Stamina"/>
|
||||||
|
|
||||||
<!-- Equipped weapon box -->
|
<!-- Equipped weapon box -->
|
||||||
<Widget type="Widget" skin="HUD_Box" position="82 146 36 36"
|
<Widget type="Widget" position="82 146 36 41" align="Left Bottom" name="WeapBox">
|
||||||
align="Left Bottom">
|
<Widget type="Widget" skin="HUD_Box" position="0 0 36 36">
|
||||||
<Widget type="ImageBox" skin="ImageBox" position="2 2 32 32" align="Left Top"
|
<Widget type="ImageBox" skin="ImageBox" position="2 2 32 32" align="Left Top"
|
||||||
name="WeapImage"/>
|
name="WeapImage"/>
|
||||||
|
</Widget>
|
||||||
|
<Widget type="ProgressBar" skin="MW_EnergyBar_Red" position="0 36 36 6"
|
||||||
|
align="Left Bottom" name="WeapStatus"/>
|
||||||
</Widget>
|
</Widget>
|
||||||
<Widget type="ProgressBar" skin="MW_EnergyBar_Red" position="82 182 36 6"
|
|
||||||
align="Left Bottom" name="WeapStatus"/>
|
|
||||||
|
|
||||||
<!-- Selected spell box -->
|
<!-- Selected spell box -->
|
||||||
<Widget type="Widget" skin="HUD_Box" position="122 146 36 36"
|
<Widget type="Widget" position="122 146 36 41" align="Left Bottom" name="SpellBox">
|
||||||
align="Left Bottom">
|
<Widget type="Widget" skin="HUD_Box" position="0 0 36 36">
|
||||||
<Widget type="ImageBox" skin="ImageBox" position="2 2 32 32" align="Left Top"
|
<Widget type="ImageBox" skin="ImageBox" position="2 2 32 32" align="Left Top"
|
||||||
name="SpellImage"/>
|
name="SpellImage"/>
|
||||||
|
</Widget>
|
||||||
|
<Widget type="ProgressBar" skin="MW_EnergyBar_Red" position="0 36 36 6"
|
||||||
|
align="Left Bottom" name="SpellStatus"/>
|
||||||
</Widget>
|
</Widget>
|
||||||
<Widget type="ProgressBar" skin="MW_EnergyBar_Red" position="122 182 36 6"
|
|
||||||
align="Left Bottom" name="SpellStatus"/>
|
|
||||||
|
|
||||||
<!-- Spell effects box -->
|
<!-- Spell effects box -->
|
||||||
<Widget type="Widget" skin="HUD_Box" position="199 168 20 20"
|
<Widget type="Widget" skin="HUD_Box" position="199 168 20 20"
|
||||||
|
@ -36,7 +38,7 @@
|
||||||
</Widget>
|
</Widget>
|
||||||
|
|
||||||
<!-- Map box -->
|
<!-- Map box -->
|
||||||
<Widget type="Widget" skin="HUD_Box" position="223 123 65 65"
|
<Widget type="Widget" skin="HUD_Box" position="223 123 65 65" name="MiniMapBox"
|
||||||
align="Right Bottom">
|
align="Right Bottom">
|
||||||
|
|
||||||
<Widget type="ScrollView" skin="MW_MapView" position="2 2 61 61" align="Left Bottom" name="MiniMap">
|
<Widget type="ScrollView" skin="MW_MapView" position="2 2 61 61" align="Left Bottom" name="MiniMap">
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
|
||||||
<MyGUI type="Layout">
|
<MyGUI type="Layout">
|
||||||
<Widget type="Window" skin="MW_Window" layer="Windows" position="0 0 300 300" name="_Main">
|
<Widget type="Window" skin="MW_Window_Pinnable" layer="Windows" position="0 0 300 300" name="_Main">
|
||||||
|
|
||||||
<!-- Global map -->
|
<!-- Global map -->
|
||||||
<Widget type="ScrollView" skin="MW_MapView" position="0 0 284 264" align="ALIGN_STRETCH" name="GlobalMap">
|
<Widget type="ScrollView" skin="MW_MapView" position="0 0 284 264" align="ALIGN_STRETCH" name="GlobalMap">
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
|
||||||
<MyGUI type="Layout">
|
<MyGUI type="Layout">
|
||||||
<Widget type="Window" skin="MW_Window" layer="Windows" position="0 0 500 342" name="_Main">
|
<Widget type="Window" skin="MW_Window_Pinnable" layer="Windows" position="0 0 500 342" name="_Main">
|
||||||
|
|
||||||
<!-- Player health stats -->
|
<!-- Player health stats -->
|
||||||
<Widget type="Widget" skin="MW_Box" position="8 8 212 62">
|
<Widget type="Widget" skin="MW_Box" position="8 8 212 62">
|
||||||
|
|
|
@ -289,6 +289,87 @@
|
||||||
</Child>
|
</Child>
|
||||||
</Skin>
|
</Skin>
|
||||||
|
|
||||||
|
<Skin name = "MW_Window_Pinnable" size = "256 54">
|
||||||
|
<Property key="FontName" value = "Default" />
|
||||||
|
<Property key="TextAlign" value = "ALIGN_CENTER" />
|
||||||
|
<Property key="TextColour" value = "0.8 0.8 0.8" />
|
||||||
|
<Property key="Snap" value = "true" />
|
||||||
|
|
||||||
|
<Child type="Widget" skin="BlackBG" offset = "8 28 240 18" align = "ALIGN_STRETCH" name = "Client"/>
|
||||||
|
|
||||||
|
<!-- Outer borders -->
|
||||||
|
<Child type="Widget" skin="TB_T" offset="4 0 248 4" align="ALIGN_TOP ALIGN_HSTRETCH" name="Action">
|
||||||
|
<Property key="Scale" value = "0 1 0 -1"/>
|
||||||
|
</Child>
|
||||||
|
<Child type="Widget" skin="TB_L" offset="0 4 4 46" align="ALIGN_LEFT ALIGN_VSTRETCH" name="Action">
|
||||||
|
<Property key="Scale" value = "1 0 -1 0"/>
|
||||||
|
</Child>
|
||||||
|
<Child type="Widget" skin="TB_B" offset="4 50 248 4" align="ALIGN_BOTTOM ALIGN_HSTRETCH" name="Action">
|
||||||
|
<Property key="Scale" value = "0 0 0 1"/>
|
||||||
|
</Child>
|
||||||
|
<Child type="Widget" skin="TB_R" offset="252 4 4 46" align="ALIGN_RIGHT ALIGN_VSTRETCH" name="Action">
|
||||||
|
<Property key="Scale" value = "0 0 1 0"/>
|
||||||
|
</Child>
|
||||||
|
|
||||||
|
<Child type="Widget" skin="TB_BR" offset="252 50 4 4" align="ALIGN_RIGHT ALIGN_BOTTOM" name="Action">
|
||||||
|
<Property key="Scale" value = "0 0 1 1"/>
|
||||||
|
</Child>
|
||||||
|
<Child type="Widget" skin="TB_BL" offset="0 50 4 4" align="ALIGN_LEFT ALIGN_BOTTOM" name="Action">
|
||||||
|
<Property key="Scale" value = "1 0 -1 1"/>
|
||||||
|
</Child>
|
||||||
|
<Child type="Widget" skin="TB_TR" offset="252 0 4 4" align="ALIGN_RIGHT ALIGN_TOP" name="Action">
|
||||||
|
<Property key="Scale" value = "0 1 1 -1"/>
|
||||||
|
</Child>
|
||||||
|
<Child type="Widget" skin="TB_TL" offset="0 0 4 4" align="ALIGN_LEFT ALIGN_TOP" name="Action">
|
||||||
|
<Property key="Scale" value = "1 1 -1 -1"/>
|
||||||
|
</Child>
|
||||||
|
|
||||||
|
<!-- Inner borders -->
|
||||||
|
<Child type="Widget" skin="TB_T" offset="8 24 240 4" align="ALIGN_TOP ALIGN_HSTRETCH" name="Action">
|
||||||
|
<Property key="Scale" value = "0 1 0 -1"/>
|
||||||
|
</Child>
|
||||||
|
<Child type="Widget" skin="TB_L" offset="4 28 4 18" align="ALIGN_LEFT ALIGN_VSTRETCH" name="Action">
|
||||||
|
<Property key="Scale" value = "1 0 -1 0"/>
|
||||||
|
</Child>
|
||||||
|
<Child type="Widget" skin="TB_B" offset="8 46 240 4" align="ALIGN_BOTTOM ALIGN_HSTRETCH" name="Action">
|
||||||
|
<Property key="Scale" value = "0 0 0 1"/>
|
||||||
|
</Child>
|
||||||
|
<Child type="Widget" skin="TB_R" offset="248 28 4 18" align="ALIGN_RIGHT ALIGN_VSTRETCH" name="Action">
|
||||||
|
<Property key="Scale" value = "0 0 1 0"/>
|
||||||
|
</Child>
|
||||||
|
<Child type="Widget" skin="TB_BR" offset="248 46 4 4" align="ALIGN_BOTTOM ALIGN_RIGHT" name="Action">
|
||||||
|
<Property key="Scale" value = "0 0 1 1"/>
|
||||||
|
</Child>
|
||||||
|
<Child type="Widget" skin="TB_BL" offset="4 46 4 4" align="ALIGN_BOTTOM ALIGN_LEFT" name="Action">
|
||||||
|
<Property key="Scale" value = "1 0 -1 1"/>
|
||||||
|
</Child>
|
||||||
|
<Child type="Widget" skin="TB_TR" offset="248 24 4 4" align="ALIGN_TOP ALIGN_RIGHT" name="Action">
|
||||||
|
<Property key="Scale" value = "0 1 1 -1"/>
|
||||||
|
</Child>
|
||||||
|
<Child type="Widget" skin="TB_TL" offset="4 24 4 4" align="ALIGN_TOP ALIGN_LEFT" name="Action">
|
||||||
|
<Property key="Scale" value = "1 1 -1 -1"/>
|
||||||
|
</Child>
|
||||||
|
|
||||||
|
<!-- Caption -->
|
||||||
|
|
||||||
|
<Child type="Widget" skin="HB_ALL" offset="4 4 248 20" align = "ALIGN_TOP ALIGN_HSTRETCH">
|
||||||
|
<Property key="Scale" value = "1 1 0 0"/>
|
||||||
|
</Child>
|
||||||
|
|
||||||
|
<Child type="TextBox" skin="MW_Caption" offset = "80 4 88 20" align = "ALIGN_HCENTER ALIGN_TOP" name = "Caption">
|
||||||
|
</Child>
|
||||||
|
|
||||||
|
<!-- This invisible button makes it possible to move the
|
||||||
|
window by dragging the caption. -->
|
||||||
|
<Child type="Button" offset="4 4 248 20" align="ALIGN_HSTRETCH ALIGN_TOP" name="Action">
|
||||||
|
<Property key="Scale" value = "1 1 0 0"/>
|
||||||
|
</Child>
|
||||||
|
|
||||||
|
<Child type="Button" skin="BlackBG" offset="230 4 21 19" align="ALIGN_RIGHT ALIGN_TOP" name="Button">
|
||||||
|
<Property key="Event" value="PinToggle"/>
|
||||||
|
</Child>
|
||||||
|
</Skin>
|
||||||
|
|
||||||
<Skin name = "MW_Dialog" size = "256 54">
|
<Skin name = "MW_Dialog" size = "256 54">
|
||||||
<Property key="FontName" value = "Default" />
|
<Property key="FontName" value = "Default" />
|
||||||
<Property key="TextAlign" value = "ALIGN_CENTER" />
|
<Property key="TextAlign" value = "ALIGN_CENTER" />
|
||||||
|
|
|
@ -103,7 +103,7 @@ namespace GUI
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
void setVisible(bool b)
|
virtual void setVisible(bool b)
|
||||||
{
|
{
|
||||||
mMainWidget->setVisible(b);
|
mMainWidget->setVisible(b);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue