Board.KolibriOS.org

Official KolibriOS board
It is currently Wed Feb 19, 2020 10:26 pm

All times are UTC+03:00




Post new topic  Reply to topic  [ 42 posts ]  Go to page 1 2 3 Next
Author Message
 Post subject: Mirage File Manager
PostPosted: Sat Apr 22, 2017 7:25 pm 
Offline

Joined: Sat Apr 22, 2017 6:11 pm
Posts: 224
Всем привет!

Вот решил в качестве ознакомления с системой написать файловый менеджер. Сильно не пинайте. ;) Их уже "в достаточном кол-ве", а значит есть у кого поучиться.
Для написания использую FASM, тестирую под QEMU. Начал с наброска UI, за основу взял example.asm с примером создания окна и вывода текста.
Задачу поставил объёмную, в первую очередь (то над чем сейчас работаю) это:
- возможность просмотра всех доступных данных о файлах и директориях;
- относительно приятный gui интерфейс со вкладками (до 8 штук включительно), адаптируемый под произвольный размер окна;
- боковая панель с разделами УСТРОЙСТВА и ИЗБРАННОЕ;
- функции работы с файлами: переименование, удаление и запуск(или открытие папки);
- копирование и вставка полного имени файла или пути;
- выбор вида отображения директории: табличка (с возможностью выбора столбцов и сортировки по ним), блоки, список в алфавитном порядке, список по типам, значки;
- режим разделения вкладок в рамках одного окна (доступен если открыто вкладок от 2 до 8): то есть в этом режиме панель вкладок пропадёт, а содержимое разделит окно на несколько частей, которым можно будет задать размеры.

Вряд ли дойдут руки, но в будущем планируется расшириться до:
- остальные функции работы с файлами: создание, копирование, перенос файлов и т.д.;
- ассоциации файлов по расширению (и возможно содержимому);
- возможность настроек цветовой схемы (например, цвет вкладок или цвет выделения файлов), боковой панели, места расположения вкладок (снизу или сверху), запоминание координат расположения окна и вида отображения директории;
- возможность перетаскивания файлов в режиме разделённых вкладок;
- запоминание и обновление списка имён файлов посещённых директорий для "индексации" поиска;
- поиск по имени файла;
- цветовые метки-теги к файлам.

Сейчас немного застрял на Функции 70, подфункция 1: вероятно накосячил со структурами (БДВК, может у кого-то можно посмотреть их пример?) и почему-то для "sys" или "/" в eax не возвращается ни 6 ни 0. И, пожалуйста, подскажите: в современных реалиях развития KolibriOS лучше везде использовать cp866 или UTF-8 (и всё в него преобразовывать)?

P.S. Исходный код обещаю открытый, по мере изменений и появления базового функционала - всё оформлю и выложу сюда.
Пока идёт работа, хотел бы услышать Ваши пожелания и предложения...


Attachments:
File comment: Первый набросок GUI
1.PNG
1.PNG [ 8.54 KiB | Viewed 3277 times ]
Top
   
 Post subject: Re: Mirage File Manager
PostPosted: Sat Apr 22, 2017 9:13 pm 
Offline
User avatar

Joined: Mon Oct 27, 2008 10:10 pm
Posts: 814
Один из файловых менеджеров (kfm) давно уже не развивается. Потому переодически появляются предложения о том что-бы убрать его из дистрибутива. Если тебе удастся сделать хороший ФМ наподобие виндосовского тотал командера, то это будет очень хорошо.


Top
   
 Post subject: Re: Mirage File Manager
PostPosted: Sun Apr 23, 2017 3:08 pm 
Offline
Mentor/Kernel Developer
User avatar

Joined: Thu Mar 26, 2015 5:16 pm
Posts: 1264
theonlymirage
Я бы сказал, что лучше не гнаться за функционалом, а сделать немного, но качественно, хорошо продумать архитектуру, чтобы кто-то другой мог разобраться и развивать. В новом ФМ больше всего хотелось бы увидеть поддержку юникода и вид значками. Помимо функции 70 есть ещё 80. Какую ошибку возвращает подфункция 1? Какие данные передаёшь?


Top
   
 Post subject: Re: Mirage File Manager
PostPosted: Sun Apr 23, 2017 6:23 pm 
Offline

Joined: Sat Apr 22, 2017 6:11 pm
Posts: 224
После множественного прочтения мануала по сисфункциям и исправления своих ошибок, наконец удалось прочитать содержимое корневой директории. ;)
Продвинулся и в интерфейсе, боковая панель под вопросом (но так как она уже есть, то будет присутствовать в первых релизах).

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

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

