1919 QHBoxLayout ,
2020 QLabel ,
2121 QLineEdit ,
22+ QMessageBox ,
2223 QPlainTextEdit ,
2324 QPushButton ,
2425 QRadioButton ,
@@ -117,6 +118,7 @@ def __init__(self, parent=None) -> None:
117118
118119 # === Cookies Tab ===
119120 cookies_tab = QWidget ()
121+
120122 cookies_layout = QVBoxLayout (cookies_tab )
121123
122124 # Help text
@@ -130,15 +132,15 @@ def __init__(self, parent=None) -> None:
130132 cookie_source_layout = QVBoxLayout (cookie_source_group )
131133
132134 # Radio buttons for cookie source
135+ self .cookie_browser_radio = QRadioButton (_ ('cookies.extract_from_browser' ) + f" ({ _ ('cookies.recommended' )} )" )
136+ self .cookie_browser_radio .setChecked (True )
137+ self .cookie_browser_radio .toggled .connect (self .on_cookie_source_changed )
138+ cookie_source_layout .addWidget (self .cookie_browser_radio )
139+
133140 self .cookie_file_radio = QRadioButton (_ ('cookies.use_cookie_file' ))
134- self .cookie_file_radio .setChecked (True )
135141 self .cookie_file_radio .toggled .connect (self .on_cookie_source_changed )
136142 cookie_source_layout .addWidget (self .cookie_file_radio )
137143
138- self .cookie_browser_radio = QRadioButton (_ ('cookies.extract_from_browser' ))
139- self .cookie_browser_radio .toggled .connect (self .on_cookie_source_changed )
140- cookie_source_layout .addWidget (self .cookie_browser_radio )
141-
142144 cookies_layout .addWidget (cookie_source_group )
143145
144146 # Cookie file section
@@ -191,13 +193,42 @@ def __init__(self, parent=None) -> None:
191193
192194 cookies_layout .addWidget (self .cookie_browser_group )
193195
194- # Initially hide browser group
195- self .cookie_browser_group .setVisible (False )
196+ # Initially show browser group (recommended default) and hide file group
197+ self .cookie_file_group .setVisible (False )
198+ self .cookie_browser_group .setVisible (True )
196199
197- # Status indicator for cookies
198- self .cookie_status = QLabel ("" )
199- self .cookie_status .setStyleSheet ("color: #999999; font-style: italic;" )
200- cookies_layout .addWidget (self .cookie_status )
200+ # Apply button and status indicator
201+ apply_layout = QHBoxLayout ()
202+
203+ # Status indicator for active cookies
204+ self .cookies_active_status = QLabel ()
205+ self ._update_cookies_active_status ()
206+ apply_layout .addWidget (self .cookies_active_status )
207+
208+ apply_layout .addStretch ()
209+
210+ # Apply button
211+ self .apply_cookies_btn = QPushButton (_ ('buttons.apply' ))
212+ self .apply_cookies_btn .clicked .connect (self .apply_cookies )
213+ self .apply_cookies_btn .setStyleSheet (
214+ """
215+ QPushButton {
216+ padding: 8px 20px;
217+ background-color: #c90000;
218+ border: none;
219+ border-radius: 4px;
220+ color: white;
221+ font-weight: bold;
222+ min-width: 100px;
223+ }
224+ QPushButton:hover {
225+ background-color: #a50000;
226+ }
227+ """
228+ )
229+ apply_layout .addWidget (self .apply_cookies_btn )
230+
231+ cookies_layout .addLayout (apply_layout )
201232
202233 cookies_layout .addStretch ()
203234
@@ -622,17 +653,24 @@ def _initialize_cookie_settings(self) -> None:
622653
623654 # Set profile if any
624655 self .profile_input .setText (profile )
625-
626- self .cookie_status .setText (f"Browser cookies active: { self ._parent .browser_cookies_option } " )
627- self .cookie_status .setStyleSheet ("color: #00cc00; font-style: italic;" )
628656 elif hasattr (self ._parent , "cookie_file_path" ) and self ._parent .cookie_file_path :
629- # File cookies are active - ensure file radio is selected and update status
657+ # File cookies are active - ensure file radio is selected
630658 self .cookie_file_radio .setChecked (True )
631- self .cookie_status .setText (f"Cookie file active: { self ._parent .cookie_file_path .name } " )
632- self .cookie_status .setStyleSheet ("color: #00cc00; font-style: italic;" )
633659 else :
634- # No cookies configured - ensure file radio is selected by default
635- self .cookie_file_radio .setChecked (True )
660+ # No cookies configured - browser extraction is the recommended default
661+ self .cookie_browser_radio .setChecked (True )
662+
663+ def _update_cookies_active_status (self ) -> None :
664+ """Update the status indicator showing if cookies are currently active"""
665+ if hasattr (self ._parent , "browser_cookies_option" ) and self ._parent .browser_cookies_option :
666+ self .cookies_active_status .setText (f"✓ Active: Browser cookies ({ self ._parent .browser_cookies_option } )" )
667+ self .cookies_active_status .setStyleSheet ("color: #00cc00; font-weight: bold;" )
668+ elif hasattr (self ._parent , "cookie_file_path" ) and self ._parent .cookie_file_path :
669+ self .cookies_active_status .setText (f"✓ Active: Cookie file ({ self ._parent .cookie_file_path .name } )" )
670+ self .cookies_active_status .setStyleSheet ("color: #00cc00; font-weight: bold;" )
671+ else :
672+ self .cookies_active_status .setText ("○ No cookies active" )
673+ self .cookies_active_status .setStyleSheet ("color: #888888; font-style: italic;" )
636674
637675 def _initialize_proxy_settings (self ) -> None :
638676 """Initialize the dialog with current proxy settings from config"""
@@ -655,23 +693,56 @@ def on_cookie_source_changed(self) -> None:
655693 if self .cookie_file_radio .isChecked ():
656694 self .cookie_file_group .setVisible (True )
657695 self .cookie_browser_group .setVisible (False )
658- self .cookie_status .setText ("" )
659696 else :
660697 self .cookie_file_group .setVisible (False )
661698 self .cookie_browser_group .setVisible (True )
662- self .cookie_status .setText (_ ("cookies.browser_extract_message" ))
663- self .cookie_status .setStyleSheet ("color: #ffaa00; font-style: italic;" )
699+
700+ def apply_cookies (self ) -> None :
701+ """Apply cookie settings when user clicks Apply button"""
702+ # Handle cookies
703+ cookie_path = self .get_cookie_file_path ()
704+ browser_cookies = self .get_browser_cookies_option ()
705+
706+ # Clear both first to avoid conflicts
707+ self ._parent .cookie_file_path = None
708+ self ._parent .browser_cookies_option = None
709+
710+ if cookie_path :
711+ self ._parent .cookie_file_path = cookie_path
712+ logger .info (f"Applied cookie file: { self ._parent .cookie_file_path } " )
713+ QMessageBox .information (
714+ self ,
715+ _ ("cookies.file_selected_title" ),
716+ _ ("cookies.file_applied_message" , path = str (cookie_path )),
717+ )
718+ elif browser_cookies :
719+ self ._parent .browser_cookies_option = browser_cookies
720+ logger .info (f"Applied browser cookies: { self ._parent .browser_cookies_option } " )
721+ QMessageBox .information (
722+ self ,
723+ _ ("cookies.browser_selected_title" ),
724+ _ ("cookies.browser_applied_message" , browser = browser_cookies ),
725+ )
726+ else :
727+ # Clear cookies
728+ logger .info ("Cookies cleared" )
729+ QMessageBox .information (
730+ self ,
731+ _ ("cookies.cleared_title" ),
732+ _ ("cookies.cleared_message" ),
733+ )
734+
735+ # Update the status indicator
736+ self ._update_cookies_active_status ()
664737
665738 def browse_cookie_file (self ) -> None :
666739 # Open file dialog to select cookie file
667- selected_files , _ = QFileDialog .getOpenFileName (self , _ ("cookies.select_file_title" ), "" , _ ("cookies.file_filter" ))
740+ selected_files , _filter = QFileDialog .getOpenFileName (self , _ ("cookies.select_file_title" ), "" , _ ("cookies.file_filter" ))
668741
669742 if selected_files :
670743 # Ensure we have a valid full path
671744 cookie_path = Path (selected_files ).resolve ()
672745 self .cookie_path_input .setText (str (cookie_path ))
673- self .cookie_status .setText (_ ("cookies.file_selected_message" ))
674- self .cookie_status .setStyleSheet ("color: #00cc00; font-style: italic;" )
675746
676747 def get_cookie_file_path (self ) -> Path | None :
677748 # Return the selected cookie file path if it's not empty and using file mode
@@ -701,7 +772,7 @@ def get_browser_cookies_option(self) -> str | None:
701772 def is_using_browser_cookies (self ) -> bool :
702773 """Returns True if browser cookies mode is selected"""
703774 return self .cookie_browser_radio .isChecked ()
704-
775+
705776 def get_proxy_url (self ) -> str | None :
706777 """Returns the main proxy URL if specified"""
707778 proxy_url = self .proxy_url_input .text ().strip ()
0 commit comments