diff --git a/i18n/ar/cosmic_files.ftl b/i18n/ar/cosmic_files.ftl index ef40c59..3b2c8a3 100644 --- a/i18n/ar/cosmic_files.ftl +++ b/i18n/ar/cosmic_files.ftl @@ -1,4 +1,4 @@ -cosmic-files = مدير ملفات COSMIC +cosmic-files = ملفات COSMIC empty-folder = مجلد فارغ empty-folder-hidden = مجلد فارغ (يحتوي على عناصر مخفية) filesystem = نظام الملفات @@ -8,7 +8,7 @@ recents = الأحدث # List view name = الاسم modified = مُعدل -size = حجم +size = الحجم # Dialogs @@ -357,3 +357,6 @@ restored = } من { trash } empty-trash-title = أفرغ المهملات؟ type-to-search-select = يختار أول ملف أو مجلد مطابق +pasted-image = صورة مُلصقة +pasted-text = نص مُلصق +pasted-video = فيديو مُلصق diff --git a/i18n/cs/cosmic_files.ftl b/i18n/cs/cosmic_files.ftl index 6f9135d..d221114 100644 --- a/i18n/cs/cosmic_files.ftl +++ b/i18n/cs/cosmic_files.ftl @@ -51,7 +51,7 @@ rename-folder = Přejmenovat složku ## Replace Dialog replace = Nahradit -replace-title = „{ $filename }“ již na daném místě existuje +replace-title = Soubor „{ $filename }“ již na daném místě existuje replace-warning = Chcete nahradit soubor tím, který ukládáte? Nahrazení přepíše veškerý jeho obsah. # Context Pages @@ -403,3 +403,6 @@ sort = Řazení sort-a-z = A-Z empty-trash-title = Vysypat koš? type-to-search-select = Vybere první shodující se soubor nebo složku +pasted-image = Vložen obrázek +pasted-text = Vložen text +pasted-video = Vloženo video diff --git a/i18n/en/cosmic_files.ftl b/i18n/en/cosmic_files.ftl index fe080cd..9fb6e7c 100644 --- a/i18n/en/cosmic_files.ftl +++ b/i18n/en/cosmic_files.ftl @@ -46,6 +46,10 @@ resume = Resume ## Compress Dialog create-archive = Create archive +## Copy To Dialog +copy-to-title = Select copy destination +copy-to-button-label = Copy + ## Extract Dialog extract-password-required = Password required extract-to = Extract To... @@ -59,6 +63,10 @@ empty-trash-warning = Items in the Trash folder will be permanently deleted ## Mount Error Dialog mount-error = Unable to access drive +## Move To Dialog +move-to-title = Select move destination +move-to-button-label = Move + ## New File/Folder Dialog create-new-file = Create new file create-new-folder = Create new folder @@ -305,12 +313,14 @@ type-to-search-select = Selects the first matching file or folder # Context menu add-to-sidebar = Add to sidebar compress = Compress +copy-to = Copy to... delete-permanently = Delete permanently eject = Eject extract-here = Extract new-file = New file... new-folder = New folder... open-in-terminal = Open in terminal +move-to = Move to... move-to-trash = Move to trash restore-from-trash = Restore from trash remove-from-sidebar = Remove from sidebar diff --git a/i18n/fr/cosmic_files.ftl b/i18n/fr/cosmic_files.ftl index 61a66bf..49c19ee 100644 --- a/i18n/fr/cosmic_files.ftl +++ b/i18n/fr/cosmic_files.ftl @@ -422,3 +422,6 @@ removed-from-recents = } de { recents } progress-failed = { $percent }%, échec type-to-search-select = Sélectionne le premier fichier ou dossier qui convient +pasted-image = Image collée +pasted-text = Text collé +pasted-video = Vidéo collée diff --git a/i18n/ga/cosmic_files.ftl b/i18n/ga/cosmic_files.ftl index 7e26c8d..077fe3c 100644 --- a/i18n/ga/cosmic_files.ftl +++ b/i18n/ga/cosmic_files.ftl @@ -419,3 +419,6 @@ remove-from-recents = Bain as na cinn is déanaí reload-folder = Athlódáil an fillteán empty-trash-title = Folmhaigh an bruscar? type-to-search-select = Roghnaíonn an chéad chomhad nó fillteán comhoiriúnach +pasted-image = Íomhá ghreamaithe +pasted-text = Téacs greamaithe +pasted-video = Físeán greamaithe diff --git a/i18n/hu/cosmic_files.ftl b/i18n/hu/cosmic_files.ftl index 5461213..5955be4 100644 --- a/i18n/hu/cosmic_files.ftl +++ b/i18n/hu/cosmic_files.ftl @@ -232,7 +232,7 @@ compressed = [one] elem *[other] elem } tömörítve innen: „{ $from }” ide: „{ $to }” -copy_noun = Másolás +copy_noun = Másolat creating = „{ $name }” létrehozása itt: „{ $parent }” created = „{ $name }” létrehozva itt: „{ $parent }” copying = @@ -422,3 +422,6 @@ support = Támogatás progress-failed = { $percent }%, sikertelen empty-trash-title = Kuka ürítése? type-to-search-select = Kijelöli az első egyező fájlt vagy mappát +pasted-image = Beillesztett kép +pasted-text = Beillesztett szöveg +pasted-video = Beillesztett videó diff --git a/i18n/id/cosmic_files.ftl b/i18n/id/cosmic_files.ftl index 3ea0e2d..25fc7a7 100644 --- a/i18n/id/cosmic_files.ftl +++ b/i18n/id/cosmic_files.ftl @@ -1,5 +1,5 @@ -empty-folder = Kosongkan map -empty-folder-hidden = Kosongkan map (memiliki item tersembunyi) +empty-folder = Map kosong +empty-folder-hidden = Map kosong (memiliki item tersembunyi) no-results = Tidak ada hasil yang ditemukan filesystem = Sistem berkas cosmic-files = Berkas COSMIC @@ -42,7 +42,7 @@ extract-to = Ekstrak ke... extract-to-title = Ekstrak ke map empty-trash = Kosongkan sampah empty-trash-title = Kosongkan sampah? -empty-trash-warning = Item di map Sampah akan dihapus permanen +empty-trash-warning = Item di map Sampah akan dihapus secara permanen emptying-trash = Mengosongkan { trash } ({ $progress })... mount-error = Tidak dapat mengakses drive create-new-file = Buat berkas baru @@ -304,3 +304,6 @@ sort-smallest-to-largest = Terkecil hingga terbesar sort-largest-to-smallest = Terbesar hingga terkecil selected-items = { $items } item yang dipilih type-to-search-select = Memilih berkas atau map pertama yang cocok +pasted-image = Gambar Ditempel +pasted-text = Teks Ditempel +pasted-video = Video Ditempel diff --git a/i18n/kk/cosmic_files.ftl b/i18n/kk/cosmic_files.ftl index 65b2b7a..f7807fa 100644 --- a/i18n/kk/cosmic_files.ftl +++ b/i18n/kk/cosmic_files.ftl @@ -304,3 +304,6 @@ sort-newest-first = Алдымен жаңалары sort-oldest-first = Алдымен ескілері sort-smallest-to-largest = Кішісінен үлкеніне sort-largest-to-smallest = Үлкенінен кішісіне +pasted-image = Кірістірілген сурет +pasted-text = Кірістірілген мәтін +pasted-video = Кірістірілген видео diff --git a/i18n/ko/cosmic_files.ftl b/i18n/ko/cosmic_files.ftl index 5453859..b574e67 100644 --- a/i18n/ko/cosmic_files.ftl +++ b/i18n/ko/cosmic_files.ftl @@ -120,7 +120,7 @@ trashed-on = 버려짐 remove = 제거 original-file = 원본 파일 create = 생성 -create-archive = 기록 생성 +create-archive = 압축 생성 read-write-execute = 읽기, 쓰기 및 실행 other-apps = 다른 앱 set-permissions = "{ $name }"의 권한을 { $mode }로 설정함 diff --git a/i18n/ml/cosmic_files.ftl b/i18n/ml/cosmic_files.ftl new file mode 100644 index 0000000..e69de29 diff --git a/i18n/oc/cosmic_files.ftl b/i18n/oc/cosmic_files.ftl new file mode 100644 index 0000000..e69de29 diff --git a/i18n/pl/cosmic_files.ftl b/i18n/pl/cosmic_files.ftl index f72113a..bb569b0 100644 --- a/i18n/pl/cosmic_files.ftl +++ b/i18n/pl/cosmic_files.ftl @@ -423,3 +423,6 @@ sort-smallest-to-largest = Najpierw najmniejsze sort-largest-to-smallest = Najpierw największe empty-trash-title = Opróżnić kosz? type-to-search-select = Wybierz pierwszy pasujący plik lub katalog +pasted-image = Wklej Obraz +pasted-text = Wklejony Tekst +pasted-video = Wklejone Wideo diff --git a/i18n/pt-BR/cosmic_files.ftl b/i18n/pt-BR/cosmic_files.ftl index d6a19b9..1de594e 100644 --- a/i18n/pt-BR/cosmic_files.ftl +++ b/i18n/pt-BR/cosmic_files.ftl @@ -422,3 +422,6 @@ sort-smallest-to-largest = Do menor para o maior sort-largest-to-smallest = Do maior para o menor empty-trash-title = Esvaziar a lixeira? type-to-search-select = Seleciona o primeiro arquivo ou pasta correspondente +pasted-image = Imagem colada +pasted-text = Texto copiado +pasted-video = Vídeo copiado diff --git a/i18n/ru/cosmic_files.ftl b/i18n/ru/cosmic_files.ftl index 07dc88d..4532cd9 100644 --- a/i18n/ru/cosmic_files.ftl +++ b/i18n/ru/cosmic_files.ftl @@ -6,7 +6,7 @@ filesystem = Файловая система home = Домашняя папка trash = Корзина networks = Сеть -notification-in-progress = Выполняются файловые операции. +notification-in-progress = Выполняются файловые операции recents = Недавние документы undo = Отменить today = Сегодня @@ -26,7 +26,7 @@ create-archive = Создать архив ## Empty Trash Dialog empty-trash = Очистить корзину -empty-trash-warning = Вы уверены, что хотите навсегда удалить все элементы в корзине? +empty-trash-warning = Элементы в папке «Корзина» будут удалены без возможности восстановления # New File/Folder Dialog create-new-file = Создать новый файл create-new-folder = Создать новую папку @@ -67,7 +67,7 @@ skip = Пропустить owner = Владелец group = Группа -other = Остальные +other = Прочие # Context Pages @@ -191,8 +191,8 @@ settings = Параметры appearance = Оформление theme = Тема match-desktop = Как в системе -dark = Тёмное -light = Светлое +dark = Тёмная +light = Светлая # Context menu add-to-sidebar = Добавить на боковую панель compress = Сжать @@ -203,10 +203,10 @@ open-in-terminal = Открыть в терминале move-to-trash = Переместить в корзину restore-from-trash = Восстановить из корзины remove-from-sidebar = Убрать с боковой панели -sort-by-name = Разместить по имени -sort-by-modified = Разместить по дате изменения -sort-by-size = Разместить по размеру -sort-by-trashed = Разместить по дате удаления +sort-by-name = Сорт. по имени +sort-by-modified = Сорт. по дате изменения +sort-by-size = Сорт. по размеру +sort-by-trashed = Сорт. по дате удаления # Menu @@ -244,8 +244,8 @@ menu-about = О приложении Файлы COSMIC... ## Sort sort = Сортировка -sort-a-z = По алфавиту (от А до Я) -sort-z-a = По алфавиту (от Я до А) +sort-a-z = От А до Я +sort-z-a = От Я до А sort-newest-first = Сначала новые sort-oldest-first = Сначала старые sort-smallest-to-largest = От меньшего к большему @@ -314,15 +314,15 @@ item-modified = Дата изменения: { $modified } item-accessed = Дата доступа: { $accessed } calculating = Вычисление… single-click = Открывать одним нажатием -type-to-search = Введите для поиска -type-to-search-recursive = Поиск по текущей папке и всем подпапкам -type-to-search-enter-path = Введите путь до каталога или файла +type-to-search = Поле поиска +type-to-search-recursive = Поиск в текущей папке и подпапках +type-to-search-enter-path = Ввод пути к каталогу или файлу delete-permanently = Удалить навсегда eject = Извлечь -remove-from-recents = Убрать из недавнего +remove-from-recents = Убрать из недавних change-wallpaper = Изменить обои… desktop-appearance = Параметры оформления… -display-settings = Настройки дисплея… +display-settings = Параметры экрана… reload-folder = Обновить папку gallery-preview = Галерея предпросмотра operations-running = @@ -365,3 +365,7 @@ removed-from-recents = [one] элемент *[other] элем. } из { recents } +type-to-search-select = Выделение первого подходящего файла или папки +pasted-image = Вставленное изображение +pasted-text = Вставленный текст +pasted-video = Вставленное видео diff --git a/i18n/sv/cosmic_files.ftl b/i18n/sv/cosmic_files.ftl index 477d3a7..fac6c73 100644 --- a/i18n/sv/cosmic_files.ftl +++ b/i18n/sv/cosmic_files.ftl @@ -395,3 +395,6 @@ reload-folder = Ladda om mapp selected-items = De { $items } valda objekten empty-trash-title = Töm papperskorgen? type-to-search-select = Markerar den första matchande filen eller mappen +pasted-image = Inklistrad bild +pasted-text = Inklistrad text +pasted-video = Inklistrad video diff --git a/i18n/uk/cosmic_files.ftl b/i18n/uk/cosmic_files.ftl index 1c77455..dabdc20 100644 --- a/i18n/uk/cosmic_files.ftl +++ b/i18n/uk/cosmic_files.ftl @@ -27,8 +27,8 @@ file-name = Назва файлу folder-name = Назва теки file-already-exists = Файл з такою назвою вже існує folder-already-exists = Тека з такою назвою вже існує -name-hidden = Назви, що починаються з ".", будуть приховані -name-invalid = Назва не може бути "{ $filename }" +name-hidden = Назви, що починаються з «.», приховано +name-invalid = Назва не може бути «{ $filename }» name-no-slashes = Назва не може містити скісні риски ## Open/Save Dialog @@ -52,9 +52,9 @@ rename-folder = Перейменувати теку ## Replace Dialog replace = Замінити -replace-title = " { $filename }" вже існує в цьому місці -replace-warning = Бажаєте замінити його тим, що зберігаєте? Замінювання перезапише його вміст. -replace-warning-operation = Бажаєте замінити його? Замінювання перезапише його вміст. +replace-title = «{ $filename }» вже існує в цій теці +replace-warning = Бажаєте замінити файл тим, що зберігаєте? Після заміни його вміст буде перезаписано. +replace-warning-operation = Бажаєте замінити його? Це перезапише його вміст. original-file = Початковий файл replace-with = Замінити на apply-to-all = Застосувати до всіх @@ -69,55 +69,55 @@ skip = Пропустити ## Operations -edit-history = Редагувати історію +edit-history = Історія дій history = Історія -no-history = Немає елементів у історії. -pending = В очікуванні -failed = Не вдалося -complete = Завершити +no-history = Історія порожня. +pending = Очікується +failed = Не виконано +complete = Завершено copy_noun = Копіювати -creating = Створення "{ $name }" у " { $parent }" -created = Створено "{ $name }" у "{ $parent }" +creating = Створення «{ $name }» в «{ $parent }» +created = Створено «{ $name }» у «{ $parent }» copying = Копіювання { $items } { $items -> - [one] обʼєкта - *[other] обʼєктів - } з "{ $from }" до "{ $to }" ({ $progress })... + [one] елемента + *[other] елементів + } з «{ $from }» в «{ $to }» ({ $progress })... copied = Скопійовано { $items } { $items -> - [one] обʼєкт - *[other] обʼєкти - } з "{ $from }" до "{ $to }" + [one] елемент + *[other] елеменів + } з «{ $from }» в «{ $to }» emptying-trash = Спорожнення { trash } ({ $progress })... emptied-trash = Спорожнено { trash } moving = Переміщення { $items } { $items -> - [one] обʼєкта - *[other] обʼєктів - } з { $from } до "{ $to }" ({ $progress })... + [one] елемента + *[other] елементів + } з «{ $from }» в «{ $to }» ({ $progress })... moved = Переміщено { $items } { $items -> - [one] обʼєкт - *[other] обʼєкти - } з "{ $from }" до "{ $to }" -renaming = Перейменування "{ $from }" на "{ $to }" -renamed = Перейменовано "{ $from }" на "{ $to }" + [one] елемент + *[other] елементи + } з «{ $from }» в «{ $to }» +renaming = Перейменування «{ $from }» на «{ $to }» +renamed = Перейменовано «{ $from }» на «{ $to }» restoring = Відновлення { $items } { $items -> - [one] обʼєкта - *[other] обʼєктів + [one] елемента + *[other] елементів } з { trash } ({ $progress })... restored = Відновлено { $items } { $items -> - [one] обʼєкт - *[other] обʼєкти + [one] елемент + *[other] елементи } з { trash } unknown-folder = невідома тека ## Open with menu-open-with = Відкрити за допомогою... -default-app = { $name } (за замовчуванням) +default-app = { $name } (звичайний) ## Properties @@ -130,7 +130,7 @@ settings = Налаштування appearance = Зовнішній вигляд theme = Тема -match-desktop = Відповідно системі +match-desktop = Системна dark = Темна light = Світла # Context menu @@ -170,14 +170,14 @@ select-all = Вибрати все zoom-in = Збільшити default-size = Стандартний розмір zoom-out = Зменшити -view = Вигляд +view = Вид grid-view = Перегляд таблицею list-view = Перегляд списком show-hidden-files = Показати приховані файли list-directories-first = Теки спочатку menu-settings = Налаштування... menu-about = Про Файли COSMIC... -repository = Репозиторій +repository = Сховище support = Підтримка details = Деталі dismiss = Закрити повідомлення @@ -191,7 +191,7 @@ desktop-view-options = Параметри вигляду стільниці... show-on-desktop = Показувати на стільниці desktop-folder-content = Вміст теки Стільниця mounted-drives = Змонтовані диски -trash-folder-icon = Піктограма теки Смітник +trash-folder-icon = Піктограма Смітника icon-size-and-spacing = Розмір піктограм і відстань між ними icon-size = Розмір піктограм grid-spacing = Відстань між піктограмами @@ -212,15 +212,15 @@ create-archive = Створити архів extract-password-required = Потрібен пароль extract-to = Видобути до... extract-to-title = Видобути до теки -mount-error = Неможливо отримати доступ до диска +mount-error = Доступ до диска відсутній create = Створити open-item-location = Відкрити розташування елемента -open-with-title = Як ви бажаєте відкрити "{ $name }"? +open-with-title = Як ви бажаєте відкрити «{ $name }»? browse-store = Переглянути { $store } other-apps = Інші застосунки related-apps = Пов'язані застосунки permanently-delete-question = Остаточно видалити? -delete = Вилучити +delete = Видалити permanently-delete-warning = { $target } буде остаточно видалено. Цю дію не можна скасувати. set-executable-and-launch = Зробити виконуваним і запустити set-executable-and-launch-description = Бажаєте зробити "{ $name }" виконуваним і запустити його? @@ -239,15 +239,15 @@ read-write = Перегляд і запис read-write-execute = Перегляд, запис і виконання favorite-path-error = Помилка при відкритті каталогу favorite-path-error-description = - Неможливо відкрити "{ $path }" - "{ $path }" можливо, його не існує або у вас немає прав на відкриття + Не вдалося відкрити «{ $path }» + «{ $path }» можливо не існує або у вас немає прав на відкриття Вилучити з бічної панелі? keep = Залишити add-network-drive = Додати мережевий диск -connect = Під'єднати -connect-anonymously = Під'єднатися анонімно -connecting = Під’єднання… +connect = З'єднати +connect-anonymously = З'єднатись анонімно +connecting = З'єднання… domain = Домен enter-server-address = Введіть адресу сервера network-drive-description = @@ -261,7 +261,7 @@ network-drive-schemes = Серверний Блок Повідомлень,smb:// Протокол Передавання Файлів SSH,sftp:// або ssh:// WebDAV,dav:// або davs:// -network-drive-error = Неможливо отримати доступ до мережевого диска +network-drive-error = Доступ до мережевого диска відсутній password = Пароль remember-password = Запам'ятати пароль try-again = Спробувати знову @@ -294,31 +294,31 @@ extracting = Видобування { $items } { $items -> [one] елемента *[other] елементів - } з "{ $from }" до "{ $to }" ({ $progress })... + } з «{ $from }» в «{ $to }» ({ $progress })... extracted = Видобуто { $items } { $items -> [one] елемент *[other] елементи - } з "{ $from }" до "{ $to }" -setting-executable-and-launching = Встановлення "{ $name }" виконуваним і запуск -set-executable-and-launched = Встановлено "{ $name }" виконуваним і запущено + } з «{ $from }» в «{ $to }» +setting-executable-and-launching = Надання «{ $name }» прав на виконання та запуск +set-executable-and-launched = «{ $name }» надано права на виконання і відкрито selected-items = Вибрані { $items } елементи -setting-permissions = Встановлення дозволів { $mode } для "{ $name }" -set-permissions = Встановлено дозволи { $mode } для "{ $name }" -show-details = Показати деталі +setting-permissions = Надання прав { $mode } для «{ $name }» +set-permissions = Надано права { $mode } для «{ $name }» +show-details = Показати подробиці type = Тип: { $mime } items = Елементів: { $items } item-size = Розмір: { $size } item-created = Створено: { $created } item-modified = Змінено: { $modified } -item-accessed = Доступ: { $accessed } +item-accessed = Дата доступу: { $accessed } calculating = Обчислення... single-click = Відкривати одним клацанням type-to-search = Введіть для пошуку type-to-search-recursive = Шукає у поточній теці та всіх підтеках type-to-search-enter-path = Вводить шлях до каталогу або файлу compress = Стиснути -delete-permanently = Остаточно вилучити +delete-permanently = Остаточно видалити eject = Безпечно вилучити extract-here = Видобути sort-by-trashed = Упорядкувати за часом видалення @@ -326,7 +326,7 @@ remove-from-recents = Вилучити з нещодавніх change-wallpaper = Змінити зображення тла... desktop-appearance = Вигляд стільниці... display-settings = Налаштування дисплея... -reload-folder = Перезавантажити теку +reload-folder = Оновити теку gallery-preview = Попередній перегляд галереї sort = Упорядкувати sort-a-z = А-Я @@ -357,3 +357,6 @@ removed-from-recents = } з { recents } empty-trash-title = Спорожити смітник? type-to-search-select = Вибирає перший відповідний файл або папку +pasted-image = Вставлене Зображення +pasted-text = Вставлений Текст +pasted-video = Вставлене Видиво diff --git a/i18n/zh-CN/cosmic_files.ftl b/i18n/zh-CN/cosmic_files.ftl index f91079d..1217be9 100644 --- a/i18n/zh-CN/cosmic_files.ftl +++ b/i18n/zh-CN/cosmic_files.ftl @@ -215,7 +215,7 @@ username = 用户名 cancelled = 已取消 edit-history = 编辑历史记录 history = 历史记录 -no-history = 历史记录为空 +no-history = 历史记录为空。 pending = 待处理 progress = { $percent }% progress-cancelled = { $percent }%,已取消 @@ -422,3 +422,6 @@ support = 支持 progress-failed = { $percent }%,失败 empty-trash-title = 确定要清空回收站? type-to-search-select = 选择第一个匹配的文件或文件夹 +pasted-video = 已粘贴视频 +pasted-image = 已粘贴图片 +pasted-text = 已粘贴文本 diff --git a/src/app.rs b/src/app.rs index b1049db..3e6d9f0 100644 --- a/src/app.rs +++ b/src/app.rs @@ -146,6 +146,7 @@ pub enum Action { AddToSidebar, Compress, Copy, + CopyTo, Cut, CosmicSettingsDesktop, CosmicSettingsDisplays, @@ -168,6 +169,7 @@ pub enum Action { ItemRight, ItemUp, LocationUp, + MoveTo, NewFile, NewFolder, Open, @@ -213,6 +215,7 @@ impl Action { Self::AddToSidebar => Message::AddToSidebar(entity_opt), Self::Compress => Message::Compress(entity_opt), Self::Copy => Message::Copy(entity_opt), + Self::CopyTo => Message::CopyTo(entity_opt), Self::Cut => Message::Cut(entity_opt), Self::CosmicSettingsDesktop => Message::CosmicSettings("desktop"), Self::CosmicSettingsDisplays => Message::CosmicSettings("displays"), @@ -237,6 +240,7 @@ impl Action { Self::ItemRight => Message::TabMessage(entity_opt, tab::Message::ItemRight), Self::ItemUp => Message::TabMessage(entity_opt, tab::Message::ItemUp), Self::LocationUp => Message::TabMessage(entity_opt, tab::Message::LocationUp), + Self::MoveTo => Message::MoveTo(entity_opt), Self::NewFile => Message::NewItem(entity_opt, false), Self::NewFolder => Message::NewItem(entity_opt, true), Self::Open => Message::TabMessage(entity_opt, tab::Message::Open(None)), @@ -335,6 +339,8 @@ pub enum Message { Compress(Option), Config(Config), Copy(Option), + CopyTo(Option), + CopyToResult(DialogResult), CosmicSettings(&'static str), Cut(Option), Delete(Option), @@ -359,6 +365,8 @@ pub enum Message { ModifiersChanged(window::Id, Modifiers), MounterItems(MounterKey, MounterItems), MountResult(MounterKey, MounterItem, Result), + MoveTo(Option), + MoveToResult(DialogResult), NavBarClose(Entity), NavBarContext(Entity), NavMenuAction(NavMenuAction), @@ -949,7 +957,13 @@ impl App { } } - fn extract_to(&mut self, paths: &[impl AsRef]) -> Task { + fn destination_selection_dialog( + &mut self, + paths: &[impl AsRef], + on_result: impl Fn(DialogResult) -> Message + 'static, + title: impl Into, + accept_label: impl AsRef, + ) -> Task { if let Some(destination) = paths .first() .and_then(|first| first.as_ref().parent()) @@ -960,10 +974,10 @@ impl App { .kind(DialogKind::OpenFolder) .path(destination), Message::FileDialogMessage, - Message::ExtractToResult, + on_result, ); - let set_title_task = dialog.set_title(fl!("extract-to-title")); - dialog.set_accept_label(fl!("extract-here")); + let set_title_task = dialog.set_title(title); + dialog.set_accept_label(accept_label); self.windows.insert( dialog.window_id(), Window::new(WindowKind::FileDialog(Some( @@ -977,6 +991,33 @@ impl App { } } + fn extract_to(&mut self, paths: &[impl AsRef]) -> Task { + self.destination_selection_dialog( + paths, + Message::ExtractToResult, + fl!("extract-to-title"), + fl!("extract-here"), + ) + } + + fn move_to(&mut self, paths: &[impl AsRef]) -> Task { + self.destination_selection_dialog( + paths, + Message::MoveToResult, + fl!("move-to-title"), + fl!("move-to-button-label"), + ) + } + + fn copy_to(&mut self, paths: &[impl AsRef]) -> Task { + self.destination_selection_dialog( + paths, + Message::CopyToResult, + fl!("copy-to-title"), + fl!("copy-to-button-label"), + ) + } + #[cfg(all(feature = "wayland", feature = "desktop-applet"))] fn handle_overlap(&mut self) { let mut overlaps: FxHashMap<_, _> = self @@ -2675,6 +2716,34 @@ impl Application for App { let contents = ClipboardCopy::new(ClipboardKind::Copy, paths); return clipboard::write_data(contents); } + Message::CopyTo(entity_opt) => { + let selected_paths: Box<[_]> = self.selected_paths(entity_opt).collect(); + return self.copy_to(&selected_paths); + } + Message::CopyToResult(result) => { + match result { + DialogResult::Cancel => {} + DialogResult::Open(selected_paths) => { + let mut file_paths = None; + if let Some(file_dialog) = &self.file_dialog_opt + && let Some(window) = self.windows.remove(&file_dialog.window_id()) + && let WindowKind::FileDialog(paths) = window.kind + { + file_paths = paths; + } + if let Some(file_paths) = file_paths + && !selected_paths.is_empty() + { + self.file_dialog_opt = None; + return self.operation(Operation::Copy { + paths: file_paths.to_vec(), + to: selected_paths[0].clone(), + }); + } + } + } + self.file_dialog_opt = None; + } Message::Cut(entity_opt) => { self.set_cut(entity_opt); let paths = self.selected_paths(entity_opt); @@ -3195,6 +3264,35 @@ impl Application for App { ); } }, + Message::MoveTo(entity_opt) => { + let selected_paths: Box<[_]> = self.selected_paths(entity_opt).collect(); + return self.move_to(&selected_paths); + } + Message::MoveToResult(result) => { + match result { + DialogResult::Cancel => {} + DialogResult::Open(selected_paths) => { + let mut file_paths = None; + if let Some(file_dialog) = &self.file_dialog_opt + && let Some(window) = self.windows.remove(&file_dialog.window_id()) + && let WindowKind::FileDialog(paths) = window.kind + { + file_paths = paths; + } + if let Some(file_paths) = file_paths + && !selected_paths.is_empty() + { + self.file_dialog_opt = None; + return self.operation(Operation::Move { + paths: file_paths.to_vec(), + to: selected_paths[0].clone(), + cross_device_copy: false, + }); + } + } + } + self.file_dialog_opt = None; + } Message::NetworkAuth(mounter_key, uri, auth, auth_tx) => { return self.push_dialog( DialogPage::NetworkAuth { diff --git a/src/menu.rs b/src/menu.rs index 6af7687..eb3929f 100644 --- a/src/menu.rs +++ b/src/menu.rs @@ -205,6 +205,10 @@ pub fn context_menu<'a>( children.push(menu_item(fl!("cut"), Action::Cut).into()); } children.push(menu_item(fl!("copy"), Action::Copy).into()); + if selected_mount_point == 0 { + children.push(menu_item(fl!("move-to"), Action::MoveTo).into()); + } + children.push(menu_item(fl!("copy-to"), Action::CopyTo).into()); children.push(divider::horizontal::light().into()); let supported_archive_types = crate::archive::SUPPORTED_ARCHIVE_TYPES; diff --git a/src/tab.rs b/src/tab.rs index 8b6faa7..7aa0030 100644 --- a/src/tab.rs +++ b/src/tab.rs @@ -40,6 +40,7 @@ use cosmic::{ menu::{action::MenuAction, key_bind::KeyBind}, }, }; +use gio::prelude::FileExt; use i18n_embed::LanguageLoader; use icu::{ datetime::{ @@ -674,7 +675,16 @@ fn display_name_for_file(path: &Path, name: &str, get_from_gvfs: bool, is_deskto ); } else if get_from_gvfs { #[cfg(feature = "gvfs")] - return Item::display_name(glib::filename_display_name(path).as_str()); + { + let file = gio::File::for_path(path); + if let Ok(info) = file.query_info( + "standard::display-name", + gio::FileQueryInfoFlags::NONE, + gio::Cancellable::NONE, + ) { + return Item::display_name(info.display_name().as_str()); + } + } } Item::display_name(name) }