2018/02/28(水) [n年前の日記]
#1 [ruby] Ruby-GNOME2をもう少し勉強中
Ruby-GNOME2 (Ruby/GTK2?)について、もうちょっと勉強中。環境は Windows10 x64 + Ruby 2.2.6 p396 mingw32 + gtk2 3.2.1 x86-mingw32。
とりあえず、以下ができるところまで試したり。
_table_layout_sample.rb
以下のようなウインドウが表示される。
エクスプローラからのD&Dもできてる。
ここまで動けば、コマンドラインツールをGUIで使えるようにする、ラッパーの類も書けそうな予感。
とりあえず、以下ができるところまで試したり。
- テーブルで部品(ウィジェット?)をレイアウト。
- エクスプローラからファイルをD&D(ドラッグアンドドロップ)したらファイルパスを取得。
- ファイル選択ダイアログを表示。
_table_layout_sample.rb
require 'gtk2'
require 'uri'
class MainWindow < Gtk::Window
def initialize
super("Table layout sample")
set_default_size(640, 260)
# set MainWindow spacing
self.border_width = 10
# set close button
signal_connect("destroy") { Gtk.main_quit }
tb = Gtk::Table.new(3, 7, false)
tbls = [
{:name => "jsonfile", :label => "Source Tiled JSON", :type => 0 },
{:name => "pngfile", :label => "Source PNG Image", :type => 0 },
{:name => "outfile", :label => "Output JSON", :type => 0 },
{:name => "layername", :label => "Collision layer name", :type => 1 },
{:name => "layername_s", :label => "Layer name (optional)", :type => 1 },
{:name => "nullcode", :label => "Null code", :type => 1 },
]
@entrys = {}
tbls.each_with_index do |dt, i|
lb = Gtk::Label.new(dt[:label])
tb.attach(lb, 0, 1, i, i + 1, Gtk::SHRINK, Gtk::SHRINK, 6, 6)
tf = Gtk::Entry.new
case dt[:type]
when 0
tb.attach(tf, 1, 2, i, i + 1, Gtk::FILL | Gtk::EXPAND, Gtk::SHRINK, 0, 6)
# file drop setting
Gtk::Drag.dest_set(
tf,
Gtk::Drag::DEST_DEFAULT_MOTION |
Gtk::Drag::DEST_DEFAULT_HIGHLIGHT |
Gtk::Drag::DEST_DEFAULT_DROP,
[["text/uri-list", Gtk::Drag::TARGET_OTHER_APP, 12345]],
Gdk::DragContext::ACTION_COPY | Gdk::DragContext::ACTION_MOVE
)
tf.signal_connect("drag-data-received") do |w, ct, x, y, data, info, tm|
data.uris.each { |uri|
tf.text = URI.decode(uri).gsub(/^file\:\/\/\//, "")
}
end
btn = Gtk::Button.new("...")
btn.signal_connect("clicked") {
# file select dialog
dlg = Gtk::FileChooserDialog.new(
"File select", self,
# Gtk::FileChooser::ACTION_OPEN,
Gtk::FileChooser::ACTION_SAVE,
nil,
[Gtk::Stock::CANCEL, Gtk::Dialog::RESPONSE_CANCEL],
[Gtk::Stock::OK, Gtk::Dialog::RESPONSE_ACCEPT]
)
dlg.run do |res|
tf.text = dlg.filename if res == Gtk::Dialog::RESPONSE_ACCEPT
end
dlg.destroy
}
tb.attach(btn, 2, 3, i, i + 1, Gtk::SHRINK, Gtk::SHRINK, 2, 2)
when 1
tb.attach(tf, 1, 2, i, i + 1, Gtk::FILL | Gtk::EXPAND, Gtk::SHRINK, 0, 6)
end
@entrys[dt[:name]] = tf
end
btn = Gtk::Button.new("Convert")
tb.attach_defaults(btn, 0, 3, 6, 7)
btn.signal_connect("clicked") {
jsonfile = @entrys["jsonfile"].text
pngfile = @entrys["pngfile"].text
outfile = @entrys["outfile"].text
layername = @entrys["layername"].text
layername_s = @entrys["layername_s"].text
nullcode = @entrys["nullcode"].text.to_i
s = [
"json file : #{jsonfile}",
"png image : #{pngfile}",
"output json : #{outfile}",
"layer name : #{layername}",
"layer name sub : #{layername_s}",
"null code : #{nullcode}",
].join("\n")
# display message dialog
dlg = Gtk::MessageDialog.new(
self,
Gtk::Dialog::DESTROY_WITH_PARENT,
Gtk::MessageDialog::INFO,
Gtk::MessageDialog::BUTTONS_CLOSE,
s
)
dlg.run
dlg.destroy
}
add(tb)
@entrys["layername"].text = "layer0"
@entrys["nullcode"].text = "0"
show_all
end
end
if $0 == __FILE__
w = MainWindow.new
Gtk.main
end
以下のようなウインドウが表示される。
エクスプローラからのD&Dもできてる。
ここまで動けば、コマンドラインツールをGUIで使えるようにする、ラッパーの類も書けそうな予感。
◎ 参考ページ。 :
[ ツッコむ ]
以上、1 日分です。

