update peptools
This commit is contained in:
parent
4625eace6b
commit
18086e87c8
Binary file not shown.
|
@ -7,4 +7,5 @@
|
||||||
* just change the name to the prefered theme to be used for the
|
* just change the name to the prefered theme to be used for the
|
||||||
* system
|
* system
|
||||||
"""
|
"""
|
||||||
|
import ttkbootstrap as ttk
|
||||||
bbstyle = ttk.Window(themename="darkly")
|
bbstyle = ttk.Window(themename="darkly")
|
||||||
|
|
|
@ -7,8 +7,12 @@
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import os
|
import os
|
||||||
|
import re
|
||||||
|
from urllib.parse import urljoin
|
||||||
|
from tkinter import filedialog
|
||||||
import sqlite3
|
import sqlite3
|
||||||
import tkinter as tk
|
import tkinter as tk
|
||||||
|
import requests
|
||||||
import ttkbootstrap as ttk
|
import ttkbootstrap as ttk
|
||||||
import bsconf
|
import bsconf
|
||||||
|
|
||||||
|
@ -16,15 +20,17 @@ import bsconf
|
||||||
# setup the window
|
# setup the window
|
||||||
pwin = bsconf.bbstyle
|
pwin = bsconf.bbstyle
|
||||||
pwin.resizable(False, False)
|
pwin.resizable(False, False)
|
||||||
WINDOW_HEIGHT = 300
|
WINDOW_HEIGHT = 380
|
||||||
WINDOW_WIDTH = 640
|
WINDOW_WIDTH = 640
|
||||||
pwin.title('Peppermint Kumo (SSB Manager)')
|
pwin.title('Peppermint Kumo (SSB Manager)')
|
||||||
|
|
||||||
|
|
||||||
# Set the user path
|
# Set the user paths used
|
||||||
gusr = os.getlogin()
|
gusr = os.getlogin()
|
||||||
spath = "/home/" + gusr + "/.local/share/pmostools/peptools"
|
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,
|
pwin.tk.call('wm', 'iconphoto', pwin,
|
||||||
tk.PhotoImage(
|
tk.PhotoImage(
|
||||||
file=spath + '/images/kumosm.png'))
|
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);"""
|
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'<link[^>]*?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():
|
def center_screen():
|
||||||
""" gets the coordinates of the center of the 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():
|
def add_new_ssb():
|
||||||
""" Add new ssb """
|
""" Add new ssb """
|
||||||
|
make_desktop_file()
|
||||||
ssb_name = ssb_value.get("1.0", 'end-1c')
|
ssb_name = ssb_value.get("1.0", 'end-1c')
|
||||||
ssb_address = urladdr_value.get("1.0", 'end-1c')
|
ssb_address = urladdr_value.get("1.0", 'end-1c')
|
||||||
sql_insert = """ INSERT INTO kumoapp(ssbname,lnk) VALUES(?,?);"""
|
sql_insert = """ INSERT INTO kumoapp(ssbname,lnk) VALUES(?,?);"""
|
||||||
|
@ -63,15 +144,6 @@ def add_new_ssb():
|
||||||
urladdr_value.delete('1.0', tk.END)
|
urladdr_value.delete('1.0', tk.END)
|
||||||
pwin.destroy()
|
pwin.destroy()
|
||||||
os.system('python3 ' + spath + '/refresh.py')
|
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()
|
pwin.destroy()
|
||||||
os.system('python3 refresh.py')
|
os.system('python3 refresh.py')
|
||||||
|
|
||||||
|
@ -93,68 +165,107 @@ def fill_url_address():
|
||||||
use_address = pcur.fetchone()
|
use_address = pcur.fetchone()
|
||||||
runaddr_value.delete('1.0', tk.END)
|
runaddr_value.delete('1.0', tk.END)
|
||||||
runaddr_value.insert("end-1c", use_address)
|
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')
|
run_addrs = runaddr_value.get("1.0", 'end-1c')
|
||||||
os.system('luakit -U ' + run_addrs + ' &')
|
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",
|
new_label = ttk.Label(pwin, text="Create new SSBs",
|
||||||
bootstyle="danger",
|
bootstyle="danger",
|
||||||
font=("Helvetica", 14)
|
font=("Helvetica", 14)
|
||||||
)
|
)
|
||||||
|
|
||||||
new_label.place(x=10, y=20)
|
new_label.place(x=10, y=20)
|
||||||
|
|
||||||
ssb_label = ttk.Label(pwin, text="Give the ssb a name:")
|
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 = tk.Text(pwin, height=1, width=25)
|
||||||
ssb_value.place(x=10, y=75)
|
ssb_value.place(x=10, y=80)
|
||||||
|
lblcmbomenu = ttk.Label(pwin, text="Menu Location:")
|
||||||
separator = ttk.Separator(pwin, orient='vertical')
|
lblcmbomenu.place(x=10, y=113)
|
||||||
separator.place(relx=.495, rely=0, relheight=1)
|
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 = ttk.Label(pwin, text="Enter the Url:")
|
||||||
urladdr_label.place(x=10, y=125)
|
urladdr_label.place(x=10, y=172)
|
||||||
urladdr_value = tk.Text(pwin, height=4, width=30)
|
urladdr_value = tk.Text(pwin, height=3, width=32)
|
||||||
urladdr_value.place(x=10, y=150)
|
urladdr_value.insert(tk.END, url_default_text)
|
||||||
|
urladdr_value.place(x=10, y=200)
|
||||||
|
|
||||||
btnsv = ttk.Button(
|
btnsv = ttk.Button(
|
||||||
pwin,
|
pwin,
|
||||||
text="save",
|
text="Save",
|
||||||
cursor="hand2",
|
cursor="hand2",
|
||||||
bootstyle="light-outline",
|
bootstyle="light-outline",
|
||||||
width=5,
|
width=5,
|
||||||
command=add_new_ssb
|
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 SSBs side)
|
||||||
manage_label = ttk.Label(pwin, text="Manage SSBs",
|
manage_label = ttk.Label(pwin, text="Manage SSBs",
|
||||||
bootstyle="danger",
|
bootstyle="danger",
|
||||||
font=("Helvetica", 14)
|
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 = 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 = ttk.Combobox(pwin)
|
||||||
cmbo.place(x=340, y=70)
|
cmbo.place(x=330, y=80)
|
||||||
cmbo['values'] = (fill_dropdown())
|
cmbo['values'] = fill_dropdown()
|
||||||
|
|
||||||
runaddr_label = ttk.Label(pwin, text="Url Address:")
|
runaddr_label = ttk.Label(pwin, text="Url Address:")
|
||||||
runaddr_label.place(x=340, y=125)
|
runaddr_label.place(x=330, y=125)
|
||||||
runaddr_value = tk.Text(pwin, height=4, width=30)
|
runaddr_value = tk.Text(pwin, height=4, width=32)
|
||||||
runaddr_value.place(x=340, y=150)
|
runaddr_value.place(x=330, y=150)
|
||||||
|
|
||||||
btnrun = ttk.Button(
|
btnrun = ttk.Button(
|
||||||
pwin,
|
pwin,
|
||||||
text="Run",
|
text="Run",
|
||||||
cursor="hand2",
|
cursor="hand2",
|
||||||
bootstyle="light-outline",
|
bootstyle="light-outline",
|
||||||
width=7,
|
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(
|
btndelete = ttk.Button(
|
||||||
pwin,
|
pwin,
|
||||||
text="Delete",
|
text="Delete",
|
||||||
|
@ -163,7 +274,26 @@ btndelete = ttk.Button(
|
||||||
width=7,
|
width=7,
|
||||||
command=delete_ssb
|
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("<<ComboboxSelected>>", set_state)
|
||||||
|
set_state(None)
|
||||||
center_screen()
|
center_screen()
|
||||||
pwin.mainloop()
|
pwin.mainloop()
|
||||||
|
|
|
@ -13,8 +13,19 @@ import ttkbootstrap as ttk
|
||||||
pwin = ttk.Window(themename="darkly")
|
pwin = ttk.Window(themename="darkly")
|
||||||
pwin.title("Suggested Packages")
|
pwin.title("Suggested Packages")
|
||||||
pwin.resizable(False, False)
|
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():
|
def check_packages():
|
||||||
""" Check if software is installed"""
|
""" Check if software is installed"""
|
||||||
|
@ -32,8 +43,6 @@ def check_packages():
|
||||||
backup_tool['state'] = tk.DISABLED
|
backup_tool['state'] = tk.DISABLED
|
||||||
if os.path.exists('/usr/bin/gnome-software'):
|
if os.path.exists('/usr/bin/gnome-software'):
|
||||||
store['state'] = tk.DISABLED
|
store['state'] = tk.DISABLED
|
||||||
if os.path.exists('/usr/bin/keepassxc'):
|
|
||||||
store['state'] = tk.DISABLED
|
|
||||||
|
|
||||||
|
|
||||||
def check_web_browsers():
|
def check_web_browsers():
|
||||||
|
@ -329,4 +338,5 @@ lblpmtitle = ttk.Label(pwin, style="F62817.TLabel",
|
||||||
check_base_snaps()
|
check_base_snaps()
|
||||||
check_packages()
|
check_packages()
|
||||||
check_web_browsers()
|
check_web_browsers()
|
||||||
|
center_screen()
|
||||||
pwin.mainloop()
|
pwin.mainloop()
|
||||||
|
|
Loading…
Reference in New Issue