LINUX.ORG.RU

Файловый менеджер на C++/Qt

 , , ,


1

0

Всем общий привет!

Я начинающий разработчик на C++/Qt и хочу показать свой первый более-менее крупный проект – простой файловый менеджер под Linux.

Сейчас он умеет:

  • просматривать файлы и директории;
  • копировать их, вырезать и вставлять;
  • перетаскивать файлы (drag & drop);
  • работать с несколькими выделенными элементами и т. д.

Все операции выполняются через стандартные утилиты GNU/Linux – cp, mv, rm, ведь версия для Windows только в планах.

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

В планах:

  • «горячие» клавиши;
  • работа с примонтированными устройствами;
  • поддержка плагинов.

Проект открытый: ссылка на GitHub.

Буду рад, если найдёте какие-то баги или предложите идеи!



Проверено: dataman ()
Последнее исправление: dataman (всего исправлений: 8)

1) не очень важно, мой вкус избраные папки по центру не центровать, а выравнивать по краю?
2) обработать выхлоп mount и добавить подмонтированые fs к избраному?
3) обработать файл ~/.ssh/config записаные там хосты использовать для просмотра-монтирования по sshfs (раздел сетевые русурсы)?
4) много экземпляров проги или вкладки добавишь?
5) раз уж гуи то миниатюры img и видео? (не очень важно)
Мне qt нравится но почти весь мой софт на gtk (((

s-warus ★★★★
()
Ответ на: комментарий от DadyaIgor

Мой путь лёг навсегда на C/C++ и Python. Да, может у меня и будут второстепенные языки для чего-то, но C/C++ и Python мои главные языки

Ты не до конца прочитал)) Путь - это не про ЯП, а про UI твоего файлового менеджера.

Да, отчасти ты прав, но есть нюанс. В каталогах у меня понятие «Items», а в файлах как раз привычные гигабайты и мегабайты, т.к, чтобы измерить настоящий размер папки(а не 4 КБ, как это измеряется по дефолту), надо рекурсивно узнавать размер элементов внутри каталога.

Опасно это, измерять размер каталога при наведении. Ведь там может быть не 100 мегабайт, а 100 гигабайт, но прервать подсчет у тебя возможности нет, и наверняка он выполняется не в другом потоке

Кнопка назад и вперёд у меня в виде зелёной стрелочки, ведь нормальных иконок я пока не нарисовал. Вариант хороший, думаю даже в следующем обновлении добавлю.

Могу посоветовать тебе зайти в /usr/share/icons/тему_иконок/actions, и посмотреть какие там есть иконки. Множество из них стандартные, и лучше когда программа соответствует выбранной теме, а то может получиться так что пользователь поставил себе какую-нибудь highcontrast, а твоя тема отображает сине-желто-зеленые кнопочки

В Home у меня только скрытые файлы, не вижу смысла в корневой директории юзера хранить что-то, кроме директорий(и как раз нужных файлов в них) и скрытых файлов, которые часто системные.

Принимается

Да, тут ты прав, в файловом менеджере действитетльно это может показаться плохо, в следующих обновлениях буду переписывать хотя бы на утилиты Qt.

Не уверен что утилиты Qt могут рапортовать о процессе так, чтоб ты отлавливал этот рапорт и выводил пользователю. Мне кажется легче самому написать функцию рекурсивного скана файлов и побайтового чтения\записи, чем мудохаца с несколькими потоками, в одном из которых функция будет выполнять процесс, а во втором твой ГУЙ отлавливать статус и рисовать клиенту

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

Лучше бы конечно чтоб оно отлавливало какую-нибудь настройку, и активировалось относительно нее

В будущем планируется вынести в отдельное меню настроек, куда также перенесётся и настройка показа скрытых файлов.

Принимается

Ну как тебе сказать, для меня это что-то между пет проекта и тем, чем я в будущем буду пользоваться. Так что не почему бы не выложить сюда?

Ты снова меня не до конца прочитал :) Я пишу не о коде, я пишу о том, что для ФМов есть устоявшийся UI и лучше следовать ему.

