Mirage File Manager

Work with drives, directories, files
  • Один из файловых менеджеров (kfm) давно уже не развивается. Потому переодически появляются предложения о том что-бы убрать его из дистрибутива. Если тебе удастся сделать хороший ФМ наподобие виндосовского тотал командера, то это будет очень хорошо.
  • theonlymirage
    Я бы сказал, что лучше не гнаться за функционалом, а сделать немного, но качественно, хорошо продумать архитектуру, чтобы кто-то другой мог разобраться и развивать. В новом ФМ больше всего хотелось бы увидеть поддержку юникода и вид значками. Помимо функции 70 есть ещё 80. Какую ошибку возвращает подфункция 1? Какие данные передаёшь?
  • После множественного прочтения мануала по сисфункциям и исправления своих ошибок, наконец удалось прочитать содержимое корневой директории. ;)
    Продвинулся и в интерфейсе, боковая панель под вопросом (но так как она уже есть, то будет присутствовать в первых релизах).

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

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

    В общем, ещё на шажочек ближе к релизу.
    Attachments
    Обновлённый прототип ФМ.PNG
    Обновлённый прототип ФМ.PNG (12.36 KiB)
    Viewed 10059 times
  • Собственно, моё пожелание как раз было про интерфейс, не похожий на kfm, а то сейчас во всех ФМ вид только таблицей, как-то несовременненько...
  • За сегодня разбил код в inc'и. В целом разделение на модули прошло успешно.
    В боковой панели появится подробная информация о выбранном файле.

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


    Вопрос: откуда можно взять (следует брать) иконки для папок, файлов и прочего? какие есть готовые варианты? Рисование не осилю.
    Attachments
    Режим таблицы.PNG
    Режим таблицы.PNG (11.86 KiB)
    Viewed 10004 times
    Режим плитки.PNG
    Режим плитки.PNG (10.86 KiB)
    Viewed 10004 times
  • ICONS32.PNG

    Кстати, лучше использовать второй шрифт (да и юникод поддерживает только он).
  • Оке, спасибо, скоро займусь добавлением изображений. А тексты значит все переводим в 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)
  • ... возможно, первый слот это номер 0?
  • Еще можно попробовать открыть debug и ввести команду:

    Code: Select all

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

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

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

    Ниже прикладываю скрин и код этого example:
    Attachments
    Пример кода:
    Downloaded 287 times
    Скриншот изменений example.asm
    скрин.PNG (22.05 KiB)
    Скриншот изменений example.asm Viewed 9905 times
  • theonlymirage wrote:Я воспроизвёл проблему на минимальном коде - из примера example, который брал за основу своего. В оригинале я обрабатываю нажатия клавиш по инструкции (тут в примере это всё опустил), но результат с зависанием одинаковый.
    Я пробовал запускать твой пример (451 б) в эмуляторе, при открытии сразу пишет что не поддерживаемая инструкция процессора.
    Потом попробовал перекомпилировать его, но с другим файлом macros.inc (с тем что лежит на rd/1). Получился файл размером (402 б) который у меня запускается и работает, даже при нажатии на F1 ничего не виснет.
    Может у тебя какой-то старый файл macros.inc из-за которого что-то не работает.
  • Полдня ушло на эту проблему, я сразу знал, что она мелкая :)
    Пробовал заменять 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 тоже довольно сказывается (когда закончу с ФМ поизучаю изменения в них).
  • Работа продолжается, решил отписаться о прогрессе.

    Хотелось сделать плавную прокрутку списков, но с текущим 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 и очистить память
    
    Attachments
    fonts.inc (1.33 KiB)
    Downloaded 290 times
    koView.inc (17.5 KiB)
    Downloaded 285 times
  • buf2d library?
  • Who is online

    Users browsing this forum: No registered users and 2 guests