LINUX.ORG.RU

А почему у Gtk еще нету официальной React-подобной библиотеки поверх?

 , ,


0

2

Вот смотрю на то как в Rust делают приложения на Gtk, и очень удивляюсь, неужели кому то нравится писать вручную все эти интерфейсы в императивном стиле? А ведь пишут, еще обходя все проблемы, которые исходят из того что у Gtk свой подход к управлению памятью который на Rust не налазит, как и наследование компонентов, из за чего в Rust пришлось добавлять «классы» через макросы - https://gtk-rs.org/gtk4-rs/stable/latest/book/g_object_subclassing.html

Есть ли какая то проблема в создании libgtk-react, где можно будет описывать интерфейс декларативно, с использованием javascript, с удобным получением данных из C++ или Python части?

Вроде есть какие то библиотеки, но они нигде не используются как я понял.

★★★★★
Ответ на: комментарий от wandrien

Пиши сразу в модель, и тулкит всё обновит сам.

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

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

Еще и моментально осиливают любые фреймворки что бы сразу видеть в шаблоне представления данных логику (я до такого не могу подняться), сразу видят велосипеды и костыли в стандартном коде.

ВНЕЗАПНО любой компилируемый императивный ЯП заставляет работать с данными через указатели.

А уровень то все выше и выше, поинтересуйся что такое указатель.

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

А уровень то все выше и выше, поинтересуйся что такое указатель.

Зачем? Настоящее программирование — это только перекладывание байтов! Абстракции, придуманные позднее 70-х годов прошлого века не нужны.

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

И данные еще можно привязывать к ней

Куда «к ней»? Модель - и есть данные.

и на onClick все обрабатывать

А так ты на onClick не обрабатываешь. libastral наконец-то релизнулся?

да почувствовал-почувствовал, профессионалы продолжают подтягиваться в тред.

Ну по тебе и видно, какой ты профессионал, что собрался вешать обработчики на std:vector которых там by design нет.

(я до такого не могу подняться)

Да я заметил уже. До понимания, что тулкит спроектирован работать с моделью, а не с циклами из говна и палок вокруг std:vector, ты почему–то подняться не можешь.

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

Потому что это и есть велосипеды. Если у тебя «стандартный код» состоит из велосипедов, то это либо проблема твоя, либо выбранного инструмента.

А уровень то все выше и выше, поинтересуйся что такое указатель.

Шизофазия пошла как обычно.

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

Куда «к ней»? Модель - и есть данные.

Это модель интерфейса.

А так ты на onClick не обрабатываешь. libastral наконец-то релизнулся?

Да, onClick лишь вызывает нужное действие, но не производит его в самом обработчике.

Ну по тебе и видно, какой ты профессионал, что собрался вешать обработчики на std:vector которых там by design нет.

Во первых тебе уже было сказано что вопрос риторический, во вторых речь именно о твоей нулевости.

Шизофазия пошла как обычно.

То есть ты не осилил прочесть определение в википедии? Читать за тебя снова? Давай читать: Переменная, диапазон значений которой состоит из адресов ячеек памяти. Если компилятор внутри где то использует указатели, это не значит что в языке они представлены обязательно, и с данными нужно работать только через них, или вообще можно работать с ними.

а не с циклами из говна и палок

Это Vue, можешь сообщить всему компьюнити что они не правы, но их код короче твоей лапши из SDE, лучше поддерживается, более нагляден, одним словом полностью превосходит по уровню твои ручные создания кнопочек.

Сможешь ли ты сказать что то конкретное? Нет конечно, будешь снова что то выискивать в моих словах, отклоняясь от темы, или как обычно напишешь «И ЧЕ?», угадать довольно просто.

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

Это модель интерфейса.

В принципе на этом можно и закончить. Ты не в курсе, что такое mvc парадигма. Что википедию почитываешь, молодец. Продолжай самообразовываться.

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

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

В C это решается при помощи низкоуровневых хаков, коим GTK яркий пример. В раст-чатах обычно или орут, что не нужно, либо предлагают местный электрон с JS в качестве фронтэнда.

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

Мешать JS с HTML в лапшу можно и на Ванилле:

<html><head>
  <title>VanillaJS</title>
</head><body>
  <ul id="mylist"></ul>
  <script>
    let myitems = ["Milk", "Bread", "Eggs"].map( val => { addLi( mylist, val ); return val } );
    function addLi(ul, text, li = document.createElement( "li" ), txt = document.createTextNode( text ) ){
      ul.append( li.append( txt ) ? null : li );
    }
  </script>
  <input id="myinput">
  <button onclick="myitems.push( myinput.value );
                   addLi( mylist, myinput.value )">Add</button>
  <input id="myfilter" oninput="mylist.childNodes.forEach( val => {
                                  val.textContent.indexOf( myfilter.value ) > -1 ?
                                    val.style.display = '' :
                                    val.style.display = 'none' } )">