windows10 ★★★★★
()
Ответ на: комментарий от rukez

превьюшки для картинок класть в локальную хранилку в папке

За такое надо бить по рукам.

чтоб не перечитывать их каждый раз

Так делают разве что наСИльники. Правильный алгоритм таков:

а) Пробегаемся по списку файлов, если это изображение, то
б) Считаем хеш файла, и ищем превьюху в ~/.cache/thumbnails/normal(или large)/хеш_файла.png, если она найдена то
в) Получаем пиктограмму файла из найденной картинки, иначе
г) Получаем пиктограмму файла из системной темы согласно его mimetype и запускаем процесс создания превьюхи по алгоритму из пункта б

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

windows10 ★★★★★
()
Ответ на: комментарий от windows10

Могу посоветовать тебе зайти в /usr/share/icons/тему_иконок/actions, и посмотреть какие там есть иконки.

Не надо никуда ходить, в Qt есть QIcon::fromTheme

А это здесь к чему?

А это совет почитать документацию вместо пляски по граблям.

u-235
()
Ответ на: комментарий от u-235

А это совет почитать документацию вместо пляски по граблям.

Документацию к чему именно?

По твоей ссылке функция, возвращающая объект из текущей темы по строковому имени иконки.

windows10 ★★★★★
()
Ответ на: комментарий от windows10

функция, возвращающая объект из текущей темы по строковому имени иконки.

Именно, нужная иконка из системной темы без всяких поползновений по каталогам.

u-235
()
Ответ на: комментарий от u-235

Именно, нужная иконка из системной темы без всяких поползновений по каталогам.

И как же ты узнаешь имя нужной тебе иконки? ;)

windows10 ★★★★★
()

Про скриншоты ничего говорить не буду, т.к. работы только начались, а вот про сам проект я по диагонали посмотрел и теперь хочу сказать пару ласковых:

  • Чего все файлы в корне проекта валяются? Надо бы их по директориям раскидать красиво.

  • Если уж пишешь на крестах, то заголовочные файлы хорошо бы обзывать с расширением .hpp, т.к. они у тебя не С-совместимые всё равно.

  • Почему скомпилированный исполняемый файл приложения лежит в проекте рядом с кодом? :)

  • Я на культях не умею, но у тебя там в заголовочные файлы не слишком много include’ов включено? Желательно бы иметь необходимый минимум для зацепа типов.

  • В main.cpp одинаковый include джва раза.

  • В filelistview.h у тебя гард не охватывает всё содержимое файла.

В целом хочу пожелать удачи с проектом.

Bfgeshka ★★★★★
()
Последнее исправление: Bfgeshka (всего исправлений: 1)
Ответ на: комментарий от u-235

А это https://specifications.freedesktop.org/icon-naming/latest/ что?

А это чушь.

Если бы ты открыл каталог иконок и сравнил - ты бы это понял.

А если бы ты не ссылками кидался, а сам их читал, то увидел бы

Publication Date: August 9 2007, Version: Version 0.8.90

и понял бы, почему чушь.

windows10 ★★★★★
()
Последнее исправление: windows10 (всего исправлений: 1)
Ответ на: комментарий от Bfgeshka

в заголовочные файлы не слишком много include’ов включено? Желательно бы иметь необходимый минимум для зацепа типов.

В main.cpp одинаковый include джва раза.

Вот для этого IWYU хорош.

u-235
()
Ответ на: комментарий от windows10

А это чушь.

Вот здесь

Могу посоветовать тебе зайти в /usr/share/icons/тему_иконок/actions, и посмотреть какие там есть иконки. Множество из них стандартные

Ты про какой стандарт говорил?

u-235
()
Ответ на: комментарий от u-235

Ты про какой стандарт говорил?

Это не имеет значения, если нужна иконка, а не поумничать на лоре.

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

Хотя бы потому что для твоей кнопки может не быть точного наименования, и ее придется искать среди других кнопок.

Хотя бы потому что за 18 лет многое изменилось.

