diff --git a/pmostools/peptools/__pycache__/bsconf.cpython-311.pyc b/pmostools/peptools/__pycache__/bsconf.cpython-311.pyc
new file mode 100644
index 0000000..be19f2d
Binary files /dev/null and b/pmostools/peptools/__pycache__/bsconf.cpython-311.pyc differ
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()