# 12 sample_keybdmod.hsp

sample\ 12 sample_keybdmod.hsp

    #include "hsp3dish.as"

    #include "mod_layerbutton-keybd.hsp"
    #include "d3m.hsp"  ; FPS計測用

    screen 0, 640,480
    title "mod_layerbutton-keybd サンプル"

    // HSP3Dish.js用データフォルダ設定
    info_os = sysinfo(0)
    if instr(info_os,0,"Emscripten")>=0 : mm_dir="" : else : mm_dir="data/"

    // 画像読み込み
    celload mm_dir+"keybd.png", -1
    cel_keybd = stat : celdiv cel_keybd,32,32, 16,16
    celload mm_dir+"backsp.png", -1
    cel_backsp = stat : celdiv cel_backsp,32,32, 16,16
    gsel 0

    inputVar = "サンプルもじ"  ; inputの変数
    // 初期画面作成
    gosub *setup_input

    // 表示ループ
    repeat
    	redraw 0 :color 255,255,255: boxf: color: pos 0,0: font msgothic,17
    	mes "fps = " + d3getfps()
    	redraw 1
    	await 1000/60
    loop
    stop

    // layerbutton Group ID
    #const ID_INPUT_DUMMY 0
    #const ID_BUTTON_KEYBOARD_CREATE 1
    #const ID_BLACK_BACKGROUND 10
    #const ID_KEYBOARD_BACK 11
    #const ID_KEYBOARD 100

    *create_keyboard
    	// キーボード作成
    	pos 10,230
    	out_keybd = inputVar
    	ScKeyboard ginfo_sx-20,200, out_keybd,16, ID_KEYBOARD, 30,10,5, 0,5,5, -1
    	ScKeybd_color $FEFEFE,$B8D7F1,$0266D8,$D0D0D0
    	Sckeybd_cursor  ; cursorキー有り設定
    	ScKeybd_onEvent *on_keybd
    	// キーボード入力補助画面(黒背景と入力中文字列などの表示)
    	pos 0,0
    	layerbutton ginfo_sx,ginfo_sy, 0,ID_BLACK_BACKGROUND, 50,,,30 {
    		laybtn_settings 1,1,0  ; 表示のみ (設定 : キー/マウス操作無効)
    		if lparam == objlayer_cmddraw {
    			font msgothic,20,1 : color 255,255,255
    			laybtn_ezbox $BB000000,,,,,,,,,0  ; 半透明黒で画面全体を覆う(角丸なし長方形)
    			// 入力中文字の表示
    			if layerbtn_stat < LAYBTN_SHOW_OUT {  ; LAYBTN_SHOW_OUT, LAYBTN_COMPLETE 時には描画しない(フェードできないため)
    				pos 10,10 : color 255,255,255
    				mes "文字列を入力してください"
    				Sckeybd_cursor -2  ; カーソル位置取得
    				if stat != cursor_pos : cursor_ipa = iparam  ; カーソルの点滅ループを初期化する
    				cursor_pos = stat
    				split_char@modlaybtn_keybd out_keybd, split_input  ; 一文字ずつ分ける (対応:shift-jis,utf8)
    				num = stat
    				pos 110,133
    				repeat num + 1
    					if cnt == cursor_pos {  ; カーソル描画
    						if (iparam-cursor_ipa)/40\2 : color 35,88,126 : else : color 73,175,255
    						boxf ginfo_cx-2,ginfo_cy-4, ginfo_cx, 155 : color 255,255,255
    					}
    					if cnt == num : break
    					mes ""+split_input(cnt), 1 : pos ginfo_cx+3  ; 文字列描画
    				loop
    				boxf 100,155, 540,155+2  ; 下線描画
    				font msgothic,14
    				pos -ginfo_sx,-ginfo_sy : mes ""+num+"/16"  ; ginfo_mesx取得用
    				pos 540-ginfo_mesx,162 : mes ""+num+"/16"
    			}
    		}
    		return
    	}
    	// キーボード後ろ側の明るい背景(装飾)
    	pos 0, 210
    	layerbutton ginfo_sx,ginfo_sy-190, 0,ID_KEYBOARD_BACK, 50,,,30 {
    		laybtn_settings 1,1,0  ; 表示のみ (設定 : キー/マウス操作無効)
    		if lparam == objlayer_cmddraw {
    			laybtn_ezbox $EEEFEFEF,,,,,,,,,10  ; アール(R)指定
    		}
    		return
    	}
    	return

    // キーボード描画割り込み
    *on_keybd
    	// 一文字削除キーを画像に差し替え
    	if refstr == "一字削" {
    		laybtn_ezcel cel_backsp,0,,,,,,,,,1,1  ; celputだと、もしSHOW_OUTがあったときフェードが難しいので
    		return -1
    	}
    	if refstr == "OK" {
    		if (layerbtn_stat & LAYBTN_SHOW_OUT)!=0 && layerbtn_cnt == 0 {
    			logmes "OK!"  ; OKを押した瞬間に何かしたかったらココ
    		}
    	}
    	// キーボードが非表示になった(削除された)
    	if layerbtn_stat == LAYBTN_GROUP_DELETED {
    		// キーボード画面の黒背景等を削除
    		laybtn_hide ID_BLACK_BACKGROUND
    		laybtn_hide ID_KEYBOARD_BACK
    		laybtn_hide ID_INPUT_DUMMY
    		// キーボード表示ボタンを有効に戻す
    		laybtn_enable ID_BUTTON_KEYBOARD_CREATE, 1
    		// 削除していたinputオブジェクトを再作成
    		pos 100,50 : objsize 300,50
    		inputVar = out_keybd
    		input inputVar : id_input = stat
    	}
    	return

    // 初期画面作成
    *setup_input
    	// inputオブジェクト作成
    	pos 100,50 : objsize 300,50
    	input inputVar : id_input = stat
    	// キーボード表示ボタン作成
    	pos 420,50
    	layerbutton 90,50, 0, ID_BUTTON_KEYBOARD_CREATE, 0,10,10, 0,5,5 {
    		laybtn_settings 1,0,1  ; 設定 : キー入力無効、押しても消えない
    		if lparam == objlayer_cmddraw {
    			laybtn_ezbox $0266D8, $3385E6, $014C9C  ; 青い背景描画
    			pos objlayer_axis_x+objlayer_size_x/2,objlayer_axis_y+objlayer_size_y/2
    			celput cel_keybd,0  ; キーボード画像描画
    			if layerbtn_stat == LAYBTN_PRESS_IN_SELECTED {  ; ボタンが選択されたとき
    				// キーボード表示ボタンを無効にする
    				laybtn_enable ID_BUTTON_KEYBOARD_CREATE, 0
    				// いったんinputオブジェクトは消す (キーボード削除時に再作成)
    				clrobj id_input,id_input
    				// inputオブジェクトのダミー描画オブジェクトを作る (キーボード入力中、inputをいったん消す代わり)
    				pos 100, 50
    				layerbutton 300,50, 0, ID_INPUT_DUMMY {
    					laybtn_settings 1,1,0  ; 表示のみ (設定 : キー/マウス操作無効)
    					if lparam == objlayer_cmddraw :	color 200,200,200 : boxf objlayer_axis_x,objlayer_axis_y, objlayer_axis_x2,objlayer_axis_y2
    					return
    				}
    				// キーボードコントローラを作成
    				gosub *create_keyboard
    			}
    		}
    		return
    	}
    	return