LINUX.ORG.RU

FINAL CUT 0.9.0 - библиотека для создания консольных приложений

 , , , ,


9

1

22 мая, после более полутора лет разработки, состоялся выпуск 0.9.0 C++ библиотеки FINAL CUT, предназначенной для создания приложений с текстовым интерфейсом, не зависящей от библиотек ncurses, termbox или подобных, и распространяемой по лицензии LGPL-3.0.

Список изменений:

  • переход на использование стандарта C++14;
  • строгое использование trailing return type;
  • полностью переписано управление виртуальными окнами, что ускорило отрисовку;
  • изменён способ получения фокуса виджетом. Отправка событий фокуса больше не является отдельным шагом;
  • ускорение парсинга UTF-8;
  • использование кольцевого буфера для хранения необработанного ввода с клавиатуры и мыши;
  • очередь буфера вывода также была заменена на кольцевой буфер для повышения производительности;
  • использование хэш-таблицы для ускорения идентификации нажатых клавиш;
  • ускорено отображение теней и линий;
  • в виджет FTextView добавлена возможность подсветки текста (цветом и стилем);
  • пункты виджета FDialogListMenu теперь автоматически разрешаются и запрещаются в зависимости от количества диалогов;
  • в строке заголовка виджета FFileDialog теперь показывается фильтр файлов;
  • виртуальные окна можно перемещать вверх из области виртуального терминала;
  • для большего контроля в виджеты FLineEdit и FTextView добавлены дополнительные публичные методы;
  • в виджет FLineEdit добавлена возможность выравнивания содержимого (слева, по центру или справа);
  • в виджет FListView добавлена возможность показывать и скрывать отдельные столбцы;
  • в виджет FListView добавлены методы для удаления колонок removeColumn() и removeAllColumns();
  • флаги виджетов сгруппированы в иерархическую структуру;
  • класс вывода терминала (производный от FOutput) теперь можно изменить с помощью конструктора класса FVTerm;
  • теперь приложение уведомляется об изменении фокуса в окне терминала с помощью новых событий onTermFocusIn() и onTermFocusOut();
  • в класс FObject добавлена поддержка обратных итераторов;
  • изменения размера и положения FDialog «мышью» теперь выполняются непосредственно перед выводом в консоль;
  • добавлен новый пример, демонстрирующий звезды с эффектом параллаксной прокрутки;
  • добавлен новый пример, демонстрирующий просмотр изображений в формате X PixMap (XPM) в консоли.

>>> Подробности

★★★★★

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

От скриншота несёт вайбами Турбо Паскаля. Пока либу не изучал, но будет прикольно если она окажется круче чем GTK. :)

В разные темы умеет?

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

Лучше написать Маркусу на Гитхабе, он что-нибудь хорошее посоветует.

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

Кажется у гтк4 появилась замена.

В принципе да, выглядит так же.

wandrien ★★
()

строгое использование trailing return type;

Вот это точно все проблемы решило одним махом. Как же мы жили без этого?

her_s_gory
()

Кросивое. Года 3 назад искал что-нибудь в стиле TVision, но кроме древнего порта не нашел. С тех пор всё поменялось в лучшую сторону.

BydymTydym
()

Бесполезная.
Уже давно весь мир перешёл на использование выборочного представления иконок, когда ты можешь предложить пользователю показывать иконку, иконку+текст рядом или под ней, только текст - как это сделано в Tixati.
Универсальность наше фсио.
P.S. всегда хочется большего=закон природы.

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

строгое использование trailing return type;

Так и не понял сути сабжа

Что тут непонятного? Теперь вместо

bool isOK() {
  return false;
}

пишут

auto isOK() -> bool {
  return false;
}

Очень важное изменение. Суета ради суеты… Зато куча файлов переписано - иммитация бурной деятельности.

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

угу.

Может, на более сложных кейсах оно полезное?

bo4ok
()
Ответ на: комментарий от her_s_gory

в чем смысл? чтобы получше нагружать компилятор/процессор выводом типов? или оно всплывает как-нибудь более по-людски?

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

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

Такое бывает полезно в шаблонах. когда тип неизвестен:

template <typename T>
auto foobar(T param) -> decltype (someExpression(T)) /*здесь вывод типа*/ {
}

в остальных случаях - хз.

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

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

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

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

Нет, там про override


class Foo : public Bar {
public:
  int fooBar() override {return 42} // здесь, если нет virtual fooBar() в базе, то будет ошибка компиляции, а если без override, то не будет.
}

her_s_gory
()

/me флешбеком слышит 8bit писки спикера

Syncro ★★★★★
()

Мечтаю о фреймворке, которые будет уметь всё что ncurses/finalcut, но в консоли работать в текстовом режиме, а в графическом окружении поверх Qt. Плюс веб интерфейс но это совсем наглость

I-Love-Microsoft ★★★★★
()
Последнее исправление: I-Love-Microsoft (всего исправлений: 1)
Ответ на: комментарий от Smacker

Как много кода вы написали с использованием ncurses?

  1. достаточно – ну и как, понравилось?
  2. нисколько – вон из треда
dataman ★★★★★
() автор топика
Ответ на: комментарий от dataman

К некоторым лабам в университете делал интерфейс на ncurses, могу отметить три особенности:

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

В принципе, как мне кажется, жить с этим можно

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

