Add up number of visible dynamically changing elements

I have been trying all day to figure out how to add up numbers in a text global variable in order to help with some other complex sizing issues.

I have created a calendar agenda that has the ability to show multiple events per day. I have customized it in a way that one could hide or show however many events. Unfortunately, this makes adding a shape behind the whole thing a pain, since i need to calculate the height and width of the whole calendar. I have actually figured out the width. The height is more complicated. I have managed to figure out the maths involved: a for loop, some if/then statements, regexp. And now i have a text string with the number of elements showing in order to size the background rectangle (and other planned features).

The solution i have is in a text format. And adding "+" between the numbers does not add them up. It just concactinates all of the numbers and symbols.

This is what i have so far:

gv(totHeight)

$(gv(tall)+gv(paddVert))*gv(numItems)+gv(padfTpBt)$
  • gv(tall) [80] is the height of each element. A number in the globals
  • gv(paddVert) [0] is additional vertical padding added to each element. A number in the globals
  • gv(numItems) [dynamic] you'll see in a minute. It is the total number of agenda elements. A text formula. The thing im having problems with.
  • gv(padfTpBt) [0] is additional paddin to the top and bottom of the entire komponent. A number in the globals.

gv(numItems)

$tc(
   reg,fl(
      0, gv(shodays)-1, "i+1", "if(
         ci(acount,a+i+d)+ci(ecount,a+i+d)<=gv(shoXRevn),
         ci(acount,a+i+d)+ci(ecount,a+i+d),
         mu(round,gv(shoXRevn))
      )","+"
   ),"0",1
)$
  • gv(shoDays) [7] is the number of days youd want listed in the agenda. This includes days with no events because i have weather forecast info for each day as well. The max number i chose is 14 days, but can be adjusted via A number in the globals.
  • gv(shoXRevn) [3] is the max number of events to show per day (ex: if a day has 4 events, but you only want to see the first 2 on the komponent). I set max to 5 min to 1. This is the needle that is making my life difficult. Because each day could have different number of events. And i have it set up to be able to dynamically reduce that number via A number in the globals.

At any rate, the gv(numItems) actually works, but its output is a text string that outputs something like this "1+4+1+1+1+2+1+1+2+1+1+3+1+1". This actually tells me how many events per selected number of days, and if i reduced gv(shoXRevn) it reflects that by subtracting 1 from each number until reaching 1. So, if i adjusted gv(shoDays) to 3 and gv(shoXRevn) to 2, the output would be "1+2+1". Or 7 days and max 3 events would be "1+3+1+1+1+2+1". You get the idea.

Im just not sure how to output that text string to a number to be used by gv(totHeight) to calculate my total height. I kinda wish there was a math utility for sum $mu(sum, gv(numItems))$ which would parse its input like an array.

As an aside, if anyone has a different strategy to calculate total height for my situation, I'm all ears. Maybe an easier way to get the number of calendar events with CI using my constraints? Or a better way to write the for loop? Or better regex? Or maybe the stack group container and sub-containers have a way of telling you how big they are?

Thanks for taking the time to read.

I managed to write (what i think is) a lighter version of the kode for gv(numitems) that gets the same result.

$fl(0,gv(shodays)-1,"i+1",
   mu(min,
      mu(max,
         1,ci(acount,a+i+d)+ci(ecount,a+i+d)),
      gv(shoxrevn)
   )","+"
)$

This yields decimal numbers concactinated together

So, if gv(shodays)=5 and gv(shoxrevn)=3 the result would be something like "1.0+3.0+1.0+1.0+2.0".

I think ive come to the conclusion that the for loop automatically converts the output to a string. The only time i can get it to behave as a number is if there is only 1 iteration. Set $fl(0,0,"i+1","ci(acount,a+i+d)")$ which is a stupid way of just writing $ci(acount,a0d)$

Above code is missing " (open quote) after ["i+1",] on line1.

Anyway, heres another mystery, for global variables, the list global variable would be perfect to show a list (who knew). I figured I'll just manually add $ci(acount,a0d)+ci(ecount,a0d)$ for a bunch of lists, doing the summation in the list GV. But as i was poking around, i noticed the list gv can be edited into a formula. The only problem is that the formula hint says "Must return a: o"

I have no idea what that means. I was hoping to just plug in the above kode and the list auto-populate with the correct info as per my kode, but it does not. Just thought i'd also ask how formula input for a list global variable works.

I came up with a work-around. Its actually terrible, but it works.

Gv(totHeight)

