まだ存在しないため、Kivy で独自のリッチ テキスト エディターを構築しようとしています。現在の私のアプローチは、マークアップされたテキストをテキスト入力ボックスに保存し、レンダリングされたテキストを RST ドキュメントに表示することです。テキストが変更されるたびにRSTドキュメントが更新されるようにバインドしています。画像へのリンク:上はプレーン テキストのテキスト入力を示しています。下はレンダリングされたテキストを示しています
現在、RST ドキュメントのクリックをテキスト エディタの対応するカーソル位置に変換する際に問題が発生しています。x 軸の識別は正しく機能していますが、y 軸の識別は正しく機能していません。サンプル RST ドキュメントのどの行をクリックしても、カーソルは常に最後の行に置かれます。コードを以下に示します
class Rendered(RstDocument):
def __init__(self, text="", **kwargs):
super(Rendered, self).__init__(**kwargs)
self.text = text
class TextArea(TextInput):
def __init__(self, **kwargs):
super(TextArea, self).__init__(**kwargs)
self.text = "Filler text"
class Editor(BoxLayout):
def __init__(self, **kwargs):
super(Editor, self).__init__(**kwargs)
self.txt = TextArea()
self.rst = Rendered(self.txt.text)
self.txt.bind(text=self.updateRST)
self.orientation = "vertical"
self.add_widget(self.txt)
self.add_widget(self.rst)
self.rst.render()
def focusInput(self, *args):
self.txt.focus = True
def updateRST(self, *args):
self.rst.text = self.txt.text
def on_touch_down(self, touch):
if self.rst.collide_point(*touch.pos):
#Get mouse click
coord = self.rst.to_window(*touch.pos)
#Get new cursor position using mouse click
newCoord = self.txt.get_cursor_from_xy(coord[0]-5.4,coord[1])
#Set new cursor position
self.txt.cursor = (newCoord[0],newCoord[1])
to_window()
予想される位置に最も近いので、クリック位置を取得する関数を使用しています。の定数を使用5.4
して、x 軸の位置を調整しました。しかし、newCoord
[1] は常に の最後の行を返しますtextinput
。問題の一部は、座標系が左下から始まることです。最初の数行をクリックすると、y 値が常に非常に大きくなるため、この動作が発生していると思いますが、to_local
代わりにを使用するとto_window
、y 座標値がテキストの隣でゼロから始まりますが、返された行の値は最大のままです。これを修正するにはどうすればよいですか?
他にリッチ テキスト エディターを作成する方法 (つまり、別の手法を使用してカーソル位置を関連付ける方法) について何かアドバイスがあれば、ぜひ聞かせてください。今のところ、マークアップがなければ正しい x 軸の位置を特定できます。存在する場合は、マークアップ シンボルごとにカーソル位置を右にインクリメントできますが、より複雑なマークアップ (箇条書きなど) の場合、このハックはうまく機能しない可能性があります。
EDIT
テキスト入力が一番上に保存されているため、その y 座標は RST ドキュメントの y 座標よりもはるかに大きいことに気付きました。RST ドキュメントを TextInput に隣接して配置すると、y 座標の識別は完全に機能しますが、x 座標は機能しません。理想的には、TextInput を非表示にして、その上に RST ドキュメントを配置することができましたが、これを行う方法がわかりませんでした。考えられる唯一の方法は、最初から使用add_widget(TextInput)
しないことでしたが、いずれの座標も一致しませんでした ( 、 などを使用したかどうかに関係なくto_window
) to_widget
。