Source code for NekUpload.frontend.components.scrollbox
import tkinter as tk
import ttkbootstrap as ttk
from ttkbootstrap.constants import *
from tkinter import filedialog
[docs]
class ScrolledListbox(ttk.Frame):
def __init__(self,parent):
super().__init__(
master=parent
)
self.rowconfigure(0,weight=1)
self.columnconfigure(0,weight=1)
self._listbox = tk.Listbox(self,selectmode=EXTENDED)
scrollbar_y= ttk.Scrollbar(self,command=self._listbox.yview)
scrollbar_x = ttk.Scrollbar(self,command=self._listbox.xview,orient=HORIZONTAL)
self._listbox.config(yscrollcommand=scrollbar_y.set,xscrollcommand=scrollbar_x)
scrollbar_y.config(command=self._listbox.yview)
scrollbar_x.config(command=self._listbox.xview)
self._listbox.grid(row=0,column=0,sticky=(NSEW))
scrollbar_x.grid(row=1,column=0,sticky=(W,E))
scrollbar_y.grid(row=0,column=1,sticky=(N,S,W))
@property
def listbox(self):
return self._listbox
[docs]
class UploadingScrolledListBox(ttk.Labelframe):
def __init__(self,parent,label_frame_title:str,filetypes: tuple[tuple[str,str]]=(("All Files","*"),)):
super().__init__(master=parent,text=label_frame_title)
self.filetypes = filetypes
self.rowconfigure(0,weight=1)
self.rowconfigure(1,weight=1)
self.columnconfigure(0,weight=1)
self.columnconfigure(1,weight=1)
self._scrolled_listbox = ScrolledListbox(self)
self._scrolled_listbox.grid(row=1,column=0,columnspan=2,sticky=NSEW)
self.listbox = self._scrolled_listbox.listbox
add_button = ttk.Button(
master=self,
bootstyle=SUCCESS,
text="Add Files",
command=self._select_files_listbox
)
add_button.grid(row=0,column=0,sticky=NSEW)
delete_button = ttk.Button(
master=self,
bootstyle=DANGER,
text="Delete Files",
command=self._delete_files_listbox
)
delete_button.grid(row=0,column=1,sticky=NSEW)
def _select_files_listbox(self) -> None:
"""Add files selected from filedialogue into listbox, ensuring no duplication
"""
selected_files = filedialog.askopenfilenames(title="Select Files", filetypes=self.filetypes)
if selected_files:
existing_files = set(self.filename_list) # Use a set for efficient lookup
for file in selected_files:
if file not in existing_files: # Check for duplicates
self.listbox.insert(END, file)
existing_files.add(file) # Keep the set updated
else:
print(f"Duplicate file: {file} - not added.")
print(f"Files: {self.filename_list}") # Print updated file list
else:
print("No Files Selected")
def _delete_files_listbox(self) -> None:
"""Delete selected files in the listbox
"""
selection_indices = self.listbox.curselection()
if selection_indices:
# 1. Get the items to delete *before* modifying the listbox
items_to_delete = [self.listbox.get(index) for index in selection_indices]
# 2. Delete from the listbox (reverse order to prevent issues with shifting indices)
for index,item in zip(sorted(selection_indices, reverse=True),sorted(items_to_delete,reverse=True)):
self.listbox.delete(index)
print(f"Deleted files. Remaining: {self.filename_list}")
@property
def filename_list(self) -> list[str]:
return [self.listbox.get(i) for i in range(self.listbox.size())]