# ComboBoxText (JavaScript)

Taryn Fox
jewelfox@fursona.net 2012
A text-only drop-down menu
Rafael Fontenelle
rafaelff@gnome.org 2013, 2018

# ComboBoxText

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.

# Libraries to import

#!/usr/bin/gjs

const Gtk = imports.gi.Gtk; const Lang = imports.lang;

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.

# Creating the application window

const ComboBoxTextExample = new Lang.Class ({ Name: 'ComboBoxText Example',

// Create the application itself _init: function () { this.application = new Gtk.Application ({ application_id: 'org.example.jscomboboxtext'});

// Connect 'activate' and 'startup' signals to the callback functions this.application.connect('activate', Lang.bind(this, this._onActivate)); this.application.connect('startup', Lang.bind(this, this._onStartup)); },

// Callback function for 'activate' signal presents windows when active _onActivate: function () { this._window.present (); },

// Callback function for 'startup' signal builds the UI _onStartup: function () { this._buildUI (); },

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.

// Build the application's UI _buildUI: function () {

// 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 });

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.

# Creating the ComboBoxText

// 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', Lang.bind (this, this._onComboChanged));

After we create the ComboBoxText, we use its append_text method to add text strings to it. Like the entries in an array, they each have a number for an ID, starting with 0. To make things simpler, you can actually create an array for your ComboBoxText entries, then use a for loop to append them in order, like we did here.

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 changed signal to the _onComboChanged function, so that it's called whenever you make a new selection from the drop-down menu.

If you'd like to add an entry to a ComboBoxText, you can use the insert_text method. And if you'd rather use a text string as an ID for each entry than rely on numbers alone, you can use the append and insert methods. See the links at the bottom of this tutorial for the details of how to use them.

// Add the combobox to the window this._window.add (this._comboBoxText);

// Show the window and all child widgets this._window.show_all(); },

Finally, we add the ComboBoxText to the window, and tell the window to show itself and the widget inside it.

# Function which handles your selection

_onComboChanged: function () {

// 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."];

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.

// 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', Lang.bind (this, this._onDialogResponse));

// Show the messagedialog this._popUp.show(); }

},

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 get_active method, which returns the number ID of your selection.

Other methods you can use include get_active_id, which returns the text ID assigned by append, and get_active_text, which returns the full text of the string you selected.

After we create the MessageDialog, we connect its response signal to the _onDialogResponse function, then tell it to show itself.

_onDialogResponse: function () {

this._popUp.destroy ();

}

});

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.

// Run the application let app = new ComboBoxTextExample (); app.application.run (ARGV);

Finally, we create a new instance of the finished ComboBoxTextExample class, and set the application running.

# Amostra de código completo

#!/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-depth documentation

In this sample we used the following:

Gtk.Application

Gtk.ApplicationWindow

Gtk.ComboBoxText

Gtk.MessageDialog