imgui 2つのウインドウでデータを渡す – FlyWithLua

2023年4月15日

ボタンクリックでウインドウを表示する。

テキストの編集と保存、読み込みを全て実行できる

これは問題なく読み込みまで機能するので使える。最初のCategory-AとBボタンは消えて、新しいウインドウが表示される。

Category-Aボタンをクリックすると

この画面が出る。ボックスで編集すると、その下に変更テキストがリアルタイムに表示され、「SAVE-A」ボタンをクリックすると

「PoloInput.save」ファイルに以下のように保存される。

X-Planeを再起動しても、このファイルからテキストが再度読み込まれるので同じテキストが表示される。

右下を基準に配置する場合の設定

FileNamePolo = SCRIPT_DIRECTORY .. "PoloInput.save"

Input_A_text = "ABC"
Input_B_text = "123.456"

-- ファイルを開く
backupfile = io.open(FileNamePolo)
if backupfile ~= nil then
    bucontent = backupfile:lines()
    Fctr = 0
    Input_A_text = bucontent(Fctr)
    Input_B_text = bucontent(Fctr + 1)
    Fctr = Fctr + 2

    backupfile:close()
end

scrWidth, scrHeight = XPLMGetScreenSize()

-- ウインドウの作成 ----------------------------------------------------------------------
PoloWindow = float_wnd_create(10, 10, 2, true)
float_wnd_set_title(PoloWindow, "Polo Input Window")
float_wnd_set_position(PoloWindow, 10, 10)
float_wnd_set_onclose(PoloWindow, "closed_PoloWindow")
float_wnd_set_imgui_builder(PoloWindow, "button_window")
float_wnd_set_onclick(PoloWindow, "button_on_click")
float_wnd_set_geometry(PoloWindow, scrWidth - 336, 40, scrWidth, 0)
----------------------------------------------------------------------------------------

-- 最初に表示されるボタンのウインドウを作成
function button_window(PoloWindow, x, y)
    imgui.BeginChild("button_window_Child", 450, 24)
    imgui.SetWindowFontScale(1) -- フォントのお大きさ
    -- ラジオボタン
    if imgui.Button("Category-A", 100, 26) then
        float_wnd_set_geometry(PoloWindow, scrWidth - 400, 820, scrWidth, 0)
        float_wnd_set_imgui_builder(PoloWindow, "window_1")
    end
    imgui.SameLine()
    imgui.SetCursorPosX(110)
    -- Navボタン 
    if imgui.Button("Category-B", 100, 26) then
        float_wnd_set_geometry(PoloWindow, scrWidth - 400, 820, scrWidth, 0)
        float_wnd_set_imgui_builder(PoloWindow, "window_2")
    end
    imgui.SameLine()
    imgui.SetCursorPosX(220)

    imgui.EndChild()
end

-- 1番目のウインドウ
function window_1(PoloWindow, x, y)
    imgui.BeginChild("First_window_Child", 400, 800)
    imgui.SetWindowFontScale(1)
    
    --imgui.TextUnformatted(" ")
    local changed, Input_A_text_new = imgui.InputText("InputA", Input_A_text,18)
    if changed then 
        Input_A_text = Input_A_text_new 
    end
    local changed, Input_B_text_new = imgui.InputText("InputB", Input_B_text,18)
    if changed then 
        Input_B_text = Input_B_text_new 
    end
    imgui.TextUnformatted(Input_A_text)
    imgui.TextUnformatted(Input_B_text)

    if imgui.Button("SAVE-A", 60, 30) then
        Write_and_Save_to_Disk()
        float_wnd_set_geometry(PoloWindow, scrWidth - 336, 40, scrWidth, 0)
        float_wnd_set_imgui_builder(PoloWindow, "button_window")
    end
    imgui.EndChild()
end

-- 2番目のウインドウ(内容の記述無し)
function window_2(PoloWindow, x, y)
    imgui.BeginChild("Second_window_Child", 400, 800)
    imgui.SetWindowFontScale(1)
    if imgui.Button("SAVE-B", 60, 30) then
        Write_and_Save_to_Disk() -- 入力テキストをディスクに書き込み保存
        float_wnd_set_geometry(PoloWindow, scrWidth - 336, 40, scrWidth, 0) -- 位置とサイズを指定、
        float_wnd_set_imgui_builder(PoloWindow, "button_window")
    end
    imgui.EndChild()
end
function button_on_click(PoloWindow, x, y, state) end
function closed_PoloWindow(wnd) end

-- ディsクへの書き込みと保存
function Write_and_Save_to_Disk()
    fileES = io.open(FileNamePolo, "w")
    fileES:write(Input_A_text .. "\n")
    fileES:write(Input_B_text .. "\n")
    fileES:close()
end

左下を基準に配置する場合の設定

FileNamePolo = SCRIPT_DIRECTORY .. "PoloInput.save"

-- 初期設定
Input_A_text = "ABC"
Input_B_text = "123.456"

