 Alright, hello everybody need to try to keep an eye on the YouTube chat for just a minute I don't know if it's gonna actually update because I had to refresh the page In order to see the go live button looks like We are Live on YouTube and Twitch a bunch of other of these places from restream So let me just shuffle a few more of these around There's a new chat. Let's see. Oh, yeah, that seems to be showing up awesome. All right Actually need this one to run I feel like I could well, I don't want to mess with it I'm to deposit, but I don't know if that's just a preview or It's gonna do something else Let's not mess with it for now all right let's Do some hellos for the folks that are here Blitz City DIY Liz Um happy Friday indeed see Grover Let's see Tammy mix things and Gary Z. Hello to all of you and then over on YouTube. So far. We got uh, David Essa Reda gaff and Paul Shuleneck. Uh, so hello to everyone and Hello to all of those folks as well as everyone else who might be watching Um, and we have my screen up, right? Is that right? Yeah, we're on circumparathon.org so Quick introduction for folks that might be new. My name is Tim and I go by foamy guy on Github and discord and several other places Um, we are doing the deep dive stream. We're working on circuit python related stuff formally at this time it was Scott Shawcroft the lead developer of circuit python working on generally core related things. Um, and I'm kind of Filling in while scouts away. Um, but I do tend to work a little bit higher level More in python land than sea land, but we do dive in sometimes to the core as well but if you Are confused by any of that if you don't have any idea what I'm talking about a quick high level introduction We are working on circuit python, which is an implementation of python that runs on very very small computers, uh, in cheap very very small and cheap computers called microcontrollers There's a bunch of them listed out on this page here You can see there's all different various shapes and sizes Quite literally, you know circles and rectangles and tinier square looking things and all kinds of different shapes and sizes And um, we are writing python code that runs on these devices and is able to interact with other hardware So lots of these devices have what are called iopins input output pins you can connect sensors and leds and speakers and buzzers and buttons and all kinds of other Electronical widgets to these devices and then you can interact with that stuff from your python code Um, if you want to learn more you can go to circuit python.org. This is a good place to get started Also, you can join us in the discord, which is the chat that is showing down below me That's the ate a fruit discord If you want to join that you can go to adafru.it slash discord Um, if you want to get involved in the project at circuit python.org There is a contributing link. Um, and then of course, uh, it's all open source and lots of us do gather And coordinate through the discord so you can join us there as well if you want to get involved If you're interested in supporting the project, uh, but not necessarily getting involved in the development One of the ways you can do that is by purchasing hardware from ate a fruit. This is their website ate a fruit dot com Uh, ate a fruit is a hardware and software company based out of new york and they Uh are the primary financial backer of the circuit python project So they're paying the team who works on the project part full time. I should say They're also paying some folks like me who work on the project part time They're paying all of us to do all of this work on circuit python. And of course, they're Um, you know constantly releasing new circuit python devices and new hardware That you can hook up to circuit python devices as well So definitely all of us that work on the project would Appreciate it. Uh, if you do purchase hardware from there, you know, if you have something that you want to purchase Um So with the intro out of the way, let's catch up. Did I miss anybody in the chat here? Uh, Might let's see. It's pronounced similar to the car miata Oh, uh biata biata graph. Okay Biata I will try to remember that. I definitely did do that wrong before biata biata graph Uh, that's a good way to explain it though. I think your uh, your analogy will probably help me remember that Uh, Gary z good afternoon Definitely. Yes, Tammy. Happy friday Uh, all right, so that's the the high level look at what we're doing Jumping in a little bit more specifically. What am I going to work on today? I think did I set the titles? Um Let me double check that actually Set the titles today Yeah, yeah, okay writing a sprite a sprite button class. So, uh, specifically what I'm working on today is in, uh, the display io realm Uh, I have this device pulled up, uh, which is very fuzzy. Let's fix the focus real fast Um, then like this maybe much better You can pull this over here as well Um, so the microcontroller that I am working on, uh, this one is called a pi portal titano And it has a nice big, uh color touch display built onto it. Um Let me turn the light on as well because this does wash out the colors pretty bad. Hello from arkansas shuttle pod. How's it going? Um, please get down, buddy Okay, yeah One of the new fun things my cat is doing is climbing the window Uh, I will try not to get too distracted. Uh, let me get the light before I go much further Um, ladies, uh, that's really not a whole lot better. Is it maybe if we get it angled up there a bit I may switch over to the smaller pi portal. Anyway, though, this one has a nice big built-in touch overlay Um, and we are writing, um, code that allows us to make stuff on this display Uh, specifically what I want to do today is make a new type of button We have an existing type of button, but it's only Uh, it's only really able to draw colored buttons like you can, uh, buddy, please stop Yeah, this is a thing. I'll be right back Apologies, uh, I'm gonna Just hope that he is not going to do that anymore, but truth is he probably is Uh, the cat's name is uh, the cat's full name is tabitha jane. Um, we named him Actually before we realized, uh, what gender he was this was a cat that hung out around outside of our house for a little bit Uh, and we took him in and we named him before we went to the vet Uh, with him the first time so we named him tabitha jane because uh, he's a tabby cat Um, so we liked tabitha for tabby Um, and then we eventually found out that he was a boy cat But we just kept the name tabitha because it seems like a cool name And he's a cool cat and I think he likes to name tabitha. So Uh, that's his full name. Uh, oftentimes I will call him Uh, buddy or stripey dude or stripey cat or You know anything with stripey in it really. Um, Yeah, that's the cat's name Oh, that's a good point. Yeah drop the brightness that probably would definitely help. Um Help it come through better on the camera. Yeah, good idea. Thanks, sea grubber Um So yeah, this one has a built-in display That's the kind of stuff that I tend to work on quite a bit on streams is uh, stuff related to display It's not exclusively. I do branch into other stuff sometimes as well But this is kind of the area that I'm sort of naturally drawn to so this tends to be where I end up working on stuff fair amount of the time And specifically what I'm going to work on today is a new button class that will allow us to make Custom buttons that use bitmap sprites instead of just colors and shapes Um, so let's take a quick look at what exists today. We have this library called display button Which exists already? Uh, and this one is capable of making Basic buttons and shapes. Um, they're they can be rectangular. They can have uh, rounded corners I think maybe there's a couple other types, um But they are just a basic rectangle generally Um, and they're solid colors, so it can have like a fill color and it can have an outline color Um, do I still have the button simple test loaded up here? If I do, I'll run it. If not, I'm not gonna I'm not gonna bother because it does Uh, it was made for um Not the pi portal titano and I had to do some things To update it um Should have saved that it looks like I didn't Sprite button Yeah, unfortunately, it looks like I didn't save that Oh button simple test. There it is Did save it. Okay. Hold on. Why is this not in the history? simple test These are the basic buttons Um, so you can see there's a couple of different varieties There's the rounded rect and the square corners and then there's Uh, ones with a little bit of a shadow looking thing going on to the bottom right there And then you can see this top right one here is green with a Looks like a pink outline in person. It looks like it's coming through more yellow on the camera, but it is a um I think it's a pink one We could we could tweak the brightness that probably would help like see grover mentioned Also, though, we're not spending too much time on this one specifically. See where's the display Word dot display only. Okay, so we could go like word dot display Brightness equals 0.5 See what that does for us. Oh, but it's not in code pi. So we would have to rerun it. Um a little bit better Looks like we still could do slightly better on focus Okay, we could do a lot better on focus actually not slightly Hello from houston, texas chase gordon. How's it going? 1.1 or 0.2 on the titano Um, so these are the regular buttons. These are pretty cool You know, these give you the ability and these are touch interactive buttons So like I can touch the screen and these buttons can react to it They can change colors to indicate that they're being pressed They can also control other stuff So like you can have it set up where you press a button and then something happens, you know Just like a regular push button But I thought it would be cool if we had a way to do fully custom ones Again, these ones are kind of limited to just solid colors. You can pick whatever colors you want for the fill and the outline Maybe possibly you can pick a color for the shadow that part. I'm not actually sure about so Don't quote me. You can look into the the library if you're interested in that But that's pretty much the only Sort of different visuals that you can get are are just solid colors And so what I want is a way to do fully customize buttons where you can supply your own bitmap Which can have gradients or 3d effects, you know buttons that look like they pop out from the screen a little bit Or or you know, look like they pop in to the screen some when you press on them I want to be able to have those types of buttons that look a little bit fancier than these so I've been working on a couple of different pieces of infrastructure to allow this to work And today is the day I think that I'm going to go ahead and write the class for it Before I do just jump straight into the class for that though I want to make a pr on the image load library image load because Part of the code that I'm going to use for this button sprite class is what I've called a tile grid inflator And I haven't made a pr with that anywhere yet So right now like I'm the only one who really has the library or possibly I pushed it into github I don't I don't remember for sure if I even did push it into github So it's not really shared anywhere And of course if we want to make a class that lots of people are going to be able to use Then you know, we're going to have to have that tile grid inflator published somewhere and I think that this Circuit python image load library is a good place to do that So I am going to go open up that and then we'll push We'll make a new branch and we'll push in our Tile grid inflator and then make a pr from it and then from there I'll go and start working on the sprite button class and I'll use that inflator from the modified image load All right, so let me actually do a different one of these so that open will start in a better spot Open that's much better Uh, so we're gonna go image load Uh, yeah, we don't need this one patch testing. We can get rid of that So first of all, what did I change here? Hmm, I don't know why I would have done that We're gonna roll that back And then update main and then make a new branch Dash be a new branch is going to be called tile grid Inflator I need to look up how to spell inflator I keep I'm like 50 50. Sometimes I spell it er sometimes I spell it or later inflator Okay, this is like a proper noun though, right? They made a thing called this Maybe we should go dictionary dictionary later late Plated late team Maybe inflator is not a real word Let's back to inflator late Flator word list inflator Okay, looks like or so let's go or tile grid inflator. I'll make sure I called it that in the actual code as well Uh, new branch tile grid inflator Um From ater fruit main No track I'm gonna check if I have a remote I do for me guy. Okay So we'll use that here when we push and I think load I think what we do is just make a new File for it. Uh, so the thing is it's not necessarily Tied to any of the rest of the files in this library. You can use some of the other stuff from this library with the inflator But you can also use the inflator with on disk bitmaps. We found while I was working on it. So Technically, you don't need to actually use the image load library to use it Although you will some of the time probably be using the image load library because that's one of the two ways to load bitmaps um And so I think a new file in here makes the most sense and so I'm gonna grab Power grid inflator from my device I probably put inside lib Yep, and I did name it inflator with an o there. Let's see if I have any inflator. No, okay good um One thing is we'll we may need to um, I don't know if it'll pass pre-commit as is And realistically, I should probably also add type information to it Although I don't know that any of the rest of this library is done yet Yeah, it doesn't look like any of the rest of this library has type information yet Uh, but it does need a a header Comment thing the stuff All this stuff Import image load Right, so I I did make it so that it can support either Do we actually need this do we use image load inside of here? Yeah Okay, right if we gave it a path instead of a an object and we do image load it, okay Makes sense um So let's fix the name Okay, so we're gonna go dot tile grid inflator. Whoop dot tile grid Inflator and this basically um for folks that that haven't watched the stream before I've been working on some of this stuff On the the last couple of streams So if you have watched before you probably have seen me do some of this stuff If you haven't yet, then you might be lost or you might be asking like what is this tile grid inflator thing? Um, and I'll show you real fast. It's basically a helper library display i o It's basically a helper library that does The stuff that is talked about on this page So we're starting with a sprite sheet That is basically three by three like this one here. Uh, this one We're kind of ignoring the characters in the top row. We're just looking at these walls here Um, this represents a three by three sprite sheet So there's you know, three tiles wide three tiles Down, um, you know three by three like tic-tac-toe or whatever you see these are how it's Broken out and what the inflator does is it takes the sprite sheet like this Uh, and it you know, it inflates it it blows it up into a bigger grid like this where the center Uh rows and columns get repeated as many times as they need to be in order to make a target size So that's what the inflator code does Is is take a three by three sprite sheet and then blow it up into a bigger grid for us So that's what this particular thing does. Um So let's fill that in here as a comment. Uh, let's see here. We can fix some of this too. Um Let's see Use use a three by three sprite sheet To Inflate a larger grid of tiles Duplicating the center rows and columns As many times Times as needed to reach a target Size Okay repos the same version thing is the same. I don't think we need this but i'm not sure Uh, we can change this I wrote it this year Whoa, I wrote it this year. Uh, we don't really need print bitmap This was something I used for testing I don't know that we ended up using this either That doesn't look like it So I'll save off a separate copy of this with um With these things included in fact, I should have another copy here And before I Change too much what I'll do is I'll just save a separate copy if we ever if I Do ever figure out a reason why we need that stuff Then I'll be able to still grab it. Um, I think though, it's just different things that I Started trying to do and like this one was for troubleshooting. I was printing the bitmaps to see what they were coming out as and I don't think we actually need them Okay. Yeah, that's much better inflate tile grid. So that's our only function Let's uh run pre-commit So the thing is there I Okay, I changed the file, but I didn't save it And then I ran pre-commit which also changed the file. And so I had two unsaved sets of changes The ide doesn't know what to do tile grid of target size in tiles in tiles from a three by three spreadsheet by duplicating center rows columns I remember all the right syntax for this stuff type param type name So bmp path is going to be a string string bmp path Uh, let's see file path to the three by three spreadsheet bitmap file cram bloop bloop bloop bloop target size is a tuple tuple desired size in tiles target width target height tile size tile size can be a tuple Or you can leave it none in the three by three spreadsheet if None is used it will equally Divide the width and height of the bitmap by three transparent index, okay, so this one is This one's actually weird. It's either a list or a number I think do you do that union list Could be a tuple actually instead of a list tuple number int int target No, what is it transparent transparent index? This is um a single index within the palette To make Make transparent or a tuple of multiple indexes to make transparent Next bmp object So if you want to use on this bitmap Then you'll use bmp object and bmp palette instead of bmp path if you want to use image load Then you supply bmp path just a string pointing to your file On this bitmap you create the file yourself Using the on this bitmap initializer and then you can pass it for these two things instead um So this one is a on disk bitmap bitmap bmp object It probably would work with a an actual bitmap and seven on this bitmap as well But if you if you want to use a bitmap and not an on disk, then you should just use path I think so We'll we'll type it as on disk because that's kind of the intention on this bitmap bitmap object. So this is uh Already loaded three by three sprite sheet in a on In an on disk bitmap This one is a palette palette Bmp palette Uh already loaded sprite sheet sprite sheet palette, uh, so that should do our first Piling problem too many arguments I think we're gonna pilot ignore that all of the arguments have a Pretty specific purpose Yeah, I guess if I mean one thing we could do is instead of these two I guess we could make a We could get rid of these two and we could have a different argument That's like true or false. I suppose for use on disk And if you said it's true, then it will be on disk if you said it's false. It will be image load um I don't know. I like the versatility that uh this offers being able to pass in your bitmap object and your palette separately Rather than uh only doing your path because if you want to manipulate them further like before you put them into here Then you'll be able to do that this way. So I kind of like keeping them. So I think I'm going to keep them and just do uh a pilot disable on here Which I don't know the syntax for But we saw one earlier. I think I can put it here Maybe after this too many Arguments. I'm off by one also local variables too, huh? I'll take a look. I think we need all the variables though Image palette. We definitely need both of those Pile width tile height I guess we could put those in a tuple and get By with just one I kind of think the code is More clear with them separated though, right because then you can read it and see How with tile height rather than just knowing that zero index is width and one index is height, right? Like that's extra stuff you have to process Which is how we accept the argument anyway. So I suppose maybe We'd keep it the same target width and height. I don't know. I like the code better with it this way truthfully Howl grid we definitely need a tile grid because that's what we're making We really have 15 variables here. Is it counting arguments? It must be counting arguments One two three four Five six seven I only see seven Eight nine ten eleven twelve thirteen. I don't know how it's counting That's weird. Even including arguments. I only get 13 you know It's a variable I don't know. I don't think so Comment this David go down one. It's definitely not a variable Weird, I don't know where the other three are I think we just got to ignore that too though too many What was it variables? Vocals use is instance Okay Unidiotmatic How's it unidiotmatic? If is instance Transparent index No type is first tuple transparent index object Class or tuple I think that's how it is is instance. Whoa Uh, yep this in Okay delete this stuff Uh, what's next uh too many branches We're probably going to be ignoring that one too Am I off by one again? I am look at that I was off by one arguments off by one variables off by one branches Yeah, I mean maybe we can get rid of One or both of these else's because we could Do something first and then if something is true overwrite what we did before Honestly, I think the code is more clear this way because our intention is not to do one thing and then change it afterwards Our intention is to do either this or this and if else Makes that clear So while I could possibly get rid of one or both of those I don't I think in my mind the code is not as clear if I do that and I am gonna Pretty much choose clear code over following pilot any day of the week personally Too many Branches Randall bone boxcar Save that Love the factory hello from colorado. How's it going? Love the factory Uh third party import display. Oh, so that one's easy Just take that Put it up there Just want two spaces Yeah Got it this time I think right There we go um Okay That seems like a good first draft at least for for pushing this branch and making a pr And then like I can get feedback from people on the pr, of course Uh, let's go cd docs cp docs make sure the docs build because that will also fail the Actions check, uh, if the docs aren't gonna build. Also, I guess we probably want to add to this right I always forget to do this actually, uh, which it looks like there's a bunch of these not added tile grid Flay tour Risky business angering the pilot. Yeah, uh, how's it going summer soft? It's nice to see you Uh P. I okay Yeah pilot, uh, pilots Probably gonna try to kill me in my sleep one of these days. I'm sure they can figure out a way Let's run that. I think we oh, we do have an error now. Okay unexpected indent. Hmm. These ones are Sometimes trickier to track down. It says line seven field list ends out of blank line Probably this maybe it's the problem Nuke a field list Ends without a blank line I see you too. Notice you've been doing some deep dots. Yeah. Yep scots, uh scots away or Apparently leave and uh, I filled in a bit Um Field list ends without a blank line unexpected indent. Maybe it's this No Maybe it's Maybe it does not want the blank line actually. Maybe it needs to be back here Nope Same problem Uh, okay So next thing I'm gonna try to do is like try to find line seven. The problem is this is not line seven in the file, right? Line seven in the file is Back up here. Um But that's not where this is counting from. I think it's from here, but I'm not sure one One two three four five six seven, okay The problem is this one that's two lines. Actually, that's the problem. I have seen this before. Maybe the second line needs to be Spaced in And probably this one too Yeah, good hope co-pilot might enter the chat. Yeah Uh, maybe is it two spaces? The last one looked like two spaces. Maybe Oh, hey, we got oh, I did control s. What does control s do in a terminal? I find that sometimes I focus my My terminal, but then I press control s because I'm meaning to save my file And then I can't type anymore. I I assume it's just waiting for me to do something because that's probably some other kind of special input um There we go. Okay. Yeah two spaces Does this one matter? I do like this on the next line better, but it's not really that big of a deal either way No, okay, that one builds too. So let's take a look at these also before we push Oops not terminal files index Did I break that? I don't think I broke that I know they're in the middle of changing the badge Maybe it's like part way Or maybe it doesn't work locally What does this look like on the live docs? It looks fine there. Oh, we don't want to go to discord though. We want to go to docs Oh You know, I have a hunch actually I have a hunch. This is a bit of a rabbit hole one thing you'll find If you watch the deep dives and my other streams. Oh control s suspends the terminal output control q resumes it Thank you. Yeah, unix like that's what that's probably what is going on for me. I am on linux Uh, it's pop os, but I think it's based on ubuntu, uh, which I think itself is based on debian So we're probably in something like that control q I think I should be able to remember that control q the next time that happens So I had a hunch the other day that uh, when you load this You know how it doesn't take you directly to the badge. It takes you to the github page about the badge But raw like this this takes you directly to the badge and it's a different url Um And my hunch is that if we put this here That it would let us view it on Whoa, I guess we closed our terminal with the uh The docks build going. Oh, it still doesn't Hmm Is it like failing to load? Uh, I don't think I ever finished my thought But what I was gonna say is if you have watched the deep diver my streams before one thing you'll know is that I'm willing to chase a A rabbit hole a little bit So yeah, we are getting back this Whole page Not just the svg Weirdly, we don't see the preview in this thing, but It might just be something to do with the debugger or whatever we're in here Hmm All right. Well, I don't know. Oh Oh, oh, oh, I'm looking at the live page Refresh ah, there we go Okay Yeah Yep, thank you. Thank you summer soft This is the beauty of um Streaming it's like a extra Hive mind pair programmer It's one of the coolest things Honestly Uh gotta go cheers to him. David. Yeah, no worries. Uh, see you Dave. Thanks for tuning in while you could Somewhere somewhat outdated antsy standard To be fair copala is an interesting piece of software Natural evolution of stack overflow I maybe should give copala to try. Is it like a I heard of a thing called tab nine Tab nine. Is that what it's called? I heard of a thing called tab nine, which is like code completion Is copilot like this where you can press tab and it Tries to guess because I will admit like I am a big tab completion uh intelligence User like I I if I can type two or three letters and like it will know the rest of it I will let it do the rest of it every time. Um I will pretty much always let it guess and if it's going to be right most of the time then i'm happy With that I should maybe look into copilot Um, so I won't go too much further down this rabbit hole But what I will do is uh tell catney because I know this is something that catney has been working on in the last couple of days Oh, how do I can I reopen? Be open Be open Is that how copilot works though? It's like a plug-in with tabs or is it more involved than that? Oh, that's fine. Anyway, so I guess github knows that's the difference here is github is smart enough to Grab the actual root svg file When it requests that page But it's like it's doing that on its own behalf and read the docs doesn't know to do that Uh, I just noticed That While the new discord badge does appear Correctly on github Unfortunately It doesn't Load correct on rtd. I think the we don't really need these I guess I think uh one way to fix it is use the This url for the svg instead I think that probably deserves a frowny emoji, right because we because I think they just ran today Uh the script to change all of those so unfortunately, I think we'll have to script it all again Which is not the end of the world but Bit of a bummer It's light frowny Similar yes from what I've seen it's still in close beta. Oh, okay. Can't even sign up for it necessarily. Well, maybe I don't know Probably depends if you're like there's an application or whatever. I have enough github Activity these days they should let me sign up for it Okay, uh, we did get a successful build We don't want to push this into our thing though. This is going to be a separate fix So i'm gonna roll back this Uh, I'm gonna look at what I was actually looking at which was on our local one did the New part work Yeah, that's a bit of a bummer See what she says Um, so docs are good past pr. I mean pre-commit um Yeah, let's push this So our two changes are new file this and change an api to add this Whoa adding tile grid Later We should Probably also have an example for it. Truthfully. I think what I'll do is I'll make the pr and like just make it draft or something um Because I do want to go work on the button class But I wanted to like at least give this a home somewhere to start at least so that um When I write the button class I can reference it from where it's hopefully gonna end up Okay Let me grid from a guy tile grid inflator. That's right push it Let's see Yeah Adibot. Yeah. Yeah, they still do the patches with adibot Now got an absurd mental image of adibot pylon github pull at it Github co-pilot in siri and a par having drinks. Yeah That'd be fun We need a we need a tv show Right, netflix is hurting right maybe they can make that their new special Uh So let's go image load pr Can I do draft from here? It doesn't seem like it Or is it a is it a label or something? No Objects milestones assignees reviewers Development ah there we go. Okay, uh, let's see here Uh new helper uh function. It's not a class. It's actually a function new helper function for inflating tile grids Essentially Helper code for what is shown on this learn guide page You link the learn guide page All right, uh, and anybody watching if you want to help get involved in circuit python You are more than welcome to leave a review on this if you want to try it out Um And leave a review that'd be awesome That's generally this is kind of the first way that we start getting folks involved is by having them Try out pull requests and leave reviews You can just leave it as a comment for now. And then if you get in the uh In the habit of doing that then eventually we can add you to the circuit python librarians team where you can actually do like approve and request changes and Stuff like that. So let's go draft In walks pilot who starts picking on the others. Yeah. All right, so we made it a draft. Okay So now let's go and do our New button and I think this one probably should just go ooh inside button, but Right now display button is a single file And unfortunately if we add a new thing to it either we have to add it to The same file which is not great because then it gets imported even if you're not going to use it or We have to add it to a new file, which means we have to convert the library from a Single file to a package Means that a bunch of places where it gets used has to change basically Um or the other option is we make a new library Feels like it should go in this one to me though. Honestly We have more than one in here button Nope, just the one Yeah, I think I'm gonna go ahead and do it. So I'll go to main Okay, let's take a look at what we got here. What do we have for remotes? We do have a to fruit get fetch a to fruit Get remote rename origin foamy guy Yeah, we have main now. There we go check out main I'm responsible for approving all pro requests from the interns at my new job Got a healthy respect for that approve and merge, but yeah Yeah, it's uh, it's definitely I mean, it depends on what you're working on the good thing about it is like Depending on how many users your thing has if you approve and merge like the worst case Scenario if there's a bug like, you know, it can get fixed relatively quick and a new merge can happen afterwards Um, it's always best not to release something that's broken But at the end of the day like with circuit python at least like the whole Historical, uh release versions are all available. It's not like anybody is going to be permanently stuck Because of a bug uh in a merge. So I will say it was something when I first started joining the review team though I was like extra super paranoid about Actually merging things. Uh, that would be good simply to be sure Uh, I'll have you to do it shit around the pot patched on the script locally it about couldn't handle it Oh, no, uh, but only when she has time again might have to deal with this for a bit Yeah, it's not that bad honestly to be only on read the docs Um I will make that change in the test repo real fast. Do we have the test repo on this computer? Test repo Let's fix our remotes here too That didn't work the remote add a to fruit. There we go. Okay, let me go Let me pull a a to fruit main and Go get check out new branch Uh Discord badge RCD Get a fruit main No track Feel bad. I should have thought to try this on read the docs. Honestly. I literally did test this yesterday In fact talking about the merging thing that we were just talking about I literally did test this and I was the one that merged it yesterday Um, and I just did not think to test it on uh read the docs It makes sense why it would be different like github knows their own URLs and they could switch it around to the raw file It does make sense in hindsight why it works that way I just did not think to test it though had a merge at work today that got weird because Uh my awesome branch and my awesome branch lowercase are different branches to get but not to windows. Oh, that's fun When the intern did a pull in her local repo gig got super confused About which origin ref her branch was merging to one of the reasons my work computer is a mac Yeah Yeah, that's that sounds Like a minor nightmare to me truthfully Uh I'm like I've gotten a lot better at git. Um, since I started working on circuit python stuff, especially um, I used to get a little tiny bit before that but like not like To a very minor extent like In projects that had like anywhere from two to five ish branches And that was it like we were not making a new branch for every feature Like nothing like that we had like a dev branch and a production branch And like maybe one or two more that was kind of the most experience I had with git until getting into circuit python And I've I've gotten a lot better at it. I've gotten my my head wrapped around it a lot more, but I'm still I would say Fairly novice and the thing is I use a pie charm as a crutch kind of a lot like a pie charm has really really good uh interactive visual git Um interfaces and uh, I rely on those a lot to be able to get stuff done I do some things in the terminal like this stuff, but Um, when it comes to like pushing I'm I'm always using the the gooey inside pie charm and I'm like that's the only way I feel comfortable Um We need to do anything else. I don't think so just this change I don't know if this even has pre-commit. Oh, yeah, it does. It makes sense, right? This is test library. It should have everything Uh, okay, let's push this Push this See like this I'm always checking the the differences right here doing my commits this way choosing my uh remote and my branch here Double check in my commit to make sure it only touches one thing Well, in this case only touches one thing because that's my intention, but obviously if I'm changing two files, then we'll check for two um Okay, push that PR that real fast too So this did pass checks, which is nice I end up opening button. Yeah, here we go button. So we're let's see here at both of those We're on ate a fruit main update Got a lot better too, but I always describe get as like a swiss army chainsaw very capable very powerful But also very easy to hurt yourself. Yeah, if you're not mindful about what you're doing. That's definitely true Definitely true Yeah, I think It's more work, but I think um I like the idea of just Changing this to a package now This would be here And then I guess what we would do is go In knit Move this inside of a knit Yeah, I think so That way this one will still be called ate a fruit button When you import it, maybe we won't have to change the imports if we do it this way. I'm not actually sure though Do that we delete that I should make a branch get check out new branch. Um, let's see Sprite button main No track you tab that you can't look at that. Okay New branch sprite button. Okay um Okay Docs we'll need to build a docs Maybe it should be button and not a knit Yeah, I think I actually lean towards that mean I I would If I were making it right now today I would call it shape button because it makes buttons out of shapes But I don't think we should change it Because there's already a bunch of code that uses it and a bunch of people who know how to use it and know what name it is Um So like if I were doing it from the ground up I would probably call it shape button, especially if I'm about to add a sprite button or a bitmap button type thing um But it's not worth necessarily changing It when it's already created already been created button And then so a knit would actually just be empty. I think And then we would make new Sprite button And this is our new one I'll leave some room Okay, so one thing we should do is take this version of image load Put it on my device This way we can write code that's using it We can I think delete this or let's just rename it in case we want to go back to it This way I can kind of cheat and like Use it again later without reinstall. I guess I could always just reinstall the circuit I forget circuit makes it super easy to just install a thing again Um, so that's actually honestly probably just easier. I should delete it, but So I'm actually going to do most of the development on the device Rather than in the repo and then we'll go back to the repo afterwards um one thing I'll do is fix the simple test because I don't think that'll work anymore So, you know one thing I'm curious about another slight rabbit hole if we We did something like We did something like that would this code work All right, I was thinking if there was a way we could avoid having to change Oh wait, did I do that wrong? Maybe I did that wrong I'm just want to go change this. I think yeah, we're actually just going to do that Let's change this to code pie. Oh, it worked Okay But do we still so now the other thing I wonder is uh print Hello from nit I gotta I'll be right back. I gotta close this window. It's heating up in here I opened the window to try to pacify the cat He's sleeping now Hopefully you won't wake up if I close the window, but it's Making me hot It was like 70 or 80 degrees today. It's actually quite warm today Um, so does this print so this print does run like this for sure Yeah, but if our code was From ater fruit button dot Right button import sprite button Does it get executed in that case? class sprite button Unresolved reference. Oh So the question is Basically, is it worth Making everyone who wants to use the sprite button Have extra ram that gets taken up For the upside of everybody who's using the shape button the original one Not having to change their code at all That's basically the trade-off. We can either make it to where They're just totally separate. You have to import the one you want and therefore you don't ever import the one you're not using Which will save ram or we can do it this way Which will make it so that None of the existing code has to change But people who are going to use the sprite button are actually going to end up with the shape button getting imported also See what this says. I normally close this chat but it was uh This one other person that I work with At my other job job. That's not ater fruit is uh My only partner developer is leaving to go work somewhere else Uh, which is really cool and really exciting Kind of a bummer a little bit for me. Um, but also really cool and really exciting And so I left the chat open today because I figured she might Say goodbye when she was done. Uh Actually, even couldn't make a it about work Update in the link to begin with I don't know enough about it about to know why apparently it didn't work Uh, it might I don't I don't know if catney might not actually be watching. It's uh one thing to try though is um Is uh using gh Well using uh get Submodule for each. I've actually had good luck automating Stuff not patches in the same way that adabot does but It's changing stuff. I'll I'll just say unscientifically stuff changing stuff across all the libraries Using uh scripts like a python script with get sub module for each Inside the bundle and then I can have it like execute a python script against every library And then in that python script I can have it like open a file change something Save the file and then if we want to we can also have it do uh gh um gh like command line stuff to have it like make prs or You pushes or do stuff like that Um Maybe I'll give that a try um I think I I think I I think I'm okay with it taking up a little bit of extra memory I don't know how much the extra eventually we should probably measure it Um and maybe someday, you know, we get rid of this sort of training wheels thing Maybe we go and change all the code In the learn guides and the examples ahead of time But before it's necessary and then you know go and actually make the breaking change that would cause the imports to have to differ Um in the meantime, I think I'm okay. I don't think it's gonna it's not that much memory I suspect and I think it's worth it To not break the existing imports It's because the git patch is not matching the full url so the diff doesn't match Meaning git believes the patch doesn't apply Get patch not matching the full url um Yeah, I think that's where I land I'm okay with a little bit of extra ram To keep the existing imports from breaking Um, and so honestly, this is gonna be a lot like button It's gonna have some of the same stuff It's gonna have an x y it's gonna have A width height Name I guess that must be the I was gonna say, I guess that must be the text that's showing but What does name do that's usually done way faster than that Is that a two name? Doesn't do anything Another slight rabbit hole I'm not gonna go too far into this one. This is one of the few libraries. I search for it and I end up on uh Lady eta instead of eta fruit So that's neither here nor there, but I do think we can get rid of it. Um, so I'll start with these x y This is not gonna be in pixels though. This is gonna be in tiles, which is weird Or I guess the other option is we can have it in pixels, but then we need like We need a A matching algorithm basically like We're not always going to be able to hit the exact size in pixels That's one drawback of the tile grid inflator is that it can target Only sizes based on tiles. So if your sprite sheet is let's say, um 96 by 96 that means that your tiles are 32 by 32 because remember it's three by three so Your target size has to be a multiple of 32 You can't with tile grid in the core. You can't make like You can't have tile sizes that are 32 by 32 and then You know make a thing that's like 50 by 50 because 50 doesn't divide evenly by 32 I think let's start by just saying in tiles Maybe later on we could go back to using pixels and then we could have the user Have one more argument. That's like a um a matching type or something that will say like You basically decide whether we go to The Largest size that's below the target they give or the smallest size that's above the target they give We'll have to choose one of those two Um, I think for now though, I'll just do tiles that'll get us enough to actually Hopefully write this out and test it today. So x y With height. What else do we need? Let's go back to button. Let's actually do this number here Um, so we're not gonna be having name. We're not gonna be having style We're not gonna be having fill color Outline color label we can still do All of these I don't know why those don't indent, right? Selected fill selected outline selected label Inverts are those like true false or what none? Okay, those are just setting the colors for when it's pressed I think by default they go Invert which is what it's saying Yeah, if you don't give it a selected fill But you did give it a regular fill I don't actually even know what this is honestly tilde operator. I don't know what tilde operator is But this is basically taking the inverse Like if you had green you'll end up with Ink, I think maybe Like taking the opposite, uh, which we're not gonna have a concept for that anymore. We're gonna have a, uh We're gonna have a Whoa Param, uh, let's go If I want to do path, I think so bmp path string And then we'll just do a Selected So you'll give it two bitmaps if you want to have a different a different visual look when it's being pressed And I think that's all we need for right now We need to create body thing. I don't think we I don't think we need this necessarily This this does oh this extends group not tile grid. I was thinking this extended tile grid We want to extend group instead Why do we extend group here? Oh, yeah, yeah, we need to be able to have the label right which is another object So yeah, we need we do need to do group actually group Because we need one we need our tile grid, which will be our visual button. We also need our label which will be our text So those two things can go inside of a group, but we can't show both of them on only a tile grid Um All right, so inside of a knit We are gonna Do this this will create a group and put it at the x y coordinates that got passed to us Also, I guess we should copy some of this stuff I guess that is on its own line Okay, so this creates a group Our self instance group and puts it at x y which is what the user specified for the location so now we Make a tile grid We make a button tile grid Button dot name is used in examples to identify the pressed button I use it in a bunch of project code. Okay Nice to have something different than label That's fair If you want to uh, if you mentioned I don't know. Did you mention it on here if you didn't mention it on the issue Go ahead and put it on the issue as well And I'll close it because like if it is used then we can definitely keep it I did not look at the examples I mean, it's not a big it's not taking up too much resources either So I just was like if it's unused we could get rid of it Uh, so we could add it here actually too. So why don't we do that name none name none And we're gonna need to import this. I don't think it's gonna find it. It did actually It's Okay, it kind of did Put this onto our group and I think we Should be able to start testing this already If not, we're certainly close So one thing is I'll just make one. We don't need all six We don't need a background We could keep variables We can keep all of this. We don't really need it for our simplest test here, but So we go like this and we're actually going to go button Zero equals sprite button X and we'll basically just give it most of the same stuff here But the width will be different When will um king Was it king aquarius x? Right when will more raspberry I assume you I assume you mean raspberry pies Be available to purchase. I don't have an answer for you though. Yeah, so I work remote for adafruit I don't I never been to the factory. I don't have any insight into the stock or anything like that um, I I can say on like asking engineer Uh, maybe a week or two ago um When Lady ada and phil were hosting. I believe they mentioned that they are adding raspberry pies like Almost weekly. Uh, I believe again, like this is what I heard on a public show. So like you could go watch the vod Um to double check. I don't have like a time stamp or anything for you unfortunately But I believe that they mentioned that I will say the main thing that you want to do if you haven't done it already Uh sign up for an adafruit account Log in, uh and turn on two factor authentication And then add the raspberry pie if you go to the product page for it do like a I don't know what they call it add to wish list or something like like notify me when it's in stock There should be a button that's something like that Um and do that do all of those things if you don't have an account make one get signed in set up two factor You have to do all of those things Because you have to have an account and you have to have two factor enabled to buy raspberry pies right now So if you do that ahead of time, then you won't be scrambling to do it Whenever the pies are actually in stock you could actually just go add one to your cart check out Finish right away. Also another thing you could do is if you add your payment method um Ahead of time like if you go add your payment method now Even though you're not ready to buy something right now Then you can just select that payment method when you check out On the day that they actually do go into the store And again, that's going to help you because you will be able to check out quickly You won't risk you won't have as much risk of other people buying all the ones that went in So that's that that would be my advice. I don't have a time frame for you But if you go do those things that's how you give yourself the best chance to get them And again all that information I got from PTA and lady eta on I think ask an engineer a week or two ago So that's where you can find more info if you want Uh, I don't know why this does this weird thing here Probably something to do with the way my project is I didn't uh get rid of all of these And with this Oh Yeah, that'll do it, huh? Yeah, for sure And then I think this crashes because I have no bitmap path or something no module inflate tolgrid So it does crash but not for the reason I thought Okay, so that means we did get inside of here. Yeah, we got inside of here But this didn't work. Uh, so does this mean like this and did we copy this? Yeah The right way to import a function Module I wish there was a good way to write unit tests for circumpath and code specifically display iocode um I will say I am not much of a test driven developer I've been throughout the vast majority of my career. I've been like either solo or on a very small team of like two to four max and I don't have like there's nobody in my management structure who understands or cares about code at all So there is no manager like breathing down my neck telling me to make tests Um, and I did not Learn programming testing first. I I'm aware of testing and like how it works and what it does and why it's good um But it's not how I learned to code and so I don't tend to do it probably as often as I should and I don't have anybody who's like telling me I need to do it So that doesn't help. Um I will say though that would be awesome. The other thing I'll say is I've watched a couple of your streams tammy um And actually the some of the tests that you've written is is kind of pretty eye-opening of like I've watched the way that you do test first and it's like it does seem like a really cool way To go about it and to make sure that you're actually building the thing that you think you're building So you've actually been kind of an inspiration to me on the testing front Like I've watched the way you do it and kind of been thinking about doing that a little bit more um Yeah, one thing I'll mention on the display io front. I did have an idea one day For display io test. So we have this um We have this library bitmap saver bitmap saver This can basically take screenshots Whoops This can basically take screenshots. So I did have like a vision one day of making a test that would Do something with display io take a screenshot of it and then compare it using pil python imaging compare it to A known good image for that library that way like let's say something like the display text library For instance, you could write a test that says You know, here's what this label should look like down to the pixel And then you know make a change to the library run it again Get the screenshot of what it looks like and then compare it to that other one And have it fail if it changes that's only one pretty narrow type of test to make sure things are still looking the same And sometimes we actually do want to change the way something looks like if it's bugged or whatever, right? If it looks wrong for some minor reason then of course we want to fix it and then it's going to look different but um I do think something like that could be possible And it could run like on raspberry pi's It's probably the best place to do it using blinka But then it like introduces a new variable because blinka is like a different display io than the core so There's definitely definitely still challenges But somersoft has done a lot of good work on testing as well There is uh, what's the name of it rosy rosy pi? Is that the name of the project or does it name something different? Uh, there's like a whole framework That's built up around doing i think the raspberry pi um The linux port running on the raspberry pi not like the newer stuff that scott worked on and also not the blinka stuff either That melissa works on Why are we not getting this import? I guess let's Go to ripple a bit Not bitmap savour savior It is not the bitmap savior So interesting we don't have any We don't have any other things Module oh my goodness That's what we just did From this import This Yeah, yep. Yep. Yep always spell stuff the same name as you actually spelled it that will help It's a non-trivial problem I think only way I've come up with this unit test or python specific stuff with a lot of mocking. Yeah In the long long range of thoughts Using cam and p.i.l An idea for a display testing on physici physici rosy pi physici. I was the other name. I was thinking Yeah Pragmatic programmer saver to enjoy one's own pace Oh saver saver Like saver something that's yummy You know saver this cold brew So now the actual error we have is we need to give it the Either the path or the object in the palette. We're going to go with the path We're going to go with target size equals tuple of width and height It might be all we need we should change width and height here though because these are going to be too big My image is that BMP's Nope, that's not the one we want to use Let's use this one gradient button zero This is 48 by 48, which means the tile sizes are 16 Yeah So let's go like this for now We don't have a margin Oh, I see Okay, I guess In that sense, we do have a margin We still have not actually passed BMP path. All right, there we go. Did not crash We have our button It's uh Very small So I think one thing I'll do is actually just make it bigger That looks better Um, let's make it wider even still And also we want to From the key of the pink we have pink in the corners the corners are supposed to appear rounded Uh, but right now they show pink Let me catch up a bit. I haven't read pragmatic yet. David Beasley You have a code base without unit tests you can start by writing a test every time you work on a bug helps test that bug anyway yeah I can And I I know I can and I know it's helpful but it's tough Basically to get into that mindset because I've coded for so long without doing tests And the few times I've brought up testing like People who are in charge of the priorities of my time kind of are like why Would you spend time working on tests when you could instead spend time working on features? um And I don't have the patience to try to make them understand So that's kind of where we're at um, it should be zero for the transparent index Oh, so I do think We will I guess need to have this get pasty here as well transparent index None Oh, that's the wrong thing. I don't know why these are not aligned. There we go So in our case, we're just doing a single transparent index and it's zero But you can do a tuple here and have multiples if you need I already too many. Okay transparent index zero and then we need to pass it through as well Can't click into that Nice, there we go. There's our transparent So now Let me think for a second. I think we actually Do we want to maybe we want to use the other ones actually maybe we don't Well, maybe we take the path at the button layer But we load it and then we pass the objects to inflate function Because we actually need our other Our selected bitmap we need that to be Either a bitmap object or an on-disk bitmap object Yeah, which means we actually need More of this Oh, but I don't think that works Hmm palette for this also That is not none. Then we fill these things Oh, right. I see. Yeah There's probably some way we could get these on the same line, but I don't know how There we go So let's do the label Which we can basically just lift it's gonna be the same Oh, sorry I'll have to chat scroll Audio book sounds fun Um, okay Surprised it didn't create the label I guess it did that in This thing Nope Hmm in the setter So where does it append the label to the group? So why don't we not have any text right now? Should have this In zero Well, let's look at the rebel Okay, nothing useful in the rebel Do these things get called? Yes and no The first one does but the one inside of here does not Why though shouldn't this Wouldn't this be calling this setter? Oh, I put this inside of a knit That'll do it now. I bet we get text. I don't know what color it is though So we might not be able to see it very well. Oh, nope sprite button Has no attribute label There's no attribute width So width yeah, actually this is quite a bit trickier How do we want to do this because In the shape button our height and width are exact pixels, but in this one they're tiles So this is the number of tiles times Number of tiles times tile height Then here we would do This And then we do need to set width and height which I don't think we did And then these I guess actually need to be like this Or eventually we could make Yeah, I guess we could just make actual properties with height and width And I'll make the setter later Because the setter logic is going to be different It's not it can't copy paste directly because it's going to have to be in tiles again Yeah selected label I think it was a color Yeah Part of me doesn't want to change this to be selected label color Because it now it's not going to match right they're two different names for the same concept Uh, but a bigger part of me thinks that this should have always been called selected label color Honestly, because it is the color right so I'm going to do it this way if somebody Refers otherwise then of course they could review and give that feedback Um I wonder if we should not invert by default too. Okay, so we got our button zero our label is showing now Now let's We need to make the touches work right now. We have no touches Right button has no contains I wasn't expecting it to crash, but I did not think it would work Uh, because we need to implement contains Probably select it also This is the function that actually checks if a touch point is inside the button or not This probably still crashes because I guess the next thing it does is probably try to call like set selected to true Oh, no, it actually didn't I'm surprised and it even knows it got pressed interesting Oh I see okay It's it's like making a variable called selected on the object and setting it to true false It's not having any effect because we haven't actually Coated it yet, but it doesn't cause it to crash because it doesn't care that it doesn't exist. It just creates it um We will make it though We're not doing fills and outlines This is actually color color No fills and outlines We don't have body and then the other thing we want to do is uh self dot Button tile grid dot Bitmap equals self dot Selected bitmap and also pixel shader palette Now I think our button will actually change colors. Oh, but I didn't actually pass one. So just no it still won't does it crash though Curious if it crashes. Oh it crashed before it ran has no selected Probably we just need to make that true or false still crashes 145 hmm Probably we should change the name of this honestly because we have button Oh, no, we don't we have bitmap. Okay. Yeah. No, this is fine If this is not none Then we're gonna do this Oh, there we go. So our text changed to white when we pressed just kind of a nice effect. Actually, I do like it Um, the bitmap didn't change because that's because we didn't actually pass it. So we just go here I already have another one of these called one Boom, there we go Oh Didn't go back though didn't go back And also the transparent We still need to do So let's go Inside here if If it's not none If is instance tuple For index in this selected palette dot make transparent index Lf is instance transparent int That should do the transparency But I think it's still not going to change back. Yeah, we got transparency now But the font color changes back But the background doesn't so why is that selected? Yeah, um I think the easiest thing is we just take this and put it in here And then here we go Basically back to the non selected ones Uh, also, I will mention the way that I'm changing the bitmap like this. This is not, um This is not in circuit python yet. I have a pr open for it, but it's not merged yet Uh, ask patrick showing up late as always day job getting the way of fun stuff Uh, I'll have to watch a recorded show. Thanks for the cookie cutter. Yeah, for sure Thank you. Uh, thank you as well for helping out with the white space and all the stuff that you did So yeah, definitely appreciate it Um bitmap and then this is Bitmap palette Now it should change back. Oh, but the transparent Weird. So is that only after the first press? That the transparency stops working? Yeah, it is because right now we have no corners Press down we still have no corners Lift up now we have corners all of a sudden. Did I change it to the wrong thing? Maybe I changed it to the wrong thing Yeah, I know what the problem is we need this to be object basically we're inflate tile grid is Because we passed a path. It's loading it internally Therefore it's holding its palette internally It's was setting its transparent syntax on that palette But when we changed back We were no longer using That palette. I don't know actually is there a way to get the palette back out? I don't think it just returns tile grid um Palate yeah, we should probably make a way to get the palette back out of this function Maybe I'll get rid of path all together honestly. It's nice But it does make it trickier and if we just use bitmap object and bitmap palette both then You can always use either on disk bitmap or regular bitmap and we don't Have to mess with transparent indexes at all You could do that externally and we wouldn't have this problem Yeah, I think I probably lean that direction for now though. We can just fix it here by Doing both of these instead There we go There's our button super fancy button gradients Again, this is something you can't do today with the with the existing shape button So we have two different gradients that it changes between the color of the font changes also We're looking pretty good here. What else do we have inside button that we don't currently have in sprite button? I'm gonna take a quick look over. I think I'm gonna be wrapping up here pretty soon as well anybody has questions or comments or anything I would say get them in now in one of the two chats um So we did selected Let's do uh here. Let's say selected true beta label equals pressed beta label equals button zero Make sure this works how it how it is supposed to Yeah, oh the color didn't change Oh, and it doesn't change back actually. Oh no, we have this already Hmm Can you change the label? Does it break the color? It's so it's we don't need this really if underscore label and self and So for one thing this is throwing away the old label And then always creating a new one honestly This was probably done this way because in the past Labels had a limit on the number of characters if you created a label with a certain number of characters initially You couldn't just add more to it. You couldn't set it to a new string with more characters in it Um, that was just a restriction That's probably why this was done. So they threw away the original label Created a new one with the new string that way they don't have to worry about If the text increases it causing trouble But we actually don't need that anymore. You can now just set the label to a bigger A bigger amount But this is also where it gets created initially All right. Yeah, I don't want to refactor that much of it right now Let's just see though Why just the color not work because it should still work with the color. So we create a new one Okay, so the reason the color is not working is here We are setting the text and then it's setting The color equal to the label color Not carrying about the selected label color I think that should make it stay Should make it respect the selected color if it's actually selected Oh, but it doesn't still doesn't switch back That's actually I know why that is that's because This is not actually where it changes This is actually where it changes This wouldn't work also if we had multiple buttons, but that's fine. Mostly. I just want to test test that White pressed back to black button zero. There we go Nice, okay, and so my spreadsheets for this. I don't know if I opened them before but my spreadsheets are This one and this one They're both 48 by 48. It is it is important. They have to be the same size Um, they both have the zero with index the zero with color in the palette is the color that wants to be chroma keyed So on this one, I used green since there's like actual pinks inside the button And on this one, I used pink because pink is more typically used as the transparent color for sprites Um, but it doesn't actually matter, right? Mostly what we care about is the index in both cases The color we want to cut out is index zero So these are my two sprites Um that tile grid inflator. That's what's responsible for making this, you know, bigger, right? These are both square 48 by 48. The actual size on the screen is much much bigger Uh, so that inflator is taking care of making it bigger and then When we select it, it's changing the bitmap To the other one and also changing the label and the color and all this stuff. So Also, I will say too, my calibration is not great. So if you notice, I'm kind of touching above the button a little bit That's just because I need to calibrate my touchscreen and I haven't done it yet Um, all right, so we got the start of this. I think what I'm going to do is just grab my Code here sprite button Paste this back over here Overwrite because this one's empty And I don't know as though I'm ready to push it yet. I suspect we're gonna fail pre-commit probably Right, we want to get fancy. I guess we could make a button base And then we could have these two extend button base and we could try to like Cut down on the amount of uh code duplication Because like the labels behave the same like it's but you know what it's selling us right here basically like It's similar lines in two files This all this code here is basically just copy pasted in the two files Uh, if we made a base class then the base class could have this shared code and the other classes wouldn't need it We would avoid a little bit of duplication Same thing for the selected property Actually, that's not entirely true though for the selected property because we have different behavior, right? In one of them We're rebuilding the body Different colors or something like that and this one we're changing the bitmap That would actually be a lot harder to refactor out Initializer as well. I guess we could I don't really like to do the base with the initializer because then the The arguments aren't on the final object like if you're looking for it in the code You don't know what all the arguments are because a bunch of them get carried into the star um So, yeah, I don't know we will uh I'll need to I'll need to decide what i'm going to do about that. There's also a couple other pilot failures as well, but I think i'm going to call it for now Paul time to go to bed here. Thank you, tim. Yeah, for sure. Thank you for watching. Have a nice weekend to you as well Uh, johnny, how's it going? Um Yeah, so thank you to everybody for watching. I hope this was interesting Sightful entertaining whatever whatever you want to get out of it. I hope hope you had a nice time watching Um, I will be back tomorrow morning um Yeah tomorrow morning at 10 a.m. Central time. Sorry, I don't know all the other time zones But if you look up 10 a.m. Central time in whatever time zone you're in Uh, I'll be streaming tomorrow morning. I will be on my own account instead of ate a fruits But what you can do is if you just uh go to the live broadcast chat in the discord I'll drop a link when I get started. Um, and you can uh follow through that way Um, and beyond that I'll be back next week for deep dive Uh small programming note next saturday So I just said that I streamed saturday mornings at 10 a.m. And I will be streaming tomorrow at 10 a.m But I will not be streaming the following saturday. I'm taking next saturday off I have some other plans so the 29 30th the 30th of april saturday Next saturday eight days from today. I will not be streaming, but I'll be back the following saturday Um So yeah, that's where you can watch. Thank you again to everybody who watched uh, and I will catch you all next time Yeah, thanks to see grover as patrick w and everybody else. I hope everybody has a good night good weekends and everything else