対応したのは TextBox
入力のコードがあるのは TextBox だけなので(試してませんが、TextArea は入力できないような)、当然ながらそこしか対応していません。
github で fork したリポジトリ の feat/unicode-input ブランチに置いてあります。
日本語に特化した変更ではないので、ほかのIMを使う言語も入力できると思います。
使い方
resources/ に日本語TTFフォントを置いて、 theme.h と theme.cpp にフォント名を追加します。例えば GenShinGothic-Medium.ttf、GenShinGothic-Heavy.ttf、GenShinGothic-Monospace-Medium.ttf を置いたら、
2022/04/17 修正:
set_font() を持っている Widget は Label と TabWidget と TextArea だけぽいので、全体を通してフォントを変更したい場合、打ち消し線で消した部分のやり方だと C++ では
Some widgets allow you to set fonts directly, but if you want to apply the font
globally, you should create a sub-class ofnanogui::Theme
and explicitly
callnanogui::Widget::set_theme
for each widget you create.
とある通り Theme
のサブクラスを書かないとならず、python では手段がありません。
ということで、デフォルトフォントを書き換えてしまう方が良いでしょう。
- m_font_sans_regular = nvgCreateFontMem(ctx, "sans", (uint8_t *) roboto_regular_ttf,
- roboto_regular_ttf_size, 0);
- m_font_sans_bold = nvgCreateFontMem(ctx, "sans-bold", (uint8_t *) roboto_bold_ttf,
- roboto_bold_ttf_size, 0);
+ m_font_sans_regular = nvgCreateFontMem(ctx, "sans", (uint8_t *) genshingothic_medium_ttf,
+ genshingothic_medium_ttf_size, 0);
+ m_font_sans_bold = nvgCreateFontMem(ctx, "sans-bold", (uint8_t *) genshingothic_heavy_ttf,
+ genshingothic_heavy_ttf_size, 0);
m_font_icons = nvgCreateFontMem(ctx, "icons", (uint8_t *) fontawesome_solid_ttf,
fontawesome_solid_ttf_size, 0);
- m_font_mono_regular = nvgCreateFontMem(ctx, "mono", (uint8_t *) inconsolata_regular_ttf,
- inconsolata_regular_ttf_size, 0);
+ m_font_mono_regular = nvgCreateFontMem(ctx, "mono", (uint8_t *) genshingothic_monospace_medium_regular_ttf,
+ genshingothic_monospace_medium_ttf_size, 0);
include/nanogui/theme.h に
int m_font_genshin_medium;
を追加して、
src/theme.cpp に
m_font_genshin_medium = nvgCreateFontMem(ctx, "genshin-medium", (uint8_t *) genshingothic_medium_ttf,genshingothic_medium_ttf_size, 0);
を追加して、
あとは cmake してビルドします。
変更の解説とか必要?
面倒なので差し当たっては割愛します。commit の diff を見てください。
困りごと
オリジナルの nanogui では、TextBox で enter を押したところで入力が確定(commit)されて編集モードを抜けるのですが、GLFW的に「単にENTERを押した」のと「日本語入力を確定したENTER」が区別できなくて、文字列が確定されるのは Screen のその TextBox 以外の部分がクリックされた時だけにしてしまいました。これなんとかならないものでしょうか。
今後
コメントとか整えたら本家に pull request を出そうと思ってはいます。挫けなければ。
コードの変更は小さいですが、上で書いた文字列確定の仕様変更があるので受け入れられるか心配ではあります。
あと、utf8() 関数はいじっていないのですが、ちょっとまずい(弾くべき値を弾いていない)気がするんですよね。直す必要があるでしょうか。