Commit Graph

263 Commits

Author SHA1 Message Date
Isaiah Odhner
2827457497 Fix default document size
Broken in "Start type checking code" 1b56d78f70
2023-04-22 14:55:22 -04:00
Isaiah Odhner
da62add6c1 Avoid "possibly unbound" errors 2023-04-22 14:24:49 -04:00
Isaiah Odhner
3b2b383595 Assert a few more specific types 2023-04-22 14:24:49 -04:00
Isaiah Odhner
7cd44c0abe Ignore border_title
I found these "type: ignore" comments where border_title is defined,
and copied 'em!
2023-04-22 13:46:02 -04:00
Isaiah Odhner
27c9646b20 DRY window closing and make type checker happy with an assertion 2023-04-22 13:46:02 -04:00
Isaiah Odhner
065c5be2cb Appease the type checker by using maps of buttons 2023-04-22 13:46:02 -04:00
Isaiah Odhner
77295bd622 Int, innit? Init int 2023-04-22 13:11:23 -04:00
Isaiah Odhner
f7b68c7e7a Now do we enter the land of making code worse for the type checker's benefit? 2023-04-22 02:42:20 -04:00
Isaiah Odhner
1b56d78f70 Start type checking code 2023-04-22 02:31:58 -04:00
Isaiah Odhner
27c95a537c Make mouse_at_start an Offset (consistently)
It was already initially defined as an Offset.
2023-04-22 01:12:48 -04:00
Isaiah Odhner
45fb2eb521 Implement polygon tool 2023-04-22 01:07:20 -04:00
Isaiah Odhner
2c469a5ef3 Draw curve preview also on mouse up and mouse down events
It feels more solid now, but it still disappears if the mouse leaves the canvas.
2023-04-21 23:52:23 -04:00
Isaiah Odhner
4f99b9f6a7 Make eraser tool square
I also have an erase_region method I could use now, alternatively.
2023-04-21 23:45:04 -04:00
Isaiah Odhner
6ce1856ec7 Fix brush/pencil/eraser previews 2023-04-21 23:40:48 -04:00
Isaiah Odhner
55e6ed6caf DRY some curve tool preview stuff 2023-04-21 23:38:11 -04:00
Isaiah Odhner
4d86f783be Implement Curve tool 2023-04-21 23:16:58 -04:00
Isaiah Odhner
18b78cea03 Outside the Ministry of Silly Walks's jurisdiction, it's a squaredance. 2023-04-21 23:16:58 -04:00
Isaiah Odhner
cc0bdf0973 Implement Text tool 2023-04-21 22:12:16 -04:00
Isaiah Odhner
7442480979 Optimize/abbreviate repeated integer division by the magnification level 2023-04-21 20:49:41 -04:00
Isaiah Odhner
d602753117 Refactor get_select_region 2023-04-21 20:18:58 -04:00
Isaiah Odhner
d39f491233 Fix selection while zoomed in 2023-04-21 19:45:01 -04:00
Isaiah Odhner
37cdcdfb13 Implement View > Zoom > Custom Zoom 2023-04-21 19:30:37 -04:00
Isaiah Odhner
cbe40406a6 Fix selection region changing on mouse up
It may be wrong (sometimes), but it shouldn't change (on mouse up)!
That's something (not nothing)!
2023-04-21 19:04:50 -04:00
Isaiah Odhner
5b2e4e0f83 Make warning into an assertion 2023-04-21 18:39:18 -04:00
Isaiah Odhner
612bc3d204 Fix: refresh properly when finishing a selection 2023-04-21 18:35:41 -04:00
Isaiah Odhner
c5c9bd9425 Fix dragging selection a second time: Don't replace image data! 2023-04-21 18:25:45 -04:00
Isaiah Odhner
e98931e8ef Implement Edit > Clear Selection (Delete) 2023-04-21 16:45:20 -04:00
Isaiah Odhner
61d3db4714 Fix undo/redo handling for the Select tool 2023-04-21 16:34:38 -04:00
Isaiah Odhner
1eea87c6c9 Fix error if dragging from off the canvas and releasing mouse over it 2023-04-21 16:07:43 -04:00
Isaiah Odhner
e579b005c0 Note difference between tool.name and tool.get_name() 2023-04-21 16:04:33 -04:00
Isaiah Odhner
9932a84554 And the selection tool is working! 2023-04-21 16:04:33 -04:00
Isaiah Odhner
c6873cdde7 Now it feels like progress... 2023-04-21 15:31:38 -04:00
Isaiah Odhner
bbdfa794fc I feel like I made it worse... 2023-04-21 15:24:45 -04:00
Isaiah Odhner
c3280d20d0 WIP: selection tool 2023-04-21 15:05:41 -04:00
Isaiah Odhner
1d8dec4ba4 Implement selection tool preview 2023-04-21 13:11:39 -04:00
Isaiah Odhner
f69f2f0009 Use messages for selecting tools/colors/characters
It's more code, but hopefully separating concerns will be worth it.
2023-04-21 12:26:07 -04:00
Isaiah Odhner
cf9eb652a0 Fix incorrect (irrelevant) docstring
copy/pasted or AI autocompleted
2023-04-21 12:15:11 -04:00
Isaiah Odhner
8040196f10 WIP: simplify hiding/showing Tools box and Colors box
This works for the ColorsBox, since it's the second element,
but not for the ToolsBox, since it's the first.
2023-04-21 11:45:10 -04:00
Isaiah Odhner
04a99f8a1d Remove type check param from query(); it's only allowed on query_one() 2023-04-21 11:38:20 -04:00
Isaiah Odhner
502a68209d Add type check parameters to DOM queries 2023-04-21 11:35:39 -04:00
Isaiah Odhner
41f192a4d3 Separate foreground/background color selection state
- This works differently to MS Paint. Instead of a color for clearing
  (and for the inside of shapes) and a color for brushing (and the
  outline of shapes), here there's a background and text color for each
  cell, collectively treated like the foreground color in MS Paint.
