I have a bad habit of not actually using the software I create, but
whilst perhaps I should have gone to bed, this was a delight to create,
the childlike joy of picking blocks together to form an image, imagining
what I could do with different pieces, and putting silly smiley faces
in as the crew and making them all different colors.
I didn't look at any reference while drawing this, so... it doubtless
contains many inaccuracies.
But that's rather beside the point, isn't it?
Aside from just having fun with it, I observed that the Pick Color tool
is vastly more important than in a raster workflow, since it picks not
just a color, but two colors and a character! And I would really like
the Color Eraser feature. I would sometimes use the wrong blue to match
the sky and then have to Pick Color, change color, and replace the cell,
one by one, whereas the Color Eraser should take care of that.
It's a little awkward selecting colors with Ctrl click, with it
not showing the foreground color (Input doesn't seem to support it), and
with the cognitive dissonance between the background vs foreground
here vs in MS Paint. Other than that, it worked splendidly.
This is a little weird because the selected background color is
analogous to the foreground color in MS Paint, for the other tools,
with the foreground color having no equivalent as it's just pixels
instead of character cells.
So with the default white canvas and black "background color",
this now draws a black text box, unlike MS Paint's default behavior
for the text tool of drawing a white text box.
All just to avoid one type checker error:
Type of "app" is partially unknown
Type of "app" is "App[Unknown]"PylancereportUnknownMemberType
But it's the last error in menus.py...
But I still have a bunch of this error in main.py, and I don't know
how to deal with it generally. It doesn't seem like a real problem,
but I don't want to add so many ignore comments...
This is an AI-offered function... so I'm sort of guessing here.
This fixes a spell checker issue but there's also a "possibly unbound"
type checker issue here.
Method "watch_value" overrides class "Input" in an incompatible manner
Return type mismatch: base method returns type "Coroutine[Any, Any, None]", override returns type "None"
Type "None" cannot be assigned to type "Coroutine[Any, Any, None]"PylancereportIncompatibleMethodOverride
Method "validate_cursor_position" overrides class "Input" in an incompatible manner
Parameter 2 name mismatch: base parameter is named "cursor_position", override parameter is named "position"PylancereportIncompatibleMethodOverride
These wouldn't actually be problems, due to the nature of the reactive properties system, but whatever, I can make it match, no problem.
I don't know what all should have type annotations, and honestly it's
pretty confusing how these are used. For instance, `selecting_text`
goes from:
(variable) selecting_text: bool
to:
(variable) selecting_text: Literal[False]
when annotating it as a bool, looking at the hover text in VS Code
with Pylance language server.
Use absolute positions instead of delta coordinates.
The deltas would sometimes give points "jutting out" — only by a pixel,
but confusing when trying to do pixel art. You might not even notice it
but it might make you feel like a bad artist until you do.