From cf6272e0ee61a777397a5ffbf0be625badacabe5 Mon Sep 17 00:00:00 2001 From: Gary Taylor Date: Sat, 21 Nov 2020 09:42:15 -0800 Subject: [PATCH 1/8] SetTouchDisabled func ability to disable all touchevents on the fly --- src/GUIslice.c | 7 ++++++- src/GUIslice.h | 4 ++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/GUIslice.c b/src/GUIslice.c index 45e40fa06..e546fd7b8 100755 --- a/src/GUIslice.c +++ b/src/GUIslice.c @@ -211,6 +211,7 @@ bool gslc_Init(gslc_tsGui* pGui,void* pvDriver,gslc_tsPage* asPage,uint8_t nMaxP //pGui->pfuncXEvent = NULL; // UNUSED pGui->pfuncPinPoll = NULL; + pGui->pfuncXTouchDisabled = false; pGui->asInputMap = NULL; pGui->nInputMapMax = 0; @@ -280,6 +281,10 @@ void gslc_SetPinPollFunc(gslc_tsGui* pGui,GSLC_CB_PIN_POLL pfunc) pGui->pfuncPinPoll = pfunc; } +void gslc_SetTouchDisabled(gslc_tsGui* pGui,bool pbool) +{ + pGui->pfuncXTouchDisabled = pbool; +} void gslc_InitInputMap(gslc_tsGui* pGui,gslc_tsInputMap* asInputMap,uint8_t nInputMapMax) { @@ -2853,7 +2858,7 @@ bool gslc_ElemEvent(void* pvGui,gslc_tsEvent sEvent) pfuncXTouch = pElemTracked->pfuncXTouch; // Invoke the callback function - if (pfuncXTouch != NULL) { + if (!pGui->pfuncXTouchDisabled && pfuncXTouch != NULL) { // Pass in the relative position from corner of element region (*pfuncXTouch)(pvGui,(void*)(pElemRefTracked),eTouch,nRelX,nRelY); } diff --git a/src/GUIslice.h b/src/GUIslice.h index cb39018b7..6e3ada570 100755 --- a/src/GUIslice.h +++ b/src/GUIslice.h @@ -794,6 +794,7 @@ typedef struct { // Callback functions //GSLC_CB_EVENT pfuncXEvent; ///< UNUSED: Callback func ptr for events GSLC_CB_PIN_POLL pfuncPinPoll; ///< Callback func ptr for pin polling + bool pfuncXTouchDisabled; ///< Disable touch events // Key/pin input control mapping @@ -2460,6 +2461,9 @@ void gslc_SetTouchRemapYX(gslc_tsGui* pGui, bool bSwap); /// \todo Doc. This API is experimental and subject to change void gslc_SetPinPollFunc(gslc_tsGui* pGui, GSLC_CB_PIN_POLL pfunc); +/// \todo Doc. This API is experimental and subject to change +void gslc_SetTouchDisabled(gslc_tsGui* pGui,bool pbool); + /// \todo Doc. This API is experimental and subject to change void gslc_InitInputMap(gslc_tsGui* pGui,gslc_tsInputMap* asInputMap,uint8_t nInputMapMax); From cb94e531b930173f4de8a7639c3ee010af1b6dbb Mon Sep 17 00:00:00 2001 From: Gary Taylor Date: Sat, 21 Nov 2020 09:53:04 -0800 Subject: [PATCH 2/8] SetScreenDisableRedraw func ability to disable screen redrawing routines on the fly --- src/GUIslice.c | 10 +++++++++- src/GUIslice.h | 3 +++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/GUIslice.c b/src/GUIslice.c index e546fd7b8..9901744d9 100755 --- a/src/GUIslice.c +++ b/src/GUIslice.c @@ -172,6 +172,7 @@ bool gslc_Init(gslc_tsGui* pGui,void* pvDriver,gslc_tsPage* asPage,uint8_t nMaxP } pGui->bScreenNeedRedraw = true; pGui->bScreenNeedFlip = false; + pGui->bScreenDisableRedraw = false; gslc_InvalidateRgnReset(pGui); @@ -708,7 +709,9 @@ void gslc_Update(gslc_tsGui* pGui) } // Perform any redraw required for current page - gslc_PageRedrawGo(pGui); + if (!pGui->bScreenDisableRedraw) { + gslc_PageRedrawGo(pGui); + } // Simple "frame" rate reporting // - Note that the rate is based on the number of calls to gslc_Update() @@ -2448,6 +2451,11 @@ int16_t gslc_PageFocusStep(gslc_tsGui* pGui, gslc_tsPage* pPage, bool bNext) } +void gslc_SetScreenDisableRedraw(gslc_tsGui* pGui,bool pbool) +{ + pGui->bScreenDisableRedraw = pbool; +} + // ------------------------------------------------------------------------ // Element General Functions // ------------------------------------------------------------------------ diff --git a/src/GUIslice.h b/src/GUIslice.h index 6e3ada570..42d890278 100755 --- a/src/GUIslice.h +++ b/src/GUIslice.h @@ -786,6 +786,7 @@ typedef struct { // Redraw of screen (ie. across page stack) bool bScreenNeedRedraw; ///< Screen requires a redraw bool bScreenNeedFlip; ///< Screen requires a page flip + bool bScreenDisableRedraw; ///< Screen redrawing disabled // Current clip region bool bInvalidateEn; ///< A region of the display has been invalidated @@ -3434,6 +3435,8 @@ void gslc_PageRedrawCalc(gslc_tsGui* pGui); /// \todo Doc. This API is experimental and subject to change int16_t gslc_PageFocusStep(gslc_tsGui* pGui,gslc_tsPage* pPage,bool bNext); +/// \todo Doc. This API is experimental and subject to change +void gslc_SetScreenDisableRedraw(gslc_tsGui* pGui,bool pbool); /// /// Create an event structure From e4968af660988699a60cde0eb5f989bd7cf653ff Mon Sep 17 00:00:00 2001 From: Gary Taylor Date: Sat, 21 Nov 2020 09:57:26 -0800 Subject: [PATCH 3/8] snprintf short int --- src/elem/XSpinner.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/elem/XSpinner.c b/src/elem/XSpinner.c index 02683567e..9e2677edf 100644 --- a/src/elem/XSpinner.c +++ b/src/elem/XSpinner.c @@ -106,7 +106,7 @@ gslc_tsElemRef* gslc_ElemXSpinnerCreate(gslc_tsGui* pGui, int16_t nElemId, int16 nBtnPosY = rElem.y + (rElem.h - nButtonSz) / 2; // set our intial value for our text field - snprintf(acTxtNum, XSPINNER_STR_LEN - 1, "%d", nVal); + snprintf(acTxtNum, XSPINNER_STR_LEN - 1, "%hd", nVal); gslc_tsElem sElem; From e7ef9a8cbab90d406782e552b440fb10cb105655 Mon Sep 17 00:00:00 2001 From: Gary Taylor Date: Sat, 21 Nov 2020 09:58:33 -0800 Subject: [PATCH 4/8] ignore .dep files --- .gitignore | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 19d31b1b3..25406a508 100644 --- a/.gitignore +++ b/.gitignore @@ -46,4 +46,7 @@ nbdist/ /Makefile # Builder files -builder/.gradle \ No newline at end of file +builder/.gradle + +# Dep Files +*.dep \ No newline at end of file From 4287ac69dab2778f32b2e211d200aa1d65a7af84 Mon Sep 17 00:00:00 2001 From: Gary Taylor Date: Sat, 21 Nov 2020 10:27:12 -0800 Subject: [PATCH 5/8] user slider ticks, eTouch prop into xSlider pXData pass pointer array of dbl type percetages to gslc_ElemXSliderSetTicks --- src/elem/XSlider.c | 21 ++++++++++++++++++++- src/elem/XSlider.h | 24 ++++++++++++++++++++++++ 2 files changed, 44 insertions(+), 1 deletion(-) diff --git a/src/elem/XSlider.c b/src/elem/XSlider.c index 47f0ca801..75bb3da09 100644 --- a/src/elem/XSlider.c +++ b/src/elem/XSlider.c @@ -106,6 +106,7 @@ gslc_tsElemRef* gslc_ElemXSliderCreate(gslc_tsGui* pGui,int16_t nElemId,int16_t pXData->colTrim = GSLC_COL_BLACK; pXData->nTickDiv = 0; pXData->pfuncXPos = NULL; + pXData->eTouch = GSLC_TOUCH_NONE; sElem.pXData = (void*)(pXData); // Specify the custom drawing callback sElem.pfuncXDraw = &gslc_ElemXSliderDraw; @@ -191,6 +192,7 @@ void gslc_ElemXSliderSetPos(gslc_tsGui* pGui,gslc_tsElemRef* pElemRef,int16_t nP if (pSlider->pfuncXPos != NULL) { (*pSlider->pfuncXPos)((void*)(pGui),(void*)(pElemRef),nPos); } + pSlider->eTouch = GSLC_TOUCH_NONE; // Mark for redraw // - Only need incremental redraw @@ -213,6 +215,12 @@ void gslc_ElemXSliderSetPosFunc(gslc_tsGui* pGui,gslc_tsElemRef* pElemRef,GSLC_C pSlider->pfuncXPos = funcCb; } +void gslc_ElemXSliderSetTicks(gslc_tsGui* pGui,gslc_tsElemRef* pElemRef, double * nTickArr, int nTickArrLen) { + gslc_tsElem* pElem = gslc_GetElemFromRef(pGui,pElemRef); + gslc_tsXSlider* pSlider = (gslc_tsXSlider*)(pElem->pXData); + pSlider->nTickArr = nTickArr; + pSlider->nTickArrLen = nTickArrLen; +} // Redraw the slider // - Note that this redraw is for the entire element rect region @@ -249,6 +257,8 @@ bool gslc_ElemXSliderDraw(void* pvGui,void* pvElemRef,gslc_teRedrawType eRedraw) uint16_t nTickDiv = pSlider->nTickDiv; int16_t nTickLen = pSlider->nTickLen; gslc_tsColor colTick = pSlider->colTick; + double * nTickArr = pSlider->nTickArr; + int nTickArrLen = pSlider->nTickArrLen; // Range check on nPos if (nPos < nPosMin) { nPos = nPosMin; } @@ -304,6 +314,14 @@ bool gslc_ElemXSliderDraw(void* pvGui,void* pvElemRef,gslc_teRedrawType eRedraw) } } + if (nTickArr) { + for (size_t i = 0; i < nTickArrLen; i++) { + if (nTickArr[i] == 0) { continue; } + int16_t xOffset = (pElem->rElem.w - (nMargin * 2)) * (double)(nTickArr[i] / 100); + gslc_DrawLine(pGui,xOffset+nX0+nMargin,nYMid-17,xOffset+nX0+nMargin,nYMid+18,GSLC_COL_GRAY); + } + } + // Draw the track if (!bVert) { @@ -335,7 +353,7 @@ bool gslc_ElemXSliderDraw(void* pvGui,void* pvElemRef,gslc_teRedrawType eRedraw) nCtrlX0 = nXMid-nThumbSz; nCtrlY0 = nY0+nCtrlPos-nThumbSz; } - rThumb.x = nCtrlX0; + rThumb.x = nCtrlX0 - (rThumb.w / 2); rThumb.y = nCtrlY0; rThumb.w = 2*nThumbSz; rThumb.h = 2*nThumbSz; @@ -383,6 +401,7 @@ bool gslc_ElemXSliderTouch(void* pvGui,void* pvElemRef,gslc_teTouch eTouch,int16 pElemRef = (gslc_tsElemRef*)(pvElemRef); pElem = gslc_GetElemFromRef(pGui,pElemRef); pSlider = (gslc_tsXSlider*)(pElem->pXData); + pSlider->eTouch = eTouch; bool bGlowingOld = gslc_ElemGetGlow(pGui,pElemRef); int16_t nPosRng; diff --git a/src/elem/XSlider.h b/src/elem/XSlider.h index 0a0f60fcd..cdd4e12c8 100644 --- a/src/elem/XSlider.h +++ b/src/elem/XSlider.h @@ -73,6 +73,11 @@ typedef struct { int16_t nPos; ///< Current position value of the slider // Callbacks GSLC_CB_XSLIDER_POS pfuncXPos; ///< Callback func ptr for position update + // EventType + gslc_teTouch eTouch; ///< Touch event type + // Extra Ticks + double * nTickArr; ///< User defined tick array + int nTickArrLen; ///< User defined tick array length } gslc_tsXSlider; @@ -149,6 +154,19 @@ void gslc_ElemXSliderSetPos(gslc_tsGui* pGui,gslc_tsElemRef* pElemRef,int16_t nP /// void gslc_ElemXSliderSetPosFunc(gslc_tsGui* pGui,gslc_tsElemRef* pElemRef,GSLC_CB_XSLIDER_POS funcCb); + +/// +/// Assign user defined ticks for a slider +/// +/// \param[in] pGui: Pointer to GUI +/// \param[in] pElemRef: Pointer to Element reference +/// \param[in] nTickArr: Pointer of dbl types, offset percentages from left side +/// +/// \return none +/// +void gslc_ElemXSliderSetTicks(gslc_tsGui* pGui,gslc_tsElemRef* pElemRef,double * nTickArr,int nTickArrLen); + + /// /// Draw a Slider element on the screen /// - Called from gslc_ElemDraw() @@ -229,6 +247,9 @@ bool gslc_ElemXSliderTouch(void* pvGui,void* pvElemRef,gslc_teTouch eTouch,int16 sSlider##nElemId.colTrim = GSLC_COL_BLACK; \ sSlider##nElemId.nPos = nPos_; \ sSlider##nElemId.pfuncXPos = NULL; \ + sSlider##nElemId.eTouch = GSLC_TOUCH_NONE; \ + sSlider##nElemId.nTickArr = GSLC_TOUCH_NONE; \ + sSlider##nElemId.nTickArrLen = 0; \ static const gslc_tsElem sElem##nElemId PROGMEM = { \ nElemId, \ nFeatures##nElemId, \ @@ -276,6 +297,9 @@ bool gslc_ElemXSliderTouch(void* pvGui,void* pvElemRef,gslc_teTouch eTouch,int16 sSlider##nElemId.colTrim = GSLC_COL_BLACK; \ sSlider##nElemId.nPos = nPos_; \ sSlider##nElemId.pfuncXPos = NULL; \ + sSlider##nElemId.eTouch = GSLC_TOUCH_NONE; \ + sSlider##nElemId.nTickArr = GSLC_TOUCH_NONE; \ + sSlider##nElemId.nTickArrLen = 0; \ static const gslc_tsElem sElem##nElemId = { \ nElemId, \ nFeatures##nElemId, \ From eb4bba21afcaf0964b33f22c06e0b30652ff58c5 Mon Sep 17 00:00:00 2001 From: Gary Taylor Date: Sat, 21 Nov 2020 11:39:31 -0800 Subject: [PATCH 6/8] rework XSlider nTickArr to uint16_t --- src/elem/XSlider.c | 10 +++++----- src/elem/XSlider.h | 6 +++--- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/elem/XSlider.c b/src/elem/XSlider.c index 75bb3da09..78eedcd5a 100644 --- a/src/elem/XSlider.c +++ b/src/elem/XSlider.c @@ -215,7 +215,7 @@ void gslc_ElemXSliderSetPosFunc(gslc_tsGui* pGui,gslc_tsElemRef* pElemRef,GSLC_C pSlider->pfuncXPos = funcCb; } -void gslc_ElemXSliderSetTicks(gslc_tsGui* pGui,gslc_tsElemRef* pElemRef, double * nTickArr, int nTickArrLen) { +void gslc_ElemXSliderSetTicks(gslc_tsGui* pGui,gslc_tsElemRef* pElemRef, uint16_t* nTickArr, uint8_t nTickArrLen) { gslc_tsElem* pElem = gslc_GetElemFromRef(pGui,pElemRef); gslc_tsXSlider* pSlider = (gslc_tsXSlider*)(pElem->pXData); pSlider->nTickArr = nTickArr; @@ -257,8 +257,8 @@ bool gslc_ElemXSliderDraw(void* pvGui,void* pvElemRef,gslc_teRedrawType eRedraw) uint16_t nTickDiv = pSlider->nTickDiv; int16_t nTickLen = pSlider->nTickLen; gslc_tsColor colTick = pSlider->colTick; - double * nTickArr = pSlider->nTickArr; - int nTickArrLen = pSlider->nTickArrLen; + uint16_t * nTickArr = pSlider->nTickArr; + uint8_t nTickArrLen = pSlider->nTickArrLen; // Range check on nPos if (nPos < nPosMin) { nPos = nPosMin; } @@ -316,8 +316,8 @@ bool gslc_ElemXSliderDraw(void* pvGui,void* pvElemRef,gslc_teRedrawType eRedraw) if (nTickArr) { for (size_t i = 0; i < nTickArrLen; i++) { - if (nTickArr[i] == 0) { continue; } - int16_t xOffset = (pElem->rElem.w - (nMargin * 2)) * (double)(nTickArr[i] / 100); + if (nTickArr[i] < 0 || nTickArr[i] > 1000) { continue; } + int16_t xOffset = ((pElem->rElem.w - (nMargin * 2)) * nTickArr[i]) / 1000; gslc_DrawLine(pGui,xOffset+nX0+nMargin,nYMid-17,xOffset+nX0+nMargin,nYMid+18,GSLC_COL_GRAY); } } diff --git a/src/elem/XSlider.h b/src/elem/XSlider.h index cdd4e12c8..7b54c76bb 100644 --- a/src/elem/XSlider.h +++ b/src/elem/XSlider.h @@ -76,8 +76,8 @@ typedef struct { // EventType gslc_teTouch eTouch; ///< Touch event type // Extra Ticks - double * nTickArr; ///< User defined tick array - int nTickArrLen; ///< User defined tick array length + uint16_t * nTickArr; ///< User defined tick array - Range 0 - 1000 + uint8_t nTickArrLen; ///< User defined tick array length } gslc_tsXSlider; @@ -164,7 +164,7 @@ void gslc_ElemXSliderSetPosFunc(gslc_tsGui* pGui,gslc_tsElemRef* pElemRef,GSLC_C /// /// \return none /// -void gslc_ElemXSliderSetTicks(gslc_tsGui* pGui,gslc_tsElemRef* pElemRef,double * nTickArr,int nTickArrLen); +void gslc_ElemXSliderSetTicks(gslc_tsGui* pGui, gslc_tsElemRef* pElemRef, uint16_t* nTickArr, uint8_t nTickArrLen); /// From 2ac66d4a01a319686859d632728e0a4f52ef3f70 Mon Sep 17 00:00:00 2001 From: Calvin Hass Date: Mon, 30 Nov 2020 00:00:50 -0800 Subject: [PATCH 7/8] Revise API to provide a SetStyleCustom() per #294 - Custom tick positions are defined by percentages (0..100) - Enable tick marks to be drawn above and/or below the baseline - Support horizontal & vertical arrangement --- src/elem/XSlider.c | 61 +++++++++++++++++++++++++++++----------------- src/elem/XSlider.h | 30 ++++++++++++++++++++--- 2 files changed, 64 insertions(+), 27 deletions(-) diff --git a/src/elem/XSlider.c b/src/elem/XSlider.c index 78eedcd5a..5a8d22ccb 100644 --- a/src/elem/XSlider.c +++ b/src/elem/XSlider.c @@ -105,8 +105,10 @@ gslc_tsElemRef* gslc_ElemXSliderCreate(gslc_tsGui* pGui,int16_t nElemId,int16_t pXData->bTrim = false; pXData->colTrim = GSLC_COL_BLACK; pXData->nTickDiv = 0; + pXData->anTickPos = NULL; pXData->pfuncXPos = NULL; pXData->eTouch = GSLC_TOUCH_NONE; + pXData->eTickFmt = teXSliderFmt_TickBelow; sElem.pXData = (void*)(pXData); // Specify the custom drawing callback sElem.pfuncXDraw = &gslc_ElemXSliderDraw; @@ -155,6 +157,19 @@ void gslc_ElemXSliderSetStyle(gslc_tsGui* pGui,gslc_tsElemRef* pElemRef, gslc_ElemSetRedraw(pGui,pElemRef,GSLC_REDRAW_FULL); } +void gslc_ElemXSliderSetStyleCustom(gslc_tsGui* pGui,gslc_tsElemRef* pElemRef, uint8_t* anTickPos, bool bTickAbove, bool bTickBelow) +{ + gslc_tsElem* pElem = gslc_GetElemFromRef(pGui,pElemRef); + gslc_tsXSlider* pSlider = (gslc_tsXSlider*)(pElem->pXData); + pSlider->eTickFmt = 0; + if (anTickPos != NULL) { + pSlider->anTickPos = anTickPos; + pSlider->eTickFmt |= teXSliderFmt_PosCustom; + } + pSlider->eTickFmt |= (bTickAbove)? teXSliderFmt_TickAbove : 0; + pSlider->eTickFmt |= (bTickBelow)? teXSliderFmt_TickBelow : 0; +} + int gslc_ElemXSliderGetPos(gslc_tsGui* pGui,gslc_tsElemRef* pElemRef) { if (pElemRef == NULL) { @@ -215,13 +230,6 @@ void gslc_ElemXSliderSetPosFunc(gslc_tsGui* pGui,gslc_tsElemRef* pElemRef,GSLC_C pSlider->pfuncXPos = funcCb; } -void gslc_ElemXSliderSetTicks(gslc_tsGui* pGui,gslc_tsElemRef* pElemRef, uint16_t* nTickArr, uint8_t nTickArrLen) { - gslc_tsElem* pElem = gslc_GetElemFromRef(pGui,pElemRef); - gslc_tsXSlider* pSlider = (gslc_tsXSlider*)(pElem->pXData); - pSlider->nTickArr = nTickArr; - pSlider->nTickArrLen = nTickArrLen; -} - // Redraw the slider // - Note that this redraw is for the entire element rect region // - The Draw function parameters use void pointers to allow for @@ -256,9 +264,9 @@ bool gslc_ElemXSliderDraw(void* pvGui,void* pvElemRef,gslc_teRedrawType eRedraw) gslc_tsColor colTrim = pSlider->colTrim; uint16_t nTickDiv = pSlider->nTickDiv; int16_t nTickLen = pSlider->nTickLen; + uint8_t eTickFmt = pSlider->eTickFmt; gslc_tsColor colTick = pSlider->colTick; - uint16_t * nTickArr = pSlider->nTickArr; - uint8_t nTickArrLen = pSlider->nTickArrLen; + uint8_t* anTickPos = pSlider->anTickPos; // Range check on nPos if (nPos < nPosMin) { nPos = nPosMin; } @@ -302,27 +310,34 @@ bool gslc_ElemXSliderDraw(void* pvGui,void* pvElemRef,gslc_teRedrawType eRedraw) if (nTickDiv>=1) { uint16_t nTickInd; int16_t nTickOffset; + int16_t nTickLenAbove,nTickLenBelow; + bool bTickPosCustom; + nTickLenAbove = (eTickFmt & teXSliderFmt_TickAbove) ? nTickLen : 0; + nTickLenBelow = (eTickFmt & teXSliderFmt_TickBelow) ? nTickLen : 0; + bTickPosCustom = (eTickFmt & teXSliderFmt_PosCustom); for (nTickInd=0;nTickInd<=nTickDiv;++nTickInd) { - nTickOffset = (int16_t)((int32_t)nTickInd * (int32_t)nCtrlRng / (int32_t)nTickDiv); + if (!bTickPosCustom) { + // Tick marks are evenly spaced along length + // - In this mode, nTickDiv defines the number of "divisions", so we + // draw nTickDiv+1 lines in total + nTickOffset = (int16_t)((int32_t)nTickInd * (int32_t)nCtrlRng / (int32_t)nTickDiv); + } else { + // Tick marks are positioned according to custom tick array + // - In this mode, nTickDiv defines the length of the tick array + // so we need to skip the last loop iteration + if (nTickInd == nTickDiv) { continue; } + nTickOffset = (int16_t)((int32_t)anTickPos[nTickInd] * (int32_t)nCtrlRng / (int32_t)100); + } if (!bVert) { - gslc_DrawLine(pGui,nX0+nMargin+ nTickOffset,nYMid, - nX0+nMargin + nTickOffset,nYMid+nTickLen,colTick); + gslc_DrawLine(pGui,nX0+nMargin+nTickOffset,nYMid-nTickLenAbove, + nX0+nMargin+nTickOffset,nYMid+nTickLenBelow,colTick); } else { - gslc_DrawLine(pGui,nXMid,nY0+nMargin+ nTickOffset, - nXMid+nTickLen,nY0+nMargin + nTickOffset,colTick); + gslc_DrawLine(pGui,nXMid-nTickLenAbove,nY0+nMargin+nTickOffset, + nXMid+nTickLenBelow,nY0+nMargin+nTickOffset,colTick); } } } - if (nTickArr) { - for (size_t i = 0; i < nTickArrLen; i++) { - if (nTickArr[i] < 0 || nTickArr[i] > 1000) { continue; } - int16_t xOffset = ((pElem->rElem.w - (nMargin * 2)) * nTickArr[i]) / 1000; - gslc_DrawLine(pGui,xOffset+nX0+nMargin,nYMid-17,xOffset+nX0+nMargin,nYMid+18,GSLC_COL_GRAY); - } - } - - // Draw the track if (!bVert) { // Make the track highlight during glow diff --git a/src/elem/XSlider.h b/src/elem/XSlider.h index 7b54c76bb..bd7fd0378 100644 --- a/src/elem/XSlider.h +++ b/src/elem/XSlider.h @@ -56,6 +56,13 @@ typedef bool (*GSLC_CB_XSLIDER_POS)(void* pvGui,void* pvElem,int16_t nPos); // - These data structures are maintained in the gslc_tsElem // structure via the pXData pointer +/// Enumerations for custom tick styling +enum { + teXSliderFmt_TickAbove = 1, ///< Draw a tick mark above/left of the line + teXSliderFmt_TickBelow = 2, ///< Draw a tick mark below/right of the line + teXSliderFmt_PosCustom = 32, ///< Position of tick marks defined by user array +}; + /// Extended data for Slider element typedef struct { // Config @@ -69,15 +76,14 @@ typedef struct { gslc_tsColor colTick; ///< Style: color of ticks bool bTrim; ///< Style: show a trim color gslc_tsColor colTrim; ///< Style: color of trim + uint8_t eTickFmt; ///< Style: tick format options + uint8_t* anTickPos; ///< Style: custom tick position array (range: 0..100), nTickDiv entries // State int16_t nPos; ///< Current position value of the slider // Callbacks GSLC_CB_XSLIDER_POS pfuncXPos; ///< Callback func ptr for position update // EventType gslc_teTouch eTouch; ///< Touch event type - // Extra Ticks - uint16_t * nTickArr; ///< User defined tick array - Range 0 - 1000 - uint8_t nTickArrLen; ///< User defined tick array length } gslc_tsXSlider; @@ -103,7 +109,7 @@ gslc_tsElemRef* gslc_ElemXSliderCreate(gslc_tsGui* pGui,int16_t nElemId,int16_t /// -/// Set a Slider element's current position +/// Set a Slider element's appearance /// /// \param[in] pGui: Pointer to GUI /// \param[in] pElemRef: Pointer to Element reference @@ -119,6 +125,22 @@ void gslc_ElemXSliderSetStyle(gslc_tsGui* pGui,gslc_tsElemRef* pElemRef, bool bTrim,gslc_tsColor colTrim,uint16_t nTickDiv, int16_t nTickLen,gslc_tsColor colTick); +/// +/// Set a Slider element's appearance (custom options) +/// +/// \param[in] pGui: Pointer to GUI +/// \param[in] pElemRef: Pointer to Element reference +/// \param[in] anTickPos: Pointer to custom tick position array (in percent) +/// If NULL, the default evenly-spaced ticks are used +/// If non-NULL, the tick positions are defined by the array +/// with a length defined by nTickDiv +/// \param[in] bTickAbove: If enabled, draw tick marks above/left of the line +/// \param[in] bTickBelow: If enabled, draw tick marks below/right of the line +/// +/// \return none +/// +void gslc_ElemXSliderSetStyleCustom(gslc_tsGui* pGui,gslc_tsElemRef* pElemRef, + uint8_t* anTickPos, bool bTickAbove, bool bTickBelow); /// /// Get a Slider element's current position From a63c81b7903b01c0c374eb7a8a540cb97fd3db0d Mon Sep 17 00:00:00 2001 From: Calvin Hass Date: Tue, 22 Dec 2020 21:25:18 -0800 Subject: [PATCH 8/8] Revise XSliderSetStyleCustom to use pixel ticks --- src/elem/XSlider.c | 6 +++--- src/elem/XSlider.h | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/elem/XSlider.c b/src/elem/XSlider.c index 5a8d22ccb..6da2d46a3 100644 --- a/src/elem/XSlider.c +++ b/src/elem/XSlider.c @@ -157,7 +157,7 @@ void gslc_ElemXSliderSetStyle(gslc_tsGui* pGui,gslc_tsElemRef* pElemRef, gslc_ElemSetRedraw(pGui,pElemRef,GSLC_REDRAW_FULL); } -void gslc_ElemXSliderSetStyleCustom(gslc_tsGui* pGui,gslc_tsElemRef* pElemRef, uint8_t* anTickPos, bool bTickAbove, bool bTickBelow) +void gslc_ElemXSliderSetStyleCustom(gslc_tsGui* pGui,gslc_tsElemRef* pElemRef, uint16_t* anTickPos, bool bTickAbove, bool bTickBelow) { gslc_tsElem* pElem = gslc_GetElemFromRef(pGui,pElemRef); gslc_tsXSlider* pSlider = (gslc_tsXSlider*)(pElem->pXData); @@ -266,7 +266,7 @@ bool gslc_ElemXSliderDraw(void* pvGui,void* pvElemRef,gslc_teRedrawType eRedraw) int16_t nTickLen = pSlider->nTickLen; uint8_t eTickFmt = pSlider->eTickFmt; gslc_tsColor colTick = pSlider->colTick; - uint8_t* anTickPos = pSlider->anTickPos; + uint16_t* anTickPos = pSlider->anTickPos; // Range check on nPos if (nPos < nPosMin) { nPos = nPosMin; } @@ -326,7 +326,7 @@ bool gslc_ElemXSliderDraw(void* pvGui,void* pvElemRef,gslc_teRedrawType eRedraw) // - In this mode, nTickDiv defines the length of the tick array // so we need to skip the last loop iteration if (nTickInd == nTickDiv) { continue; } - nTickOffset = (int16_t)((int32_t)anTickPos[nTickInd] * (int32_t)nCtrlRng / (int32_t)100); + nTickOffset = (int16_t)(anTickPos[nTickInd]); } if (!bVert) { gslc_DrawLine(pGui,nX0+nMargin+nTickOffset,nYMid-nTickLenAbove, diff --git a/src/elem/XSlider.h b/src/elem/XSlider.h index bd7fd0378..4199523f5 100644 --- a/src/elem/XSlider.h +++ b/src/elem/XSlider.h @@ -77,7 +77,7 @@ typedef struct { bool bTrim; ///< Style: show a trim color gslc_tsColor colTrim; ///< Style: color of trim uint8_t eTickFmt; ///< Style: tick format options - uint8_t* anTickPos; ///< Style: custom tick position array (range: 0..100), nTickDiv entries + uint16_t* anTickPos; ///< Style: custom tick position array (pixel offset), nTickDiv entries // State int16_t nPos; ///< Current position value of the slider // Callbacks @@ -130,7 +130,7 @@ void gslc_ElemXSliderSetStyle(gslc_tsGui* pGui,gslc_tsElemRef* pElemRef, /// /// \param[in] pGui: Pointer to GUI /// \param[in] pElemRef: Pointer to Element reference -/// \param[in] anTickPos: Pointer to custom tick position array (in percent) +/// \param[in] anTickPos: Pointer to custom tick position array (in pixels) /// If NULL, the default evenly-spaced ticks are used /// If non-NULL, the tick positions are defined by the array /// with a length defined by nTickDiv @@ -140,7 +140,7 @@ void gslc_ElemXSliderSetStyle(gslc_tsGui* pGui,gslc_tsElemRef* pElemRef, /// \return none /// void gslc_ElemXSliderSetStyleCustom(gslc_tsGui* pGui,gslc_tsElemRef* pElemRef, - uint8_t* anTickPos, bool bTickAbove, bool bTickBelow); + uint16_t* anTickPos, bool bTickAbove, bool bTickBelow); /// /// Get a Slider element's current position