0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Nanogui で日本語入力ができるようにした

Last updated at Posted at 2022-04-16

対応したのは 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 of nanogui::Theme and explicitly
call nanogui::Widget::set_theme for each widget you create.

とある通り Theme のサブクラスを書かないとならず、python では手段がありません。
ということで、デフォルトフォントを書き換えてしまう方が良いでしょう。

theme.cpp
-    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() 関数はいじっていないのですが、ちょっとまずい(弾くべき値を弾いていない)気がするんですよね。直す必要があるでしょうか。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?