1
1
from PyQt5 .QtWidgets import (
2
- QApplication , QWidget , QVBoxLayout , QHBoxLayout , QLabel , QLineEdit ,
2
+ QApplication , QWidget , QVBoxLayout , QHBoxLayout , QLabel , QLineEdit , QMessageBox ,
3
3
QPushButton , QTreeView , QTextEdit , QFileDialog , QFileSystemModel , QGroupBox , QTabWidget
4
4
)
5
- from PyQt5 .QtCore import QDir
5
+ from PyQt5 .QtCore import QDir , QTimer
6
6
from PyQt5 .QtGui import QIcon
7
7
import os
8
8
import json
@@ -20,7 +20,9 @@ def __init__(self):
20
20
21
21
self .folder_btn = QPushButton ("Select Folder" )
22
22
self .folder_btn .clicked .connect (self .select_folder )
23
+ self .folder_btn .setStyleSheet (default_button_style )
23
24
file_selection_layout .addWidget (self .folder_btn )
25
+
24
26
25
27
# Input for ignored directories
26
28
ignored_dirs_layout = QHBoxLayout ()
@@ -76,22 +78,27 @@ def __init__(self):
76
78
button_layout = QHBoxLayout ()
77
79
self .save_json_btn = QPushButton ("Save Texts to JSON" )
78
80
self .save_json_btn .clicked .connect (self .save_to_json )
81
+ self .save_json_btn .setStyleSheet (default_button_style )
79
82
button_layout .addWidget (self .save_json_btn )
80
83
81
84
self .load_json_btn = QPushButton ("Load Texts from JSON" )
82
85
self .load_json_btn .clicked .connect (self .load_from_json )
86
+ self .load_json_btn .setStyleSheet (default_button_style )
83
87
button_layout .addWidget (self .load_json_btn )
84
88
85
89
self .summarize_btn = QPushButton ("Summarize Files" )
86
90
self .summarize_btn .clicked .connect (self .summarize_files )
91
+ self .summarize_btn .setStyleSheet (default_button_style )
87
92
button_layout .addWidget (self .summarize_btn )
88
93
89
94
self .copy_btn = QPushButton ("Copy to Clipboard" )
90
95
self .copy_btn .clicked .connect (self .copy_to_clipboard )
96
+ self .copy_btn .setStyleSheet (default_button_style )
91
97
button_layout .addWidget (self .copy_btn )
92
98
93
99
self .close_btn = QPushButton ("Close Session" )
94
100
self .close_btn .clicked .connect (self .close_tab )
101
+ self .close_btn .setStyleSheet (default_button_style )
95
102
button_layout .addWidget (self .close_btn )
96
103
97
104
# Add button layout to main layout
@@ -112,17 +119,31 @@ def toggle_group_box(self, checked):
112
119
widget .setVisible (checked )
113
120
114
121
def select_folder (self ):
122
+ # Change button style to indicate active state
123
+ self .folder_btn .setStyleSheet (active_button_style )
124
+ # Revert to default style after 100 milliseconds
125
+ QTimer .singleShot (100 , lambda : self .folder_btn .setStyleSheet (default_button_style ))
126
+
115
127
directory = QFileDialog .getExistingDirectory (None , "Select a folder:" )
116
128
if directory :
117
129
self .file_system_model .setRootPath (directory )
118
130
self .tree_view .setRootIndex (self .file_system_model .index (directory ))
119
131
120
132
def summarize_files (self ):
133
+ # Change button style to indicate active state
134
+ self .summarize_btn .setStyleSheet (active_button_style )
135
+ # Revert to default style after 100 milliseconds
136
+ QTimer .singleShot (100 , lambda : self .summarize_btn .setStyleSheet (default_button_style ))
137
+
121
138
indexes = self .tree_view .selectionModel ().selectedRows ()
122
139
summarized_text = ""
123
140
ignored_dirs = [dir_name .strip () for dir_name in self .ignored_dirs_edit .text ().split ("," )]
124
141
125
142
root_path = self .file_system_model .filePath (self .tree_view .rootIndex ())
143
+ if not root_path or not os .path .exists (root_path ):
144
+ QMessageBox .information (self , "Information" , "Please select a folder before summarizing files." )
145
+ return
146
+
126
147
summarized_text += self .get_tree_structure (root_path , ignored_dirs ) + "\n \n "
127
148
128
149
for index in indexes :
@@ -158,34 +179,66 @@ def get_tree_structure(self, path, ignored_dirs, indent=0):
158
179
def copy_to_clipboard (self ):
159
180
clipboard = QApplication .clipboard ()
160
181
clipboard .setText (self .text_edit .toPlainText ())
182
+ # Change button style to indicate active state
183
+ self .copy_btn .setStyleSheet (active_button_style )
184
+
185
+ # Revert to default style after 100 milliseconds
186
+ QTimer .singleShot (100 , lambda : self .copy_btn .setStyleSheet (default_button_style ))
161
187
162
188
def update_char_count (self ):
163
189
char_count = len (self .text_edit .toPlainText ())
164
190
self .char_count_label .setText (f"Character Count: { char_count } " )
165
191
166
192
def close_tab (self ):
193
+ # Change button style to indicate active state
194
+ self .close_btn .setStyleSheet (active_button_style )
195
+ # Revert to default style after 100 milliseconds
196
+ QTimer .singleShot (100 , lambda : self .close_btn .setStyleSheet (default_button_style ))
197
+
167
198
index = tab_widget .indexOf (self )
168
199
tab_widget .removeTab (index )
169
200
170
201
def save_to_json (self ):
202
+ # Change button style to indicate active state
203
+ self .save_json_btn .setStyleSheet (active_button_style )
204
+
205
+ # Revert to default style after 100 milliseconds
206
+ QTimer .singleShot (100 , lambda : self .save_json_btn .setStyleSheet (default_button_style ))
171
207
data = {
172
208
"start_text" : self .start_text_edit .toPlainText (),
173
209
"end_text" : self .end_text_edit .toPlainText ()
174
210
}
175
211
filename , _ = QFileDialog .getSaveFileName (self , "Save File" , "" , "JSON Files (*.json)" )
176
212
if filename :
177
- with open (filename , 'w' ) as file :
178
- json .dump (data , file , indent = 4 )
213
+ try :
214
+ with open (filename , 'w' ) as file :
215
+ json .dump (data , file , indent = 4 )
216
+ except Exception as e :
217
+ QMessageBox .critical (self , "Error" , f"An error occurred: { str (e )} " )
179
218
180
219
def load_from_json (self ):
220
+ # Change button style to indicate active state
221
+ self .load_json_btn .setStyleSheet (active_button_style )
222
+ # Revert to default style after 100 milliseconds
223
+ QTimer .singleShot (100 , lambda : self .load_json_btn .setStyleSheet (default_button_style ))
224
+
181
225
filename , _ = QFileDialog .getOpenFileName (self , "Open File" , "" , "JSON Files (*.json)" )
182
226
if filename :
183
- with open (filename , 'r' ) as file :
184
- data = json .load (file )
185
- self .start_text_edit .setText (data .get ("start_text" , "" ))
186
- self .end_text_edit .setText (data .get ("end_text" , "" ))
227
+ try :
228
+ with open (filename , 'r' ) as file :
229
+ data = json .load (file )
230
+ self .start_text_edit .setText (data .get ("start_text" , "" ))
231
+ self .end_text_edit .setText (data .get ("end_text" , "" ))
232
+ except Exception as e :
233
+ QMessageBox .critical (self , "Error" , f"An error occurred: { str (e )} " )
234
+
187
235
188
236
def create_new_tab ():
237
+ # Change button style to indicate active state
238
+ new_tab_button .setStyleSheet (active_button_style )
239
+ # Revert to default style after 100 milliseconds
240
+ QTimer .singleShot (100 , lambda : new_tab_button .setStyleSheet (default_button_style ))
241
+
189
242
global tab_widget
190
243
new_tab = CodingHelperTab ()
191
244
tab_widget .addTab (new_tab , f"Session { tab_widget .count () + 1 } " )
@@ -232,6 +285,25 @@ def create_new_tab():
232
285
}
233
286
""" )
234
287
288
+ active_button_style = """
289
+ QPushButton {
290
+ background-color: #0090FF; /* Blue background */
291
+ color: white; /* White text */
292
+ }
293
+ """
294
+
295
+ default_button_style = """
296
+ QPushButton {
297
+ background-color: #f0f0f0; /* Default background */
298
+ border: 1px solid #dcdcdc; /* Default border */
299
+ padding: 5px;
300
+ border-radius: 2px;
301
+ }
302
+ QPushButton:hover {
303
+ background-color: #e8e8e8; /* Hover background */
304
+ }
305
+ """
306
+
235
307
# Initialize with one tab
236
308
create_new_tab ()
237
309
0 commit comments