Оберон-клуб «ВЄДАsoft»

Твердыня модульных языков
Текущее время: 27 мар 2017, 18:18

Часовой пояс: UTC + 2 часа




Начать новую тему Ответить на тему  [ Сообщений: 2 ] 
Автор Сообщение
 Заголовок сообщения: Развитие проекта Free Oberon
СообщениеДобавлено: 05 фев 2017, 15:43 
Не в сети
Аватара пользователя

Сообщения: 791
Откуда: Днепропетровская обл.
Артур Ефимов писал(а):
Привет!

Со временем можно приспособить Free Oberon и для работы с Ofront+. Уверен, что это будет совсем несложно. Я выбрал voc, потому что мне срочно нужна была рабочая версия для того, чтобы начать обучение группы по Оберону. Кстати, у нас уже было 7 занятий, в группу поступили ещё 4 новичка. Пока усиленно пишем циклы WHILE, и используем почти только тип INTEGER. Скоро будем вводить процедуры и массивы. Всем очень нравится, особенно мне :D

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

Многомодульные проекты обязательно надо делать, это будет следующий существенный шаг в развитии Free Oberon.
Кроме того, для этого надо бы сделать многооконную систему, то есть чтобы можно было держать открытыми сразу несколько текстовых файлов. В свою очередь, для этого нужна полноценная система (псевдо-)графического интерфейса, я её как раз и разрабатываю в свободное время. Модуль Gui.Mod, который работает на Graph.Mod. Написано уже очень много кода, получилась система, напоминающая VCL в Делфи и подобные вещи. При этом я использовал метод построения объектов из Оберон-07 (см. запись MethodDesc), а не систему Оберон-02. Решил посмотреть, насколько это удобно. Вроде бы, неплохо.

Пример:

Код: "OBERON"
  1. MODULE TestGui;
  2. IMPORT G := Graph, Gui, Out;
  3. VAR screen: G.Bitmap; f: Gui.Form; b: Gui.Button;
  4. BEGIN
  5. G.Settings(640, 480, {G.fullscreen, G.spread, G.sharpPixels, G.initMouse});
  6. screen := G.Init();
  7. IF screen = NIL THEN Out.String('Grpah init failed.'); Out.Ln
  8. ELSE
  9. Gui.Init(screen);
  10. f := Gui.NewForm();
  11. f.do.setBounds(f, 0, 0, screen.w, screen.h);
  12. b := Gui.NewButton('Finish');
  13. b.do.setBounds(b, f.w - 100, f.h - 33, 90, 23);
  14. f.do(Gui.ContainerMethod).append(f, b);
  15. Gui.Run(f);
  16. G.Close
  17. END
  18. END TestGui.

Весь интерфейс, включая указатель мышки, отрисовывается в Обероне. На снимке отпечатался указатель ОС, но в программе он не виден.

Изображение

А обработчики событий подключаются так:
(При нажатии кнопки она будет двигаться на 5 пикселей влево.)

Код: "OBERON"
  1. PROCEDURE FinishClick(c: Gui.Component);
  2. BEGIN
  3. c.do.setX(c, c.x - 5)
  4. END FinishClick;
  5. ...
  6. b.do.setOnClick(b, FinishClick);


Пока что есть события MouseDown, MouseUp, MouseMove, MouseEnter, MouseLeave, KeyDown, TextInput, Click, GetFocus, LostFocus.
Седалны компоненты: Form, Button, Edit, Panel, ScrollBox и можно создавать свои.
Модуль Gui занимает 1172 строки. Graph и SDL2 тоже кое-как подправлен, в SDL2 исправлено несколько глюков.

* * *

Что-то я увлёкся рассказом о Gui, но эту наработку и надо будет использовать в Free Oberon, чтобы сделать многооконный режим, как в Турбо Паскале.

Ещё одна проблема, которую предстоит решить — это понять, как среда будет понимать, что ей делать, когда пользователь нажимает F9 (компиляция и запуск). Хотелось бы сделать, чтобы простые одномодульные программки можно было писать также, как сейчас — чтобы не надо было создавать «проект» под каждый HelloWorld как в каком-нибудь Делфи, и, соответственно, выделять под него каталог и прочее...

При этом, нельзя сделать и так, чтобы среда сама определяла, что́ перед ней: многомодульный проект или просто модуль, который надо бы запустить. В Обероне нет отдельного слова "PROGRAM" (и это хорошо), но это только одна сторона проблемы. А что если человек создаст проект в отдельном каталоге, а потом в тот же каталог накидает файлов-одиночек? Что среда должна делать, когда открывает файл-одиночку: предполагать, что это часть проекта или нет? В общем, надо как-то придумать, чтоб удобно было. Задача это, как оказалось, нетривиальная, учитывая что мы используем язык Оберон для создания обычных «приложений», а не «новой части модульной системы» ОС Оберон.

