107 Commits

Author SHA1 Message Date
c5ce788605 Add debug output for header indicators 2025-12-30 14:12:52 +01:00
983227affc Fix visual indicators: add tooltips to headers, colored background to body 2025-12-30 14:07:13 +01:00
710997757e Add visual indicators for undefined variables 2025-12-30 13:10:26 +01:00
89f50d1304 Implement environment variable substitution in requests 2025-12-30 12:54:26 +01:00
dfe2a9a360 Add environment management for projects with variable support 2025-12-30 12:37:13 +01:00
5fa104db69 Remove incorrect HTTPie dependency from documentation
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.
2025-12-26 02:09:01 +01:00
e8f8efbd09 Add history deletion features - clear all in preferences and delete individual items 2025-12-24 20:21:47 +01:00
415907cfb0 Add copy buttons for request and response content in history items 2025-12-24 13:49:55 +01:00
49f94aaa88 Fix template errors - remove invalid cursor-name property and set cursor programmatically, remove debug output 2025-12-24 13:40:56 +01:00
9cbbb93384 Replace expander buttons with clickable separator boxes 2025-12-24 13:35:47 +01:00
95175cb01d Fix GTK assertion error - set min/max heights in correct order 2025-12-24 13:15:39 +01:00
0c139d2a3b Fix history expander button functionality - set both min and max content heights 2025-12-24 13:13:04 +01:00
bfe3463b52 Refactor to use AdwToolbarView like Epiphany
- 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.
2025-12-24 03:55:13 +01:00
7cf03a2f8b Add style classes to distinguish header bars
- 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
2025-12-24 03:48:50 +01:00
5334902d7a Fix CSS error and history loading
- 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
2025-12-24 03:45:51 +01:00
74250c36b7 Fix header bar height matching properly
- 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
2025-12-24 03:40:45 +01:00
91b4c68b49 Fix header bar heights to match exactly
Add show-title=False to main header bar to match sidebar
header configuration and ensure both have the same height.
2025-12-24 03:35:48 +01:00
9c17f452bf Fix critical bugs from second round of testing
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!
2025-12-24 03:07:11 +01:00
ad0e1886cc Fix all reported issues from testing
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!
2025-12-24 02:20:55 +01:00
89d43b66b5 Complete window.py cleanup - remove 400 lines of obsolete code
Removed obsolete UI methods now handled by RequestTabWidget:
- _setup_method_dropdown, _setup_request_tabs, _setup_response_tabs
- _build_request_from_ui, _load_request_to_ui
- _display_response, _display_error
- _extract_content_type, _get_language_from_content_type, _format_response_body
- on_add_header_clicked, _add_header_row, _on_header_remove
- _setup_sourceview_theme, _setup_request_body_theme
- _update_tab_indicator (now handled internally by widgets)

Added new HTTP handling:
- _on_send_clicked now works with RequestTabWidget
- Properly handles request/response through widget interface
- Updates history after requests complete

