Fix drag-background-through-buttons problem by adding "touch exclusive" mode to viewgroups.

Not using universally because I don't want to debug all the issues...
This commit is contained in:
Henrik Rydgård committed 2022-11-27 16:16:18 +01:00
1 parent d310636eb4
commit 0a3d78221e
9 files changed
+111 -64

No files matched your search

+28 -14
View File
@@ -226,11 +226,13 @@ void Clickable::FocusChanged(int focusFlags) {
}
}
void Clickable::Touch(const TouchInput &input) {
bool Clickable::Touch(const TouchInput &input) {
bool contains = bounds_.Contains(input.x, input.y);
if (!IsEnabled()) {
dragging_ = false;
down_ = false;
return;
return contains;
}
if (input.flags & TOUCH_DOWN) {
@@ -255,6 +257,7 @@ void Clickable::Touch(const TouchInput &input) {
downCountDown_ = 0;
dragging_ = false;
}
return contains;
}
static bool MatchesKeyDef(const std::vector<KeyDef> &defs, const KeyInput &key) {
@@ -350,21 +353,24 @@ bool Clickable::Key(const KeyInput &key) {
return ret;
}
void StickyChoice::Touch(const TouchInput &input) {
bool StickyChoice::Touch(const TouchInput &touch) {
bool contains = bounds_.Contains(touch.x, touch.y);
dragging_ = false;
if (!IsEnabled()) {
down_ = false;
return;
return contains;
}
if (input.flags & TOUCH_DOWN) {
if (bounds_.Contains(input.x, input.y)) {
if (touch.flags & TOUCH_DOWN) {
if (contains) {
if (IsFocusMovementEnabled())
SetFocusedView(this);
down_ = true;
Click();
return true;
}
}
return false;
}
bool StickyChoice::Key(const KeyInput &key) {
@@ -1069,12 +1075,14 @@ static std::string FirstLine(const std::string &text) {
return text;
}
void TextEdit::Touch(const TouchInput &touch) {
bool TextEdit::Touch(const TouchInput &touch) {
if (touch.flags & TOUCH_DOWN) {
if (bounds_.Contains(touch.x, touch.y)) {
SetFocusedView(this, true);
return true;
}
}
return false;
}
bool TextEdit::Key(const KeyInput &input) {
@@ -1259,14 +1267,15 @@ void Spinner::Draw(UIContext &dc) {
}
}
void TriggerButton::Touch(const TouchInput &input) {
bool TriggerButton::Touch(const TouchInput &input) {
bool contains = bounds_.Contains(input.x, input.y);
if (input.flags & TOUCH_DOWN) {
if (bounds_.Contains(input.x, input.y)) {
if (contains) {
down_ |= 1 << input.id;
}
}
if (input.flags & TOUCH_MOVE) {
if (bounds_.Contains(input.x, input.y))
if (contains)
down_ |= 1 << input.id;
else
down_ &= ~(1 << input.id);
@@ -1281,6 +1290,8 @@ void TriggerButton::Touch(const TouchInput &input) {
} else {
*bitField_ &= ~bit_;
}
return contains;
}
void TriggerButton::Draw(UIContext &dc) {
@@ -1344,9 +1355,10 @@ bool Slider::ApplyKey(int keyCode) {
return true;
}
void Slider::Touch(const TouchInput &input) {
bool Slider::Touch(const TouchInput &input) {
// Calling it afterwards, so dragging_ hasn't been set false yet when checking it above.
Clickable::Touch(input);
bool contains = Clickable::Touch(input);
if (dragging_) {
float relativeX = (input.x - (bounds_.x + paddingLeft_)) / (bounds_.w - paddingLeft_ - paddingRight_);
*value_ = floorf(relativeX * (maxValue_ - minValue_) + minValue_ + 0.5f);
@@ -1360,6 +1372,7 @@ void Slider::Touch(const TouchInput &input) {
// Cancel any key repeat.
repeat_ = -1;
return contains;
}
void Slider::Clamp() {
@@ -1470,8 +1483,8 @@ bool SliderFloat::ApplyKey(int keyCode) {
return true;
}
void SliderFloat::Touch(const TouchInput &input) {
Clickable::Touch(input);
bool SliderFloat::Touch(const TouchInput &input) {
bool contains = Clickable::Touch(input);
if (dragging_) {
float relativeX = (input.x - (bounds_.x + paddingLeft_)) / (bounds_.w - paddingLeft_ - paddingRight_);
*value_ = (relativeX * (maxValue_ - minValue_) + minValue_);
@@ -1485,6 +1498,7 @@ void SliderFloat::Touch(const TouchInput &input) {
// Cancel any key repeat.
repeat_ = -1;
return contains;
}
void SliderFloat::Clamp() {
+8 -8
View File
@@ -375,7 +375,7 @@ public:
// Can even be called on a different thread! This is to really minimize latency, and decouple
// touch response from the frame rate. Same with Key and Axis.
virtual bool Key(const KeyInput &input) { return false; }
virtual void Touch(const TouchInput &input) {}
virtual bool Touch(const TouchInput &input) { return true; }
virtual void Axis(const AxisInput &input) {}
virtual void Update();
@@ -501,7 +501,7 @@ public:
: View(layoutParams) {}
bool Key(const KeyInput &input) override { return false; }
void Touch(const TouchInput &input) override {}
bool Touch(const TouchInput &input) override { return false; }
bool CanBeFocused() const override { return false; }
};
@@ -512,7 +512,7 @@ public:
Clickable(LayoutParams *layoutParams);
bool Key(const KeyInput &input) override;
void Touch(const TouchInput &input) override;
bool Touch(const TouchInput &input) override;
void FocusChanged(int focusFlags) override;
@@ -602,7 +602,7 @@ public:
void Draw(UIContext &dc) override;
std::string DescribeText() const override;
bool Key(const KeyInput &input) override;
void Touch(const TouchInput &input) override;
bool Touch(const TouchInput &input) override;
void Update() override;
void GetContentDimensions(const UIContext &dc, float &w, float &h) const override;
void SetShowPercent(bool s) { showPercent_ = s; }
@@ -633,7 +633,7 @@ public:
void Draw(UIContext &dc) override;
std::string DescribeText() const override;
bool Key(const KeyInput &input) override;
void Touch(const TouchInput &input) override;
bool Touch(const TouchInput &input) override;
void Update() override;
void GetContentDimensions(const UIContext &dc, float &w, float &h) const override;
@@ -661,7 +661,7 @@ public:
TriggerButton(uint32_t *bitField, uint32_t bit, ImageID imageBackground, ImageID imageForeground, LayoutParams *layoutParams)
: View(layoutParams), down_(0.0), bitField_(bitField), bit_(bit), imageBackground_(imageBackground), imageForeground_(imageForeground) {}
void Touch(const TouchInput &input) override;
bool Touch(const TouchInput &input) override;
void Draw(UIContext &dc) override;
void GetContentDimensions(const UIContext &dc, float &w, float &h) const override;
@@ -755,7 +755,7 @@ public:
: Choice(buttonImage, layoutParams) {}
bool Key(const KeyInput &key) override;
void Touch(const TouchInput &touch) override;
bool Touch(const TouchInput &touch) override;
void FocusChanged(int focusFlags) override;
void Press() { down_ = true; dragging_ = false; }
@@ -943,7 +943,7 @@ public:
void Draw(UIContext &dc) override;
std::string DescribeText() const override;
bool Key(const KeyInput &key) override;
void Touch(const TouchInput &touch) override;
bool Touch(const TouchInput &touch) override;
Event OnTextChange;
Event OnEnter;
+14 -5
View File
@@ -87,13 +87,20 @@ void ViewGroup::PersistData(PersistStatus status, std::string anonId, PersistMap
}
}
void ViewGroup::Touch(const TouchInput &input) {
bool ViewGroup::Touch(const TouchInput &input) {
std::lock_guard<std::mutex> guard(modifyLock_);
bool any = false;
for (auto iter = views_.begin(); iter != views_.end(); ++iter) {
// TODO: If there is a transformation active, transform input coordinates accordingly.
if ((*iter)->GetVisibility() == V_VISIBLE)
(*iter)->Touch(input);
if ((*iter)->GetVisibility() == V_VISIBLE) {
bool touch = (*iter)->Touch(input);
any = any || touch;
if (exclusiveTouch_ && touch) {
break;
}
}
}
return any;
}
void ViewGroup::Query(float x, float y, std::vector<View *> &list) {
@@ -850,7 +857,7 @@ bool ScrollView::Key(const KeyInput &input) {
const float friction = 0.92f;
const float stop_threshold = 0.1f;
void ScrollView::Touch(const TouchInput &input) {
bool ScrollView::Touch(const TouchInput &input) {
if ((input.flags & TOUCH_DOWN) && scrollTouchId_ == -1) {
scrollStart_ = scrollPos_;
inertia_ = 0.0f;
@@ -884,7 +891,9 @@ void ScrollView::Touch(const TouchInput &input) {
}
if (!(input.flags & TOUCH_DOWN) || bounds_.Contains(input.x, input.y)) {
ViewGroup::Touch(input2);
return ViewGroup::Touch(input2);
} else {
return false;
}
}
+4 -2
View File
@@ -28,7 +28,7 @@ public:
// Pass through external events to children.
virtual bool Key(const KeyInput &input) override;
virtual void Touch(const TouchInput &input) override;
virtual bool Touch(const TouchInput &input) override;
virtual void Axis(const AxisInput &input) override;
// By default, a container will layout to its own bounds.
@@ -77,6 +77,7 @@ public:
int GetNumSubviews() const { return (int)views_.size(); }
void SetHasDropShadow(bool has) { hasDropShadow_ = has; }
void SetDropShadowExpand(float s) { dropShadowExpand_ = s; }
void SetExclusiveTouch(bool exclusive) { exclusiveTouch_ = exclusive; }
void Lock() { modifyLock_.lock(); }
void Unlock() { modifyLock_.unlock(); }
@@ -96,6 +97,7 @@ protected:
float dropShadowExpand_ = 0.0f;
bool hasDropShadow_ = false;
bool clip_ = false;
bool exclusiveTouch_ = false;
};
// A frame layout contains a single child view (normally).
@@ -270,7 +272,7 @@ public:
void Layout() override;
bool Key(const KeyInput &input) override;
void Touch(const TouchInput &input) override;
bool Touch(const TouchInput &input) override;
void Draw(UIContext &dc) override;
std::string DescribeLog() const override { return "ScrollView: " + View::DescribeLog(); }
+7 -1
View File
@@ -59,7 +59,7 @@ class DisplayLayoutBackground : public UI::View {
public:
DisplayLayoutBackground(UI::ChoiceStrip *mode, UI::LayoutParams *layoutParams) : UI::View(layoutParams), mode_(mode) {}
void Touch(const TouchInput &touch) {
bool Touch(const TouchInput &touch) {
int mode = mode_ ? mode_->GetSelection() : 0;
const Bounds &screenBounds = bounds_;
@@ -96,6 +96,8 @@ public:
if ((touch.flags & TOUCH_UP) != 0 && dragging_) {
dragging_ = false;
}
return true;
}
private:
@@ -188,6 +190,10 @@ void DisplayLayoutScreen::CreateViews() {
root_ = new AnchorLayout(new LayoutParams(FILL_PARENT, FILL_PARENT));
// Make it so that a touch can only affect one view. Makes manipulating the background through the buttons
// impossible.
root_->SetExclusiveTouch(true);
ScrollView *leftScrollView = new ScrollView(ORIENT_VERTICAL, new AnchorLayoutParams(300.0f, FILL_PARENT, 10.f, 10.f, NONE, 10.f, false));
ViewGroup *leftColumn = new LinearLayout(ORIENT_VERTICAL);
leftScrollView->Add(leftColumn);
+35 -21
View File
@@ -45,8 +45,9 @@ GamepadView::GamepadView(const char *key, UI::LayoutParams *layoutParams) : UI::
lastFrameTime_ = time_now_d();
}
void GamepadView::Touch(const TouchInput &input) {
bool GamepadView::Touch(const TouchInput &input) {
secondsWithoutTouch_ = 0.0f;
return true;
}
void GamepadView::Update() {
@@ -96,8 +97,8 @@ void MultiTouchButton::GetContentDimensions(const UIContext &dc, float &w, float
}
}
void MultiTouchButton::Touch(const TouchInput &input) {
GamepadView::Touch(input);
bool MultiTouchButton::Touch(const TouchInput &input) {
bool retval = GamepadView::Touch(input);
if ((input.flags & TOUCH_DOWN) && bounds_.Contains(input.x, input.y)) {
pointerDownMask_ |= 1 << input.id;
usedPointerMask |= 1 << input.id;
@@ -116,6 +117,7 @@ void MultiTouchButton::Touch(const TouchInput &input) {
pointerDownMask_ = 0;
usedPointerMask = 0;
}
return retval;
}
void MultiTouchButton::Draw(UIContext &dc) {
@@ -152,9 +154,9 @@ void MultiTouchButton::Draw(UIContext &dc) {
dc.Draw()->DrawImageRotated(img_, bounds_.centerX(), y, scale, angle_ * (M_PI * 2 / 360.0f), color);
}
void BoolButton::Touch(const TouchInput &input) {
bool BoolButton::Touch(const TouchInput &input) {
bool lastDown = pointerDownMask_ != 0;
MultiTouchButton::Touch(input);
bool retval = MultiTouchButton::Touch(input);
bool down = pointerDownMask_ != 0;
if (down != lastDown) {
@@ -163,11 +165,12 @@ void BoolButton::Touch(const TouchInput &input) {
params.a = down;
OnChange.Trigger(params);
}
return retval;
}
void PSPButton::Touch(const TouchInput &input) {
bool PSPButton::Touch(const TouchInput &input) {
bool lastDown = pointerDownMask_ != 0;
MultiTouchButton::Touch(input);
bool retval = MultiTouchButton::Touch(input);
bool down = pointerDownMask_ != 0;
if (down && !lastDown) {
if (g_Config.bHapticFeedback) {
@@ -177,6 +180,7 @@ void PSPButton::Touch(const TouchInput &input) {
} else if (lastDown && !down) {
__CtrlButtonUp(pspButtonBit_);
}
return retval;
}
bool ComboKey::IsDown() {
@@ -192,10 +196,10 @@ void ComboKey::GetContentDimensions(const UIContext &dc, float &w, float &h) con
}
}
void ComboKey::Touch(const TouchInput &input) {
bool ComboKey::Touch(const TouchInput &input) {
using namespace CustomKey;
bool lastDown = pointerDownMask_ != 0;
MultiTouchButton::Touch(input);
bool retval = MultiTouchButton::Touch(input);
bool down = pointerDownMask_ != 0;
if (down && !lastDown) {
@@ -220,6 +224,7 @@ void ComboKey::Touch(const TouchInput &input) {
}
on_ = false;
}
return retval;
}
void ComboKey::Update() {
@@ -272,8 +277,8 @@ void PSPDpad::GetContentDimensions(const UIContext &dc, float &w, float &h) cons
}
}
void PSPDpad::Touch(const TouchInput &input) {
GamepadView::Touch(input);
bool PSPDpad::Touch(const TouchInput &input) {
bool retval = GamepadView::Touch(input);
if (input.flags & TOUCH_DOWN) {
if (dragPointerId_ == -1 && bounds_.Contains(input.x, input.y)) {
@@ -297,6 +302,7 @@ void PSPDpad::Touch(const TouchInput &input) {
ProcessTouch(input.x, input.y, false);
}
}
return retval;
}
void PSPDpad::ProcessTouch(float x, float y, bool down) {
@@ -438,8 +444,8 @@ void PSPStick::Draw(UIContext &dc) {
dc.Draw()->DrawImage(stickImageIndex_, stickX + dx * stick_size_ * scale_, stickY - dy * stick_size_ * scale_, 1.0f * scale_ * headScale, colorBg, ALIGN_CENTER);
}
void PSPStick::Touch(const TouchInput &input) {
GamepadView::Touch(input);
bool PSPStick::Touch(const TouchInput &input) {
bool retval = GamepadView::Touch(input);
if (input.flags & TOUCH_RELEASE_ALL) {
dragPointerId_ = -1;
centerX_ = bounds_.centerX();
@@ -447,7 +453,7 @@ void PSPStick::Touch(const TouchInput &input) {
__CtrlSetAnalogXY(stick_, 0.0f, 0.0f);
usedPointerMask = 0;
analogPointerMask = 0;
return;
return retval;
}
if (input.flags & TOUCH_DOWN) {
float fac = 0.5f*(stick_ ? g_Config.fRightStickHeadScale : g_Config.fLeftStickHeadScale)-0.5f;
@@ -463,11 +469,13 @@ void PSPStick::Touch(const TouchInput &input) {
usedPointerMask |= 1 << input.id;
analogPointerMask |= 1 << input.id;
ProcessTouch(input.x, input.y, true);
retval = true;
}
}
if (input.flags & TOUCH_MOVE) {
if (input.id == dragPointerId_) {
ProcessTouch(input.x, input.y, true);
retval = true;
}
}
if (input.flags & TOUCH_UP) {
@@ -478,8 +486,10 @@ void PSPStick::Touch(const TouchInput &input) {
usedPointerMask &= ~(1 << input.id);
analogPointerMask &= ~(1 << input.id);
ProcessTouch(input.x, input.y, false);
retval = true;
}
}
return retval;
}
void PSPStick::ProcessTouch(float x, float y, bool down) {
@@ -542,8 +552,8 @@ void PSPCustomStick::Draw(UIContext &dc) {
dc.Draw()->DrawImage(stickImageIndex_, stickX + dx * stick_size_ * scale_, stickY - dy * stick_size_ * scale_, 1.0f*scale_*g_Config.fRightStickHeadScale, colorBg, ALIGN_CENTER);
}
void PSPCustomStick::Touch(const TouchInput &input) {
GamepadView::Touch(input);
bool PSPCustomStick::Touch(const TouchInput &input) {
bool retval = GamepadView::Touch(input);
if (input.flags & TOUCH_RELEASE_ALL) {
dragPointerId_ = -1;
centerX_ = bounds_.centerX();
@@ -552,7 +562,7 @@ void PSPCustomStick::Touch(const TouchInput &input) {
posY_ = 0.0f;
usedPointerMask = 0;
analogPointerMask = 0;
return;
return false;
}
if (input.flags & TOUCH_DOWN) {
float fac = 0.5f*g_Config.fRightStickHeadScale-0.5f;
@@ -568,11 +578,13 @@ void PSPCustomStick::Touch(const TouchInput &input) {
usedPointerMask |= 1 << input.id;
analogPointerMask |= 1 << input.id;
ProcessTouch(input.x, input.y, true);
retval = true;
}
}
if (input.flags & TOUCH_MOVE) {
if (input.id == dragPointerId_) {
ProcessTouch(input.x, input.y, true);
retval = true;
}
}
if (input.flags & TOUCH_UP) {
@@ -583,8 +595,10 @@ void PSPCustomStick::Touch(const TouchInput &input) {
usedPointerMask &= ~(1 << input.id);
analogPointerMask &= ~(1 << input.id);
ProcessTouch(input.x, input.y, false);
retval = true;
}
}
return true;
}
void PSPCustomStick::ProcessTouch(float x, float y, bool down) {
@@ -890,17 +904,16 @@ UI::ViewGroup *CreatePadLayout(float xres, float yres, bool *pause, bool showPau
return root;
}
void GestureGamepad::Touch(const TouchInput &input) {
bool GestureGamepad::Touch(const TouchInput &input) {
if (usedPointerMask & (1 << input.id)) {
if (input.id == dragPointerId_)
dragPointerId_ = -1;
return;
return false;
}
if (input.flags & TOUCH_RELEASE_ALL) {
dragPointerId_ = -1;
return;
return false;
}
if (input.flags & TOUCH_DOWN) {
@@ -940,6 +953,7 @@ void GestureGamepad::Touch(const TouchInput &input) {
}
}
}
return true;
}
void GestureGamepad::Update() {
+9 -9
View File
@@ -29,7 +29,7 @@ class GamepadView : public UI::View {
public:
GamepadView(const char *key, UI::LayoutParams *layoutParams);
void Touch(const TouchInput &input) override;
bool Touch(const TouchInput &input) override;
bool Key(const KeyInput &input) override {
return false;
}
@@ -50,7 +50,7 @@ public:
: GamepadView(key, layoutParams), scale_(scale), bgImg_(bgImg), bgDownImg_(bgDownImg), img_(img) {
}
void Touch(const TouchInput &input) override;
bool Touch(const TouchInput &input) override;
void Draw(UIContext &dc) override;
void GetContentDimensions(const UIContext &dc, float &w, float &h) const override;
virtual bool IsDown() { return pointerDownMask_ != 0; }
@@ -78,7 +78,7 @@ public:
: MultiTouchButton(key, bgImg, bgDownImg, img, scale, layoutParams), value_(value) {
}
void Touch(const TouchInput &input) override;
bool Touch(const TouchInput &input) override;
bool IsDown() override { return *value_; }
UI::Event OnChange;
@@ -92,7 +92,7 @@ public:
PSPButton(int pspButtonBit, const char *key, ImageID bgImg, ImageID bgDownImg, ImageID img, float scale, UI::LayoutParams *layoutParams)
: MultiTouchButton(key, bgImg, bgDownImg, img, scale, layoutParams), pspButtonBit_(pspButtonBit) {
}
void Touch(const TouchInput &input) override;
bool Touch(const TouchInput &input) override;
bool IsDown() override;
private:
@@ -103,7 +103,7 @@ class PSPDpad : public GamepadView {
public:
PSPDpad(ImageID arrowIndex, const char *key, ImageID arrowDownIndex, ImageID overlayIndex, float scale, float spacing, UI::LayoutParams *layoutParams);
void Touch(const TouchInput &input) override;
bool Touch(const TouchInput &input) override;
void Draw(UIContext &dc) override;
void GetContentDimensions(const UIContext &dc, float &w, float &h) const override;
@@ -124,7 +124,7 @@ class PSPStick : public GamepadView {
public:
PSPStick(ImageID bgImg, const char *key, ImageID stickImg, ImageID stickDownImg, int stick, float scale, UI::LayoutParams *layoutParams);
void Touch(const TouchInput &input) override;
bool Touch(const TouchInput &input) override;
void Draw(UIContext &dc) override;
void GetContentDimensions(const UIContext &dc, float &w, float &h) const override;
@@ -149,7 +149,7 @@ class PSPCustomStick : public PSPStick {
public:
PSPCustomStick(ImageID bgImg, const char *key, ImageID stickImg, ImageID stickDownImg, float scale, UI::LayoutParams *layoutParams);
void Touch(const TouchInput &input) override;
bool Touch(const TouchInput &input) override;
void Draw(UIContext &dc) override;
private:
@@ -172,7 +172,7 @@ public:
ComboKey(uint64_t pspButtonBit, const char *key, bool toggle, bool repeat, ControlMapper* controllMapper, ImageID bgImg, ImageID bgDownImg, ImageID img, float scale, bool invertedContextDimension, UI::LayoutParams *layoutParams)
: MultiTouchButton(key, bgImg, bgDownImg, img, scale, layoutParams), pspButtonBit_(pspButtonBit), toggle_(toggle), repeat_(repeat), controlMapper_(controllMapper), on_(false), invertedContextDimension_(invertedContextDimension) {
}
void Touch(const TouchInput &input) override;
bool Touch(const TouchInput &input) override;
void Update() override;
bool IsDown() override;
@@ -191,7 +191,7 @@ class GestureGamepad : public UI::View {
public:
GestureGamepad(ControlMapper* controllMapper) : controlMapper_(controllMapper) {};
void Touch(const TouchInput &input) override;
bool Touch(const TouchInput &input) override;
void Update() override;
protected:
+3 -2
View File
@@ -136,8 +136,8 @@ public:
void SetHoldEnabled(bool hold) {
holdEnabled_ = hold;
}
void Touch(const TouchInput &input) override {
UI::Clickable::Touch(input);
bool Touch(const TouchInput &input) override {
bool retval = UI::Clickable::Touch(input);
hovering_ = bounds_.Contains(input.x, input.y);
if (hovering_ && (input.flags & TOUCH_DOWN)) {
holdStart_ = time_now_d();
@@ -145,6 +145,7 @@ public:
if (input.flags & TOUCH_UP) {
holdStart_ = 0;
}
return retval;
}
bool Key(const KeyInput &key) override {
+3 -2
View File
@@ -359,7 +359,7 @@ public:
: UI::AnchorLayout(layoutParams) {
}
void Touch(const TouchInput &input) override;
bool Touch(const TouchInput &input) override;
void CreateViews();
bool HasCreatedViews() const {
return !controls_.empty();
@@ -384,7 +384,7 @@ static Point ClampTo(const Point &p, const Bounds &b) {
return Point(clamp_value(p.x, b.x, b.x + b.w), clamp_value(p.y, b.y, b.y + b.h));
}
void ControlLayoutView::Touch(const TouchInput &touch) {
bool ControlLayoutView::Touch(const TouchInput &touch) {
using namespace UI;
if ((touch.flags & TOUCH_MOVE) && pickedControl_ != nullptr) {
@@ -452,6 +452,7 @@ void ControlLayoutView::Touch(const TouchInput &touch) {
pickedControl_->SavePosition();
pickedControl_ = 0;
}
return true;
}
void ControlLayoutView::CreateViews() {