* * *

Насчёт шрифтов, мне пару человек тоже про это сказали. Кому-то не нравится, что шрифт смазанный, когда окно раздвинуто на весь экран. SDL2 выводит всё через текстуру, то есть увеличение (даже в оконном режиме) можно производить на дробные числа, например, увеличить шрифт в 1,7 раза.

Есть ещё другая идея — позволять пользователю выбирать шрифт, ну и, разумеется, сделать несколько шрифтов на выбор: побольше, поменьше, посовременней, поаркадней… Но для этого сначала надо как-то переделать кодировку, чтобы всё работало через UTF-8, а то сейчас получается, что файлы сохраняются в UTF-8, откомпилированная программа работает в UTF-8, а Free Oberon всё воспринимает и внутренне представляет в кодировке CP866. В итоге, если кто-то использует русский язык в программе, то в Терминале Оберона она работает правильно, а в Command Prompt — нет (там UTF-8 не работает), на Линуксе такой проблемы нет. В общем-то, что делать с Command Prompt'ом — непонятно.

Может быть, сделать, чтобы каждый шрифт был представлен не BMP-файлом, а каталогом с BMP-файлами, в котором будет текстовый файл с настройками, а в каждом BMP-файле — какой-либо диапазон юникода.

Ещё надо предусмотреть какой-нибудь модуль для людей, чтобы можно было с русскими буквами работать нормально. Например, перебирать их в строке. Дейв мне объяснял, что придётся делать так.

Артур


Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Развитие проекта Free Oberon
СообщениеДобавлено: 06 фев 2017, 00:11 
Не в сети
Аватара пользователя

Сообщения: 791
Откуда: Днепропетровская обл.
Список задач "на повестке дня" по Free Oberon

Цитата:
Наверное, пора сделать репозиторий на Гитхабе.
Сейчас основная работа идёт по следующим направлениям:

1. Доработка стандартной библиотеки компилятора voc, который используется в системе. А именно:
1.1. Работа с типом REAL — считывание с консоли и вывод на консоль (уже есть, но надо переписать).
1.2. Работа с файлами, модули Files и Texts. Сейчас, если файл не удалось открыть, voc просто делает HALT. Должна быть возможность получить список файлов в каталоге и т. п. Возможно, надо убрать всё лишнее из типа Texts.Text (например, информацию о шрифтах ОС «Оберон»), а оставить только то, что необходимо для эффективной и удобной обработки «обычных» текстовых файлов.

2. Доработка псевдографического интерфейса до уровня TurboPascal, то есть:
2.1. Возможность использования указателя мыши (в том числе, для перемещения по тексту и для выделения текста).
2.2. Выпадающие меню сверху (File, Edit и прочее).
2.3. Возможность работы с несколькими открытыми файлами одновременно.
2.4. Удобные диалоги открытия и сохранения файлов. Тут надо явно пойти дальше, чем TurboPascal, у них этот диалог совсем неудобный.

3. Полуавтоматическая компиляция проекта, состоящего из нескольких модулей. Например, чтобы можно было тот же FreeOberon скомпилировать в самом себе. Этот пункт можно сделать только тогда, когда в основном будет закончен пункт №2.
3.1. Разработать формат «файла проекта», если таковой будет (а, видимо, без него не обойтись).
3.2. Автоматическое создание дерева модулей на основе исходного кода проектов.

4. Доработка эмулятора терминала:
4.1. Поддержка команд VT100 (цвет текста и фона, очистка экрана, перемещение курсора по экрану; модуль vt100 в voc уже есть).
4.2. Выключение запущенной программы при нажатии Ctrl+Break — сейчас это происходит не всегда и не убивает процесс, а просто «отключает» его (забывает о нём, а процесс себе дальше работает).
4.3. Возможность выбирать один из доступных растровых шрифтов разного размера.

5. Кодировка.
5.1. Поддержка русских букв в альтернативных кодировках (для учебных целей). Сейчас используется кодировка UTF-8, что создаёт для учеников некоторые сложности при обработке символьных массивов, содержащих русские буквы, поэтому им приходится работать только с латиницей.
5.2. Более полная поддержка UTF-8.
5.3. Написание модуля для работы со строками, закодированными в формате UTF-8 (переход к следующей литере, подсчёт количества литер).

6. Документация.
6.1 Создание документации по коду — для изучения Оберона на примере создания текстового редактора, а также для новых членов команды разработчиков.
6.2. Создание документации по языку и библиотекам, чтобы программист мог легко понять, как в Обероне «прочитать файл» или «сгенерировать псевдослучайное число».


Вернуться к началу
 Профиль  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 2 ] 

Часовой пояс: UTC + 2 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Group
Тех.поддержка phpBB