Last active 13 hours ago

main.py Raw
1#!/usr/bin/env python3
2import os
3import subprocess
4import sys
5from PyQt6 import QtWidgets, QtGui, QtCore
6
7PRIMARY_SHARED = "/home/primary_shared"
8
9class FolderTree(QtWidgets.QWidget):
10 def __init__(self):
11 super().__init__()
12 self.setWindowTitle("Add to Primary Shared")
13 self.resize(700, 500)
14
15 layout = QtWidgets.QVBoxLayout(self)
16
17 # buttons
18 btn_layout = QtWidgets.QHBoxLayout()
19 layout.addLayout(btn_layout)
20
21 self.select_btn = QtWidgets.QPushButton("Select Folder")
22 self.select_btn.clicked.connect(self.choose_folder)
23 btn_layout.addWidget(self.select_btn)
24
25 self.add_btn = QtWidgets.QPushButton("Add Folder")
26 self.add_btn.clicked.connect(self.add_folder)
27 btn_layout.addWidget(self.add_btn)
28
29 self.refresh_btn = QtWidgets.QPushButton("Refresh")
30 self.refresh_btn.clicked.connect(self.refresh_tree)
31 btn_layout.addWidget(self.refresh_btn)
32
33 # tree view
34 self.tree = QtWidgets.QTreeWidget()
35 self.tree.setHeaderLabels(["Folder"])
36 layout.addWidget(self.tree)
37
38 self.selected_folder = None
39 self.refresh_tree()
40
41 def choose_folder(self):
42 folder = QtWidgets.QFileDialog.getExistingDirectory(self, "Select Folder", os.path.expanduser("~"))
43 if folder:
44 self.selected_folder = folder
45 self.select_btn.setText(f"Selected: {folder}")
46
47 def add_folder(self):
48 if not self.selected_folder:
49 return
50 try:
51 subprocess.run(["/usr/local/bin/add_to_primary_shared", self.selected_folder], check=True)
52 self.refresh_tree()
53 QtWidgets.QMessageBox.information(self, "Success", f"Added {self.selected_folder}")
54 except subprocess.CalledProcessError:
55 QtWidgets.QMessageBox.critical(self, "Error", f"Failed to add {self.selected_folder}")
56
57 def refresh_tree(self):
58 self.tree.clear()
59 home = os.path.expanduser("~")
60 for root, dirs, files in os.walk(home):
61 for d in dirs:
62 full_path = os.path.join(root, d)
63
64 # skip symlinks and mounted folders
65 if os.path.islink(full_path) or os.path.ismount(full_path):
66 continue
67
68 rel_path = os.path.relpath(full_path, home)
69 shared_path = os.path.join(PRIMARY_SHARED, rel_path)
70
71 item = QtWidgets.QTreeWidgetItem([rel_path])
72
73 # determine color
74 if os.path.exists(shared_path):
75 # fully moved
76 item.setBackground(0, QtGui.QBrush(QtGui.QColor("green")))
77 else:
78 # check if partially moved (any subfolder exists in shared)
79 partially = False
80 try:
81 for f in os.listdir(full_path):
82 f_path = os.path.join(full_path, f)
83 if os.path.islink(f_path) or os.path.ismount(f_path):
84 continue
85 shared_sub = os.path.join(PRIMARY_SHARED, os.path.relpath(f_path, home))
86 if os.path.exists(shared_sub):
87 partially = True
88 break
89 except OSError:
90 # skip folders that cannot be read
91 partially = False
92
93 if partially:
94 item.setBackground(0, QtGui.QBrush(QtGui.QColor("yellow")))
95
96 self.tree.addTopLevelItem(item)
97
98
99
100def main():
101 app = QtWidgets.QApplication(sys.argv)
102 gui = FolderTree()
103 gui.show()
104 sys.exit(app.exec())
105
106if __name__ == "__main__":
107 main()