summaryrefslogtreecommitdiff
path: root/src/gui/widgets
diff options
context:
space:
mode:
authorAndrei Karas <akaras@inbox.ru>2013-11-03 19:30:43 +0300
committerAndrei Karas <akaras@inbox.ru>2013-11-03 19:30:43 +0300
commit9c3ba8303da72248d978696fc9363a2b47528b29 (patch)
tree354473f72b40e8db53c007cf9f9b92cdb2072068 /src/gui/widgets
parentfea0de5f467181252909f7c2456362a9c9401b0d (diff)
downloadmv-9c3ba8303da72248d978696fc9363a2b47528b29.tar.gz
mv-9c3ba8303da72248d978696fc9363a2b47528b29.tar.bz2
mv-9c3ba8303da72248d978696fc9363a2b47528b29.tar.xz
mv-9c3ba8303da72248d978696fc9363a2b47528b29.zip
add batch draw to slider.
Diffstat (limited to 'src/gui/widgets')
-rw-r--r--src/gui/widgets/slider.cpp234
-rw-r--r--src/gui/widgets/slider.h19
2 files changed, 196 insertions, 57 deletions
diff --git a/src/gui/widgets/slider.cpp b/src/gui/widgets/slider.cpp
index a500a8014..27b5fa43a 100644
--- a/src/gui/widgets/slider.cpp
+++ b/src/gui/widgets/slider.cpp
@@ -23,6 +23,7 @@
#include "gui/widgets/slider.h"
#include "client.h"
+#include "graphicsvertexes.h"
#include "input/keydata.h"
#include "input/keyevent.h"
@@ -44,7 +45,9 @@ static std::string const data[2] =
Slider::Slider(const double scaleEnd) :
gcn::Slider(scaleEnd),
Widget2(),
- mHasMouse(false)
+ mVertexes(new ImageCollection),
+ mHasMouse(false),
+ mRedraw(true)
{
init();
}
@@ -52,7 +55,9 @@ Slider::Slider(const double scaleEnd) :
Slider::Slider(const double scaleStart, const double scaleEnd) :
gcn::Slider(scaleStart, scaleEnd),
Widget2(),
- mHasMouse(false)
+ mVertexes(new ImageCollection),
+ mHasMouse(false),
+ mRedraw(true)
{
init();
}
@@ -62,6 +67,8 @@ Slider::~Slider()
if (gui)
gui->removeDragged(this);
+ delete mVertexes;
+ mVertexes = nullptr;
mInstances--;
if (mInstances == 0 && Theme::instance())
{
@@ -127,79 +134,196 @@ void Slider::draw(gcn::Graphics *graphics)
int x = 0;
const int y = mHasMouse ? (h - buttons[1].grid[HSTART]->getHeight()) / 2 :
(h - buttons[0].grid[HSTART]->getHeight()) / 2;
+ Graphics *const g = static_cast<Graphics*>(graphics);
updateAlpha();
- if (!mHasMouse)
+ if (openGLMode != RENDER_SAFE_OPENGL)
{
- static_cast<Graphics*>(graphics)->drawImage(
- buttons[0].grid[HSTART], x, y);
-
- const int width = buttons[0].grid[HSTART]->getWidth();
- w -= width + buttons[0].grid[HEND]->getWidth();
- x += width;
-
- if (buttons[0].grid[HMID])
+ if (mRedraw || g->getRedraw())
{
- const Image *const hMid = buttons[0].grid[HMID];
- static_cast<Graphics*>(graphics)->
- drawImagePattern(hMid, x, y, w, hMid->getHeight());
+ mRedraw = false;
+ mVertexes->clear();
+ if (!mHasMouse)
+ {
+ g->calcTile(mVertexes, buttons[0].grid[HSTART], x, y);
+
+ const int width = buttons[0].grid[HSTART]->getWidth();
+ w -= width + buttons[0].grid[HEND]->getWidth();
+ x += width;
+
+ if (buttons[0].grid[HMID])
+ {
+ const Image *const hMid = buttons[0].grid[HMID];
+ g->calcImagePattern(mVertexes, hMid, x, y,
+ w, hMid->getHeight());
+ }
+
+ x += w;
+ g->calcTile(mVertexes, buttons[0].grid[HEND], x, y);
+
+ const Image *const img = buttons[0].grid[HGRIP];
+ if (img)
+ {
+ g->calcTile(mVertexes, img, getMarkerPosition(),
+ (mDimension.height - img->getHeight()) / 2);
+ }
+ }
+ else
+ {
+ g->calcTile(mVertexes, buttons[1].grid[HSTART], x, y);
+
+ const int width = buttons[1].grid[HSTART]->getWidth();
+ w -= width;
+ if (buttons[1].grid[HEND])
+ w -= buttons[1].grid[HEND]->getWidth();
+ x += width;
+
+ if (buttons[1].grid[HMID])
+ {
+ const Image *const hMid = buttons[1].grid[HMID];
+ g->calcImagePattern(mVertexes, hMid, x, y,
+ w, hMid->getHeight());
+ }
+
+ x += w;
+ if (buttons[1].grid[HEND])
+ g->calcTile(mVertexes, buttons[1].grid[HEND], x, y);
+
+ const Image *const img = buttons[1].grid[HGRIP];
+ if (img)
+ {
+ g->calcTile(mVertexes, img, getMarkerPosition(),
+ (mDimension.height - img->getHeight()) / 2);
+ }
+ }
}
-
- x += w;
- static_cast<Graphics*>(graphics)->drawImage(
- buttons[0].grid[HEND], x, y);
+ g->drawTile(mVertexes);
}
else
{
- static_cast<Graphics*>(graphics)->drawImage(
- buttons[1].grid[HSTART], x, y);
+ if (!mHasMouse)
+ {
+ g->drawImage(buttons[0].grid[HSTART], x, y);
+ const int width = buttons[0].grid[HSTART]->getWidth();
+ w -= width + buttons[0].grid[HEND]->getWidth();
+ x += width;
- const int width = buttons[1].grid[HSTART]->getWidth();
- w -= width;
- if (buttons[1].grid[HEND])
- w -= buttons[1].grid[HEND]->getWidth();
- x += width;
+ if (buttons[0].grid[HMID])
+ {
+ const Image *const hMid = buttons[0].grid[HMID];
+ g->drawImagePattern(hMid, x, y, w, hMid->getHeight());
+ }
- if (buttons[1].grid[HMID])
- {
- const Image *const hMid = buttons[1].grid[HMID];
- static_cast<Graphics*>(graphics)->drawImagePattern(
- hMid, x, y, w,
- hMid->getHeight());
- }
+ x += w;
+ g->drawImage(buttons[0].grid[HEND], x, y);
- x += w;
- if (buttons[1].grid[HEND])
+ const Image *const img = buttons[0].grid[HGRIP];
+ if (img)
+ {
+ g->drawImage(img, getMarkerPosition(),
+ (mDimension.height - img->getHeight()) / 2);
+ }
+ }
+ else
{
- static_cast<Graphics*>(graphics)->drawImage(
- buttons[1].grid[HEND], x, y);
+ g->drawImage(buttons[1].grid[HSTART], x, y);
+
+ const int width = buttons[1].grid[HSTART]->getWidth();
+ w -= width;
+ if (buttons[1].grid[HEND])
+ w -= buttons[1].grid[HEND]->getWidth();
+ x += width;
+
+ if (buttons[1].grid[HMID])
+ {
+ const Image *const hMid = buttons[1].grid[HMID];
+ g->drawImagePattern(hMid, x, y, w, hMid->getHeight());
+ }
+
+ x += w;
+ if (buttons[1].grid[HEND])
+ g->drawImage(buttons[1].grid[HEND], x, y);
+
+ const Image *const img = buttons[1].grid[HGRIP];
+ if (img)
+ {
+ g->drawImage(img, getMarkerPosition(),
+ (mDimension.height - img->getHeight()) / 2);
+ }
}
}
- drawMarker(graphics);
BLOCK_END("Slider::draw")
}
-void Slider::drawMarker(gcn::Graphics *const graphics) const
-{
- const Image *const img = (mHasMouse ? buttons[1].grid[HGRIP]
- : buttons[0].grid[HGRIP]);
- if (!img)
- return;
-
- static_cast<Graphics*>(graphics)->drawImage(img, getMarkerPosition(),
- (mDimension.height - img->getHeight()) / 2);
-}
-
void Slider::mouseEntered(gcn::MouseEvent& event A_UNUSED)
{
mHasMouse = true;
+ mRedraw = true;
}
void Slider::mouseExited(gcn::MouseEvent& event A_UNUSED)
{
mHasMouse = false;
+ mRedraw = true;
+}
+
+void Slider::mousePressed(gcn::MouseEvent &mouseEvent)
+{
+ if (mouseEvent.getButton() == gcn::MouseEvent::LEFT
+ && mouseEvent.getX() >= 0
+ && mouseEvent.getX() <= getWidth()
+ && mouseEvent.getY() >= 0
+ && mouseEvent.getY() <= getHeight())
+ {
+ if (getOrientation() == HORIZONTAL)
+ {
+ setValue2(markerPositionToValue(
+ mouseEvent.getX() - getMarkerLength() / 2));
+ }
+ else
+ {
+ setValue2(markerPositionToValue(getHeight()
+ - mouseEvent.getY() - getMarkerLength() / 2));
+ }
+
+ distributeActionEvent();
+ }
+}
+
+void Slider::mouseDragged(gcn::MouseEvent &mouseEvent)
+{
+ if (getOrientation() == HORIZONTAL)
+ {
+ setValue2(markerPositionToValue(mouseEvent.getX()
+ - getMarkerLength() / 2));
+ }
+ else
+ {
+ setValue2(markerPositionToValue(getHeight()
+ - mouseEvent.getY() - getMarkerLength() / 2));
+ }
+
+ distributeActionEvent();
+
+ mouseEvent.consume();
+}
+
+void Slider::mouseWheelMovedUp(gcn::MouseEvent &mouseEvent)
+{
+ setValue2(getValue() + getStepLength());
+ distributeActionEvent();
+
+ mouseEvent.consume();
+}
+
+void Slider::mouseWheelMovedDown(gcn::MouseEvent &mouseEvent)
+{
+ setValue2(getValue() - getStepLength());
+ distributeActionEvent();
+
+ mouseEvent.consume();
}
void Slider::keyPressed(gcn::KeyEvent& keyEvent)
@@ -210,13 +334,13 @@ void Slider::keyPressed(gcn::KeyEvent& keyEvent)
{
if (action == Input::KEY_GUI_RIGHT)
{
- setValue(getValue() + getStepLength());
+ setValue2(getValue() + getStepLength());
distributeActionEvent();
keyEvent.consume();
}
else if (action == Input::KEY_GUI_LEFT)
{
- setValue(getValue() - getStepLength());
+ setValue2(getValue() - getStepLength());
distributeActionEvent();
keyEvent.consume();
}
@@ -225,15 +349,21 @@ void Slider::keyPressed(gcn::KeyEvent& keyEvent)
{
if (action == Input::KEY_GUI_UP)
{
- setValue(getValue() + getStepLength());
+ setValue2(getValue() + getStepLength());
distributeActionEvent();
keyEvent.consume();
}
else if (action == Input::KEY_GUI_DOWN)
{
- setValue(getValue() - getStepLength());
+ setValue2(getValue() - getStepLength());
distributeActionEvent();
keyEvent.consume();
}
}
}
+
+void Slider::setValue2(const double value)
+{
+ setValue(value);
+ mRedraw = true;
+}
diff --git a/src/gui/widgets/slider.h b/src/gui/widgets/slider.h
index e54c9e374..79ef2b961 100644
--- a/src/gui/widgets/slider.h
+++ b/src/gui/widgets/slider.h
@@ -29,6 +29,8 @@
#include "localconsts.h"
+class ImageCollection;
+
/**
* Slider widget. Same as the Guichan slider but with custom look.
*
@@ -66,11 +68,6 @@ class Slider final : public gcn::Slider,
void draw(gcn::Graphics *graphics) override final;
/**
- * Draws the marker.
- */
- void drawMarker(gcn::Graphics *const graphics) const;
-
- /**
* Called when the mouse enteres the widget area.
*/
void mouseEntered(gcn::MouseEvent& event) override final;
@@ -80,8 +77,18 @@ class Slider final : public gcn::Slider,
*/
void mouseExited(gcn::MouseEvent& event) override final;
+ void mousePressed(gcn::MouseEvent &mouseEvent) override final;
+
+ void mouseDragged(gcn::MouseEvent &mouseEvent) override final;
+
+ void mouseWheelMovedUp(gcn::MouseEvent &mouseEvent) override final;
+
+ void mouseWheelMovedDown(gcn::MouseEvent &mouseEvent) override final;
+
void keyPressed(gcn::KeyEvent& keyEvent) override final;
+ void setValue2(const double value);
+
enum SLIDER_ENUM
{
HSTART = 0,
@@ -104,7 +111,9 @@ class Slider final : public gcn::Slider,
static ImageRect buttons[2];
static float mAlpha;
static int mInstances;
+ ImageCollection *mVertexes;
bool mHasMouse;
+ bool mRedraw;
};
#endif // GUI_WIDGETS_SLIDER_H