I have created a GtkWindow (with a GtkFixed grid on it) in Glade and place a GTKFileChooserButton on the grid and I give the GTKFileChooserButton object the ID - fileChooser. I saved as fileChooser.glade.
So, in Julia I do the following:
using Gtk
b = GtkBuilder(filename="fileChooser.glade")
win = b["MainWindow"]
fileChooser = b["fileChooser"]
function on_fileChooser_file_set(var)
println("I'm here.")
end
id = signal_connect(on_fileChooser_file_set, fileChooser, "file-set")
showall(win)
This all works fine. I can click on the “file chooser” button, pick a file, and my callback gets executed and I see “I’m here.” in the terminal.
In the “C” world, if I wanted access to the file and directory, my callback might look like:
void on_fileChooser_file_set(GtkFileChooserButton *f) {
printf("file name = %s\n", gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(f)));
printf("folder name = %s\n", gtk_file_chooser_get_current_folder(GTK_FILECHOOSER(f)));
}
Can I do this same functionality via the Gtk.jl package using my fileChooser widget I’m accessing via GtkBuilder? If so, how?
What I am doing (for exactly that purpose) is to generate the file chooser within the “clicked” callback of the button. Here is some example code
signal_connect(btnChooser, "clicked") do widget
dlg = FileChooserDialog("Select folder", Null(), GtkFileChooserAction.SELECT_FOLDER,
"gtk-cancel", GtkResponseType.CANCEL,
"gtk-open", GtkResponseType.ACCEPT)
if ret == GtkResponseType.ACCEPT
path = Gtk.bytestring(Gtk._.filename(dlg),true)
# now do something with the path
end
destroy(dlg)
end
end
But, this isn’t using what was designed in Glade with GtkFileChooserButton - is it? This looks like you are using a button connected to the “clicked” signal and you are generating a FileChoose Dialog inside the button callback.
This is not what the Gtk implementation looks like.
{
GtkWidget *button;
button = gtk_file_chooser_button_new (_("Select a file"),
GTK_FILE_CHOOSER_ACTION_OPEN);
gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (button),
"/etc");
}
I am trying to be able to use Glade (as is) to design a GUI and use the builtin widget of Glade and the Gtk. Am I looking at this incorrectly?
yes, I also do most of the things in Glade but do some widgets on runtime.
If you want to stick to your code:
In
function on_fileChooser_file_set(var)
println("I'm here.")
end
the var
is certainly a file chooser object. I would try
function on_fileChooser_file_set(var)
filename = Gtk.bytestring(Gtk._.filename(var),true)
println("this is the filename: ", filename)
end
I don’t get anything printed in the terminal. Here’s my code:
using Gtk
b = GtkBuilder(filename="fileChooser.glade")
win = b["MainWindow"]
fileChooser = b["fileChooser"]
function on_fileChooser_file_set(var)
filename = Gtk.bytestring(Gtk._.filename(var),true)
println("this is the filename: ", filename)
#println("I'm here.")
end
id = signal_connect(on_fileChooser_file_set, fileChooser, "file-set")
showall(win)
I do see the filename in the button on MainWindow, but it doesn’t print anything to the screen.
If I change my code to:
using Gtk
b = GtkBuilder(filename="fileChooser.glade")
win = b["MainWindow"]
fileChooser = b["fileChooser"]
function on_fileChooser_file_set(var)
#filename = Gtk.bytestring(Gtk._.filename(var),true)
#println("this is the filename: ", filename)
println("I'm here.")
end
id = signal_connect(on_fileChooser_file_set, fileChooser, "file-set")
showall(win)
I do see “I’m here.” each time I click the button and choose another file.
function on_fileChooser_file_set(var)
filename = Gtk.bytestring(Gtk.GAccessor.filename(var),true)
println("this is the filename: ", filename)
#println("I'm here.")
end
I cannot test because I don’t have the glade file. Best thing to test is that you provide a minimal working example (MWE). Instead of providing the glade file, you can also paste the content of the glade file into a string my_ui_string
and call GtkBuilder(buffer=my_ui_string)
.
OK. I really do appreciate the help!
using Gtk
ui = """
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.22.1 -->
<interface>
<requires lib="gtk+" version="3.20"/>
<object class="GtkWindow" id="MainWindow">
<property name="can_focus">False</property>
<property name="title" translatable="yes">Main Window</property>
<property name="window_position">center</property>
<property name="default_width">800</property>
<property name="default_height">600</property>
<child>
<placeholder/>
</child>
<child>
<object class="GtkFixed" id="grid1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkFileChooserButton" id="fileChooser">
<property name="width_request">270</property>
<property name="height_request">42</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="title" translatable="yes"/>
<signal name="file-set" handler="on_fileChooser_file_set" swapped="no"/>
</object>
<packing>
<property name="x">80</property>
<property name="y">70</property>
</packing>
</child>
</object>
</child>
</object>
</interface>
"""
b = GtkBuilder(buffer=ui)
win = b["MainWindow"]
fileChooser = b["fileChooser"]
function on_fileChooser_file_set(var)
filename = Gtk.bytestring(Gtk._.filename(var),true)
println("this is the filename: ", filename)
#println("I'm here.")
end
id = signal_connect(on_fileChooser_file_set, fileChooser, "file-set")
showall(win)
The issue is that GtkFileChooserButton
is not yet implemented in Gtk.jl. One has to add this in few places (e.g. Gtk.jl/gtktypes.jl at master · JuliaGraphics/Gtk.jl · GitHub).
1 Like
OK. Thanks for tracking that down. So, are all of the ones with @gtktype … safe to use? If so, that’s a nice palette of controls to choose from.
Thanks again for all of your help.
Frank
yes that list is pretty safe to use. I have build larger applications with what is available in Gtk.jl. If you need more, simply extend it.