 there we go finally yeah sorry thank you uh... who's that secret really appreciate that sorry i forgot to there's a there's a manual button on the youtube uh... and i uh... i forgot to go click it that is my bad we should be getting joined by youtube folks now uh... just went and click the button yes sorry folks i uh... that was on me i totally forgot to go and click the uh... the go live there on youtube it doesn't it's schedules but then it uh... it waits for me to click the button and i totally failed to do that that was on me hopefully we're good now though i was just introducing uh... the topic of what we're gonna work on which is uh... inside of circuit python in vector i o i want to make it so that you can use hidden on the shapes like circle and rectangle and all those things uh... to give you an idea of what that would do uh... has gone keith happy friday uh... paul sk has a going now live yeah thank you for the heads up uh... yeah thanks again uh... seagrower for the uh... the heads up on that you totally did just got right into it forgot to uh... hit the button there uh... so let's so so right now i have this display being drawn with a couple of vector i o shapes and uh... to show you what i mean let's also draw a display i o shapes so like we could get one from the shapes library maybe that's probably the easiest thing to just get a quick shape uh... i don't remember the exact syntax though right uh... for creating one create one of these and just show like what's possible with the display i o shapes uh... which are bitmap based versus the vector i o ones which are uh... not exactly bitmap in the same way they use a little bit less ram typically they can be updated faster typically things like that they're kind of just more efficient because lots of the geometries handled in c code in the core rather than python code uh... in these codes in these uh... rather in these libraries line we don't really need lines polygon let's just make a uh... let's make a circle so right now the two shapes i have i have one circle i have one rectangle they're both vector i o uh... has gone back to make someone is over friday night coding is here nice ice hopefully you enjoyed the races and hopefully you can now get to enjoy in some code has gone beyond a graph uh... happy friday let's go and get this one imported for this important for me not quite so well how you okay uh... from we can actually probably just steal that from here right but circle import circle don't have splash we have group this circle is a different color maybe so we should be able to see it yeah okay this circle is down here so this one is made with display shapes that is a python library that's built on top of display i o the blue one up here and this blue rectangle here these are made with vector i o these are core built-in modules uh... all of the geometry for building these two shapes happens in the core in c code whereas this green one here with display shapes all of geometry for it occurs in python code inside of the display shapes library so that's kind of the core difference between these two ways of drawing shapes and to show you specifically what i want to implement the display i o one has this idea called hidden we can just say hidden true the circle will not be drawn anymore this one is now gone though and you can change it live as well we could make a loop we could hide and unhide over and over you know something like this circle dot hidden equals not circle dot hidden we probably should not make circle and circle right maybe we should say uh... that circle doesn't matter too much i suppose uh... so change it and then sleep time dot sleep and import time invalid syntax port this toy who that's a nice looking clock i like the way your text is like kind of outlined interesting it's not coming back actually interesting did we not circle hidden time dot sleep we actually going back and forth let's start there all wait time dot sleep this is not milliseconds this is not milliseconds that's what we're after right there okay so now this one is hiding and showing so you can update this over time in order to hide and shows shapes like to be able to do a slice of would like to be able to do a slice in group display group that would be pretty cool slice would handle multiple yeah that would be tricky though because it could be more than one thing be pretty interesting now how to get i wouldn't know how to hook that up to have it because it would all it would basically would need to just like iterate over them and then access the hidden property on each one somehow would love a circuit python had a good itc slave library gotta go see a plus plus arduino for that uh... yeah i think that think that there has been some work i don't know the exact state of it uh... i want to say at at least one of the ports i thought there was some work on a uh... peripheral is probably the term that it is called i think in the core uh... unless it changed again potentially i want to say was peripheral though peripheral and device may be a peripheral in main um... but yeah it's not it's definitely not widespread like everything supports it on every device and it's fully featured in all that kind of stuff so uh... could be that it doesn't work for a specific thing or could be it doesn't work on a specific device or something like that uh... the thing is so like if you have the c code for it theoretically you could help work on it inside the core uh... but yeah that would be a good option to have not found anything regarding itc and async uh... yeah i have not either seen anything specific around async stuff with itc to use it or yeah would need it definitely would need to iterate over them are not too familiar with all the built-in like dunder stuff so it's a timing issue over a sink it could be a timing yeah i mean it could be pretty tricky with itc i don't know how long does the like actual writing take it on a how long it actually spends doing work maybe it could be done in short bursts with async i o so we can hide and show the circle just by setting hidden true and false right this is the and this is the display shape circle so this is the the display i o the bit map uh... circle that's implemented in python code whereas this one that's implemented in vector i o we cannot write so we go vex circle let's try to do the same thing hidden equals true it will like either crash or do nothing it will crash says attribute error uh... vector i o circle object does not have the attribute hidden so that attribute doesn't exist we cannot set it to true therefore like you know it doesn't exist doesn't do anything we cannot use that as a way to hide the vector i o shapes now if we put it in its own group uh... so if we said circle group equals group we said circle group dot append vector circle and then we said this is a display i o group and then we put our group inside our circle group inside of our main group which i'm gonna change the name of to be main group main group we put our circle group inside our main group now we can hide the circle group so in here we could also go circle group dot hidden equals not circle group dot hidden so this will work and this will have the same visual effect making the circle hide but we have to have this extra group is not the end of the world but it's not ideal what we want is to be able to go vex circle directly and just say hidden set it to true the same way we can for the display i o one that's where we're at that's the problem we're trying to solve today inside the core would support moving uh... microlab in array attributes uh... into colors oh into dot color attributes also we're moving u-lab attribute, yeah color well you can into color attributes dot color like on bitmaps or well no there's no dot color on a bitmap on a uh... what has a dot color like label and stuff like that or the shapes i guess probably display shapes maybe have dot color do they i'm actually probably more familiar with the vector i o shapes then i am with the display shapes uh... and those ones they don't have a dot color because they use a well i mean the display i o one's use a palette two but the display i o one's encapsulate the palette whereas the vector i o one's make you create the palette manage it outside got in late what display made module is that uh... if you mean the device this piece of hardware right here this is a e-s-p feather uh... thirty two s two t f t if you mean the code uh... we're looking at some code that is vector i o which is a built-in uh... module for making basic shapes in circuit python and then the other code that we were looking at was the a different display shapes library uh... which is the python library that implement shapes rather than the built-in module which is written in c inside the core so that's couple of different things if you met something else uh... let me know and i can very clarify anything else but uh... has gone your doc happy friday let's see uh... x y positions much faster where x y positions be able to update your x y positions from a u-lab array relive so i think we're gonna just so we can probably start with just trying to steal this from tile grid because how great has this already uh... let's find where's the one where it lists so there's this stuff hidden in here so this has a get hidden a set hidden the boolean hidden where's the one that this thing okay this is what i'm thinking hidden in here this has hidden oh it has hidden by aren't as well interest i don't know if we need hidden by parent but maybe we should keep it and just do it the same way because like we are because because like we don't have that right now we don't have hidden by parent on our vector io shape but like we saw a second ago that our parent the group that we are inside of can hide us so like it's working without this boolean inside the vector io shapes really what we want is the one that's gonna let it work on its own rather than from its parent and my guess is this is probably vector shape maybe not would we need to put it on each of the three ones okay here's this x y pixel shader i shape pretty area absolute transform index draw protocol instance uh... so so one thing that i will definitely get to write up at the top here is i'm not really a c programmer all the see that i've done is inside the core i've gotten a bit better at it over time but it's still not a thing that i'm like can just sit down and do so some of this is me fumbling my way through i think that all of our shapes circle polygon rectangle i think these three shapes these are essentially kind of extending or or using this vector shape one so i think that we could add the boolean of hidden to this and then we will be able to use it on each of the others is like this is also how we set the x and y pixel shader is the colon is that default actually know what that does well hidden we don't really want to default to true though right we would want to default to false what that's actually doing so we will definitely also need inside shared binding will need those declarations for like set hidden get hidden location that x i wonder why these are not yellow break something you want to add these two functions set hidden get hidden the only difference here is this will not be that it will be a boolean and it will be hidden this one just gets past itself okay that should be fine anything else in this file maybe this stuff let's see it's a t yeah we're probably gonna need this composable property definition for shapes that use vector shape feels like we would need that probably okay so this code is inside shared bindings this is like c code that interprets or or like the c code that handles the functions and the arguments on the python side all of this stuff defines the get and set code for the x property so we're gonna make another new one of these maybe just down here no that means will change this stuff hidden this is doing something to get the shape object we don't need this new small int thing probably boolean we need like imp boolean let's look in tile grid let's look in shared bindings tile grid c find the hidden stuff here does need yeah basically probably very similar to this is there no intention in this file that intentional happen to the intention it's gonna like undo all the stuff I've done now too how did that get all messed up okay that is the code we're actually adding and yeah I don't know about the or matter just doesn't work try to remember not to do that I kind of do it flexibly we had our boolean we're not going to be doing layout tile grid though instead of the vector IO vector shape get hidden object bool this will be hidden this will also be hidden set hidden the contile grid set hidden imp object t and object this is still true 100% sure though let's see inside of here we have self and we're going to be calling imp object so we're going to be calling set hidden and then we can pass imp object is true it's a hidden x was hidden based on the name of this I'm not sure well right we're not yeah appreciate object is true hidden there we go then return none and then we don't need this because we're not doing anything with the x hidden hidden hidden there's definitely more stuff we would need to do in order to make this actually work um but I can't think of anything else specific that we would definitely need to do make a build well let's try it and see if I'm wrong and then fix whatever needs fixed if so runs itself let's think about this a bit more shared bindings h binding c oh you know what I did probably forget is the thing I always forget where it has that list of property it's also weird though because it's like the vector shape one which it is not on the display outside like tile grid doesn't have a similar concept to vector shape just does all of its own stuff whereas vector shape is like the parent class of circle rectangle polygon for vector I O and thinks it made a build so we'll see if we can install it and we'll see if we can set hidden to true or false without it crashing now so because if everything worked then like it will have the property it will allow us to set it to true or false uh... but I don't think it will do anything else right I don't think it will actually hide when we set it to true make something crashed though done running circle group is not defined now we're back to here got a build and it didn't completely wreck everything that's a good sign uh... so on our circle can we now go back circle dot hidden equals true and then like will this still crash or will this work now will still crash circle object has no attribute hidden guys so that's gonna be trickier than do we need to add it specifically to circle shape and rectangle that doesn't feel it doesn't feel like the right way to do it we just miss so I do feel like I missed the part where it lists a bunch of things locals why is this empty cuz like tile grid this has all these things in it maybe we're not supposed to use vector shape for this maybe this would have to be on circle polygon and rectangle but I mean they must be matched up somehow because like for instance circle if we go and look at it circle is not gonna have set x and set y for instance let's see where the x and y go vector shape make new draw protocol instance x okay so it needs to be on the circle so maybe we don't need to we don't need to define the functions for each of them but we need to add it to each of their dict tables here so that part will be repeated no idea if we need to do anything more than that or if that will just build you know I should be using j4 probably right or or more I have a lot of cores now we stop it and then make a new one so faster with more or vector shape set hidden define vector shape see undefined reference shape 200 oh it got the tick mark I see where would that come from let's look at the when we modeled it after which was x and let's see why it doesn't matter we can do why I mean how set y where does this come from we only have it once in this file oh we never put it in shared module here actually do we need it here this one doesn't have the like x y stuff most close to what we're doing but I think in here it probably would need yeah oh check bounds in set bounds in set so that's actually a bit different shape construct shape contains shape get okay here's shape get x shape set x I did it after location if that will just exist or not we may need to add that somewhere else it would be mp oh just bool full change uh set dirty is our version of full change I think basically just want to go self hidden equals hidden any of those stuff anymore and set dirty will make it so that we hopefully refresh the state after doing this so that it will get drawn again or you set it to true then it will get undrawn as the case may be its portion of the screen will get updated with the correct pixels whatever they may be okay um let's see is that all we need for the next build and so again we still have not like made it actually hide the shape when we set it to true or false but we could maybe actually set it wow that was way faster six seconds ease okay yeah so it's it like the functionality still will not be there but we got a build as we saw and we can install it we I think it will not crash when we set it to true or false now so like we will have created a property that we can change then we can start using that property to do stuff once it exists and works so these this is all kind of like the plumbing that you need when you want to put new properties onto built-in objects you need to kind of set up the getter and the setter and all of this boilerplate stuff so that on the python side when you actually set or get that property it knows what to do nice so it did not crash and we do have hidden equals true here of course like I said it's not working right our hit our circle is not actually hiding but we set it to true so and it didn't crash and we could change it back and forth here again it's not going to make a difference but this proves to us that our setter and our getter both work I will go back and print just to make sure it's actually going true false true false there we go okay so the last bit would be for the circle at least um actually hiding it or not when it is going to try to get drawn and the place where we do that the place where we do that so that is going to be probably inside shared module let's look for some stuff in here that's like if hidden so we have hidden by parent maybe we'll use that I don't know um I don't I don't think we needed maybe we want to have it to be the same but fill area hidden equals yeah see I don't know why they separate it's almost like they wanted to know specifically the case when it was hidden by its parent but couldn't its parent well two things couldn't its parent just set the hidden property and then like why do we need to know that it was set by the parent not anything else for one thing for another thing though the way that hidden works with group is this doesn't need a boolean group has an if statement inside of its refresh logic that says loop through all the objects in the group if the object is not hidden then get the pixels of it and put them in the thing so they get drawn it doesn't really need to have a boolean that says like I was hidden by my parent because it just checks hidden return so basically what we do is inside fill area if hidden is true we just return false and then it will not get drawn so fill area is right here and so this is going to go on to do all the stuff to actually get all the pixels figure out which ones get used and what color they are and all that stuff if we if we make another if statement like this that returns false here based on the state of hidden then none of the rest of the code after it will get executed therefore it just won't get drawn essentially so let's I think it probably makes a lot of sense to just do this right after this one here maybe this has got a couple oh overlap so this is actually doing the hidden check before the overlap check maybe we should do that what is in here time stuff okay so let's do it before the overlap check and I guess we could have mostly the same thing however I mean we didn't make this one so we just don't need it and then I suppose do we actually need to make this into a Boolean can we not just grab this and do here give it a try I cannot believe how fast that is building is there any sense in going higher than eight do I really need it to build faster than six seconds not really oh hey there we go here we go so our circle is now it's it's on the opposite beat or whatever but our circle our blue circle our vector IO circle is now being hidden also we got it working for circle we just need to make it work for the other two shapes which are rectangle and polygon and I think that the only thing we really need to add for those two is that table that that properties table I think that's it right everything else is inside vector shape not circle one thing I should do is I'm just randomly working on main at this point I don't even think I have a remote so let's get a branch setup for this because ultimately we're going to want to pr this get check out dash b no get remote add foamy guy paste but change this I don't know if this is going to be logged in or whatever I did not run the make fetch submodule today maybe I should have done that I'm going to add a branch for the code I'm working on is the thing I forget to do so often yeah some days are better than others some days I am much further into the process before remembering that uh okay get so we should be fetched on foamy guys so now get let's check this get check out dash b so new branch vector i o vector i o hidden from a to fruit main no track okay there we go now we're on a branch we can try to commit later may have to go get a new token or something see how github wants to be get into it um so let's go to shared back to shared bindings which was where we changed the table or circle ticked table all we do in each of these I wonder how the docs work that printed out a lot of stuff but it hasn't failed so I guess we're okay we're built here 14 seconds okay the loader mode copy the file I had that's we got to make this not jingle think right I don't think we want that to just ding every time expedition for another day I guess for folks that don't know I got a new computer actually last week on Friday I did that last week stream was still from the old computer this week's deep dive here the stream here is the first deep dive from the new computer so I'm still kind of finding little bits and pieces of configuration that I want to swap out and the thumb drive making a little jingle thing whenever it connects that's one of them interestingly it didn't do it for circuit pi we did do it for feather boot a second ago weird I wonder why it didn't do it oh anyway it doesn't matter so we kids should be able to hide our rectangle now as well you know it is odd oh right this is why because we set this one to true here that's why they're offset that makes sense okay so let's go rectangle hidden equals not rectangle hidden now our rectangle should blink as well it is on the same cycle as our bitmap and we can put the polygon back group is not defined that's true because I called it main group okay so this is our polygon really the last thing we need to do is test it polygon hidden and let's put that on the cycle with the uh put the other one there we go let's make the docs I have no idea if it's going to show up in the list of properties for the shapes module named I sort I thought we made this before I made this last week when I did all the setup for the tools and stuff no module named I sort Chevron Chevron and Chevroff could not import Sphinx we must not have done this last the last Saturday I think it was I streamed the setup process of this computer getting my ide set up getting my circuit python development environment all that stuff I thought we built the html inside the core but I guess not we definitely did for a library I do remember that um I would have thought we had everything we needed I thought we had done it but I guess not Sphinx I'm sure normal site packages not readable didn't I just install something with it oh conversions none no matching spell around this doesn't exist um we need to install something Sphinx contribute block dialogue but what's the specific thing RSVG converter boy this is very familiar feel like I've solved this before it doesn't actually copy all right okay it copies but two like a different clipboard or something here we go okay we just made it farther maybe nope oh yeah Sphinx search cannot import mentioned Sphinx search sir uh oh you know what there is though there's like requirements dev requirements docs or something let's do that probably need all that stuff okay get it farther the one thing is I made this um scope it does not include docs stuff oh nope didn't build RSVG command let's add this folder to our scope that way we can see it without having to go everything nope not sure where would that be coming from would that just be shared bindings ah yes this stuff okay oh look at that it even says could each I mean we're in the things for each one but it say it should probably say right let's say circle looks like it needs get item set item delete item and slice I think that slice handles the iteration we're doing the uh slices so get item and set item should be there on group already I think delete item that one I'm less sure about slice I would assume we don't have yet on group get item and set item maybe delete item you know where they would be um where they would actually be coded from though like the ones that handle the built-in square brackets insert index the del item not remove urinary operator get item here we go set item delete item oh this handles all three of those right here ah there's your slice right there okay so this would be where to add maybe centinal value equals object null top or set and get I mean the the if statements here must be deciding between get item set item and delete item but I don't get the condition how that like actually works out to be functionally using between those three that must be what it's doing though right the like set item delete item get item but I have no idea why it checks this I think that slice handles iteration yeah it would make sense for sure okay where were we um I think are we ready for we're ready to make another docs build at least is it worth doing j on the make html does that matter I actually do have inkscape installed but it's probably not if if inkscape came with this I don't think I got it on the path or whatever is this just a thing we can install why do these copy with extra stuff this is a thing I've noticed a bunch does exist command line utility to convert svgs let's see if I get that same error nope didn't get it this time nice okay oops yeah I never made an f6 refresh there we go circle has hidden boolean hide the circle or not polygon hidden hide the polygon or not rectangle hidden hide the rectangle or not I do really wonder about the hidden by parent thing why does that exist oh grid has it if we actually want to have it or not I think I mean two questions I guess really do we want to do we should we make it for our vector IO shapes since it exists for tile grid which is kind of the most analogous thing that we're building from sort of should we do it just because it's in tile grid and then secondarily like does it need to be in tile grid could we get rid of it could we get rid of it inside tile grid and save some space I don't know how much space maybe not that much I suppose but so fill area here if self hidden is false then we go inside and we do this which looks like it's looping over the members probably to me layer each each item it calls a layer layer equals native base check if it's null it's not null then call fill area on it return true okay so this is checking types that's right I do remember this so this is saying is the current layer a tile grid if so do this stuff this is saying is the if the current layer is a group and do this stuff which is ultimately you know very similar things we're just calling this fill area somewhere oh vector IO is here okay vector IO this one is if the layer is a vector IO object then we're doing this so we're not even checking the hidden by parent here it just gets handled completely internally inside of tile grid you hide the parent are all the children hidden it depends what you mean specifically if you hide the parent the children do not get drawn but I believe if you were to like get the hidden property of a child I don't think that it would like set it to true for you so if you tried to access hidden and say like is this thing hidden I think it would say false if the parent was the thing that was actually hidden I think that would be the same for vector IO or tile grid for instance too though so let's actually try that because I'm not a hundred percent sure and that's a good question maybe that is the difference maybe with maybe if it's tracking the hidden by parent perhaps it is able to return true in that situation I got all the requests yes I am swinging back around to the PR I have not made it back around to there yet but that is on my list probably tomorrow I'll be taking a closer look into that again I never did leave a comment I apologize for that but I did see the update on there that you had committed some more stuff so thank you tomorrow I should check into that and then if it was do you want to prohibit unhiding the shape prohibit unhiding I'm not sure if I understand what you mean I think yeah I mean like like if you're saying if the parent is hidden then is there a way to show the shape other than making the the parent not hidden and I think the answer to that should be no I think if the parent that's holding the shape is hidden you should have to make that parent visible otherwise you just cannot draw the shape on the display there's only you would have to do that now you could make the parent hidden and make the child hidden and then you could show the parent and the child would remain hidden until you flip the boolean there as well then it would finally get drawn I think that should and could be possible I don't necessarily know that it would be super helpful I can't think of a specific use case but I do think it's like would be possible by default to the best of my understanding let's try on our circle which is our display shapes one let's do make a tile grid let's say tg group equals a new group from display i o uh put the circle in it tg group dot append the circle to it circle right there we're gonna then put the group in the main group on this one and if we just run it like this nothing changes like we added a group we put our bitmap circle our tile grid circle our display shapes one we put it into a group but we didn't change anything about the way we're handling it um it's still getting hidden by itself everything still works the exact same but now the question is if we firstly let's comment this and then let's go tg group dot hidden equals true that should make it so that yeah our tile grid does not get drawn our green one is what this one is child hidden hidden child hidden so it does it stays false okay which i think that's okay as well because technically like it's not being drawn kind of feels like hidden but really the parent is hidden so as long as so so we checked this with we checked this with tile grid we should do the same thing with vector io good timing to look at the code with parent child inheritance reading the language ref slice start stop link function creates a slice object we'll need to get this we need to get off this annoying ipad and try some stuff i got you okay so we added a group again but did not change any of the logic and so we want to check basically the same thing here which is if we hide our group in this case actually our our child is hidden as well we'll swap that here in a second my goodness this cat is uh got the zoomies to put it currently at just like 80 miles an hour across the house uh child hidden this one will be a vector circle hidden vector circle hidden there he goes the other way so this one should print true we should maybe go back child hidden true but if we didn't actually set it like here then it would be back to false false false okay so ours is behaving the same as tile grid even though we did not make that parent really makes me think like we could possibly just get rid of that inside of tile grid like hidden by parent and just save a little bit of space but maybe there is some maybe there is some use case that i don't quite grasp all the way so in effect here is where it gets checked and it basically is just if self hidden or hidden by parent draw protocol turn true but one thing that is interesting is i thought there was a check here i'm not actually sure then how it used to work i'm not sure how group area not sure how group was able to hide the vector IO because well i guess it would be the group type it's calling group fill area but this is group fill area finish refresh refresh areas sure somewhere inside of group it like in the current mains you know code that we haven't changed somewhere inside a group it checks the child's hidden i thought in order to work for vector IO because vector IO before we made our changes today i think fill area didn't have we added this how was that working before gotta go back to main maybe chester tinspence here we go i wrote a list like object that would let me create a list for a large database it doesn't fit in RAM but it wouldn't load it into memory until i needed to give an item database was lots of files and would walk through them you'll unpack it if it was within the slicing range skip it if it wasn't interesting didn't need to do didn't need to delete anything with popper delete looked into delete item uh yeah i've not done like anything with the dunder stuff too much like dunder string is pretty much the only one that i've done hardly anything with so this just calls draw protocol draw fill area self dot hidden equals false i guess this is what makes it work for when the parent is yeah okay this is kind of coming back to me a little bit actually i think the this if statement was added in order to make vector IO work for when the parent is hidden but it also accidentally or coincidentally would have made it work for when the parent of a tile grid or the parent of another group were hidden so inside of those fill areas in tile grid and group it does not actually need to check that parent that hidden by parent because if the parent was hidden then this would have equated to the true which means we would not have come in here which means we never would have called fill area so we'll never get inside of here anymore if parent fill area is actually true as long as it actually stays in sync with the parent because of this and i think this was added i think this was added to make vector IO work with hidden on the parent on the group i should say draw set dirty oh okay we changed it inside set hidden interesting well we just call we just call set dirty we're not actually calling set hidden by parent since we didn't create it that hidden by parent on group does the same thing doesn't really matter and then yeah this was our new if statement so i think we could get rid of unless there is like a case where i don't understand fully how it works it is possible but unless that's the case i think we can get rid of like all the code dealing with hidden by parent i don't think we actually need that on tile grid or group maybe i will tinker with removing it one of these days and see if the savings is actually worth it see if it makes any sense you see if it breaks anything uh jim edgar says gotta run take care i think that was a while ago so i probably missed you but thanks for hanging out if you are still around either way thanks and i hope you do have a nice night and all that stuff let's see kind of a moot point since groups written in c enough trouble getting dunder into dunderland in python yeah hoping to the sea layer something that always confuses my streams like this are nice as they help highlight the code that manages to jump between yeah i totally agree i'm i'm kind of still very much in the beginning stages of understanding the code that goes between the two it's actually fascinating because like to me it's fascinating i don't i have never like formally learned c although c has syntax that's pretty similar to java in a lot of respects and i definitely learned a lot of java um so i can kind of get by on the syntax without ever having actually learned c the thing that makes circuit python c code easier to understand for me is knowing the python side so like i'm actually pretty familiar with the python api for group or the python api for tile grid or uh these vectors shapes i'm pretty familiar with the python side of the api and that in a strange way that like makes the c code actually easier for me to understand um which is odd because it makes it so like this kind of c code inside circuit python that is this like python implementation code is kind of the kind of c that i can read but it's also the only kind of c to have c i have any need or interest in reading so it works out all right okay we made our docs everything was good we hypothesize maybe that get uh that that hidden by parent doesn't need to exist i don't want to muddy the waters on the vector i o hidden with the whole hidden by parent thing so i think what i'll do is try to make this ready for a pr by itself to have hidden on our vector shapes uh and then at another time i will tinker with removing the concepts of hidden by parent and see what happens see if it causes some unintended side effects that i'm not thinking of uh see if it just works and everything is fine see how much actual space it saves to see if it matters like um on some of our smallest devices if they support display i o if we can crunch out a couple of bytes here and there that actually does add up that'd be pretty helpful but um if it's like not turned on on those devices or if it's not enough to be worthwhile then um you know maybe we won't do it but either way i will do that another time and so we just need to make sure this is actually kind of ready to go as a pr so for that we want to is there a pre-commit or was pre-commit for this though no pre-commit there is okay a few minutes formatting past the second time we didn't add any strings do we need um we should do we need some we should probably this is one of the things i always forget to do what happens if you set the wrong type we probably need some amount of validation going on here firstly what happens when you set a group hidden equals um i don't know a string what happens when you do that this works fine a child that group does not seem to have any kind of boundary checking interestingly that's false or oh no it's true it's true it doesn't get shown so i guess it's just doing truthiness because that would be false no okay it is yeah it's doing truthiness so empty string equates to false therefore hidden is false therefore we draw the thing non empty string is true therefore hidden is true therefore we don't draw the thing so then for numbers it would also be like non zero is true zero is false okay yeah i think that's fine for the most part i mean you could argue maybe we wouldn't want to allow that but like we'd want to raise a value error or type error i could also see some code making use of that in some way though maybe our function is true that line actually there that was not what i expected is that just a fluke it's just a fluke okay functions are true do they can they ever be false are they false if they have nothing inside them are there any other rules around it this does not this is kind of several layers down the rabbit hole it doesn't actually matter to this but now i've piqued my curiosity python function truthiness this with the infalcy function actually list functions that functions are true though all right well it's my guess would just be that functions are always true but doesn't really matter the grand scheme of things but um so we probably have the same behavior at least we saw what groups do groups don't have any kind of type error or anything like that so on our vectors we can just go rectangle just make sure the same stuff works hidden equals empty string should be false therefore we show the rectangle non-empty string should be true therefore we don't show the rectangle non-zero number would be true therefore we don't show the rectangle zero would be false therefore we do show the rectangle didn't test it before but empty string or empty object these would both be true false i mean they would be false therefore we do show it as an object with anything inside of it would be true so we don't show it yeah we pretty much have the same behavior there imagine functions are always true by default that would be my guess as well probably how they get returned automatically i wonder if there is any kind of like empty function or something though numbers for instance like all numbers except for zero are true i wonder if there's an except for with functions or if they just are all true strings are kind of the same way all strings except the empty string are true and then the empty string is false so it's got that same kind of like except this one type thing going on i wonder if functions there's like a null function or something probably not i mean i guess there's none but didn't test none i saw well none's falsely so be pretty straightforward i don't think that would actually do anything different would just be false and therefore going yeah okay so we ran kreek commit i think we passed the last time push this let's double check our changes just make sure we don't have any like any extra blank lines or anything anywhere good here i'm here i'm here a bit more going on stub checker does not approve of these shared properties i don't know what that means hidden boolean hide the shape or not so we do have two lines between here but only one lines here but we do have two up here so we probably should have two here match these and then we should keep our two at the end which we already had these only have one line between them probably do that same here probably no eight of fruit learn guide has a bit on lambda functions they call the function with no name lambda functions there's an interesting thought yeah if it's an anonymous like an anonymous function maybe that too no that's just one okay so this one empty line is not required but it is like it does help add space between properties that are sort of partners because this is like the getter and the setter together and all of them are in those pairs i think we leave that extra space there we added hidden to these composable property definition yeah i will say the way that the way that circle polygon and rectangle utilize vector shape i don't have a full i don't get all the way i i get conceptually that it does but not the nuts and bolts of how like it feels like it extends it i don't know if that's actually the relationship but that's kind of what it feels like just have the hidden here and that's it but the only other thing that i wonder is what is this colon one doing because that feels like it would be a default value right and we would want hidden to default to false not true but i mean it must be defaulting to false because we're showing all of our shapes and we have not explicitly set any of them to true to false rather the backwards nature of hidden gets me every time i almost wish it was like called showing instead of hidden so that it'd be true and be showing rather than has the opposite relationship like when it's false that means it is showing um yeah so we're not i mean we're not setting it so this must not be the default but what is it and do we want it because none of the rest of these do have the colons type def struct see this is one place where my c type def struct colon this is one place where my lack of c oh no is it number of bits in which case one would be correct to store true or false it fields in c okay i see okay yeah i guess we probably keep that i don't know why none of the rest of these have them or if it matters but it is true that we don't we only need one bit and i guess i don't know would we use more ram if we didn't do that or something i'm not sure okay that's fine then i think okay let's see um i'll say let's say self hidden implement self hidden property for vector shapes because we used to be able to do it from group still right we could do it from the parent just not the self now with this change we'd be able to do it from the self though that go to rio that go back to rio hopefully this won't work uh one second i'm gonna do this for a minute almost there oh just read or workflow did not okay one minute we got to get logged in here okay we have this now and the oh we have on the screen don't even know again um just okay now let's close a million things close this close this anything else open we need to close it'd be okay rest i think okay this thing sit pushed so let's double check and we'll probably wrap up here pretty quick as well here we are did actually push we don't need necessarily all of this stuff uh colon one in a c definition is the width of the field only one bit nice thank you and that does track for a boolean we want one bit so does make sense let's see okay that one is in got our hidden capability we'll see if it passes actions on github or not we may need to do some tweaks if the actions fail maybe there's something could be something different in my pre-committer who knows like usually when you get it to pass local it should be okay remote but sometimes not maybe the sizes maybe we maybe we introduce too much size and now it's too big for some builds we'll see um if those pass or not if so then we'll see what kind of review we get if there's anything we need to tweak in there we'll check back in on that later um i think i will wrap it up for here but before i go since we did get cut off at the beginning of the stream on youtube again that was my fault i just didn't click the go live button but because we had the intro get cut off there i did want to make sure to say um here at the end thank you of course to adafruit this is their website adafruit.com they are a hardware and software company based out of new york they design uh in you know manufacturer and sell little electronic devices you know breakouts for uh components like displays or storage or sensors or buttons or lights you know beepers levers knobs all these things um they create breakouts and sell them they also create the microcontrollers themselves the feather device that we were using to test this as an adafruit device this is a esp32 s2 feather tft device which i like because it's a nice small form factor it has the feather form factor which has built-in battery charging and a standardized set of pins that there's lots of additional add-ons that work directly with this pin format and this one also has a screen on it which i of course quite like because i do a lot of stuff with display i o so adafruit made this device so thank you to adafruit for paying the folks who work on the project full-time and folks like me who work on the project part-time thank you to everybody who purchases hardware from adafruit so that they can continue paying all of those of us that work on the project thank you to uh all of you for watching this program um definitely appreciate all of you watching and hanging out in the discord and the youtube chat with me here on friday evenings um i will be back for folks that don't know i stream on saturday mornings as well so saturday morning at 10 am central time tomorrow that is when i will be back for the next stream we might cut it a little shorter tomorrow than normal i do have some other stuff that i think i will be getting into tomorrow later in the day so we might need to cut it short a bit on tomorrow's stream but either way i will be back around 10 am central time tomorrow for the next stream that'll be on my own channel you can follow me on uh foamy guy twitch if you want notifications also post the links in the uh live broadcast chat here on discord when i get ready to do that so the youtube and the twitch links are there together um thanks for the stream hidden capability was a single roadblock to converting some widgets nice i'm glad we got that out of the way then for sure very interesting tonight thanks yep thank you axl thanks for being an amazing coder and live streaming your effort yeah for sure thank you for the kind words definitely appreciate it and thanks for your work as well uh in the in the code right and requests and all of the stuff and all of the things you've all the projects you've shared and all that stuff as well so thank you to everybody for watching i hope everyone does have a good night and a good weekend and all of that i will catch you next time which again that'll be tomorrow morning for me if you want to follow along then otherwise i will see you later next week we'll be back for another deep dive at the same time