main.py
· 3.7 KiB · Python
Raw
#!/usr/bin/env python3
import os
import subprocess
import sys
from PyQt6 import QtWidgets, QtGui, QtCore
PRIMARY_SHARED = "/home/primary_shared"
class FolderTree(QtWidgets.QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle("Add to Primary Shared")
self.resize(700, 500)
layout = QtWidgets.QVBoxLayout(self)
# buttons
btn_layout = QtWidgets.QHBoxLayout()
layout.addLayout(btn_layout)
self.select_btn = QtWidgets.QPushButton("Select Folder")
self.select_btn.clicked.connect(self.choose_folder)
btn_layout.addWidget(self.select_btn)
self.add_btn = QtWidgets.QPushButton("Add Folder")
self.add_btn.clicked.connect(self.add_folder)
btn_layout.addWidget(self.add_btn)
self.refresh_btn = QtWidgets.QPushButton("Refresh")
self.refresh_btn.clicked.connect(self.refresh_tree)
btn_layout.addWidget(self.refresh_btn)
# tree view
self.tree = QtWidgets.QTreeWidget()
self.tree.setHeaderLabels(["Folder"])
layout.addWidget(self.tree)
self.selected_folder = None
self.refresh_tree()
def choose_folder(self):
folder = QtWidgets.QFileDialog.getExistingDirectory(self, "Select Folder", os.path.expanduser("~"))
if folder:
self.selected_folder = folder
self.select_btn.setText(f"Selected: {folder}")
def add_folder(self):
if not self.selected_folder:
return
try:
subprocess.run(["/usr/local/bin/add_to_primary_shared", self.selected_folder], check=True)
self.refresh_tree()
QtWidgets.QMessageBox.information(self, "Success", f"Added {self.selected_folder}")
except subprocess.CalledProcessError:
QtWidgets.QMessageBox.critical(self, "Error", f"Failed to add {self.selected_folder}")
def refresh_tree(self):
self.tree.clear()
home = os.path.expanduser("~")
for root, dirs, files in os.walk(home):
for d in dirs:
full_path = os.path.join(root, d)
# skip symlinks and mounted folders
if os.path.islink(full_path) or os.path.ismount(full_path):
continue
rel_path = os.path.relpath(full_path, home)
shared_path = os.path.join(PRIMARY_SHARED, rel_path)
item = QtWidgets.QTreeWidgetItem([rel_path])
# determine color
if os.path.exists(shared_path):
# fully moved
item.setBackground(0, QtGui.QBrush(QtGui.QColor("green")))
else:
# check if partially moved (any subfolder exists in shared)
partially = False
try:
for f in os.listdir(full_path):
f_path = os.path.join(full_path, f)
if os.path.islink(f_path) or os.path.ismount(f_path):
continue
shared_sub = os.path.join(PRIMARY_SHARED, os.path.relpath(f_path, home))
if os.path.exists(shared_sub):
partially = True
break
except OSError:
# skip folders that cannot be read
partially = False
if partially:
item.setBackground(0, QtGui.QBrush(QtGui.QColor("yellow")))
self.tree.addTopLevelItem(item)
def main():
app = QtWidgets.QApplication(sys.argv)
gui = FolderTree()
gui.show()
sys.exit(app.exec())
if __name__ == "__main__":
main()
| 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() |