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>