Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

SimpleGUI::TextBox() で異体字を入力するとカーソルと挿入位置が一致しない #1112

Open
Raclamusi opened this issue Sep 30, 2023 · 5 comments

Comments

@Raclamusi
Copy link
Member

カーソルより数文字前に「abc」と挿入される様子

SimpleGUI::TextBox()SimpleGUI::TextArea() などで、入力文字列に異体字セレクタが含まれるとカーソルの位置と挿入・削除される文字の位置がずれることがあります。

異体字セレクタが含まれると UTF-32 での文字数と Glyph の数が一致しなくなるため、一致することを前提に設計されている SimpleGUI::TextBox() などの挙動がおかしくなります。

検証用コード

# include <Siv3D.hpp> // Siv3D v0.6.12

void Main()
{
	TextEditState textBoxState{ U"竈門禰󠄀豆子" };

	TextAreaEditState textAreaState{ U"渡邉󠄂 渡邉󠄃 渡邉󠄄 渡邉󠄅 渡邉󠄆 渡邉󠄇 渡邉󠄈 渡邉󠄉 渡邉󠄊 渡邉󠄋 渡邉󠄌 渡邉󠄍 渡邉󠄎 渡邊󠄁 渡邊󠄂 渡邊󠄃 渡邊󠄄 渡邊󠄅 渡邊󠄆 渡邊󠄇\n" };

	while (System::Update())
	{
		SimpleGUI::TextBoxAt(textBoxState, Vec2{ 400, 150 }, 600);

		SimpleGUI::TextAreaAt(textAreaState, Vec2{ 400, 350 }, SizeF{ 600, 250 });
	}
}
@Raclamusi
Copy link
Member Author

Raclamusi commented Oct 5, 2023

cursorPosString のインデックスに合わせるのと Array<Glyph> のインデックスに合わせるの、どちらがいいと思いますか?

@Raclamusi
Copy link
Member Author

TextInput::UpdateText()Platform::Web::TextInput::GetCursorIndex() の実装に合わせて、String のインデックスに合わせるのがよさそうです。

@Raclamusi
Copy link
Member Author

SimpleGUI::TextBox() 異体字対応の実装案

https://gist.github.com/Raclamusi/1caaacf34a552be9881ba7877223c683/29caa5de8059cbc4c85b4f0c36d36915a321b7b9

Revisions: https://gist.github.com/Raclamusi/1caaacf34a552be9881ba7877223c683/revisions#diff-ff9db3cb6025e343dacac7fe1b565394e85d2b614be4ab7b7fedb99d8e8b762d

Font::getGlyphClusters() から取得できるグリフに対応する文字のインデックスを利用して、カーソルの移動をグリフ単位で行うようにしました。
グリフ単位での削除については TextInput::UpdateText() をいじる必要があるため対応しませんでしたが、これはあまり重要ではないと思います。

フォントのフォールバックなしで実装しています。

@Reputeless
Copy link
Member

ありがとうございます。検証してみます。

@Raclamusi
Copy link
Member Author

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
Status: Investigating
Development

No branches or pull requests

2 participants