В общем, ещё на шажочек ближе к релизу.


Attachments:
Обновлённый прототип ФМ.PNG
Обновлённый прототип ФМ.PNG [ 12.36 KiB | Viewed 3219 times ]
Top
   
 Post subject: Re: Mirage File Manager
PostPosted: Sun Apr 23, 2017 9:20 pm 
Offline
Mentor/Kernel Developer
User avatar

Joined: Thu Mar 26, 2015 5:16 pm
Posts: 1264
Собственно, моё пожелание как раз было про интерфейс, не похожий на kfm, а то сейчас во всех ФМ вид только таблицей, как-то несовременненько...


Top
   
 Post subject: Re: Mirage File Manager
PostPosted: Mon Apr 24, 2017 10:38 pm 
Offline

Joined: Sat Apr 22, 2017 6:11 pm
Posts: 224
За сегодня разбил код в inc'и. В целом разделение на модули прошло успешно.
В боковой панели появится подробная информация о выбранном файле.

Pathoswithin
Как и было заявлено в шапке, вариантов отображения будет несколько. Помимо таблички уже есть тайлы/плитки. В них текст относительно изображения может располагаться как внизу, так и сбоку. Из тайлов несложно будет сделать значки.


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


Attachments:
Режим таблицы.PNG
Режим таблицы.PNG [ 11.86 KiB | Viewed 3164 times ]
Режим плитки.PNG
Режим плитки.PNG [ 10.86 KiB | Viewed 3164 times ]
Top
   
 Post subject: Re: Mirage File Manager
PostPosted: Tue Apr 25, 2017 6:25 pm 
Offline
Mentor/Kernel Developer
User avatar

Joined: Thu Mar 26, 2015 5:16 pm
Posts: 1264
ICONS32.PNG

Кстати, лучше использовать второй шрифт (да и юникод поддерживает только он).


Top
   
 Post subject: Re: Mirage File Manager
PostPosted: Thu Apr 27, 2017 8:22 am 
Offline

Joined: Sat Apr 22, 2017 6:11 pm
Posts: 224
Оке, спасибо, скоро займусь добавлением изображений. А тексты значит все переводим в UTF-16LE, верно?

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

Проблема:
При работе с буфером обмена у меня не получилось прочитать буфер. Если слота нет, то всё хорошо - в eax возвращается 1, как и положено. Но когда я указываю на номер существующего слота, то моё приложение виснет. Например, первый слот: mcall 54, 1, 1 (буфер предварительно набиваю два раза текстом из tinypad)
Функции записи в буфер, узнать кол-во слотов, удалить последний слот - успешно работают. Проблема только с прочтением, что я делаю не так?


Вот описание, которым я руководствовался:
======================================================================
====================== Функция 54, подфункция 1 ======================
================== Считать данные из буфера обмена. ==================
======================================================================
Параметры:
* eax = 54 - номер функции
* ebx = 1 - номер подфункции
* eсx = номер слота
Возвращаемое значение:
* eax = если успешно - указатель на область памяти с данными
* eax = 1 - ошибка
* eax = -1 - отсутствует область главного списка
Замечания:
* буфер, на который указывает eax, содержит следующую информацию:
* +0: dword: общая длина данных
* +4: dword: определяет тип данныx:
* 0 = Текст
* 1 = Текст с блочным выделением
* 2 = Изображение
* 3 = RAW
* 4 и выше зарезервировано
* +8: более детально смотрите файл clipboard_container_rus.txt

---------------------- Константы для регистров: ----------------------
eax - SF_CLIPBOARD (54)
ebx - SSF_READ_CB (1)


Top
   
 Post subject: Re: Mirage File Manager
PostPosted: Thu Apr 27, 2017 12:46 pm 
Offline
Mentor/Kernel Developer
User avatar

Joined: Thu Mar 26, 2015 5:16 pm
Posts: 1264
... возможно, первый слот это номер 0?


Top
   
 Post subject: Re: Mirage File Manager
PostPosted: Thu Apr 27, 2017 1:47 pm 
Offline
User avatar

Joined: Mon Oct 27, 2008 10:10 pm
Posts: 814
Еще можно попробовать открыть debug и ввести команду:
Code:
load имя_файла

Потом если открылось нажать g и попробовать сделать вставку, которая приводит к вылету программы.
Должно показать участок программы на котором случился вылет. В некоторых случаях это может помочь установить причину.


Top
   
 Post subject: Re: Mirage File Manager