</body></html>

https://jsbin.com/hamulusizi/edit?html,output

Получается даже короче вашего Реакта:

<html><head>
  <title>ReactJS</title>
  <script src="https://unpkg.com/react@17/umd/react.development.js" crossorigin></script>
  <script src="https://unpkg.com/react-dom@17/umd/react-dom.development.js" crossorigin></script>
  <script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
</head><body>
  <div id="groclist"></div>
  <script type="text/babel">
    function Groclist() {
      const [items, setItems] = React.useState(["Milk", "Bread", "Eggs"])
      const [itemInput, setInput] = React.useState("")
      const [filterInput, setFilterInput] = React.useState("")
      function Items() {
        return filterInput.length ? items.filter(item => item.includes(filterInput)) : items;
      }
      return (<section>
                <ul>{ Items().map(item => (
                  <li key={item}>{item}</li>
                )) }</ul>
                <button onClick={() => setItems([...items, itemInput])}>Add element</button>
                <input value={itemInput} onChange={e => setInput(e.target.value)}/>
                Filter: <input value={filterInput} onChange={e => setFilterInput(e.target.value)}/>
              </section>);
    }
    ReactDOM.render(<Groclist />, document.getElementById('groclist'))
  </script>
</body></html>

https://jsbin.com/zucozopoti/edit?html,output

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

Я тебе дал реализовать буквально пару строк, и сразу же из за того что нету реактивности, ты допустил ошибку, если ввести что то в фильтр а потом добавить то фильтр не будет работать на этом элементе. Думаю это уже можно назвать обучением, так что жду свои деньги на карту.

И еще, заказчик забыл уточнить важную деталь, должно быть два таких списка на странице.

Так React на страницу добавляют только профессионалы, поэтому сравнение очень правильное и хорошее.

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

Сразу вспоминается.

Шок от С. Как склеивать строки? (комментарий)

(Смешинка в том, что луддит Eddy_Em не смог даже строку склеить, и вот противник React тоже не смог написать приложение в две строки)

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

А в каком таком юзкейзе нужно добавлять что-то в список и чтобы это что-то тут же скрывалось и пользователь даже не успевал понять, таки добавилось что-то в список или надо снова вводить? А в моей версии всё замечательно видно!

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

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

Кстати, где версия на два списка? Ну ладно, можешь не потеть, я дам тебе тихо уйти с позором.

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

Angular, Vue, React, это все на головы выше ручного создание кнопочки на 10 строк

Для gtk есть vala: там кнопочка создаётся одной строчкой, но все ещё слишком классически, явно не то, что ты ищешь

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

Для Gtk есть и Python, но мне не нужно просто императивное создание чего либо. Вот пример выше кинули: https://jsbin.com/zucozopoti/edit?html,output

По сути весь код это:

const [items, setItems] = React.useState(["Milk", "Bread", "Eggs"])
const [itemInput, setInput] = React.useState("")
const [filterInput, setFilterInput] = React.useState("")
const Items = () => filterInput.length ? items.filter(item => item.includes(filterInput)) : items

Представил насколько это по другому будет выглядеть на Vala? И следить за состоянием нужно, и создавать все вручную, удалять, прятать, итд.

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

да почувствовал-почувствовал, профессионалы продолжают подтягиваться в тред.

Спросил совета, теперь всех говном поливает. Раз тебе виднее, чем всем остальным вместе взятым, зачем спрашивал нас дураков?

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

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

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

По сути весь код это

Когда мне показывают вот такое и говорят что это проще и понятнее, чем создание кнопочек на vala я искренне недоумеваю

Вот поясни мне за реактивность, суть явления в том, что оно само отрисовывает из некоего представления данных-модели в интерфейс и в случае изменения данных-модели само обновляет интерфейс, так?

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

Мне не нужны советы от тех кто ничего не знает

А как ты оцениваешь кто сколько знает? Если ответ тебе не понравился - значит отвечающий - дурак? А есть вероятность, что это ты ошибаешься, а не он?

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

Когда мне показывают вот такое и говорят что это проще и понятнее, чем создание кнопочек на vala я искренне недоумеваю

Это меньше по строкам, проще поддерживать, проще отлаживать, поэтому я говорю что это проще.

Вот поясни мне за реактивность, суть явления в том, что оно само отрисовывает из некоего представления данных-модели в интерфейс и в случае изменения данных-модели само обновляет интерфейс, так?

Лучше в интернете поискать, я не умею описывать кратко суть.

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

А как ты оцениваешь кто сколько знает?

