Page 1 of 3

Mirage File Manager

Posted: Sat Apr 22, 2017 7:25 pm
by theonlymirage
Всем привет!

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

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

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

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

Re: Mirage File Manager

Posted: Sat Apr 22, 2017 9:13 pm
by IgorA
Один из файловых менеджеров (kfm) давно уже не развивается. Потому переодически появляются предложения о том что-бы убрать его из дистрибутива. Если тебе удастся сделать хороший ФМ наподобие виндосовского тотал командера, то это будет очень хорошо.

Re: Mirage File Manager

Posted: Sun Apr 23, 2017 3:08 pm
by Pathoswithin
theonlymirage
Я бы сказал, что лучше не гнаться за функционалом, а сделать немного, но качественно, хорошо продумать архитектуру, чтобы кто-то другой мог разобраться и развивать. В новом ФМ больше всего хотелось бы увидеть поддержку юникода и вид значками. Помимо функции 70 есть ещё 80. Какую ошибку возвращает подфункция 1? Какие данные передаёшь?

Re: Mirage File Manager

Posted: Sun Apr 23, 2017 6:23 pm
by theonlymirage
После множественного прочтения мануала по сисфункциям и исправления своих ошибок, наконец удалось прочитать содержимое корневой директории. ;)
Продвинулся и в интерфейсе, боковая панель под вопросом (но так как она уже есть, то будет присутствовать в первых релизах).

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

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

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

Re: Mirage File Manager

Posted: Sun Apr 23, 2017 9:20 pm
by Pathoswithin
Собственно, моё пожелание как раз было про интерфейс, не похожий на kfm, а то сейчас во всех ФМ вид только таблицей, как-то несовременненько...

Re: Mirage File Manager

Posted: Mon Apr 24, 2017 10:38 pm
by theonlymirage
За сегодня разбил код в inc'и. В целом разделение на модули прошло успешно.
В боковой панели появится подробная информация о выбранном файле.

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


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

Re: Mirage File Manager

Posted: Tue Apr 25, 2017 6:25 pm
by Pathoswithin
ICONS32.PNG

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

Re: Mirage File Manager

Posted: Thu Apr 27, 2017 8:22 am
by theonlymirage
Оке, спасибо, скоро займусь добавлением изображений. А тексты значит все переводим в 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)

Re: Mirage File Manager

Posted: Thu Apr 27, 2017 12:46 pm
by Pathoswithin
... возможно, первый слот это номер 0?

Re: Mirage File Manager

Posted: Thu Apr 27, 2017 1:47 pm
by IgorA
Еще можно попробовать открыть debug и ввести команду:

Code: Select all

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

Re: Mirage File Manager

Posted: Thu Apr 27, 2017 7:01 pm
by theonlymirage
Спасибо, за инфу по дебагу, но мне не помогает - остаётся на той же строке.

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

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

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

Re: Mirage File Manager

Posted: Fri Apr 28, 2017 12:49 pm
by IgorA
theonlymirage wrote:Я воспроизвёл проблему на минимальном коде - из примера example, который брал за основу своего. В оригинале я обрабатываю нажатия клавиш по инструкции (тут в примере это всё опустил), но результат с зависанием одинаковый.
Я пробовал запускать твой пример (451 б) в эмуляторе, при открытии сразу пишет что не поддерживаемая инструкция процессора.
Потом попробовал перекомпилировать его, но с другим файлом macros.inc (с тем что лежит на rd/1). Получился файл размером (402 б) который у меня запускается и работает, даже при нажатии на F1 ничего не виснет.
Может у тебя какой-то старый файл macros.inc из-за которого что-то не работает.

Re: Mirage File Manager

Posted: Sat Apr 29, 2017 1:21 am
by theonlymirage
Полдня ушло на эту проблему, я сразу знал, что она мелкая :)
Пробовал заменять 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 тоже довольно сказывается (когда закончу с ФМ поизучаю изменения в них).

Re: Mirage File Manager

Posted: Thu May 11, 2017 5:14 pm
by theonlymirage
Работа продолжается, решил отписаться о прогрессе.

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

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

Структура и устройство koView:
Структура 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: Select all

      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 и очистить память

Re: Mirage File Manager

Posted: Fri May 12, 2017 6:50 am
by Ray
buf2d library?