-- ファイルを開く
backupfile = io.open(FileNamePolo)
if backupfile ~= nil then
    bucontent = backupfile:lines()
    Fctr = 0
    Input_A_text = bucontent(Fctr)
    Input_B_text = bucontent(Fctr + 1)
    Fctr = Fctr + 2

    backupfile:close()
end

-- 画面が変化するサイズをリアルタイムにに取得
screen_Width, screen_Height = XPLMGetScreenSize()

-- ウインドウの作成 ----------------------------------------------------------------------
PoloWindow = float_wnd_create(10, 10, 2, true)
float_wnd_set_title(PoloWindow, "Polo Input Window")
float_wnd_set_position(PoloWindow, 10, 10)
float_wnd_set_onclose(PoloWindow, "closed_PoloWindow")
float_wnd_set_imgui_builder(PoloWindow, "button_window")
float_wnd_set_onclick(PoloWindow, "button_on_click")
-- 最初に表示される2つのボタンの位置を設定
--float_wnd_set_geometry(PoloWindow, screen_Width - 336, 40, screen_Width, 0) -- screen_Widthを使うことで、画面の右下が起点になっている。
float_wnd_set_geometry(PoloWindow, 300, 50, 526, 10) -- 最初に2つのボタン表示。
----------------------------------------------------------------------------------------

-- 最初に表示されるボタンのウインドウを作成
function button_window(PoloWindow, x, y)
    imgui.BeginChild("button_window_Child", 450, 24)    --2つのボタンが入る子ウインドウのサイズ、幅と高さ(右下が起点)
    imgui.SetWindowFontScale(1) -- フォントのお大きさ
    -- ラジオボタン
    if imgui.Button("Category-A", 100, 26) then
        --float_wnd_set_geometry(PoloWindow, screen_Width - 400, 820, screen_Width, 0)  --右下が基準の場合
        float_wnd_set_geometry(PoloWindow, 300, 180, 636, 30) --1番目のウインドウの位置とサイズ(左下が起点)
        float_wnd_set_imgui_builder(PoloWindow, "window_1")
    end
    imgui.SameLine()
    imgui.SetCursorPosX(110)
    -- Navボタン 
    if imgui.Button("Category-B", 100, 26) then
        --float_wnd_set_geometry(PoloWindow, screen_Width - 400, 820, screen_Width, 0)  --右下が基準の場合
        float_wnd_set_geometry(PoloWindow, 300, 180, 636, 30) --2番目のウインドウの位置とサイズ(左下が起点)
        float_wnd_set_imgui_builder(PoloWindow, "window_2")
    end
    imgui.SameLine()
    imgui.SetCursorPosX(220)

    imgui.EndChild()
end

-- 1番目のウインドウ
function window_1(PoloWindow, x, y)
    imgui.BeginChild("First_window_Child", 400, 800)   --ウインドウの大きさ
    imgui.SetWindowFontScale(1)
    
    --imgui.TextUnformatted(" ")
    local changed, Input_A_text_new = imgui.InputText("InputA", Input_A_text,18)
    if changed then 
        Input_A_text = Input_A_text_new 
    end
    local changed, Input_B_text_new = imgui.InputText("InputB", Input_B_text,18)
    if changed then 
        Input_B_text = Input_B_text_new 
    end
    imgui.TextUnformatted(Input_A_text)
    imgui.TextUnformatted(Input_B_text)

    if imgui.Button("SAVE-A", 60, 30) then
        Write_and_Save_to_Disk()    --SAVEボタンでテキストを保存
        --float_wnd_set_geometry(PoloWindow, screen_Width - 336, 40, screen_Width, 0)  --右下が基準の場合
        float_wnd_set_geometry(PoloWindow, 300, 50, 526, 10) -- SAVEボタンで2つのボタンを入れる枠の再表示。
        float_wnd_set_imgui_builder(PoloWindow, "button_window")-- SAVEボタンで2つのボタンを再表示。
    end
    imgui.EndChild()
end

-- 2番目のウインドウ(内容の記述無し)
function window_2(PoloWindow, x, y)
    imgui.BeginChild("Second_window_Child", 400, 800)   --ウインドウの大きさ
    imgui.SetWindowFontScale(1)
    if imgui.Button("SAVE-B", 60, 30) then
        Write_and_Save_to_Disk() -- 入力テキストをディスクに書き込み保存
        --float_wnd_set_geometry(PoloWindow, screen_Width - 336, 40, screen_Width, 0)   --右下が基準の場合
        float_wnd_set_geometry(PoloWindow, 300, 50, 526, 10) -- SAVEボタンで2つのボタンを入れる枠の再表示。
        float_wnd_set_imgui_builder(PoloWindow, "button_window")
    end
    imgui.EndChild()
end
function button_on_click(PoloWindow, x, y, state) end
function closed_PoloWindow(wnd) end

