-
Notifications
You must be signed in to change notification settings - Fork 21
/
Copy pathtodo.org
6794 lines (5517 loc) · 530 KB
/
todo.org
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
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
* Inbox
** TODO edraw-track-dragはマウスでもタッチと同じようにすべきか
タッチはマウスよりも量が多いので処理が遅延した場合に備える処理を入れてある。
([[*タッチのスワイプ(ドラッグ)操作時の遅延によるフリーズを何とかする][タッチのスワイプ(ドラッグ)操作時の遅延によるフリーズを何とかする]])
マウスも同様にすべきだろうか?
** TODO 色/color-pickerの画像更新通知を自動化する
現在は各所でedraw-invalidate-imageを呼び出しているが、これを自動化したい。
モデルに対して何かを設定したらpickerのedraw-invalidate-imageが呼ばれるように。
** TODO 色/UbuntuのEmacs27でC-gでキャンセルできないときがある
色置き換え・挿入コマンドの話。C-gを三回くらい押すとキャンセルできる。
正常にキャンセルできるときもある。
edraw-color-picker--transient-keymapにC-gが無くても同様の現象は起きる。
** TODO touchscreen/アンカーやハンドルを押すのが絶望的に無理
指だと正確に指定できないので無理。
タッチスクリーン時の当たり判定距離をカスタマイズできるようにしたい。
** TODO Androidでcolor-pickerのボタンの文字が表示されない
Arialが無いから? いや、テキスト自体表示できないような気がする。
+edraw-color-picker-font-familyはandroidの時は"Droid Sans Mono"を使用する。+ 効かない。Noto Serifなんかを指定してもダメ。
** TODO Androidでツールバーのグラデーションが正しく表示されていない
なぜだろう。
** TODO touchscreen/長押しでコンテキストメニューを出す
** TODO touchscreen/二本指で拡大縮小スクロール出来るようにする
** TODO touchscreen/ツールバーのボタンが押せない問題の回避策を消す
[[*タッチスクリーンからツールバーのボタンが押せないのを直す][タッチスクリーンからツールバーのボタンが押せないのを直す]]で導入した回避策が edraw-update-toolbar メソッド内にあるが、これを無くしたい。
Android版は大丈夫でWindows版はダメ。何かのバグ? 将来のバージョンで解決されるのを待つしか。
後に<edraw-editor-select-tool-select> <edraw-editor-select-tool-select> <mouse-1> ではなく 単に <edraw-editor-select-tool-select> だけが発生するという現象も見られた。
** TODO touchscreen/track-mouseでup-mouse-1が来ない問題について調べる
track-mouseを使用しているとmouse-motionイベントが来るが、touchscreen-endが来てもup-mouse-1は来ない。少なくともWindowsは。Androidでもそうか調査する。
** TODO 選択ツールで選択図形の色をツールバーから変更できるようにする
選択ツールでは、現在選択中の図形のstrokeとfill色をツールバーに表示する。
それをクリックしたらカラーピッカーが出て、色を指定したら選択中の図形のstrokeやfillが変わるようにする。
[[*設定/ツールバーで色を変えたら選択中の図形も変更する][設定/ツールバーで色を変えたら選択中の図形も変更する]]と関係あるが、選択ツールの挙動のみ変える。他のツールでは引き続きこれから作成する図形の色を指定する。
現在は図形の色を変えるのが面倒くさい。右クリック→設定→塗りなどと選ぶのが面倒くさい(せめて設定がコンテキストメニューの一番上にあれば)。選択してp fを押すのが一番簡単だが、これはマウスで選択してからわざわざマウスから手を離してキーボードを押さなければならない(左手で押せるキーなら問題は少ないが)。
** TODO 任意の図形をハイパーリンクのリンク元に出来るようにする
[[https://github.com/misohena/el-easydraw/issues/35#event-16292261418][feature requst: support insert link to local svg file and can load the file to editor when click the link · Issue #35 · misohena/el-easydraw]]
A要素に対応するのが一番理想的。
ただ、現在の構造ではこれは大変困難。A要素の属性を図形の属性に展開してしまうのが一番簡単。つまり:
- 読み込み時にA要素があったら、それをA要素内の子供達の属性にしてしまう(Unwrap)。入れ子に注意が必要。<a><rect/><a><rect/><a><rect/></a></a><rect/></a>みたいな。
- 書き込み時にA要素で包み直す。
*A要素の属性をどの程度生かすかが問題* :
hrefだけで良いのであれば(特にプロパティエディタの実装が)簡単だけど。
完全に生かすなら要素を丸丸属性にする方が手っ取り早いかもしれない。いや、属性リストだけあれば十分か?
複数の子供の間でA要素を共有するかどうか。例えば <a href="..."><rect.../><rect .../></a>とあった場合に一つ目のrectのリンク先を変えたら二つ目のrectのリンク先も自動的に変わるべきか。これは順番(奥行き)を変えるとややこしいことになるのでやめた方が良い。Unwrapしてしまう以上は下手に共有しない方が良い。
*PATHの書き方問題* : PATHの書き方をカスタマイズしたいという需要は発生するかもしれない。例えば他のorgファイルへリンクを張りたいときに、エクスポートした後のhtmlへリンクすべきか、元のorgファイルへリンクすべきか迷う。orgファイル内の特定の場所へジャンプしたいこともあるかもしれない。
*edraw-editor内での表示方法* : Web上の作図ツールでよく見かける方法は、右上などにジャンプを表す小さな正方形のアイコンを表示すること。最悪コンテキストメニューだけでもいいんだけど。
*edraw-org-link-image-modeでの表示* : 画像の特定の部分をクリックするだけでジャンプできたら便利。image descriptorの:mapでpolyを生成すれば不可能では無い。
** TODO 点接続/図形のコピー・ペースト時に点接続も復元する
** TODO 点接続/アンカーの接着位置をドラッグで変更できるようにする
条件が色々難しい。
UMLクラス図の横線をドラッグで上下に移動させたいのだけど。
** TODO 点接続/OBJPTの点の範囲をAABB内に制限できるようにする
接着先図形の大きさを変えたときに、接着しているアンカーがターゲットの図形から過度に離れないようにしたい。
UMLクラス図の横線が矩形から外に出ないようにしたいのだけど。
** TODO edraw-modeでバッファのmodifiedフラグが立たない :BUG:
保存済みのedraw.svgファイルに対して、プロパティエディタで図形のプロパティを変更してもバッファのmodifiedフラグが立たない。
** TODO テキストのデフォルトフォントをどうするか
現在のsans-serifは可変ピッチなので使いづらい。
昔はこれを指定しないと日本語が表示できなかったので指定したが、今は普通に表示できるようになった。いつからだろう。
** TODO テキストの空白処理によって境界矩形を調整する
text要素のspace属性(xml:space)がpreserveのときは連続する空白を一つにまとめてから境界矩形を作成する。可能であればstyle="white-space:normal"などの場合も考慮できると良い。ただし、librsvg(2.55)はこれに対応していない。
** TODO テキストツールでC-クリックした時にエラーは出さない方が良いかも?
図形が無いところでC-クリックした時に接着対象がないのでエラーが発生する。
debug-on-errorだとバックトレースが出てしまうので少々大げさな気がする。
その他errorを使うかどうかは色々な場所でよく迷う。
何か基準が欲しい。
** TODO edraw-svg-prop-infoに等価判定方法に関する情報を追加する
[[*テキストの装飾(書式・下線や斜体など)を編集できないか][テキストの装飾(書式・下線や斜体など)を編集できないか]]を実装したときに、テキストプロパティも比較するかどうかで困った。
現在はtypeがtextの時だけequal-including-propertiesを使用し、それ以外の時はequalを使用している。
何を使って値を比較するかをプロパティ情報として持たせた方が良い。
** TODO パスに沿った繰り返しパターンを作る一般化された仕組み
[[https://github.com/misohena/el-easydraw/issues/29][Repeated pattern along a path · Issue #29 · misohena/el-easydraw]]
元のパスを破壊せずに新しくパスを作るような仕組み。
パラメータの調整も後から変更できるような仕組み。
Inkscapeのpattern along pathや、もしくはそれ以外に何か仕組みがあると良い。
パスデータフィルターのような物があれば良いのだけど。
正直あまり良い方法が思いつかない。
** TODO shape pickerやらproperty editorやらのコンテキストメニュー改善
他の場所もあったっけ?
キーでコンテキストメニューが開けるようにする。
** TODO メニューマップにオブジェクトをバインドする仕組みを作れないものか
メニューマップにオブジェクトをバインドしたものを生成し、それを通常のメニューインタフェースに渡して、実行させるような仕組みが作れないか。
それが出来ればcontext-menu-functionsと連携が取れる。
popup-menu関数も使える。
** TODO オブジェクトの無効化を通知する専用の仕組みが必要では?
shape、anchor、handleの無効化を検出する一般化された枠組みが必要では?
現在は
- 変更通知で監視する
- 無効化判定関数を呼び出す
という二つの方法がある。
変更通知は通知typeの種類が問題になっている。
shapeに対して点が増えたり減ったりするような操作を増やしたときに、本来ならその操作の種類を直接表現したtypeを使いたいのに、anchor-removeやanchor-transfer-outのような抽象的なtypeを使わなければならない。そもそもこの点の無効化を伝えるというのは意識をしていないと忘れてしまう。
また、on-shape-changedは点接続の更新を伴うので効率が悪くなってしまった。
つまり
- 操作を増やしやすい
- 変化の種類を具体的なものにできるようにする
- それでいて無効化について意識が向くようにする(忘れないようにする)
- 効率が良い
ような仕組みが必要。
** TODO パス編集/相対座標を使用して出力を小さくする
両方の桁数を調べて小さくなる表現を使用する。
整数の時のみにした方が安全。
- M100 100 120 110よりもM100 100l20 10の方が短い。
- M100 100 80 90だとM100 100l-20-10の方が長くなってしまう。
前のコマンドが何かにもよる。全体として何が短くなる表現なのかを決定するのは難しそう。
** TODO パス編集/edraw-path-data-from-dは無効なパラメータをエラーにする
Zの後にL等を付けずに座標を書いてもエラーにならず、何が間違っているのか気がつかない事がある。
「M 1 2 3 4 5 6 Z 7 8」のように書いてサブパスが一つしか作られないおかしい、というように悩んでしまったりする。
Zの消化しきれなかった引数 7 8 をエラーにすべき。
そもそもエラー処理をちゃんとすべきかも。
https://www.w3.org/TR/SVG/paths.html#PathDataErrorHandling によれば、エラーがある場合は、その直前までを有効にレンダリングせよとのこと。それによってユーザーがどこにエラーがあるか分かるからだと。その上で報告もせよと。
** TODO パス編集/アンカーの所属先shapeが変わったときの挙動を改善する
edraw-path.elを書き直したことでSPTアンカーが無効になりにくくなったが、edraw-path-anchorオブジェクトが何らかの操作で別のedraw-path-dataへ無効にならずに移動する(所属替えする)ケースが発生するようになった(edraw-connect、edraw-path-anchor-connectが代表的。他にある?)。そのようなときにSPTを作り直しても良いが、漏れが発生する可能性がある。edraw-path-anchorオブジェクトからedraw-path-dataオブジェクトを(多少線形探索が必要だが)取得できるので、edraw-path-dataオブジェクトに親shapeオブジェクトを持たせれば解決できそう。edraw-shape-point-path-baseがshapeを持たずに、必要なときにanchorやhandleスロットから取得すれば良い。
懸念:
- パフォーマンス。
- path-dataは一貫して同じshapeを指し示すか。swapを使っているので大丈夫なような気がするが、確認する必要がある。
- そもそも必要性があるのかについてもっと調べた方が良い。再取得すれば済むのではないか。現状で変なバグがあるのかどうか。
- この変更によって逆に問題が生じることは無いか。例えば何かの処理の途中で勝手に親shapeが変わってしまうと困るようなこと。あまり思いつかないけど。
** TODO パス編集/パス内のSPT(edraw-shape-point)オブジェクトをキャッシュする
edraw-path-anchorやedraw-path-handleに任意のプロパティを設定できるようにしたので、そこに生成したSPTを持たせることが出来る。そうすれば同じアンカーやハンドルに対して複数のSPTオブジェクトが発生しない。
懸念:
- 逆にメモリを食う結果にならないだろうか。
** TODO パス編集/アンカーの追加・削除のUNDOにd変更を使わないようにする
次のメソッドを実装するとその助けになる。
- edraw-add-anchor-nth
- edraw-remove-anchor-nth
注意:これを実装するとUNDOでアンカーが無効化されないので、無効化されることを期待した場所は動作が変わってしまう。例えばパスツールに何か影響はないか。いや、last-anchorについては結局UNDOで消えればその瞬間無効になってしまうか。
となると無効化させないことに何か意味があるのだろうか。ドラッグ中にプレビューでアンカーを追加して、UNDOしてから元のアンカーに何かするようなケースだろうか。
** TODO ツールバーに表示するツールを減らせるようにする
その代わりメインメニューにツール選択メニューを追加する?
** TODO edraw-read-rectangleはクリックかどうかを判定すべき
閾値以上の動きが無かった場合はクリックと判定し、必ず空の矩形を返す。
一定量以上動いてから小さな矩形を作ることはできるものとする。
クリックイベントを待つことが可能か、それとも自分で移動量を検出するか。
** TODO 図形生成/MathMLを埋め込みたい
MathMLをforeignObject要素で取り込めるらしい。
foreignObjectに対応したedraw-shape-foreignが必要かも。
latex表記をMathMLへ変換する方法があったはず。
- mathtoweb
- [[https://github.com/mathjax/MathJax-node][mathjax/MathJax-node: MathJax for Node]]
- [[https://math.nist.gov/~BMiller/LaTeXML/][LaTeXML A LaTeX to XML/HTML/MathML Converter]]
- pandoc
- [[https://github.com/gvanas/blahtexml][gvanas/blahtexml: Blahtexml]]
(参考:[[https://blog.miz-ar.info/2018/03/latex-math-to-mathml/][LaTeX数式 to MathML を考える | 雑記帳]])
ただ、最大の問題はlibrsvgが対応していないこと。正直対応するとは思えない。
** TODO 図形生成/変形を何で行うかを変更できるようにしたい
latexの場合はtransformで十分だが、グリッドの場合はtransformでやると線が太くなってしまうのでポイントの移動でやりたい。いや、再生成時に動いてしまうな。
** TODO 図形生成/デフォルトプロパティをどうするか
マーカーのデフォルトプロパティに似た仕組みを作る?
いや、図形全体のデフォルトプロパティを、タイプ毎に持たせたい。
** TODO 図形生成/プロパティエディタでgen-typeを変更したら全体を更新する
- optionsの初期化が変わる
- デフォルトのプロパティであれば、内容をそっくり変える必要がある
** TODO 図形生成/再生成時のyes・no確認を減らす
エディタセッションで作った図形や一回許可した生成器は以降確認を取らないようにしたい。とはいえUNDOするとまずいけど。
** TODO 図形生成/C-c C-cで再生成するフィールドを限定する
プロパティエディタでC-c C-cを押したときに再生成が実行される場所をgen-で始まるオプションのフィールド上に限定したい。
(デフォルトの)即時適用であればそれ以外の場所でC-c C-cを押す必要は無いはずだけど、即時適用していなければ色を変えただけでもC-c C-cを押すはずだし、その時に再生成されるのは鬱陶しいはず。
** TODO 図形生成/安全な生成タイプではオプションやソースの変更を即時適用する
([[elisp-function:edraw-gen-grid-safety]]等)<prefix>-safetyが ~'immediately-applicable~ を返すような生成タイプの場合、プロパティエディタでソースやオプションを変更したら即時再生成させたい。
** TODO 図形生成/使用できない生成器を無効化する
無効化できなくても、latexやdvisvgmが入っていない場合は、その旨をユーザーに伝える必要がある。
** TODO グリッド間隔をエディタセッションを跨いで記憶したい
全体のサイズがが6や12の倍数のときに、その画像を開くたびにグリッド間隔を変更するのが面倒くさい。
- Emacsの起動中にグリッド間隔を変数に入れておく(エディタ起動時にそれを使う)
- ちゃんと ~/.emacs.d/edraw-ui-state.config に保存する。
- SVGデータ内に何らかの方法で保存する。
** TODO ポイントの絶対位置移動にキーを割り当てたい
mとか? 空いてる?
アイコンを書くときに困った。
** TODO string-matchを使って字句解析・構文解析をしているところを修正する
- 正規表現を何にでもマッチするようにしておけばマッチ開始位置を調べる必要は無い。文字列の末尾まで探しに行ってしまうことを避けられる。
- match-dataはmatch-beginningよりも大分遅いのでmatch-dataは避けた方が良い。
つまり、次のコードは:
#+begin_src elisp
(when (equal (string-match "foobar" pos) pos) ;;foobarを求めて文字列の末尾まで探しに行ってしまう
....)
#+end_src
次のように置き換えるべき。
#+begin_src elisp
(string-match "\\(foobar\\)\\|" pos) ;;posの位置で必ずマッチする!
(when (match-beginning 1)
....)
#+end_src
[[elisp-function:edraw-css-token]]はこのテクニックを使っている。
[[elisp-library:edraw-dom-svg][edraw-dom-svg.el]]内で[[elisp-function:string-match]]を使っている所は全部調査したい。が、かなり不毛でそれでいて気を使う作業なので難しい。
** TODO 定義要素が参照元要素が削除されても残ってしまう問題
[[*pathを消してもマーカー定義が残ってしまう][pathを消してもマーカー定義が残ってしまう]]の続き。
例えばマーカー(marker-end等)が設定されているpath要素があったとして、それを削除してから edraw-editor-export-to-buffer するとマーカー要素が削除されず残っていることが確認できる(現在は[[elisp-function:edraw-document-svg]]に対策コードがあるので、これをコメントアウトしなければ確認できない)。
これは要素が削除されても要素に設定されたプロパティはそのまま残っており、deftblから参照情報が残り、未参照と判定されたりその上で自動的に削除されたりはしないことが原因。
要素(path)の削除時に参照も取り除けば自動的に定義要素(マーカー)も削除されるのだが、Undoや一時的な取り除き(removeしてすぐinsertするような)の際に元に戻せなくなる問題が生じる。
この問題への対処のために[[elisp-function:edraw-document-svg]]では未参照定義要素を削除している。
本来どうすれば良いのか。案:
- 削除するときに全マーカーのプロパティ値をどこかに保存しつつ、nilに変更。再度追加するときに保存しておいた値に戻す。(グループの場合は子孫に渡ってこの処理を行わなければならない)
保存先:
- edraw-shape-pathに持たせる
- edraw-shapeに持たせる
- 要素の内部属性に持たせる
- 要素のdata属性に持たせる
- ×子要素 →pathは内部にdefsやmarkerを含められない
- ×単にUndoのためだけならUndo情報に持たせれば良い →一時的な付け外しもある
- deleted-deftblという別の場所を用意する (今度はそこに溜まる)
- ×GC的手法。つまりUndo情報などを含めどこからも参照されていないことを検出してから削除する。 →複雑性が上がる。結局しばらくの間は編集中のSVGに定義要素が残る。
おそらく、SVG要素の属性に参照先を作るのに必要な情報を持たせるような仕組みがあれば、この問題の対処に利用できると思う。同時に他の問題にも利用できそう(shape descriptorの欠点を解消するような)。となるとdata属性に特別な形式でマーカー情報などをまるごと持たせる仕組みが望ましい。
** TODO エディタはCtrl+中ボタンを消費すべき
C-down-mouse-2 がfacemenu-menuに割り当てられているので。
スクロールの時によく誤操作してしまう。
** TODO 画像が大きすぎる(viewBoxが大きすぎる)場合は初期拡大率を小さくする
viewBoxのwidthやheightまたはsvg要素のwidth= height=が大きすぎる場合は、初期拡大率を小さくする。起動時や0やv0を押したとき。
** TODO 背景をどこへ合わせるかはデータ毎に持つべき?
今はカスタマイズ変数([[elisp-variable:edraw-editor-background-align]])で指定するが、図毎に持つべきではないか。
data-edraw-background-alignみたいな属性が必要になる。
そこまで必要かは疑問。最悪自分で背景rectを作れば良いんだし。
** TODO インポート/Inkscapeのコネクタに対応する?
簡易的になら対応できそうな気もする。
ただ、IDを参照しているので、それをdata-edraw-idへ変換しなければならない。
結線情報をcontextに保存して、後で一括で処理するくらいか?
** TODO インポート/Inkscapeの行の変換でclassが既に使われていたときの問題
[[elisp-function:edraw-import-svg-convert-attr-inkscape-role]]関数で、tspanのrole="line"のとき、属性をclass="edraw-text-line"へ変換しているが、すでにclassをtspanに設定しているときはどうするか。何か既存のclassを消す仕組みが必要。
** TODO インポート/style属性のSVG属性へ変換の細かい部分を直す
色々問題があるはずだが、全ては分からない。仕様の隅々まで知る必要がある。
気がついたところはコード中に@todoがある。
- [X] [[*CSS/style属性中のat-keywordをスキップする][CSS/style属性中のat-keywordをスキップする]]
- [ ] [[*インポート/style属性に指定されたプロパティの大文字小文字を変換する][インポート/style属性に指定されたプロパティの大文字小文字を変換する]]
- [ ] inheritやauto等といった属性には指定出来ないキーワードがあると思う
- [ ] transformプロパティを変換する
** TODO インポート/style属性に指定されたプロパティの大文字小文字を変換する
[[elisp-function:edraw-import-svg-convert-attr-style]]の@todo部分参照。
[[https://www.w3.org/TR/SVG11/styling.html#CaseSensitivity]]に書かれているとおり、CSSでは基本的に大文字小文字を区別しないのに対し、SVG(XML)では区別する。例えば次のSVGはブラウザでは正しく表示される。(Emacs 29.2 Windows公式ビルド付属のlibrsvgでは正しく表示されない)
#+begin_src html
<svg width="560" height="420" xmlns="http://www.w3.org/2000/svg" version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink">
<rect x="10" y="10" width="540" height="400" style="FILL:BLUE; Stroke-Width: 10px; sTroKe:red;" />
</svg>
#+end_src
どの文字が大文字でどの文字が小文字なのかを正確に知るには[[https://www.w3.org/TR/SVG11/svgdtd.html][Document Type Definition – SVG 1.1 (Second Edition)]]を始め様々な資料を調べる必要があり難しい。最低限、変換対象になっているプロパティ名と、カラーキーワード、テキストに関するキーワードといった、使われているものくらいは処理したい。
** TODO インポート/paint値を検証する
[[https://www.w3.org/TR/SVG2/painting.html#SpecifyingPaint][Painting: Filling, Stroking and Marker Symbols — SVG 2]]
<paint>値に指定出来るのは:
- none
- <url> [none | <color>]?
- <url>は[[https://www.w3.org/TR/SVG2/pservers.html][paint server]]であり、linearGradient, radialGradient, pattern
- <color>
- rgb
- rgba
- hsl
- hsla
- extended color keywords
- currentColor (CSS colorプロパティを参照する)
- context-fill
- context-stroke
一番問題になるのは<url>だが、今のところ放置していてもそれほど害にはならない?
** TODO インポート/マーカーを検証する
要素をそのまま参照するrawタイプのマーカーというのは実装できるだろうか。インポートしたマーカーはrawマーカーとして扱いたい。これはあくまで未対応のマーカーを入れておくための場所で、編集機能は一切提供したくない。マーカーオブジェクトのプロパティにもしたくないが可能だろうか。マーカーを文字列化するときはどうなるだろうか(シェイプピッカーにペーストしたとき? 他には?)。
** TODO インポート/様々な形式からインポートできるようにする
インポーターリストがあるべきかもしれない。
** TODO length値の継承処理が正しいのか確認する
[[elisp-function:edraw-svg-attr-length-or-inherited]]ではdom-attrがnilを返したときに親を見に行くことになっている。空の属性を指定した場合や無効な属性を指定した場合はどうなるのが正しいのだろうか。
- [[https://www.w3.org/TR/SVG2/types.html#syntax][4.2. Attribute syntax - Basic Data Types and Interfaces — SVG 2]]
- [[https://www.w3.org/TR/SVG2/types.html#SVGObjectInitialization][4.3.6. Reflecting an empty initial value - Basic Data Types and Interfaces — SVG 2]]
** TODO image要素のwidthやheightが省略されたときの動作を確認する
widthやheightが指定されていないときは画像の幅や高さになる?
現状ではAABBは0になるけど表示は画像の幅・高さになっているように見える。
** TODO edraw-editorに入力フィルタを設定できるようにする
自己責任で入力SVGを変換できるようにする。
** TODO edraw-get-property-as-lengthは直接edraw-svg-関数を呼び出すべきではない
edraw-get-property-as-length が直接 edraw-svg-attr-length-to-number を呼んでいるが、shapeが要素であることやprop-nameがその属性名であることは保証されていないので、呼び出すべきではないのでは?
** TODO プロパティエディタで単位を維持したままホイール・ドラッグ操作をしたい
数値をホイールやドラッグで変更するとき、単位を維持したい。
+また、プロパティ情報に :to-number という関数があるが、これは廃止したい。+ また、 edraw-svg-elem-prop-to-number にelementとattrを引き渡していない部分をどうするか。おそらくプロパティエディタのホイール・ドラッグ数値変更でしか使っていない。この関数はem、ex、%といった相対指定を処理できない。
** TODO widget/チェックリストの操作で表示が乱れることがある?
edraw-default-shape-properties等のカスタマイズでチェックボックスをON/OFFしたときに関係ない場所が消えることがあるような気がする。例えばrectをOFFにしたらellipseのチェックボックスがrectのチェックボックスと同じ行に来たり。再現の仕方が今ひとつ分からない。
** TODO widget/marker型のshape propertyをカスタマイズできるようにする
edraw-default-shape-propertiesのカスタマイズでmarker-startやmarker-endの値を指定出来るようにする。
edraw-widget.elのedraw-widget-properties-prop-field関数の部分。
** TODO widget/デフォルト値をちゃんと設定する
カスタマイズ時にチェックボックスをONにしたとき、0.0等になるのが使いづらい。
markerWidthとかで。
prop-info-listに:default-valueでも追加する?
** TODO 外部フレーム状態から子フレーム状態へ変更したときに消える?
いや、今やったら大丈夫だな。何か条件がある?
** TODO Ubuntuで子フレーム上のカラーピッカーでドラッグが出来ない原因を探る
edraw-track-draggingでswitch-frameイベントを無視するようにしたら回避できた。
が、なぜ子フレームをクリックするとswitch-frameが来るのかよく分からない。
すでにswitchした後の筈なのにクリックのたびにswitch-frameが来る。
原因が知りたい。
また、今回の回避策には何か弊害は無いだろうか。
** TODO svg要素内にコメントがある場合に生じる問題を調査する
libxml-parse-xml-regionはコメントをcommentという名前の要素として出力する。
認知しない要素はある程度許容するように作ってあるが、一部で問題も起きうるとは思っていた。思いつくだけでも:
- bodyの下の図形数のカウントとUNDO等に使うインデックス値の関係(不用意にコメントを無視すると問題が生じうるので注意)
- 図形の重ね順操作
元々defsが入る可能性は考えていた(が、実際には入らないので落ちなければいいやくらいに思っていた)。commentという要素があるものと考えて、shape関連以外の要素があることを考慮すべき。
** TODO マウスカーソルのちらつきを抑えるためにmouse-faceをもっと抑制する
org-fold-core-styleが'overlaysのときに対応していない。必要?
** TODO エディタ全体を一つのSVGで描いた方がいいのではないか
現在はツールバーをbefore-stringで表示しているが、全てを一つのSVG、一つのdisplayプロパティで表示した方がいいのではないか。
右下にリサイズつまみを表示したい。
SVGの中にSVGを入れ子にすれば不可能では無いはず。マウスの座標もそれに合わせて計算できる。
上にツールバーを表示することさえ出来る。
もちろん分離できるように作っておくに越したことはない。
** TODO 画像ツールで別のディレクトリの画像を指定したときの改善
librsvgの仕様で基準ディレクトリ下以外のファイルは参照できない。
画像ツールで別のディレクトリにある画像を指定した場合は、何らかの対策をしたい。
- エラーで止める。
- 同じディレクトリにコピーするか尋ねる。
- Base64で埋め込む。
現在は一応警告を出すようにしてある。
** TODO SVGのルート直下を直接編集できるようにする
現在は ~<g id="edraw-body">~ 内に限定されている。<svg>直下を直接編集できるようになれば、他のツールで生成したSVGを手直しするのに使える場合もあるかもしれない。svgの中にsvgを入れることが出来るので、不可能では無いはず。
ただし、現在との互換性を維持する必要はあるので、最悪モードを切り替えるような仕組みが必要。
defsもsvgルートの直下にあるので、これを(奥行きの処理などで)適切に無視する必要がある。
SVG読み込み時にルート直下のdefs以外を#edraw-bodyへ移動してしまった方が楽なのかもしれないが。そのような動作をするインポートコマンドを作るという手もある。
** TODO shape毎に変形モードを持たせられるようにする
shape毎にどのような方式で変形するかを決められるように出来たら便利かもしれない。パスやグループ内の座標を維持したい場合は、そのshapeだけtransformプロパティを使うように設定できる。SVG内では ~edraw-data-transform-method=~ のような属性で記録すれば良い。
** TODO 図形にidプロパティを追加する
作成したSVGを他から利用するときに明示的なidが決められると便利だから。
複製するときは削除しなければならない。プロパティとすべきか分からない。
edrawが必要とするidはdata-edraw-idとして既に存在していて、これはユーザーが関与できないエディタ専用のIDという位置づけ。
** TODO グループの子孫を直接編集できるようにする
モード切替等で、#edraw-body直下よりも下の階層にあるshapeを直接選択、操作出来るようにする。
** TODO 点接続/アンカーポイントの接着において循環接着を防止する
図形全体の接着(edraw-glut-to shape dst-shape)についてはすでに[[*点接続/循環接着を防止する][点接続/循環接着を防止する]]で解決した。
必要がある? どのように? 要調査。
アンカーポイント接着の循環の例は[[*点接続/おそらくUNDOで戻らないケースがある][点接続/おそらくUNDOで戻らないケースがある]]にある。
典型的な物:
[[edraw:data=H4sIACszemcAA62S3WoDIRCFX0UmN8nFquO6fyEG2stC6TNs9p9sNezabPL2NbsRQmkplCIjOHKc7xzcjeeGTF1pWwVCcCBt1TWtvR8u770eFbTWnraMTdNEp5CaoWGCc86cFMi5GsbOaAVI8S7YXvpOH7+TYZZlbL6F/W6oCksuCtyc67z/iNGVCqpyyKfgkBfHZjAfugQy2sEcKwXa6ApI3fW9glVd10DYftc8ikx5dfNOuW1Jmds8WNon02kbFEZrB+IsOKNPa77Zvj2/rMOMJxjV9QYeFbcniyjBspKpu1DwmkqayjAlGIZUYiQISk4k9zgLmgddIb8t3wi83xn4K91t1iGThTjwAn7FDnDh9nSbBQ9jTjB1hYJKgRlJY5rwJP4nPp/S73z3WL0hjxfGVCDP5vjCyOXo0sM/xccaV+5D7j8B6pvqndECAAA=]]
[[edraw:data=H4sIAHYyemcAA7WVTWvUQBjHv8owXrZgJvOyyUzKZqHtRQTx5j3ZJLuh26Qksbv1ZIqIICJ6KXrypvZQ/QT9MoPUj+EzeXEX2dLWKiE7ed7y/P4zedhReTRFy4N5Vvp4VlWH27a9WCzIQpC8mNqcUmpDBm5TtpfzNNvflMg8z7ObKEaLNKpmPnZcitEsTqezysfCGEdxUaZ55mNGGB6PinhSoaWPIXLc/F5ZmEY+jqMiWFhhMNmfFvnTLMKorIp8P/ZxlmcxRkk6n/v4XpIkGNnj0XS9KI+O+35RUAVW6zYJIXW5UGGyqlfmWr38HqPm6h1Wx8hXhGpFPmylcFhAFzOmvbmvcAMRJaHE64HDPM0qa5JnGVTARsGR7Ozs7g4YoYgSurX9ePfhoCc2HgSRrTugD1fojLfsjLbwvGU/DKrZdYiDP8i27u8MLNb6ep1ACaofwZYg6SBGXeK6rkRNtxa/PcXr2Xuo21W1zT3EBNtjDiOcDRkYonuQQ+IJ4YLHI5I5ACalCZuVNKvgxHGNUzHiSaUQY5J4joQaBefAhpDqESEoqGMc1HVvlZSDSodQ7injMdphFURy3m4El2ZHzM0ab/fs3Elqs8nOHpMucZQjjAGgZpXElVR2hrryA5WxcGX4zwfj+slQKgxppCa3n4we+T9NBld/PRk92fpk9DrXJoMP6QNFnzSNbj0UVbyser19XpIDUpk+g1rmdmYSHKRzkFMGWWmVcZHCEZtaK8gms7yAQBUUVaP4t2CKxz8uzi7ff9f1B33yWtfnuv6s65e6vtD1259fXl2enzaeN7o+0/UL/fxkZJuXbsba1O6mqOYg3A1cp13n+puuP+r6k67f6frrzRjtKdzwLzf+Be/KG2YNBwAA]]
** TODO 点接続/他に接着されている図形を矢印キーで移動できるようにする
マウスドラッグによる移動は[[*点接続/他に接着されている図形をドラッグで移動できるようにする][点接続/他に接着されている図形をドラッグで移動できるようにする]]で対処した。
他の平行移動コマンドなどはやらなくて良いと思う。
正直必要かどうか疑わしい。必ず先に選択を伴うので、はじめから大本の図形を選択してから移動すれば済む話だから。
** TODO 点接続/プロパティエディタで点接続情報を編集できるようにする
markerみたいにプロパティエディタの中でpoint-connectionのリストを表示してそれぞれのsrcとdstを編集できるようにする。
[[*点接続/テキスト等の接着位置を調整できるようにする][点接続/テキスト等の接着位置を調整できるようにする]]で残った課題。
data-edraw-point-connections 属性に対応するプロパティを追加する。
** TODO 点接続/edraw-removeはshapeを削除する前に点接続を解除する
[[*点接続/グループのREDOでエラーになる][点接続/グループのREDOでエラーになる]]の修正時に気がついた。
現在は edraw-removeの末尾 → (edraw-on-shape-changed shape 'shape-remove) → edraw-update-related-point-connections → edraw-remove-all-point-connection-referrers という流れで自動的に点接続が解除される。
それより、素直にedraw-removeの中からshapeを取り除く前(undo groupの最初)に edraw-remove-all-point-connection-referrers を呼び出した方が良いのではないだろうか。
その方がUNDOするときに、shapeの状態が完全に復元されてから点接続を復元することになるので効率が良いはず。
** TODO 点接続/グループ化・グループ化解除すると点接続が失われてしまう
おそらく一度取り除いてから追加しているからだと思う。
部分的にグループ化される場合もあるので色々面倒。
** TODO 点接続/パスの向きを反転できないのを何とかする
接着されているとパスの向きを反転して矢印を反転させられない。
接着されているのだから当たり前。
とは言えパスを選んで右クリックメニューから「パスの向きを反転」を選んだときに何も起こらないのは良くない。
どうするべきか。
パスの反転と同時に接着先も交換する?
[[edraw:data=H4sIANhljWUAA61VTW/TQBD9K9b2kkr+2LXXX1Ucqb2AUBESFyg3Y68TK4k3Wjt1yi1F4lZB6YE7B7hxRxz4L1iV+BnMemMlTVoElGQde2dnZ96beev0y9OhtphOijJCo6qaHVhWXddm7ZhcDC0bY2yBB1IuB4tJXoxvcyRhGFrtKtLqPK1GEaIUI23E8uGoipBtw+SUiTLnRYSISdCgn7Ks1PI0QiwVcW3IKVinsRgzcdNuYCMWgtdIU6vPVAZid4aHqzQEsswEK5k4ZYfljCXV07jKeYQKXjAAkLP6iC8iZBCsycuWA2mCZc8jpB5O2gcuclZAwHhecaSVleBj1kXJ8skkQnuESBKzuBppgPUxhNMNX0bVfY3q+AXSrEHfUvjuoEWMJBfJhG3xotu06B+ycjUYQIvcj5MCpSWLdltypsK0MDYpWbJjg74APJpyVZ539n9N/mWcjIeCz4v0DiBZlrXJhpubeHqGVvnSuIoNZW4dSEBjHJN1Qm8NJFDIJAKAKVGplMZqHVQkzpR2xELdVygYY2t8bXEkptsAuCS1gyD2fgcgUADgTN0XQSs61QajrGIB6eZi0tvbVdZ+JyWDFemO1+pYgdMGnRnPi8pIeFEATziu8GI47Blk/+DJ0aNex3NfP+xhZepqL6PAOQhck7obX6r7oRne+BwTjHXi4WO7uxPbdHzP9wLfphDOcXRCqenaIXZCHFLfC72uJEomO/XbqVHFFpWsOunK7q2ratuwQzoYcZGMOEh7mqepPIcZB+5l/orJjatpFk/zCUQ6mWsPeDXKEzT48eayWV6143Pz+rI5/9osv1y/A+NFc/7++u3Fz28fm+WHZvmpWX6H374ls61A/ScQkpznKm6+JzFd/ROmTTHdTyTbgtBv0Y0SCSHbmtA995iE0HMvhK77PsZh6FI9tM3Qc2hAsRP4ge/Qv5WBNYQL/sEGvwAOFT1I6QYAAA==]]
** TODO 点接続/複数のサブパスがあるときに正しく接着しないことがある
複数のサブパスがあって、特に閉パスがある場合、末端のアンカー点を接着させようとすると別の点が接着してしまうことがある。
[[edraw:data=H4sIAOlNWGYAA6WUwY7TMBCGX8XyXlgpbuwQuu2qqQQnDt0LF2Bv3sRJrGbtynGbLid64YjEidMegcfgXagEr8E4TsjSbiUklKTJjGfG/2ePO6s3BWpkZssERxOKUSlkUVowIjC2t5WqE1xau7oMw6ZpRs3TkTZFGFFKQ0jFaCNMLbVKMBuxLuFyW0m1fCyNTafTsB3F81km8hrJLMEiM7whzgTvLTdLYf72E0q4MbrByI++9nrHvf2y0wyOlRG1MBvxvF6J1L7iVuoEK60EKJWieaG3CSaMIvdE7sbIiPxNgv3H2/ZDGykU1ONrqzGqrdFL0VfJZVUl+IxRd4HeFbclArFXUDEgF65wcIHigF5jFM5noVd4gouRVJq0Egdg8SFY/I9gzxDcQMb+G8vrQum2zUzvfKVWyUOq0O3afGZAEvKhPvJkRw38NzxdFkavVXZCS57n7WTFwySd3eFuvoxbTrzbBYxB+Q2dxkP+xF1D8R6uc5Be46AwHpRPPApzLgBjlLZa/G4PE6+0VJakWilQBMcADku/d6S23EDRtamenB1v+fmfOKGyo6iu4c8fEXuE43H90rlGjGkwposJDSK6YBENYv8ChEU7dH019pZ79YNjz2fF1h70Aso1INbyHczJ4IS5EMJVWmpoh5bRr9SkWynXPj8+fNrvvv38+OXX/fv97vN+93W/+w6/s9BlQ9sU8MDfx/w35f2mDH8EAAA=]]
[2024-06-05 Wed]edraw-path.elの書き替え後に確認したが現象が再現できない。
** TODO 点接続/形が変わらない図形の変更では点接続を更新しないようにする
無駄なので。
edraw-on-shape-changedに何か形が変わらない変更であることが分かるようなヒントを追加する。
全ての変更時に毎回座標の再計算をすべきではない。幸いedraw-move sptは同じ座標なら何もしないが、それでも変更タイプを見て再計算するか判断すべき。そうは言っても現実にはなかなか難しい。プロパティ値の変更はプロパティの種類によって異なる。edraw-on-shape-changedに形状の変化かどうかのヒントを付けるべき。AABB再計算なんかにも利用できるかもしれない。
実際にはZオーダーや色の変更くらいしか無いと思う。
- ★(edraw-on-shape-changed shape 'shape-z-order)
- ▲(edraw-on-shape-changed shape 'shape-properties)の一部 区別する仕組みが必要
** TODO 点接続/パスのdプロパティが直接変化したときの点接続の削除
edraw-delete-pointでunglueしているが、それ以外の場所で点が削除される場合を考慮していない。
とりあえずedraw-set-propertyで直接書き替えるようなケースが考えられる。
その他にある?
** TODO 点接続/おそらくUNDOで戻らないケースがある
座標をUNDOしたときに接続点が更新されて補正されてしまうので。
循環しているケースは特に怪しい。
循環しているケースは正しい点に移動しないので、戻したときに同じ点に戻らないのでは?
[[edraw:data=H4sIAAtlcWQAA52T7WrCMBSGb6XEPwptmq9+RIyw/Rwdu4baJG3RJdJmVu9+ma5bRQbOAwkk4Zz3OS8nq/5QB0MrXSNAkiIQNKqtGycAI/5wUF3fWiMAhhgEx/ed6QVonNsv43gYBjhQaLs6Jgih2BcC61WnKvd3vaMAfj+dd93udgLMtNYg6F1nt0oAY40CQSsFULIrh2hTVtu6sx9GgiBer+rpk5Unr7cvXfOTPuOcj8Wibwg2Kl1q+/xXQjDM09/IQpIxmE5vihyFzEPK0pXRRXBvW+OiyhrjW/SmeCee5mixfHt+mZe6wlpt+OIq4wtWU5wypC/8j8DiBEFOf4OFOMkgnQYuqMfFBN2o00oSL8/vbmTEXTzMS9IEsqmXHpjmV+6mtGCEhCS/3+CxkVuDZVpqxeXmYWDKKMymdiYhQfza4azACIX0HxMxYt0Cj7NyBo5rv/zPWX8CdUfKFogDAAA=]]
UNDO時には接続の更新を抑制するような仕組みがあればよい。
** TODO 点接続/コネクターツールを追加する
** TODO 点接続/辺からの距離を調整する機能を追加する
** TODO 点接続/接続する位置を角度で設定できるようにする
アンカーポイントをドラッグしたときにOBJDIRに切り替える。
ツール側で行う。
** TODO 点接続/使われていない内部IDを削除する
今のところpoint-connection-referrersが空なら消して良いはず。
** TODO 点接続/正しい位置に移動しない場合がある
次図の一番右。更新の順番の問題?
[[edraw:data=H4sIAMwGg2QAA61VwW6jMBT8FeReEimAbQyBKkRKLpV2u9vzHgk2YJXgCNyS7tfvA4eWhK7URkECkgd+M29mnKya19xqJddFjHyGkVUImRc6Rl735VXUjVRVjIhDkHXcl1UTo0Lrw73rtm3rtJ6j6tylGGMXGqH1qhap/n+/Y4zg+tZfM1mWMbrLsgxZja7Vs4hRpSqBLMljJHidtPYuSZ/zWr1UHFnuepWPHyn+BniHRBfvy++iKBqa2ScSbEAyvWH9rwAvKMOPhOFFCER4ohPbNO3ap56Po1SkPaIoS3loxAXBE3VOaUrhvRTGIhg6pTAZCeBDDRXa3d/MfQRxULLSdqqqCpQCbUHQzWa7nWHHt+Cc3z9tf8wGDvOeRK/p5ww4N2DkBEaMyD2JDrsT/SREMDKDTccOdpkXkiDqEa9RFUKwoF7kRONj+UjDicqfSTDDZvKBxnxCkONA8EREZ7500vdDnklPLlgw78OKC+/OZf2uTwOna33yvu8Ti4LAJx69EpFRgxh+GTBjgUd3fnJ1MLxo6fh4dAT99mOMXpYJxc64gr0v52aQZb7YzGxiagPzaZZY5rOE0GySJUZCZ+mbOFE/cKg/3cw3TdDAxCRIi6O2MgXLsmQvSwD882I9KF1IAOrrjfwLWCREVveunVRpoeoY7SXn5Yf7lFLzO4CN22Dx+unnyu3WnFCGjWOe3gr0EuWGswzJ7Wb5/TCguDmc8Nez/gen7B41yQYAAA==]]
** TODO ドキュメントのトリミング機能を追加する
上下左右にどの程度余白を残すかを指定して、それに合うように切り抜く。
マウスドラッグによる切り抜き機能が既にあるので必要性は低い。
** TODO modifiedフラグの制御を厳密にする
現在次のような問題がある。
- UNDOを考慮していない。
- Previewによる変化でフラグが立ってしまう。
** TODO マニピュレータ機構を追加する
- 選択済みオブジェクトのように機能する。
- 任意のタイミングで一つだけ追加できる。主にツールやコマンドによって追加される。
例:
- 複数オブジェクトが選択されたとき追加され、解除されたときに削除される。
- 変形コマンドが実行されたとき。
- マウスイベントはマニピュレータが優先的に処理する。
- マニピュレータがあるときは選択済みオブジェクト、アンカー、ハンドルは操作できない(?)
ある種のモードなのだろうか。モーダルであるべきか否か。
** TODO edraw-mode/バッファをkillするときに未保存があったら確認する
** TODO edraw-mode/ビューを常にウィンドウサイズに合わせる
やりたいけど実際の所ちょっと重い。環境によっては不安定になる可能性もある?
** TODO 設定/カスタムシェイプツールのデフォルトプロパティ問題
現在はpath要素用のデフォルトプロパティを適用している。
edraw-editor-tool-custom-shapeクラスに対するedraw-shape-type-to-createメソッドを参照。
しかしカスタムシェイプはpath以外のどの図形もあり得る。カスタムシェイプツールで配置した図形がrectだったりellipseだったりすることはあり得る。groupであることも多い。それらに単一のデフォルトプロパティを適用して良いのだろうか。
textが入っていたら当然問題。最悪textだけ特別扱いする方法もある。が、必要だろうか。カスタムシェイプにtextなんて入れることがある?
edraw-default-shape-properties-for-each-tool変数を使えばカスタムシェイプツールだけ独立したデフォルトを持つようにはできる。そうすべき?
それでも一つのデフォルトをいろんな図形種類に適用して良いのかという問題は残る。
** TODO 設定/ツールバーで色を変えたら選択中の図形も変更する
fillやstrokeのデフォルト値(次に作る図形のプロパティ)だけでなく、選択中の図形のプロパティも変更する方が良くあるソフト(Illustratorとか)の挙動。ただし、もしそうするなら設定で従来方式も選べるようにすべき。
ただ、edrawはツールバーの色選択がツールオプションの一つになっているので迷う。rectツールを選んでいるときに、選択しているその他の図形(pathとか)の色を変えてしまうのは何か変。その場合どの図形のデフォルト値を変更すべきだろうか。rectか、それともpathか。
良くあるソフトの挙動は、選択色が種類毎に分かれていない。あくまでツールや図形種類とは別に、現在色がある感じ。
Inkscapeだと設定でツール毎のデフォルト値を使うか、最後に使ったスタイルを使うかが選べる。デフォルトではツール毎のデフォルト値。正直かなり使いづらい。
次のようにするのが良いと思う:
- ツールバーの色選択ボタンをツールから独立させて「現在色」として常時表示する。
- 現在色を変更したとき、基本的には選択している図形のstrokeとfillを変更する。
- strokeとfillが意味を持つツールを選択しているときは、それが作る図形のデフォルト値も変更する。
- strokeとfillが意味を持つツールを選択したとき、現在色はそれが作る図形のデフォルト値に強制的に変わる。例えば、選択ツールで色を変更した後に矩形ツールを選択した場合、現在色は矩形のデフォルト値になり、選択ツールで使った色は失われる(といっても最近使った色で参照できる)。
- strokeとfillが意味を持たないツールを選択したとき、現在色は変更しない。
- 図形を選択しても現在色は変更しない。(理想的には選択した図形の色を現在色(複数異なる色を持つ場合は?を表示)にしてその図形の色を変更できることを分かるようにすべきだが、これをやり出すとキリがないと思う。それこそrectを選択して次のtext色が変わってしまったりする)
** TODO 設定/最後のデフォルト値を次に開いたエディタに引き継ぐ
自動的にui-stateとして保存する。
アプリやユーザー指定のデフォルト値(edraw-default-shape-properties等)に戻す機能も必要。プリセットで戻すか専用の戻す機能を付ける。
** TODO プリセット/プリセット一覧UIを作る
ツールバーにプリセット選択ボタンを追加して、それが押されたら表示する。
また、プロパティエディタから表示しても良い。
- サムネイルの一覧を表示する。図形のサムネイルはとりあえず固定サイズの(保存時の種類の基本)図形とする。将来的にはマーカーも対応する。
- 選択したら、現在のツールのデフォルト値にロードする。
- 右クリックで削除、改名、順序変更出来るようにする。
シェイプピッカーに近い。
** TODO プリセット/セーブするプロパティを限定できるようにする
+プリセットメニューでセーブするプロパティを選択する。次の中から選べるようにする。+
セーブするときに名前を一緒に入力する。
- 全て
- スタイルのみ (subtype=nil)
- 塗りと線のみ (fill, fill-*, stroke, stroke-*) (subtype=nil)
x-popup-menuか番号入力させる。
** TODO プリセット/ロードするプロパティを限定できるようにする
プリセットメニューでロードするプロパティを選択する。次の中から選べるようにする。
- 全て (基本的には使わない。x等がロードされてしまうので)
- スタイルのみ (geometry以外)
- 塗りと線のみ (fill, fill-, stroke, stroke-)
** TODO プリセット/プリセットから一つのプロパティを削除できるようにする
プリセット名とプロパティ名を指定して削除する。
** TODO プリセット/並び替えできるようにする
** TODO プリセット/サブタイプが一致するプリセットのみ一覧に表示できるようにする
** TODO プリセット/サブタイプをnilにして保存できるようにする?
** TODO プリセット/プリセットリストをファイルへ保存できるようにする
** TODO プリセット/プリセットリストをファイルから(追加)読み込めるようにする
** TODO 変形/GUI変形でsを押したときsyのデフォルトがsxにならない
ドキュメントの変形ではsxを入れたらsyのデフォルトはsxになるのに。
↑いや、sは現在の拡大率を変更する操作なので、sxもsyも現在の値がデフォルトになっている。最初はどちらも1.0なので、デフォルトはsxもsyも1.0になる。Sは現在の拡大率に対するさらなる拡大率なのでちゃんとsxに入れた値がsyのデフォルトになる。
不用意にsyのデフォルトをsxにするとsyを無変更に出来なくなる。
何とかするなら、最初のスケーリングの時だけsxをsyに反映させるとか?
** TODO 変形/GUI変形時に代替マウスポインターが消えることがある
Corfuによるinvisibleな子フレームがあると、その上では正しい座標が来なくなる。
~(make-frame-invisible frame t)~ しただけでは完全には消えていないらしい。
幸いドラッグ中は問題ない。
frame上の座標から無理矢理変換してくれば対応できないことも無いかもしれないが難しい。
edraw-color-picker-insert-color等の子フレームは(-1000,-1000)へ飛ばすことで回避した。
** TODO 変形/GUI変形内でUNDOできるようにする
確定する前の調整段階で一つ前の設定に戻りたい場合が良くある。
間違えるたびにGUI変形を中断して最初からやり直さなければならない。
** TODO 変形/ローカル座標系変形機能を追加する
図形のtransformプロパティ適用前の座標系で、平行移動、伸縮、回転できるようにする。
transform-methodのような設定を追加すべきか、あるいは、コマンドを追加したり、コマンド内でのオプションにするか。
** TODO 変形/変形方式の設定方法を変える
メニューのあちこちに同じ設定に対する項目があるのは何かおかしい。
それらメニュー項目にある変形だけでなく、アンカーポイントのドラッグによる変形にも影響がある。
かといってどうしたら使い勝手が良いのかよく分からない。
メインメニューの直下に独立してあるべき?
** TODO 変形/変形方式にanchor points優先オートを追加する
現状ではtransform-methodが'autoの場合、transformプロパティが存在していたら一律transformプロパティに追加する形で変形する。
rect等(edraw-shape-with-rect-boundaryを継承したクラス)では回転にtransformが必要で、textではスケーリングにもtransformが必要なので、そのためにtransformを使うのは仕方が無い。
しかしtransformが設定されていても、transformを使わずに平行移動はできる。rect等の場合はスケーリングもできる。
** TODO 変形/変形時のtransformプロパティ使用を最小化すべきか考える
rect, ellipse, circle, imageは回転以外であればtransformを使う必要は無い。
textは回転とスケーリング以外(平行移動のみ)であればtransformを使う必要は無い。
edraw-transformメソッドは回転成分(textの場合はスケーリング成分も)にのみtransformプロパティを使用し、平行移動はxやyの移動によって表現すべきだろうか。
すでにtransformプロパティが使用されていても、平行移動はxやyを移動することで実現すべきだろうか。
scaleが0のときを考慮に入れるべきだろうか。
** TODO 変形/左右上下反転コマンドを追加する
ドキュメント全体と選択図形と図形単体で。
-1倍しても良いけど、簡単に反転できると良い。
dtfh dtfvとか?
要らないかも。
** TODO 変形/skewに対応する
interactive-transformにおいては、skew-h-angle, skew-v-angleを追加して対応する。
hとvは対等。
回転の前にskewする。
指定出来るのは-90~90度。ただし、hとvの合計が90度になると直線状になる。
** TODO 変形/GUI変形を一時キーマップか編集ツールにする
read-eventループだとキー割り当てをカスタマイズできない。
問題は変形中に他のコマンドから状態を変えられてしまうこと。
対処方法案:
- 防止する。
- 検出し追従する。
- 検出し中断する。
mouse.el内のmouse-drag-lineではset-transient-mapを使っている。一時マップが終わるときにtrack-mouseを戻している。
** TODO 変形/matrix以外のtransformプロパティを正しく保持する
現在は何でもmatrixに変換してしまうので、指定しづらかったり精度が失われてしまう。
また、プロパティエディタのUIも、markerのようにサブ項目が操作できればなお良い。
横の拡大率だけ入力したいのに、現状だとそれは行列の意味を知っていないと難しい。
** TODO 変形/CSSのtransformプロパティに対応する
スタイルシートを考慮すべき。style属性からでも変形できるので、様々な場面でそれを考慮すべき。
先にstyle属性の解析を補助する仕組みが必要。
その上で、大枠は既にedraw-svg-css-transform-to-matrixに用意してある。
ただし、色々と改善点は多い。
** TODO 変形/接着されている図形のGUI変形で枠線が図とずれる
接着されている図形の変形を禁止しても良いが、枠線を接着された位置に合わせても良い。
** TODO 座標を表示する機能を追加する
何らかの方法で座標が知りたい場合がある。
問題はEmacsではモーションイベントを積極的に使いづらい所。
[2024-05-26 Sun]追記:選択ツールにおいてクリックした座標を必ず表示するようにしたので、一応要望は叶えられた。
後は座標調査用の専用コマンドを追加するかどうか。必要性:
- 選択ツールでクリックすると間違えて移動してしまったりする (誤操作に気がつくようにすれば済む)
- 図形の中では範囲選択が出来ない (一応一時的な不反応状態にできるが沢山図形が重なっていたらやりづらい)
ので、専用のコマンドがあった方が良いのではないか。しかしおそらくあっても使わないだろうなぁ。
専用コマンドであれば、クリックしなくても座標を表示することが出来る。
** TODO 図形の範囲が空になった時の問題を調べる
- [[*テキスト/空のテキストにまつわる問題][テキスト/空のテキストにまつわる問題]]
- [[*パス編集/1点だけのパスにまつわる問題を修正する][パス編集/1点だけのパスにまつわる問題を修正する]]
- [[*パス編集/空のパスをどうするか][パス編集/空のパスをどうするか]]
- rect、ellipse、image、generator、groupについても調べる
** TODO テキスト/M-o sでスタイル設定時に色指定はカラーピッカーを使う
fillやstrokeプロパティの設定はカラーピッカーによって行う。
ネックはelispファイルの依存関係。edraw-svg-dom.elからカラーピッカーを正しく使うのはなかなか骨が折れる。image-scale(これはミニバッファで使う分にはあまり問題ない?)やrecent-colorsについて考える必要がある。
** TODO テキスト/行送り量を行内の最大font-sizeに基づいて決定する
leadingを設定できるようにしてしまったのが悔やまれる。
やはりline-spaceを設定できるようにしたいが。
** TODO テキスト/スタイルシートを考慮する
テキストの様々な設定はstyle属性でも設定できる。正しい境界矩形を計算するには、style属性も考慮しなければならない。
またその際親からの継承も考慮すべき。これはstyleに限らないが。
** TODO テキスト/複数行になるとtext-decorationが機能しない
[[edraw:data=H4sIAHUN/WQAA42Sv07DMBDGX8U65jZ/ytBWTVeegTEkTmI1tSvHbVKmumJrF4RAQmKgC6AysCIGXsaV6GNwSaMKIaAMsXK6u+/73dm9bBKTYpjyzINEqVHXsvI8b+atppCx5dq2bWEF7Eq6Rcr44KdCp9PpWFUWSM5ClXjQattAEsriRHnguBhMqMyY4Bg1Hej3JA0UKTzAzLQ6f21koQc0lH7eOPODQSzFmIdAMiXFgHrABadAIpamHhxFUQTE6vfir00inKKfooUi5dEIaSCkryoWlKISwWlFcYxuiFSa1oKu68Kuy+dBIqQHmfKlwrzgqpGxcyRw2nUY+UOWoszpmJwIlbAA+kZfmfnS6JfN62y7wp97oy+NfjT61szmPauUrtkOOf7F/j+acsT2fkS0zUY+J0HqZ3j9lfxOrc5v3pYV8rPRazNfGP2EvGXLoU4SopFDh+X4a6PvjF58gzd6+XGx2j7cGH1d7ed9v5CdQb0YK8YPX2D/E5VqM5upAgAA]]
※エクスポートすると両方ともアンダーラインが引かれるのでlibrsvgのバグ?
** TODO テキスト/テキストに関する設定がもっと欲しい
** TODO テキスト/より良いテキストサイズの推測
Emacsの window-text-pixel-size で比率を求めてはどうか。
#+begin_src elisp
(let ((string (propertize "abcdefghijklmnopqrstuvwxyz"
'face
'(:family "Arial" :width "normal" :height 100))))
;; From string-pixel-width implementation
(with-current-buffer (get-buffer-create " *string-pixel-width*")
;; `display-line-numbers-mode' is enabled in internal buffers
;; that breaks width calculation, so need to disable (bug#59311)
(when (bound-and-true-p display-line-numbers-mode)
(display-line-numbers-mode -1))
(setq-local line-spacing 0)
(delete-region (point-min) (point-max))
(insert string)
(buffer-text-pixel-size nil nil t)))
#+end_src
** TODO テキスト/テキスト関連プロパティを出来るだけ考慮する
- [[https://triple-underscore.github.io/SVG11/text.html#TextLayout][テキスト – SVG 1.1 (第2版)]]
- [[https://www.w3.org/TR/SVG2/text.html][Text — SVG 2]]
- rotate
- inline-size
- shape-inside
- shape-subtract
- shape-padding
- shape-margin
- line-height
- dominant-baseline
- alignment-baseline
- baseline-shift
etc
** TODO テキスト/textPathに対応する
** TODO テキスト/空のテキストにまつわる問題
[[edraw:data=H4sIAAT7V2YAA6WQUU7EIBCGr0LG5xZa3Y3dlN6lFkpJKxjApetbu8nGRN88hvEAXkcuIu1q4oM+mWGGEP7vn8mUdi+Ql8x1FPJrAqjjUnSOQkbiY7wdlKXQOXe3w9h7n/rLVBuBc0IIjiigPTdWahWBNPsCduMgVf8blhVFgddfqErDG4dGCrHPYa1/jiEZBc5M7ZObuumF0feKAbLO6J5TUFpxQK0cBgoXbdsCwlUpfkKaHWI/x0f3LcvIEpHSyiVWPkSbbAtokSS1ajptKFhXG7fOtl1Wcb7wf3yuNqvPJofq4/QSpvN5DcdTmN/C/B6Oj2F6DtMc5qcSLyZViUXMuOnqE3lcxBSqAQAA]]
- GUI変形の時に出る拡大率がおかしいような?
** TODO マーカー/マーカー選択ダイアログを作る
edraw-marker-pickerを作成する。メニューの代わりに使用できるようにする。
child-frameで表示する。出来なければメニューで十分だと思う。
** TODO マーカー/自動的に方向を調整する
参照点を矢印先端(refX=0, refY=0)にしつつ、矢印の末尾が線上を通るようにマーカーを回転させる。
[[edraw:data=H4sIABEidmcAA91UTY+bMBD9K6PJZSsFsCGhZIWR2l566aWXtkd3MR8KsdHghOy/rzFEySq7qva6AiP7eT7emxmRD6cazodODwIba/vHKBrHMRyT0FAdxYyxyFngbPJ47lq9f82Q73a7yN8ijG1pG4FJxhAa1daNFRhv3OGkaGiNFshDjkVeqmqAthSoSpJjMB0depC0V/QSD1hgeqUDSWRGhNnk15yGM3ZBvi/JPNSTGhSd1JehV0/2p7StEaiNVo5Hq8av5iww2DKYlnMA70Sq+i1w3vzxG0Ot0i6mPFqDMFgyeyVwxdn0XIBgkcwRqrbrljxF3kvbgBPyI0jXQQJs7dKl6wTBktRDZeggkIyVVj3wjH1CiIo8mrW8UQj+wQpxKziaJqDIybGEs8/57L9vztO1NH/l074mc9TlldoscaaxqqrKJ6tvnUz5fOE2cwgGK8lFP1L3sHp9+lyTJh0pg4x92zBwr2sdxAwSNmEvhP+vTLHn5AncXdy53sZdKPDUc+DxTGLq3sTCwdfAizKlyztd/F7XNgu3wDdZ+HkL6RLp3YKi2i331yj+AZqQGu5dBAAA]]
問題:
- 計算方法 : 線の端点から一定距離を最初に超えた場所を探す
- 見つからない場合がある
- 適切ではない場合がある
- 更新タイミング
- 通過点指定方法 : マーカータイププロパティで指定する
- 中空抜き色 : これだけやっても、中空菱形や中空三角形などでは問題が生じる
** TODO パス編集/空のパスをどうするか
現在までに見つかっている問題:
- C-tで変形しようとするとエラーが出る
: Error running timer ‘edraw-update-image-on-timer’: (wrong-type-argument number-or-marker-p nil)
: *: Wrong type argument: number-or-marker-p, nil
** TODO パス編集/1点だけのパスにまつわる問題を修正する
1点だけのパスにはいくつか不具合がある。
[[edraw:data=H4sIAOb5V2YAA3WRvU6EQBDHX2Uz12gi7MJ5JFxYEu3tfAE8FtiAu5dlPTg7MLHQwsLe1sLCVgtfRuLXW7iAJBaa/Uhm5vf/z042KDcpqk8LUVLItF4vMa6qyq7mtlQpdgkh2BAwIsu64CL/C3R838dDFVDFY51RmO8TQBnjaaYpOK4JNkyVXAoT2Q6EgWIrjWoKprId7n+FPKbAYhVV1km0ylMlz0QMqNRK5oyCkIIBSnhRUJglSQIIh0H6WyTjrem3jnSGTPLII3semRSjevKaOaRfU8L6eZI7eGpW66nPxCVSaKvk50breIB6xIrEKpOKQqkjpYfhFoY0ky5cCF8vb7tm3A/OR/vcNW3XXu8cHxx2zf1X8/R+dfd28/h58bIb4N4tDHBqjvmE8BuXw9SCrAEAAA==]]
- マウスで選択出来ない
- 「この点でパスを分割」が選べてしまう (エラーも出ない)
- 「滑らかにする」が選べてしまう (エラーも出ない)
- 「点を削除」が選べてしまう (実際に消えるが、空のパスが出来てしまう)
- (コンテキストメニューを出して)「パスの向きを反転」が選べてしまう (エラーも出ない)
- (コンテキストメニューを出してパス全体の)「滑らかにする」が選べてしまう (エラーも出ない)
** TODO パス編集/Aコマンドがあると編集中にエラーが発生するのを直す
クリックしようとすると「Unsupported path command found」というエラーが発生する。
** TODO パス編集/アンカーポイントの複数選択・移動機能を追加する
図形を調整するときに無いと不便。
** TODO パス編集/一つのサブパスだけドラッグで選択・移動できるようにする
** TODO パス編集/pathはできるだけd全体をUNDOしないようにする
「@todo Avoid using edraw-push-undo-path-d-change?」の部分。
d全体をUNDOデータにすると実際にアンドゥしたときに全てのポイントが無効になり、選択状態を全て解除しなければならなくなるなどの弊害がある。
例えばポイントを追加したら、ポイントを削除するUNDOデータを登録すれば済むはず。ポイントの識別はインデックス番号で十分。
注意点:
- 選択状態の追跡部分は注意が必要。現在のedraw-on-selected-shape-changedは shape-path-data タイプの変更で deselectしているので。点を削除したら点をdeselectしなければならないはず。
- パスデータはLからCへ暗黙的に変換される場合がある。これが行われるとインデックス番号がずれてしまう場合がある。そもそもCからLにはどうやっても戻らないのでデータも戻らない。結局dを戻した方が簡単かもしれない。
[2023-05-30 Tue]追記:
[[elisp-function:edraw-create-forward-handle]]と[[elisp-function:edraw-create-backward-handle]]はできればUNDOでポイントが無効にならないようにしたい。なぜなら、ハンドルをドラッグするときに使用しており、UNDOで無効になるせいで再取得を余儀なくされているから(see: [[elisp-function:edraw-drag-handle-on-click-anchor]]、edraw-on-down-mouse-1(edraw-editor-tool-path)。
** TODO パス編集/UNDOしたときに開パスの外側のハンドルが失われるのを何とかする
(従来は-forward-handle-pointが失われていたが、edraw-path.elの書き換えで少し状況が変わった)
edraw-move-nth-pointで指定indexのポイントが見つかれない問題として表面化する。
ドラッグでアンカーを追加したときに((edraw-on-down-mouse-1 ((tool edraw-editor-tool-path)...)...)で)、次が呼ばれる。
- edraw-add-anchor-point
- edraw-create-forward-handle
- edraw-create-backward-handle
- edraw-move-with-opposite-handle-symmetry-on-transformed
もう一度同じようにアンカーを追加したとして
- edraw-add-anchor-point
- edraw-create-forward-handle
- edraw-create-backward-handle
- edraw-move-with-opposite-handle-symmetry-on-transformed
これをUNDOして、もう一回UNDOしたときに、1回目のedraw-move-with-opposite-handle-symmetry-on-transformedに対するUNDOは正しく動作しない。2回目のedraw-add-anchor-pointに対するUNDOはdを復元するが-forward-handle-pointまでは復元しないから、-forward-handle-pointに対する移動をUNDOできない。
現在はedraw-move-nth-pointで見つからなかったときに単に無視している。
dプロパティを復元する方式だとどうしても-forward-handle-pointは戻らない。
現状次の三つは全てUNDOでdを復元する。
- edraw-add-anchor-point
- edraw-create-forward-handle
- edraw-create-backward-handle
なので、これらをdプロパティUNDOをしないように改変すれば良い。
しかし話はそれほど簡単では無く、LをCに暗黙的に変換してしまう問題にも対処しなければならない。ちゃんとLに戻さないと番号がずれるしパスデータも変わってしまう。ちゃんとできるならポイントオブジェクトが無効にならないので良い。
それが出来ないならd復元時に-forward-handle-pointも復元するのが良いかもしれない。
edraw-push-undo-propertiesでdを保存するときに追加の処理を入れる感じ。
edraw-set-propertiesで復元するのでは無く、専用のシリアライズデータ形式で保存・復元したらどうか。そうすれば数値の文字列化による誤差も回避できる。
[2024-06-05 Wed]edraw-path.elを書き替えたので状況が少し変わったが、問題は残っている。結局d属性直接変更が行われると開パス端点(endpoint)の外側のハンドルは失われる。これは最終的にSVGとしてセーブ・ロードしたときに失われるのは避けがたい。独自のdata属性に記録すれば出来なくは無いけど。編集中については、引き続き地道にdを復元するUNDOを減らしていくしかない。書き換えによってそれが大分やりやすくなった。
** TODO パス編集/パスなどの辺をドラッグできるようにする?
** TODO パス編集/既存パスからの継続は選択中のパスに限定しない方が良い?
** TODO パス編集/パスの始点を移動しようとして閉じてしまうミスを防げないか
** TODO パス編集/サブパスを閉じたり開いたりするコマンドを追加する
理想的にはクリックした場所のサブパスを特定して、それに対して操作する。
出来なければアンカーポイントに対する操作でも仕方が無いけど。
パスツールのクリックで閉じられれば必要性は薄い。
開く方はサブパス分割コマンドで出来る。
** TODO パス編集/パスを滑らかにするコマンドの閉パス +や複数サブパス+ への対応
[[elisp-function:edraw-make-smooth]]
閉パスに対して実行すると開パスに変わってしまう。
複数サブパスにも対応していない。
[2024-06-12 Wed]複数サブパスに対応した。閉パスにも一応対応したが、閉じている点が滑らかにならない。要改善。
正直滑らかにするという目的ならば、全アンカーに個別に「滑らかにする」を適用した方が妥当な気もする。
複数の方式を切り替えられるようにすべき?
** TODO 新しいshape-typeを追加したときの問題を修正する
- edraw-shape-descriptor-from-svg-element-without-editor ::
直接edraw-svg-element-get-propertyを使うべきでは無い。
[[*gタグのshape descriptor変換についての問題][gタグのshape descriptor変換についての問題]]も関係あるかも。
その他にも何かあるかもしれない。直接DOMを操作しているところは怪しい。
** TODO gタグのshape descriptor変換についての問題
edraw-shape-descriptor-from-svg-element-without-editor関数にgタグに特化した処理がある。子孫の要素を再帰的にshape descriptorへ変換するためのもの。ここはこれでいいのだろうか。
将来的に <g data-edraw-type="edraw-complex-shape">...</g> のようなものを作るかもしれない。その際に子孫をshape descriptorとして保存する必要があるのだろうか。 edraw-shape-types の :create-element やその後にプロパティ設定で子孫の内容を生成すべきなんじゃないだろうか。
このshape descriptorにするところは問題ないのかもしれない。しかし、shape descriptorからshapeオブジェクトを作るところ(edraw-shape-from-shape-descriptor)では問題が生じる。子孫に対してもshapeオブジェクトを生成してしまう。
gタイプのみ子孫をshape descriptorに入れるべきで、それ以外では入れるべきでは無いのだろうか。しかし、Shape Pickerに登録したときに絵が出てこなくなってしまう。
子孫に対してオブジェクトを生成してしまうことが問題であれば、そうしないように生成することも出来なくはない。edraw-shape-typesに子孫展開の抑止フラグを追加するとか。
また、Shape Pickerが問題なのであれば、基本的にSVG文字列で処理すれば良いだけのような気もする。しかしコピーしたときはshape descriptorなのでその時点で情報が落ちてしまったらどうしようもない。
そもそもshape-descriptorという仕組みがあまり良くなかったのかもしれない。全図形はSVG文字列との相互変換が出来ることが前提なのだから、それで十分だったのかもしれない。
とりあえず ~(eq (dom-tag element) 'g)~ から (~(eq (edraw-shape-type-from-element element) 'g)~ へ変更しておいた。新しい図形タイプでg要素を使い、再帰的に処理したい場合は、何か対策をする。
** TODO shape-descriptorの不要な属性を削除する
あまりに冗長なので。デフォルトで埋めないので大丈夫だとは思うけど要確認。
** TODO テキストエディタでSVGを直接編集できるようにする
最終手段用。
中身の無いgを選択して消す方法が無いので(中身の無いgを消す機能があっても良いけど)。
非グラフィカル環境でリンクの中身を書き替えるのにも使えるかも。
edrawリンクのdata-file相互変換機能があれば十分かも? dataリンクをfileリンクに変換してファイルを編集しdataリンクに戻せば良い。
** TODO 見えない要素を一括で消す機能を追加する
中身の無いgを消すのは困難。「次のshape」を使えば出来ないことは無いけど。
同様に中身の無いpathも消したい。
その他の形状は迷うところ。一応座標があるので選択は出来る。
** TODO グラデーションエディタを作る
** TODO edraw-svg-printは本物のtopやcommentという名前のタグがあったら困る
本当にtopやcommentという名前を持つタグがSVGに追加されたら困るという話。
まぁ、仕方ないよね。どちらかと言えばlibxml-parseの問題。
ただ、topの方は関数を分ければ対処可能。ルートがtopかsvgと分かっている場所は専用の関数を呼ぶべき。もしくはトップ以外と分かっているところはedraw-svg-print-nodeみたいにするか。
edraw-svg-printの意味がちょっと曖昧になっている。svg要素をprintする関数なのか、汎用的なSVG仕様定義要素をprintする関数なのか。現在は再帰で呼び出しているのだから後者と考えざるを得ない。でも後者ならtopを特別扱いするのは良くない。
** TODO 色/古い色を新しい色の下に表示する
プロパティの現在の色(つまりinitial-color)とカラーピッカー内で選択中の色を並べて表示したい。
両者の間には境界線が無い方が良い?
** TODO 色/カラーピッカー外のクリックでまた開かないようにしたい
色置き換え・挿入コマンド使用時、ピッカーの外をクリックした時に、その場所でまた開かないようにしたい。downイベントで閉じてclickイベントで開いてしまう。
** TODO 色/color-syntax-systemのフォールバック機構
Custom-mode内からCSSの色をカラーピッカーで指定したい場合もあるのではないか。
customize-variableからのedraw関連の設定などは特にCustom-modeバッファ内でCSSの色を指定する機会があるはず(まぁ、専用のwidgetを使えば良いんだけど)。
そうなると、フォールバック的に他のsyntax-systemも試すような仕組みが必要ではないだろうか。
** TODO 色/edraw-color-syntax-serializeのoptionsを改善する
様々な形式を指定出来るようにする。もしくは元々の表記をより反映する。
- 細かい書式の改善
- [X] alphaが1未満の時にHEXよりもrgbaを優先する(#RRGGBBAAはCSS4からなので)
- 既存の関数名をできるだけ維持するオプション
- 桁数のカスタマイズ => これは完全にやるのは案外大変
- すでに書いてある数字の桁数を真似るべきだろうか。hexではやっている。
- hexの大文字小文字維持
- 関数名の大文字小文字維持
- ファイル毎の自動デフォルト形式判定(どの書き方が一番多いか)
- 設定方法の改善
** TODO 色/カラーピッカーのZ軸を切り替えられるようにする
現在はZ軸が色相だが、彩度、明度、赤、緑、青に切り替えられるようにする。X-Y平面もそれに合わせて残りが割り当てられる。
メニューに項目を追加する。
** TODO 色/別の表色系のカラーピッカーを追加する
HSL、HWBのカラーピッカーに切り替えられるようにする。
** TODO 色/CSSのcolor()色関数に対応する
[[elisp-variable:edraw-color-css-functions]]の未実装部分を埋める。
これによってcss-mode等で当該関数表記をカラーピッカーで置換できるようになる。
変換方法は https://www.w3.org/TR/css-color-4/#color-conversion-code にコードが載っている。
color.elにも使えそうな関数がある。
場合によってはこれまでに実装した部分にも手を入れる必要があるかもしれない。argsの取扱部分について。color()はパッと見で引数がこれまでと違うみたいなので(?)。
** TODO オブジェクトを一覧から選んで選択できるようにする
** TODO オブジェクトを一覧から選んでプロパティエディタを開けるようにする
** TODO ソース/defgenericをどうするか
defgenericは全部に必要? どこに書くべき?
** TODO ORG/edraw-org-link-query-replaceを作る
置換するSVGを一時的なバッファで見せながら置換していく。
この辺りはreplace.elのコードを使用するか迷う。replace-stringやquery-replaceと同じインタフェースにするなら使わないと自分で実装するのは厳しい。
出来るのであれば edraw-org-link-replace-regexpやedraw-org-link-replace-stringもreplace.elを使いたい。一度使おうとしたが、edraw-org-link-re-searchでマッチするリンクを探すところで諦めた。それ自体replace.elの規則で探さないといけない気がしたので。
** TODO ORG/全体的にpathとdescriptionの両方がedrawリンクの場合を考慮してない
~[[edraw:...][edraw:...]]~ という形を考慮していない。
まぁ、これは仕方ないと思うんだけど。path側のedrawリンクは意味が無いわけだし。
path側がfile=リンクでそれを開けるのなら多少意味はあるか?
~[[file:original.edraw.svg][file:small.edraw.svg]]~ みたいなのは考慮する必要があるのでは? 現状ではoriginal.edraw.svgが開く。
** TODO ORG/org-{html|latex|odt}-inline-image-rulesにちゃんと対応する
[[*ORG/org-modeでODTへのエクスポートに対応する][ORG/org-modeでODTへのエクスポートに対応する]]の実装中に気がついたのだが、org-{html|latex|odt}-inline-image-rules変数でedrawリンクの画像化を禁止したい場合に対応していない。そんなケースを許すべきなのだろうか。そんなことをしてもdata形式ならbase64がずらずら並ぶだけなのだけど。
一応
[[elisp-function:edraw-org-export-html-link]], [[elisp-function:edraw-org-export-latex-link]], [[elisp-function:edraw-org-export-odt-link]]の先頭に@todoコメントを入れておいた。
** TODO ORG/一時的に一つのリンクをインライン表示しないようにする機能
[[*ORG/plainリンクとangleリンクをインライン表示する][ORG/plainリンクとangleリンクをインライン表示する]]を実装したときに、plainリンクをインライン画像表示するとブラケットリンクを一時的に壊して中を編集する時に非常に煩わしいことが分かった。せっかくブラケットリンクを壊してテキストを確認・編集しようとしたのに、それが画像になってしまうのだから。
そもそもリンクを壊さずに一時的に特定のリンクをインライン画像化から外す機能があれば良い。オーバーレイにそのようなプロパティを指定しても良い。実際既にそのようなプロパティはあるが([[elisp-function:edraw-org-link-image-set-visible]])、編集中に使うものなのでそのまま使ってもよいものか。
一応次のようにすればインライン画像化を解除できる。
#+begin_src elisp
(edraw-org-link-image-set-visible (edraw-org-link-image-overlay-at) nil)
#+end_src