- There's no way to select a foreground color yet other than opening
  an image and using the color picker.
2023-04-21 11:25:22 -04:00
Isaiah Odhner
43d213fe46 Rename palette selection area elements 2023-04-21 11:04:30 -04:00
Isaiah Odhner
68d069fa8d Implement View > Zoom > Large Size / Normal Size 2023-04-21 01:40:26 -04:00
Isaiah Odhner
8e82203bb5 Note another attempt at fixing flickering when using the magnifier tool
I tried `refresh(layout=True, repaint=False)` before `_scroll_to`, but no luck.
2023-04-21 00:05:01 -04:00
Isaiah Odhner
51767d05c8 Use a shared class .filename_input 2023-04-20 23:41:59 -04:00
Isaiah Odhner
0f4a154eda Use straightforward properties instead of storing information in IDs
Sure, I'm tacking on these properties, but it's better to tack onto
objects than to tack onto strings. I'm not using a type checker yet,
but this is a better situation for type checking. (I could extend Button
with mini classes within ToolsBox and ColorsBox, if need be, to give
clear ownership of these properties.)
2023-04-20 23:31:29 -04:00
Isaiah Odhner
24076d9af5 Disable focusing tool and color buttons 2023-04-20 23:05:59 -04:00
Isaiah Odhner
1f260aaeef Refactor empty filename handling in Save As to use a negative condition 2023-04-20 22:41:45 -04:00
Isaiah Odhner
a23eeaf1dd Fix handling empty filename input in Open
I added the filename = os.path.join(...) which invalidated the positive
filename check. I could move the check earlier, but a negative check
should do nicely.

