Come creare un widget scorrevole (GTK +, rapidamente)


8

Recentemente ho visto questo widget in Gedit:

inserisci qui la descrizione dell'immagine

Appare quando si preme Ctrl + F. Quello che mi interessa è come ottenere l'effetto scorrevole. Ogni suggerimento sarà apprezzato.


Non capire l'effetto scorrevole chiarisce cosa significa "effetto scorrevole"
twister_void

@Gaurav_Java sembra scorrere da sotto il pannello superiore. Se lo vedi in Gedit lo vedrai premendo 'Ctrl + F'
Ángel Araya,

L'effetto è spesso chiamato "menu a discesa", credo - a volte i menu sono animati allo stesso modo.
Steve Kroon,

1
Ho pensato che potresti usare una proprietà di transizione css, ma non vedo come cambiare il posizionamento in css. Guardando attraverso il codice gedit, sembrano usare un viewframe personalizzato per la casella di ricerca bazaar.launchpad.net/~vcs-imports/gedit/master-git/view/head:/… che animano attraverso alcuni moduli teatrali (guarda al bzr). Non sono molto bravo ad analizzare il codice C.
Ian B.

1
A proposito, questo widget è anche in Google Chrome (e presumibilmente Chromium)
Ian B.

Risposte:


7

Ho ottenuto un effetto di dissolvenza usando GTK e CSS puri .

Funziona solo in GTK 3.6 e non sono sicuro che sia possibile un effetto slide in / out, tuttavia, se lo desideri, puoi consultare la fonte su launchpad.net/uberwriter

Funziona attraverso un cambio di stato e poi Transizioni GTK ... Forse anche con altezza // larghezza sarebbe possibile.

MODIFICARE

Poiché la gente ovviamente mi ha votato in basso, ecco un'altra spiegazione più dettagliata:

Questo è il CSS che ho usato:

GtkLabel:insensitive {
    color: rgba(255,255,255,0);
    transition: 500ms ease-in-out;
}

Se lo usi come CSS (spero di poter fare riferimento a una mia spiegazione, come farlo: http://wolfvollprecht.de/blog/gtk-python-and-css-are-an-awesome-combo/ ) quindi puoi usarlo Gtk.StateFlagsper sfumare l'etichetta.

per esempio:

label.set_state_flags(Gtk.StateFlags.INSENSITIVE, True)

Quindi ottieni una transizione a zero opacità.

Tuttavia, come ho notato, non ci sono molte opzioni per influenzare il posizionamento / larghezza con CSS, quindi suppongo che sia limitato a colori / opacità ecc.

Godere.

PS: Nota che funziona solo in Gtk 3.6, da Ubuntu 12.10


Probabilmente le persone hanno effettuato il downgrade perché la domanda richiedeva un'animazione scorrevole, ma hai dato una transizione di opacità, che è totalmente diversa ... quindi non so perché così tante altre persone hanno votato . Ad ogni modo, al giorno d'oggi c'è GtkRevealer, che può fare entrambe le cose; vedi la mia risposta .
underscore_d

3

Una simile animazione non è realizzabile in GTK + puro. Non ci sono meccanismi che potrebbero elaborarlo.

Ho dato una rapida occhiata al codice sorgente di gedit, è chiaro che elaborano questa animazione da soli. Non ho esaminato i dettagli, poiché il codice relativo alle animazioni è abbastanza esteso, ma ho notato che incorporano le funzionalità di disegno del Cairo per il widget di ricerca animata. Molto probabilmente il widget viene animato spostando la sua posizione fotogramma per fotogramma e ridisegnandolo in una posizione diversa nella sovrapposizione utilizzata in una singola area di visualizzazione del testo.

Questa sembra essere la soluzione più semplice. (il codice di gedit sembra essere preparato per molte animazioni che condividono la stessa base di codice, quindi potrebbe essere eccessivo usare il suo approccio esatto in una semplice applicazione.)

Per riprodurre questo effetto, dovrai:

  • Utilizzare un widget personalizzato per il pezzo dell'interfaccia utente che si desidera far scorrere in / out.
  • Fallo reagire su eventi di disegno e timeout periodici (per ridisegnare ogni fotogramma dell'animazione)
  • Crea un overlay trasparente sul resto dei tuoi widget (o su qualsiasi area che deve apparire come se fosse sotto il widget scorrevole)
  • Disegna il widget animato manualmente su tale overlay.

Non riesco a trovare una soluzione più semplice. Tuttavia, considerando il fatto che gli sviluppatori di Gedit conoscono GTK + come probabilmente molto poco, potrebbe non esserci un trucco più semplice per ottenere tale effetto.


Sembra che la tua idea sia la "più semplice". Ho pensato che potesse essere fatto con alcuni hacking CSS, ma leggere il codice di Gedit sembra essere più simile a un hardcoded e preparato per più di una semplice voce di casella di ricerca, come dici tu. Quindi, proverò a creare un widget personalizzato e, prima di tutto, lo sposterò su determinati eventi (almeno se è possibile). Grazie per i vostri suggerimenti.
Ángel Araya,

1

Puoi usare una combinazione tra Gtk.fixed (), GObject.timeout_add e la funzione move, ecco un esempio in python:

#! / Usr / bin / python *
da gi.repository import Gtk, GObject

classe TestWindow (Gtk.Window):
     def animateImage (self):
        GObject.timeout_add (150, self.slideImage)

     def slideImage (self):
        self.positionX + = 50;
        if (self.positionX> 800):
          self.fixedWidget.move (self.logo, self.positionX, 200)
          restituisce True        
        altro:
          restituisce False 

     def __init __ (self):
        Gtk.Window .__ init __ (self, title = 'Registration')

        self.positionX = 500
        self.fixedWidget = Gtk.Fixed ()
        self.fixedWidget.set_size_request (1920,1080)
        self.fixedWidget.show ()

        self.logo = Gtk.Image.new_from_file ('picture.png')
        self.logo.show ()
        self.fixedWidget.put (self.logo, self.positionX, 200)

        self.button1 = Gtk.Button ('Fai clic per scorrere l'immagine!')
        self.button1.show ()
        self.button1.connect ('clicked', self.animateImage)
        self.button1.set_size_request (75,30)
        self.fixedWidget.put (self.button1,750,750)
        self.add (self.fixedWidget)

testWindow = TestWindow ()
testWindow.set_size_request (1920,1080)
testWindow.set_name ( 'testWindow')
testWindow.show ()

Gtk.main ()

1

Oggi c'è una vera risposta a questa domanda. Da quando è stato originariamente chiesto e risposto, il codice per rivelare un widget da libgd- che presumo sia quello che GEdit stava usando in quel momento - è stato upstream in GTK + come GtkRevealer:

https://developer.gnome.org/gtk3/stable/GtkRevealer.html

GtkRevealer supporta varie forme di transizione, comprese le direzioni cardinali della diapositiva e una dissolvenza sull'opacità.

Quindi, in questi giorni, è semplice come aggiungere il widget che si desidera passare a un GtkRevealere utilizzarne le proprietà :transition-(type|duration)e :reveal-child.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.