Last active 15 hours ago

demo revised this gist 15 hours ago. Go to revision

1 file changed, 107 insertions

main.py(file created)

@@ -0,0 +1,107 @@
1 + #!/usr/bin/env python3
2 + import os
3 + import subprocess
4 + import sys
5 + from PyQt6 import QtWidgets, QtGui, QtCore
6 +
7 + PRIMARY_SHARED = "/home/primary_shared"
8 +
9 + class 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 +
100 + def main():
101 + app = QtWidgets.QApplication(sys.argv)
102 + gui = FolderTree()
103 + gui.show()
104 + sys.exit(app.exec())
105 +
106 + if __name__ == "__main__":
107 + main()
Newer Older