Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to change the layout of a Gtk application on fullscreen?

I'm developing another image viewer using Python and Gtk and the viewer is currently very simple: it consists of a GtkWindow with a GtkTreeView on the left side displaying the list of my images, and a GtkImage on the right side, displaying the actual image. So far, so good.

Now, I would like to go fullscreen, and display only the image with a black background, etc.

I can see several ways of doing this:

  • I can hide() the window, and display a big GtkImage instead, but I'm loosing all the stuff that I setup on the window before (signals for example), and I'm hiding the window which goes fullscreen, which is a bit weird;
  • I can hide() the content of the window, remove the content of the window (which can have only one child, as far as I know?), and put a GtkImage inside instead (and do the reverse on exiting fullscreen);
  • I can try to play with the containers inside my window, and hiding/showing their content when the window is going fullscreen/exiting fullscreen. More precisely, I was thinking of adding another GtkHBox as a direct child of my window, with two child, and displaying only the first one on "normal" mode, and only the second one on fullscreen.

That all seem a bit hacky, so I wonder what would be the recommended way to handle this kind of situation. Thanks!

like image 515
Jonathan Ballet Avatar asked Dec 01 '12 10:12

Jonathan Ballet


1 Answers

I think the simplest way to implement this is to have one layout with all your widgets setup and the signals setup. Then when you toggle in and out off fullscreen you have a set of widgets that you make visible and not visible. Try out the demonstration below. It's a simple implementation that goes in and out of fullscreen when you press F11. An HBox is used to make the layout, which contains a label on the left and an image on the right. I've filled the label with some dummy text so that it takes up a good amount of space. As you toggle in and out of fullscreen it will toggle the visibility of the label and thus make the image either take the full screen real estate or share it with the label. I just used one of the stock images that comes with gtk for demonstration purposes. Below are two screenshots showing the layout in and out of fullscreen.

Code

import gtk

def keypress(win, event):
    if event.keyval == gtk.keysyms.F11:
        win.is_fullscreen = not getattr(win, 'is_fullscreen', False)
        action = win.fullscreen if win.is_fullscreen else win.unfullscreen
        action()
        label.set_visible(not win.is_fullscreen)

win = gtk.Window()
win.connect("delete-event", gtk.main_quit)
win.connect('key-press-event', keypress)
image = gtk.image_new_from_stock(gtk.STOCK_ABOUT, gtk.ICON_SIZE_DIALOG)
label = gtk.Label(('test ' * 20 + '\n') * 20)
vbox = gtk.HBox()
vbox.add(label)
vbox.add(image)
win.add(vbox)
win.show_all()
gtk.main()

Normal window

enter image description here

Full screen

enter image description here

like image 147
Marwan Alsabbagh Avatar answered Nov 06 '22 18:11

Marwan Alsabbagh