CSS переход / анимация в GTK +. Является ли это возможным? - PullRequest
0 голосов
/ 18 июня 2020

В документации GTK + вы можете прочитать, что:

CSS определяет механизм, с помощью которого изменения в значениях свойств CSS могут вступать в силу постепенно, а не все сразу. GTK + также поддерживает эти переходы.

Итак, я со вчерашнего дня пытался запускать переходы в приложении, написанном на GTK. К сожалению, я не сделал даже go ни на шаг, потому что в документации нет разумного примера. Может ли кто-нибудь сказать мне, как запускать CSS переходы и анимацию в приложении GTK?

EDIT: это системная проблема. Я запустил программу на openSUSE Leap на виртуальной машине, и все работает. Теперь возникает вопрос, почему это не работает в openSUSE Tumbleweed? Вот примеры, которые я пытаюсь запустить, но безуспешно.

@keyframes spin {
   to { -gtk-icon-transform: rotate(1turn); }
}

spinner {
   animation-name: spin;
   animation-duration: 1s;
   animation-timing-function: linear;
   animation-iteration-count: infinite;
}

button {
  transition-property: width;
  transition-duration: 2s;
  transition-timing-function: linear;
  transition-delay: 1s;
}

button:hover {
  width: 300px;
}

вот файл поляны:

<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.36.0 -->
<interface>
  <requires lib="gtk+" version="3.22"/>
  <object class="GtkWindow" id="main_window">
    <property name="name">main_window</property>
    <property name="can_focus">False</property>
    <child>
      <object class="GtkFixed" id="fixed">
        <property name="name">fixed</property>
        <property name="visible">True</property>
        <property name="can_focus">False</property>
        <child>
          <object class="GtkButton" id="button">
            <property name="label" translatable="yes">button</property>
            <property name="name">button</property>
            <property name="width_request">100</property>
            <property name="height_request">80</property>
            <property name="visible">True</property>
            <property name="can_focus">True</property>
            <property name="receives_default">True</property>
          </object>
          <packing>
            <property name="x">107</property>
            <property name="y">104</property>
          </packing>
        </child>
        <child>
          <object class="GtkLabel" id="label">
            <property name="name">label</property>
            <property name="width_request">100</property>
            <property name="height_request">80</property>
            <property name="visible">True</property>
            <property name="can_focus">False</property>
            <property name="label" translatable="yes">label</property>
          </object>
          <packing>
            <property name="x">107</property>
            <property name="y">17</property>
          </packing>
        </child>
        <child>
          <object class="GtkSpinner" id="spinner">
            <property name="name">spinner</property>
            <property name="width_request">100</property>
            <property name="height_request">80</property>
            <property name="visible">True</property>
            <property name="can_focus">False</property>
            <property name="active">True</property>
          </object>
          <packing>
            <property name="x">107</property>
            <property name="y">196</property>
          </packing>
        </child>
      </object>
    </child>
    <child type="titlebar">
      <placeholder/>
    </child>
  </object>
</interface>

и основной. c


#include <gtk/gtk.h>
#include <stdlib.h>

GtkBuilder *builder;

// The highest level
GObject *main_window;
GObject *fixed;

// fixed level
GObject *label;
GObject *button;
GObject *spinner;


int main(int argc, char *argv[])
{
   gtk_init(&argc, &argv);
   builder = gtk_builder_new_from_file("../glade.glade");

   main_window = gtk_builder_get_object(builder, "main_window");
   fixed = gtk_builder_get_object(builder, "fixed");
   label = gtk_builder_get_object(builder, "label");
   button = gtk_builder_get_object(builder, "button");
   spinner = gtk_builder_get_object(builder, "spinner");

   // Build signal structure
   gtk_builder_connect_signals(builder, NULL);
   g_signal_connect(main_window, "destroy", G_CALLBACK(gtk_main_quit), NULL);

   // Prepare css file
   GtkCssProvider *provider = gtk_css_provider_new();
   gtk_css_provider_load_from_path(
       provider, "../css.css", NULL);
   gtk_style_context_add_provider_for_screen(
       gdk_display_get_default_screen(gdk_display_get_default()),
       GTK_STYLE_PROVIDER(provider),
       GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);

   // Create window
   gtk_widget_show(GTK_WIDGET(main_window));
   gtk_main();

   return (EXIT_SUCCESS);
}

1 Ответ

0 голосов
/ 18 июня 2020

Проверьте свою консоль. Когда я собираю и запускаю эти 3 файла, я вижу следующее:

(a.exe:30940): Gtk-WARNING **: 17:10:50.844: Theme parsing error: test.css:20:7: 'width' is not a valid property name.

Вероятно, вы хотели min-width. И это, и Spinner прекрасно анимируются для меня после исправления этого, заменив обе ссылки на width в CSS на min-width. Я также проверил, влияет ли изменение продолжительности анимации вращения.

...