xfangfang / borealis

Hardware accelerated, Nintendo Switch inspired UI library for PC, Android, iOS, PSV, PS4 and Nintendo Switch
Apache License 2.0
31 stars 21 forks source link

sdl 输入法支持 #6

Closed zeromake closed 1 year ago

zeromake commented 1 year ago

有一些问题

zeromake commented 1 year ago

@xfangfang 你知道为什么我把文字全部删除后dialog的高度变了,是因为 label 没有设置固定高度? 有文字: image 删除掉所有 image

还有输入不能粘贴还是比较难受的,有什么合适的按键组合来做复制粘贴吗?

xfangfang commented 1 year ago

@zeromake 应该是label的尺寸测量函数出的问题。遇到空的值直接返回了未知的高度,至于为什么初始化的时候没这个问题,我猜可能是yoga的行为不太一致导致的吧。

按照下面这么改就没问题了,之前在glfw的实现中遇到空的值会有一个默认的提示所以一直没注意到这个问题。

views/label.cpp labelMeasureFunc中 80行附近

     if (fullText.empty())
+    {
+        if (widthMode == YGMeasureModeExactly && heightMode == YGMeasureModeExactly)
+        {
+            return size;
+        }
+        else if (heightMode == YGMeasureModeExactly)
+        {
+            size.width = 0;
+        }
+        else if (widthMode == YGMeasureModeExactly)
+        {
+            size.height = 0;
+        }
         return size;
+    }
zeromake commented 1 year ago

@xfangfang 打了这个补丁确实是可以了,不过感觉还是用 height 去固定会好点,没有内容会导致自动计算高度比有内容少一些。

zeromake commented 1 year ago

@xfangfang 还有就是 borealis 默认导入的 windows 系统字体 malgun 不支持很多中文字符,我改成 msyh 了。

xfangfang commented 1 year ago

@zeromake

不过感觉还是用 height 去固定会好点,没有内容会导致自动计算高度比有内容少一些

可以试试在对应 label 的xml下加个 minHeight="30" (20是字体大小,1.5倍行高就应该是30了)有可能非默认字体下(比较宽的那种字体)一行显示不完,这种情况下指定高度就不太好了。

还有就是 borealis 默认导入的 windows 系统字体 malgun 不支持很多中文字符,我改成 msyh 了。

这个其实是为了加载韩语搞的,wiliwili内用的字体没有韩语:https://github.com/xfangfang/wiliwili/issues/53#issuecomment-1382707042

zeromake commented 1 year ago

@xfangfang 我想想,另整一个放 cn 字体吧。

xfangfang commented 1 year ago

@zeromake 不太影响加载速度的话都可以。

如果可以确定msyh是windows(无论是不是中文用户)都会安装的字体的话,感觉是不是windows下 wiliwili 都不需要内置字体了,少加载一份字体还能提点速度

(想了想,还有win7,那倒是不一定)

zeromake commented 1 year ago

@xfangfang win7肯定有 msyh 的只是不是 ttc 的是 ttf 的。 https://zh.wikipedia.org/wiki/%E5%BE%AE%E8%BD%AF%E9%9B%85%E9%BB%91 从 Windows Vista 开始就作为 windows 的内置字体了。

zeromake commented 1 year ago

@xfangfang 想要加速字体加载还是得用 freetype 的流方式加载,fontstash.h 里全是全量读到内存里的,而且发现字体渲染出来的 bitmap 好像也没做缓存?

xfangfang commented 1 year ago

我记着 nanovg 好像也支持使用freetype,但是之前感觉影响不大就没有使用

zeromake commented 1 year ago

@xfangfang

我记着 nanovg 好像也支持使用freetype,但是之前感觉影响不大就没有使用

是的区别几乎没有,因为纹理用的 NVG_TEXTURE_ALPHA,而不是支持颜色的 argb,而 freetype 的抗锯齿类似 ClearType 用肉眼看不出的带有颜色,而且 freetype 的加载字体也是直接全部读到内存里的。

image

zeromake commented 1 year ago

