# ComboBoxText (Javascript)

Taryn Fox
jewelfox@fursona.net 2012
En rullgardinsmeny med bara text
Sebastian Rasmussen
sebras@gmail.com 2019
Anders Jonsson
anders.jonsson@norsjovallen.se 2021

# 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.

Om du inte behöver de extra funktionerna hos en fullständig ComboBox, eller inte är bekväm med att jobba med ListStore och TreeStore, så kan du finna det mycket enklare att använda en ComboBoxText närhelst möjligt.

# Bibliotek att importera

#!/usr/bin/gjs

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

Detta är biblioteken som vi behöver importera för att detta program ska köras. Kom ihåg att raden som säger till GNOME att vi använder Gjs alltid behöver vara först.

# Skapa programfönstret

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

// Skapa programmet i sig _init: function () { this.application = new Gtk.Application ({ application_id: 'org.example.jscomboboxtext'});

// Anslut ”activate”- och ”startup”-signaler till återanropsfunktionerna this.application.connect('activate', Lang.bind(this, this._onActivate)); this.application.connect('startup', Lang.bind(this, this._onStartup)); },

// Återanropsfunktion för ”activate”-signal visar fönster när den aktiveras _onActivate: function () { this._window.present (); },

// Återanropsfunktion för ”startup”-signal bygger användargränssnittet _onStartup: function () { this._buildUI (); },

All kod för detta exempel hamnar i klassen MessageDialogExample. Koden ovan skapar en Gtk.Application att ha våra komponenter och fönstret i.

// Bygg programmets användargränssnitt _buildUI: function () {

// Skapa programfönstret this._window = new Gtk.ApplicationWindow ({ application: this.application, window_position: Gtk.WindowPosition.CENTER, title: "Välkommen till GNOME", default_width: 200, border_width: 10 });

_buildUI-funktionen är var vi stoppar all kod för att skapa programmets användargränssnitt. Det första steget är att skapa ett nytt Gtk.ApplicationWindow att stoppa alla våra komponenter i.

# Skapa vår ComboBoxText

// Skapa kombinationsrutan this._comboBoxText = new Gtk.ComboBoxText();

// Fyll kombinationsrutan let distros = ["Välj distribution", "Fedora", "Mint", "Suse"]; for (let i = 0; i < distros.length; i++) this._comboBoxText.append_text (distros[i]); this._comboBoxText.set_active (0);

// Anslut kombinationsrutans ”changed”-signal till vår återanropsfunktion 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.

// Lägg till kombinationsrutan till fönstret this._window.add (this._comboBoxText);

// Visa fönstret och alla barnkomponenter this._window.show_all(); },

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

# Funktion som hanterar ditt val

_onComboChanged: function () {

// Svaren som vi kommer använda för vår meddelandedialog let responses = ["", "Fedora är en gemenskapsdistribution sponsrad av Red Hat.", "Mint är en populär distribution baserad på Ubuntu.", "SUSE är ett namn som delas av två olika distributioner."];

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.

// Kör programmet let app = new ComboBoxTextExample (); app.application.run (ARGV);

Slutligen skapar vi en ny instans av den slutförda ComboBoxTextExample-klassen, och startar programmet.

# Fullständigt kodexempel

#!/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);

# Djupgående dokumentation

I detta exempel använde vi följande:

Gtk.Application

Gtk.ApplicationWindow

Gtk.ComboBoxText

Gtk.MessageDialog