From 9847915fafee7fc3872aafb4395543b12174a1ae Mon Sep 17 00:00:00 2001
From: Andrei Karas <akaras@inbox.ru>
Date: Wed, 19 Sep 2012 00:21:38 +0300
Subject: Add resize grip padding.

Fix resize grip position.
New theme option: resizePadding
---
 src/CMakeLists.txt             |  2 -
 src/Makefile.am                |  2 -
 src/gui/theme.cpp              |  7 ++++
 src/gui/widgets/resizegrip.cpp | 86 ------------------------------------------
 src/gui/widgets/resizegrip.h   | 61 ------------------------------
 src/gui/widgets/window.cpp     | 46 +++++++++++-----------
 src/gui/widgets/window.h       |  4 +-
 7 files changed, 31 insertions(+), 177 deletions(-)
 delete mode 100644 src/gui/widgets/resizegrip.cpp
 delete mode 100644 src/gui/widgets/resizegrip.h

diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 322264d6b..093741965 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -178,8 +178,6 @@ SET(SRCS
     gui/widgets/radiobutton.h
     gui/widgets/radiogroup.cpp
     gui/widgets/radiogroup.h
-    gui/widgets/resizegrip.cpp
-    gui/widgets/resizegrip.h
     gui/widgets/scrollarea.cpp
     gui/widgets/scrollarea.h
     gui/widgets/setupitem.cpp
diff --git a/src/Makefile.am b/src/Makefile.am
index 08463f6b2..11e9da603 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -189,8 +189,6 @@ manaplus_SOURCES += gui/widgets/avatarlistbox.cpp \
 	      gui/widgets/radiobutton.h \
 	      gui/widgets/radiogroup.cpp \
 	      gui/widgets/radiogroup.h \
-	      gui/widgets/resizegrip.cpp \
-	      gui/widgets/resizegrip.h \
 	      gui/widgets/scrollarea.cpp \
 	      gui/widgets/scrollarea.h \
 	      gui/widgets/setupitem.cpp \
diff --git a/src/gui/theme.cpp b/src/gui/theme.cpp
index 738b62672..c421e40e3 100644
--- a/src/gui/theme.cpp
+++ b/src/gui/theme.cpp
@@ -449,6 +449,7 @@ Skin *Theme::readSkin(const std::string &filename, const bool full)
     int titlePadding = 4;
     int titlebarHeight = 20;
     int closePadding = 3;
+    int resizePadding = 2;
     std::map<std::string, int> *const mOptions
         = new std::map<std::string, int>();
 
@@ -510,6 +511,11 @@ Skin *Theme::readSkin(const std::string &filename, const bool full)
                         titlebarHeight = XML::getProperty(
                             partNode, "value", 16);
                     }
