2

まだ存在しないため、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

4

0 に答える 0