Notes/src/Python/Scripts/GTK/edit-path/__main__.py

152 lines
4.6 KiB
Python
Executable File

#!/usr/bin/python3
# GTK Imports
import gi, faulthandler, signal
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk as gtk
from gi.repository import GLib
# Python Imports
import os, threading, time
from setproctitle import setproctitle
def threaded(fn):
def wrapper(*args, **kwargs):
threading.Thread(target=fn, args=args, kwargs=kwargs).start()
return wrapper
class Main:
def __init__(self):
setproctitle('PATH Edit Tool')
GLib.unix_signal_add(GLib.PRIORITY_DEFAULT, signal.SIGINT, gtk.main_quit)
faulthandler.enable() # For better debug info
self.HOME = os.path.expanduser('~')
PREFERED_BASH_PATH = self.HOME + "/" + ".bash_paths"
SCRIPT_PTH = os.path.dirname(os.path.realpath(__file__)) + "/"
GLADE_FILE = "main.glade"
self.builder = gtk.Builder()
self.builder.add_from_file(SCRIPT_PTH + GLADE_FILE)
self.builder.connect_signals(self)
self.pathTreeView = self.builder.get_object("pathTreeView")
self.messageWidget = self.builder.get_object("messageWidget")
self.messageLabel = self.builder.get_object("messageLabel")
self.pathListStore = gtk.ListStore(str)
self.success = "#88cc27"
self.warning = "#ffa800"
self.error = "#ff0000"
self.selected = None
self.bashrcPath = ""
if os.path.isfile(PREFERED_BASH_PATH):
self.bashrcPath = PREFERED_BASH_PATH
else:
self.bashrcPath = self.HOME + "/" + ".bashrc"
self.setupTreeview()
self.loadPaths()
window = self.builder.get_object("Main_Window")
window.connect("delete-event", gtk.main_quit)
window.show()
def addEntry(self, widget):
toAddPathTxt = self.builder.get_object("toAddPathEntry").get_text().strip()
if os.path.isdir(toAddPathTxt):
self.pathListStore.append([toAddPathTxt])
else:
self.displayMessage(self.warning, "Not a directory!")
def deleteEntry(self, widget):
self.pathListStore.remove(self.selected)
def saveToBashrc(self, widget):
try:
paths = list()
iter = self.pathListStore.get_iter_first()
while iter != None:
pth = self.pathListStore.get_value(iter, 0)
pth = pth.replace(self.HOME, "$HOME")
paths.append(pth)
# paths.append(self.pathListStore.get_value(iter, 0))
iter = self.pathListStore.iter_next(iter)
toExport = "export PATH=\"" + ':'.join(paths) + "\"\n\n"
file = open(self.bashrcPath, mode='r')
for line in file:
if "export PATH=" in line:
continue
else:
toExport += line
file.close()
file = open(self.bashrcPath, mode='w')
file.write(toExport)
file.close()
self.displayMessage(self.success, "Successfully saved file!")
except Exception as e:
self.displayMessage(self.error, "Opening/Writing to file failed!")
print("Opening/Writing to file failed with the following:\n\n")
print(e)
def setSelected(self, user_data):
selected = user_data.get_selected()[1]
if selected:
self.selected = selected
def loadPaths(self):
pathsStr = os.getenv("PATH")
# If path exists in bashrc replace default selection...
file = open(self.bashrcPath, mode='r')
for line in file:
if "export PATH=" in line:
part = line.replace("export PATH=", "")
cleaned = part.replace("\"", "")
pathsStr = cleaned.strip()
# Split string into list/tuple and add parts to store
paths = pathsStr.split(":")
for path in paths:
self.pathListStore.append([path])
def setupTreeview(self):
renderer = gtk.CellRendererText()
pathColumn = gtk.TreeViewColumn(title="Paths", cell_renderer=renderer, text=0)
self.pathTreeView.append_column(pathColumn)
self.pathTreeView.set_model(self.pathListStore)
def displayMessage(self, type, text):
markup = "<span foreground='" + type + "'>" + text + "</span>"
self.messageLabel.set_markup(markup)
self.messageWidget.popup()
self.hideMessageTimed()
@threaded
def hideMessageTimed(self):
time.sleep(3)
GLib.idle_add(self.messageWidget.popdown)
if __name__ == '__main__':
main = Main()
gtk.main()