PostPosted: Thu Apr 27, 2017 7:01 pm 
Offline

Joined: Sat Apr 22, 2017 6:11 pm
Posts: 224
Спасибо, за инфу по дебагу, но мне не помогает - остаётся на той же строке.

Чуть некорректно написал про первый слот, да первый это 0, но я использую для теста специально следующий. Если нет никакого слота или занят только 0 слот, то всё правильно возвращает eax=1, приложение продолжает работать. Но когда я заполняю 1 слот и обращаюсь к нему, то программа виснет на mcall.

Я воспроизвёл проблему на минимальном коде - из примера example, который брал за основу своего. В оригинале я обрабатываю нажатия клавиш по инструкции (тут в примере это всё опустил), но результат с зависанием одинаковый.

Ниже прикладываю скрин и код этого example:


Attachments:
File comment: Пример кода:
Пример кода.zip [3.97 KiB]
Downloaded 89 times
File comment: Скриншот изменений example.asm
скрин.PNG
скрин.PNG [ 22.05 KiB | Viewed 3065 times ]
Top
   
 Post subject: Re: Mirage File Manager
PostPosted: Fri Apr 28, 2017 12:49 pm 
Offline
User avatar

Joined: Mon Oct 27, 2008 10:10 pm
Posts: 814
theonlymirage wrote:
Я воспроизвёл проблему на минимальном коде - из примера example, который брал за основу своего. В оригинале я обрабатываю нажатия клавиш по инструкции (тут в примере это всё опустил), но результат с зависанием одинаковый.

Я пробовал запускать твой пример (451 б) в эмуляторе, при открытии сразу пишет что не поддерживаемая инструкция процессора.
Потом попробовал перекомпилировать его, но с другим файлом macros.inc (с тем что лежит на rd/1). Получился файл размером (402 б) который у меня запускается и работает, даже при нажатии на F1 ничего не виснет.
Может у тебя какой-то старый файл macros.inc из-за которого что-то не работает.


Top
   
 Post subject: Re: Mirage File Manager
PostPosted: Sat Apr 29, 2017 1:21 am 
Offline

Joined: Sat Apr 22, 2017 6:11 pm
Posts: 224
Полдня ушло на эту проблему, я сразу знал, что она мелкая :)
Пробовал заменять mcall напрямую int 0x40. Перепробовал кучу разных версий macros.inc из репозитария svn, разные версии KoOS и эмулятора. Пока не наткнулся на маленький пример Марата в SVN ClipView файл clip_get.asm Скомпилировал его с inc от 22 числа, код работает. А мой с теми же macros.inc (и прочее) не работал. Оставалось сравнить код.
Далеко сравнивать не пришлось, буквально заголовок и... Сперва подумал на стек, но очень быстро сообразил в чём реально проблема:

Перед вызовом mcall 54, 1, [номер слота] обязательно должна быть проинициализирована куча процесса: mcall 68, 11 ;инициализация кучи.
Эта мелочь конечно понятна, но жалко, что дополнительно не сказано в вики http://wiki.kolibrios.org/wiki/SysFn54/ru Куда бы больше времени ушло с пользой.
Пожалуйста, просьба обновить описание системных функций и упомянуть там об этом.


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


Top
   
 Post subject: Re: Mirage File Manager
PostPosted: Thu May 11, 2017 5:14 pm 
Offline

Joined: Sat Apr 22, 2017 6:11 pm
Posts: 224
Работа продолжается, решил отписаться о прогрессе.

Хотелось сделать плавную прокрутку списков, но с текущим API это оказалось проблемной задачей. Было три варианта решения, и я выбрал самый радикальный и бьющий на производительность - отрисовку в отдельном буфере.
В результате родился новый страшный велосипед под названием koView. Сейчас перевожу все компоненты (вкладки, скроллбары и тд) на его использование. Что из этого выйдет и как скажется на производительности вскоре узнаем.

Если кому-то нужен подобный элемент, то прикладываю исходник (koView.inc). Плюс временный вспомогательный файлик с функциями размера и типа кодировки шрифта (fonts.inc).

Структура и устройство koView:
Quote:
Структура koView:
; coord dd 0 ;координаты Х и Y (x dw 0 ; y dw 0)
; width dd 0 ;ширина
; height dd 0 ;высота
; pixels dd 0 ;указатель на буфер с пикселями (32 бита)

Структура буфера с пикселями изображения:
; width dd 0 ;ширина
; height dd 0 ;высота
; pixels db 0 dup(4*width*height) ; пиксели в формате AARRGGBB размер области 4*W*H

