Skip to content

Примеры

Примеры использования виджетов и привязок Тюнера.

Простое поле ввода

Добавим Tuner.Entry внутрь пустой группы:

blp
using Gtk 4.0;
using Tuner 1;

translation-domain "tuner-base";

Tuner.Page {
    title: _("New Page");
    icon-name: "computer-symbolic";

    Tuner.Group {

        Tuner.Entry { 
            title: _("Our cool entry"); 
            show-apply-button: true; 
        } 
    }
}

Но это поле не будет отображаться без привязки, поэтому добавим привязку FileContent:

blp
Tuner.Entry {
    title: _("Our cool entry");
    show-apply-button: true;

    binding: Tuner.FileContent { 
        path: "~/1.txt"; 
    } 
}
Результат

Поле ввода с привязкой FileContent

sh
$ cat 1.txt
test

Теперь это поле будет синхронизировано с файлом 1.txt в домашнем каталоге текущего пользователя.
Свойство show-apply-button позволяет сохранять введённый текст только после нажатия Enter или специальной кнопки применения.

Улучшенная привязка к содержимому файла

Теперь создадим привязку с собственным поведением.

vala
public class Base.SimpleJson : Tuner.Binding {
    public string path { get; set; }
    public string name { get; set; }
    public override Type expected_type { get { return Type.STRING; } }

    // Load json content to our entry
    public override bool get_value(ref Value value) {
        try {
            var parser = new Json.Parser();
            if (parser.load_from_file(Tuner.FileUtil.expand_home(path))) {
                var root = parser.get_root();
                if (root != null && root.get_object() != null && root.get_object().has_member(name)) {
                    var node = root.get_object().get_member(name);
                    if (node != null && node.get_string() != null) {
                        value.set_string(node.get_string());
                        return true;
                    }
                }
            }
        } catch (Error e) {
            warning("Error: %s\n", e.message);
        }

        return false;
    }

    // Write contents of our entry to file
    public override void set_value(Value value) {
        try {
            Json.Node target = null;

            var parser = new Json.Parser();
            if (parser.load_from_file(Tuner.FileUtil.expand_home(path))) {
                var root = parser.get_root();
                if (root != null && root.get_object() != null) {
                    root.get_object().set_string_member(name, value.get_string());
                    target = root;
                }
            }

            if (target == null) {
                target = new Json.Builder()
                    .begin_object()
                    .set_member_name(name)
                    .add_string_value(value.get_string())
                    .end_object()
                    .get_root();
            }

            var generator = new Json.Generator();
            generator.set_root(target);
            generator.to_file(Tuner.FileUtil.expand_home(path));
        } catch (Error e) {
            warning("Error creating/writing file: %s", e.message);
        }
    }
}

Не забудьте зарегистрировать тип, если он будет использоваться в разметке!

vala
// Insert before calling add_from_resource
typeof(Base.SimpleJson).ensure();

Теперь используем нашу привязку в разметке:

blp
using Gtk 4.0;
using Tuner 1;

translation-domain "tuner-base";

Tuner.Page {
    title: _("New Page");
    icon-name: "computer-symbolic";

    Tuner.Group {

        Tuner.Entry {
            title: "Name";
            show-apply-button: true;

            binding: $BaseSimpleJson {
                path: "~/1.json";
                name: "name";
            };
        }

        Tuner.Entry {
            title: "Surname";
            show-apply-button: true;

            binding: $BaseSimpleJson {
                path: "~/1.json";
                name: "surname";
            };
        }
    }
}

С такой привязкой текст поля ввода будет записываться в файл по указанному пути path только в член json с указанным именем name, не перезаписывая остальные члены.

Результат

Два поля ввода с собственной привязкой

sh
$ cat 1.json
{"name":"Lorem","surname":"Ipsum"}

Опубликовано под лицензией GPL-3.0+. Содержание доступно по лицензии CC BY-SA 4.0, если не указано иное.