Toolbar GTK+ 3

Si vous créez des toolbars avec GTK+ 3 elle ne suivra pas le style des autres applications et ne s’affichera pas avec le fond cool peu plus sombre que le reste de la fenêtre, mais vous aurez une simple toolbar que l’on confond avec le reste de la fenêtre.

[gallery columns=“2” ids=“232,233”]

La solution consiste à indiquer au programme la toolbar principale et il GTK+ 3 s’occupera de tout.

Je n’es pas réussi a trouver de paramètres dans Glade pour se faire, mais vous pouvez ajouter ces trois lignes dans la description de la toolbar directement dans le fichiers .glade dans le noeud <object class="GtkToolbar"/>

<class name="primary-toolbar"/>

UPDATE : Il est désormais possible d’indiquer la class primary-toolbar depuis Glade.

C’est universel est sa marche partout, mais il n’y a pas d’options pour le faire via l’interface de Glade pour le moment, enfin, à ce que je sache. Il y a aussi la class “inline-toolbar” qui est utile si vous voulez mettre votre toolbar au milieux de la fenêtre. Le rendu est presque le même, mais le bord sont de façon a ce qu’il ne touche pas les bord de la fenêtre.

Dans ce qui suit, on va faire la même chose, mais programmatiquement.

Python

Voici le code magique :

toolbar.get_style_context().add_class(Gtk.STYLE_CLASS_PRIMARY_TOOLBAR)

Exemple :

from gi.repository import Gtk

class CoolToolbar:
	def __init__(self):
		self.win = Gtk.Builder()
		self.win.add_from_file("toolbar.glade")
		self.toolbar = self.win.get_object("toolbar")
		self.toolbar.get_style_context().add_class(Gtk.STYLE_CLASS_PRIMARY_TOOLBAR)
		self.win.connect_signals(self)

	def quit(self, widget):
		Gtk.main_quit()

if __name__ == "__main__":
	CoolToolbar()
	Gtk.main()

C++

En C++, il faut d’abord ajouter le header gtkmm/stylecontext.h et se servir du code magique. Notez que si vous utilisez le header gtkmm.h vous pouvez omettre d’utiliser gtkmm/stylecontext.h comme dans l’exemple. m_toolbar->get_style_context()->add_class(GTK_STYLE_CLASS_PRIMARY_TOOLBAR);

Exemple :

#include <gtkmm.h>
//Il est déconseillé de travailler en GTK+ de cette manière là, mais je veux faire minimaliste.
int main (int argc, char *argv[])
{
	Glib::RefPtr<gtk::application> app = Gtk::Application::create(argc, argv, "org.gtkmm.toolbar");
	Gtk::Window main;
	Gtk::Toolbar* m_toolbar;

	Glib::RefPtr<gtk::builder> builder = Gtk::Builder::create_from_file("toolbar.glade");
	builder->get_widget("toolbar", m_toolbar);
	m_toolbar->get_style_context()->add_class(GTK_STYLE_CLASS_PRIMARY_TOOLBAR);

	return app->run(main);
}

Le fichier toolbar.glade que j’utilise dans tous les exemples :

<pre class="precode"><code lang="xml"><?xml version="1.0" encoding="UTF-8"?>
<interface>
  <!-- interface-requires gtk+ 3.0 -->
  <object class="GtkWindow" id="window">
    <property name="width_request">500</property>
    <property name="height_request">100</property>
    <property name="visible">True</property>
    <property name="can_focus">False</property>
    <property name="title" translatable="yes">GTK+3 Toolbar</property>
    <property name="window_position">center</property>
    <signal name="destroy" handler="quit" swapped="no"/>
    <child>
      <object class="GtkBox" id="box1">
        <property name="visible">True</property>
        <property name="can_focus">False</property>
        <property name="orientation">vertical</property>
        <child>
          <object class="GtkToolbar" id="toolbar">
            <property name="visible">True</property>
            <property name="can_focus">False</property>
            <child>
              <object class="GtkToolItem" id="toolbutton5">
                <property name="use_action_appearance">False</property>
                <property name="visible">True</property>
                <property name="can_focus">False</property>
                <property name="use_action_appearance">False</property>
                <child>
                  <object class="GtkEntry" id="entry1">
                    <property name="width_request">200</property>
                    <property name="visible">True</property>
                    <property name="can_focus">True</property>
                    <property name="invisible_char">●</property>
                    <property name="primary_icon_stock">gtk-find</property>
                  </object>
                </child>
              </object>
              <packing>
                <property name="expand">False</property>
                <property name="homogeneous">True</property>
              </packing>
            </child>
          </object>
          <packing>
            <property name="expand">False</property>
            <property name="fill">True</property>
            <property name="position">0</property>
          </packing>
        </child>
        <child>
          <object class="GtkLabel" id="label1">
            <property name="visible">True</property>
            <property name="can_focus">False</property>
            <property name="vexpand">True</property>
          </object>
          <packing>
            <property name="expand">False</property>
            <property name="fill">True</property>
            <property name="position">1</property>
          </packing>
        </child>
      </object>
    </child>
  </object>
</interface>