+                    else if (name == "resizePadding")
+                    {
+                        resizePadding = XML::getProperty(
+                            partNode, "value", 2);
+                    }
                     else
                     {
                         (*mOptions)[name] = XML::getProperty(
@@ -530,6 +536,7 @@ Skin *Theme::readSkin(const std::string &filename, const bool full)
 
     (*mOptions)["closePadding"] = closePadding;
     (*mOptions)["titlebarHeight"] = titlebarHeight;
+    (*mOptions)["resizePadding"] = resizePadding;
 
     Skin *const skin = new Skin(border, images, filename, "", padding,
         titlePadding, mOptions);
diff --git a/src/gui/widgets/resizegrip.cpp b/src/gui/widgets/resizegrip.cpp
deleted file mode 100644
index d1c9ee8a9..000000000
--- a/src/gui/widgets/resizegrip.cpp
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- *  The ManaPlus Client
- *  Copyright (C) 2004-2009  The Mana World Development Team
- *  Copyright (C) 2009-2010  The Mana Developers
- *  Copyright (C) 2011-2012  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/widgets/resizegrip.h"
-
-#include "client.h"
-#include "configuration.h"
-#include "graphics.h"
-
-#include "gui/theme.h"
-
-#include "resources/image.h"
-
-#include <guichan/graphics.hpp>
-
-#include "debug.h"
-
-Image *ResizeGrip::gripImage = nullptr;
-int ResizeGrip::mInstances = 0;
-float ResizeGrip::mAlpha = 1.0;
-
-ResizeGrip::ResizeGrip(const std::string &image) :
-    gcn::Widget()
-{
-    if (mInstances == 0)
-    {
-        // Load the grip image
-        gripImage = Theme::getImageFromThemeXml(image, "");
-
-        if (gripImage)
-            gripImage->setAlpha(mAlpha);
-    }
-
-    mInstances++;
-
-    if (gripImage)
-    {
-        setWidth(gripImage->mBounds.w + 2);
-        setHeight(gripImage->mBounds.h + 2);
-    }
-    else
-    {
-        setWidth(2);
-        setHeight(2);
-    }
-}
-
-ResizeGrip::~ResizeGrip()
-{
-    mInstances--;
-    if (mInstances == 0 && gripImage)
-        gripImage->decRef();
-}
-
-void ResizeGrip::draw(gcn::Graphics *graphics)
-{
-    if (!gripImage)
-        return;
-
-    if (Client::getGuiAlpha() != mAlpha)
-    {
-        mAlpha = Client::getGuiAlpha();
-        gripImage->setAlpha(mAlpha);
-    }
-
-    static_cast<Graphics*>(graphics)->drawImage(gripImage, 0, 0);
-}
diff --git a/src/gui/widgets/resizegrip.h b/src/gui/widgets/resizegrip.h
deleted file mode 100644
index af94854a3..000000000
--- a/src/gui/widgets/resizegrip.h
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- *  The ManaPlus Client
- *  Copyright (C) 2004-2009  The Mana World Development Team
- *  Copyright (C) 2009-2010  The Mana Developers
- *  Copyright (C) 2011-2012  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 RESIZEGRIP_H
-#define RESIZEGRIP_H
-
-#include <guichan/widget.hpp>
-
-class Image;
-
-/**
- * Resize grip. The resize grip is part of a resizable Window. It relies on the
- * fact that uncaught mouse events are automatically routed to the parent
- * window.
- *
- * \ingroup GUI
- */
-class ResizeGrip : public gcn::Widget
-{
-    public:
-        /**
-         * Constructor.
-         */
-        ResizeGrip(const std::string &image = "resize.xml");
-
-        /**
-         * Destructor.
-         */
-        ~ResizeGrip();
-
-        /**
-         * Draws the resize grip.
-         */
-        void draw(gcn::Graphics *graphics);
-
-    private:
-        static Image *gripImage;   /**< Resize grip image */
-        static int mInstances;     /**< Number of resize grip instances */
-        static float mAlpha;
-};
-
-#endif
diff --git a/src/gui/widgets/window.cpp b/src/gui/widgets/window.cpp
index ce893c360..0a0951f9e 100644
--- a/src/gui/widgets/window.cpp
+++ b/src/gui/widgets/window.cpp
@@ -33,7 +33,6 @@
 #include "gui/viewport.h"
 
 #include "gui/widgets/layout.h"
-#include "gui/widgets/resizegrip.h"
 
 #include "resources/image.h"
 
@@ -77,6 +76,7 @@ Window::Window(const std::string &caption, const bool modal,
     mCaptionOffsetY(5),
     mCaptionAlign(gcn::Graphics::LEFT),
     mTitlePadding(4),
+    mGripPadding(2),
     mResizeHandles(-1),
     mRedraw(true),
     mCaptionFont(getFont())
@@ -106,6 +106,7 @@ Window::Window(const std::string &caption, const bool modal,
                 mCaptionFont = reinterpret_cast<gcn::Font*>(boldFont);
             setTitlePadding(mSkin->getTitlePadding());
             setTitleBarHeight(getOption("titlebarHeight"));
+            mGripPadding = getOption("resizePadding");
             mCaptionOffsetX = getOption("captionoffsetx");
             if (!mCaptionOffsetX)
                 mCaptionOffsetX = 7;
@@ -121,6 +122,7 @@ Window::Window(const std::string &caption, const bool modal,
         }
     }
 
+
     // Add this window to the window container
     windowContainer->add(this);
 
@@ -163,6 +165,11 @@ Window::~Window()
             Theme::instance()->unload(mSkin);
         mSkin = nullptr;
     }
+    if (mGrip)
+    {
+        mGrip->decRef();
+        mGrip = nullptr;
+    }
 }
 
 void Window::setWindowContainer(WindowContainer *wc)
@@ -213,6 +220,9 @@ void Window::draw(gcn::Graphics *graphics)
             g->drawImage(button, mStickyRect.x, mStickyRect.y);
     }
 
