diff options
author | Andrei Karas <akaras@inbox.ru> | 2015-08-02 16:13:36 +0300 |
---|---|---|
committer | Andrei Karas <akaras@inbox.ru> | 2015-08-03 21:50:05 +0300 |
commit | f651273ebf2a8b11aa01ed1434ecb613177ced6a (patch) | |
tree | c51d2bed1476270e27ad95c5a46e15af32eaccdd /src/dyetool/gui | |
parent | 30846b7f68f1ad05a0719ae37f75fd2901a6545a (diff) | |
download | plus-f651273ebf2a8b11aa01ed1434ecb613177ced6a.tar.gz plus-f651273ebf2a8b11aa01ed1434ecb613177ced6a.tar.bz2 plus-f651273ebf2a8b11aa01ed1434ecb613177ced6a.tar.xz plus-f651273ebf2a8b11aa01ed1434ecb613177ced6a.zip |
Add gui mode for dyecmd. Now only basic code added.
Diffstat (limited to 'src/dyetool/gui')
-rw-r--r-- | src/dyetool/gui/viewport.cpp | 290 | ||||
-rw-r--r-- | src/dyetool/gui/viewport.h | 220 |
2 files changed, 510 insertions, 0 deletions
diff --git a/src/dyetool/gui/viewport.cpp b/src/dyetool/gui/viewport.cpp new file mode 100644 index 000000000..26de44a3a --- /dev/null +++ b/src/dyetool/gui/viewport.cpp @@ -0,0 +1,290 @@ +/* + * The ManaPlus Client + * Copyright (C) 2004-2009 The Mana World Development Team + * Copyright (C) 2009-2010 The Mana Developers + * Copyright (C) 2011-2015 The ManaPlus Developers + * + * This file is part of The ManaPlus Client. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * any later version. + * + * 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 + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include "gui/viewport.h" + +#include "actormanager.h" +#include "configuration.h" +#include "game.h" +#include "settings.h" +#include "sdlshared.h" +#include "textmanager.h" + +#include "enums/resources/map/mapitemtype.h" + +#include "resources/map/map.h" +#include "resources/map/mapitem.h" +#include "resources/map/speciallayer.h" + +#include "being/localplayer.h" +#include "being/playerinfo.h" + +#include "input/inputmanager.h" + +#include "gui/gui.h" +#include "gui/popupmanager.h" +#include "gui/userpalette.h" + +#include "gui/fonts/font.h" + +#include "gui/popups/beingpopup.h" +#include "gui/popups/popupmenu.h" +#include "gui/popups/textpopup.h" + +#include "gui/windows/ministatuswindow.h" + +#include "debug.h" + +Viewport *viewport = nullptr; + +extern volatile int tick_time; +extern MiniStatusWindow *miniStatusWindow; + +Viewport::Viewport() : + WindowContainer(nullptr), + MouseListener(), + mMouseX(0), + mMouseY(0), + mMap(nullptr), + mHoverBeing(nullptr), + mHoverItem(nullptr), + mHoverSign(nullptr), + mScrollRadius(config.getIntValue("ScrollRadius")), + mScrollLaziness(config.getIntValue("ScrollLaziness")), + mScrollCenterOffsetX(config.getIntValue("ScrollCenterOffsetX")), + mScrollCenterOffsetY(config.getIntValue("ScrollCenterOffsetY")), + mMousePressX(0), + mMousePressY(0), + mPixelViewX(0), + mPixelViewY(0), + mLocalWalkTime(-1), + mCameraRelativeX(0), + mCameraRelativeY(0), + mShowBeingPopup(config.getBoolValue("showBeingPopup")), + mSelfMouseHeal(config.getBoolValue("selfMouseHeal")), + mEnableLazyScrolling(config.getBoolValue("enableLazyScrolling")), + mMouseDirectionMove(config.getBoolValue("mouseDirectionMove")), + mLongMouseClick(config.getBoolValue("longmouseclick")), + mMouseClicked(false), + mPlayerFollowMouse(false) +{ + setOpaque(false); + addMouseListener(this); + + config.addListener("ScrollLaziness", this); + config.addListener("ScrollRadius", this); + config.addListener("showBeingPopup", this); + config.addListener("selfMouseHeal", this); + config.addListener("enableLazyScrolling", this); + config.addListener("mouseDirectionMove", this); + config.addListener("longmouseclick", this); + + setFocusable(true); +} + +Viewport::~Viewport() +{ + config.removeListeners(this); + CHECKLISTENERS +} + +void Viewport::setMap(Map *const map A_UNUSED) +{ +} + +void Viewport::draw(Graphics *graphics) +{ + BLOCK_START("Viewport::draw 1") + static int lastTick = tick_time; + + graphics->setColor(Color(64, 64, 64)); + graphics->fillRectangle( + Rect(0, 0, getWidth(), getHeight())); + + // Avoid freaking out when tick_time overflows + if (tick_time < lastTick) + lastTick = tick_time; + + // Draw contained widgets + WindowContainer::draw(graphics); + BLOCK_END("Viewport::draw 1") +} + +void Viewport::safeDraw(Graphics *graphics) +{ + Viewport::draw(graphics); +} + +void Viewport::logic() +{ + BLOCK_START("Viewport::logic") + // Make the player follow the mouse position + // if the mouse is dragged elsewhere than in a window. + Gui::getMouseState(mMouseX, mMouseY); + BLOCK_END("Viewport::logic") +} + +void Viewport::followMouse() +{ +} + +void Viewport::drawDebugPath(Graphics *const graphics A_UNUSED) +{ +} + +bool Viewport::openContextMenu(const MouseEvent &event A_UNUSED) +{ + return false; +} + +void Viewport::mousePressed(MouseEvent &event) +{ + if (event.getSource() != this || event.isConsumed()) + return; + + mMouseClicked = true; + + mMousePressX = event.getX(); + mMousePressY = event.getY(); + const MouseButtonT eventButton = event.getButton(); + + // Right click might open a popup + if (eventButton == MouseButton::RIGHT) + { + if (openContextMenu(event)) + return; + } + + // If a popup is active, just remove it + if (popupManager->isPopupMenuVisible()) + { + mPlayerFollowMouse = false; + popupManager->hidePopupMenu(); + return; + } + + // Left click can cause different actions + if (!mLongMouseClick && eventButton == MouseButton::LEFT) + { + if (leftMouseAction()) + { + mPlayerFollowMouse = false; + return; + } + } +} + +void Viewport::walkByMouse(const MouseEvent &event A_UNUSED) +{ +} + +void Viewport::mouseDragged(MouseEvent &event) +{ + if (event.getSource() != this || event.isConsumed()) + { + mPlayerFollowMouse = false; + return; + } + if (mMouseClicked) + { + if (abs(event.getX() - mMousePressX) > 32 + || abs(event.getY() - mMousePressY) > 32) + { + mPlayerFollowMouse = true; + } + } + + walkByMouse(event); +} + +void Viewport::mouseReleased(MouseEvent &event) +{ + mPlayerFollowMouse = false; + mLocalWalkTime = -1; + if (mLongMouseClick && mMouseClicked) + { + mMouseClicked = false; + if (event.getSource() != this || event.isConsumed()) + return; + const MouseButtonT eventButton = event.getButton(); + if (eventButton == MouseButton::LEFT) + { + // long button press + if (gui && gui->isLongPress()) + { + if (openContextMenu(event)) + { + gui->resetClickCount(); + return; + } + } + else + { + if (leftMouseAction()) + return; + } + walkByMouse(event); + } + } +} + +void Viewport::optionChanged(const std::string &name) +{ + if (name == "ScrollLaziness") + mScrollLaziness = config.getIntValue("ScrollLaziness"); + else if (name == "ScrollRadius") + mScrollRadius = config.getIntValue("ScrollRadius"); + else if (name == "showBeingPopup") + mShowBeingPopup = config.getBoolValue("showBeingPopup"); + else if (name == "selfMouseHeal") + mSelfMouseHeal = config.getBoolValue("selfMouseHeal"); + else if (name == "enableLazyScrolling") + mEnableLazyScrolling = config.getBoolValue("enableLazyScrolling"); + else if (name == "mouseDirectionMove") + mMouseDirectionMove = config.getBoolValue("mouseDirectionMove"); + else if (name == "longmouseclick") + mLongMouseClick = config.getBoolValue("longmouseclick"); +} + +void Viewport::mouseMoved(MouseEvent &event A_UNUSED) +{ +} + +void Viewport::toggleMapDrawType() +{ +} + +void Viewport::toggleCameraMode() +{ +} + +void Viewport::cleanHoverItems() +{ + mHoverBeing = nullptr; + mHoverItem = nullptr; + mHoverSign = nullptr; +} + +bool Viewport::leftMouseAction() +{ + return false; +} diff --git a/src/dyetool/gui/viewport.h b/src/dyetool/gui/viewport.h new file mode 100644 index 000000000..12527d962 --- /dev/null +++ b/src/dyetool/gui/viewport.h @@ -0,0 +1,220 @@ +/* + * The ManaPlus Client + * Copyright (C) 2004-2009 The Mana World Development Team + * Copyright (C) 2009-2010 The Mana Developers + * Copyright (C) 2011-2015 The ManaPlus Developers + * + * This file is part of The ManaPlus Client. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * any later version. + * + * 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 + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#ifndef DYETOOL_GUI_VIEWPORT_H +#define DYETOOL_GUI_VIEWPORT_H + +#include "position.h" + +#include "enums/simpletypes/beingid.h" + +#include "gui/widgets/windowcontainer.h" + +#include "listeners/mouselistener.h" + +class ActorSprite; +class Being; +class FloorItem; +class Graphics; +class Map; +class MapItem; + +/** Delay between two mouse calls when dragging mouse and move the player */ +const int walkingMouseDelay = 500; + +/** + * The viewport on the map. Displays the current map and handles mouse input + * and the popup menu. + * + * TODO: This class is planned to be extended to allow floating widgets on top + * of it such as NPC messages, which are positioned using map pixel + * coordinates. + */ +class Viewport final : public WindowContainer, + public MouseListener, + public ConfigListener +{ + public: + /** + * Constructor. + */ + Viewport(); + + A_DELETE_COPY(Viewport) + + /** + * Destructor. + */ + ~Viewport(); + + /** + * Sets the map displayed by the viewport. + */ + void setMap(Map *const map); + + /** + * Draws the viewport. + */ + void draw(Graphics *graphics) override final A_NONNULL(2); + + void safeDraw(Graphics *graphics) override final A_NONNULL(2); + + /** + * Implements player to keep following mouse. + */ + void logic() override final; + + /** + * Toggles whether the path debug graphics are shown. normal, + * debug with all images and grid, debug with out big images + * and with out grid. + */ + void toggleMapDrawType(); + + void toggleCameraMode(); + + /** + * Handles mouse press on map. + */ + void mousePressed(MouseEvent &event) override final; + + /** + * Handles mouse move on map + */ + void mouseDragged(MouseEvent &event) override final; + + /** + * Handles mouse button release on map. + */ + void mouseReleased(MouseEvent &event) override final; + + /** + * Handles mouse move on map. + */ + void mouseMoved(MouseEvent &event) override final; + + /** + * A relevant config option changed. + */ + void optionChanged(const std::string &name) override final; + + /** + * Returns camera x offset in pixels. + */ + int getCameraX() const A_WARN_UNUSED + { return mPixelViewX; } + + /** + * Returns camera y offset in pixels. + */ + int getCameraY() const A_WARN_UNUSED + { return mPixelViewY; } + + /** + * Changes viewpoint by relative pixel coordinates. + */ + void scrollBy(const int x, const int y) + { mPixelViewX += x; mPixelViewY += y; } + + /** + * Clear all hover item\being etc + */ + void cleanHoverItems(); + + Map *getMap() const A_WARN_UNUSED + { return mMap; } + + void moveCamera(const int dx, const int dy); + + int getCameraRelativeX() const A_WARN_UNUSED + { return mCameraRelativeX; } + + int getCameraRelativeY() const A_WARN_UNUSED + { return mCameraRelativeY; } + + void setCameraRelativeX(const int n) + { mCameraRelativeX = n; } + + void setCameraRelativeY(const int n) + { mCameraRelativeY = n; } + + int mMouseX; /**< Current mouse position in pixels. */ + int mMouseY; /**< Current mouse position in pixels. */ + + private: + /** + * Finds a path from the player to the mouse, and draws it. This is for + * debug purposes. + */ + void drawDebugPath(Graphics *const graphics) A_NONNULL(2); + + /** + * Draws the given path. + */ + void drawPath(Graphics *const graphics, + const Path &path, + const Color &color = Color(255, 0, 0)) + const A_NONNULL(2); + + bool leftMouseAction(); + + bool openContextMenu(const MouseEvent &event); + + void walkByMouse(const MouseEvent &event); + + /** + * Make the player go to the mouse position. + */ + void followMouse(); + + Map *mMap; /**< The current map. */ + + Being *mHoverBeing; /**< Being mouse is currently over. */ + FloorItem *mHoverItem; /**< FloorItem mouse is currently over. */ + MapItem *mHoverSign; /**< Map sign mouse is currently over. */ + + int mScrollRadius; + int mScrollLaziness; + int mScrollCenterOffsetX; + int mScrollCenterOffsetY; + int mMousePressX; + int mMousePressY; + int mPixelViewX; /**< Current viewpoint in pixels. */ + int mPixelViewY; /**< Current viewpoint in pixels. */ + + int mLocalWalkTime; /**< Timestamp before the next walk can be sent. */ + + int mCameraRelativeX; + int mCameraRelativeY; + + bool mShowBeingPopup; + bool mSelfMouseHeal; + bool mEnableLazyScrolling; + bool mMouseDirectionMove; + bool mLongMouseClick; + bool mMouseClicked; + bool mPlayerFollowMouse; +}; + +extern Viewport *viewport; /**< The viewport. */ + +#endif // DYETOOL_GUI_VIEWPORT_H |