Ну и зачем это дрочево с непонятным The icon used for an electronic mail that contains a signature which has also been verified by the security system., если можно просто зайти в каталог, просмотреть все иконки в режиме превьюхи, и выбрать нужную?

Не усложняй.

windows10 ★★★★★
()
Ответ на: комментарий от windows10

Ну и зачем это дрочево с непонятным The icon used for an electronic mail that contains a signature which has also been verified by the security system., если можно просто зайти в каталог, просмотреть все иконки в режиме превьюхи, и выбрать нужную?

Затем, чтобы с другой темой не случилось «Ой, а такой иконки нет, вот вам пустой квадратик».

u-235
()
Ответ на: комментарий от u-235

Затем, чтобы с другой темой не случилось «Ой, а такой иконки нет, вот вам пустой квадратик».

Как при использовании устаревшего дерьма из документации 2007 года?

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

Как ни крути, а визуальное восприятие проще, быстрее и надежнее.

windows10 ★★★★★
()
Ответ на: комментарий от nicholas_ru

лучше и моднее PCmanFM-qt ничего не видал.

Чем может быть лучше говно, каждый раз перерисовывающее миниатюры в папках, в которых уже был?)

windows10 ★★★★★
()
Ответ на: комментарий от Bfgeshka

Я на культях не умею, но у тебя там в заголовочные файлы не слишком много include’ов включено? Желательно бы иметь необходимый минимум для зацепа типов.

Тут можно в обе стороны накосячить.

Причём если ты накидаешь лишнего, это не так страшно, стражи компиляции должны это отсечь. Хотя некрасиво, да.

А вот если не добавить нужного – последствия могут быть непредсказуемы, например, на одной версии Qt проект соберётся, а на другой вывалится с ошибкой. Ибо это C++, у которого вместо модульности связка костылей на препроцессоре родом из 70-х. Да, в C++20 появилась возможность от этого уходить, но я не знаю, поддерживается ли это в Qt, да и не везде этот самый C++20 собрать можно. Пытаясь сделать «минимум», можно подставить того, кто это потом будет поддерживать. Лучше включать ровно то, что требуется, не больше и не меньше.

hobbit ★★★★★
()

Не суетись по поводу киллер-фич, прогресс-баров, «правильных способов» и прочего. Ты можешь потратить годы ковыряясь в деталях и не догонишь по практичности существующие фм все равно.

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

А так выглядит прикольно, я в свое время тоже изучал программирование gui на qt4.

loz ★★★★★
()
Последнее исправление: loz (всего исправлений: 2)
Ответ на: комментарий от nicholas_ru

лучше и моднее PCmanFM-qt ничего не видал.

В среднем все они одинаковые: Thunar, Caja, Nemo. По скриншотам вроде такой же, но попробовал PCmanFM и он подерживает значки 16х16, к которым я привык. Nemo тоже поддерживает, но при масштабировании регулирует шрифты, при 16х16 они слишком мелкие, а PCmanFM оставил как есть.

AZJIO
()
Ответ на: комментарий от jura12

я планирую с mc перейти на far2l.

А можно рассказать про киллер-фичу для far2l? Пользуюсь mc/far давно, про этот порт слышал - может я что-то интересное пропустил ;)

PS: с сайта far2l - Useful 3rd-party extras: Turbo Vision - разве что вспомнить молодость, но не более ;)

azazello ★★★★
()
Ответ на: комментарий от azazello

А можно рассказать про киллер-фичу для far2l?

вопрос не ко мне. я только начал его использовать. основная фитча это работа с буфером обмена в командной строке. но ввиду зоопарка терминалов, ДЕ и наличия вайланда не всегда работает одинаково. кроме того есть раскраска в редакторе формата файлов маркдауна и возможность написания плугинов. я успешно поставил с репозитория и для теста скомпилировал из исходников. думал как себя реализовать в компьютерной отрасли. решил написать плугин массового переименования к far2l. за основу возьму krename. о результате станет известно примерно через месяц. надо вспомнить c++ и ознакомиться с far api.

jura12 ★★★
()
Ответ на: комментарий от jura12

