A ComboBox is a drop-down menu. The difference between a ComboBox and a ComboBoxText is that a ComboBoxText just has basic text options, while a full ComboBox uses a ListStore or TreeStore (which are basically spreadsheets) to show things like branching options, or pictures to go alongside each choice.
Unless you need the added features of a full ComboBox, or are comfortable working with ListStores and TreeStores, you may find it a lot simpler to use a ComboBoxText whenever possible.
These are the libraries we need to import for this application to run. Remember that the line which tells GNOME that we're using Gjs always needs to go at the start.
All the code for this sample goes in the MessageDialogExample class. The above code creates a Gtk.Application for our widgets and window to go in.
The _buildUI function is where we put all the code to create the application's user interface. The first step is creating a new Gtk.ApplicationWindow to put all our widgets into.
After we create the ComboBoxText, we use its
After we populate the ComboBoxText, we set its first entry to be active, so that we'll see the "Select distribution" line before we click on it. Then we connect its
If you'd like to add an entry to a ComboBoxText, you can use the
Finally, we add the ComboBoxText to the window, and tell the window to show itself and the widget inside it.
We're going to create a pop-up MessageDialog, which shows you a message based on which distro you select. First, we create the array of responses to use. Since the first string in our ComboBoxText is just the "Select distribution" message, we make the first string in our array blank.
Before showing a MessageDialog, we first test to make sure you didn't choose the "Select distribution" message. After that, we set its text to be the entry in the array that corresponds to the active entry in our ComboBoxText. We do that using the
Other methods you can use include
After we create the MessageDialog, we connect its response signal to the _onDialogResponse function, then tell it to show itself.
Since the only button the MessageDialog has is an OK button, we don't need to test its response_id to see which button was clicked. All we do here is destroy the popup.
Finally, we create a new instance of the finished ComboBoxTextExample class, and set the application running.
#!/usr/bin/gjs
imports.gi.versions.Gtk = '3.0';
const Gtk = imports.gi.Gtk;
class ComboBoxTextExample {
// Create the application itself
constructor() {
this.application = new Gtk.Application ({
application_id: 'org.example.jscomboboxtext'});
// Connect 'activate' and 'startup' signals to the callback functions
this.application.connect('activate', this._onActivate.bind(this));
this.application.connect('startup', this._onStartup.bind(this));
}
// Callback function for 'activate' signal presents windows when active
_onActivate() {
this._window.present ();
}
// Callback function for 'startup' signal builds the UI
_onStartup() {
this._buildUI();
}
// Build the application's UI
_buildUI() {
// Create the application window
this._window = new Gtk.ApplicationWindow ({
application: this.application,
window_position: Gtk.WindowPosition.CENTER,
title: "Welcome to GNOME",
default_width: 200,
border_width: 10 });
// Create the combobox
this._comboBoxText = new Gtk.ComboBoxText();
// Populate the combobox
let distros = ["Select distribution", "Fedora", "Mint", "Suse"];
for (let i = 0; i < distros.length; i++)
this._comboBoxText.append_text (distros[i]);
this._comboBoxText.set_active (0);
// Connect the combobox's 'changed' signal to our callback function
this._comboBoxText.connect ('changed', this._onComboChanged.bind(this));
// Add the combobox to the window
this._window.add (this._comboBoxText);
// Show the window and all child widgets
this._window.show_all();
}
_onComboChanged() {
// The responses we'll use for our messagedialog
let responses = ["",
"Fedora is a community distro sponsored by Red Hat.",
"Mint is a popular distro based on Ubuntu.",
"SUSE is a name shared by two separate distros."];
// Which combobox item is active?
let activeItem = this._comboBoxText.get_active();
// No messagedialog if you chose "Select distribution"
if (activeItem != 0) {
this._popUp = new Gtk.MessageDialog ({
transient_for: this._window,
modal: true,
buttons: Gtk.ButtonsType.OK,
message_type: Gtk.MessageType.INFO,
text: responses[activeItem]});
// Connect the OK button to a handler function
this._popUp.connect ('response', this._onDialogResponse.bind(this));
// Show the messagedialog
this._popUp.show();
}
}
_onDialogResponse() {
this._popUp.destroy ();
}
};
// Run the application
let app = new ComboBoxTextExample ();
app.application.run (ARGV);
In this sample we used the following:
Gtk.Application
Gtk.ApplicationWindow
Gtk.ComboBoxText
Gtk.MessageDialog