Size: a a a

2021 April 23

KF

Konstantin Firsov in dlang.ru
День добрый. Подскажите, кто-нибудь, пожалуйста, насколько корректна такая инициализация gtkd-приложения:
https://pastebin.com/jyRjVH2j
У меня простая MVC-структура, главный контроллер должен как-то дотянуться до того же sendNotification, поэтому приходится пробрасывать GioApplication ему. Пока не нашел более лучшего способа сделать это, наследоваться от gtk-классов я не могу, все наследование уже занято всяким-разным нужным.

Всем откликнувшимся - спасибо).
источник

МВ

Макс Воробьев... in dlang.ru
у Application вродь есть аналог GetInstance
источник

МВ

Макс Воробьев... in dlang.ru
static Application getDefault();
источник

KF

Konstantin Firsov in dlang.ru
ага... спасибо, сейчас попробую такой вариант.
источник
2021 April 24

KF

Konstantin Firsov in dlang.ru
как вариант, чтобы не пробрасывать ничего. хотя тут возникает другой вопрос, когда установить дефолтное приложение через setDefault. По логике вещей, раз я настраиваю экземпляр приложения через добавление addOnActivate, то setDefault должен быть вызван в самом конце после всех настроек, когда Application будет готов для запуска.

У меня же инжектится в конструктор через application.addOnActivate((GioApplication gioApp <- совсем другой объект. Т.е. создание и запуск моей иерархии классов привязано к событию и если сделать setDefault() непосредственно в addOnActivate, то это подменяет одно на другое. Не знаю, насколько они равнозначны, но я получается в будущем уже не смогу поменять их местами, поскольку в апи классов попадет именно GioApplication.... и если по каким-то причинам нужно будет обратиться к рутовому Application, то может быть проблема скорее всего.
источник

KF

Konstantin Firsov in dlang.ru
немного путает это устройство Application : GioApplication, которое тем не менее идет через странный импорт import gio.Application : GioApplication = Application
источник

МВ

Макс Воробьев... in dlang.ru
этот импорт сделан, что-бы имена классов не конфликтовали
источник

МВ

Макс Воробьев... in dlang.ru
они в оригинале GioApplication и GtkApplication. Gio/Gtk - namespace, которого в D нет
источник

МВ

Макс Воробьев... in dlang.ru
кста
источник

МВ

Макс Воробьев... in dlang.ru
источник

МВ

Макс Воробьев... in dlang.ru
в этом примере можно и просто import gio.Application  сделать
источник

KF

Konstantin Firsov in dlang.ru
ммм... да, то что они конфликтуют я уже методом тыка понял, собственно, поэтому и перенес импорт как в примерах хелловорда https://github.com/gtkd-developers/GtkD/blob/de337470d983e0eedc8667644ac511529c85cb18/demos/gtk/HelloWorld.d#L21
В моем понимании, все равно же получается, что Application заявлен по апи как потомок какого-то условного типа "GioApplication", поскольку там явно определено наследование. Методом тыка тоже установлено, что в addOnActivate нужно именно GioApplication. Раз так, то если поставить в дефолт GioApplication, то потом в классах контроллера через getDefault будет\должен быть сужающий каст GioApplication -> Application. Чет-то тут запутано как-то все.... Идея со статикой выглядит рабочей, но как-то стремно это все на фоне этих конфликтов двух Application.

Кроме того, как я понимаю, где-то кто-то может снова вызвать setDefault, что вроде таких граблей:
application.setDefault;
 application.addOnActivate((GioApplication gioApp) {
   gioApp.setDefault;
 });
источник

KF

Konstantin Firsov in dlang.ru
хотя вру
источник

KF

Konstantin Firsov in dlang.ru
получается, что getDefault только у GioApplication
источник

МВ

Макс Воробьев... in dlang.ru
можешь без проблем кастить GtkApp в GioApp
источник

KF

Konstantin Firsov in dlang.ru
ладно, ок, вопрос. А еще в gtkd есть подобные конфликты классов, или это только у этих двух Application такое?
источник

МВ

Макс Воробьев... in dlang.ru
возможно есть, но я не натыкался
источник

МВ

Макс Воробьев... in dlang.ru
кста. у тебя гтк 3 или 4?
источник

KF

Konstantin Firsov in dlang.ru
пока еще 3
источник

МВ

Макс Воробьев... in dlang.ru
с ListBox -> set model уже работал?
источник