|
| 1 | +# SFTP Browser UI Polish Plan |
| 2 | + |
| 3 | +**Date:** 2026-01-10 |
| 4 | +**Status:** Completed |
| 5 | +**Priority:** Medium (Quality of Life) |
| 6 | + |
| 7 | +## Overview |
| 8 | + |
| 9 | +Modernize the SFTP browser dialog to feel more polished and aligned with contemporary design standards while maintaining functionality. |
| 10 | + |
| 11 | +--- |
| 12 | + |
| 13 | +## Phase 1: Toolbar Refinement ✅ |
| 14 | + |
| 15 | +### 1.1 Connection Status Indicator |
| 16 | +- [x] Replace bright green "Connected" pill badge with subtle indicator |
| 17 | +- [x] Add small green dot icon next to hostname when connected |
| 18 | +- [x] Show red dot or disconnected icon when not connected |
| 19 | +- [ ] Consider adding connection latency indicator (optional) |
| 20 | + |
| 21 | +**Files modified:** |
| 22 | +- `src/SshManager.App/Views/Controls/SftpBrowserControl.xaml` |
| 23 | + |
| 24 | +### 1.2 Button Grouping & Styling |
| 25 | +- [x] Group related actions with visual separators: |
| 26 | + - Navigation group: Refresh |
| 27 | + - Transfer group: Upload, Download |
| 28 | + - File operations group: New Folder, Delete, Permissions |
| 29 | + - Connection group: Disconnect |
| 30 | +- [x] Icon-only buttons with tooltips for all actions |
| 31 | +- [x] Reduce button padding for more compact toolbar |
| 32 | +- [x] Added keyboard shortcuts (Ctrl+U Upload, Ctrl+D Download) |
| 33 | + |
| 34 | +### 1.3 Transfer Queue Badge |
| 35 | +- [x] Add badge/indicator showing active transfer count |
| 36 | +- [x] Position near Download button in transfer group |
| 37 | + |
| 38 | +--- |
| 39 | + |
| 40 | +## Phase 2: Panel Headers & Navigation ✅ |
| 41 | + |
| 42 | +### 2.1 Panel Labels |
| 43 | +- [x] Restyle "Local" and "Remote" headers |
| 44 | +- [x] Options: |
| 45 | + - Tab-style headers with subtle background |
| 46 | + - Icon + label combination (Desktop icon for Local, Cloud icon for Remote) |
| 47 | + - Smaller, muted typography with accent underline |
| 48 | + |
| 49 | +**Files modified:** |
| 50 | +- `src/SshManager.App/Views/Controls/LocalFileBrowserControl.xaml` |
| 51 | +- `src/SshManager.App/Views/Controls/RemoteFileBrowserControl.xaml` |
| 52 | + |
| 53 | +### 2.2 Breadcrumb Navigation |
| 54 | +- [x] Unify styling between Local and Remote panels |
| 55 | +- [x] Add hover states to path segments |
| 56 | +- [x] Use chevron separators (ChevronRight20 icon) |
| 57 | +- [x] Add path copy button (clipboard icon) |
| 58 | + |
| 59 | +**Files modified:** |
| 60 | +- `src/SshManager.App/Views/Controls/LocalFileBrowserControl.xaml` |
| 61 | +- `src/SshManager.App/Views/Controls/RemoteFileBrowserControl.xaml` |
| 62 | +- `src/SshManager.App/Views/Controls/FileBrowserControlBase.cs` |
| 63 | + |
| 64 | +### 2.3 Quick Access Buttons |
| 65 | +- [x] **Local drives (C:\, D:\, etc.):** |
| 66 | + - Styled as chip buttons with background |
| 67 | + - HardDrive20 icon with accent color |
| 68 | + - Tooltip shows drive label and free/total space in GB |
| 69 | +- [x] **Remote shortcuts (Home, Root, /tmp, etc.):** |
| 70 | + - Matching styling with local drives |
| 71 | + - Home24 icon for Home, Folder24 for other paths |
| 72 | + - Tooltip shows full path |
| 73 | + |
| 74 | +**Files modified:** |
| 75 | +- `src/SshManager.App/Views/Controls/LocalFileBrowserControl.xaml` |
| 76 | +- `src/SshManager.App/Views/Controls/RemoteFileBrowserControl.xaml` |
| 77 | +- `src/SshManager.App/Converters/BytesToGigabytesConverter.cs` (new) |
| 78 | + |
| 79 | +--- |
| 80 | + |
| 81 | +## Phase 3: File List Improvements ✅ |
| 82 | + |
| 83 | +### 3.1 Visual Enhancements |
| 84 | +- [x] Add subtle row hover highlight (use theme's subtle background) |
| 85 | +- [x] Improve selected row styling with accent color |
| 86 | +- [x] Add focus indicators for keyboard navigation |
| 87 | + |
| 88 | +### 3.2 File Icons |
| 89 | +- [x] Add file type icons based on extension |
| 90 | +- [x] Common types: folder, document, image, code, archive, executable |
| 91 | +- [x] Use WPF-UI's `SymbolIcon` for consistency |
| 92 | + |
| 93 | +### 3.3 Column Formatting |
| 94 | +- [x] **Size column:** |
| 95 | + - Consistent formatting (always KB/MB/GB with 1 decimal) |
| 96 | + - Right-align for easier scanning |
| 97 | + - Show "-" for folders instead of empty |
| 98 | +- [x] **Date column:** |
| 99 | + - Friendlier format: "Today 14:30", "Yesterday", "Mon 09:15", "Jan 10", "Jan 10, 2026" |
| 100 | + - Show full timestamp on hover tooltip |
| 101 | +- [x] **Permissions column (Remote):** |
| 102 | + - Symbolic display (rwxr-xr-x) with tooltip for octal |
| 103 | + - Monospace font for better alignment |
| 104 | + |
| 105 | +### 3.4 Column Headers |
| 106 | +- [x] Add sort indicators (arrow icons) |
| 107 | +- [x] Highlight active sort column |
| 108 | +- [x] Click-to-sort functionality (toggle ascending/descending) |
| 109 | +- [ ] Persist sort preference (deferred to future phase) |
| 110 | + |
| 111 | +**Files modified:** |
| 112 | +- `src/SshManager.App/Views/Controls/LocalFileBrowserControl.xaml` |
| 113 | +- `src/SshManager.App/Views/Controls/RemoteFileBrowserControl.xaml` |
| 114 | +- `src/SshManager.App/ViewModels/FileItemViewModel.cs` |
| 115 | +- `src/SshManager.App/ViewModels/FileBrowserViewModelBase.cs` |
| 116 | +- `src/SshManager.App/ViewModels/IFileBrowserViewModel.cs` |
| 117 | +- `src/SshManager.App/Converters/SortIndicatorConverter.cs` (new) |
| 118 | + |
| 119 | +--- |
| 120 | + |
| 121 | +## Phase 4: General Polish ✅ |
| 122 | + |
| 123 | +### 4.1 Panel Divider |
| 124 | +- [x] Reduce border/divider weight between panels (already minimal) |
| 125 | +- [x] Consider draggable splitter for resizing panels (GridSplitter already exists) |
| 126 | +- [x] Add collapse button to hide one panel temporarily |
| 127 | + |
| 128 | +**Files modified:** |
| 129 | +- `src/SshManager.App/Views/Controls/SftpBrowserControl.xaml` |
| 130 | +- `src/SshManager.App/ViewModels/SftpBrowserViewModel.cs` |
| 131 | +- `src/SshManager.App/Converters/CollapsedWidthConverter.cs` (new) |
| 132 | + |
| 133 | +### 4.2 Drag & Drop Feedback |
| 134 | +- [x] Highlight valid drop zones when dragging |
| 135 | +- [x] Show transfer direction indicator (→ or ←) |
| 136 | +- [x] Ghost preview of dragged items |
| 137 | +- [x] Invalid drop zone feedback (red highlight or cursor) |
| 138 | + |
| 139 | +**Files modified:** |
| 140 | +- `src/SshManager.App/Behaviors/FileDragAdorner.cs` (new) |
| 141 | +- `src/SshManager.App/Views/Controls/FileBrowserControlBase.cs` |
| 142 | +- `src/SshManager.App/Views/Controls/LocalFileBrowserControl.xaml` |
| 143 | +- `src/SshManager.App/Views/Controls/RemoteFileBrowserControl.xaml` |
| 144 | + |
| 145 | +### 4.3 Transfer Progress Area |
| 146 | +- [x] Reserve space at bottom of dialog for transfers (already implemented) |
| 147 | +- [x] Show: |
| 148 | + - Current file being transferred |
| 149 | + - Progress bar with percentage |
| 150 | + - Transfer speed |
| 151 | + - Time remaining estimate |
| 152 | +- [x] Expandable to show transfer queue (already implemented) |
| 153 | +- [x] Minimize when no transfers active (already implemented) |
| 154 | + |
| 155 | +### 4.4 Keyboard Shortcuts |
| 156 | +- [x] Add keyboard shortcuts for common actions (already implemented) |
| 157 | +- [x] F5 = Refresh |
| 158 | +- [x] Ctrl+U = Upload |
| 159 | +- [x] Ctrl+D = Download |
| 160 | +- [x] Del = Delete |
| 161 | +- [x] F2 = Rename |
| 162 | +- [x] Show shortcuts in button tooltips |
| 163 | + |
| 164 | +**Files modified:** |
| 165 | +- `src/SshManager.App/Views/Controls/SftpBrowserControl.xaml` |
| 166 | +- `src/SshManager.App/Views/Controls/LocalFileBrowserControl.xaml` |
| 167 | +- `src/SshManager.App/Views/Controls/RemoteFileBrowserControl.xaml` |
| 168 | + |
| 169 | +--- |
| 170 | + |
| 171 | +## Phase 5: Optional Enhancements ✅ |
| 172 | + |
| 173 | +### 5.1 Context Menu |
| 174 | +- [x] Right-click context menu with common actions |
| 175 | +- [x] Match styling with WPF-UI menus |
| 176 | + |
| 177 | +**Files modified:** |
| 178 | +- `src/SshManager.App/Views/Controls/LocalFileBrowserControl.xaml` |
| 179 | +- `src/SshManager.App/Views/Controls/RemoteFileBrowserControl.xaml` |
| 180 | + |
| 181 | +### 5.2 Search/Filter |
| 182 | +- [x] Add filter box to quickly find files by name |
| 183 | +- [x] Real-time filtering as user types |
| 184 | + |
| 185 | +**Files modified:** |
| 186 | +- `src/SshManager.App/Views/Controls/LocalFileBrowserControl.xaml` |
| 187 | +- `src/SshManager.App/Views/Controls/RemoteFileBrowserControl.xaml` |
| 188 | +- `src/SshManager.App/ViewModels/FileBrowserViewModelBase.cs` |
| 189 | +- `src/SshManager.App/ViewModels/IFileBrowserViewModel.cs` |
| 190 | + |
| 191 | +### 5.3 Favorites/Bookmarks |
| 192 | +- [x] Allow bookmarking frequently accessed remote paths |
| 193 | +- [x] Quick access dropdown |
| 194 | + |
| 195 | +**Files modified:** |
| 196 | +- `src/SshManager.App/Views/Controls/RemoteFileBrowserControl.xaml` |
| 197 | +- `src/SshManager.App/ViewModels/RemoteFileBrowserViewModel.cs` |
| 198 | +- `src/SshManager.Core/Models/AppSettings.cs` |
| 199 | + |
| 200 | +### 5.4 Dual-Pane Sync |
| 201 | +- [x] Option to sync navigation between panels |
| 202 | +- [x] "Mirror navigation" toggle |
| 203 | + |
| 204 | +**Files modified:** |
| 205 | +- `src/SshManager.App/Views/Controls/SftpBrowserControl.xaml` |
| 206 | +- `src/SshManager.App/ViewModels/SftpBrowserViewModel.cs` |
| 207 | +- `src/SshManager.Core/Models/AppSettings.cs` |
| 208 | + |
| 209 | +--- |
| 210 | + |
| 211 | +## Implementation Notes |
| 212 | + |
| 213 | +### WPF-UI Components to Use |
| 214 | +- `ui:CardAction` - for grouped buttons |
| 215 | +- `ui:SymbolIcon` - for file type icons |
| 216 | +- `ui:Badge` - for transfer count indicator |
| 217 | +- `ui:InfoBadge` - for status indicators |
| 218 | +- `ui:TextBox` with icon - for filter/search |
| 219 | + |
| 220 | +### Color Tokens (from theme) |
| 221 | +- Hover: `ControlFillColorSecondary` |
| 222 | +- Selected: `AccentFillColorDefaultBrush` |
| 223 | +- Subtle text: `TextFillColorSecondaryBrush` |
| 224 | +- Borders: `ControlStrokeColorDefaultBrush` |
| 225 | + |
| 226 | +### Files Likely to Modify |
| 227 | +``` |
| 228 | +src/SshManager.App/Views/Dialogs/SftpBrowserDialog.xaml |
| 229 | +src/SshManager.App/Views/Dialogs/SftpBrowserDialog.xaml.cs |
| 230 | +src/SshManager.App/ViewModels/SftpBrowserViewModel.cs |
| 231 | +src/SshManager.App/Converters/ (new converters as needed) |
| 232 | +src/SshManager.App/Resources/ (icons if custom needed) |
| 233 | +``` |
| 234 | + |
| 235 | +--- |
| 236 | + |
| 237 | +## Success Criteria |
| 238 | + |
| 239 | +- [x] Toolbar feels organized and less cluttered |
| 240 | +- [x] Connection status is clear but not visually loud |
| 241 | +- [x] File lists are easy to scan and navigate |
| 242 | +- [x] Drag & drop provides clear visual feedback |
| 243 | +- [x] Transfer progress is visible without being intrusive |
| 244 | +- [x] Overall dialog feels modern and consistent with main app |
0 commit comments