LINUX.ORG.RU

Как нарисовать круг в Haskell на Gtk ?

 ,


0

2

Часть 1: Круг должен вообще быть.

Часть 2: Круг должен быть штрих-пунктирным.

Часть 3: Круг должен быть в виде отдельного контрола, чтобы на контрол, например, можно было кликнуть как на кнопку.

Часть 4: Круг должен анимироваться, анимация должна заключаться в том, что пунктир должен ползать по периметру.

Часть 5: На одном контроле (не кнопке, а панели) должна располагаться пара пересекающихся кругов.

Часть 6: Пересекающиеся круги должны реагировать на действия пользователя (по-разному например менять цвет по mouse hover)

Часть 7: Заменить круги на шары, а пунктир на триангуляцию (треугольники, соответствующие штрихам должны быть покрашенные, а соответствующие пропускам в пунктире должны быть прозрачными).

Заодно интересует вообще отношение этого всего к реальному миру. Ведь Gtk не работает на мобильных платформах (смартфонах), потому что там какой-то другой графический стек. Стоит ли тогда разбираться, как программировать под Linux таким способом, или сразу выбрать какой-то другой? Какой?

Или всё-таки можно выбрать такие библиотеки (кажется Skia), что приложение сможет работать и там и там? У кого-нибудь получилось, например у хромиума?

★★★

Последнее исправление: Shushundr (всего исправлений: 6)

Сложность указанной задачи мало перекликается с какими либо особенностями хаскеля и на любом языке будет упираться в выбранный графический стек / UI toolkit / etc.

yoghurt ★★★★★
()
Ответ на: комментарий от yoghurt

Не только в стек/тулкит, а ещё будет упираться в наличие к нему обёрток на хаскеле.

На текущий момент я нашел только как сделать что-то с Gtk. С Qt не нашел (хотя тщательно пока не искал).

Shushundr ★★★
() автор топика
Ответ на: комментарий от Shushundr

Приложения на C++ и Qt можно собрать и для Андройда, но в некоторых случаях с танцами с бубном. А вот с хаскелем – хз. Кстати, а почему именно хаскель?

RussianWarShip
()

вот всегда так..сначала делают чистый, функциональный язык с высоким уровнем абстракций; потом бьются за монады - не ломают ли они абстрактную чистоту.

А потом «как бл@!@#$ в этом всём нарисовать кружочек?» :-)

MKuznetsov ★★★★★
()
Ответ на: комментарий от RussianWarShip

В андроеде стабильная версия NDK это 25-я:

Latest LTS Version (r25)

android {
    ndkVersion "25.0.8775105"
}

а в генте - стабильной нет, нестабильная 18, последняя доступная 24-я...

Shushundr ★★★
() автор топика

Или всё-таки можно выбрать такие библиотеки (кажется Skia), что приложение сможет работать и там и там?

Qt может и там, и там. Но да, это не хаскель, это плюсы, на худой конец питон.

Хотя и для хаскеля есть какие-то биндинги, но работают ли они с андроидом — хз.

hobbit ★★★★★
()
Последнее исправление: hobbit (всего исправлений: 1)
Ответ на: комментарий от hobbit

Qt может

Мне неясно, как этот Qt будет взаимодействовать с тамошним графическим окружением. Соглашения, протоколы и всё такое.

X11 же там нет, значит и Copy-Paste по-другому работает и Drag & Drop, а ещё там наверняка на этих планшетах есть перья, тачскрины и другие диковины, которых нет на десктопе, а работать с ними надо.

Shushundr ★★★
() автор топика
Ответ на: комментарий от Shushundr

У Qt подобное взаимодействие с системой вынесено в плагин и есть плагины для X11, Wayland, Windows и Андроед.

RussianWarShip
()
Ответ на: комментарий от Shushundr

Да, в QML всё это проработано. По технике не подскажу, ибо писал только под десктоп. Но документацию о поддержке мультитача и всего вот этого вот в Qt 5/6 видел.

