11import os
22import sys
3- from PyQt5 .QtWidgets import QApplication , QMainWindow , QAction , QMenu , QMenuBar , QWidget , QLineEdit , QListWidget , QLabel , QMessageBox ,QVBoxLayout
4- from PyQt5 .QtGui import QIcon , QPalette , QColor
3+ import shutil
4+ from PyQt5 .QtWidgets import (QApplication , QMainWindow , QAction , QMenu , QMenuBar , QWidget ,
5+ QLineEdit , QListWidget , QLabel , QMessageBox ,
6+ QFileDialog , QInputDialog , QVBoxLayout )
7+ from PyQt5 .QtGui import QIcon , QPalette , QColor
58from PyQt5 .QtCore import Qt
69
710class DataFlow (QMainWindow ):
811
912 def __init__ (self ):
1013 super ().__init__ ()
1114
12- self .set_dark_theme ()
13-
14- self .setWindowIcon (QIcon ('icon.png' ))
1515 self .setWindowTitle ("DataFlow File Manager" )
16+ self .setWindowIcon (QIcon ('icon.png' ))
1617 self .setGeometry (100 , 100 , 800 , 600 )
1718
18- self .central_widget = QWidget (self )
19- # u can add custom background image
20- # self.central_widget.setStyleSheet("background-image: url(./images/bg.jpg);")
19+ self .central_widget = QWidget ()
2120 self .setCentralWidget (self .central_widget )
2221
2322 self .current_directory = os .getcwd ()
2423
2524 self .dir_label = QLabel (self .current_directory )
26- self .dir_label .setStyleSheet ("color: white ;" )
25+ self .dir_label .setStyleSheet ("color: black ;" )
2726
2827 self .list_widget = QListWidget ()
29- self .list_widget .setStyleSheet ("QListView {background: #292929; border: none; color: white ;}" )
28+ self .list_widget .setStyleSheet ("QListView {background: #333; color: #fff ;}" )
3029
3130 self .path_input = QLineEdit ()
3231 self .path_input .setPlaceholderText ("Enter path" )
@@ -40,52 +39,30 @@ def __init__(self):
4039 self .central_widget .setLayout (layout )
4140
4241 # Menu actions
43- self .move_action = QAction ("Move" , self )
42+ self .move_action = QAction ("Move" , self )
43+ self .move_action .triggered .connect (self .move_item )
44+
4445 self .copy_action = QAction ("Copy" , self )
46+ self .copy_action .triggered .connect (self .copy_item )
47+
4548 self .delete_action = QAction ("Delete" , self )
49+ self .delete_action .triggered .connect (self .delete_item )
50+
4651 self .rename_action = QAction ("Rename" , self )
47-
48- self .sort_name_action = QAction ("By Name" , self )
49- self .sort_time_action = QAction ("By Time" , self )
50-
51- # Sort menu
52- self .sort_menu = QMenu ("Sort" , self )
53- self .sort_menu .addAction (self .sort_name_action )
54- self .sort_menu .addAction (self .sort_time_action )
52+ self .rename_action .triggered .connect (self .rename_item )
5553
5654 self .sort_action = QAction ("Sort" , self )
57- self .sort_action .setMenu (self .sort_menu )
58-
59- # Menu bar
60- menu_bar = QMenuBar ()
61- menu_bar .addAction (self .move_action )
62- menu_bar .addAction (self .copy_action )
63- menu_bar .addAction (self .delete_action )
64- menu_bar .addAction (self .rename_action )
65- menu_bar .addAction (self .sort_action )
66- self .setMenuBar (menu_bar )
67-
68- # Connections
69- self .sort_name_action .triggered .connect (self .sort_by_name )
70- self .sort_time_action .triggered .connect (self .sort_by_time )
55+ self .sort_action .triggered .connect (self .sort_dialog )
7156
72- self .refresh_directory ()
73-
74- # Reself.sort_action = QAction("Sort", self)
75- self .sort_action .setMenu (self .sort_menu )
76-
7757 # Menu bar
7858 menu_bar = QMenuBar ()
7959 menu_bar .addAction (self .move_action )
80- menu_bar .addAction (self .copy_action )
81- menu_bar .addAction (self .delete_action )
60+ menu_bar .addAction (self .copy_action )
61+ menu_bar .addAction (self .delete_action )
8262 menu_bar .addAction (self .rename_action )
8363 menu_bar .addAction (self .sort_action )
64+
8465 self .setMenuBar (menu_bar )
85-
86- # Connections
87- self .sort_name_action .triggered .connect (self .sort_by_name )
88- self .sort_time_action .triggered .connect (self .sort_by_time )
8966
9067 self .refresh_directory ()
9168
@@ -98,31 +75,57 @@ def open_directory(self):
9875 path = self .path_input .text ()
9976 if os .path .isdir (path ):
10077 self .current_directory = path
101- self .dir_label .setText ("Current Directory: " + self .current_directory )
78+ self .dir_label .setText (self .current_directory )
10279 self .refresh_directory ()
10380 else :
10481 QMessageBox .warning (self , "Error" , "Invalid directory" )
105-
106- def sort_by_name (self ):
107- self .list_widget .sortItems (Qt .AscendingOrder )
10882
109- def sort_by_time (self ):
110- items = [(os .path .join (self .current_directory , i .text ()), i ) for i in self .list_widget .findItems ('' , Qt .MatchContains )]
111- items .sort (key = lambda x : os .path .getmtime (x [0 ]))
112- self .list_widget .clear ()
113- for item in items :
114- self .list_widget .addItem (item [1 ])
115-
116- def set_dark_theme (self ):
117- dark_palette = QPalette ()
118- dark_palette .setColor (QPalette .Window , QColor (53 , 53 , 53 ))
119- dark_palette .setColor (QPalette .WindowText , Qt .white )
120- dark_palette .setColor (QPalette .Base , QColor (25 , 25 , 25 ))
121- dark_palette .setColor (QPalette .AlternateBase , QColor (53 , 53 , 53 ))
122- QApplication .setPalette (dark_palette )
123-
83+ def move_item (self ):
84+ selected = self .list_widget .selectedItems ()[0 ]
85+ dest_dir = QFileDialog .getExistingDirectory (self , "Select Destination Folder" )
86+ if dest_dir :
87+ shutil .move (os .path .join (self .current_directory , selected .text ()),
88+ os .path .join (dest_dir , selected .text ()))
89+ self .refresh_directory ()
90+
91+ def copy_item (self ):
92+ selected = self .list_widget .selectedItems ()[0 ]
93+ dest_dir = QFileDialog .getExistingDirectory (self , "Select Destination Folder" )
94+ if dest_dir :
95+ shutil .copy (os .path .join (self .current_directory , selected .text ()),
96+ os .path .join (dest_dir , selected .text ()))
97+ self .refresh_directory ()
98+
99+ def delete_item (self ):
100+ selected = self .list_widget .selectedItems ()[0 ]
101+ reply = QMessageBox .question (self , "Confirm Deletion" ,
102+ "Are you sure you want to delete this item?" ,
103+ QMessageBox .Yes , QMessageBox .No )
104+
105+ if reply == QMessageBox .Yes :
106+ os .remove (os .path .join (self .current_directory , selected .text ()))
107+ self .refresh_directory ()
108+
109+ def rename_item (self ):
110+ selected = self .list_widget .selectedItems ()[0 ]
111+ new_name , ok = QInputDialog .getText (self , "Rename" , "New Name:" )
112+ if ok :
113+ os .rename (os .path .join (self .current_directory , selected .text ()),
114+ os .path .join (self .current_directory , new_name ))
115+ self .refresh_directory ()
116+
117+ def sort_dialog (self ):
118+ items = [self .list_widget .item (i ).text () for i in range (self .list_widget .count ())]
119+ sort_type , ok = QInputDialog .getItem (self , "Sort" , "Sort by:" , ["Name" , "Time" ], 0 , False )
120+ if ok :
121+ if sort_type == "Name" :
122+ items .sort ()
123+ elif sort_type == "Time" :
124+ items .sort (key = lambda x : os .path .getmtime (os .path .join (self .current_directory , x )))
125+ self .list_widget .clear ()
126+ self .list_widget .addItems (items )
124127if __name__ == "__main__" :
125128 app = QApplication (sys .argv )
126- window = DataFlow ()
129+ window = DataFlow ()
127130 window .show ()
128- sys .exit (app .exec ())
131+ sys .exit (app .exec ())
0 commit comments