+    if (mGrip)
+        g->drawImage(mGrip, mGripRect.x, mGripRect.y);
+
     if (update)
     {
         g->setRedraw(update);
@@ -358,27 +368,19 @@ void Window::setMaxHeight(const int height)
 
 void Window::setResizable(const bool r)
 {
-    if (static_cast<bool>(mGrip) == r)
+    if ((mGrip != nullptr) == r)
         return;
 
+    if (mGrip)
+        mGrip->decRef();
     if (r)
     {
-        if (mGrip)
-        {
-            remove(mGrip);
-            delete mGrip;
-        }
-        mGrip = new ResizeGrip;
-        mGrip->setX(mDimension.width - mGrip->getWidth()
-            - getChildrenArea().x);
-        mGrip->setY(mDimension.height - mGrip->getHeight()
-            - getChildrenArea().y);
-        add(mGrip);
+        mGrip = Theme::getImageFromThemeXml("resize.xml", "");
+        mGripRect.x = mDimension.width - mGrip->getWidth() - mGripPadding;
+        mGripRect.y = mDimension.height - mGrip->getHeight() - mGripPadding;
     }
     else
     {
-        remove(mGrip);
-        delete mGrip;
         mGrip = nullptr;
     }
 }
@@ -389,8 +391,8 @@ void Window::widgetResized(const gcn::Event &event A_UNUSED)
 
     if (mGrip)
     {
-        mGrip->setPosition(mDimension.width - mGrip->getWidth() - area.x,
-                           mDimension.height - mGrip->getHeight() - area.y);
+        mGripRect.x = mDimension.width - mGrip->getWidth() - mGripPadding;
+        mGripRect.y = mDimension.height - mGrip->getHeight() - mGripPadding;
     }
 
     if (mLayout)
@@ -474,7 +476,6 @@ void Window::setStickyButtonLock(const bool lock)
 {
     mStickyButtonLock = lock;
     mStickyButton = lock;
-//    mMovable = false;
 }
 
 void Window::setVisible(bool visible)
@@ -919,8 +920,7 @@ int Window::getResizeHandles(const gcn::MouseEvent &event)
                 resizeHandles |= (y > mDimension.height - resizeBorderWidth)
                     ? BOTTOM : (y < resizeBorderWidth) ? TOP : 0;
             }
-
-            if (event.getSource() == mGrip)
+            if (x >= mGripRect.x && y >= mGripRect.y)
             {
                 mDragOffsetX = x;
                 mDragOffsetY = y;
@@ -944,7 +944,7 @@ bool Window::isResizeAllowed(const gcn::MouseEvent &event) const
         if (!getWindowArea().isPointInRect(x, y) && event.getSource() == this)
             return true;
 
-        if (event.getSource() == mGrip)
+        if (x >= mGripRect.x && y >= mGripRect.y)
             return true;
     }
 
@@ -969,10 +969,6 @@ void Window::clearLayout()
 {
     clear();
 
-    // Restore the resize grip
-    if (mGrip)
-        add(mGrip);
-
     // Recreate layout instance when one is present
     if (mLayout)
     {
diff --git a/src/gui/widgets/window.h b/src/gui/widgets/window.h
index 1e1caa6cd..fdcfc23de 100644
--- a/src/gui/widgets/window.h
+++ b/src/gui/widgets/window.h
@@ -442,11 +442,12 @@ class Window : public gcn::Window, private gcn::WidgetListener
          */
         int getResizeHandles(const gcn::MouseEvent &event);
 
-        ResizeGrip *mGrip;            /**< Resize grip */
+        Image *mGrip;                 /**< Resize grip */
         Window *mParent;              /**< The parent window */
         Layout *mLayout;              /**< Layout handler */
         gcn::Rectangle mCloseRect;    /**< Close button rectangle */
         gcn::Rectangle mStickyRect;   /**< Sticky button rectangle */
+        gcn::Rectangle mGripRect;     /**< Resize grip rectangle */
         std::string mWindowName;      /**< Name of the window */
         bool mShowTitle;              /**< Window has a title bar */
         bool mModal;                  /**< Window is modal */
@@ -480,6 +481,7 @@ class Window : public gcn::Window, private gcn::WidgetListener
         int mCaptionOffsetY;
         int mCaptionAlign;
         int mTitlePadding;
+        int mGripPadding;
         int mResizeHandles;
         bool mRedraw;
         gcn::Font *mCaptionFont;
-- 
cgit v1.2.3-70-g09d2