Editボタンから右のウインドウを開き、インプットでテキスト編集、Closeで保存して閉じる。1番目のウインドウは開いたまま。そのウインドウには編集したテキストがリアルタイムに表示される。
目次
整数だけを扱うcreate_dataref_tableのカスタムdatarefを使う
カスタムdatarefを使って2番目のウインドウを開け閉めすることができる。ここでのポイントは31行目の「and hide == false」を必ずここにも入れるということ。これを参考にしたスクリプトにはこれが無く、動きはするが不安定で開いたり、開かなったりする現象が出てので、これを入れたら問題が解決した。
--カスタムdatarefを作成、"Int"がなので整数のみを扱う。 local edit_window = create_dataref_table("FlyWithLua/edit_window", "Int") local edit_window = 0 -- 初期設定のdataref値 local hide = false -- 初期設定 local Input_text = "" --------------------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------------------- button_wnd = float_wnd_create(250, 200, 1, true) float_wnd_set_title(button_wnd, "Edit") --最初のウインドウタイトル float_wnd_set_imgui_builder(button_wnd, "button_window") float_wnd_set_onclick(button_wnd, "button_on_click") -- 最初に表示されるメインウインドウ、隠さない設定。 -- button_windowをビルド、最初に開くウインドウ、Editボタンを作成、出力テキストも表示。 function button_window(button_wnd, x, y) if imgui.Button("Edit", 100, 30) then edit_window = 1 -- ここでdataref値「1」に変更すると、2番目のウインドウを表示することになる。 end imgui.TextUnformatted(Input_text) --出力テキストも表示. end --これが無いとウインドウをクリックするとEditボタン等の内容が表示されなくなる。 function button_on_click(button_wnd, x, y, state) end ---------------------------------------------------------------------------------------------------------------------- -- Editボタンで開くウインドウ(開くウインドウの作成と、そのウインドウを閉じる設定になる) ---------------------------------------------------------------------------------------------------------------------- -- Editボタンにより、開け閉めするウインドウ -- 上のEditボタンクリックでdatarefが「1」になり、hideは初期設定で「false」こなのでウインドウをビルドして表示することになる。 function edit_show_wnd() if edit_window == 1 and hide == false then --1とfalseならウインドウを作成して表示する。 edit_wnd = float_wnd_create(250, 150, 1, true) -- ここで最初のウインドウの作成 float_wnd_set_title(edit_wnd, "Show Window-1") --2番目のウインドウタイトル float_wnd_set_position(edit_wnd, 100, 300) float_wnd_set_imgui_builder(edit_wnd, "ishwwd_on_build_1") -- ここでウインドウ内にボタン等のアイテムを作成する。 hide = true --これでウインド内が有効になり使えるようになる。falseならウインドウ内をクリックしても反応しないのでCloseボタンを使えない。 end end do_every_draw("edit_show_wnd()") -- ビルドされたウインドウ内に、Closeボタンとテキストを表示する。 function ishwwd_on_build_1(edit_wnd, x, y) if imgui.Button("Close", 100, 50) then edit_window = 0 -- ボタンを押したときdatarefを「0」にして、このウインドウを閉じる end local changed, Input_text_new = imgui.InputText("InputA", Input_text,18) if changed then Input_text = Input_text_new end end edit_wnd = nil -- 無くても動作する。メモリ上のウインドウを空にする(これにより完全に空にする) -- Closeボタンにより、datarefが「0」になり2番目ウインドウが非表示になる。 -- ポイント、ここにも「and hide == true」を入れること。これを入れないと開け閉めが不安定になる。 function edit_hide_1_wnd() if edit_window == 0 and hide == true then if edit_wnd then float_wnd_destroy(edit_wnd) --ウインドウを隠す関数 hide = false --これでウインド内が無効になり使えなくする。 end end end do_every_draw("edit_hide_1_wnd()") -- do_every_drawはLuaコードを1秒ごとに計算する。do_every_draw()よりはフレームレートに影響がすくない。
define_shared_DataRefのdatarefを使う
このdatarafを登録すると数値が変わらない、下の、ボタンをクリックした状態ならdatarefは「1」になるはずだが「0」のままだが2番めのウインドウは問題無く表示される。バグ?
これを使う場合は2段階の設定が必要。
define_shared_DataRef(“FlyWithLua/Show_hide_window”, “Int”) –カスタムdatarefを作成
dataref(“ShowHideWindow”, “FlyWithLua/Show_hide_window”, “writable”)–実際の登録
-- カスタムdatarefを作成して書き込み可能に設定、初期は「0」に設定 define_shared_DataRef("FlyWithLua/Show_hide_window", "Int") --datarefを作成登録(X-Planeの再起動が必要) dataref("ShowHideWindow", "FlyWithLua/Show_hide_window", "writable") --書き込み可能に設定 local ShowHideWindow = 0; -- 初期設定のdataref値。 local hide = false -- 隠す場合はfalseで設定 local Input_A_text = "" --------------------------------------------------------------------------------------------------- -- iメインウインドウ、最初から表示し続け、隠さない。 button_wnd = float_wnd_create(350, 150, 1, true) float_wnd_set_title(button_wnd, "imgui Button")--最初のウインドウタイトル float_wnd_set_imgui_builder(button_wnd, "button_demo") float_wnd_set_onclick(button_wnd, "button_on_click") float_wnd_set_onclose(button_wnd, "closed_demo") --これを入れるとウインドウの赤丸を押すとX-Planeがクラッシュする。 --最初に開くウインドウ function button_demo(button_wnd, x, y) if imgui.Button("Edit", 100, 50) then ShowHideWindow = 1 -- dataref値「1」は2番目のウインドウを表示 end imgui.TextUnformatted(Input_A_text) end function button_on_click(button_wnd, x, y, state) end -------------------------------------------------------------------------------------- -- 2番目の開け閉めするウインドウ -- datarefが「1」でウインドウ作成表示、「0」で非表示にする。 function ishwwd_show_wnd() if ShowHideWindow == 1 and hide == false then --1とfalseならウインドウを作成して表示する。 ishwwd_wnd = float_wnd_create(250, 150, 1, true) float_wnd_set_title(ishwwd_wnd, "Show Window-1") --2番目のウインドウタイトル float_wnd_set_position(ishwwd_wnd, 100, 300) float_wnd_set_imgui_builder(ishwwd_wnd, "ishwwd_on_build") -- ウインドウの作成 hide = true --これでウインド内が有効になり使えるようになる。falseならウインドウ内が使えなくなる。 end end -- 下の条件になったとき、ウインドウを作成して、テキストを表示する。 function ishwwd_on_build(ishwwd_wnd, x, y) if imgui.Button("Close", 100, 50) then ShowHideWindow = 0 -- ボタンを押したときdatarefを「0」にして、このウインドウを閉じる end local changed, Input_A_text_new = imgui.InputText("InputA", Input_A_text,18) if changed then Input_A_text = Input_A_text_new end end ishwwd_wnd = nil -- ウインドウは空にする(これにより完全に空にする) do_every_draw("ishwwd_show_wnd()") -- Closeボタンにより、datarefが「0」になり2番目ウインドウが非表示になる。 function ishwwd_hide_wnd() if ShowHideWindow == 0 and hide == true then if ishwwd_wnd then float_wnd_destroy(ishwwd_wnd)--ウインドウを隠す hide = false--これでウインド内が無効になり使えなくする。しかし非表示なので無くても問題は無い。 end end end do_every_draw("ishwwd_hide_wnd()") -- do_oftenはLuaコードを1秒ごとに計算する。do_every_draw()よりはフレームレートに影響がすくない。
この関数を使用すると、指定されたタイプの DataRef が存在しない場合に作成される。 存在し、タイプが異なる場合は、エラー メッセージが表示される。 同じタイプで存在する場合、このコマンドは何もしません。 shared(共有)DataRef は、他のプラグインとのやり取りに役立ちます。
つまり、3行目が本命のdatarefになるのだが、この3行目のdatarefのタイプをこの「define_shared_DataRef」で指定するということになる。
define_shared_DataRef(“DataRef name”, “DataRef type”)
a)DataRef name= DataRef の名前。 DataRef のリストを見ると追加されているはず、X-Planeの再起動により再読み込みが必要かも。
b)DataRef type= DataRef のタイプ。この型は文字列引数で、
“Int”、”Float”、”IntArray”、”FloatArray”、”Double”、または “Data” のいずれかを使用する。
その後、下のdatarefでその”FlyWithLua/Show_hide_window”を読み込んでいることにる。
このカスタムdatarefの作成はX-Planeを再起動してdatarefを読み込み直す必要がある。
define_shared_DataRefで複数のEditボタンを作成
Edit_1ボタンをクリックして編集ウインドウを開いた状態。Edit_2も同じ状態で開く。
これもdaraef値が変化しない「0」のまま、それでも何故か動作する。
-- カスタムdatarefを作成して書き込み可能に設定、初期は「0」に設定 define_shared_DataRef("FlyWithLua/edit_window_1", "Int") --datarefを整数で作成登録(X-Planeの再起動が必要) dataref("Edit_Window_1", "FlyWithLua/edit_window_1", "writable") --実際に使用するdataref,書き込み可能に設定 local Edit_Window_1 = 0; -- 初期設定のdataref値。 local hide_1 = false -- 隠す場合はfalseで設定 local Input_text_1 = "" define_shared_DataRef("FlyWithLua/edit_window_2", "Int") dataref("Edit_Window_2", "FlyWithLua/edit_window_2", "writable") local Edit_Window_2 = 0; local hide_2 = false local Input_text_2 = "" --------------------------------------------------------------------------------------------------- -- メインウインドウ、最初から表示し続け、隠さない。 button_wnd_1 = float_wnd_create(350, 200, 1, true) float_wnd_set_title(button_wnd_1, "Edit_1") --最初のウインドウタイトル float_wnd_set_imgui_builder(button_wnd_1, "button_demo_1") float_wnd_set_onclick(button_wnd_1, "button_on_click") float_wnd_set_onclose(button_wnd_1, "closed_demo") --これを入れるとウインドウの赤丸を押すとX-Planeがクラッシュする。 -- button_demo_1をビルド、最初に開くウインドウ、Edit_1、Edit_2のボタンを作成 function button_demo_1(button_wnd_1, x, y) if imgui.Button("Edit_1", 100, 50) then Edit_Window_1 = 1 -- dataref値「1」はEdit_1ボタンクリックで2番目のウインドウを表示 end imgui.TextUnformatted(Input_text_1) if imgui.Button("Edit_2", 100, 50) then Edit_Window_2 = 1 end imgui.TextUnformatted(Input_text_2) end function button_on_click(button_wnd_1, x, y, state) end -------------------------------------------------------------------------------------- -- Edit_1の開け閉めするウインドウ -- datarefが「1」でウインドウ作成表示、「0」で非表示にする。 function edit_show_wnd_1() if Edit_Window_1 == 1 and hide_1 == false then --1とfalseならウインドウを作成して表示する。 edit_wnd_1 = float_wnd_create(250, 150, 1, true) float_wnd_set_title(edit_wnd_1, "Show Window-1") --2番目のウインドウタイトル float_wnd_set_position(edit_wnd_1, 100, 300) float_wnd_set_imgui_builder(edit_wnd_1, "ishwwd_on_build_1") -- ウインドウの作成 hide_1 = true --これでウインド内が有効になり使えるようになる。falseならウインドウ内が使えなくなる。 end end -- Edit_1、下の条件になったとき、ウインドウを作成して、テキストを表示する。 function ishwwd_on_build_1(edit_wnd_1, x, y) if imgui.Button("Close", 100, 50) then Edit_Window_1 = 0 -- ボタンを押したときdatarefを「0」にして、このウインドウを閉じる end local changed, Input_text_1_new = imgui.InputText("InputA", Input_text_1, 18) if changed then Input_text_1 = Input_text_1_new end end edit_wnd_1 = nil -- ウインドウは空にする(これにより完全に空にする) do_every_draw("edit_show_wnd_1()") -- Edit_1、Closeボタンにより、datarefが「0」になり2番目ウインドウが非表示になる。 function edit_hide_1_wnd() if Edit_Window_1 == 0 and hide_1 == true then if edit_wnd_1 then float_wnd_destroy(edit_wnd_1) --ウインドウを隠す hide_1 = false --これでウインド内が無効になり使えなくする。しかし非表示なので無くても問題は無い。 end end end do_every_draw("edit_hide_1_wnd()") -- do_oftenはLuaコードを1秒ごとに計算する。do_every_draw()よりはフレームレートに影響がすくない。 -------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------- -- 2番目の開け閉めするウインドウ -- datarefが「2」でウインドウ作成表示、「0」で非表示にする。 function edit_show_wnd_2() if Edit_Window_2 == 1 and hide_2 == false then --2とfalseならウインドウを作成して表示する。 edit_wnd_2 = float_wnd_create(250, 250, 1, true) float_wnd_set_title(edit_wnd_2, "Show Window-2") --2番目のウインドウタイトル float_wnd_set_position(edit_wnd_2, 200, 300) float_wnd_set_imgui_builder(edit_wnd_2, "edit_on_build_2") -- ウインドウの作成 hide_2 = true --これでウインド内が有効になり使えるようになる。falseならウインドウ内が使えなくなる。 end end -- 下の条件になったとき、ウインドウを作成して、テキストを表示する。 function edit_on_build_2(edit_wnd_2, x, y) if imgui.Button("Close", 200, 50) then Edit_Window_2 = 0 -- ボタンを押したときdatarefを「0」にして、このウインドウを閉じる end local changed, Input_text_2_new = imgui.InputText("InputA", Input_text_2,28) if changed then Input_text_2 = Input_text_2_new end end edit_wnd_2 = nil -- ウインドウは空にする(これにより完全に空にする) do_every_draw("edit_show_wnd_2()") -- Closeボタンにより、datarefが「0」になり2番目ウインドウが非表示になる。 function edit_hide_wnd_2() if Edit_Window_2 == 0 and hide_2 == true then if edit_wnd_2 then float_wnd_destroy(edit_wnd_2)--ウインドウを隠す hide_2 = false--これでウインド内が無効になり使えなくする。しかし非表示なので無くても問題は無い。 end end end do_every_draw("edit_hide_wnd_2()") -- do_oftenはLuaコードを1秒ごとに計算する。do_every_draw()よりはフレームレートに影響がすくない。
define_shared_DataRefで9つのEditボタンの作成
define_shared_DataRefを使ってdatarefを登録すると値が変化しない、バグなのか、変化はしないが動作はする。ということは「DataRefTool」のバグなのかもしれない。
いずれにしても問題なく動作はする。
-- カスタムdatarefを作成して書き込み可能に設定、初期は「0」に設定 define_shared_DataRef("FlyWithLua/edit_window_1", "Int") --datarefを整数で作成登録(X-Planeの再起動が必要) dataref("Edit_Window_1", "FlyWithLua/edit_window_1", "writable") --実際に使用するdataref,書き込み可能に設定 local Edit_Window_1 = 0; -- 初期設定のdataref値。 local hide_1 = false -- 隠す場合はfalseで設定 local Input_text_1 = "" define_shared_DataRef("FlyWithLua/edit_window_2", "Int") dataref("Edit_Window_2", "FlyWithLua/edit_window_2", "writable") local Edit_Window_2 = 0; local hide_2 = false local Input_text_2 = "" define_shared_DataRef("FlyWithLua/edit_window_3", "Int") dataref("Edit_Window_3", "FlyWithLua/edit_window_3", "writable") local Edit_Window_3 = 0; local hide_3 = false local Input_text_3 = "" define_shared_DataRef("FlyWithLua/edit_window_4", "Int") dataref("Edit_Window_4", "FlyWithLua/edit_window_4", "writable") local Edit_Window_4 = 0; local hide_4 = false local Input_text_4 = "" define_shared_DataRef("FlyWithLua/edit_window_5", "Int") dataref("Edit_Window_5", "FlyWithLua/edit_window_5", "writable") local Edit_Window_5 = 0; local hide_5 = false local Input_text_5 = "" define_shared_DataRef("FlyWithLua/edit_window_6", "Int") dataref("Edit_Window_6", "FlyWithLua/edit_window_6", "writable") local Edit_Window_6 = 0; local hide_6 = false local Input_text_6 = "" define_shared_DataRef("FlyWithLua/edit_window_7", "Int") dataref("Edit_Window_7", "FlyWithLua/edit_window_7", "writable") local Edit_Window_7 = 0; local hide_7 = false local Input_text_7 = "" define_shared_DataRef("FlyWithLua/edit_window_8", "Int") dataref("Edit_Window_8", "FlyWithLua/edit_window_8", "writable") local Edit_Window_8 = 0; local hide_8 = false local Input_text_8 = "" define_shared_DataRef("FlyWithLua/edit_window_9", "Int") dataref("Edit_Window_9", "FlyWithLua/edit_window_9", "writable") local Edit_Window_9 = 0; local hide_9 = false local Input_text_9 = "" --------------------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------------------- -- 最初に表示されるメインウインドウ、隠さない。 button_wnd_1 = float_wnd_create(300, 500, 1, true) float_wnd_set_title(button_wnd_1, "Edit_1") --最初のウインドウタイトル float_wnd_set_imgui_builder(button_wnd_1, "button_demo_1") float_wnd_set_onclick(button_wnd_1, "button_on_click") float_wnd_set_onclose(button_wnd_1, "closed_demo") --これを入れるとウインドウの赤丸を押すとX-Planeがクラッシュする。 -- button_demo_1をビルド、最初に開くウインドウ、Edit_1、Edit_2のボタンを作成 function button_demo_1(button_wnd_1, x, y) if imgui.Button("Edit_1", 100, 30) then Edit_Window_1 = 1 -- dataref値「1」はEdit_1ボタンクリックで2番目のウインドウを表示 end imgui.TextUnformatted(Input_text_1) if imgui.Button("Edit_2", 100, 30) then Edit_Window_2 = 1 end imgui.TextUnformatted(Input_text_2) if imgui.Button("Edit_3", 100, 30) then Edit_Window_3 = 1 end imgui.TextUnformatted(Input_text_3) if imgui.Button("Edit_4", 100, 30) then Edit_Window_4 = 1 end imgui.TextUnformatted(Input_text_4) if imgui.Button("Edit_5", 100, 30) then Edit_Window_5 = 1 end imgui.TextUnformatted(Input_text_5) if imgui.Button("Edit_6", 100, 30) then Edit_Window_6 = 1 end imgui.TextUnformatted(Input_text_6) if imgui.Button("Edit_7", 100, 30) then Edit_Window_7 = 1 end imgui.TextUnformatted(Input_text_7) if imgui.Button("Edit_8", 100, 30) then Edit_Window_8 = 1 end imgui.TextUnformatted(Input_text_8) if imgui.Button("Edit_9", 100, 30) then Edit_Window_9 = 1 end imgui.TextUnformatted(Input_text_9) end function button_on_click(button_wnd_1, x, y, state) end ---------------------------------------------------------------------------------------------------------------------- -- Edit-1ボタンで開くウインドウ(ここからはウインドウを個別に作成する必要がある) ---------------------------------------------------------------------------------------------------------------------- -- Edit_1の開け閉めするウインドウ -- Edit_Window_1のdatarefが「1」でウインドウをビルドして表示する。 function edit_show_wnd_1() if Edit_Window_1 == 1 and hide_1 == false then --1とfalseならウインドウを作成して表示する。 edit_wnd_1 = float_wnd_create(250, 150, 1, true) float_wnd_set_title(edit_wnd_1, "Show Window-1") --2番目のウインドウタイトル float_wnd_set_position(edit_wnd_1, 100, 300) float_wnd_set_imgui_builder(edit_wnd_1, "ishwwd_on_build_1") -- ウインドウの作成 hide_1 = true --これでウインド内が有効になり使えるようになる。falseならウインドウ内が使えなくなる。 end end do_every_draw("edit_show_wnd_1()") -- ビルドされたウインドウ内に、Closeボタンとテキストを表示する。 function ishwwd_on_build_1(edit_wnd_1, x, y) if imgui.Button("Close", 100, 50) then Edit_Window_1 = 0 -- ボタンを押したときdatarefを「0」にして、このウインドウを閉じる end local changed, Input_text_1_new = imgui.InputText("InputA", Input_text_1, 18) if changed then Input_text_1 = Input_text_1_new end end edit_wnd_1 = nil -- ウインドウは空にする(これにより完全に空にする) -- Edit_1、Closeボタンにより、datarefが「0」になり2番目ウインドウが非表示になる。 function edit_hide_1_wnd() if Edit_Window_1 == 0 and hide_1 == true then if edit_wnd_1 then float_wnd_destroy(edit_wnd_1) --ウインドウを隠す hide_1 = false --これでウインド内が無効になり使えなくする。しかし非表示なので無くても問題は無い。 end end end do_every_draw("edit_hide_1_wnd()") -- do_oftenはLuaコードを1秒ごとに計算する。do_every_draw()よりはフレームレートに影響がすくない。 ---------------------------------------------------------------------------------------------------------------------- -- Edit-2ボタンで開くウインドウ ---------------------------------------------------------------------------------------------------------------------- -- 2番目の開け閉めするウインドウ -- datarefが「2」でウインドウ作成表示、「0」で非表示にする。 function edit_show_wnd_2() if Edit_Window_2 == 1 and hide_2 == false then --2とfalseならウインドウを作成して表示する。 edit_wnd_2 = float_wnd_create(250, 150, 1, true) float_wnd_set_title(edit_wnd_2, "Show Window-2") --2番目のウインドウタイトル float_wnd_set_position(edit_wnd_2, 100, 300) float_wnd_set_imgui_builder(edit_wnd_2, "edit_on_build_2") -- ウインドウの作成 hide_2 = true --これでウインド内が有効になり使えるようになる。falseならウインドウ内が使えなくなる。 end end do_every_draw("edit_show_wnd_2()") -- 下の条件になったとき、ウインドウを作成して、テキストを表示する。 function edit_on_build_2(edit_wnd_2, x, y) if imgui.Button("Close", 200, 50) then Edit_Window_2 = 0 -- ボタンを押したときdatarefを「0」にして、このウインドウを閉じる end local changed, Input_text_2_new = imgui.InputText("InputA", Input_text_2, 18) if changed then Input_text_2 = Input_text_2_new end end edit_wnd_2 = nil -- ウインドウは空にする(これにより完全に空にする) -- Closeボタンにより、datarefが「0」になり2番目ウインドウが非表示になる。 function edit_hide_wnd_2() if Edit_Window_2 == 0 and hide_2 == true then if edit_wnd_2 then float_wnd_destroy(edit_wnd_2) --ウインドウを隠す hide_2 = false --これでウインド内が無効になり使えなくする。しかし非表示なので無くても問題は無い。 end end end do_every_draw("edit_hide_wnd_2()") -- do_oftenはLuaコードを1秒ごとに計算する。do_every_draw()よりはフレームレートに影響がすくない。 ---------------------------------------------------------------------------------------------------------------------- -- Edit-3ボタンで開くウインドウ ---------------------------------------------------------------------------------------------------------------------- -- 3番目の開け閉めするウインドウ -- datarefが「3」でウインドウ作成表示、「0」で非表示にする。 function edit_show_wnd_3() if Edit_Window_3 == 1 and hide_3 == false then --3とfalseならウインドウを作成して表示する。 edit_wnd_3 = float_wnd_create(250, 150, 1, true) float_wnd_set_title(edit_wnd_3, "Show Window-3") --3番目のウインドウタイトル float_wnd_set_position(edit_wnd_3, 100, 300) float_wnd_set_imgui_builder(edit_wnd_3, "edit_on_build_3") -- ウインドウの作成 hide_3 = true --これでウインド内が有効になり使えるようになる。falseならウインドウ内が使えなくなる。 end end do_every_draw("edit_show_wnd_3()") -- 下の条件になったとき、ウインドウを作成して、テキストを表示する。 function edit_on_build_3(edit_wnd_3, x, y) if imgui.Button("Close", 200, 50) then Edit_Window_3 = 0 -- ボタンを押したときdatarefを「0」にして、このウインドウを閉じる end local changed, Input_text_3_new = imgui.InputText("InputA", Input_text_3, 18) if changed then Input_text_3 = Input_text_3_new end end edit_wnd_3 = nil -- ウインドウは空にする(これにより完全に空にする) -- Closeボタンにより、datarefが「0」になり3番目ウインドウが非表示になる。 function edit_hide_wnd_3() if Edit_Window_3 == 0 and hide_3 == true then if edit_wnd_3 then float_wnd_destroy(edit_wnd_3) --ウインドウを隠す hide_3 = false --これでウインド内が無効になり使えなくする。しかし非表示なので無くても問題は無い。 end end end do_every_draw("edit_hide_wnd_3()") ---------------------------------------------------------------------------------------------------------------------- -- Edit-4ボタンで開くウインドウ ---------------------------------------------------------------------------------------------------------------------- -- 4番目の開け閉めするウインドウ -- datarefが「4」でウインドウ作成表示、「0」で非表示にする。 function edit_show_wnd_4() if Edit_Window_4 == 1 and hide_4 == false then --4とfalseならウインドウを作成して表示する。 edit_wnd_4 = float_wnd_create(250, 150, 1, true) float_wnd_set_title(edit_wnd_4, "Show Window-4") --4番目のウインドウタイトル float_wnd_set_position(edit_wnd_4, 100, 400) float_wnd_set_imgui_builder(edit_wnd_4, "edit_on_build_4") -- ウインドウの作成 hide_4 = true --これでウインド内が有効になり使えるようになる。falseならウインドウ内が使えなくなる。 end end do_every_draw("edit_show_wnd_4()") -- 下の条件になったとき、ウインドウを作成して、テキストを表示する。 function edit_on_build_4(edit_wnd_4, x, y) if imgui.Button("Close", 200, 50) then Edit_Window_4 = 0 -- ボタンを押したときdatarefを「0」にして、このウインドウを閉じる end local changed, Input_text_4_new = imgui.InputText("InputA", Input_text_4, 18) if changed then Input_text_4 = Input_text_4_new end end edit_wnd_4 = nil -- ウインドウは空にする(これにより完全に空にする) -- Closeボタンにより、datarefが「0」になり4番目ウインドウが非表示になる。 function edit_hide_wnd_4() if Edit_Window_4 == 0 and hide_4 == true then if edit_wnd_4 then float_wnd_destroy(edit_wnd_4) --ウインドウを隠す hide_4 = false --これでウインド内が無効になり使えなくする。しかし非表示なので無くても問題は無い。 end end end do_every_draw("edit_hide_wnd_4()") ---------------------------------------------------------------------------------------------------------------------- -- Edit-5ボタンで開くウインドウ ---------------------------------------------------------------------------------------------------------------------- -- 5番目の開け閉めするウインドウ -- datarefが「5」でウインドウ作成表示、「0」で非表示にする。 function edit_show_wnd_5() if Edit_Window_5 == 1 and hide_5 == false then --5とfalseならウインドウを作成して表示する。 edit_wnd_5 = float_wnd_create(250, 150, 1, true) float_wnd_set_title(edit_wnd_5, "Show Window-5") --5番目のウインドウタイトル float_wnd_set_position(edit_wnd_5, 100, 400) float_wnd_set_imgui_builder(edit_wnd_5, "edit_on_build_5") -- ウインドウの作成 hide_5 = true --これでウインド内が有効になり使えるようになる。falseならウインドウ内が使えなくなる。 end end do_every_draw("edit_show_wnd_5()") -- 下の条件になったとき、ウインドウを作成して、テキストを表示する。 function edit_on_build_5(edit_wnd_5, x, y) if imgui.Button("Close", 200, 50) then Edit_Window_5 = 0 -- ボタンを押したときdatarefを「0」にして、このウインドウを閉じる end local changed, Input_text_5_new = imgui.InputText("InputA", Input_text_5, 15) if changed then Input_text_5 = Input_text_5_new end end edit_wnd_5 = nil -- ウインドウは空にする(これにより完全に空にする) -- Closeボタンにより、datarefが「0」になり5番目ウインドウが非表示になる。 function edit_hide_wnd_5() if Edit_Window_5 == 0 and hide_5 == true then if edit_wnd_5 then float_wnd_destroy(edit_wnd_5) --ウインドウを隠す hide_5 = false --これでウインド内が無効になり使えなくする。しかし非表示なので無くても問題は無い。 end end end do_every_draw("edit_hide_wnd_5()") ---------------------------------------------------------------------------------------------------------------------- -- Edit-6ボタンで開くウインドウ ---------------------------------------------------------------------------------------------------------------------- -- 6番目の開け閉めするウインドウ -- datarefが「6」でウインドウ作成表示、「0」で非表示にする。 function edit_show_wnd_6() if Edit_Window_6 == 1 and hide_6 == false then --6とfalseならウインドウを作成して表示する。 edit_wnd_6 = float_wnd_create(250, 150, 1, true) float_wnd_set_title(edit_wnd_6, "Show Window-6") --6番目のウインドウタイトル float_wnd_set_position(edit_wnd_6, 100, 400) float_wnd_set_imgui_builder(edit_wnd_6, "edit_on_build_6") -- ウインドウの作成 hide_6 = true --これでウインド内が有効になり使えるようになる。falseならウインドウ内が使えなくなる。 end end do_every_draw("edit_show_wnd_6()") -- 下の条件になったとき、ウインドウを作成して、テキストを表示する。 function edit_on_build_6(edit_wnd_6, x, y) if imgui.Button("Close", 200, 50) then Edit_Window_6 = 0 -- ボタンを押したときdatarefを「0」にして、このウインドウを閉じる end local changed, Input_text_6_new = imgui.InputText("InputA", Input_text_6, 18) if changed then Input_text_6 = Input_text_6_new end end edit_wnd_6 = nil -- ウインドウは空にする(これにより完全に空にする) -- Closeボタンにより、datarefが「0」になり6番目ウインドウが非表示になる。 function edit_hide_wnd_6() if Edit_Window_6 == 0 and hide_6 == true then if edit_wnd_6 then float_wnd_destroy(edit_wnd_6) --ウインドウを隠す hide_6 = false --これでウインド内が無効になり使えなくする。しかし非表示なので無くても問題は無い。 end end end do_every_draw("edit_hide_wnd_6()") ---------------------------------------------------------------------------------------------------------------------- -- Edit-7ボタンで開くウインドウ ---------------------------------------------------------------------------------------------------------------------- -- 7番目の開け閉めするウインドウ -- datarefが「7」でウインドウ作成表示、「0」で非表示にする。 function edit_show_wnd_7() if Edit_Window_7 == 1 and hide_7 == false then --7とfalseならウインドウを作成して表示する。 edit_wnd_7 = float_wnd_create(250, 150, 1, true) float_wnd_set_title(edit_wnd_7, "Show Window-7") --7番目のウインドウタイトル float_wnd_set_position(edit_wnd_7, 100, 400) float_wnd_set_imgui_builder(edit_wnd_7, "edit_on_build_7") -- ウインドウの作成 hide_7 = true --これでウインド内が有効になり使えるようになる。falseならウインドウ内が使えなくなる。 end end do_every_draw("edit_show_wnd_7()") -- 下の条件になったとき、ウインドウを作成して、テキストを表示する。 function edit_on_build_7(edit_wnd_7, x, y) if imgui.Button("Close", 200, 50) then Edit_Window_7 = 0 -- ボタンを押したときdatarefを「0」にして、このウインドウを閉じる end local changed, Input_text_7_new = imgui.InputText("InputA", Input_text_7, 18) if changed then Input_text_7 = Input_text_7_new end end edit_wnd_7 = nil -- ウインドウは空にする(これにより完全に空にする) -- Closeボタンにより、datarefが「0」になり7番目ウインドウが非表示になる。 function edit_hide_wnd_7() if Edit_Window_7 == 0 and hide_7 == true then if edit_wnd_7 then float_wnd_destroy(edit_wnd_7) --ウインドウを隠す hide_7 = false --これでウインド内が無効になり使えなくする。しかし非表示なので無くても問題は無い。 end end end do_every_draw("edit_hide_wnd_7()") ---------------------------------------------------------------------------------------------------------------------- -- Edit-8ボタンで開くウインドウ ---------------------------------------------------------------------------------------------------------------------- -- 8番目の開け閉めするウインドウ -- datarefが「8」でウインドウ作成表示、「0」で非表示にする。 function edit_show_wnd_8() if Edit_Window_8 == 1 and hide_8 == false then --8とfalseならウインドウを作成して表示する。 edit_wnd_8 = float_wnd_create(250, 150, 1, true) float_wnd_set_title(edit_wnd_8, "Show Window-8") --8番目のウインドウタイトル float_wnd_set_position(edit_wnd_8, 100, 400) float_wnd_set_imgui_builder(edit_wnd_8, "edit_on_build_8") -- ウインドウの作成 hide_8 = true --これでウインド内が有効になり使えるようになる。falseならウインドウ内が使えなくなる。 end end do_every_draw("edit_show_wnd_8()") -- 下の条件になったとき、ウインドウを作成して、テキストを表示する。 function edit_on_build_8(edit_wnd_8, x, y) if imgui.Button("Close", 200, 50) then Edit_Window_8 = 0 -- ボタンを押したときdatarefを「0」にして、このウインドウを閉じる end local changed, Input_text_8_new = imgui.InputText("InputA", Input_text_8, 18) if changed then Input_text_8 = Input_text_8_new end end edit_wnd_8 = nil -- ウインドウは空にする(これにより完全に空にする) -- Closeボタンにより、datarefが「0」になり8番目ウインドウが非表示になる。 function edit_hide_wnd_8() if Edit_Window_8 == 0 and hide_8 == true then if edit_wnd_8 then float_wnd_destroy(edit_wnd_8) --ウインドウを隠す --hide_8 = false --これでウインド内が無効になり使えなくする。しかし非表示なので無くても問題は無い。 end end end do_every_draw("edit_hide_wnd_8()") ---------------------------------------------------------------------------------------------------------------------- -- Edit-9ボタンで開くウインドウ ---------------------------------------------------------------------------------------------------------------------- -- 9番目の開け閉めするウインドウ -- datarefが「9」でウインドウ作成表示、「0」で非表示にする。 function edit_show_wnd_9() if Edit_Window_9 == 1 and hide_9 == false then --9とfalseならウインドウを作成して表示する。 edit_wnd_9 = float_wnd_create(250, 150, 1, true) float_wnd_set_title(edit_wnd_9, "Show Window-9") --9番目のウインドウタイトル float_wnd_set_position(edit_wnd_9, 100, 400) float_wnd_set_imgui_builder(edit_wnd_9, "edit_on_build_9") -- ウインドウの作成 hide_9 = true --これでウインド内が有効になり使えるようになる。falseならウインドウ内が使えなくなる。 end end do_every_draw("edit_show_wnd_9()") -- 下の条件になったとき、ウインドウを作成して、テキストを表示する。 function edit_on_build_9(edit_wnd_9, x, y) if imgui.Button("Close", 200, 50) then Edit_Window_9 = 0 -- ボタンを押したときdatarefを「0」にして、このウインドウを閉じる end local changed, Input_text_9_new = imgui.InputText("InputA", Input_text_9, 19) if changed then Input_text_9 = Input_text_9_new end end edit_wnd_9 = nil -- ウインドウは空にする(これにより完全に空にする) -- Closeボタンにより、datarefが「0」になり9番目ウインドウが非表示になる。 function edit_hide_wnd_9() if Edit_Window_9 == 0 and hide_9 == true then if edit_wnd_9 then float_wnd_destroy(edit_wnd_9) --ウインドウを隠す hide_9 = false --これでウインド内が無効になり使えなくする。しかし非表示なので無くても問題は無い。 end end end do_every_draw("edit_hide_wnd_9()")
create_dataref_tableで9つのEditボタンを作成
これだと確実にdataref値が0から1に変化する。
--配列のカスタムdatarefを作成、"IntArray"がポイント。 Edit_window = create_dataref_table("FlyWithLua/edit_window", "IntArray") Edit_window[0] = 0 -- 初期設定のdataref値 Edit_window[1] = 0 Edit_window[2] = 0 Edit_window[3] = 0 Edit_window[4] = 0 Edit_window[5] = 0 Edit_window[6] = 0 Edit_window[7] = 0 Edit_window[8] = 0 local hide_1 = false -- 初期設定 local Input_text_1 = "" local hide_2 = false local Input_text_2 = "" local hide_3 = false local Input_text_3 = "" local hide_4 = false local Input_text_4 = "" local hide_5 = false local Input_text_5 = "" local hide_6 = false local Input_text_6 = "" local hide_7 = false local Input_text_7 = "" local hide_8 = false local Input_text_8 = "" local hide_9 = false local Input_text_9 = "" --------------------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------------------- button_wnd_1 = float_wnd_create(300, 500, 1, true) float_wnd_set_title(button_wnd_1, "Edit_1") --最初のウインドウタイトル float_wnd_set_imgui_builder(button_wnd_1, "button_window") float_wnd_set_onclick(button_wnd_1, "button_on_click") float_wnd_set_onclose(button_wnd_1, "closed_demo") --これを入れるとウインドウの赤丸を押すとX-Planeがクラッシュする。 -- 最初に表示されるメインウインドウ、隠さない設定。 -- button_windowをビルド、最初に開くウインドウ、Edit_1、Edit_2のボタンを作成 function button_window(button_wnd_1, x, y) if imgui.Button("Edit_1", 100, 30) then Edit_window[0] = 1 -- dataref値「1」に変更、2番目のウインドウを表示 end imgui.TextUnformatted(Input_text_1) if imgui.Button("Edit_2", 100, 30) then Edit_window[1] = 1 end imgui.TextUnformatted(Input_text_2) if imgui.Button("Edit_3", 100, 30) then Edit_window[2] = 1 end imgui.TextUnformatted(Input_text_3) if imgui.Button("Edit_4", 100, 30) then Edit_window[3] = 1 end imgui.TextUnformatted(Input_text_4) if imgui.Button("Edit_5", 100, 30) then Edit_window[4] = 1 end imgui.TextUnformatted(Input_text_5) if imgui.Button("Edit_6", 100, 30) then Edit_window[5] = 1 end imgui.TextUnformatted(Input_text_6) if imgui.Button("Edit_7", 100, 30) then Edit_window[6] = 1 end imgui.TextUnformatted(Input_text_7) if imgui.Button("Edit_8", 100, 30) then Edit_window[7] = 1 end imgui.TextUnformatted(Input_text_8) if imgui.Button("Edit_9", 100, 30) then Edit_window[8] = 1 end imgui.TextUnformatted(Input_text_9) end function button_on_click(button_wnd_1, x, y, state) end ---------------------------------------------------------------------------------------------------------------------- -- Edit-1ボタンで開くウインドウ(ここからはウインドウを個別に作成する必要がある) ---------------------------------------------------------------------------------------------------------------------- -- Edit_1ボタンにより、開け閉めするウインドウ -- Edit_window_1のdatarefが「1」になったら、このウインドウをビルドして表示する。 function edit_show_wnd_1() if Edit_window[0] == 1 and hide_1 == false then --1とfalseならウインドウを作成して表示する。 edit_wnd_1 = float_wnd_create(250, 150, 1, true) float_wnd_set_title(edit_wnd_1, "Show Window-1") --2番目のウインドウタイトル float_wnd_set_position(edit_wnd_1, 100, 300) float_wnd_set_imgui_builder(edit_wnd_1, "ishwwd_on_build_1") -- 最初のウインドウの作成 hide_1 = true --これでCloseボタンで閉じることができる。 --これでウインド内が有効になり使えるようになる。falseならウインドウ内が使えなくなる。 end end do_every_draw("edit_show_wnd_1()") -- ビルドされたウインドウ内に、Closeボタンとテキストを表示する。 function ishwwd_on_build_1(edit_wnd_1, x, y) if imgui.Button("Close", 100, 50) then Edit_window[0] = 0 -- ボタンを押したときdatarefを「0」にして、このウインドウを閉じる end end edit_wnd_1 = nil -- ウインドウは空にする(これにより完全に空にする) -- Edit_1、Closeボタンにより、datarefが「0」になり2番目ウインドウが非表示になる。 -- ポイント、ここにも「and hide_1 == true」を入れる。これを入れないと開け閉めが不安定になる。 function edit_hide_1_wnd() if Edit_window[0] == 0 and hide_1 == true then if edit_wnd_1 then float_wnd_destroy(edit_wnd_1) --ウインドウを隠す hide_1 = false --これでウインド内が無効になり使えなくする。 end end end do_every_draw("edit_hide_1_wnd()") -- do_every_drawはLuaコードを1秒ごとに計算する。do_every_draw()よりはフレームレートに影響がすくない。 ---------------------------------------------------------------------------------------------------------------------- -- Edit-2ボタンで開くウインドウ ---------------------------------------------------------------------------------------------------------------------- -- 2番目の開け閉めするウインドウ -- datarefが「2」でウインドウ作成表示、「0」で非表示にする。 function edit_show_wnd_2() if Edit_window[1] == 1 and hide_2 == false then edit_wnd_2 = float_wnd_create(250, 150, 1, true) float_wnd_set_title(edit_wnd_2, "Show Window-2") float_wnd_set_position(edit_wnd_2, 100, 300) float_wnd_set_imgui_builder(edit_wnd_2, "edit_on_build_2") hide_2 = true end end do_every_draw("edit_show_wnd_2()") function edit_on_build_2(edit_wnd_2, x, y) if imgui.Button("Close", 200, 50) then Edit_window[1] = 0 end end edit_wnd_2 = nil function edit_hide_wnd_2() if Edit_window[1] == 0 and hide_2 == true then if edit_wnd_2 then float_wnd_destroy(edit_wnd_2) hide_2 = false end end end do_every_draw("edit_hide_wnd_2()") ---------------------------------------------------------------------------------------------------------------------- -- Edit-3ボタンで開くウインドウ ---------------------------------------------------------------------------------------------------------------------- function edit_show_wnd_3() if Edit_window[2] == 1 and hide_3 == false then edit_wnd_3 = float_wnd_create(250, 150, 1, true) float_wnd_set_title(edit_wnd_3, "Show Window-3") float_wnd_set_position(edit_wnd_3, 100, 300) float_wnd_set_imgui_builder(edit_wnd_3, "edit_on_build_3") hide_3 = true end end do_every_draw("edit_show_wnd_3()") function edit_on_build_3(edit_wnd_3, x, y) if imgui.Button("Close", 200, 50) then Edit_window[2] = 0 end end edit_wnd_3 = nil function edit_hide_wnd_3() if Edit_window[2] == 0 and hide_3 == true then if edit_wnd_3 then float_wnd_destroy(edit_wnd_3) hide_3 = false end end end do_every_draw("edit_hide_wnd_3()") ---------------------------------------------------------------------------------------------------------------------- -- Edit-4ボタンで開くウインドウ ---------------------------------------------------------------------------------------------------------------------- function edit_show_wnd_4() if Edit_window[3] == 1 and hide_4 == false then edit_wnd_4 = float_wnd_create(250, 150, 1, true) float_wnd_set_title(edit_wnd_4, "Show Window-4") float_wnd_set_position(edit_wnd_4, 100, 400) float_wnd_set_imgui_builder(edit_wnd_4, "edit_on_build_4") hide_4 = true end end do_every_draw("edit_show_wnd_4()") function edit_on_build_4(edit_wnd_4, x, y) if imgui.Button("Close", 200, 50) then Edit_window[3] = 0 end end edit_wnd_4 = nil function edit_hide_wnd_4() if Edit_window[3] == 0 and hide_4 == true then if edit_wnd_4 then float_wnd_destroy(edit_wnd_4) hide_4 = false end end end do_every_draw("edit_hide_wnd_4()") ---------------------------------------------------------------------------------------------------------------------- -- Edit-5ボタンで開くウインドウ ---------------------------------------------------------------------------------------------------------------------- function edit_show_wnd_5() if Edit_window[4] == 1 and hide_5 == false then edit_wnd_5 = float_wnd_create(250, 150, 1, true) float_wnd_set_title(edit_wnd_5, "Show Window-5") float_wnd_set_position(edit_wnd_5, 100, 400) float_wnd_set_imgui_builder(edit_wnd_5, "edit_on_build_5") hide_5 = true end end do_every_draw("edit_show_wnd_5()") function edit_on_build_5(edit_wnd_5, x, y) if imgui.Button("Close", 200, 50) then Edit_window[4] = 0 end end edit_wnd_5 = nil function edit_hide_wnd_5() if Edit_window[4] == 0 and hide_5 == true then if edit_wnd_5 then float_wnd_destroy(edit_wnd_5) hide_5 = false end end end do_every_draw("edit_hide_wnd_5()") ---------------------------------------------------------------------------------------------------------------------- -- Edit-6ボタンで開くウインドウ ---------------------------------------------------------------------------------------------------------------------- function edit_show_wnd_6() if Edit_window[5] == 1 and hide_6 == false then edit_wnd_6 = float_wnd_create(250, 150, 1, true) float_wnd_set_title(edit_wnd_6, "Show Window-6") float_wnd_set_position(edit_wnd_6, 100, 400) float_wnd_set_imgui_builder(edit_wnd_6, "edit_on_build_6") hide_6 = true end end do_every_draw("edit_show_wnd_6()") function edit_on_build_6(edit_wnd_6, x, y) if imgui.Button("Close", 200, 50) then Edit_window[5] = 0 end end edit_wnd_6 = nil function edit_hide_wnd_6() if Edit_window[5] == 0 and hide_6 == true then if edit_wnd_6 then float_wnd_destroy(edit_wnd_6) hide_6 = false end end end do_every_draw("edit_hide_wnd_6()") ---------------------------------------------------------------------------------------------------------------------- -- Edit-7ボタンで開くウインドウ ---------------------------------------------------------------------------------------------------------------------- function edit_show_wnd_7() if Edit_window[6] == 1 and hide_7 == false then edit_wnd_7 = float_wnd_create(250, 150, 1, true) float_wnd_set_title(edit_wnd_7, "Show Window-7") float_wnd_set_position(edit_wnd_7, 100, 400) float_wnd_set_imgui_builder(edit_wnd_7, "edit_on_build_7") hide_7 = true end end do_every_draw("edit_show_wnd_7()") function edit_on_build_7(edit_wnd_7, x, y) if imgui.Button("Close", 200, 50) then Edit_window[6] = 0 end end edit_wnd_7 = nil function edit_hide_wnd_7() if Edit_window[6] == 0 and hide_7 == true then if edit_wnd_7 then float_wnd_destroy(edit_wnd_7) hide_7 = false end end end do_every_draw("edit_hide_wnd_7()") ---------------------------------------------------------------------------------------------------------------------- -- Edit-8ボタンで開くウインドウ ---------------------------------------------------------------------------------------------------------------------- function edit_show_wnd_8() if Edit_window[7] == 1 and hide_8 == false then edit_wnd_8 = float_wnd_create(250, 150, 1, true) float_wnd_set_title(edit_wnd_8, "Show Window-8") float_wnd_set_position(edit_wnd_8, 100, 400) float_wnd_set_imgui_builder(edit_wnd_8, "edit_on_build_8") hide_8 = true end end do_every_draw("edit_show_wnd_8()") function edit_on_build_8(edit_wnd_8, x, y) if imgui.Button("Close", 200, 50) then Edit_window[7] = 0 end end edit_wnd_8 = nil function edit_hide_wnd_8() if Edit_window[7] == 0 and hide_8 == true then if edit_wnd_8 then float_wnd_destroy(edit_wnd_8) hide_8 = false end end end do_every_draw("edit_hide_wnd_8()") ---------------------------------------------------------------------------------------------------------------------- -- Edit-9ボタンで開くウインドウ ---------------------------------------------------------------------------------------------------------------------- function edit_show_wnd_9() if Edit_window[8] == 1 and hide_9 == false then edit_wnd_9 = float_wnd_create(250, 150, 1, true) float_wnd_set_title(edit_wnd_9, "Show Window-9") float_wnd_set_position(edit_wnd_9, 100, 400) float_wnd_set_imgui_builder(edit_wnd_9, "edit_on_build_9") hide_9 = true end end do_every_draw("edit_show_wnd_9()") function edit_on_build_9(edit_wnd_9, x, y) if imgui.Button("Close", 200, 50) then Edit_window[8] = 0 end end edit_wnd_9 = nil function edit_hide_wnd_9() if Edit_window[8] == 0 and hide_9 == true then if edit_wnd_9 then float_wnd_destroy(edit_wnd_9) hide_9 = false end end end do_every_draw("edit_hide_wnd_9()")
最後にこんな書き方もある
「datatref_x」という変数のカスタムdatarefを別途作成しとおく。
if datatref_x == 1 then open_window() end
datarefが等しく、hideの条件が合えばウインドウが作成される。
local hide = false fuction open_window() if dataref_x == 1 and hide == false then draw_window = true hide = true end end fuction close_window() if dataref_x == 0 hide == true then draw_window = false hide = false end end do_often() open_window() close_window() end