This commit is mostly a dedent, though git may display the diff poorly
due to the shared line window.close()
2023-04-20 22:38:55 -04:00
Isaiah Odhner
2ee021e236 Move expand_directory_tree logic into an EnhancedDirectoryTree class 2023-04-20 22:23:06 -04:00
Isaiah Odhner
9d4cccfe6e Fix type annotation for on_tree_node_highlighted 2023-04-20 22:20:20 -04:00
Isaiah Odhner
15af8f6403 Fix warning icon visibility after the first display
It gets set to `display = False` when unmounting, I think.
2023-04-20 21:01:33 -04:00
Isaiah Odhner
986db57e17 Improve layout inspector with built in css_identifier_styled
It now shows [name=...] if applicable, and styles each part differently.
And it's less code!
2023-04-20 21:01:32 -04:00
Isaiah Odhner
48f0303a54 Refactor create_warning_message_box into MessageBox 2023-04-20 21:01:14 -04:00
Isaiah Odhner
093a314d60 Move bits of warning_message_box that need App back into App 2023-04-20 18:09:49 -04:00
Isaiah Odhner
37ff810616 Move warning_message_box implementation to windows.py 2023-04-20 18:02:07 -04:00
Isaiah Odhner
5e72708fd8 Rename Python class for character selector dialog for consistency
If I want it to be less verbose, I should rename the super-class
from "DialogWindow" to just "Dialog".
2023-04-20 17:42:17 -04:00
Isaiah Odhner
9b3793682d Fix inconsistent CSS ID naming style
I've settled on underscores, for now at least.
Generally I use hyphens.
Built-ins actually use hyphens, like `.-dark-mode`.
Maybe I should be using hyphens.
But for now, consistency is what's important, and I'm using underscores.
2023-04-20 17:26:41 -04:00
Isaiah Odhner
433fa68a21 Refactor anti-garbage-collection Task reference keeping
Now it's really verbose, but I don't have to worry about reusing
the same name twice. Or coming up with new, fun ones.

https://docs.python.org/3/library/asyncio-task.html#asyncio.create_task

> Important: Save a reference to the result of this function, to avoid a task disappearing mid-execution. The event loop only keeps weak references to tasks. A task that isn’t referenced elsewhere may get garbage collected at any time, even before it’s done. For reliable “fire-and-forget” background tasks, gather them in a collection:
>
> background_tasks = set()
>
> for i in range(10):
>     task = asyncio.create_task(some_coro(param=i))
>
>     # Add task to the set. This creates a strong reference.
>     background_tasks.add(task)
>
>     # To prevent keeping references to finished tasks forever,
>     # make each task remove its own reference from the set after
>     # completion:
>     task.add_done_callback(background_tasks.discard)
2023-04-20 17:18:55 -04:00
Isaiah Odhner
2a2b29e30e Use a shared CSS class for styling Open/Save As dialogs 2023-04-20 16:47:11 -04:00
Isaiah Odhner
5b20caf118 Add basic help window 2023-04-20 16:27:46 -04:00
Isaiah Odhner
3235ebcf26 Implement About Paint dialog 2023-04-20 16:27:41 -04:00
Isaiah Odhner
a33dd153ce I tried to fix flickering when using magnifier tool
- Move `self.canvas.magnification = self.magnification` up. It happens,
  due to internal call_after_refresh, and should happen, before scroll.
- Remove note about other code in JS Paint, I think it's not needed.
- Note my attempts at fixing flicker, which were unsuccessful, so that
  I don't try the exact same things later, and feel stupid,
  and so I don't accrue so many branches.
2023-04-20 15:39:33 -04:00
Isaiah Odhner
896f43e7ed Fix one canvas refresh not using magnification 2023-04-20 15:13:14 -04:00
Isaiah Odhner
1740e39301 Fix canvas size not updating
I actually added this before, and then thought it wasn't needed for some reason.
2023-04-20 14:54:20 -04:00
Isaiah Odhner
56ad762819 Fix mismatch between file opening behavior of Open dialog vs CLI arg 2023-04-20 14:51:06 -04:00
Isaiah Odhner
c3763523bd Visually debug IndexError...
The canvas size isn't getting updated (fully) when loading a document.
2023-04-20 14:45:11 -04:00
Isaiah Odhner
5958ba348b OK maybe this isn't so robust... 2023-04-20 14:42:51 -04:00
Isaiah Odhner
51c370dc24 Instead of clearing, prevent filling filename input in Open dialog
Prevent the filename input from being populated in the first place,
instead of resetting after its unintentionally populated when the
directory tree is expanded.

Nip it in the bud. Head it off at the pass. Stop it at the source.

It still needs this new flag to be cleared on a timer, but at least this
timer is near the code for the other timers it needs to trigger after.

