HTTPie was listed as a dependency but the application actually uses libsoup3 from GNOME Platform. Updated README to reflect correct dependencies and removed installation instructions for HTTPie. Also corrected code comments to reference libsoup3 instead of HTTPie.
- Replace manual GtkBox layout with AdwToolbarView
- Add AdwHeaderBar and AdwTabBar as separate top bars
- Remove all custom CSS for header bar height matching
- AdwToolbarView automatically ensures consistent bar styling
This follows the proper libadwaita pattern used by GNOME Web.
- Add "sidebar-header" and "main-header" style classes
- Target each header bar specifically in CSS
- Make tab bar ultra-compact to fit within header height
- Reduce tab padding and remove all internal margins
- Remove invalid max-height CSS property (GTK doesn't support it)
- Fix loading from history: update widget instead of calling removed method
- Update tab page title when loading from history
- Revert show-title=False on main header (was hiding tabs)
- Use CSS to force both header bars to exact same height (46px)
- Remove vertical padding from header bars
- Keep tab bar compact to fit within fixed height
1. Fixed infinite loop when closing last tab:
- Return False instead of True when page already removed (prevents double-processing)
- Remove from tracking BEFORE calling close_page_finish to prevent re-trigger
- Properly schedule new tab creation only once
2. Fixed modified flag not clearing after save:
- Update widget.original_request in _mark_tab_as_saved
- Update widget.modified = False
- Manually call _on_tab_modified_changed to clear indicator
- Update tab page title when saving
3. Fixed header bar height and left spacing:
- Added CSS to reduce headerbar min-height to 38px
- Set headerbar padding-left to 0px to eliminate left gap
- Made tabs more compact (min-height: 26px, reduced padding)
- Reduced tabbar padding and margins
All critical issues from testing resolved!
1. Modified indicator (*) now shows:
- Added GObject signal 'modified-changed' to RequestTabWidget
- Connect to signal in window.py to update tab page indicator
- Indicator shows dot-symbolic icon when modified
2. History panel now visible and populated:
- Restored history panel in main-window.ui with vertical paned layout
- Added _load_history() call back to __init__
- History entries now display in bottom panel
3. Saving requests now works:
- Fixed on_save_request_clicked to get request from widget.get_request()
- Removed dependency on obsolete _build_request_from_ui method
4. Loading saved requests fixed:
- Updated _on_load_request to properly update widget and tab page
- Correctly sets widget.original_request and widget.modified
- Updates tab page title when loading into empty tab
- Properly handles copy vs. linked request logic
All issues from user testing are now resolved!
- Create RequestTabWidget class with complete per-tab UI
- Simplify main-window.ui to just AdwTabBar and AdwTabView
- Set autohide=False to always show tabs
- Add request_tab_widget.py to meson.build
Next step: Refactor window.py to create RequestTabWidget instances for each tab.
This is a work-in-progress implementation of AdwTabBar/AdwTabView.
Current issues:
- Tab bar height is too large
- Large gap on left side of header
- Architecture needs refactoring: AdwTabView should contain per-tab UI widgets
Next step: Properly refactor so each tab has its own complete UI widget tree.
Remove application title from main header bar and wrap tabs in scrollable container. This prevents window resizing when many tabs are open and follows modern GNOME app patterns.
Document tabs (header bar):
- Add rounded corners with subtle backgrounds
- Highlight active tabs with accent color and bottom border
- Improve hover states with smooth 200ms transitions
- Enhance close button visibility and hover effects
- Reduce spacing for more compact appearance
- Increase tab name truncation limit to 25 chars
Stack switchers (Headers/Body tabs):
- Add pill-style rounded buttons (6px radius)
- Style active tabs with accent colors and bold text
- Add smooth crossfade transitions (150ms)
- Improve spacing with 8px top/bottom margins
All styling uses GNOME color tokens for consistent theming across
light and dark modes.
- Add PreferencesDialog with settings for TLS verification and request timeout
- Update HttpClient to respect TLS verification setting
- Add GSettings schema keys for force-tls-verification and request-timeout
- Wire up preferences action to show dialog
- Settings changes apply immediately to HTTP session
Organize shortcuts into groups:
- Tabs: New Tab (Ctrl+T), Close Tab (Ctrl+W)
- Requests: Save Request (Ctrl+S)
- General: Show Shortcuts (Ctrl+?), Quit (Ctrl+Q)
Replace HTTPie subprocess calls with native libsoup3 async API. This
eliminates external dependencies and uses GNOME-standard async patterns.
Changes:
- Rewrite http_client.py to use libsoup3 Session and Message APIs
- Replace threading with GLib async callbacks in window.py
- Remove HTTPie dependency from Flatpak manifest
- Update documentation to reflect libsoup3 usage
Benefits:
- No external dependencies (HTTPie removed)
- Native GLib async integration (no threading complexity)
- Better performance with connection pooling and HTTP/2 support
- Cleaner codebase following GNOME development patterns
Use --ignore-installed to ensure all dependencies (including Pygments)
are installed to the Flatpak prefix, not relying on SDK packages that
won't be available at runtime.
- Update history_manager to use GLib.get_user_config_dir()
- Update project_manager to use GLib.get_user_data_dir()
- Remove old filesystem permission from Flatpak manifest
- Fix Flatpak manifest: runtime version 49→47, correct git source URL
Data now stored in:
- Flatpak: ~/.var/app/cz.vesp.roster/{config,data}/cz.vesp.roster/
- Native: ~/.{config,local/share}/cz.vesp.roster/
Duplicate Name Detection:
- Warn when saving request with existing name in same project
- Show overwrite confirmation dialog with destructive styling
- Update existing request on overwrite (preserves ID, updates timestamp)
- Request names are unique within projects (but can duplicate across projects)
Save Request Improvements:
- Clear modified flag (•) when request is saved or overwritten
- Pre-fill save dialog with original request name and project
- Pre-fill save dialog with tab name for copy tabs
- Auto-select text in name field for easy editing
Smart Tab Loading:
- Switch to existing tab when loading unmodified saved request
- Create new tab only when needed (modified or doesn't exist)
- Avoid duplicate tabs for same request
- Show toast notification when switching to existing tab
Copy Tab Management:
- Create numbered copies when loading modified request again
- Naming: "ReqA (copy)", "ReqA (copy 2)", "ReqA (copy 3)", etc.
- Copy tabs are NOT linked to saved request (no saved_request_id)
- Copy tabs marked as unsaved (•) to encourage saving with new name
- Unique copy names prevent conflicts
Tab Response Persistence:
- Restore response when switching between tabs
- Each tab maintains independent response state
- Clear response area when switching to tab without response
Project Manager:
- Add find_request_by_name() for duplicate detection
- Add update_request() for overwriting existing requests
- Update request modified_at timestamp on save
Files Modified:
- src/project_manager.py: Duplicate detection and update methods
- src/window.py: Smart tab management and copy handling
Previously, changes to HTTP headers (adding, editing, or removing headers)
were not being tracked, causing tabs to not show the modified indicator (•)
when only header values changed.
Changes:
- Add 'changed' signal to HeaderRow widget that emits when key or value entries change
- Connect HeaderRow 'changed' signal to window's _on_request_changed handler
- Real-time tab modification tracking now includes all header edits
This completes the comprehensive change tracking system for tabs:
- URL changes ✓
- Method changes ✓
- Body changes ✓
- Syntax changes ✓
- Header changes ✓ (now fixed)
Change Tracking:
- Track modifications to URL, method, body, syntax, and headers
- Show • indicator on modified tab labels
- Real-time update of tab state on any change
- Each tab independently tracks its modification state
Unsaved Change Warnings:
- Warn when closing tabs with unsaved changes
- Warn when closing application with any unsaved tabs
- Destructive action styling for close confirmations
- Smart messages: single tab vs multiple tabs
Smart Tab Loading:
- Detect empty "New Request" tabs (no URL, body, or headers)
- Replace empty tabs when loading from sidebar/history
- Create new tab when current tab has changes
- Seamless workflow without unnecessary tabs
Application Close Protection:
- Prevent accidental data loss on app close
- Check all tabs for unsaved changes
- Show confirmation dialog before closing
- Works with all close methods (X, Alt+F4, Quit)
Bug Fixes:
- Fix signal handler to accept variable arguments
- Proper handling of notify::selected signals