Result: 1237 lines → 841 lines (-396 lines, -32%)
App builds and runs successfully!
2025-12-24 02:05:37 +01:00
a09060e3d4 WIP: Refactoring window.py for per-tab widgets 2025-12-24 01:56:40 +01:00
99faf14983 Add RequestTabWidget class and simplify main UI
- 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.
2025-12-24 01:51:15 +01:00
d912f3479a WIP: Initial AdwTabBar/AdwTabView implementation
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.
2025-12-24 01:47:45 +01:00
0a5c1c59af Maximize header space and enable tab scrolling
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.
2025-12-23 12:36:59 +01:00
2ff4a39e04 Polish tab UI styling with enhanced visual design
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.
2025-12-23 10:27:40 +01:00
2545cdd88d Add preferences dialog with TLS and timeout settings
- 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
2025-12-23 10:17:22 +01:00
66719a5d0c Add explicit accelerators to shortcuts dialog
Replace action-name with explicit accelerator properties so the
keyboard shortcuts are displayed correctly in the dialog.
2025-12-22 23:53:05 +01:00
d2682154c5 Add shortcuts action to show keyboard shortcuts dialog
Create app.shortcuts action with Ctrl+? shortcut that loads and
displays the shortcuts window from GResources.
2025-12-22 23:50:41 +01:00
146ca19f18 Simplify shortcuts dialog - remove groups
Use simple flat list of shortcuts without grouping.
2025-12-22 23:48:55 +01:00
977b78f5fe Fix shortcuts dialog using correct GTK types
Change from AdwShortcuts* to GtkShortcuts* widgets.
Libadwaita doesn't provide shortcuts widgets, these are from GTK.
2025-12-22 23:46:53 +01:00
c4480fc161 Update keyboard shortcuts dialog to current state
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)
2025-12-22 23:40:43 +01:00
b49d5ab7fd Migrate from HTTPie to libsoup3 for HTTP requests
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
2025-12-22 23:34:05 +01:00
7cc3026875 Update runtime version to 49 2025-12-22 11:20:58 +01:00
405bd5f684 Fix HTTPie pygments dependency in Flatpak
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.
2025-12-22 11:17:22 +01:00
6fde053ee4 Use XDG/Flatpak standard directories for data storage
- 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/
2025-12-22 11:13:45 +01:00
a4b6966bc3 Expand headers area to show multiple rows
The headers scrolled window now fills available vertical space, allowing users to view and edit multiple headers simultaneously without scrolling.
2025-12-22 02:27:38 +01:00
6f65baa37f Add Ctrl+S keyboard shortcut for saving requests 2025-12-22 02:12:01 +01:00
97751df18a Add smart tab management and duplicate request handling
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
2025-12-22 02:03:35 +01:00
47225cf254 Add header change tracking to tab modification detection
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)
2025-12-22 00:49:54 +01:00
c3430058b9 Remove unnecessary warning dialog when loading from history. 2025-12-21 00:23:51 +01:00
094f87dbb9 FIX: Loading requests from history doesn't immediately mark the tab as modified 2025-12-21 00:18:54 +01:00
f70bf4f36d Add unsaved change tracking and smart tab loading
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
2025-12-21 00:08:29 +01:00
040f2012d7 Add close tab buttons 2025-12-20 23:43:51 +01:00
df30ad6388 Add Tabbed interface
- Add New Request Button
   - Implement Tab Management System
   - Opening saved requests from sidebar creates new tabs
   - Response Tracking
2025-12-20 18:56:11 +01:00
c76d574832 Add syntax highlighting and formatting for request/response bodies
- Add automatic JSON and XML formatting for response bodies
- Replace TextView with GtkSourceView for syntax highlighting
- Add syntax selector dropdown (RAW/JSON/XML) for request body
- Use Source Code Pro font (12pt) for better readability
- Integrate with GNOME theme (Adwaita light/dark)
- Add line numbers and current line highlighting
- Persist syntax selection when saving/loading requests
- Maintain backward compatibility with existing saved requests
2025-12-20 18:17:22 +01:00
9806333aa6 Add response body color highlighting 2025-12-20 17:52:59 +01:00
fed5a828f1 Add independent resizable sidebar panel with separate header bar
Restructure the UI to use GtkPaned instead of nested panes, giving the sidebar its own independent header bar aligned horizontally with the main content header. The sidebar is now clearly resizable with a draggable divider and has window control buttons disabled to avoid duplicate close buttons.
2025-12-20 02:39:52 +01:00
e758793423 Remove arrow icons from project folders in sidebar 2025-12-20 01:35:20 +01:00
0d2a70f425 Update project icons and fix icon picker selection
Replace several icon names with available alternatives and fix icon selection by handling button clicks directly instead of flowbox activation.
2025-12-18 21:24:17 +01:00
871c3cd90b Replace collapsible history panel with resizable vertical pane 2025-12-18 16:58:43 +01:00