$((gv(tall)+gv(paddVert))*gv(evntcntz,gv(shodays)-1))+gv(padfTpBt)$

gv(evntCntZ) is a list global variable. And is stupid huge.

$mu(min,gv(shoXRevn),mu(max,1,ci(acount,a0d)+ci(ecount,a0d)))$##1, $mu(min,gv(shoXRevn),mu(max,1,ci(acount,a0d)+ci(ecount,a0d)))+mu(min,gv(shoXRevn),mu(max,1,ci(acount,a1d)+ci(ecount,a1d)))$##2, $mu(min,gv(shoXRevn),mu(max,1,ci(acount,a0d)+ci(ecount,a0d)))+mu(min,gv(shoXRevn),mu(max,1,ci(acount,a1d)+ci(ecount,a1d)))+mu(min,gv(shoXRevn),mu(max,1,ci(acount,a2d)+ci(ecount,a2d)))$##3, $mu(min,gv(shoXRevn),mu(max,1,ci(acount,a0d)+ci(ecount,a0d)))+mu(min,gv(shoXRevn),mu(max,1,ci(acount,a1d)+ci(ecount,a1d)))+mu(min,gv(shoXRevn),mu(max,1,ci(acount,a2d)+ci(ecount,a2d)))+mu(min,gv(shoXRevn),mu(max,1,ci(acount,a3d)+ci(ecount,a3d)))$##4, $mu(min,gv(shoXRevn),mu(max,1,ci(acount,a0d)+ci(ecount,a0d)))+mu(min,gv(shoXRevn),mu(max,1,ci(acount,a1d)+ci(ecount,a1d)))+mu(min,gv(shoXRevn),mu(max,1,ci(acount,a2d)+ci(ecount,a2d)))+mu(min,gv(shoXRevn),mu(max,1,ci(acount,a3d)+ci(ecount,a3d)))+mu(min,gv(shoXRevn),mu(max,1,ci(acount,a4d)+ci(ecount,a4d)))$##5, $mu(min,gv(shoXRevn),mu(max,1,ci(acount,a0d)+ci(ecount,a0d)))+mu(min,gv(shoXRevn),mu(max,1,ci(acount,a1d)+ci(ecount,a1d)))+mu(min,gv(shoXRevn),mu(max,1,ci(acount,a2d)+ci(ecount,a2d)))+mu(min,gv(shoXRevn),mu(max,1,ci(acount,a3d)+ci(ecount,a3d)))+mu(min,gv(shoXRevn),mu(max,1,ci(acount,a4d)+ci(ecount,a4d)))+mu(min,gv(shoXRevn),mu(max,1,ci(acount,a5d)+ci(ecount,a5d)))$##6, $mu(min,gv(shoXRevn),mu(max,1,ci(acount,a0d)+ci(ecount,a0d)))+mu(min,gv(shoXRevn),mu(max,1,ci(acount,a1d)+ci(ecount,a1d)))+mu(min,gv(shoXRevn),mu(max,1,ci(acount,a2d)+ci(ecount,a2d)))+mu(min,gv(shoXRevn),mu(max,1,ci(acount,a3d)+ci(ecount,a3d)))+mu(min,gv(shoXRevn),mu(max,1,ci(acount,a4d)+ci(ecount,a4d)))+mu(min,gv(shoXRevn),mu(max,1,ci(acount,a5d)+ci(ecount,a5d)))+mu(min,gv(shoXRevn),mu(max,1,ci(acount,a6d)+ci(ecount,a6d)))$##7, $mu(min,gv(shoXRevn),mu(max,1,ci(acount,a0d)+ci(ecount,a0d)))+mu(min,gv(shoXRevn),mu(max,1,ci(acount,a1d)+ci(ecount,a1d)))+mu(min,gv(shoXRevn),mu(max,1,ci(acount,a2d)+ci(ecount,a2d)))+mu(min,gv(shoXRevn),mu(max,1,ci(acount,a3d)+ci(ecount,a3d)))+mu(min,gv(shoXRevn),mu(max,1,ci(acount,a4d)+ci(ecount,a4d)))+mu(min,gv(shoXRevn),mu(max,1,ci(acount,a5d)+ci(ecount,a5d)))+mu(min,gv(shoXRevn),mu(max,1,ci(acount,a6d)+ci(ecount,a6d)))+mu(min,gv(shoXRevn),mu(max,1,ci(acount,a7d)+ci(ecount,a7d)))$##8, $mu(min,gv(shoXRevn),mu(max,1,ci(acount,a0d)+ci(ecount,a0d)))+mu(min,gv(shoXRevn),mu(max,1,ci(acount,a1d)+ci(ecount,a1d)))+mu(min,gv(shoXRevn),mu(max,1,ci(acount,a2d)+ci(ecount,a2d)))+mu(min,gv(shoXRevn),mu(max,1,ci(acount,a3d)+ci(ecount,a3d)))+mu(min,gv(shoXRevn),mu(max,1,ci(acount,a4d)+ci(ecount,a4d)))+mu(min,gv(shoXRevn),mu(max,1,ci(acount,a5d)+ci(ecount,a5d)))+mu(min,gv(shoXRevn),mu(max,1,ci(acount,a6d)+ci(ecount,a6d)))+mu(min,gv(shoXRevn),mu(max,1,ci(acount,a7d)+ci(ecount,a7d)))+mu(min,gv(shoXRevn),mu(max,1,ci(acount,a8d)+ci(ecount,a8d)))$##9, $mu(min,gv(shoXRevn),mu(max,1,ci(acount,a0d)+ci(ecount,a0d)))+mu(min,gv(shoXRevn),mu(max,1,ci(acount,a1d)+ci(ecount,a1d)))+mu(min,gv(shoXRevn),mu(max,1,ci(acount,a2d)+ci(ecount,a2d)))+mu(min,gv(shoXRevn),mu(max,1,ci(acount,a3d)+ci(ecount,a3d)))+mu(min,gv(shoXRevn),mu(max,1,ci(acount,a4d)+ci(ecount,a4d)))+mu(min,gv(shoXRevn),mu(max,1,ci(acount,a5d)+ci(ecount,a5d)))+mu(min,gv(shoXRevn),mu(max,1,ci(acount,a6d)+ci(ecount,a6d)))+mu(min,gv(shoXRevn),mu(max,1,ci(acount,a7d)+ci(ecount,a7d)))+mu(min,gv(shoXRevn),mu(max,1,ci(acount,a8d)+ci(ecount,a8d)))+mu(min,gv(shoXRevn),mu(max,1,ci(acount,a9d)+ci(ecount,a9d)))$##10, $mu(min,gv(shoXRevn),mu(max,1,ci(acount,a0d)+ci(ecount,a0d)))+mu(min,gv(shoXRevn),mu(max,1,ci(acount,a1d)+ci(ecount,a1d)))+mu(min,gv(shoXRevn),mu(max,1,ci(acount,a2d)+ci(ecount,a2d)))+mu(min,gv(shoXRevn),mu(max,1,ci(acount,a3d)+ci(ecount,a3d)))+mu(min,gv(shoXRevn),mu(max,1,ci(acount,a4d)+ci(ecount,a4d)))+mu(min,gv(shoXRevn),mu(max,1,ci(acount,a5d)+ci(ecount,a5d)))+mu(min,gv(shoXRevn),mu(max,1,ci(acount,a6d)+ci(ecount,a6d)))+mu(min,gv(shoXRevn),mu(max,1,ci(acount,a7d)+ci(ecount,a7d)))+mu(min,gv(shoXRevn),mu(max,1,ci(acount,a8d)+ci(ecount,a8d)))+mu(min,gv(shoXRevn),mu(max,1,ci(acount,a9d)+ci(ecount,a9d)))+mu(min,gv(shoXRevn),mu(max,1,ci(acount,a10d)+ci(ecount,a10d)))$##11, $mu(min,gv(shoXRevn),mu(max,1,ci(acount,a0d)+ci(ecount,a0d)))+mu(min,gv(shoXRevn),mu(max,1,ci(acount,a1d)+ci(ecount,a1d)))+mu(min,gv(shoXRevn),mu(max,1,ci(acount,a2d)+ci(ecount,a2d)))+mu(min,gv(shoXRevn),mu(max,1,ci(acount,a3d)+ci(ecount,a3d)))+mu(min,gv(shoXRevn),mu(max,1,ci(acount,a4d)+ci(ecount,a4d)))+mu(min,gv(shoXRevn),mu(max,1,ci(acount,a5d)+ci(ecount,a5d)))+mu(min,gv(shoXRevn),mu(max,1,ci(acount,a6d)+ci(ecount,a6d)))+mu(min,gv(shoXRevn),mu(max,1,ci(acount,a7d)+ci(ecount,a7d)))+mu(min,gv(shoXRevn),mu(max,1,ci(acount,a8d)+ci(ecount,a8d)))+mu(min,gv(shoXRevn),mu(max,1,ci(acount,a9d)+ci(ecount,a9d)))+mu(min,gv(shoXRevn),mu(max,1,ci(acount,a10d)+ci(ecount,a10d)))+mu(min,gv(shoXRevn),mu(max,1,ci(acount,a11d)+ci(ecount,a11d)))$##12, $mu(min,gv(shoXRevn),mu(max,1,ci(acount,a0d)+ci(ecount,a0d)))+mu(min,gv(shoXRevn),mu(max,1,ci(acount,a1d)+ci(ecount,a1d)))+mu(min,gv(shoXRevn),mu(max,1,ci(acount,a2d)+ci(ecount,a2d)))+mu(min,gv(shoXRevn),mu(max,1,ci(acount,a3d)+ci(ecount,a3d)))+mu(min,gv(shoXRevn),mu(max,1,ci(acount,a4d)+ci(ecount,a4d)))+mu(min,gv(shoXRevn),mu(max,1,ci(acount,a5d)+ci(ecount,a5d)))+mu(min,gv(shoXRevn),mu(max,1,ci(acount,a6d)+ci(ecount,a6d)))+mu(min,gv(shoXRevn),mu(max,1,ci(acount,a7d)+ci(ecount,a7d)))+mu(min,gv(shoXRevn),mu(max,1,ci(acount,a8d)+ci(ecount,a8d)))+mu(min,gv(shoXRevn),mu(max,1,ci(acount,a9d)+ci(ecount,a9d)))+mu(min,gv(shoXRevn),mu(max,1,ci(acount,a10d)+ci(ecount,a10d)))+mu(min,gv(shoXRevn),mu(max,1,ci(acount,a11d)+ci(ecount,a11d)))+mu(min,gv(shoXRevn),mu(max,1,ci(acount,a12d)+ci(ecount,a12d)))$##13, $mu(min,gv(shoXRevn),mu(max,1,ci(acount,a0d)+ci(ecount,a0d)))+mu(min,gv(shoXRevn),mu(max,1,ci(acount,a1d)+ci(ecount,a1d)))+mu(min,gv(shoXRevn),mu(max,1,ci(acount,a2d)+ci(ecount,a2d)))+mu(min,gv(shoXRevn),mu(max,1,ci(acount,a3d)+ci(ecount,a3d)))+mu(min,gv(shoXRevn),mu(max,1,ci(acount,a4d)+ci(ecount,a4d)))+mu(min,gv(shoXRevn),mu(max,1,ci(acount,a5d)+ci(ecount,a5d)))+mu(min,gv(shoXRevn),mu(max,1,ci(acount,a6d)+ci(ecount,a6d)))+mu(min,gv(shoXRevn),mu(max,1,ci(acount,a7d)+ci(ecount,a7d)))+mu(min,gv(shoXRevn),mu(max,1,ci(acount,a8d)+ci(ecount,a8d)))+mu(min,gv(shoXRevn),mu(max,1,ci(acount,a9d)+ci(ecount,a9d)))+mu(min,gv(shoXRevn),mu(max,1,ci(acount,a10d)+ci(ecount,a10d)))+mu(min,gv(shoXRevn),mu(max,1,ci(acount,a11d)+ci(ecount,a11d)))+mu(min,gv(shoXRevn),mu(max,1,ci(acount,a12d)+ci(ecount,a12d)))+mu(min,gv(shoXRevn),mu(max,1,ci(acount,a13d)+ci(ecount,a13d)))$##14

Basically, each list item is acount+ecount of that day (or 1, whichever is highest) OR the total number of events to show per day (whichever is lowest) gv(shoXRevn) PLUS the sum of all previous days using the same formula. It is a very clunky way of doing it, but it works.

I'd still like to figure out how this can be achieved with the for loop

I figured this out. Well, I found the right source to figure this out. Thanks to @Tored and the #community-kode-database on the Kustom Discord server (https://discord.com/channels/359763545086230531/499728580108877827)

Seems like the key is to encapsulate the fl() in another, "empty" fl() like this

fl(0,0,0, fl(0, 3, "i+1", "ci(ecount, 0da+i+d)", "+"))

This does exactly what I was looking for. so, im guessing the child for loop does the "0+1+0+2" and then the parent for loop (which doesn't actually loop, because there's no parameters for it to loop) sees the output as 0+1+0+2 instead of "0+1+0+2" (the difference being the quotation marks).Thus, the final output is 3 (in this case) since it added up all of the iterations.