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.  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'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.  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?  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


Tlo what's pop We are on twitch. We are not live, but you can leave a like comment subscribe turn on your post notification bell Let's continue to grow the family from Chicago to the UK If we do go live you happen to miss it any of the highlights will be on this channel above right here Don't forget. We do got the discord man. We can send all your requests and things of that nature And we also got the patreon man.  That's like, oh, I'm not leaving no light This is the bubble and squeak murder The disturbing case of Penelope Jackson by coffee house crime salute the coffee house. I'm already subbed up From my serious face on catalyze a gruesome night that would forever affect the lives of two families My name is Adrian and welcome back to another video by coffee house crime Today we're looking at the turbulent case of Penelope and David Jackson and how the complexities in their relationship ended in a Violent I'm not gonna lie. I always question people named Penelope Like I've met like two Penelope's and like they were both kind of like questionable and marital death Just a quick heads up, but I've complexities in their relationship ended in a violent marital death Just a quick heads up, but I post solved unsolved and strange cases here on a weekly basis So if that sounds like your kind of thing, please consider subscribing to coffee house crime now This case definitely requires the ability to look at a story from multiple perspectives But what exactly pushed Penelope over the edge?  He told me to of Penelope and David Jackson Comfortable now. Let's get it. Oh Somerset The land of cheddar cheese golden sunsets and of course a British staple cider Somerset which is located in the southwest of England has always been a famous holiday spot in the UK Somersets villages and towns huddle close to beaches and national reserves Making it a great place to detach from the hustle and bustle of modern-day life And it's only a short drive away from the Bohemian city of Bristol a personal favorite of mine when it comes to English cities Located towards the northern tip of Somerset, we find a small seaside village named Barrow Barrow has a population of not even 1600 residents all of which you could fit onto to airbus a380s In a net I don't like living in towns like that because everybody think they know you and everybody think they got an opinion on what you've got going on you know I'm saying so 1600 that area so remote the phrase not much is often used to describe what's going on in Barrow and Rightfully so it's a village best suited for those in their golden years Focused on relaxing in the Golden Sun with their golden cider Which was of course perfect for the retired couple of David Jackson and his wife Penelope Jackson As of the year 2021 Penelope and David had been married for just over 24 years and with that said It's obvious to say that they had a rather large number of things in common Penelope was 66 and David 78 and together they both enjoyed cruising around the world and tending to their garden when at home and Although their relationship seemed happy from the outside, it certainly wasn't always like that. We'll get to this in just a moment Marrying David in 1996 Penelope had actually married three men before this being a woman. No, David David That's a red flag three and oh, I mean oh and three The Royal Air Force she had the opportunity to meet many strangers through her job It was in the year 1973 when she was 18 years old that she married her first husband and together they would have two daughters But the relationship between Penelope and this man would not last forever a few years after having her second daughter Penelope claimed that this man had become violent and so the two of them decided to split thinking it was the best option for their daughters Following these violent altercations Penelope and the kids were out of the household pretty fast and Penelope was just as fast to find another man This time an RAF servicemen didn't even let her so he'll the two of them married rather quickly But this relationship would be even more short-lived than the first Penelope sounds like she had father issues That she doesn't know how to be on her own Like it's okay to be alone That's when you work on yourself and build your character up so you can be ready to be ring somebody in And share you New husband soon worked out that he didn't want to be with a woman But other men instead and so the two obviously decided to split up Penelope's first two marriages were not easy and by no means were they her own fault Escaping domestic violence in the first one and lacking the right equipment in the second But her third marriage would paint a much different picture to Penelope She would again meet another man and his name was Alan Warander The two of them met at work and both of them were stationed at Royal Air Force Base in South Wales But Alan was already married and he had three children with his wife This was no problem to him. They initiated a secret affair This is how you fell into your third marriage How you get them is how you lose them remember that It goes for both ways. However, you've met your If it wasn't if it wasn't a bad way, that's how you're gonna lose them The two would do this for multiple years Until tragically Alan's wife passed away from cancer she was 36 years young and Sadly, she had learned of Alan's infidelity before succumbing to her illness The death of Mrs. Warander was heart-breaking and the list of negatives to her death Overwhelmed the tiny minority of positives But one of those very few positives was Penelope After the death of his wife, Alan essentially disowned his own children Moving them in with other family members or boarding them into private school And he did this so he could now devote his own time to the new love of his life The new relationship with Penelope resulted in the birth of their own daughter and she was named Isabelle The family unit would be happy for a short while Okay, sure their origin was pretty rough, but Penelope had a loving husband and a beautiful baby daughter However, yet again, this would all change Being part of the RAF Alan would spend long placements away from home Very often in remote parts of the world and while on post in Saudi Arabia Penelope grew bored It was in this period of loneliness that Penelope met a new face and this is where we meet the other half of today's story Being a lieutenant colonel for the British armed forces, he was a well disciplined man It was during his time on shift that he met Penelope who at the same time worked in the administration department She had previously worked in admin for the Royal Air Force, but moved over to the armed forces for better pay Although Penelope and David were both married and had their own children between the two of them They couldn't help themselves the two often made excuses to see each other while at work and This soon spiralled into an affair an affair that wouldn't be kept a secret for very long It was in the year of 1993 that Alan was sent to the Middle East for work and after returning home He learned that his wife had been cheating on him. The news would be a devastating blow to Alan's mental health In fact, it was so bad that a few days after learning of this He decided to take his own life through carbon monoxide poisoning At Alan's funeral Penelope would seem vacant and almost unbothered by the affair She showed a total lack of empathy for her late husband and those around her and Alan's brother would describe her demeanour as I was not taken in by Penny I get the impression that to Penny husbands are disposable and if I had to pigeonhole her personality I would say that she's a narcissist It's interesting to learn that it wasn't just Penelope that had issues with marriage David himself had been married twice before Fathering two daughters and a son from his first marriage and his son's name was Gavin It was unsurprising that David moved on from his first wife to a second marriage through unfaithful means Cheating on his first wife with his second Sheila Taylor And so this pattern which seemed to perfectly resonate with the behavior of Penelope would persist and reflect when David Cheated on a second wife to be with Penelope Sheila learned of David's affair when Meeting together in the same relationship.  It can never go like this Y'all the same type of people, right? I feel like relationships need to be yin and yang not Yang and Yang Penelope rang the home phone line demanding to speak with David Apparently even in the early stages of David and Penelope. They had problems with their relationship David insisted to Sheila that the relationship with Penelope was over However, following this newfound knowledge Sheila decided to divorce David anyway taking the kids with her It was a surprise that given his recent claims The divorce would eventually result in the marriage of David and now Penelope Jackson marrying in the year of 1996 And David would take Penelope's daughter Isabelle under his care treating her as if she were his own daughter And this turbulent story forms the backbone of today's couple I'm already there and Although their relationship wasn't perfect. It did seem as if the two were mostly happy together Being part of the army they would move to France then Germany and eventually back to England The change in location didn't falter the family as to them home was with each other and Although Penelope could be a little turbulent and David would often complain to her about menial things There was nothing alarming between the two at least to begin with I Say to begin with because that would change in the year 1998 when David learned of some rather devastating news David would learn that his son Gavin had unfortunately cheated on his pregnant wife and Following this mistake Gavin had sadly decided to take his own life In his final note before his death Gavin had wrote to David to say that he didn't want to be like his father And in his own shame Through defeat he felt like he didn't deserve to live any longer This hit would affect David greatly not only had he lost his only son But he felt partially responsible for it too and this would change his behavior and actions with Penelope forever Through his own grief David became more erratic hot-headed and even violent towards Penelope One of his worst moments included pinning Penelope so hard against the wall that her nose bled profusely There were emotionally abusive moments too David once smashing the Mother's Day present that Penelope's daughter had given her right in front of Penelope's face and In the most shocking of instances David had even held a knife to Penelope's throat at a family dinner in Germany In which it took three members of the family to pry him away from None of these instances of abuse are ever acceptable But David did just lose his son Everyone around the couple knew this and they thought maybe he was just grieving in his own violent way Grieving with a neck to it with a throat to it with a knife to your neck That ain't grieving. Hey, nevertheless the two decided to stay together toxic energy These instances of violence would eventually subside But bickering and arguing between the two would remain However, amazingly the couple's marriage would continue to withstand time for not one but 23 years more Even succeeding their retirement and into the year 2021 Friends and family would say that the two seemed to be enjoying their retirement together Often going on cruises and keeping in touch with family members throughout But much like all cases here that would drastically change in the winter of 2021 when things got a little out of hand between the two All over a dinner of bubble and squeak. Oh That's why y'all okay, so on tiktok y'all know I'm a tiktoker now They're telling me to try bubble and squeak It looks complicated to make I ain't even gonna hold you 2021 they co-covid was going on y'all was arguing on Y'all had too much time together. That's what it was the 13th 2021 It was a cold and dreary night in the thick of England's winter The time of year where you should expect no golden Sun and This day in particular was Penelope's birthday At least here in the UK the COVID pandemic was rampant at this time and the whole of the country was in lockdown The Jackson family included except the Prime Minister at the time Nevertheless, Isabel and her partner Tom Pottaton had put some money together to celebrate Penelope's birthday in some way The family had planned to have an extravagant dinner of lobster crab and steak over zoom a virtual meeting room with video support But problems would present themselves fairly quickly this night Penelope and David running zoom on their iPad which wasn't sufficiently charged up and this ended up sparking the first arguments of the evening Although they had managed to get zoom working on the device Penelope would seem subdued and appeared to have been crying The family exchanged greetings before plans progressed as expected They were ready for their remote dinner together Penelope retreating to the kitchen to grab food for her and David and after their seafood starter They would you a main course of expensive steak? The evening remained relatively peaceful. That was until Penelope bought out a side dish of bubble and squeak Bubble and squeak is a very British dish Made from mixing potatoes with cabbage before pan-frying them to create a crispy exterior and According to some Brits, it is sometimes seen as a low-class dish an opinion that oh, so it's like a Okay, so it's just potato It's like a potato pancake with cabbage in it. Okay, that ain't even hard to make What seasonings go in there though David seemed to agree with Believe it or not and in the most British way possible This was the real spark to ignite the evening's events It was in this moment that David told Penelope that she was ruining this fancy meal by having a side dish like bubble and squeak And this comment led to a full-blown argument an argument that actually stopped the zoom call Penelope had always tried to keep her arguments with David away from Isabelle and so the call was ended and that was that Fearing that David may once again become violent from the argument Penelope retreated to the bedroom taking a knife from the kitchen with her a Knife that would stay under her pillow for the night as allegedly she intended to sleep with it for self-defense Hours passed and as the evening ascended into night David decided to get some sleep He headed on to his bed where he then realized that Penelope had something under her pillow And she was acting very suspicious That was when for David and Penelope David thought Penelope was trying to line him up Or maybe she was all hell broke loose Want to discover the French culture over some quintessentially British food over some bubbles and squeak At approximately 9 0 7 p.m. On the 13th of February 2021 police received a rather disturbing phone call And are you with him now? Oh, I do not stop him again Okay, so just listen to my voice. Okay stay on the line with me. I remember this I Remember this Okay, are you with the patient now Oh Right, so just a down the line with me Okay, well ultimately madam I'm listening to your voice and you're the help I have available so we need to help him, okay How many times Penelope King Von Jackson that's tough What is what is happening you start tip? You did the one So okay, so in total how many times plus one is three sir Three times, okay A total of 18 minutes Pat and Nellope is Overly toxic She doesn't even understand the severity of what's happening on this phone call while the operator tried to keep Penelope's attention As police rushed to the scene and at 9 25 p.m. Police arrived at the Jackson residence They calmly knocked on their front door before Penelope arrived in her pajamas Under arrest with a suspicion of death murder You do not mention one question anything you're later lying in court and you do say maybe given an evidence All right, no he's on the kitchen floor can someone just stay with them while I go in There's nothing nasty and I'm certainly not My coach in the Penelope just worried about her warmth She might she's starting to make me think she diss on to other husband. What about Penelope? She cold-blooded RIP man If any luck you'll be too late All right, so he was that man Um, well I'm called Penny but Penelope Jackson Penny Like it you do live here. Yes Can I get my coat? Get the ambulance in pronto. We need CPR. Oh, no, no, no, please don't I should have stabbed him a bit more We've got CPR being done at the moment Yeah Emergency services found David lying on the kitchen floor wearing nothing but his underwear and in the pool of his own blood They performed CPR immediately, but sadly their attempts proved to be unsuccessful David had unfortunately passed away Penelope made no attempt to hide or conceal her actions In fact, she made it pretty obvious that she killed her husband even hoping to police that he was dead Yes Penelope felt no remorse for her actions She was bold and brash with her statements And it actually seemed that she was more bothered about getting her coat and staying warm He's an aggressive bully and nasty and I've had enough I'm one So you murked them one eight seven just editor type things. Yeah, I wouldn't know about that He said You wouldn't do it. Oh, does it twice more? Coats in what colors you can go in the front in the front. Yeah gray gray Baldro, okay. It might be a while. All right, but I'll try and get there's obviously a lot going on Okay Penelope, my advice is don't don't talk about it now. Okay. No, no, I have no no intention of not agreeing to what I've done Okay, I know what I've done. All right, and I know this cop don't even got a gun He ain't never in his life encountered something like this He's looking like, okay. All right. Uh Well, uh, Penelope, uh Give me a moment. I'll be back. I don't this is Why I've done it and if I haven't done it properly, I was really annoyed as she arrived at her local Police station Penelope's arrest was upgraded from attempted murder to murder And even worse. She was joyful to learn that her husband was now dead All right, Penny. Um, I'm arrested further arrest than you for murder Oh good. I've already cautioned you so your necessity is for your arrest is for a prompt and effective investigation and stop further harm Sorry That one's a bit tight We're gonna we're gonna we're gonna move them through and we're going to decide the MDO has just come out to, um, check your temperature And then we'll we'll move you in and then we'll put you in Just stay there for the time being All right, well she's probably got a cold now I ain't never given her a cold, did y'all?  Yeah I'm very sorry for being a nuisance. No, just gonna take your temperature Be sorry for being a murderer Being a nuisance is the the the lowest thing On the ring of problems you got Yeah So that would be just really great get overed on the top of this So what exactly happened to the two when David decided to head to bed? Upon realizing what was under the pillow David asked Penelope what she was planning to do with the knife To which she confessed that she was planning on taking her own life with it Penelope claimed to officers that she had enough of all the abuse and arguments that she was being put through And to her this was the only way out But David did not take Penelope seriously and in response said just get on with it then And with that said Penelope grabbed the knife and retreated to the spare room of the house Following her into the room David and Penelope continued to argue even further And according to Penelope. He started to provoke her into stabbing him Simply put he didn't believe that she had the courage or audacity to do it Calling her pathetic. He told her to go back to bed And women are emotional creatures, man. I wouldn't play with my life with my angry, unstable woman But Penelope saw red In one aggressive swing she slashed David across the chest Resulting in a deep laceration that began to bleed David wasn't gravely injured at this point, but he did fall to the floor due to his pain Clutching his chest He saw Penelope walk out of the room with the knife to leave her husband in the spare room while she began to write a confession The confession note read To whom it may concern I have taken so much abuse over the years Just look at my records, but he was a good daddy However, the mask slipped tonight. This is and was unforgivable. I accept my punishment may he rot in hell In the corner of the note was a scribbled comment that read self-defense While Penelope was writing this letter David had managed to crawl into the lounge in order to get to the phone He then walked into the kitchen and called for emergency services Before saying to Penelope see how it feels to have the police phoned on you In the first minute of this phone call David could be heard telling Penelope that she wouldn't dare stab him again And that the first time was just a fluke And seconds later David can be heard screaming in pain as Penelope stabbed him a second time Then moments later a third the phone then fell to the floor only He for Penelope to pick it up and start talking to the operator So the operator heard the M And you know the rest from here Although Penelope was only arrested on suspicion of murder She had certainly said and presented enough to police to rule out any doubts And they would begin questioning her the very next day However, this time she wasn't nearly as talkative as she was the previous night Penelope refused to answer questions And instead she delivered a papered statement to claim that David had been abusive and controlling towards her for many years She said that she had no choice and she denied her charge of murder It was too late by then You ain't keep repeat when they was asking you all on questions at the station You spoke you was talking too much Dead she expressed that she was guilty of manslaughter as she was only reacting in self-defense Penelope continued to paint David as an abuser both physically and emotionally These accusations angering David's family to its very core and although they admitted that they would often see the two argue They never saw any evidence to suggest anything more At Penelope's first trial on the 11th of October 2021 Several family members came forward to a test that David was not an abusive man And that in fact Penelope had always been the one to seem threatening and controlling over a husband They recalled how David never seemed comfortable when she was around him that she liked to make others feel uneasy And that you would always try to find people's insecurities before poking at them Damning allegations would also come in Penelope's direction It was while in court that David's eldest daughter recalled the moment that she asked her father and Penelope for advice on her failing marriage Penelope replied with it is much easier if your husband kills himself Referencing her previous husband who had done the exact same thing And David's second wife Sheila testified that David feared his third wife Claiming that Penelope once threatened to cut his off if he ever left her You ain't leave David honestly believed that she was capable of carrying out that threat With the way that Penelope acted out her birthday evening It is pretty obvious to say that David is not here to defend himself against her allegations So the only judgment of character that we have is from family and friends Penelope's and David's daughter Isabel was a key witness to legal proceedings And she did admit that she witnessed some form of abuse from David towards Penelope Most notably the incident that happened around the dinner table in Germany But even she believed that David was not the monster that Penelope was painting him out to be So it was therefore very difficult to decide how problematic David was It was a factor that had so much influence over Penelope's outcome Yet it couldn't be proved or disproved But in the judicial realm a final outcome must always be made And on the 27th of October 2021 Penelope's outcome had finally been confirmed After 11 hours of deliberation a jury of eight women and four men returned with their verdict Finding Penelope Jackson guilty of murdering her husband David Jackson They deducted that David was of no threat to Penelope at the time of the attack And that she was calm and collected in the event Therefore concluding that it's unlikely that she was reacting in distress after an attack from her husband Penelope could have stopped after the first slash across David's chest But instead as overheard by emergency personnel she continued to attack David while he remained severely wounded And although you never know what happens behind closed doors a multitude of witnesses came forward in David's defense See this is this is why I have trouble like Like this is why I have trouble like trusting Someone who has lived an entire life That I have no clue about fully And just gotta go off what they tell me And meeting somebody in my in my 40s 50s and getting married to them at 40 50 Years old like you had a whole previous 40 years. I don't know what kind of person you really are This is why I'm gonna tell anybody who Who has a childhood sweetheart that they still with high school sweetheart Maryam It's not gonna get any better than that It's not gonna get no better than that marry your high school sweetheart And all in the meanwhile Penelope's own attitude and behavior painted her as an uncaring individual with a distinct lack of empathy She showed not a shred of remorse following David's death even though she professed that she still loved him Penelope received a life sentence with a minimum of 18 years Meaning that she is only legible for parole after reaching the ripe old age of 84 Penelope has since you sure about that? When he said reaching that age you sure about that it's appealed her verdict And that pretty much marks up the end of today's case There is still ongoing pressure on both sides of Penelope One side arguing that Penelope was only reacting to years of abuse The other side arguing that barely any of that ever existed either way It is dominantly agreed that the actions that Penelope took that night were exaggerated way past the problem that was presented Newton's third law describes that for every action there is an equal and opposite reaction So in an ideal world where all actions remain equal I would argue that bubble and squeak should never end in murder Thank you so much for watching another video to you Tla leave a like comment subscribe turn on your post Um, hey leave a like I told you all about the blights man. If you've even watched this video for If you're in the premiere of this if you've even watched this video for five minutes If you hear me talking now just leave a like man Me personally It motivates me to continue Thank you


What's up everybody? Jason here from jasperjasecasebrakes.com. Six mixer spots being given away here in 2019-20 Pinini Mosaic's solo one-pack break number 597 random teams number first we're randomize customer names and teams Distribute the hits out of the cello pack then at the end of the break we're randomize all customer names and One through six top six get a spot each in the 13 box mixer Now Sean just got the first two spots and Charles gets the last 28 to sell it out. So there you go Two customers here, so we'll do the break then we'll come back where the dice and top six get in So let's roll it and we got a six and a five for eleven times is just the pack break One Two three four five six seven Eight nine ten Sean down to Charles now. Let's go eleven times One two three four five six seven eight nine Ten and eleven seventy six is down to the T wolves And again stick with what you got so Sean has the 76ers and the wizards the rest is all going to Charles So TWC trade the window closed tied your own our gross silver Anderson DeMarco Rosen and Tyler hero now. Let's get away the spot. So good luck Roll it and it is a one and a five or six times One two three four Five six the final time Charles one two three four five six Sean does sneak in and get one spot in the mixer top six After six times Boom. Congratulations guys. You guys are both in Appreciate it one more way to win is posted already number 598 and we're at 29 spots. I appreciate it