Add basic slider control

This commit is contained in:
Henrik Rydgard committed 2013-07-18 10:25:30 +02:00
1 parent 07feef3f44
commit cd8987b33b
4 files changed
+81 -1

No files matched your search

+6
View File
@@ -108,3 +108,9 @@ UI::EventReturn ListPopupScreen::OnListChoice(UI::EventParams &e) {
void ListPopupScreen::OnCompleted() {
callback_(adaptor_.GetSelected());
}
void SliderPopupScreen::CreatePopupContents(UI::ViewGroup *parent) {
using namespace UI;
slider_ = parent->Add(new Slider(value_, minValue_, maxValue_));
}
+12
View File
@@ -66,3 +66,15 @@ private:
std::function<void(int)> callback_;
};
class SliderPopupScreen : public PopupScreen {
public:
SliderPopupScreen(int *value, int minValue, int maxValue, const std::string &title) : PopupScreen(title), value_(value), minValue_(minValue), maxValue_(maxValue) {}
void CreatePopupContents(UI::ViewGroup *parent);
private:
UI::Slider *slider_;
int *value_;
int minValue_;
int maxValue_;
};
+45
View File
@@ -2,6 +2,7 @@
#include "base/display.h"
#include "base/mutex.h"
#include "input/input_state.h"
#include "input/keycodes.h"
#include "gfx_es2/draw_buffer.h"
#include "gfx/texture.h"
#include "gfx/texture_atlas.h"
@@ -418,6 +419,50 @@ void TriggerButton::GetContentDimensions(const UIContext &dc, float &w, float &h
h = image.h;
}
void Slider::Key(const KeyInput &input) {
if (HasFocus() && input.flags & KEY_DOWN) {
switch (input.keyCode) {
case KEYCODE_DPAD_LEFT:
case KEYCODE_MINUS:
case KEYCODE_NUMPAD_SUBTRACT:
*value_ -= 1;
break;
case KEYCODE_DPAD_RIGHT:
case KEYCODE_PLUS:
case KEYCODE_NUMPAD_ADD:
*value_ -= 1;
break;
}
Clamp();
}
}
void Slider::Touch(const TouchInput &input) {
if (dragging_ || bounds_.Contains(input.x, input.y)) {
float relativeX = (input.x - bounds_.x) / bounds_.w;
*value_ = floorf(relativeX * (maxValue_ - minValue_) + minValue_ + 0.5f);
Clamp();
}
}
void Slider::Clamp() {
if (*value_ < minValue_) *value_ = minValue_;
else if (*value_ > maxValue_) *value_ = maxValue_;
}
void Slider::Draw(UIContext &dc) {
float knobX = ((float)(*value_) - minValue_) / (maxValue_ - minValue_) * bounds_.w + bounds_.x;
dc.FillRect(Drawable(0xFFFFFFFF), Bounds(bounds_.x, bounds_.centerY() - 2, knobX - bounds_.x, 4));
dc.FillRect(Drawable(0xFF808080), Bounds(knobX, bounds_.centerY() - 2, bounds_.x + bounds_.w - knobX, 4));
dc.Draw()->DrawImage(dc.theme->sliderKnob, knobX, bounds_.centerY(), 1.0f, 0xFFFFFFFF, ALIGN_CENTER);
}
void Slider::GetContentDimensions(const UIContext &dc, float &w, float &h) const {
// TODO
w = 100;
h = 50;
}
/*
TabStrip::TabStrip()
+18 -1
View File
@@ -79,6 +79,7 @@ struct Theme {
int uiFontSmaller;
int checkOn;
int checkOff;
int sliderKnob;
int whiteImage;
Style buttonStyle;
@@ -401,6 +402,23 @@ private:
std::string text_;
};
class Slider : public Clickable {
public:
Slider(int *value, int minValue, int maxValue, LayoutParams *layoutParams = 0)
: Clickable(layoutParams), value_(value), minValue_(minValue), maxValue_(maxValue) {}
virtual void Draw(UIContext &dc);
virtual void Key(const KeyInput &input);
virtual void Touch(const TouchInput &input);
virtual void GetContentDimensions(const UIContext &dc, float &w, float &h) const;
private:
void Clamp();
int *value_;
int minValue_;
int maxValue_;
};
// Basic button that modifies a bitfield based on the pressed status. Supports multitouch.
// Suitable for controller simulation (ABXY etc).
class TriggerButton : public View {
@@ -517,7 +535,6 @@ private:
std::string smallText_;
};
// These are for generic use.
class Spacer : public InertView {