По утверждениям, например «React тащит за собой мегабайт», или «Glade XML похоже на React», ну и отдельно отсутствие какой либо логики в рассуждениях.

Если кто то говорит что 2 + 2 * 2 = 8, и при этом он явно не имеет виду какую то хитрость, а просто искренне так думает из за своих познаний, то довольно просто все определить.

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

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

Думаю это уже можно назвать обучением, так что жду свои деньги на карту.

Блин, на ЛОР стало опасно заходить. Открыл тему, написал ответ, и уже попал на бабло.

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

При чем тут std::vector? Там собственные классы для связывания данных с UI. Используй их. Запрос предельно странный.

Не по понятиям это. Реализация не должна зависеть от интерфейса. Так что все эти QList’ы - зашквар.

khrundel ★★★★
()

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

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

На всех этих ваших гтк/кутэ с одной стороны относительно несложно запилить формочку руками

Что есть сложность? Строк выходит сильно больше, если это C/C++ то там еще и контроль памяти.

Вот взять пример со списком который чуть выше по треду.

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

Ну так там есть ООП интерфейс для работы с данными. О том и речь.

А к std:vector ты никак обработчики не присобачишь там виртуальных методов не предусмотрено.

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

Это тебе кажется что проще. А нормальному программисту на сях/плюсах про этот useState ещё прочитать надо, а то ещё и мозги свои под декларативное вывернуть. А потом окажется что что-то не работает и придётся разбираться с библиотекой и костылить сбоку императивный код. Причём необязательно даже что реально не работает, возможно программист просто использует не тот инструмент.

Никогда разве не встречался с библиотекой, которая сэкономила 20 строк кода, а потом съела 100+ часов времени на костылеписание к ней?

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

Это тебе кажется что проще.

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

А нормальному программисту на сях/плюсах про этот useState ещё прочитать надо, а то ещё и мозги свои под декларативное вывернуть.

Не развалятся.

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

Vue это нормально поддерживает, в итоге ты изолируешь свой императивный код в компонент который удобно переиспользовать.

Никогда разве не встречался с библиотекой, которая сэкономила 20 строк кода, а потом съела 100+ часов времени на костылеписание к ней?

Я использую только технологии которым от 10 лет, и много звезд на GitHub, поэтому не было, но это знак того что нужно доработать библиотеку, если она что то не позволяет сделать, повторюсь не вижу где могли бы возникнуть проблемы с Vue, или GtkReact, если есть возможность встроить императивный код.

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

ундаментальные архитектурные ограничения не позволят реализовать императивную логику на свой вкус?

в частности предлагаемый javascript. Потому-что его тоже нет.

по вашей традиции, предполагаем что чудесным образом он есть: теперь чтобы воспользоваться GtkReact разработчик Rust должен владеть ещё и JS. Это конечно офигенно ускорит и упростит разработку. Или предполагаются отдельные люди ?

PS/ кстати всегда есть выход: вы можете взять node.js и своять всё там. Даже с Gtk. Но без Rust

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

JavaScript в GUI зло, разъедает мозг. P.S. Можно я продолжу валить виджеты в объекты, у которых есть свойства типа размеров и координат, и методы-коллбэки?!

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

Васянолиба без нормальной поддержки, без возможностей хотя бы голого React, с описанием интерфейса на низкоуровневом языке с ручным управлением памятью (!).

Где тут ручное управление и чего может React, чего нет здесь?

#[derive(Msg)]
pub enum Msg {
    Decrement,
    Increment,
    Quit,
}

pub struct Model {
    counter: u32,
}

#[widget]
impl Widget for Win {
    fn model() -> Model {
        Model {
            counter: 0,
        }
    }

    fn update(&mut self, event: Msg) {
        match event {
            // A call to self.label1.set_text() is automatically inserted by the
            // attribute every time the model.counter attribute is updated.
            Msg::Decrement => self.model.counter -= 1,
            Msg::Increment => self.model.counter += 1,
            Msg::Quit => gtk::main_quit(),
        }
    }

    view! {
        gtk::Window {
            gtk::Box {
                orientation: Vertical,
                gtk::Button {
                    // By default, an event with one paramater is assumed.
                    clicked => Msg::Increment,
                    // Hence, the previous line is equivalent to:
                    // clicked(_) => Increment,
                    label: "+",
                },
                gtk::Label {
                    // Bind the text property of this Label to the counter attribute
                    // of the model.
                    // Every time the counter attribute is updated, the text property
                    // will be updated too.
                    text: &self.model.counter.to_string(),
                },
                gtk::Button {
                    clicked => Msg::Decrement,
                    label: "-",
                },
            },
            // Use a tuple when you want to both send a message and return a value to
            // the GTK+ callback.
            delete_event(_, _) => (Msg::Quit, Inhibit(false)),
        }
    }
}
monk ★★★★★
()
Ответ на: комментарий от MOPKOBKA

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

