-
Notifications
You must be signed in to change notification settings - Fork 8
/
TODO.txt
682 lines (554 loc) · 37.4 KB
/
TODO.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
Targeted for release (0.5):
=================================
- create an ANSI Sequence parser based on the MLTokenizer parser.
- "with Screen()" behavior will change to automatically enable mouse capture and real-time keyboard
- i.e. "with TM.Screen() as sc:" will become equivalent to 0.4 "with TM.Screen() as sc, TM.keyboard, TM.mouse:"
Targeted for minor 0.4 releases:
================================
- bug: ANSI renderer skips empty text lines (breaks terminedia-paint save files) (v)
- improve text-entry widgets: allow edited text size to be larger than editing window, via auto-scroll
- needed for a functional file-selector
- add a textsize kwarg, with default=size. On "None" or numeric, limit the
logical text-entry to that size.
- use an "offset" internal value, keep "value"as a plain string, and
have the properties and operators that currently yield the value
to modify value[self.offset, self.offset + size] only.
- this approach should suffice to avoid delving into the editor inner-guts
- "back" from beggining position and "forward" from last position should scroll text
- try making this work at least with plain vertical text besides normal left-to-right layout.
- implement "begin" and "end" cursor movement behavior
- file-selector widget [WIP] (see bellow)
- More pre-built transformers in the library
- turn-off cursor transformer on out-of-focus widgets (should improve caching)
- change cursor-transform on overwrite mode for big-text to blink[wip]
Targeted for release (0.4):
=================================
(items marked with "v" are completed - kept here to keep track of missing siblings or sub-items)
- [bug] None ended-slices of shapes should work (i.e. screen.data[10:, :]) should work: bug in Rect class
- [bug] StyledText: multiple "moveto" Marks pointing one to another do not chain: only the first one take effect
- [bug] "new_line" marks not working for text-resolutions other than 1. [v]
- [bug] 'add_border' in text planes only working for plane[1] [v]
- [bug] top level ScreenMenu being redrawn everyframe. App gets slugish: [v]
- dirty_rect clear on display shape was not propagating to the sprites shapes [v]
- sprites with "tick" transforms are still always dirty [v]
========================================
[Draw]
- Drawing API fill (floodfill) [v]
[Widgets]
- Editable can handle up-down entry-point movement via keyboard arrows: [wip]
- de-hardcode left-to-right-and-down text layout from text planes, and offer other layout options. examples: [wip]
- left-to-right and down [v]
- S shaped
- up-to-down and right
- spiral shaped
- [future] handle copy-paste
- pointer dependent widgets:
- Widgets:
- Entry: one line text editing [v]
- Text: multiline text editing [v]
- List Selection: (Selector) options-selector [v]
- refactor to generalize layout
- tabular selector (see ScreenMenu) [v]
- Radio box/check box
- Drop down selection
- ScreenMenu [wip]
- Support for arrowkey navigation and <enter> selection
- Support for mouse-click select
- PaletteMenu:
- Allow cells with colors or characters or options be picked by clicking or keyboard navigation
- EditablePaletteMenu:
- Allow user to interactivelly enter contents for the cells
- Advanced Widgets: (develop concurrently with 'cross-widget stateful workflow' widget group bellow)
- palette widget:
- color selection
- character selection
- effect selection
- Gradient editor
- date picker
- "Windows" and "tabs":
- widget grouping and selective display [wip]
- FileSelector widget: [WIP]
- inherit from VBOX and compose several sub-widgets [V]
- fix tab-focus on VBOX widget group
- Populate selector widget with folder contents:[V]
- process folder contents[V]:
- ignore case [V]
- folders first [V]
- indicate which are folders [V]
- filter by file extension
- make folder content-selector reloadable [V]
- on selecting a folder, change file-picker path [V]
- on selecting a file, change file-name in main Entry [v]
- on re-selecting a file, accept selection as FilePicker choice [V]
- main Entry: [v]
- Main Entry value have to be settable [V]
- current-folder entry [V]
- constrain navigation [V]
- implement and enforce options:
- allow new files
- can create folder
- new_folder button:
- launches sub-widget
- pick folder
- allow dynamic filtering by typed filename
- clear filename entry button
- fix visibility of main-entry (currently background changes when it is active)
- add accept and cancel buttons
- Improve responsiviness of "Selector"
- accept more than one keystroke per frame
- don't take several frames to re-rerender
- make fileselector "modal" by default.
- Add a title-line (for the purpose of the file picking)
- ensure text-entries size won 't limit file-navigation
- (currently, text entrys physical size constrains the logical text size)
- Widget tools:
- scrollbar [wip]
- label [v]
- styling:
- widget framing [v]
- styling with context [wip]
- styling with transformers (very likely will work out of the box)
- check viability of CSS-like traversing and selction for widget styling, with context-keywords:
- allow css like declarative styling
- Layout management:
- HBox/VBox filling:
- 'super' widget: elastic box able to contain sub-widgets
- widgets need a "resize" method which triggers an event
- container widgets subscribe to the children resizing
- widgets inside super-widget should hav a tab-focus order of their own
- API: append, prepend, padding, per widget 'gravity' or group 'distribute'
- de-activating have to hide and deactivate all contained widgets
- hbox
- vbox
- scrollable
- might need independent scrollbar
- table (auto combine vbox + hbox):
- fixed cols
- dynamic cols
- cross-widget statefull workflow:
- example: enable implementation of customizable pallet widget as super-widget coupling table + drop-down + buttons
- reactively respond to inner widgets size change ?
- (maybe have a "size" property for all widgets as an "ObservableProperty"?)
- or emit a custom "resize" event?
[mouse-and-events]
- create a reliable way to read information back from stdin with ANSI events
- cursor position
- mouse events (V)
- add an API for event subscribing system [WIP]:
- add minimal event dispatcher system (V)
- if there are events, there should be a "main loop" (currently, one call per frame to Screen.update)
- Add "enable mouse" as a context-manager on "input.py" (V)
- Add "guard-expressions" to event subscriptions, so it is possible to, for example,
subscribe for specific key-presses (or any other simple-test with event attributes) [v]
- way to do "event pump" [v]:
- call "terminedia.events.process [v] # was "currently one does call 'inkey'":
- refactor _posix_inkey to us a separate function to read keystrokes + mouse + ANSI responses as tokens[v]
- create "event pump" call in events to get the events running [v]
- have a keyboard + mouse event subscritpion on the "Screen" object context [v]
- establish a default event-discard policy (by number of ticks? seconds?)
- have the "screen update" call pump the events[v]
- Problem: Konsole does not report mouse position with no buttons pressed (it works on gnome-terminal)
- refactor "inkey" so that tokens in sys.stdin are read in an independent way.[v]
- last frame events can be retrieved without the need to add callbacks.[?]
- simple "cls" [v]
- check if there is a ms-windows equivalent - (yes - have to be hacked in: https://github.com/microsoft/terminal/issues/281)
- Integrate "Observable Properties" into the event system?
(currently used in text.resize, which is triggered by adding a border)
- mouse handling on windows
- make input accept context-parameters, like print does. [v]
- Create a 'double-click' event [V]
[Future - wiget and App branch]:
- add early widgets: (#NB: can be done in another branch than "mouse and events") [wip]
- base (evolve from Sprite - or even add as mixin to sprite) [v]
- button [v]
- text entry [v]
- text area [v]
- radio/checkbox
- menus [wi]
- tab/shift tab based widget focus
- add way for "text" objects to be larger than their parent shapes
- scrollbars
[text-branch]
- Accept friendlier parameter names when constructiong a TM.Mark object. [V]
- (currently all context-attributes hav to be inside an "attributes" dictionary passed as parameter - it should accept keyword parameters for each context attribute)
- make Rich Text markup usable by standalone "terminedia.print" (terminedia.print should work without an underlying shape) [future]:
- parse text, and create a transient shape if markup is used
- test negative Y offsets on transient shape
- render transient shape at cursor position, clipped to generated content extents.
- Consider if the character data in each plane (text_plane.plane dictionary) is worth keeping. consider that:
- static characters are stored there without any attributes
- they are reflected on the owner shape data anyway (keeping the attributes)
- rendering rich text automatically rewrites the shape-data
- written text is stored at the "writtings" object anyway
- create a few ready-to-use transformers using these features to apply gradients, and time (tick) changing visibility, or color offset.
- Add transformers "offset" (or "translate") channel: modify the placement of the given character (without changing "last_pos" on the the caller machinery)
- Allow "offset" parameters to styled text, so that text can move according to tick:
- A subset of the text could be displayed as a "visible window"
- This would allow for text to be printed at the bottom of a text-region
and scroll-up in subsequent frames.
- probably these should be specified as "SpecialMark" objects.
- pad right with"nop" characters
- select a renderable window of text
- allow negative offset;
- Consider merging "SpecialMark" and "Mark" classes. (They are distinguishable by the presence of an ".index" attribute)
- Think of a nice API to make use of TM.text.StyledSequence that is shorter than instantiating one, passing the screen.data.text[1] as text_plane kwarg, and calling "render" on it followed by "screen.update()" :-) (probably changing "print", "at" and "__setitem__" on .text to use it :-) ):[V]
- create an ANSI Sequence parser based on the MLTkenizer parser. [WIP for 0.5]
- Allow parsing mixed markup-and-ansi text and create a unique rich text object that can be rendered.
- Make shape.text alone behave like shape.text[1], with no need for indexing.
- Cache TextPlane size data - it is a property called several times per cell position when rendering, and does a big mess going back to self.root.size
- pickle terminedia.unicode.CHAR_BASE as part of setup.py install (?)
- enable re-shapping of TextPlane or Shape triggering re-flowing of textual content.
- Implement "trans-dimensional-mark" - mechanism to allow text-flow to continue
in another TextPlane object, entirely.
- Connect screen.update to text_planes.update (maybe via sprite re-rendering)
- add support for scrolling and buffer of text areas.
-Do it after "trans-dimensional-marks to ensure text can scroll across several areas (e.g. columns) before falling off the screen
- record the initial position and tick - possibly as the value in TextPlane.writtings
- Allow markup parser to recognize ":emoji_name:" style emojis, using the names and aliases as used by Python-emojis (from Ruby gen emojis):
- include emoji nick/alias information on TM.Unicode.Character information
- Allow character search by emoji nick/alias
- BUG: effects not being suspended upon a [/effect] tag
- BUG: encircled characters not taking two horizontal cells when being rendered.(V):
- ambiguous character (as in unicodedata.east_asian_width(char) == 'A') changed to be of width
- BUG: Transfomer "effect" channel on Sprite not working: suppressing effects altogether.
- BUG: inline [/color] tag closing [color] tag placed as postioned mark on the text-plane.
[WIP]
Implement "big square" 2 block resolution:
make way for 6x3 block core transformers in order to use half-triangle characters
- Document work around for use under windows (WIP)
- Create color-reducing code so that colors (mostly) work
- future: Windows terminal backend bypassing colorama, using full capabilities;
- Fix windows keyboard handling on new- MS terminal (2019)
- Known Issue: the rendering through colorama is super-slow. most animation applications will be just proof of concepts until another way is found.
- Refactor utils.py into proper folder [V]
- Spice up "HookedList" to support slice operations and work seamlesly as a list
- implement "reversed"
- have "remove" and other altering methods to use the cast-hook for proper element matching
(suggestions by Serhiy Storchaka)
- Efficient MutableString/struct container to replace "list" as main data storage [WIP]:
- backed by bytearray
- use abc.MutableSequence for and store utf-32-le data for characters
- slice set/get uses strings
- But how could this be ever faster than lists of one-character strings?? :-(
- temptative:
- abuse slice operations - these should go fast
- change internal read operations to operate on row-chunks
- make image.__getitem__ a special case of getting a single item and move
most of its code to a method that operate on chunks.
- make client methods (draw.blit, text.char_at, backend reading) use the chunky method
Resolve "can't output a lot of things to terminal if stdin set to non blocking" bug on windows
smaller features:
- accept context attributes (color, background, effects) as keyword arguments on all .draw methods [WIP]:
- create the concept of 'pretransformers': transformations
to pixels at writting time in a separate context transformers stack [V]
- Make local contexts default to root context if a value has not been explicitly set
- more important: make thread-local contexts default to values on the main (interactive) thread
so that an event loop can be spawned in interactive mode and use proper context values
- use the same option of suppressing absolute cursor movement for the html backend.
- uniformize "size", "get", "set" and __getitem__ & __setitem__ on screen, shape, high and braille namespaces.
- fix palleted shapes:
- create proper booleanshape (true/false + color) - used by default to render fonts.
- reading with __getitem__ should get back a pixel with the original character, but when blitting, only the color and boolean information should be blitted (color.TRANSPARENT should imply in "False" pixels)
- on drawing, context.char should be respected - and auto-appended to the color_map if not there.
- make emoji's and unicode chars easier to use:
- expose unicodedata databases as plain dictionaries
- enable "debug" flag in root context and display internal information on object's repr based on that
(currently Screen's repr is showing last_pos, last_color, and other internal state attrs by default)
- shape "clear" call:
- optional parameter to reset text information
- Fix in-function imports in place to avoid circular imports so that they only run once per process
- Alias context.foreground to context.color
- bug: html rendering not respecting context colors, on starting empty space characters
- bug: with terminal in relative movement, snake-game is faulty,, suggesting terminal-context bugs
- bug: (may be postponed) - shape.render does not respect shapesviews (slices): the parent shape is rendered instead
Transformers:
- include a variety of ready-to-use and easy to parametrize transformers for:
-applying gradient effects (POC done)
- convolution filters (POC done)
- Mapping that allows key/value pairs to have attached tags
when using the tags in browsing (values, keys), a tag may be specifed
to filter out any pairs that do not have the same tag.
This should be useful for tagging sprites and the event system -
and also for providing a single "transformers library" object
using tags for the transformers categories.
- Refactor Transformers.process so that the setup does not have to be
repeated for each pixel. (an strategy like the used by
StyledText.render will likely be possible):
- create a benchmarking script
- create a two-step process that yields a callback
with the signature of current Transformers.Process
- Write a combining/blending transformer that can contain other transformers:
- blend color information (maybe using more than "normal" blending)
- be able to apply masks and "clips" on the underlying transformers.
- use example: a GradientTransformer can then blend and tint other colors
in the text without one needing to rewrite, or hard code the blending code
in that class.
-Enhance transformers __repr__
Sprites:
- Add Spatial transformation
- Spatial - class embedding a 2D (3X3) transformation matrix with friendly properties
to specify linear transformations in a friendly way.
- Find a way to attach sprites to other than native resolution - so
that a normally rendered sprite, attached to "high" space will be drawn
scaled down, on that space.
create some filters as ready-made transformers (maybe not all for 0.3.0):
- threshold: yield true/false pixels and strip color information
- convert colorred fullblock pixels to "transparent" pixels: keep the existing char, and apply the color as background
- color-value to different unicode-circles
- color-value to different unicode-squares
- linear gradients
- Reactive rendering
- per-backend "fast_render" method: called in place of the "_print" method, takes
a list of rectangles and an image data source - caches color, bg, effects by itself
(HTML Backend missing improvement. Current HTML usage, of pre-rendering a full frame
would not take advantages from this, as there is no way to update
an inner rectangle changing just some pixels from one frame to the next.
Other totally new HTML renderings (e.g. using tables, Canvas, one ID for each character
could benefit from fast_render)
- relative-positioning for ANSI backend (TBD)
- Use data structures to track dirty rectangles in a shape for fast_update =
- have a specialized dirty_registry data structure (V)
- (internaly using a heapfied list - maybe an specializd data structure as a linked list would be better)
- Missing tests for any of dirty-rect tracking features.
- create "FrozenRect" and avoid usage of tuples-as-rects in code.
- Speedup pixel-data retrieving from within shapes:
- use a unique data-structure instead of 4 separate lists for fullshapes:
- speed-up (or skip altogether) Pixel creation for each read.
- fix other low hanging improvements visible with 'python -m profile terminedia-shapes
- ex. avoid in-per-pixel methods use of "imports"
breaking-changes:
- rename unicode effects so that their name matchs their unicode names (at least "super_bold" -> "regional_indicator")
0.5.0:
========
Write some real nice docs, with tutorials and use suggestions
Future
========
- MARKUP: [V]
Accept a markup in all string-printing methods to enable interleaving
context changes during the print:
- Example: "TM.print("Hello [color:red]World[/color][effect:blink]!!!") [V]
- Allow cursor movement commands into the markup [V]
- promote the current side-effect that if "context.char" is set
to a string more than one glyph in length all the string is
placed instead of a single pixel to a full feature, accepting
this markup [V]
- BACKENDS:
- "The One" optmization: (maybe sprint around Christmas 2020)
- Benchmark complex rendering (with 2 more levels of sprites and 4+ levels of transformers + text effects / frame)
- add consistent benchmarking as a script in tools
- then proceed to revamp everything:
- refactor as many pixel by pixel function calls to a way that can be pre-set to a retangular area and then used as a generator:
- Rendering backend: should get a "shape", a rect and a file stream, and usr
a method on the shape to setup pixel yielding for that area, and use a single
"for" block for rendering.
- (final backend rendering method should be contained in a single function, with no extra calls)
- shapes:
- have a method to setup an area, that will, in turn, setup areas in it's text planes, and sprites
- use generator semantics with "send" to the sprites (so that transformers with any kind of transparency
can have their data).
- optimize storage to use arrays instead of lists. (no need to numpy - just arrays of 4 bytes and
a fast way to interpret those as a single UTF-32 unicode codepoint string)
- transformers:
- benchmark to check if this is worth the effort:
- (optional) have a decorator that could work on bytecode level to upgrade a normal function-based transformer
to a generator:
- insert a `pos, pixel, source, ... = yield mydata; char, foreground, background, effects = pixel` line
at the start of the bytecode;
- replace all "return" values for a "bytecode jump" to the line with the "yield".
- since the transformer-generator will be garbage colector once its area-blitting is over,
there is no problem that such a transformer becomes an "infinite size" generator
- text-planes and text-style:
- have blitted text-styles in teh text-plane have the combined (text-plane positional + string positional) Marks in place,
ready to work as a generator for all "full pixels". Updating the shape will trigger the rendering for text planes
- it is possible that this is hard to do for text-planes of more than one block per character (big-text):
if that is the case, just leave big-text rendering as eager (as they work today(, and document that.
- subpixel:
- benchmark to csheck if "de-normalizing" the super-refactored code in there would make some difference. [x]
- (current code is super-geekie but requires 3-level calls to set/reset each subpixel) [x]
- if keeping elegance is a must, evolve a script in tools that will "glue together" the denormalized code inline. [x]
- (or check pymacro) [x]
- pre-render all possible subppixel operations as 2 dicts per subpixel class upon loading, using existing code.
-subsequent calls to set/reset pixels are just a matter of a dict lookup by tuple
- ^^ these optimizations should bring frame performance to a more reasonable value (10s of FPS expected. Currently 5
FPS is something just achiaveable for the most simple of renderings, just affecting an area of the screen).
At this point the bottleneck
should be the terminal emulator program (then check for Kitty and other terminals that intend to be fast)
Image 'screenshot' backend
- including rendering animations as gifs or image-sequences
image backend (pixels are simple color-only boring, image pixels)
postscript backend
.rtf backend
pdf backend
jupyter notebook backend
Fallback terminal to 1-byte color setting for up to 216 colors + 24 grayscale
- ANSI:
- get the color, movement, and effects sequences from terminfo, and use hard-coded common sequences just as fallback. (thanks to Gilles Quenot)
- new "resolution modes":
- double-character (2 blocks - square aspect ratio)
- create a solution equivalent to the ".text[4]" plane selection for resolutions
- 1 block width x 1 block height at arbitrary 1/8 block height position. (use "LOWER ONE EIGHTH BLOCK" and friends)
- 1 block width x 1 block height at arbitrary 1/8 block width position.
- refactor image loading to be able to use super-resolutions for B&W, while keeping color resolution low (Speccy way)
- Update "text-effects" example to fit more effects to come.
- Event system
Allow for CSS like animations, mainloop and callback registration
for events [V]
- need a way to specify animations (preliminary event system alreayd accepts callback by "tick")
- System Font finding and auto-terminal config
- Find a way to find witch unicode-glyphs are available in system-wide fonts
- suggest font-installation
- (or) download free-fonts to terminedia data folder (but how to make the host terminal use them?)
- refactor unicode-translations to include correct information about the characters used, with links back to proper unicode documentation (including the motivation for theis inclusion)
Convolution-dependant effects: [WIP]
- smooth-out corners
- use unicode circles and squares to denote intensity
- conversion to ASCII line-art with "/_\|" chars, and unicode version [WIP]
- conversion to table chars (single and double-frame) [WIP]
- Couple with "find border" filter(?)
"page" abstraction expanding the "shape": including text regions, layers and animation effects
(possibly using sprites)
easy way to pick unicode emojis and glyphs
Enhance color and composition:
alpha channel support for images:
plot with spaces (" ") instead of full-block char, and compose color using background
"combination modes"
add easy color operations (modify RGB or HSL attributes of a given color in an easy way)
Sprites:
create tagging system
and easy tag-based event api
Improving Shape objects:
- Change the internal representation of data in FullShape (if not other shapes) -
- it is absoltely wasteful
- check if Numpy can be used optionally without complicating too much the code (do not force Numpy data - Python arrays, or some ctypes Struct should be preferable) [x]
- Perceived problem - there is no "char array" in stdlib.array. [x]
- instead of numpy or arrays: inner data representation using dicionaries seems enough, and it enables undo steps using chainmap strategy. [v]
- Add Shape public functions to retrieve the raw shape data in ways useful outside of terminedia, other than by rendering (shape.as_string? what about other attributes than chars?)
MS-Windows support (colorama/mscrvt/color reducing)[WIP]
"business" framed-window api for apps
Basic image transform API: resize, rotate, flip.
Table drawing chars drawing API (maybe convert chars with a convolution after block-line art?) [WIP]
Super-high resolution (Unicode vintage charset and "sextant" blocks)[V]
Audio support (pyAudio?)
Image (shape) transform - (rotate, scale).
paint modes to use different characters to denote intensity (back do ascii art):
- already possible via transformers [0.3.0dev0]
unicode circles
unicode squares
Classic ASCII # * . etc
Block-smoothing with half triangle block chars
(use a context "paint mode" to have this supported on all paint operations?)
(use a special "effects" attribute and apply a convolution variant with a transformer?)
"gradients": ways to make easy to create gradually changing colors.
possibly a "painting context" similar to Cairo's, instead
of a plain value for foreground color. Then color
for each pixel could be sourced from a shape, image,
gradient, whatever.
But whatever is done, have ways for it being simpler to
use than cairo's contexts.'
(Hint: already possible on "user side" by using context-transformers)
replicate text-char effects for big-chars
Graph plotting CLI
make terminedia available as a matplotlib backend
alpha emulation using background and color manipulation
gaming framework in general:
(integrate as a backend to "jsbueno/mapengine"?)
sprites
physics engine (minimal, 2D)
animation support
main loop
"main loop":
- event system
- loop dependant 'blink like" animations: cicle colors, characters, text based on timing
space invaders implementation (hint: it would be already feasible - but it is still a "landmark" of the roadmap)
# virtual terminal server-
Advanced terminal handling features
REPL Environment wit bottom lines for python console and upper screen for image (see posix_openpt)
anmating and coloring text output of unaware apps, by creating an internal virtual terminal (posix_openpt)
animating and coloring text output ... monkey patching a subprocess stdin, stdout and stderr.
handle scrolling capabilities and pre-post buffer
terminal agnostic screen commands (terminfo and infocmp to de-hardcode ANSI sequences)
more features
###############
Add text formatting and flowing primitives into ".text" namespace:
method to allow text insertion and flowing inside a shape or ROI
allow center/left/right/justify alignments
Add scrolling, rectangular text regions and flowing text
All-side scrolling and flowing text from one region to the next
(make text.at work with the @ operator?: `sc.text[4] @ (5,2)("hello!")(?)
Find proper API do render 8x16 pixel fonts into 8x8 char "high-resolution" 1/4 block.
Add arbitrary font handling by using PIL to cache rendered chars.
Enable 16 x 8 double and 16 x 16 double width UNSCII fonts.
create a "blit fast path" for value/palette shapes to target (avoid overhead of pixel creation)
make "Alpha" value work for value-shapes.
make "intensity" rendering for values (B&W shapes)
(them proceed to write the different backends.)
- Accept 0-255 or 0-1.0 3 [4] sequences for RGB color [Alpha]
- conversion to 1-byte standard 216 color palette for terminals
- make use of 1byte color on terminal.py
- make main user-facing classes: Shapes, Text, Transformers, Sprites, pickle serializable (and deep-copyable)
Assume `set` method passed to drawing.Drawing can always accept pixels. Simplify workarounds in "image.ShapeApiMixin" and "screen.set_at" to accept pixels. (API breaking - change this before making a release)
Enhance EMOJI and multi-language support:
- handle combining characters properly
- document which terminal applications will have the best emoji experience (check kitty terminal app)
shape and page capabilities:
create full fledged shape with char, fg, bg, effects (WIP - only missing example script):
Add example script using FullShape and transformers(terminedia-text)
create "Page" class: contaning several z-ordered shape or ROIs for text layout
- implement fix at drawing.blit (N/A - blit simply copies CONTINUATION constant normally)
- implement fix at terminal.Commands.print (N/A - 'CONTINUATION' constant never reaches terminal functions)
- [future]:
- check double width chars at UNSCII 16 for proper use at other text scales
- if needed implement the logic above at text[4], [8], etc...
Features and improvements
=========================
fix-paletted-shape-blitting-bug
fix-value-shape-blitting-bug
refactor bezier-curve and ellipse(empty) adaptive code to use same codebase
configure properly and make consistent use of logger
Improve error messages/or silence/ when attempting to write out of Screen/Shape limits
generate documentation
Add missing doc-strings
improvement: API for X-session wide key-repeat tunning with "xset r rate".
(Maybe, in combination with other features, it is even possible to have keydown/keyup emulation)
What is the equivalent API for Win and Mac if any?
Make internal FullShape planes (and maybe other Shapes) specialized containers (they are plain lists): enable direct attribute setting on plane (rename attributes in the process) (maybe trim further down shape class, and make internal planes for shapes, shapes as well?)
create a few ready-made, parametrized transformers for effects like: plane select, color gradients, mask blit,
Update "Context" to use context-locals (async aware) instead of thread-locals
Drawing APIs not respecting ShapeView limits (V)
add "callback" or early event system so that context parameters can be changed after printing a character, or other event.
set up internal state on which terminal program is running, basd on env-vars (so that terminal behaviors bugs can be worked-around)
work on special methods to allow pickle serialization of shapes and maybe screens.
Color class Todo:
Future:
- Add support for gray colors (single int)
- Add support for alpha-component
- Add support for HSV parsing/convertion (V)
HTML-Backend Steps (WIP)
future
------
Hardwire a web-font to display braille characters as pixels (UNSCII?)
Refactor rendering mechanism to speed things up (0.2 sec/frame = 10 times too slow)
Render with a separate CSS block and classes instead of inlining style in all tags.
WSGI compatible server and javascript snippet to enable frame rendering and update
keyboard and mouse event handling on server.
create HTML Canvas output (?)
create SVG output (?)
Add text effects to take advantage of transforms available in HTML/SVG (rotate, rescale, transparency)
Ability to emulate Unix terminal on HTML comonent (posix_openpt)
Full-client-side implementation (using brython or similar)
Bugs
=====
bug: plot example script prints completly bogus values on the y scale.
bug:fix printing of colored double-width characters . (b0rk on konsole) (WIP)
bug: when apple shows up over snake body, it is erased from screen (snake.py) (easy) (external) (hacktober)
bug: Effects.super_script not working for letters 'n' and 'q' - check if there is a suitable custom glyph
bug: Pallette shapes need to be overhauled - currently tests are broken due to reading from it back just yielding "True" and "False"
bug: (big issue): workaround stdout blocking and raising error when in input.keyboard reading mode. [v]
bug: TM.DEFAULT_FG always rendering as White when comming from blitted [transformed] source
bug: terminedia-shapes example has stopped working properly, due to differences in how
whitespace is blitted. To fix: refactor script to use Sprites instead of raw shapes.(V)
bug: TrasnformersContainer.bake breaking with KernelTransformers (and any transforemrs that will use 'source' and 'pos') (V)
bug: terminedia-shapes for colored shapes(shape2) is behaving weird for the first frame, after refactoring how Transparency works with sprites
bug: Screen.data.render yielding strange results for just some text rendered on screen.
bug: Screen.print and Screen.text[1].print - not working, (probably broken by markup usage in text[].at)
bug: several tests failing on pypy3