Commit Graph

673 Commits

Author SHA1 Message Date
Isaiah Odhner
302e578387 Generate type stubs for stransi and ochre 2023-05-09 16:58:25 -04:00
Isaiah Odhner
385fffb704 Handle cursor and clear command when loading ANSI files 2023-05-09 16:44:49 -04:00
Isaiah Odhner
b814789b17 Generate font template for a meta-character font 2023-05-09 16:39:42 -04:00
Isaiah Odhner
d54a4e690f Extend meta-character handling to shaded block characters 2023-05-09 15:03:06 -04:00
Isaiah Odhner
24331bd5e2 Add type annotations for this silly test script 2023-05-09 02:04:53 -04:00
Isaiah Odhner
cc06bcc6e7 Make pink fade to blue towards the bottom 2023-05-09 02:04:53 -04:00
Isaiah Odhner
de625b2d9b Arrange flowers in a spiral 2023-05-09 02:04:53 -04:00
Isaiah Odhner
2faf7f55a6 Make gradient test more floral 2023-05-09 02:04:53 -04:00
Isaiah Odhner
f7fdecd5a3 Generate gradient test ANSI art 2023-05-09 01:18:30 -04:00
Isaiah Odhner
2e6abea6ee Fix terrible UnicodeDecodeError message that didn't fit on screen 2023-05-09 00:51:25 -04:00
Isaiah Odhner
5a0f1dacfe Add max file size limit when opening or pasting from files 2023-05-09 00:33:22 -04:00
Isaiah Odhner
e37255fc98 Reimplement --recode-samples in parallel, not loading into editor
Ooh, more importantly than running in parallel, this actually fixes
error handling. I had chmodded a file to be read-only for testing,
and this is failing on it loudly instead of silently ignoring an error
that I didn't know about! Because it was silenced! That was a bit of a
redundant way of saying that, but better to be heard than be SILENT...!
                                                             *crickets*
2023-05-08 01:33:35 -04:00
Isaiah Odhner
15980dd4c9 Reuse method to open files for --recode-samples
This got LONGER. I hate asyncio.
2023-05-08 01:10:36 -04:00
Isaiah Odhner
fa173963f6 Reuse method to open files from CLI, with in-TUI error handling
Sigh, it didn't even get shorter, because of stupid async shit.
2023-05-08 01:05:46 -04:00
Isaiah Odhner
3af12599dd Hide dotfiles, dotfolders, and backup files in file dialogs 2023-05-07 21:56:50 -04:00
Isaiah Odhner
403e816644 Remove stupid comment
It doesn't help in this context, and it doesn't help give context.
The function is named "go_ahead"!
2023-05-07 21:48:32 -04:00
Isaiah Odhner
fa86f6f5ce Don't discard backup file if you open it for editing 2023-05-07 21:48:32 -04:00
Isaiah Odhner
aa96062f97 Fix confused comment 2023-05-07 18:56:25 -04:00
Isaiah Odhner
51152faca6 Include file path in error messages 2023-05-07 17:03:40 -04:00
Isaiah Odhner
30eb9ba38f Fix confusing error message after opening backup of the active file
The backup of the current file will be deleted just after opening it.
I should probably actually prevent that, but this commit just fixes
an error message thrown up when trying to then open another file.
It said "File not found", but confusingly was not referring to the file
you were trying to open, but rather the currently open file.

Repro test steps:
Open a file (optional), make changes, and wait for backup to be saved;
open the new .ans~ backup file (discarding changes to the main file),
then try to open any file. "File not found" message should not be shown.
2023-05-07 17:03:40 -04:00
Isaiah Odhner
e47c9693b1 DRY handle_button code between Open / Save As 2023-05-07 13:37:27 -04:00
Isaiah Odhner
c2fd1f5dfd Make Open / Save As dialogs' handle_button code more similar
- request_close() instead of close() for Open dialog
- code path structure
- `filename` vs `name`
- `self.content.query_one` vs `self.query_one`
2023-05-07 13:37:27 -04:00
Isaiah Odhner
ad9983ecfe Remove Static() wrappers and disable markup parsing for messages
- This is shorter/cleaner.
- This is less prone to mistaken parentheses placement, although it
  should give a type error to do `Static() + Static()`
- I already disabled markup parsing for two cases where filenames are
  interpolated, but there was still:
  "An unexpected error occurred while reading %1"
  which was liable to misinterpret things as markup.
  Note that anything in square brackets can be treated as markup and
  become hidden, not just recognized tags like [red].
2023-05-07 13:36:32 -04:00
Isaiah Odhner
08cef5e875 Rename parameter that does not have to be a widget 2023-05-07 13:09:34 -04:00
Isaiah Odhner
e3ccb7614c Rename message box helper method 2023-05-07 13:05:55 -04:00
Isaiah Odhner
6c1b458cee Fix warning icon not showing up on subsequent dialogs 2023-05-07 12:55:19 -04:00
Isaiah Odhner
a06cf807e0 Fix immediate closing of dialog opened with Enter
For example, in the Open dialog, typing a filename that doesn't exist,
and then hitting enter, it's supposed to say "File not found", but
if the event isn't prevented/stopped, it will also be handled by
the new dialog, and you won't even see it.
2023-05-07 12:51:10 -04:00
Isaiah Odhner
b4971a0abf DRY Open / Save As dialog window content 2023-05-07 12:41:41 -04:00
Isaiah Odhner
e7b251a1c3 Add label for filename input, instead of using placeholder text 2023-05-07 12:26:55 -04:00
Isaiah Odhner
1a28f5cb49 Focus filename input in file dialogs by default 2023-05-07 12:02:25 -04:00
Isaiah Odhner
302fb628f6 Get absolute path, if only for logging 2023-05-07 11:41:36 -04:00
Isaiah Odhner
162167ef05 Remove filename suggestion for Copy To 2023-05-07 11:36:22 -04:00
Isaiah Odhner
84dc738140 Fix starting directory for Save As dialog
I think the `if self._selected_file_path is None: return` was from
copying from CharacterSelectorDialogWindow and isn't applicable.
(I renamed anything with "character" to "file_path".)
After removing this check, I shouldn't need `or ""` for the Open dialogs
2023-05-07 11:33:48 -04:00
Isaiah Odhner
0c671510a0 Support exporting to multiple formats with Edit > Copy To 2023-05-07 02:07:04 -04:00
Isaiah Odhner
6c76de66bf Discard backup file when restarting the program upon file changes etc. 2023-05-07 01:47:41 -04:00
Isaiah Odhner
f6bff095d6 Fix a theoretical race condition, and simplify
- This fixes a potential race condition where it could auto-save
  to the wrong backup file while the file_path was temporarily
  set to the path attempting to be written to,
  overwriting the backup if it existed, and leaving it behind on close,
  since the file_path would be reverted momentarily.
