Pull to refresh
8
0
Антон Головков @udattsk

Программист, предприниматель

Send message

Жму руку, и завидую белой завистью. Вот что значит отсутствие дурной бабы рядом 😀

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

Спасибо!

Я пока думаю следующее:
1. Для ряда задач нужно пиксель в пиксель (условный embedded)
2. Для десктопа нужна читаемость/попадаемость мышью, т.е. нужен некий scaling.

Возможно я что-то упускаю, как я сейчас думаю это сделать:
2.1. Простой случай: просто умножаем координату/размер на scale factor
2.2. Для сложных приложений возможно лучше отдельное UI представление с другой компоновкой для 4К. Т. е. если у нас стало в 4 раза больше экрана, а кнопок у нас как в условном автокаде, то имеет смсыл показать больше кнопок/инструментов.

Вообще интересно что вы думаете про подводные камни 4К, и какие есть пути решения...

Будет мелко, однозначно. Поддержка DPI и svg скоро, надеюсь, будет.

Пока есть workaround - сделать 4K темы. Контролы автоматически увеличатся под текст. Но это такое, да...
Еще надо декларативный язык для создания UI и редактор...

1>LIBCMTD.lib(exe_winmain.obj) : error LNK2019: unresolved external symbol WinMain referenced in function "int __cdecl invoke_main(void)" (?invoke_main@@YAHXZ)


К сожалению, на msvc так не работает.

Существенно переписал раздел "Главный цикл приложения". Теперь #ifdef'ы не торчат и все красиво. Спасибо еще раз за критику.

По stringview нужно подумать, скорее всего если c++14 на XP соберется то сделаем.

Спасибо за замечания по constexpr 👍

По поводу платформенных кишков с ifdef вопрос уже решен - создана новая подсистема framework.

Теперь минимальный hello_word выглядит как-то так:

#ifdef _WIN32
int APIENTRY wWinMain(_In_ HINSTANCE,
    _In_opt_ HINSTANCE,
    _In_ LPWSTR    lpCmdLine,
    _In_ int       nCmdShow)
#elif __linux__
int main(int argc, char *argv[])
#endif
{
    wui::framework::init();

    // Здесь код инициализации конфига, темы и локали

    MainFrame mainFrame;
    mainFrame.Run();

    wui::framework::run();

    return 0;
}

MainFrame.cpp:

window->init(wui::locale("main_frame", "caption"), { -1, -1, width, height },
        wui::window_style::frame, [this]() { 
          wui::framework::stop(); 
        });

Сейчас еще сделаю селектор для конфигов и обновлю статью.

Вам, и всем кто указал на эту недоработку огромная благодарность 👍

10 Mb x64, 8 Mb win32

Я всех люблю 😁
Посмотрите лучше: https://lvgl.io/
wx отдыхает, как и wui 😅

Никаких проблем собрать самому 😊
А так это не вирус, просто ругается что скачан подозрительный неподписанный exe. Еще лет 10 назад, все такие были )

Все #ifdef _WIN32 приложения (не библиотеки) имеются только в файле где находится точка входа int main(...)
Можно сделать два файла а-ля: main_win.cpp, main_lin.cpp и обойтись вообще без #ifdef _WIN32 платой за это, станет дублирование части (довольно хорошей) кода функции main()

Этот файл с функцией main, вообще такое место, куда обычно никто не лазит, там ничего нового - инициализация конфига, логгера (если есть в приложении), темы и локали.

Весь пользовательский код, пишется в классах реализации окон, и там никаких #ifdef _WIN32 обычно нет. Ну если вам не нужно, например, работать с аудио / видео, так как системные API очень отличаются. Тут мы уже делаем как раз camera_lin.cpp / camera_win.cpp потому что дублирования кода практически нет.

Да какие донаты, это как в деда мороза верить )

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

Публикация пока первая, Реддитом займемся 🤝

Смотрите, размер окна и все координаты контролов отображается 1 в 1 на экране, так как задается в пикселях. Т.е. с этим проблем нет, приложение имеет одинаковую геометрию на Win (при масштабировании 100%) и на Lin. Одно но - при использовании одинаковых шрифтов.

Я на Линукс затащил шрифты с Винды и кайфую )) тот же Телеграм в 100 удобнее читать стало. При использовании например Open Sans вместо Segoe UI, размер 14 Segoe выглядит на Linux + Open Sans на все 18. Это пока решаем поставкой тем для лиункса с уменьшенными размерами шрифтов на 4.

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

99% библиотек, которые мне нравятся, используют snake_case. Это, так же, требования boost code style, которого и придерживаемся.

Приложения у нас традиционно используют camelCase. Чтобы показать где пользовательский код, в примерах используется camelCase, в отличии от snake_case кода библиотеки.

Эхх, были бы эти "личные договоренности" я бы донаты не собирал ))

Про дизайн из 90х я имел ввиду прежде всего дизайн интерфейсов. А дизайн wxWidgets/MFC/WTL строился вокруг системного API во время ещё до c++98...

Современный C++ гораздо гибче, приятнее и лаконичнее, так что писать прием сообщений на макросах нет никакой нужды. Так же как и запихивать интерфейсы контролов в прокрустово ложе устаревших API и концепций авторов, которых уже некоторых нет в живых...

Вы не зрите в корень... wxWidgets с дизайном из начала 90х, против максимально приятного modern c++ да ещё и без шаблонной жести...

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

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

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

Ну вы не учли фатальный недостаток этих систем )

https://neolurk.org/wiki/Фатальный_недостаток

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

1

Information

Rating
4,114-th
Location
Томск, Томская обл., Россия
Date of birth
Registered
Activity

Specialization

Software Developer, Fullstack Developer
Lead
C++
Linux
SQL
OOP
Git
Python
PHP
REST
MySQL
Bash