@xfangfang 改了一下,现在把 windows 和 macos 的系统内置的韩文和中文字体加上了,linux 的内置字体……(发行版太多了)。

zeromake commented 1 year ago

@xfangfang 对了,键盘对应的按键绑定有点尴尬,一堆按键绑定到了输入需要用的键盘按键(x,y,q,p,l,r),复制粘贴没什么合适的按键绑定用,我先用上下来绑定粘贴复制了,这个不能绑定组合键吗。

xfangfang commented 1 year ago

@zeromake 字体修改这下全面了,希望对性能影响不大。(mac平台之前的 Arial Unicode.ttf 就包含i18n中提到的韩语部分,对韩语不是很了解,可能更大的字体 字形也会更全面一些吧)

快捷键这个一直没怎么研究,确实有几个反馈提到过,想要丰富一下快捷键。这个估计要修改一下现在的按键处理逻辑才能做到,现在就是简单的和手柄输入做了一下映射。

在 wiliwli 播放器的部分涉及到了多个手柄按键的快捷键,当时是这么做的:

    this->registerAction(
        "\uE08E", brls::ControllerButton::BUTTON_RB,
        [this](brls::View* view) -> bool {
            ControllerState state{};
            input->updateUnifiedControllerState(&state);
            if (state.buttons[BUTTON_Y]) {
                seeking_range -= getSeekRange(seeking_range);
            } else {
                seeking_range += getSeekRange(seeking_range);
            }
            this->requestSeeking();
            return true;
        },
        false, true);

感觉可以扩展一下 registerAction 让他可以注册键盘,同时仿照 updateUnifiedControllerState 做个获取键盘输入的函数,应该就能实现键盘快捷键了。

zeromake commented 1 year ago

@xfangfang 虽然这样解决了多按键绑定,但是如果我对键盘注册一份,手柄按键注册一份,hint 提示应该会比较尴尬(键盘的 hint 倒是可以考虑直接隐藏,不过感觉是不是不太友好)。

而且我试了 registerAction 是按第二个参数的按键作为 key 去重的显示 hint 的,如果注册 RB + Y, RB + X,应该是只有一个 hint 提示,感觉可以重做个按键绑定函数来支持手柄按键 + 键盘的一同注册。

键盘按键事件我考虑搞个 map 在 key_down 和 key_up 做状态变更,然后在 updateUnifiedControllerState 拷贝ControllerState。

    while (SDL_PollEvent(&event))
    {
        if (event.type == SDL_QUIT)
        {
            running = false;
        }
        else if (event.type == SDL_MOUSEWHEEL)
        {
            if (this->inputManager)
                this->inputManager->updateMouseWheel(event.wheel);
        }
        else if (event.type == SDL_KEYDOWN) {
           // 更新键盘map状态
        }
        else if (event.type == SDL_KEYUP) {
           // 更新键盘map状态
        }
    }
xfangfang commented 1 year ago

@zeromake 感觉键盘的提示隐藏起来,倒是影响也不大,只考虑wiliwili的需求的话应该不会有太多的快捷键吧。

如果不隐藏起来,是不是要显示在下面的用来提示的按键字体也需要单独绘制一下,这也是个不小的工作量。

有一个“快捷键“是我在glfw下实现的,我感觉用起来很方便,如果你也感兴趣的话可以实现一下,就是鼠标右键 = 返回键,虽然现在的很多页面右上角都会有一个❌用来关闭页面,但是如果是用鼠标的话,右键返回真的更方便。

其他快捷键的部分,可以按照你的想法来调整,我尊重你的想法。

准备最近时间写一写新功能,互动视频和dlna投屏接收。以及解决一下最近switch在新的devkitpro环境下编译播放视频报错的问题。

xfangfang commented 1 year ago

@zeromake 因为想做一下PSV的键盘支持,所以我准备先合并一下这个PR,刚刚解决了冲突,现在是可以被合并的状态吗?

zeromake commented 1 year ago

@xfangfang 我晚上重做一个 pr 吧,一个键盘绑定没做好,只把字体支持和输入法支持抽取出来吧

xfangfang commented 1 year ago

好的,麻烦啦 : )