hobbit ★★★★★
()

Если для андроида, то лучше диалект хаскела Eta, тогда можно дёргать графику через Java.

monk ★★★★★
()
Ответ на: комментарий от monk

А мне говорили выше, что Qt там работает и OpenGL есть.

Shushundr ★★★
() автор топика

кстати на Tcl/Tk нарисовать оный кружочек, как два пальца об асфальт. И будет работать и с MacOS и с Android и в броузер..

есть конечно штуки где это (кружочек) и ещё того проще. И это не JS

MKuznetsov ★★★★★
()
Ответ на: комментарий от MKuznetsov

Нарисовать кружочек можно практически в чём угодно. Но он же не кружочек хочет, а кастомный виджет, который будет что-то рисовать/анимировать и как-то нестандартно реагировать на пользователя.

frob ★★★★★
()
Ответ на: комментарий от monk

«Starting from Android API level 9, the Android NDK provides an API to enable the native code to directly access and manipulate the pixel buffer of the native window. This API is known as the native windows API.»

Shushundr ★★★
() автор топика
Ответ на: комментарий от frob

а кастомный виджет, который будет

А в чём с ними проблема, с этими виджетами? Неужели их запрещено писать на языках, отличных от Си…

Shushundr ★★★
() автор топика

Нашел пример с часами:
https://github.com/cohomology/gi-cairo-render/blob/master/examples/clock/Cloc...

Они круглые и анимированные (и я даже смог запустить).

Проблема в том, что я ничего не понимаю, что там понаписано.

Эту программу писало ЧЕТЫРЕ человека.

Shushundr ★★★
() автор топика
Последнее исправление: Shushundr (всего исправлений: 2)

Очередная жертва Haskell-а. Умный мальчик Вовочка спьяну сказал: - Haskell крутой язык, а взрослые дяди и не знают! Другие умные мальчики заинтересовались и сталм писать крутые программы. Задачу расстановки ферзей (в действительности не существующую) кое-как решают, а нарисовать кружок - уже проблема. Вот решат её, и запрограммируют наикрутейшую программу.

Да ещё и в Android-е. Haskell вообще можно применять в Android-е? Поискал в Google по словам haskell android

Нашлось что-то, но результат не впечатляет - какие-то костыли. В общем, ищите в Google по этим словам самостоятельно.

Partisan ★★★★
()
Ответ на: комментарий от Shushundr

Например мне непонятно, почему при выполнении кода «GTK.mainQuit» (MainQuit)

  GTK.onWidgetKeyPressEvent window $ \keyPressInfo -> do 
    keyVal <- GDK.getEventKeyKeyval keyPressInfo
    keyName <- fromMaybe Text.empty <$> GDK.keyvalName keyVal
    case Text.unpack keyName of
      "Escape" -> do GTK.mainQuit
                     return True
      _        -> return False
Программа не закрывает окно. Для того, чтобы окно закрылось нужно выйти из консоли ghci.

Неужели так сложно было закрыть окно? (и выключить свет...)

Shushundr ★★★
() автор топика
Последнее исправление: Shushundr (всего исправлений: 2)
Ответ на: комментарий от Shushundr

Ну это везде так. Выход из цикла обработки сообщений и закрытие окна — ортогональные вещи.

hbee ★★★★
()
Ответ на: комментарий от Shushundr

Нашел пример с часами: https://github.com/cohomology/gi-cairo-render/blob/master/examples/clock/Cloc

Они круглые и анимированные (и я даже смог запустить).

Проблема в том, что я ничего не понимаю, что там понаписано.

проблема в том что это не вполне виджет :-) А просто часы в канвасе. Закат солнца в ручную на языке для этого не предназначенным

так проще взять osgwidget, нарисовать сцену в блендере и запулить. Будет кружочек с освещением, тенями и анимациями. Вместо пунктира можно танцующих ,скажем фей.

99% работы не в хаскело, а в тулзах для того предназначенных. На долю хаскел останутся - разместить виджет, получить сигналы.