Какой-то аналог TreeView в этой библиотеки есть? Ведь без него она неполноценная.

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

Встроенного виджета нет, но есть демо, использующее FListView.

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

Не все поймут, но да, пинки - наше всё 👍

Gonzo ★★★★★
()

Годно, нужно. Побольше бы таких инсталлеров в дистрах

Gonzo ★★★★★
()

Новость классная, но зачем они распыляют ресурсы СПО? Кто-нибудь будет её использовать? У того же GNU / Linux Debian уже есть графический установщик, правда я им не пользуюсь... :D

xwicked ★★☆
()
Последнее исправление: xwicked (всего исправлений: 1)
Ответ на: комментарий от I-Love-Microsoft

в консоли работать в текстовом режиме, а в графическом окружении поверх Qt. Плюс веб интерфейс но это совсем наглость

Без Qt, но для ImGui есть ImTui.

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

Красивое. dos-shell напомнило

yu-boot ★★★★★
()
Ответ на: комментарий от kirill_rrr

Как бы она и была в виде Qt, но лучше два гвоздя в крышку гроба чем один!

Skullnet ★★★★★
()

Стиль кода отвратительный, для полноценного вайба не хватает заменить префикс F на T, и строк ограниченных 256 символами, при этом со всеми этими классами это напоминает не только паскаль но и MFC.

Императивное построение формочек, с ручной реализацией реактивности, даже эмуляции immediate mode не завезено. Выглядит как попытка воссоздать дух доса, а не как современный проект.

Кстати, терминалы которые поставляются с DE не способны быстро обновить 80*25 символов, поэтому это еще и тормозной ui получится, без поддержки специальных возможнстей.

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

префикс F

Видимо, поэтому:

The design of the C++ class structure of FINAL CUT was inspired by the Qt framework.


immediate mode

Ссылка на FTXUI во втором комментарии.

using namespace ftxui;

int main(int argc, const char* argv[]) {
  int value = 50;

  // The tree of components. This defines how to navigate using the keyboard.
  auto buttons = Container::Horizontal({
      Button(
          "Decrease", [&] { value--; }, ButtonOption::Animated(Color::Red)),
      Button(
          "Reset", [&] { value = 50; }, ButtonOption::Animated(Color::Green)),
      Button(
          "Increase", [&] { value++; }, ButtonOption::Animated(Color::Blue)),
  });

  // Modify the way to render them on screen:
  auto component = Renderer(buttons, [&] {
    return vbox({
        vbox({
            text("value = " + std::to_string(value)),
            separator(),
            gauge(value * 0.01f),
        }) | border,
        buttons->Render(),
    });
  });

  auto screen = ScreenInteractive::FitComponent();
  screen.Loop(component);
  return 0;
}

Оно?

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

Да кому нравится поп, кому попадья, а кому попова дочка :)

NCurses — католичен, а finalCut — это протестантская реформация. :)

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

Кажись, годно!

Сделать к этому биндинги в какой-нибудь Питон, так вообще красота получится.

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

Выглядит красиво

Пожалуйста, как эксперт по im. UI, подскажите: как в im. UI добавлять виджеты в рантайме?

dataman ★★★★★
() автор топика
Ответ на: комментарий от dataman
void draw_main_window(struct nk_context *ctx)
{
  static int num_widgets = 0;

  if (nk_button_label(ctx, "Click to add widget")) num_widgets++;
  for (int i = 0; i < num_widgets; i++) {
    nk_label(ctx, "runtime widget");
  }  
}

Псевдокодом для Nuklear выглядеть будет так, нажатие на кнопку будет добавлять снизу label-виджеты.

Или имеется виду библиотека виджетов добавленная через .dll? Тогда код выше тоже неплохо иллюстрирует, подключаем библиотеку с этим кодом, и вызываем в нужном месте draw_main_window(ctx);

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

Выравнивать красивенько подряд идущие функции :D

LINUX-ORG-RU ★★★★★
()
Ответ на: комментарий от MOPKOBKA
static int num_widgets = 0;

Выглядит некрасиво. :)

nk_label

Потом в них можно будет изменить позицию, текст, цвет..?

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

Да уже можно иск подавать.

Претендентов много было.

Тот же ебей форум ныне тейкер айэм.

Xant1k ★★
()

А как дела с кастомизацией и темами? Наверняка же лучше, чем в GTK4.

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

Выглядит некрасиво. :)

Можно вынести state в структуру и передавать в функцию после nk_context, static это что бы не вводить лишних сущностей.

Потом в них можно будет изменить позицию, текст, цвет..?

Ты смотришь на интерфейс как на данные, а стоит смотреть как на отображение данных приложения. Согласись, делать просто так текст красным не надо? Но нужно например сделать красным имя пациента, если мы рисуем списки пациентов, где пациент может быть мертв!

struct MedClient {
  char name[80];
  bool very_mertv = false;
};

void draw_client_label(nk_context *ctx, MedClient *client)
{
  nk_label_colored(ctx, client->name, client->very_mertv ? NK_RED : NK_GREEN);
}

void draw_clients_list(nk_context *ctx, MedClient *clients, int n)
{
  for (int i = 0; i < n; i++)
    draw_client_label(ctx, &clients[i]);
}
MOPKOBKA ★★★★★
()
Последнее исправление: MOPKOBKA (всего исправлений: 4)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.