А морду тебе вареньем не намазать? Ты отлично понимаешь, что я имел в виду. Не нравится слово «сложность» - назови комфортом погромиста.

Не развалятся.

Ты не в том положении чтоб их заставить. Если бы у тебя был этот самый реакт на гтк, ты бы предлагал его им, а они бы ещё подумали, надо ли. Но так как у тебя его нет, ты просишь их сначала разработать, а потом на него мигрировать. В этом случае у тебя должен быть чертовски хороший аргумент, почему именно им этот реакт нужен. «Так код чуть-чуть короче» недостаточно.

Vue это нормально поддерживает, в итоге ты изолируешь свой императивный код в компонент который удобно переиспользовать.

Так все поддерживают, тут вопрос не в том, можно ли, а в том, что любая такая удобная библиотека содержит подводные камни и есть правила, как её следует использовать, чтоб на них не наткнуться. Взять тот же реакт, сколько начинающих на нём набили шишки мешая реактовый стейт с данными внутри контролов? К твоим простым 5 строчкам внагрузку идёт большой багаж знаний о том, как следует правильно писать на реакте. И вот ты предлагаешь чуваку вместо того чтоб за час написать простенькую формочку, а потом через полгода, потратить 10 часов и довести её до ума, потратить сначала часов 5 на изучение фреймвёрка, потом полчаса на написание, при этом зная, что он толком не понимает как всё это работает и что что-то, казавшееся очевидным, может потребовать или изучения и переделки всего под реактовую идиоматику, или написания быстрого костыля, который окажется не таким быстрым, так как будет конфликтовать с реактом и надо будет долго разбираться как это разрулить.

Зачем людям это? Фронтендер по крайней мере 8*5 занимается гуём, ему подобное может помочь, а простой сишник раз в месяц этого всего касается, нафига ему эти лишние знания?

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

GJS есть, не знаю что еще нужно, ну можно V8 прикрутить.

теперь чтобы воспользоваться GtkReact разработчик Rust должен владеть ещё и JS. Это конечно офигенно ускорит и упростит разработку. Или предполагаются отдельные люди?

Конечно ускорит, отдельные люди должны быть для всего, но все есть как есть.

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

Тренирует мозг, разъедает мозг - все это фразы которые не несут в себе хоть какой то информации, а в 99% являются какими то субъективными суждениями, я бы добавил каких то фактов.

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

А морду тебе вареньем не намазать? Ты отлично понимаешь, что я имел в виду. Не нравится слово «сложность» - назови комфортом погромиста.

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

Ты не в том положении чтоб их заставить.

Согласен, заставят другие, когда увидят эффективность.

Но так как у тебя его нет, ты просишь их сначала разработать

Я?

«Так код чуть-чуть короче» недостаточно.

Намного короче, лучше отлаживается, лучше поддерживается.

Взять тот же реакт, сколько начинающих на нём набили шишки мешая реактовый стейт с данными внутри контролов?

Не знаю, но реакт довольно сложен если просто брать и писать без чтения, да.

Зачем людям это? Фронтендер по крайней мере 8*5 занимается гуём, ему подобное может помочь, а простой сишник раз в месяц этого всего касается, нафига ему эти лишние знания?

Вообще не нужны эти знания, он может делать формы без ReactGtk, он для сложных форм.

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

Добавь данных и будет ручное управление памятью, или сделай императивный компонент.

Ты же писал, что тебе императивщина не нужна, а нужно декларативно-функциональное описание как в React.

А, в целом, действительно, никто не делает, потому что такой подход мало кому нужен.

В Common Lisp тоже был cells-gtk и тоже оказался никому не нужен.

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

Ты же писал, что тебе императивщина не нужна, а нужно декларативно-функциональное описание как в React.

Ручное управление даже без императивных компонентов появится, но я про то что императивные компоненты рано или поздно понадобятся, большая часть программы естественно будет без них, или без них вообще.

потому что такой подход мало кому нужен.

На твой взгляд, почему в вебе он доминирующий?

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

На твой взгляд, почему в вебе он доминирующий?

Почти все методологии доминируют «потому что тут так принято». Периодически приходят люди из одной среды в другую и пытаются тянуть свои привычки.

Например, пришёл человек из Common Lisp. Там идеальная объектная система CLOS. Реализовал её. Другой человек пришёл из Erlang, там всё делается через лёгкие процессы. Тоже реализовал. И теперь они недоумевают, почему технология, которая доминирующая там, откуда они пришли, внезапно почти никому не нужна в JS.

monk ★★★★★
()