MKuznetsov ★★★★★
()
Ответ на: комментарий от MKuznetsov

это не вполне виджет

Ну в принципе виджеты там есть:

https://hackage.haskell.org/package/gi-gtk-4.0.5/docs/GI-Gtk-Objects-Widget.html

надо только понять, как в хаскеле наследуют.

https://it.wikireading.ru/hpZkz2xs0y
«всё, что надо знать про наследование, – это просто ограничения на класс типа-параметра при объявлении класса»

(...) => это ограничение класса типа

Приглядываемся к коду, там в строке 30 как раз написано:
drawClockBackground :: GTK.IsWidget widget =>

То есть drawClockBackground это как раз наследник виджета?

не вполне

А по-моему нормально всё.

Даже если не нормально, то в принципе-то класс-наследник сделать можно, надо только найти как.

Shushundr ★★★
() автор топика
Последнее исправление: Shushundr (всего исправлений: 1)

Интернеты рекомендуют gi-gtk-declarative, но такого пакета в генте я не нашел. Как они вообще программируют-то?

Ещё рекламируют один пример «Custom Widget»:
https://github.com/owickstrom/gi-gtk-declarative/blob/master/examples/CustomW...

Shushundr ★★★
() автор топика
Последнее исправление: Shushundr (всего исправлений: 1)
Ответ на: комментарий от Shushundr

Я не представляю откуда этот внелогический прыжок к запретам.

Проблемы с виджетами нет. Сделать хорошо работающий виджет нетривиально отличающийся от существующих базовых значительно сложнее, чем «нарисовать анимированный кружок».

По минимуму, тебе надо засабклассить DrawingArea, разрешить получать события от мыши, реализовать метод рисующий желаемое, добавить обработчик событий мыши/клавиатуры (в частности в нём определять находится ли мышь над каким-то «интересным» местом).
Если тебе таких фиговин надо на экране несколько разных, то придётся набить в свой класс всяких параметров и втыкать разные инстансы в контейнеры.

frob ★★★★★
()
Ответ на: комментарий от frob

По минимуму, тебе надо

Это я уже всё прочитал в отличном туториале по Си (там с примерами кода) - https://www.cc.gatech.edu/data_files/public/doc/gtk/tutorial/gtk_tut-20.html

Прям вот все твои вопросы описаны.

Но есть одна проблема - Си это не Хаскелл.

вот ты пишешь:

тебе надо засабклассить DrawingArea

Хотелось бы примеры Хаскелл-кода увидеть. Это же простейшая базовая задача, которая понадобится в каждом нетривиальном приложении.

Shushundr ★★★
() автор топика
Последнее исправление: Shushundr (всего исправлений: 1)
Ответ на: комментарий от frob

Ты сказал, что написать контрол крайне сложно. Я тебе ответил, что никаких проблем нет, если это делать на Си.

Shushundr ★★★
() автор топика

Часть 1: Круг должен вообще быть.

Макскомовский централ (трекер серверный),
Этапом с Gtk (зла немерено),
Лежит на сердце тяжкий Haskell.

dadd ★★★
()

пофиг на хаскель, пофиг на гтк всё что ты хочешь делается просто картинками =)

LINUX-ORG-RU ★★★★★
()
Ответ на: комментарий от monk

Не написано, как добавлять event-ы в структуру-класс.

У меня вообще такое ощущение, что они там как-бы только Си-виджеты оборачивают, а не свой предлагают сделать на хаскелле.

Shushundr ★★★
() автор топика
Последнее исправление: Shushundr (всего исправлений: 1)
Ответ на: комментарий от Shushundr

Новый сигнал пока только вручную через вызов g_signal_new и прочего. А всё остальное вот например: https://github.com/haskell-gi/haskell-gi/blob/master/examples/advanced/CustomContainer.hs честный новый класс GObject.

monk ★★★★★
()
Последнее исправление: monk (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.