From 18086e87c8b62bd472e229971a5833e0f9f06e84 Mon Sep 17 00:00:00 2001 From: manuel Date: Fri, 2 Feb 2024 18:40:47 -0100 Subject: [PATCH] update peptools --- .../__pycache__/bsconf.cpython-311.pyc | Bin 0 -> 549 bytes pmostools/peptools/bsconf.py | 1 + pmostools/peptools/kumo.py | 212 ++++++++++++++---- pmostools/peptools/suggested.py | 16 +- 4 files changed, 185 insertions(+), 44 deletions(-) create mode 100644 pmostools/peptools/__pycache__/bsconf.cpython-311.pyc diff --git a/pmostools/peptools/__pycache__/bsconf.cpython-311.pyc b/pmostools/peptools/__pycache__/bsconf.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..be19f2d27202ca0ca3fc30d7649015618db0551c GIT binary patch literal 549 zcmYjO!D`$v5S7V=YBpA5d4wc4aZfpx zUV2Q9IklAbX979-+8f+nOFQs|KW2mO*Z)Dtw=0*U+2YSepfwmJOZQ>SCy=VX zeqhi#BHn6)4$Gl}K@gI3Pfnq1|E#P(iaIQgc+)1FuNZBm$>N()i9DH7g%wDe$=I zW!d6pzu9%$znk4SM+LD%rRsPGzCeN0xHzk_tN$ZWeg z)b-8k>tz$(m~|@K{*LXFoBN*U%{!}Jcg|Y(l&wGc5q=NPPrikhLH{b~pZ3~e)+qTF D{vxDJ literal 0 HcmV?d00001 diff --git a/pmostools/peptools/bsconf.py b/pmostools/peptools/bsconf.py index 56300bf..0089b4f 100644 --- a/pmostools/peptools/bsconf.py +++ b/pmostools/peptools/bsconf.py @@ -7,4 +7,5 @@ * just change the name to the prefered theme to be used for the * system """ +import ttkbootstrap as ttk bbstyle = ttk.Window(themename="darkly") diff --git a/pmostools/peptools/kumo.py b/pmostools/peptools/kumo.py index 8109116..beaf798 100644 --- a/pmostools/peptools/kumo.py +++ b/pmostools/peptools/kumo.py @@ -7,8 +7,12 @@ """ import os +import re +from urllib.parse import urljoin +from tkinter import filedialog import sqlite3 import tkinter as tk +import requests import ttkbootstrap as ttk import bsconf @@ -16,15 +20,17 @@ import bsconf # setup the window pwin = bsconf.bbstyle pwin.resizable(False, False) -WINDOW_HEIGHT = 300 +WINDOW_HEIGHT = 380 WINDOW_WIDTH = 640 pwin.title('Peppermint Kumo (SSB Manager)') -# Set the user path +# Set the user paths used gusr = os.getlogin() spath = "/home/" + gusr + "/.local/share/pmostools/peptools" -# Set the icon +dpath = "/home/" + gusr + "/.local/share/applications/" +ipath = "/home/" + gusr + "/Pictures/" +# Set the window icon pwin.tk.call('wm', 'iconphoto', pwin, tk.PhotoImage( file=spath + '/images/kumosm.png')) @@ -37,6 +43,55 @@ pcur.execute(""" CREATE TABLE IF NOT EXISTS kumoapp (id integer PRIMARY KEY AUTOINCREMENT, ssbname text, lnk text);""" ) +def download_favicon(url, output_folder=ipath, request_timeout=3): + """ + This function will try a regex to find and locate the favicon + of a website.Depending on the website it may not find the favicon. + the goals is to try and stay within the python stndard library + """ + + # Send a GET request to the website + response = requests.get(url, timeout=request_timeout) + response.raise_for_status() # Raise an error for bad responses + + # Use a regular expression to find the favicon URL in the HTML + match = re.search( + r']*?rel=["\']?icon["\']?[^>]*?href=["\'](.*?)["\']', + response.text, + re.IGNORECASE + ) + if match: + favicon_url = match.group(1) + favicon_url = urljoin(url, favicon_url) + # Download the favicon + response = requests.get(favicon_url,timeout=request_timeout, stream=True) + response.raise_for_status() + if not os.path.exists(output_folder): + os.makedirs(output_folder) + filename = os.path.join(output_folder, + os.path.basename(favicon_url) + ) + with open(filename, 'wb') as f: + for chunk in response.iter_content(chunk_size=8192): + f.write(chunk) + return filename + return None + + +def delete_ssb(): + """ Delete the ssb that is selected """ + get_name = cmbo.get() + link_address = """ DELETE FROM kumoapp WHERE ssbname = ? """ + pcur.execute(link_address, (get_name,)) + dcon.commit() + runaddr_value.delete('1.0', tk.END) + for dfile in os.listdir(dpath): + if dfile.startswith(get_name) and dfile.endswith('.desktop'): + del_path = os.path.join(dpath, dfile) + os.remove(del_path) + pwin.destroy() + os.system('python3 refresh.py') + def center_screen(): """ gets the coordinates of the center of the screen """ @@ -52,8 +107,34 @@ def center_screen(): ) +def make_desktop_file(): + """ this will make the ssb and store in the Home folder""" + get_name = ssb_value.get("1.0", 'end-1c') + get_url = urladdr_value.get("1.0", 'end-1c') + get_local = cmbomenu.get() + get_icon = icon_value.get("1.0", 'end-1c') + write_path = dpath + get_name + '.desktop' + selected_category_key = categories_reverse[get_local] + app_content = f""" +[Desktop Entry] +Name={get_name} +Exec= luakit -U {get_url} +Icon={get_icon} +Categories={selected_category_key} +Type=Application +""" + # Make sure path exists first + folder = os.path.dirname(write_path) + if not os.path.exists(folder): + os.makedirs(folder) + # Then write the file + with open(write_path, 'w') as app: + app.write(app_content) + + def add_new_ssb(): """ Add new ssb """ + make_desktop_file() ssb_name = ssb_value.get("1.0", 'end-1c') ssb_address = urladdr_value.get("1.0", 'end-1c') sql_insert = """ INSERT INTO kumoapp(ssbname,lnk) VALUES(?,?);""" @@ -63,15 +144,6 @@ def add_new_ssb(): urladdr_value.delete('1.0', tk.END) pwin.destroy() os.system('python3 ' + spath + '/refresh.py') - - -def delete_ssb(): - """ Delete the ssb that is selected """ - get_name = cmbo.get() - link_address = """ DELETE FROM kumoapp WHERE ssbname = ? """ - pcur.execute(link_address, (get_name,)) - dcon.commit() - runaddr_value.delete('1.0', tk.END) pwin.destroy() os.system('python3 refresh.py') @@ -93,68 +165,107 @@ def fill_url_address(): use_address = pcur.fetchone() runaddr_value.delete('1.0', tk.END) runaddr_value.insert("end-1c", use_address) + + +def run_url_address(): + """ Run the ssb with the run button""" run_addrs = runaddr_value.get("1.0", 'end-1c') os.system('luakit -U ' + run_addrs + ' &') -### Create SSB side +def select_icon(): + """ + Select the icon to be used for the SSB in the system + The starting folder is the home pictures folder + """ + ssb_address = urladdr_value.get("1.0", 'end-1c') + output_filename = download_favicon(ssb_address) + initial_dir = ipath + file_path = filedialog.askopenfilename( + title="Select Icon", + initialdir=initial_dir, + filetypes=[("Icon files", "*.ico"), ("Icon files", "*.png"), + ("Icon files", "*.gif"), ("Icon files", "*.ppm"), + ("Icon files", "*.pgm")] + ) + if file_path: + icon_value.delete(1.0, tk.END) + icon_value.insert(tk.END, file_path) + + +### Create SSB side objects used +### Title new_label = ttk.Label(pwin, text="Create new SSBs", bootstyle="danger", font=("Helvetica", 14) ) - new_label.place(x=10, y=20) - ssb_label = ttk.Label(pwin, text="Give the ssb a name:") -ssb_label.place(x=10, y=50) +ssb_label.place(x=10, y=55) ssb_value = tk.Text(pwin, height=1, width=25) -ssb_value.place(x=10, y=75) - -separator = ttk.Separator(pwin, orient='vertical') -separator.place(relx=.495, rely=0, relheight=1) - +ssb_value.place(x=10, y=80) +lblcmbomenu = ttk.Label(pwin, text="Menu Location:") +lblcmbomenu.place(x=10, y=113) +categories = { 'AudioVideo' : 'AudioVideo', 'Audio':'Audio', 'Video':'Video', + 'Development':'Development', 'Education':'Education', + 'Game':'Game', 'Graphics':'Graphics', 'Network':'Internet', + 'Office':'Office', 'Settings':'Settings','System':'System', + 'Utility':'Utility' + } +categories_reverse = {value: key for key, value in categories.items()} +cmbomenu = ttk.Combobox(pwin) +cmbomenu.place(x=10, y=135) +cmbomenu['values'] = list(categories.values()) +icon_default_text = 'Set the icon with the "Icon" button' +icon_value = tk.Text(pwin, height=1, width=32) +icon_value.insert(tk.END, icon_default_text) +icon_value.place(x=10, y=280) +icon_button = ttk.Button(pwin, text="Icon", width=7, cursor="hand2", + bootstyle="light-outline", command=select_icon + ) +icon_button.place(x=90, y=324) +url_default_text = "example: https://www.example.com" urladdr_label = ttk.Label(pwin, text="Enter the Url:") -urladdr_label.place(x=10, y=125) -urladdr_value = tk.Text(pwin, height=4, width=30) -urladdr_value.place(x=10, y=150) +urladdr_label.place(x=10, y=172) +urladdr_value = tk.Text(pwin, height=3, width=32) +urladdr_value.insert(tk.END, url_default_text) +urladdr_value.place(x=10, y=200) btnsv = ttk.Button( pwin, - text="save", + text="Save", cursor="hand2", bootstyle="light-outline", width=5, command=add_new_ssb ) -btnsv.place(x=10, y=250) - +btnsv.place(x=10, y=324) +### The Separator for the window +separator = ttk.Separator(pwin, orient='vertical') +separator.place(relx=.495, rely=0, relheight=1) ### Manage SSBs side) manage_label = ttk.Label(pwin, text="Manage SSBs", bootstyle="danger", font=("Helvetica", 14) ) -manage_label.place(x=340, y=20) - +manage_label.place(x=330, y=20) lblcmbo = ttk.Label(pwin, text="Select SSB to Manage:") -lblcmbo.place(x=340, y=50) +lblcmbo.place(x=330, y=55) cmbo = ttk.Combobox(pwin) -cmbo.place(x=340, y=70) -cmbo['values'] = (fill_dropdown()) - +cmbo.place(x=330, y=80) +cmbo['values'] = fill_dropdown() runaddr_label = ttk.Label(pwin, text="Url Address:") -runaddr_label.place(x=340, y=125) -runaddr_value = tk.Text(pwin, height=4, width=30) -runaddr_value.place(x=340, y=150) - +runaddr_label.place(x=330, y=125) +runaddr_value = tk.Text(pwin, height=4, width=32) +runaddr_value.place(x=330, y=150) btnrun = ttk.Button( pwin, text="Run", cursor="hand2", bootstyle="light-outline", width=7, - command=fill_url_address + command=run_url_address ) -btnrun.place(x=340, y=250) - +btnrun.place(x=330, y=324) btndelete = ttk.Button( pwin, text="Delete", @@ -163,7 +274,26 @@ btndelete = ttk.Button( width=7, command=delete_ssb ) -btndelete.place(x=430, y=250) +btndelete.place(x=430, y=324) + + +def set_state(event): + """ + Function that managse the state of the buttons and the Url address + for the Manage SSBs section, this is an event function + """ + + selected_value = cmbo.get() + if selected_value == "": + btndelete["state"] = "disabled" + btnrun["state"] = "disabled" + else: + btndelete["state"] = "normal" + btnrun["state"] = "normal" + fill_url_address() + +cmbo.bind("<>", set_state) +set_state(None) center_screen() pwin.mainloop() diff --git a/pmostools/peptools/suggested.py b/pmostools/peptools/suggested.py index 9adef31..8c57148 100644 --- a/pmostools/peptools/suggested.py +++ b/pmostools/peptools/suggested.py @@ -13,8 +13,19 @@ import ttkbootstrap as ttk pwin = ttk.Window(themename="darkly") pwin.title("Suggested Packages") pwin.resizable(False, False) -pwin.geometry('470x470') +WINDOW_HEIGHT = 470 +WINDOW_WIDTH = 470 +def center_screen(): + """ gets the coordinates of the center of the screen """ + screen_width = pwin.winfo_screenwidth() + screen_height = pwin.winfo_screenheight() + # Coordinates of the upper left corner of the window to make the window + # appear in the center + x_cordinate = int((screen_width / 2) - (WINDOW_WIDTH / 2)) + y_cordinate = int((screen_height / 2) - (WINDOW_HEIGHT / 2)) + pwin.geometry("{}x{}+{}+{}".format(WINDOW_WIDTH, + WINDOW_HEIGHT, x_cordinate, y_cordinate)) def check_packages(): """ Check if software is installed""" @@ -32,8 +43,6 @@ def check_packages(): backup_tool['state'] = tk.DISABLED if os.path.exists('/usr/bin/gnome-software'): store['state'] = tk.DISABLED - if os.path.exists('/usr/bin/keepassxc'): - store['state'] = tk.DISABLED def check_web_browsers(): @@ -329,4 +338,5 @@ lblpmtitle = ttk.Label(pwin, style="F62817.TLabel", check_base_snaps() check_packages() check_web_browsers() +center_screen() pwin.mainloop()