-- ディsクへの書き込みと保存
function Write_and_Save_to_Disk()
    fileES = io.open(FileNamePolo, "w")
    fileES:write(Input_A_text .. "\n")
    fileES:write(Input_B_text .. "\n")
    fileES:close()
end

変更したファイルを読み込む

— 既にPersistentParking.txtが存在する必要がある。
local file = io.open(SCRIPT_DIRECTORY..”ExtendedStack.save”, “r”)
for line in file:lines() do
imgui.TextUnformatted(line) –ここ「line」に読み込む
end
file:close() — 最後にf:closeでファイルを閉じる

for文を使ったインプットボックス

入力したテキストは再起動しても維持される。問題なく動作しているのを確認。下の分はfor文を使っているが2つまでしか作成できないように設定しているので表示が2つだけになっている。数値を変更するだけで同じパターンをいくつでも作ることができる。

FileNamePolo = SCRIPT_DIRECTORY .. "PoloInput.save"

Input_A_text = {}
Input_B_text = {}

for input_box = 1, 10 do
    Input_A_text[input_box] = "ABC" .. input_box
    Input_B_text[input_box] = "123.40"
end

-- ファイルを開く
backupfile = io.open(FileNamePolo)
if backupfile ~= nil then
    bucontent = backupfile:lines()
    Fctr = 0
    for input_box = 1, 10 do
        Input_A_text[input_box] = bucontent(Fctr + input_box)
        Input_B_text[input_box] = bucontent(Fctr + input_box + 1)
        Fctr = Fctr + 2
    end

    backupfile:close()
end

scrWidth, scrHeight = XPLMGetScreenSize()

-- ウインドウの作成 ----------------------------------------------------------------------
PoloWindow = float_wnd_create(10, 10, 2, true)
float_wnd_set_title(PoloWindow, "Polo Input Window")
float_wnd_set_position(PoloWindow, 10, 10)
float_wnd_set_onclose(PoloWindow, "closed_PoloWindow")
float_wnd_set_imgui_builder(PoloWindow, "button_window")
float_wnd_set_onclick(PoloWindow, "button_on_click")
float_wnd_set_geometry(PoloWindow, scrWidth - 336, 40, scrWidth, 0)
----------------------------------------------------------------------------------------

-- 最初に表示されるボタンのウインドウを作成
function button_window (PoloWindow, x, y)
    imgui.BeginChild("button_window_Child", 450, 24)
    imgui.SetWindowFontScale(1)	--フォントのお大きさ
    -- ラジオボタン
    if imgui.Button("Category-A", 100, 26) then
        float_wnd_set_geometry(PoloWindow, scrWidth - 400, 820, scrWidth, 0)
        float_wnd_set_imgui_builder(PoloWindow, "window_1")
    end
    imgui.SameLine()
    imgui.SetCursorPosX(110)
    -- Navボタン 
    if imgui.Button("Category-B", 100, 26) then
        float_wnd_set_geometry(PoloWindow, scrWidth - 400, 820, scrWidth, 0)
        float_wnd_set_imgui_builder(PoloWindow, "window_2")
    end
    imgui.SameLine()
    imgui.SetCursorPosX(220)
    
    imgui.EndChild()
end

-- 1番目のウインドウ
function window_1 (PoloWindow, x, y)
    imgui.BeginChild("First_window_Child", 400, 800)
    imgui.SetWindowFontScale(1.2)
    if imgui.Button("CLOSE", 60, 30) then
        Write_and_Save_to_Disk()
        float_wnd_set_geometry(PoloWindow, scrWidth - 336, 40, scrWidth, 0)
        float_wnd_set_imgui_builder(PoloWindow, "button_window")
    end

    for input_box = 1, 2 do
        imgui.TextUnformatted(" ")
        local changed, Input_A_text_new = imgui.InputText("InputA-" .. input_box,Input_A_text[input_box], 18)
        if changed then 
			Input_A_text[input_box] = Input_A_text_new 
		end
        imgui.SameLine()
    end
    imgui.EndChild()
end

-- 2番目のウインドウ
function window_2 (PoloWindow, x, y)
    imgui.BeginChild("Second_window_Child", 400, 800)
    imgui.SetWindowFontScale(1.2)
    if imgui.Button("CLOSE", 60, 30) then
        Write_and_Save_to_Disk()	--入力テキストをディスクに書き込み保存
        float_wnd_set_geometry(PoloWindow, scrWidth - 336, 40, scrWidth, 0)	--位置とサイズを指定、
        float_wnd_set_imgui_builder(PoloWindow, "button_window")
    end
    imgui.EndChild()
end
function button_on_click(PoloWindow, x, y, state) end
function closed_PoloWindow(wnd) end



-- ディsクへの書き込みと保存
function Write_and_Save_to_Disk()
    fileES = io.open(FileNamePolo, "w")
    for input_box = 1, 10 do
        fileES:write(Input_A_text[input_box] .. "\n")
        fileES:write(Input_B_text[input_box] .. "\n")
    end
    fileES:close()
end