2017-04-13 5 views
0

Depuis ImageMenuItem est obsolète dans GTK3 Je suis à la recherche d'un remplacement. J'ai essayé de prendre un simple MenuItem à la place et emballé un Image et un AccelLabel dedans. (Voir l'exemple ci-dessous.) Bien que cela fonctionne dans son ensemble, il y a encore deux problèmes:Remplacement pour ImageMenuItem

  1. La touche d'accélération n'est pas affichée dans l'élément de menu.
  2. Il reste une grande marge à l'icône.

Dans l'exemple suivant l'élément File|Open a été créé avec le ImageMenuItem désapprouvée alors que l'élément File|New était ma tentative pour obtenir le même résultat avec MenuItem.

Que dois-je faire pour que MenuItem ressemble à ImageMenuItem?

class Program { 

    public static void Main() 
    { 
     Gtk.Application.Init(); 

     var win = new Gtk.Window("test"); 
     var mb = new Gtk.MenuBar(); 

     var accels = new Gtk.AccelGroup(); 
     win.AddAccelGroup(accels); 

     var fileMenu = new Gtk.MenuItem("File"); 
     mb.Add(fileMenu); 
     var fileSubmenu = new Gtk.Menu(); 
     fileMenu.Submenu = fileSubmenu; 

     // 
     // File | New 
     // 
     var fileNew = new Gtk.MenuItem(); 
     fileSubmenu.Add(fileNew); 
     fileNew.AddAccelerator(
      "activate", accels, 
      new Gtk.AccelKey(Gdk.Key.n, Gdk.ModifierType.ControlMask, Gtk.AccelFlags.Visible)); 
     fileNew.Activated += (s,e) => System.Console.WriteLine("New ..."); 

     var fileNewIcon = new Gtk.Image(); 
     fileNewIcon.SetFromIconName("document-new", Gtk.IconSize.Menu); 
     var fileNewLabel = new Gtk.AccelLabel("New"); 
     fileNewLabel.AccelWidget = fileNew; 
     var hbox = new Gtk.HBox(false, 4); 
     hbox.PackStart(fileNewIcon, false, false, 0); 
     hbox.PackStart(fileNewLabel, false, false, 0); 
     fileNew.Add(hbox); 

     // 
     // File | Open 
     // 
     var fileOpen = new Gtk.ImageMenuItem("Open", accels); 
     var fileOpenIcon = new Gtk.Image(); 
     fileOpenIcon.SetFromIconName("document-open", Gtk.IconSize.Menu); 
     fileOpen.Image = fileOpenIcon; 
     fileOpen.AddAccelerator(
      "activate", accels, 
      new Gtk.AccelKey(Gdk.Key.o, Gdk.ModifierType.ControlMask, Gtk.AccelFlags.Visible)); 
     fileOpen.Activated += (s,e) => System.Console.WriteLine("Open ..."); 
     fileSubmenu.Add(fileOpen); 

     win.Add(mb); 
     win.ShowAll(); 
     win.DeleteEvent += (s,e) => Gtk.Application.Quit(); 

     Gtk.Application.Run(); 
    } 
} 

Répondre

0

L'utilisation des appels GTK brut: (traduisons dans le C# liant)

Afin de rendre l'accélérateur visible, vous devez appeler:

gtk_label_set_xalign (fileNewLabel, 0.0); 

EDIT: Vous utilisez également PackStart deux fois quand il devrait être:

gtk_container_add(hbox, fileNewIcon); 
gtk_box_pack_end(hbox, fileNewLabel, true, true, 0); 

L'espace à gauche de l'élément de menu est alloué pour vérifier bo xes et peut être désactivée avec:

gtk_menu_set_reserve_toggle_size (fileMenu , false); 

Cependant qui ne fonctionne que si le menu ne dispose pas d'un GtkCheckMenuItem en elle, depuis le GtkImageMenuItem dépréciée avait un hack pour utiliser dans la taille de bascule pré-réservé. Je ne pouvais pas trouver un moyen d'obtenir un résultat similaire au hack original, qui btw. était annotadet par l'équipe gtk avec:

/* Man this is lame hardcoding action, but I can't 
* come up with a solution that's really better. 
*/ 
+0

Ok, 'fileSubmenu.ReserveToggleSize = false;' fonctionne. Mais l'accélérateur (qui serait 'fileNewLabel.Xalign = 0.0f;') n'est pas montré ... –

+0

Désolé, j'ai raté que vous avez ajouté les éléments à l'hboy différemment, l'a réparé. – Kyto

+0

Hmm ... ne fonctionne pas. Je crains de ne pas comprendre ce que l'emballage de la boîte a à voir avec la visibilité de la touche accélératrice. –