En el proyecto de Logros de Ubuntu, tenemos algunos errores inusuales:
Es decir, tenemos una ventana con un GtkNotebook y un GtkIconView en una página y otro en otra página.
Cuando el usuario cambia el tamaño de la ventana, la vista de iconos no llena automáticamente el espacio con iconos (permanecen en su diseño de columna original) pero si el usuario cambia las páginas de GtkNotebook y, por lo tanto, actualiza la vista de iconos, el espacio se ocupa como se esperaba. ¿Cómo podemos usar automáticamente el espacio al cambiar el tamaño de la ventana?
Sin embargo, lo que es más preocupante es que cuando aparece la ventana, podemos cambiar su tamaño más pequeño, parece que la vista de icono nos impide cambiar el tamaño y luego tener una región desplazable para los iconos.
El código se ve así. Los ListStores que manejan IconViews:
self.trophystore = Gtk.ListStore(str, GdkPixbuf.Pixbuf, bool, bool, str, str) # title, icon accomplished, locked, app, accomplishment
self.trophystore.set_sort_column_id(COL_TITLE, Gtk.SortType.ASCENDING)
self.trophy_icon.set_model(self.trophystore)
self.oppstore = Gtk.ListStore(str, GdkPixbuf.Pixbuf, bool, bool, str, str) # title, icon, accomplished, locked, app, accomplishment
self.oppstore.set_sort_column_id(COL_TITLE, Gtk.SortType.ASCENDING)
self.opp_icon.set_model(self.oppstore)
self.trophy_icon.set_text_column(COL_TITLE)
self.trophy_icon.set_pixbuf_column(COL_PIXBUF)
self.opp_icon.set_text_column(COL_TITLE)
self.opp_icon.set_pixbuf_column(COL_PIXBUF)
Aparte de esto, en realidad no hurgamos con IconViews, solo agregamos contenido a ListStores para actualizar las vistas.
El código para el proyecto está aquí . ¿Alguien puede recomendar cómo podemos solucionar estos dos problemas?
fuente
Respuestas:
Bien, ya que hemos descubierto cómo solucionar esto, describiré la solución aquí, en caso de que alguien más tenga este problema.
El truco consiste en colocar el GtkIconView en un GtkScrolledWindow y establecer su hscrollbar_policy en "siempre". Luego, se debe usar una señal de verificación de cambio de tamaño, para reaccionar cuando el usuario cambia el tamaño de la ventana (tenga en cuenta que debe verificarse si el tamaño ha cambiado, ya que la señal se emite también, por ejemplo, cuando la ventana se arrastra).
Cuando el tamaño cambia, el modelo utilizado por GtkIconView tiene que borrarse y recrearse, ya que esto desencadena GtkIconView correctamente reasignando el espacio recién ganado (o reduciéndose). Además, como resultado, la barra de desplazamiento horizontal nunca se verá, ya que GtkIconView usa exactamente tanto espacio como GtkScrolledWindow.
fuente
Mi solución preferida para este problema es una subclase muy pequeña de Gtk.IconView:
La anulación get_preferred_width permite que la vista sea arbitrariamente estrecha. La devolución de llamada de asignación de tamaño fuerza una retransmisión configurando el número de columnas a 1 y viceversa.
fuente
También puede establecer las columnas en 0 y volver a -1 cuando cambia el tamaño. De esta manera, los íconos no serán deseleccionados:
(Esto debe hacerse además de la respuesta de @ rafalcieslak ).
fuente