Спасибо за ссылку ниже. Т.к. не пользуюсь русским в IT (как в своё время и Евгений Рошель) - то большую часть всё-равно не понял ;) А то, что понял - так это если вы переходите с Windows - то привычные комбинации клавиш в первое время помогут ;)

вопрос не ко мне.

Вопрос по адресу - зачем-то вы ведь начали планировать его использовать вместо MC. Plug-in много к чему можно писать на C++ - к той же Qt будет полезнее и для себя, и для индустрии. Ну или к Blender, Godot, etc ;)


Я имел в виду что-то вроде(в моём случае) - занялся понемногу игровым движком Godot 4.x - несмотря на опыт с самописными движками и Unreal Engine - киллер-фича - GodotScript(GD), который мне очень сильно напомнил любимый MEL(Alias/WaveFront Maya Embedded Language), который в свою очередь берёт начало от BASH. Очень приятное ощущение от написания и очевидная логичность синтаксиса. Т.е. если вам нравится MEL - то вы тоже попробуете Godot, а если не нравится или не видели его - то не будете пробовать ;)

azazello ★★★★
()
Последнее исправление: azazello (всего исправлений: 1)
Ответ на: комментарий от Bfgeshka
  1. В будущем я это как раз хочу исправить.
  2. Да, в целом можно, но т.к я пишу в Qt Creator, он мне сам создаёт файл в таком расширении.
  3. Я хотел его удалить ещё давно, но только сейчас понял, что забыл закоммитить) (т.к я файл хотел удалить уже на гитхабе)
  4. Я инклудил именно всё то, что нужно для работоспособности кода
  5. Да, всё верно, в следующем коммите(вместе с обновлением) поправлю этот момент.
  6. Извини, но немного не понял про «гард»

Спасибо

DadyaIgor
() автор топика
Ответ на: комментарий от windows10

Ну по поводу расчёта размера всех файлов в каталоге. Да, это может быть опасно и из-за этого может даже откинуться на время фм, но у меня все подобные процессы выполняются через QThread и через отдельный класс Worker, а в mainwindow.cpp уже все эти процессы запускаются с помощью сигналов. Но я не знаю, можно ли это назвать многопоточностью

DadyaIgor
() автор топика
Последнее исправление: DadyaIgor (всего исправлений: 1)
Ответ на: комментарий от DadyaIgor

Можно. Очередь или прерывание по мере смены каталогов есть?

Например вошли в одну большую папку, пересчет которой займет минуту, вышли с этой папки и вошли в другую папку, пересчет которой займет тоже минуту - что станет с предыдущим процессом?

windows10 ★★★★★
()
Ответ на: комментарий от windows10

Если честно - не знаю. Т.к я только обучаюсь и одноврменно пишу пет-проекты, я не сильно хорошо понимаю в многопоточности

DadyaIgor
() автор топика

Все операции выполняются через стандартные утилиты GNU/Linux – cp, mv, rm, ведь версия для Windows только в планах.

Плохая идея. Единственное что имеет смысл делать так, да и то очень спорно, скорее как костыль для экономии времени чтоб фичу быстрее выкатить, это поддержку работы с архивами у которых либо нет библиотек которые можно интегрировать в код на твоём языке, либо библиотеки которых сильно хуже чем готовый консольный софт (как пример можно взять язык Java и формат 7zip), 7zip можно создавать через Apache Commons Compress, но там только часть спецификации - в один поток и сжимает файлы по отдельности, а не блоком (т.е. работает только как non solid архив). Хотя даже так правильнее брать SDK от 7z и писать обёртку (ну или брать готовую).

peregrine ★★★★★
()
Ответ на: комментарий от squareroot

Я всё больше склоняюсь к тому что гугл делает свою хром ОС правильно, только слишком плотно на свои облака завязывается. ИМХО в ОС хватит одного браузера в режиме киоска и полноэкранных игрушек (те да надо не браузером рисовать). Может ещё какой-то специализированный софт, вроде блендера по работе с 3D.

peregrine ★★★★★
()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.