Текущие функции koView:
; createImage: конвертировать в изображение: создаёт буфер с картинкой для текущего koView (в edi) в ebx возвращает буфер с картинкой
; deleteImage: удаляет буфер с картинкой по адресу ebx
; fullDrawInWindow: отрисовать Kolibri View по указателю edi целиком как есть в текущем окне
; createSubImage: создать буфер с изображением : Внимание тут нет проверок, поэтому область строго должна быть внутри koView (все её точки); принимает: edi - koView, eax - координаты области в koView, ecx - размеры области в koView; возвращает: ebx - адрес на буфер с изображением
; deleteSubImage: удаляет буфер с картинкой по адресу ebx
; subDrawInWindow: отрисовать только нужную часть koView в окне: edi - указатель на koView, eax - координаты внутри koView, ecx - размеры внутри koView
; drawRect: нарисовать прямоугольник: eax - координаты, ebx - размеры по ширине и высоте, ecx - цвет, edi - указатель на koView; ничего не возвращает
; drawPoint: задать цвет(=ecx) точки/пикселя(координаты в eax) на Kolibri View (указатель в edi), внимание: нет проверки что точка внутри koView (возможен крах приложения)
; drawImage: нарисовать картинку: eax - координаты, esi - указатель на картинку, edi - указатель на koView
; drawText: отобразить текст (требуется усовершенствовать); входные: edi - указатель на буфер koView, eax - цвет, ebx - координаты текста, edx - указатель на начало строки (оканчивается нулём, но сейчас печатает столько символов сколько влазиет по ширине в koView);ничего не возвращает
; clear: очистить koView (указатель в edi) в цвет ecx
; resize: изменить размеры: edi - koView с уже изменёнными новыми значениями
; create: создать объект в памяти возвращает: edi - новый объект koView
; delete: удалить объект из памяти: указатель в edi
; pointInView: проверяет точка внутри области koView или нет? (координаты точки должны быть относительно того же объекта что и координаты koView) ;входящие: eax - координаты точки, edi - указатель на структуру koView ;выходные: eax = 0 - да, точка во вьювере, 1 - нет, точка не над вьювером.


Пример использования:
Code:
      call setEncodingSymbolSize  ;устанавливаем размер символов текущим шрифтом

      call koView.create           ;создаём новый koView с размерами 0 на 0

      mov word[edi], 24           ;задаём ему координаты в окне
      mov word[edi+2], 5

      mov dword[edi+4], 30      ;задаём размеры: ширина и высота
      mov dword[edi+8], 50
      call koView.resize            ;применяем новые размеры

      mov ecx, 0xFF0000           ;AARRGGBB
      call koView.clear              ;очищаем его область - заливка единым цветом

      mov eax, 1*65536+2        ;рисуем прямоугольник зелёного цвета
      mov ebx, 60*65536+20
      mov ecx, 0x00FF00
      call koView.drawRect

      mov eax, 0x0000FF              ;цвет текста - синий
      mov ebx, 0*65536+0         ;координаты текста
      mov edx, button_refresh.utf ;cp;;указатель на текст в текущей кодировке
      call koView.drawText           ;рисуем текстовую строку (что не влезет в область - обрезается)

      mov eax, 4*65536+5           ;задать цвет нужной точки koView
      mov ecx, 0xFFFFFF
      call koView.drawPoint

      mov eax, 24*65536+45        ;нарисовать картинку
      mov esi, testing
      call koView.drawImage


      mov eax, 0;2*65536+3
      mov ecx, 30*65536+50 ;28*65536+47
      call koView.subDrawInWindow      ;отрисовать определённую область koView в окне приложения

      mov word[edi], 24
      mov word[edi+2], 5+60
      call koView.fullDrawInWindow      ;отрисовать всю область koView целиком в окне приложения
     
      call koView.delete                      ;удалить koView и очистить память


Attachments:
fonts.inc [1.33 KiB]
Downloaded 87 times
koView.inc [17.5 KiB]
Downloaded 86 times
Top
   
 Post subject: Re: Mirage File Manager
PostPosted: Fri May 12, 2017 6:50 am 
Offline

Joined: Sun Aug 09, 2015 3:41 pm
Posts: 110
buf2d library?


Top
   
Display posts from previous:  Sort by  
Post new topic  Reply to topic  [ 42 posts ]  Go to page 1 2 3 Next

All times are UTC+03:00


Who is online

Users browsing this forum: No registered users and 1 guest


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
cron
Powered by phpBB® Forum Software © phpBB Limited