Add 7z support, panel tabs, file search, favorites, properties dialog, and i18n/ru - #1
Open
adeptykt wants to merge 25 commits into
Open
Add 7z support, panel tabs, file search, favorites, properties dialog, and i18n/ru#1adeptykt wants to merge 25 commits into
adeptykt wants to merge 25 commits into
Conversation
Add panel tabs and TC-style marks, 7z with a Windows OOP worker, ZIP Unicode names, folder sort, FS search/links helpers, host-key trust, and safer Windows icon/open paths. Co-authored-by: Cursor <cursoragent@cursor.com>
…itor Add panel tabs, menu bar, favorites/search/properties dialogs, TC-style marks and footer, modifier-aware F-keys, independent editor with remote edit, and nginx language support. Co-authored-by: Cursor <cursoragent@cursor.com>
Add full ru.yml support and new strings for menus, search, favorites, properties, editor, SSH host trust, and related UI. Co-authored-by: Cursor <cursoragent@cursor.com>
Document tabs, favorites, find-files, 7z, properties, SFTP improvements, and updated shortcuts in English and Russian changelogs. Co-authored-by: Cursor <cursoragent@cursor.com>
Add crates for CSV/JSON/YAML previews, markdown/HTML rendering, SVG resizing, and Windows OLE clipboard integration used by the new viewer and file clipboard features. Co-authored-by: Cursor <cursoragent@cursor.com>
Extract listing, transfer, SSH connect, and shared utilities from the monolithic RemoteService implementation using the existing #[path] module pattern. Co-authored-by: Cursor <cursoragent@cursor.com>
Move editor actions, find/replace, and support helpers into sibling modules, and split file panel keyboard input, signal wiring, and UI helpers out of the main view type. Co-authored-by: Cursor <cursoragent@cursor.com>
Route files to dedicated viewers for images, archives, CSV, structured data, markdown, HTML, and syntax-highlighted code, with shared chrome and GtkSourceView language support including Vue. Co-authored-by: Cursor <cursoragent@cursor.com>
Introduce an internal copy/cut/paste buffer for panel file operations and bridge it to the Windows file clipboard format for interoperability with Explorer. Co-authored-by: Cursor <cursoragent@cursor.com>
Register the new modules, connect clipboard actions and viewer entry points, extend operations and menus, and update dialog facades, shortcuts, and panel styling for the enhanced workflow. Co-authored-by: Cursor <cursoragent@cursor.com>
Translate new file viewer, clipboard, and editor labels across English, German, French, and Russian. Co-authored-by: Cursor <cursoragent@cursor.com>
Bundle GtkSourceView language specs and runtime dependencies needed by the rich viewer, and refresh installer scripts and documentation. Co-authored-by: Cursor <cursoragent@cursor.com>
Check that language-specs and styles subdirectories exist and count files with Measure-Object instead of @(...).Count, which can treat a null Get-ChildItem result as one item. Co-authored-by: Cursor <cursoragent@cursor.com>
Run locked cargo build and test on Linux, Windows, and macOS. Co-authored-by: Cursor <cursoragent@cursor.com>
Align local and CI builds on Rust 1.97.0 with rustfmt and clippy. Co-authored-by: Cursor <cursoragent@cursor.com>
Keep machine-specific IDE state and analysis caches out of version control. Co-authored-by: Cursor <cursoragent@cursor.com>
Join remote paths in panel_location so architecture_guard stays satisfied. Co-authored-by: Cursor <cursoragent@cursor.com>
Normalize formatting to the shared rustfmt.toml settings. Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Use Node 24 action runtimes and convert the Windows cargo bin path with cygpath so MSYS2 shells can find rustc. Co-authored-by: Cursor <cursoragent@cursor.com>
Flush file writes during copy so cancel watchers see progress, and remove the target directory after the child loop when cancellation was requested. Co-authored-by: Cursor <cursoragent@cursor.com>
Inherit the runner PATH into MSYS2 and export CARGO_HOME/bin before cargo invocations so rustup binaries are visible in each shell session. Co-authored-by: Cursor <cursoragent@cursor.com>
Cancel earlier in the copy-cancel test and allow pkg-config cross lookups when building the GNU Windows target in MSYS2. Co-authored-by: Cursor <cursoragent@cursor.com>
Only expect a fallback to C:\\Users when the legacy junction path itself cannot be listed. Co-authored-by: Cursor <cursoragent@cursor.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
All project changes (uncommitted)
Summary date: 2026-07-21
Comparison base:
master@34e471a(edit: design)Scope: ~87 modified tracked files, +9031 / −1458 lines (excluding
Cargo.lockandtarget*), plus ~18 new source/resource files.This document lists all working-tree changes relative to the latest commit.
Russian version:
CHANGES-all-ru.md.Topic summary
sevenz-rust2) + out-of-process worker on Windows.7zin the UI process; icons/open out-of-processlocales/ru.ymlDependencies (
Cargo.toml/Cargo.lock)Added:
sevenz-rust2 = "0.20"— 7-Zip supportencoding_rs = "0.8"— ZIP name decodingregex = "1.11"— find-files (regex)Windows:
windowscrate gained featureWin32_Storage_FileSystemCargo.lockupdated accordingly.New files
Source
src/archive/sevenz_backend.rs.7zsrc/archive/sevenz_worker.rssrc/archive/zip_name.rssrc/domain/panel_tabs.rssrc/domain/folder_sort.rssrc/domain/search.rssrc/fs/links.rs.lnk/ junction navigationsrc/fs/search.rssrc/fs/temp.rssrc/ui/dialogs_favorites.rssrc/ui/dialogs_properties.rssrc/ui/dialogs_search.rssrc/ui/main_window_menu.rsLocales / assets / tests / docs
locales/ru.ymlassets/gtksourceview-5/language-specs/nginx.langtests/unit/archive_sevenz_tests.rstests/unit/domain_folder_sort_tests.rstests/unit/domain_panel_tabs_tests.rsdocs/CHANGES-all-ru.mddocs/CHANGES-all-en.mdRemoved
tests/unit/platform_icons_windows_tests.rs1. Archives (
src/archive/**)1.1. 7-Zip support
ArchiveFormat::SevenZip/ familyArchiveFamily::SevenZip.SevenZipBackend— list/extract, error mapping (password, CRC, I/O).--archive-worker) so the 7-Zip shell extension is not loaded into the UI (avoidsSTATUS_STACK_BUFFER_OVERRUN).sevenz_worker.rs— stdout protocol with\x1fseparator (list/extract).archive_worker_main()inarchive/mod.rs; early exit frommain.rs/ re-export inlib.rswithout GTK.1.2. ZIP names
zip_name.rs: Info-ZIP Unicode Path (0x7075) → UTF-8 → CP866/CP1251 heuristics → crate fallback.encoding_rs.1.3. Detection and registry
.7z) does not open the file solely for detection.is_archive_path/ Enter: extension-first —.7zon Windows does not go throughread_dir/shell.AskArchiveAction→OpenArchive(open archive directly, no “as archive / externally” choice).resolve_for_path→backend_that_can_open; separateprobe_path()/can_open_path()for “not supported yet” UX.normalize_archive_entry_path,archive_entry_display_name,archive_entry_matches_selection.extract_entries.Modified files
detector.rs,mod.rs,path.rs,probe.rs,registry.rs,service.rs,unrar.rs,zip_backend.rsNew:
sevenz_backend.rs,sevenz_worker.rs,zip_name.rs2. Domain (
src/domain/**)2.1. Tabs —
panel_tabs.rsPanelTabs,TabId2.2. Folder sort —
folder_sort.rs2.3. Search —
search.rsSearchOptions,SearchHit,CompiledSearch*/?) and regex, exclude masks2.4. Panel / selection / sorting / location
SelectionModel::singleno longer marks the row; marks are independent.selected_items(): if there are no marks — uses the cursor (classic commander).toggle_mark,toggle_mark_in_place,mark_all,invert_marks,set_cursor,set_marks.replace_entries/navigate_todo not sort — sorting runs on the worker.entry_key_when_leaving_tois used (focus the folder just left).calculated_dir_sizes,set_calculated_dir_size.index_matching_name_prefix.PanelLocation:tab_title(),root(),entry_key_when_leaving_to(); FSparent()at root →None.EntryKind.SortColumn/SortDirection:Serialize/Deserialize,Default.folders_firstmadepub.Modified / new
Modified:
mod.rs,panel.rs,panel_location.rs,selection.rs,sorting.rsNew:
panel_tabs.rs,folder_sort.rs,search.rs3. Filesystem (
src/fs/**)Added
links.rs: symlink / Windows.lnk;resolve_directory_navigation_path(junction fallback, e.g.Documents and Settings→Users).search.rs: background cancellable walk →SearchEvent(Progress / Hits / Failed / Finished).temp.rs: temp dir for remote edit.directory_total_size()— recursive size sum (does not enter nested symlink dirs).copy_entry()— recursive tree copy.target_path.Changed
classify_fs_entry;read_entry→symlink_metadata.Lflag for links; on Unix symlink is detected before directory.resolve_directory_navigation_path.Files
Modified:
mod.rs,operations.rs,reader.rsNew:
links.rs,search.rs,temp.rs4. Application (
src/application/**)Added
open_tab/close_tab/activate_tab/next_tab/prev_tab/restore_tabs/swap_panels.set_cursor,toggle_mark*,mark_all,invert_marks,quick_search,set_calculated_dir_size.CreateDirectoryTarget— FS or Remote.create_file_request,copy_with_rename_request.parent_navigation_request,filesystem_navigation_request,location_root_navigation_request.DeleteMode(Default|Permanent);prepare_operation_with_options.NavigationError::HostKeyTrustRequired.Changed
AppState.left/right:Panel→PanelTabs;panel()= active tab.NavigationRequest/DirectoryLoadResult:tab_id,sort_state,folders_first; sort on worker.AskArchiveAction→OpenArchive; archive check beforeis_dir.ViewUpdate::selection: updates panel entries without changingactive_panel(less scroll jumping).force_overwrite; Local:target_path.EntryLoader:force_refresh+session_key; untrusted host key mapping.Files
app_state.rs,commander.rs,commands.rs,errors.rs,mod.rs,navigation.rs,operation.rs,operation_runner.rs,services/entry_loader.rs5. Config (
src/config.rs)Added:
favorites: Vec<FavoriteEntry>folder_sort: Vec<FolderSortPreference>EditorConfig(window size, max edit size MiB)IconStyle(Symbolic|System) inGeneralConfigPaneTabConfig+left_tabs/right_tabs/*_active_tableft_cursor/right_cursorBehavior: old configs without new fields load with
Default; tabs/cursors/favorites/folder_sort serialize to TOML.6. Remote / SFTP (
src/remote/**)Added
HostKeyTrustOffer,HostKeyUntrusted,RemoteService::trust_host_key, write to OpenSSHknown_hosts.listing_cache);invalidate_listing_cache_for_path;force_refreshbypasses cache.create_directory,set_permissions.EntryKind::Symlink, follow for is_dir).force_overwritefor download/upload.Changed
known_hosts/ NotFound →HostKeyUntrusted(UI can offer trust), not a hard bail.read_entriestakessession_key+force_refresh.Files
mod.rs,service.rs7. Platform (
src/platform/**)Added
IconStyleruntime +set_icon_style/icon_for_listing_entry/fallback_icon_name_for_row.show_file_properties,force_foreground_window,resolve_shortcut_target(COM.lnk).open_pathvia out-of-processcmd /C start(not in-process ShellExecute).Changed
USEFILEATTRIBUTES— do not open live paths like.7z.platform_icons_windows_tests.rs.Files
icons.rs,mod.rs,windows.rs8. UI — panel tabs
Files:
file_panel_view.rs,commander_view.rs,main_window.rs,main_window_actions.rs,main_window_panel_wiring.rs,main_window_window_state.rs,shortcuts.rs,theme_*.css.panel-tab-bar/.panel-tab/.panel-tab-add) + “+” button.Ctrl+T,Ctrl+W,Ctrl+Tab/Ctrl+PageDown,Ctrl+Shift+Tab/Ctrl+PageUp.left_tabs/right_tabsand active index (persist_pane_session).9. UI — application menu
New:
src/ui/main_window_menu.rsRelated:
main_window.rs,main_window_window_chrome.rs,shortcuts.rsPopoverMenuBar:refresh_menu_barupdates labels on language change.10. UI — find files
New:
src/ui/dialogs_search.rsRelated:
dialogs.rs,main_window_actions.rs,shortcuts.rs, keyssearch.*Alt+F7/Ctrl+Shift+F): name pattern, exclude, directory, subdirs, case, regex.ColumnView(name, type, path, size, date); Start/Stop; statuses.show_find_files,SearchDialogAction,search_go_to_request.11. UI — file properties
New:
src/ui/dialogs_properties.rsRelated:
main_window_actions_file.rs,shortcuts.rs(Alt+Enter)show_remote_properties— octal + owner/group/other (rwx) checkboxes, Apply.12. UI — favorites
New module
dialogs_favorites.rs(wired indialogs.rs)Full feature
FavoritesAction::Update; navigation viaFavoritesAction::Go.Ctrl+D; menu item.Order and compact list
favorites_move_up/favorites_move_down) after Delete.move_selected(delta): swap neighbors, persist viaFavoritesAction::Update, move focus.dialog-title.FavoriteEntryconfig format unchanged.13. UI — selection, marks, footer, quick-search
Files:
file_panel_view.rs,columns.rs,file_row_object.rs,presentation.rs,commander_view.rs,main_window_panel_wiring.rs,main_window_hosts_impl.rsSingleSelection); marked — red#ff4d4d+ CSS.marked.panel.footer_ready/panel.footer_selected(folders, files, total size).entry_size_label_with_calculated— show calculated directory size.status.quick_search.ensure_icon/reload_icons); Symbolic / System style in settings.14. UI — sorting and hidden files
Files:
main_window_actions.rs,file_panel_view.rs,columns.rs,shortcuts.rs, View menuCtrl+F3..F6— name / extension / date / size; column headers stay in sync.Ctrl+.— show hidden/system; stateful menu action.Ctrl+R— refresh (bypass SFTP cache);Ctrl+\— location root;Ctrl+U— swap panels.15. UI — command bar (F-keys)
Files:
main_window_command_bar.rs,main_window.rs,theme_*.css.command-key,.command-caption).16. UI — editor
File:
src/ui/editor_dialog.rs(+~1000 lines)build_independent_window) with File/Edit menu.edit_remote_file,RemoteEditBinding, progress).settings.max_edit_size_mb); SourceView schemes for light/dark themes.nginx.lang.17. UI — operation, remote, base, settings dialogs
dialogs_operations.rsdialogs_remote.rsdialogs_base.rsshow_about,present_with_focusdialogs_settings.rsdialogs.rsprompt_archive_open_action; addedprompt_new_file,prompt_copy_as; re-export new dialogsdialogs_unix.rs18. UI — archives in the interface
Files:
main_window_navigation.rs,main_window_operations_archive.rs,dialogs.rsArchiveSupport..7zis not opened via shell association in-process — opened as an archive immediately.archive_unsupported_*dialog for unsupported formats.main.rs/lib.rs:archive_worker_main()entry for the worker process.19. UI — file actions and navigation
Files:
main_window_actions_file.rs,main_window_navigation.rs,main_window_operations_transfer.rs,main_window_navigation_load.rs,main_window_navigation_watch.rs, etc.commander_view.rs.20. Themes / CSS
Files:
theme.rs,theme_base.css,theme_dark.css,theme_light.cssgtk_application_prefer_dark_themefor Light/Dark;sourceview_style_scheme_ids.21. Shortcuts (new / extended)
File:
src/ui/shortcuts.rsAdded/extended:
Alt+Enter)Alt+F1/Alt+F2Shift+F4/Shift+F5/Shift+F8Delete/Shift+DeleteCtrl+F3–Ctrl+F6Ctrl+DAlt+F7/Ctrl+Shift+FCtrl+R, rootCtrl+\, hiddenCtrl+., swap panelsCtrl+UCtrl+ACtrl+T/Ctrl+W/Ctrl+Tab/ …22. Localization
Russian —
locales/ru.yml(new)Full parallel translation of sections:
panel,column,entry,operation,common,command,menu,context,settings,dialog,search,editor,viewer,progress,terminal,archive,status,error.src/i18n.rsSUPPORTED_LOCALES:de,en,fr,ru.locales/{en,de,fr}.yml(+~234 lines each)New/changed keys: footer, menu., search., properties, favorites (+ move up/down), SSH host key, remote form, permanent delete, editor menu/find, folder sort, quick search, archive unsupported, copy/edit/favorites errors, etc.
Removed/replaced: old archive-open dialog, old detail copy/move with fixed target, some archive status strings.
Favorites reorder keys:
dialog.favorites_move_updialog.favorites_move_down23. Presentation / entrypoints
presentation.rsstatus_line= raw status; newpanel_footer_line; size with calculated dir sizemain.rslib.rspub use archive::archive_worker_maingtk_app.rsNON_UNIQUE; applyicon_styleat startup24. README.md
sevenz-rust2; list →gtk::SingleSelection.25. Unit tests (
tests/unit/**)New
archive_sevenz_tests.rsdomain_folder_sort_tests.rsdomain_panel_tabs_tests.rsModified
archive_detector_tests.rs—.7z; extension wins over wrong contentdomain_panel_tests.rs/domain_selection_tests.rs— marks vs cursor, parent focus, mark_all/toggledomain_sorting_tests.rs— Type by extensionfs_reader_tests.rs—directory_total_size, symlinks, Windows.lnk/ junctionconfig_tests.rs— editor, favorites, cursors, icon_styleremote_service_tests.rs— known_hosts entry name, key labelsapplication_commander_tests.rs/application_load_scheduler_tests.rs— adapted forPanelTabs/tab_id/ sort in requestplatform_icons_tests.rs—IconStyleswitchi18n_tests.rs—rusupportRemoved
platform_icons_windows_tests.rs26. Nginx language-spec
New:
assets/gtksourceview-5/language-specs/nginx.langnginx: comments, strings,$variables, directives/blocks, numbers with k/m/g.nginx.conf,*.nginx; editor also heuristically recognizes similar.conffiles.Full list of affected paths
Modified
Added (untracked)
Deleted
Not part of product changes
target-fix-7z/and othertarget*— build artifacts, not source.Intentionally out of scope / limitations
FavoriteEntry) — schema unchanged; order =Vecorder.