- save_as() no longer uses save(), so save doesn't need a from_save_as
  parameter to change the error dialog titles, and there's no more
  conceptual awkwardness due to the fact that each function could call
  the other.
- discard_backup() no longer needs an optional parameter, because
  we no longer discard a backup that isn't associated to the current
  document's file_path.
- The "correct thing" is now obvious enough that I don't feel the need
  for the "Don't discard the backup until..." comment.
  (And of course all that todo junk can go, although the Copy To bit
  remains to do.)

It's nice when things Actually Get Simpler!
2023-05-07 01:29:26 -04:00
Isaiah Odhner
ede6ea25b5 Refactor: split out encode_image from save 2023-05-07 01:07:24 -04:00
Isaiah Odhner
8861f4fa2b Add a todo comment about a possible race condition and refactoring 2023-05-07 00:40:47 -04:00
Isaiah Odhner
0d658d4a7f Restore old file path when Save As fails, and don't close the dialog 2023-05-07 00:24:57 -04:00
Isaiah Odhner
e806f25fad Don't discard backup until after file is saved for Save As 2023-05-06 23:51:10 -04:00
Isaiah Odhner
c172adc032 Discard backup file also when doing Save As 2023-05-06 23:40:50 -04:00
Isaiah Odhner
aa915915c8 Add sample art: Clippy
👀
📎
2023-05-06 19:55:46 -04:00
Isaiah Odhner
6bc6e6e305 Add some missing type signatures 2023-05-06 19:21:17 -04:00
Isaiah Odhner
be0285fc45 Use crayon emoji for pencil icon in VS Code 2023-05-06 19:01:30 -04:00
Isaiah Odhner
c86d8c01ae Use bucket emoji for fill tool icon, outside of VS Code
Other terminals may fail, so perhaps I should just stick to the more
reliable emoji, but the bucket is much better as an icon...
2023-05-06 18:56:09 -04:00
Isaiah Odhner
edd1c755e1 Fix type checker error by extracting expression to a variable
I was going to add a type hint, but it seems to have figured it out now.
2023-05-06 18:27:59 -04:00
Isaiah Odhner
b5b302e51f Rename things to avoid ambiguity of term "auto-save"
"Auto-save" can mean saving the actual document you're editing;
in this case it means saving a temporary backup file.
I might even want to introduce auto-saving of the main file later on.
2023-05-06 16:55:58 -04:00
Isaiah Odhner
6b46d99627 Clarify messaging about the backup feature 2023-05-06 16:41:43 -04:00
Isaiah Odhner
35197a8608 Discard backup on Open or New, not just on Exit 2023-05-06 02:02:55 -04:00
Isaiah Odhner
74ffc34de4 Automatically recover from backup file
- Recover from backup file if it exists for the document when loading
  a document via the CLI or TUI, or if it exists for Untitled when
  creating a new document.
- Reorganize CLI arguments handling into passive and active,
  so that the active recovery step can use the passive* backup folder
  option. (*Directories are created if they don't exist.)

Working on automatically recovering the document,
I'm realizing this is more complicated than I thought.
Consider two instances of the app (A and B) editing the same file:

- Make changes in A
- Open same file in B
- A auto-saves after timer
- Close B
- B deletes auto-save when closing
- A doesn't re-create the auto-save unless further changes are made to
  the document, because of the undo tracking, which is basically an
  optimization to avoid writing to the disk all day while idle.

Also, there could be a race condition where it saves over the auto save
before recovering it — potentially — like if the auto save interval
was implemented such that it made an immediate call at the start, or
if some other app code tries to auto save initially.
Or, consider if you:

- Make changes in A
- Open same file in B
- Make changes in B, maybe before it detects the backup file if the disk
  is very slow for some reason, or if you just ignore the prompt.
  (None of the prompts are modal, currently.)

To address these issues, I could add a flag that says whether the
auto save was written, and thus owned by, this session, and make it
not write to a backup file that it didn't create in the current session.
But it still ideally would auto save, just to a different file,
so I could instead have a map of file paths to bools saying whether it's
owned by the app or not and then have a number incremented in the
filename (maybe like `.ans~` and then `.ans~SESSION2~`, including
"SESSION" so it's clear it's not time-based), adding 1 until it's a file
that can be owned by the session when auto saving.
But if an earlier-numbered session closes, you wouldn't want it to leave
a file behind. Either it should delete/rename its backup file to the
earlier number and start saving to that, or it should keep the existing
higher number. I guess if looks at the map first, before checking the
file system, it shouldn't be a problem. It should keep using the higher
number. Would this be a little overkill? Eh, maybe.
2023-05-06 01:27:03 -04:00