Explicitly set filename for Save As dialog, which SHOULD be populated.
2023-04-20 14:42:51 -04:00
Isaiah Odhner
801c147d4c Clear filename input in Open dialog, which gets set unintentionally 2023-04-20 13:00:05 -04:00
Isaiah Odhner
ec4d044f8a Handle FileNotFoundError coming from os.path.samefile 2023-04-20 12:08:03 -04:00
Isaiah Odhner
61d1532552 Prevent multiple character selector dialogs from opening at once 2023-04-20 11:54:42 -04:00
Isaiah Odhner
74c4af1a5b Refactor meta character mapping to use match 2023-04-20 01:26:00 -04:00
Isaiah Odhner
7cdb35a4ae Start defining an enlarged view for certain characters 2023-04-20 01:25:43 -04:00
Isaiah Odhner
b955aaf361 Input or pick character to draw with 2023-04-20 01:21:06 -04:00
Isaiah Odhner
8727ed27de Use .dialog_window, already specified in one place, instead of .dialog, scattered about 2023-04-20 00:28:45 -04:00
Isaiah Odhner
29bc94efbc Ignore RuntimeError "cannot join current thread" 2023-04-19 21:45:18 -04:00
Isaiah Odhner
ac10d5e500 Tweak error messages to use colons for clarity 2023-04-19 21:34:29 -04:00
Isaiah Odhner
c659418240 Clean up attempt at more optimal color inverting
I don't want to bother importing Rich's Color class in addition to
Textual's Color class.

This also doesn't work, which might be the fastest if it worked:

    style.color.triplet.red = 255 - style.color.triplet.red
    style.color.triplet.green = 255 - style.color.triplet.green
    style.color.triplet.blue = 255 - style.color.triplet.blue
    style.bgcolor.triplet.red = 255 - style.bgcolor.triplet.red
    style.bgcolor.triplet.green = 255 - style.bgcolor.triplet.green
    style.bgcolor.triplet.blue = 255 - style.bgcolor.triplet.blue
2023-04-19 21:20:10 -04:00
Isaiah Odhner
bf16e60509 Clean up old magnifier preview approach 2023-04-19 21:14:07 -04:00
Isaiah Odhner
bd8ebad377 Implement magnifier preview 2023-04-19 21:08:59 -04:00
Isaiah Odhner
0026c06268 Fix inconsistent indentation 2023-04-19 19:58:07 -04:00
Isaiah Odhner
9120d49546 Implement the magnifier tool 2023-04-19 19:44:57 -04:00
Isaiah Odhner
ad6d799db9 Note reset command to recover from bad terminal state 2023-04-19 19:09:02 -04:00
Isaiah Odhner
dd5e646dfe Prompt to save changes before reloading program 2023-04-19 16:00:43 -04:00
Isaiah Odhner
509618c1be Try to clean up the file change observer when restarting
This is all theoretical.
2023-04-19 15:19:27 -04:00
Isaiah Odhner
140ff15ff1 Restart the app on changes 2023-04-19 14:27:12 -04:00
Isaiah Odhner
7b0eaff108 Reload the app with F2, not F4
I'm dumb, I forgot the app uses F4.
2023-04-19 02:45:55 -04:00
Isaiah Odhner
dfa4212548 Fix terminal state after reloading and exiting 2023-04-19 02:23:29 -04:00
Isaiah Odhner
f4075282ce Reload the app with F4 2023-04-19 02:08:01 -04:00
Isaiah Odhner
655d42e414 Change shortcut label for exiting
Alt+F4 is handled by the window manager, we can't handle it.
2023-04-19 00:37:59 -04:00
Isaiah Odhner
4cbafea3cb Show accelerators/shortcuts in menus 2023-04-18 23:34:05 -04:00
Isaiah Odhner
1659f2d75b Improve error handling for saving files 2023-04-18 18:56:29 -04:00
Isaiah Odhner
b8c7e0eb72 Add all of the menu items from MS Paint 2023-04-18 18:56:29 -04:00
Isaiah Odhner
ac8c3819cf Some things aren't translated yet 2023-04-18 18:55:45 -04:00
Isaiah Odhner
c5f7c9f387 Rename "Rectangular Select" to "Select" to match MS Paint and for localization 2023-04-18 18:55:45 -04:00
Isaiah Odhner
f1a4b9736e Improve error handling for saving and loading files 2023-04-18 18:55:45 -04:00
Isaiah Odhner
fcf44a8b94 Handle errors when saving a file 2023-04-18 18:55:44 -04:00
Isaiah Odhner
e715a28e59 Fix error when hitting OK button with no callback 2023-04-18 04:04:46 -04:00
Isaiah Odhner
8c4a5bf583 Handle errors when opening a file 2023-04-18 04:04:46 -04:00