From 15233e1adde4c5e8b241564793889827b00ceda9 Mon Sep 17 00:00:00 2001 From: Malte Langermann <54738901+gagarinlg@users.noreply.github.com> Date: Mon, 29 Nov 2021 02:07:22 +0100 Subject: [PATCH] Fix sliding on inactive part of tab bar grabbing input focus (#1180) * fix #298, keys not working, after sliding on tabs bar * fix for touch end event with start x,y coordinate is triggered after the last slide event * remove selecting tabs on the tab top bar by sliding as it does break sliding the tab bar. --- radio/src/gui/colorlcd/tabsgroup.cpp | 23 +++++++++++++++++++++++ radio/src/gui/colorlcd/tabsgroup.h | 5 +++++ 2 files changed, 28 insertions(+) diff --git a/radio/src/gui/colorlcd/tabsgroup.cpp b/radio/src/gui/colorlcd/tabsgroup.cpp index ef082e029..299efc3f0 100644 --- a/radio/src/gui/colorlcd/tabsgroup.cpp +++ b/radio/src/gui/colorlcd/tabsgroup.cpp @@ -71,16 +71,39 @@ void TabsCarousel::paint(BitmapBuffer * dc) } #if defined(HARDWARE_TOUCH) +bool TabsCarousel::onTouchStart(coord_t x, coord_t y) +{ + if(sliding) + sliding = false; + + return true; +} + bool TabsCarousel::onTouchEnd(coord_t x, coord_t y) { + if(sliding) + return true; + unsigned index = (x - padding_left) / MENU_HEADER_BUTTON_WIDTH; + if (index >= menu->tabs.size()) { return false; } + menu->setCurrentTab(index); setCurrentIndex(index); return true; } + +bool TabsCarousel::onTouchSlide(coord_t x, coord_t y, coord_t startX, coord_t startY, coord_t slideX, coord_t slideY) +{ + sliding = true; + + Window::onTouchSlide(x,y,startX,startY,slideX,slideY); + menu->setCurrentTab(currentIndex); + + return true; +} #endif TabsGroup::TabsGroup(uint8_t icon): diff --git a/radio/src/gui/colorlcd/tabsgroup.h b/radio/src/gui/colorlcd/tabsgroup.h index 1618bf7a0..ecbb72093 100644 --- a/radio/src/gui/colorlcd/tabsgroup.h +++ b/radio/src/gui/colorlcd/tabsgroup.h @@ -102,13 +102,18 @@ class TabsCarousel: public Window { void paint(BitmapBuffer * dc) override; #if defined(HARDWARE_TOUCH) + bool onTouchStart(coord_t x, coord_t y) override; bool onTouchEnd(coord_t x, coord_t y) override; + bool onTouchSlide(coord_t x, coord_t y, coord_t startX, coord_t startY, coord_t slideX, coord_t slideY) override; #endif protected: constexpr static uint8_t padding_left = 3; TabsGroup * menu; uint8_t currentIndex = 0; +#if defined(HARDWARE_TOUCH) + bool sliding = false; +#endif }; class TabsGroupHeader: public FormGroup {