Cómo crear un widget deslizante (GTK +, rápidamente)

8

Recientemente he visto este widget en Gedit:

ingrese la descripción de la imagen aquí

Aparece cuando presiona Ctrl + F. Lo que me interesa es cómo obtener el efecto deslizante. Cualquier sugerencia será apreciada.

Ángel Araya
fuente
No entiendo El efecto deslizante aclara lo que significa "efecto deslizante"
twister_void
@Gaurav_Java aparece deslizándose desde debajo del panel superior. Si lo ves en Gedit, lo verás presionando 'Ctrl + F'
Ángel Araya
El efecto a menudo se llama "desplegable", creo, a veces los menús están animados de la misma manera.
Steve Kroon
1
Pensé que tal vez podría usar una propiedad de transición CSS, pero no veo cómo cambiar el posicionamiento en CSS. Mirando a través del código gedit, parecen usar un marco de vista personalizado para el cuadro de búsqueda bazaar.launchpad.net/~vcs-imports/gedit/master-git/view/head:/... que animan a través de algún módulo teatral (mira en el bzr). Sin embargo, no soy muy bueno para analizar el código C.
Ian B.
1
Por cierto, este widget también está en Google Chrome (y presumiblemente Chromium)
Ian B.

Respuestas:

7

He logrado un efecto de desvanecimiento usando GTK y CSS puro .

Solo funciona en GTK 3.6 y no estoy seguro de si sería posible un efecto deslizante de entrada / salida, sin embargo, si lo desea, puede ver la fuente en launchpad.net/uberwriter

Funciona a través de un cambio de estado y luego transiciones GTK ... Tal vez con altura // ancho también sería posible.

EDITAR

Debido a que la gente obviamente me rechazó, aquí hay otra explicación más detallada:

Este es el CSS que he usado:

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

Si usa esto como CSS (espero que me permita hacer referencia a una explicación de mí mismo, cómo hacerlo: http://wolfvollprecht.de/blog/gtk-python-and-css-are-an-awesome-combo/ ) entonces puedes usar Gtk.StateFlagspara desvanecer la etiqueta.

p.ej:

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

Luego obtienes una transición a cero opacidad.

Sin embargo, como he notado, no hay muchas opciones para influir en la ubicación / ancho con CSS, así que supongo que está limitado a colores / opacidad, etc.

Disfrutar.

PD: Tenga en cuenta que esto solo funciona en Gtk 3.6, desde Ubuntu 12.10

wolfv
fuente
Las personas probablemente votaron negativamente porque la pregunta pedía una animación deslizante, pero usted dio una transición de opacidad, que es totalmente diferente ... así que no sé por qué tantas otras personas votaron positivamente . De todos modos, hoy en día hay GtkRevealer, que puede hacer ambas cosas; ver mi respuesta .
underscore_d
3

Dicha animación no se puede lograr en GTK + puro. No hay mecanismos que lo procesen.

He echado un vistazo rápido al código fuente de gedit, está claro que procesan esta animación por su cuenta. No he examinado los detalles, ya que el código relacionado con las animaciones está bastante expandido, pero he notado que incorporan características de dibujo de Cairo para el widget de búsqueda animada. Lo más probable es que el widget se anime moviendo su posición cuadro por cuadro y redibujándolo en un lugar diferente en la superposición que se usa en un área de visualización de texto único.

Esa parece ser la solución más simple. (El código de gedit parece estar preparado para muchas animaciones que comparten la misma base de código, por lo que puede ser una exageración usar su enfoque exacto en una aplicación simple).

Para reproducir este efecto, deberá:

  • Use un widget personalizado para la pieza de la interfaz de usuario que desea deslizar hacia adentro / afuera.
  • Haz que reaccione en eventos de dibujo y tiempos de espera periódicos (para volver a dibujar cada cuadro de animación)
  • Cree una superposición transparente sobre el resto de sus widgets (o cualquier área que tenga que aparecer como si estuviera debajo del widget deslizante)
  • Dibuje el widget animado manualmente en dicha superposición.

No puedo encontrar ninguna solución más fácil. Sin embargo, teniendo en cuenta el hecho de que los desarrolladores de gedit sí conocen GTK + como probablemente muy poco, puede que no haya un truco más simple para lograr tal efecto.

Rafał Cieślak
fuente
Parece que tu idea es la "más simple". Pensé que podría hacerse con un poco de piratería de CSS, pero leer el código de Gedit parece estar más codificado y preparado para más que una simple entrada del cuadro de búsqueda, como usted dice. Por lo tanto, intentaré crear un widget personalizado y, primero, moverlo en ciertos eventos (al menos si es posible). Gracias por sus sugerencias
Ángel Araya
1

Puede usar una combinación entre Gtk.fixed (), GObject.timeout_add y la función move, aquí hay un ejemplo en python:

#! / usr / bin / python *
desde gi.repository import Gtk, GObject

clase 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)
          volver verdadero        
        más:
          falso retorno 

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

        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 ('¡Haz clic para deslizar la imagen!')
        self.button1.show ()
        self.button1.connect ('clic', 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 ()
Brahim Ayari
fuente
1

Hoy en día, hay una respuesta real a esta pregunta. Como originalmente se le preguntó y respondió, el código para revelar un widget de libgd, que supongo es lo que GEdit estaba usando en ese momento, se ha incorporado a GTK + como GtkRevealer:

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

GtkRevealer admite varias formas de transición, incluidas las direcciones cardinales de deslizamiento y un desvanecimiento en la opacidad.

Por lo tanto, en estos días, es tan simple como añadir el widget que desea transición a una GtkRevealery el uso de sus :transition-(type|duration)y :reveal-childpropiedades.

subrayado_d
fuente