From 9654a6554c9a42e13f641f8f52e04246d96882b8 Mon Sep 17 00:00:00 2001 From: Thorbjørn Lindeijer Date: Thu, 2 Aug 2012 00:51:58 +0200 Subject: Embedded the minimap into the mini status window --- src/gui/minimap.cpp | 89 +++++++------------------------------------- src/gui/minimap.h | 14 ++----- src/gui/ministatuswindow.cpp | 42 ++++++++++++++++++--- src/gui/ministatuswindow.h | 11 ++++++ 4 files changed, 65 insertions(+), 91 deletions(-) (limited to 'src/gui') diff --git a/src/gui/minimap.cpp b/src/gui/minimap.cpp index 44df66ae..cd00a5af 100644 --- a/src/gui/minimap.cpp +++ b/src/gui/minimap.cpp @@ -39,55 +39,23 @@ #include -bool Minimap::mShow = true; - Minimap::Minimap(): - Window(_("Map")), mMap(0), mMapImage(0), mWidthProportion(0.5), mHeightProportion(0.5) { - setWindowName("Minimap"); - mShow = config.getValue(getWindowName() + "Show", true); - setDefaultSize(5, 25, 150, 150); - // set this to false as the minimap window size is changed - //depending on the map size - setResizable(false); - setupWindow->registerWindowForReset(this); - - setDefaultVisible(true); - setSaveVisible(true); - - setStickyButton(true); - setSticky(false); - - loadWindowState(); - setVisible(mShow, isSticky()); + setSize(100, 100); } Minimap::~Minimap() { - config.setValue(getWindowName() + "Show", mShow); - if (mMapImage) mMapImage->decRef(); } void Minimap::setMap(Map *map) { - // Set the title for the Minimap - std::string caption = ""; - std::string minimapName; - - if (map) - caption = map->getName(); - - if (caption.empty()) - caption = _("Map"); - - minimap->setCaption(caption); - // Adapt the image if (mMapImage) { @@ -102,7 +70,7 @@ void Minimap::setMap(Map *map) "graphics/minimaps/" + map->getFilename() + ".png"; ResourceManager *resman = ResourceManager::getInstance(); - minimapName = map->getProperty("minimap"); + std::string minimapName = map->getProperty("minimap"); if (minimapName.empty() && resman->exists(tempname)) minimapName = tempname; @@ -113,69 +81,40 @@ void Minimap::setMap(Map *map) if (mMapImage) { - const int offsetX = 2 * getPadding(); - const int offsetY = getTitleBarHeight() + getPadding(); - const int titleWidth = getFont()->getWidth(getCaption()) + 15; - const int mapWidth = mMapImage->getWidth() < 150 ? - mMapImage->getWidth() + offsetX : 150; - const int mapHeight = mMapImage->getHeight() < 150 ? - mMapImage->getHeight() + offsetY : 150; - - setMinWidth(mapWidth > titleWidth ? mapWidth : titleWidth); - setMinHeight(mapHeight); - mWidthProportion = (float) mMapImage->getWidth() / map->getWidth(); mHeightProportion = (float) mMapImage->getHeight() / map->getHeight(); - setMaxWidth(mMapImage->getWidth() > titleWidth ? - mMapImage->getWidth() + offsetX : titleWidth); - setMaxHeight(mMapImage->getHeight() + offsetY); - - setDefaultSize(getX(), getY(), getWidth(), getHeight()); - resetToDefaultSize(); - - if (mShow) - setVisible(true); + setVisible(true); } else { - if (!isSticky()) - setVisible(false); + setVisible(true); } } -void Minimap::toggle() -{ - setVisible(!isVisible(), isSticky()); - mShow = isVisible(); -} - void Minimap::draw(gcn::Graphics *graphics) { - Window::draw(graphics); - - gcn::Rectangle a = getChildrenArea(); - a.width = a.width - 3; - a.height = a.height - 3; - graphics->pushClipArea(a); + const int width = getWidth(); + const int height = getHeight(); + graphics->pushClipArea(gcn::Rectangle(0, 0, width, height)); int mapOriginX = 0; int mapOriginY = 0; if (mMapImage && mMap) { - if (mMapImage->getWidth() > a.width || - mMapImage->getHeight() > a.height) + + if (mMapImage->getWidth() > width || + mMapImage->getHeight() > height) { const Vector &p = local_player->getPosition(); - mapOriginX = (int) (((a.width) / 2) - (int) (p.x * mWidthProportion) + mapOriginX = (int) ((width / 2) - (int) (p.x * mWidthProportion) / mMap->getTileWidth()); - mapOriginY = (int) (((a.height) / 2) - - (int) (p.y * mHeightProportion) + mapOriginY = (int) ((height / 2) - (int) (p.y * mHeightProportion) / mMap->getTileHeight()); - const int minOriginX = a.width - mMapImage->getWidth(); - const int minOriginY = a.height - mMapImage->getHeight(); + const int minOriginX = width - mMapImage->getWidth(); + const int minOriginY = height - mMapImage->getHeight(); if (mapOriginX < minOriginX) mapOriginX = minOriginX; diff --git a/src/gui/minimap.h b/src/gui/minimap.h index e44753e3..2cb6b5bd 100644 --- a/src/gui/minimap.h +++ b/src/gui/minimap.h @@ -22,13 +22,13 @@ #ifndef MINIMAP_H #define MINIMAP_H -#include "gui/widgets/window.h" +#include class Image; class Map; /** - * Minimap window. Shows a minimap image and the name of the current map. + * Shows a minimap image. * * The name of the map is defined by the map property "name". The minimap image * is defined by the map property "minimap". The path to the image should be @@ -36,7 +36,7 @@ class Map; * * \ingroup Interface */ -class Minimap : public Window +class Minimap : public gcn::Widget { public: Minimap(); @@ -47,11 +47,6 @@ class Minimap : public Window */ void setMap(Map *map); - /** - * Toggles the displaying of the minimap. - */ - void toggle(); - /** * Draws the minimap. */ @@ -62,9 +57,6 @@ class Minimap : public Window Image *mMapImage; float mWidthProportion; float mHeightProportion; - static bool mShow; }; -extern Minimap *minimap; - #endif diff --git a/src/gui/ministatuswindow.cpp b/src/gui/ministatuswindow.cpp index 86dd4adf..df8b4aba 100644 --- a/src/gui/ministatuswindow.cpp +++ b/src/gui/ministatuswindow.cpp @@ -28,11 +28,14 @@ #include "statuseffect.h" #include "gui/gui.h" +#include "gui/minimap.h" #include "gui/statuswindow.h" #include "gui/textpopup.h" -#include "gui/widgets/progressbar.h" +#include "gui/widgets/label.h" #include "gui/widgets/layout.h" +#include "gui/widgets/progressbar.h" +#include "gui/widgets/spacer.h" #include "net/net.h" #include "net/playerhandler.h" @@ -47,11 +50,17 @@ extern volatile int tick_time; -MiniStatusWindow::MiniStatusWindow() +MiniStatusWindow::MiniStatusWindow(): + mMinimap(new Minimap), + mRegionLabel(new Label), + mWindowSkin(Theme::instance()->load("window.xml")) { listen(Event::AttributesChannel); listen(Event::ActorSpriteChannel); + mRegionLabel->setAlignment(gcn::Graphics::CENTER); + mRegionLabel->adjustSize(); + mHpBar = new ProgressBar(0, 100, 20, Theme::PROG_HP); StatusWindow::updateHPBar(mHpBar); @@ -69,9 +78,10 @@ MiniStatusWindow::MiniStatusWindow() mXpBar = new ProgressBar(0, 100, 20, Theme::PROG_EXP); StatusWindow::updateXPBar(mXpBar); - // Add the progressbars to the window - int row = 0; + place(0, row++, mRegionLabel); + place(0, row++, mMinimap); + place(0, row++, new Spacer); place(0, row++, mHpBar); if (mMpBar) place(0, row++, mMpBar); @@ -79,6 +89,7 @@ MiniStatusWindow::MiniStatusWindow() Layout &layout = getLayout(); layout.setMargin(0); + layout.setPadding(7); int w = 0; int h = 0; @@ -235,10 +246,25 @@ void MiniStatusWindow::logic() mIcons[i]->update(tick_time * 10); } +static gcn::Rectangle adjust(const gcn::Rectangle &rect, + int left, int top, int right, int bottom) +{ + return gcn::Rectangle(rect.x + left, + rect.y + top, + rect.width - left + right, + rect.height - top + bottom); +} + void MiniStatusWindow::draw(gcn::Graphics *graphics) { + Graphics *g = static_cast(graphics); + g->drawImageRect(adjust(mMinimap->getDimension(), + -5, -10 - mRegionLabel->getHeight(), + 8, 8), + mWindowSkin->getBorder()); + drawChildren(graphics); - drawIcons(static_cast(graphics)); + drawIcons(g); } void MiniStatusWindow::mouseMoved(gcn::MouseEvent &event) @@ -277,3 +303,9 @@ void MiniStatusWindow::mouseExited(gcn::MouseEvent &event) { mTextPopup->setVisible(false); } + +void MiniStatusWindow::setMap(Map *map) +{ + mMinimap->setMap(map); + mRegionLabel->setCaption(map ? map->getName() : std::string()); +} diff --git a/src/gui/ministatuswindow.h b/src/gui/ministatuswindow.h index a9939fcd..86e2e4f0 100644 --- a/src/gui/ministatuswindow.h +++ b/src/gui/ministatuswindow.h @@ -32,7 +32,11 @@ class AnimatedSprite; class Graphics; +class Label; +class Map; +class Minimap; class ProgressBar; +class Skin; class TextPopup; /** @@ -58,6 +62,8 @@ class MiniStatusWindow : public Container, void mouseMoved(gcn::MouseEvent &mouseEvent); void mouseExited(gcn::MouseEvent &event); + void setMap(Map *map); + private: bool isInBar(ProgressBar *bar, int x, int y) const; @@ -68,6 +74,9 @@ class MiniStatusWindow : public Container, void eraseIcon(int index); + Minimap *mMinimap; + Label *mRegionLabel; + /* * Mini Status Bars */ @@ -76,6 +85,8 @@ class MiniStatusWindow : public Container, ProgressBar *mXpBar; TextPopup *mTextPopup; + Skin *mWindowSkin; + std::vector mStatusEffectIcons; std::vector mIcons; }; -- cgit v1.2.3-60-g2f50