463 lines
11 KiB
Python
Executable File
463 lines
11 KiB
Python
Executable File
"""
|
|
* Author: "PepDebian(peppermintosteam@proton.me)
|
|
*
|
|
* License: SPDX-License-Identifier: GPL-3.0-or-later
|
|
*
|
|
* this script is for the selected packages screen
|
|
*
|
|
"""
|
|
import subprocess
|
|
import tkinter as tk
|
|
from tendo import singleton
|
|
import ttkbootstrap as ttk
|
|
import putilities
|
|
|
|
|
|
# makes sure only a single instance is running
|
|
me = singleton.SingleInstance()
|
|
|
|
# list of all checkboxes and their current value
|
|
checkboxstates = []
|
|
|
|
# this will set the window name and style.
|
|
instw = ttk.Window(themename="darkly")
|
|
# the window size
|
|
instw.geometry('680x520')
|
|
# the title of the window
|
|
instw.title("Suggested Packages")
|
|
# set the icon for the window
|
|
instw.tk.call('wm', 'iconphoto', instw._w, tk.PhotoImage(
|
|
file='/usr/share/pixmaps/peppermint-old.png'))
|
|
|
|
# ROW for all the items but the logo and the title
|
|
ROW = 20
|
|
ROW2 = 360
|
|
|
|
# main title style
|
|
spmt = ttk.Style()
|
|
spmt.configure(
|
|
"F62817.TLabel",
|
|
foreground="#ffffff",
|
|
background="#222222",
|
|
font=(
|
|
"Helvetica",
|
|
'22',
|
|
'bold'))
|
|
|
|
# This is all the lables and verbiage used and thier placements
|
|
lblpmtitle = ttk.Label(
|
|
instw,
|
|
style="F62817.TLabel",
|
|
text="Select Your Software Packages").place(
|
|
x=140,
|
|
y=10)
|
|
lblpmsubtitle = ttk.Label(
|
|
instw,
|
|
bootstyle="light",
|
|
text="Darkened items are already installed. \nPackages are from Stable Repositories.").place(
|
|
x=ROW2,
|
|
y=310)
|
|
lblpmsubtitle = ttk.Label(
|
|
instw,
|
|
bootstyle="light",
|
|
text="At PeppermintOS, we let our users decide what software is on their system.").place(
|
|
x=140,
|
|
y=40)
|
|
|
|
lblsoftware = ttk.Label(
|
|
instw,
|
|
bootstyle="light",
|
|
text="Software").place(
|
|
x=100,
|
|
y=80)
|
|
lblbROWsers = ttk.Label(
|
|
instw,
|
|
bootstyle="light",
|
|
text="Web Browsers").place(
|
|
x=440,
|
|
y=80)
|
|
|
|
# output textbox
|
|
textbox = ttk.Text(
|
|
instw,
|
|
background="#2f2f2f",
|
|
foreground="white",
|
|
state='disabled')
|
|
textbox.place(x=0, y=420, height=100, width=680)
|
|
textbox.configure(font=("GNU Unifont", '8'))
|
|
|
|
|
|
def install_check(appname, checkbox):
|
|
"""if this package is already installed, grey out the item"""
|
|
if putilities.install_check(appname):
|
|
checkbox.configure(state=["disabled"])
|
|
|
|
|
|
# firefox
|
|
firefox = tk.StringVar()
|
|
firefox.set("off")
|
|
cbfirefox = ttk.Checkbutton(
|
|
instw,
|
|
bootstyle="danger",
|
|
variable=firefox,
|
|
onvalue='firefox-esr',
|
|
offvalue="off",
|
|
text="Firefox: Mozilla's Open-source Browser")
|
|
cbfirefox.place(x=ROW2, y=100)
|
|
checkboxstates.append(firefox)
|
|
install_check("firefox-esr", cbfirefox)
|
|
|
|
# konqueror
|
|
konqueror = tk.StringVar()
|
|
konqueror.set("off")
|
|
cbkonqueror = ttk.Checkbutton(
|
|
instw,
|
|
bootstyle="danger",
|
|
variable=konqueror,
|
|
onvalue="konqueror",
|
|
offvalue="off",
|
|
text="Konqueror: KDE Browser and file manager")
|
|
cbkonqueror.place(x=ROW2, y=120)
|
|
checkboxstates.append(konqueror)
|
|
install_check("konqueror", cbkonqueror)
|
|
|
|
# epiphany-bROWser
|
|
epiphany = tk.StringVar()
|
|
epiphany.set("off")
|
|
cbepiphany = ttk.Checkbutton(
|
|
instw,
|
|
bootstyle="danger",
|
|
variable=epiphany,
|
|
onvalue="epiphany-browser",
|
|
offvalue="off",
|
|
text="Gnome Web (Epiphany): Intuitive Browser")
|
|
cbepiphany.place(x=ROW2, y=140)
|
|
checkboxstates.append(epiphany)
|
|
install_check("epiphany-bROWser", cbepiphany)
|
|
|
|
# falkon
|
|
falkon = tk.StringVar()
|
|
falkon.set("off")
|
|
cbfalkon = ttk.Checkbutton(
|
|
instw,
|
|
bootstyle="danger",
|
|
variable=falkon,
|
|
onvalue="falkon",
|
|
offvalue="off",
|
|
text="Falkon: Qt5 Browser by KDE")
|
|
cbfalkon.place(x=ROW2, y=160)
|
|
checkboxstates.append(falkon)
|
|
install_check("falkon", cbfalkon)
|
|
|
|
# torbROWser-launcher
|
|
torbROWser = tk.StringVar()
|
|
torbROWser.set("off")
|
|
cbtorbrowser = ttk.Checkbutton(
|
|
instw,
|
|
bootstyle="danger",
|
|
variable=torbROWser,
|
|
onvalue="torbrowser-launcher",
|
|
offvalue="off",
|
|
text="Tor Browser: Privacy Browser")
|
|
cbtorbrowser.place(x=ROW2, y=180)
|
|
checkboxstates.append(torbROWser)
|
|
install_check("torbrowser-launcher", cbtorbrowser)
|
|
|
|
# midori
|
|
midori = tk.StringVar()
|
|
midori.set("off")
|
|
cbmidori = ttk.Checkbutton(
|
|
instw,
|
|
bootstyle="danger",
|
|
variable=midori,
|
|
onvalue="midori",
|
|
offvalue="off",
|
|
text="Midori: Fast, lightweight Browser")
|
|
cbmidori.place(x=ROW2, y=200)
|
|
checkboxstates.append(midori)
|
|
install_check("midori", cbmidori)
|
|
|
|
# qutebROWser
|
|
qutebROWser = tk.StringVar()
|
|
qutebROWser.set("off")
|
|
cbqutebROWser = ttk.Checkbutton(
|
|
instw,
|
|
bootstyle="danger",
|
|
variable=qutebROWser,
|
|
onvalue="qutebrowser",
|
|
offvalue="off",
|
|
text="Qutebrowser: Vim-like Browser")
|
|
cbqutebROWser.place(x=ROW2, y=220)
|
|
checkboxstates.append(qutebROWser)
|
|
install_check("qutebrowser", cbqutebROWser)
|
|
|
|
# luakit
|
|
luakit = tk.StringVar()
|
|
luakit.set("off")
|
|
cbluakit = ttk.Checkbutton(
|
|
instw,
|
|
bootstyle="danger",
|
|
variable=luakit,
|
|
onvalue="luakit",
|
|
offvalue="off",
|
|
text="Luakit: Browser extensible by Lua")
|
|
cbluakit.place(x=ROW2, y=240)
|
|
checkboxstates.append(luakit)
|
|
install_check("luakit", cbluakit)
|
|
|
|
# chromium
|
|
chromium = tk.StringVar()
|
|
chromium.set("off")
|
|
cbchromium = ttk.Checkbutton(
|
|
instw,
|
|
bootstyle="danger",
|
|
variable=chromium,
|
|
onvalue="chromium",
|
|
offvalue="off",
|
|
text="Chromium: Google's Open-Source Browser")
|
|
cbchromium.place(x=ROW2, y=260)
|
|
checkboxstates.append(chromium)
|
|
install_check("chromium", cbchromium)
|
|
|
|
# atril
|
|
atril = tk.StringVar()
|
|
atril.set("off")
|
|
cbatril = ttk.Checkbutton(
|
|
instw,
|
|
bootstyle="danger",
|
|
variable=atril,
|
|
onvalue="atril",
|
|
offvalue="off",
|
|
text="Atril: a multi-page document viewer")
|
|
cbatril.place(x=ROW, y=100)
|
|
checkboxstates.append(atril)
|
|
install_check("atril", cbatril)
|
|
|
|
# transmission
|
|
transmission = tk.StringVar()
|
|
transmission.set("off")
|
|
cbtransmission = ttk.Checkbutton(
|
|
instw,
|
|
bootstyle="danger",
|
|
variable=transmission,
|
|
onvalue="transmission",
|
|
offvalue="off",
|
|
text="Transmission BitTorrent Client")
|
|
cbtransmission.place(x=ROW, y=120)
|
|
checkboxstates.append(transmission)
|
|
install_check("transmission", cbtransmission)
|
|
|
|
# ARandR
|
|
arandr = tk.StringVar()
|
|
arandr.set("off")
|
|
cbarandr = ttk.Checkbutton(
|
|
instw,
|
|
bootstyle="danger",
|
|
variable=arandr,
|
|
onvalue="arandr",
|
|
offvalue="off",
|
|
text="ARandR: Another XRandR GUI")
|
|
cbarandr.place(x=ROW, y=140)
|
|
checkboxstates.append(arandr)
|
|
install_check("arandr", cbarandr)
|
|
|
|
# pmount
|
|
pmount = tk.StringVar()
|
|
pmount.set("off")
|
|
cbpmount = ttk.Checkbutton(
|
|
instw,
|
|
bootstyle="danger",
|
|
variable=pmount,
|
|
onvalue="pmount",
|
|
offvalue="off",
|
|
text="pmount: Standard mount program")
|
|
cbpmount.place(x=ROW, y=160)
|
|
checkboxstates.append(pmount)
|
|
install_check("pmount", cbpmount)
|
|
|
|
# dconf-editor
|
|
dconfeditor = tk.StringVar()
|
|
dconfeditor.set("off")
|
|
cbdconfeditor = ttk.Checkbutton(
|
|
instw,
|
|
bootstyle="danger",
|
|
variable=dconfeditor,
|
|
onvalue="dconf-editor",
|
|
offvalue="off",
|
|
text="DConf Editor: For environment settings")
|
|
cbdconfeditor.place(x=ROW, y=180)
|
|
checkboxstates.append(dconfeditor)
|
|
install_check("dconf-editor", cbdconfeditor)
|
|
|
|
# gpicview
|
|
gpicview = tk.StringVar()
|
|
gpicview.set("off")
|
|
cbgpicview = ttk.Checkbutton(
|
|
instw,
|
|
bootstyle="danger",
|
|
variable=gpicview,
|
|
onvalue="gpicview",
|
|
offvalue="off",
|
|
text="GpicView image viewer")
|
|
cbgpicview.place(x=ROW, y=200)
|
|
checkboxstates.append(gpicview)
|
|
install_check("gpicview", cbgpicview)
|
|
|
|
# parole
|
|
parole = tk.StringVar()
|
|
parole.set("off")
|
|
cbparole = ttk.Checkbutton(
|
|
instw,
|
|
bootstyle="danger",
|
|
variable=parole,
|
|
onvalue="parole",
|
|
offvalue="off",
|
|
text="Parole: Media player for Xfce")
|
|
cbparole.place(x=ROW, y=220)
|
|
checkboxstates.append(parole)
|
|
install_check("parole", cbparole)
|
|
|
|
#GNU Firewall
|
|
gufw = tk.StringVar()
|
|
gufw.set("off")
|
|
cbgufw = ttk.Checkbutton(
|
|
instw,
|
|
bootstyle="danger",
|
|
variable=gufw,
|
|
onvalue="gufw",
|
|
offvalue="off",
|
|
text="gufw: GNU Firewall")
|
|
cbgufw.place(x=ROW, y=240)
|
|
checkboxstates.append(gufw)
|
|
install_check("gufw", cbgufw)
|
|
|
|
# snapd
|
|
snapd = tk.StringVar()
|
|
snapd.set("off")
|
|
cbsnapd = ttk.Checkbutton(
|
|
instw,
|
|
bootstyle="danger",
|
|
variable=snapd,
|
|
onvalue="snapd",
|
|
offvalue="off",
|
|
text="Snap Package Platform")
|
|
cbsnapd.place(x=ROW, y=260)
|
|
checkboxstates.append(snapd)
|
|
install_check("snapd", cbsnapd)
|
|
|
|
# flatpak
|
|
flatpak = tk.StringVar()
|
|
flatpak.set("off")
|
|
cbflatpak = ttk.Checkbutton(
|
|
instw,
|
|
bootstyle="danger",
|
|
variable=flatpak,
|
|
onvalue="flatpak",
|
|
offvalue="off",
|
|
text="Flatpak Packages Platform")
|
|
cbflatpak.place(x=ROW, y=280)
|
|
checkboxstates.append(flatpak)
|
|
install_check("flatpak", cbflatpak)
|
|
|
|
# gnome-software
|
|
gnomesoftware = tk.StringVar()
|
|
gnomesoftware.set("off")
|
|
cbgnomesoftware = ttk.Checkbutton(
|
|
instw,
|
|
bootstyle="danger",
|
|
variable=gnomesoftware,
|
|
onvalue="gnome-software",
|
|
offvalue="off",
|
|
text="Gnome software store")
|
|
cbgnomesoftware.place(x=ROW, y=300)
|
|
checkboxstates.append(gnomesoftware)
|
|
install_check("gnome-software", cbgnomesoftware)
|
|
|
|
# timshift
|
|
timeshift = tk.StringVar()
|
|
timeshift.set("off")
|
|
cbtimeshift = ttk.Checkbutton(
|
|
instw,
|
|
bootstyle="danger",
|
|
variable=timeshift,
|
|
onvalue="timeshift",
|
|
offvalue="off",
|
|
text="TimeShift: Backup Tool")
|
|
cbtimeshift.place(x=ROW, y=320)
|
|
checkboxstates.append(timeshift)
|
|
install_check("timeshift", cbtimeshift)
|
|
|
|
|
|
def install(applist):
|
|
""" install the applications"""
|
|
btnwk = ttk.Button(instw, text="Installing...", bootstyle="danger", state='disabled')
|
|
btnwk.place(x=245, y=375, height=30, width=150)
|
|
btn.place_forget()
|
|
textbox.configure(state='normal')
|
|
|
|
def textout(line):
|
|
textbox.insert(tk.END, line)
|
|
textbox.update_idletasks()
|
|
textbox.see("end")
|
|
print(line + "\n")
|
|
|
|
if len(applist) > 0:
|
|
with subprocess.Popen(["apt-get", "install", "-y"] + applist,
|
|
shell=False, stdout=subprocess.PIPE,
|
|
stderr=subprocess.PIPE,
|
|
universal_newlines=True) as point:
|
|
if point.stdout:
|
|
for line in point.stdout:
|
|
textout(line)
|
|
if point.stderr:
|
|
for line in point.stderr:
|
|
textout(line)
|
|
textout("Done.")
|
|
textbox.configure(state='disabled')
|
|
btnwk.place_forget()
|
|
btn.place(x=245, y=375, height=30, width=150)
|
|
|
|
|
|
|
|
def fin():
|
|
"""Finish close window"""
|
|
instw.destroy()
|
|
|
|
|
|
def getcheckboxes():
|
|
"""This will verify the check boxes"""
|
|
appqueue = []
|
|
for item in checkboxstates:
|
|
if item.get() != "off":
|
|
appqueue.append(item.get())
|
|
print(appqueue)
|
|
|
|
if len(appqueue) > 0:
|
|
install(appqueue)
|
|
else:
|
|
textbox.configure(state='normal')
|
|
textbox.insert(
|
|
tk.END,
|
|
"No packages selected. Please select a package.\n")
|
|
textbox.update_idletasks()
|
|
textbox.see("end")
|
|
textbox.configure(state='disabled')
|
|
|
|
|
|
# inital Begin install button
|
|
btn = ttk.Button(
|
|
instw,
|
|
text="Install Selected",
|
|
bootstyle="light-outline",
|
|
command=getcheckboxes)
|
|
##Placement of the Begin install button##
|
|
btn.place(x=245, y=375, height=30, width=150)
|
|
btnf = ttk.Button(
|
|
instw,
|
|
bootstyle="light-outline",
|
|
text="Done",
|
|
command=getcheckboxes)
|
|
btn.place(x=245, y=375, height=30, width=150)
|
|
##Start the window#
|
|
instw.mainloop()
|