From a0da1f501c1910578a0519c5bd479878eaba2678 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?D=C3=A9sir=C3=A9=20Werner=20Menrath?= Date: Sat, 26 Jul 2025 21:54:28 +0200 Subject: [PATCH] commit imagepaths on /usr/local/share --- .../custom_file_dialog.cpython-312.pyc | Bin 41921 -> 43071 bytes audio-32.png | Bin 969 -> 0 bytes audio-64.png | Bin 16671 -> 0 bytes computer-32.png | Bin 4327 -> 0 bytes computer-64.png | Bin 16671 -> 0 bytes custom_file_dialog.py | 514 ++++++++++++------ document-32.png | Bin 524 -> 0 bytes document-64.png | Bin 612 -> 0 bytes file-python-32.png | Bin 1185 -> 0 bytes file-python-64.png | Bin 16671 -> 0 bytes folder-water-32.png | Bin 769 -> 0 bytes folder-water-64.png | Bin 16671 -> 0 bytes folder-water-documents-32.png | Bin 946 -> 0 bytes folder-water-documents-64.png | Bin 16671 -> 0 bytes folder-water-download-32.png | Bin 973 -> 0 bytes folder-water-download-64.png | Bin 16671 -> 0 bytes folder-water-music-32.png | Bin 993 -> 0 bytes folder-water-music-64.png | Bin 16671 -> 0 bytes folder-water-pictures-32.png | Bin 1042 -> 0 bytes folder-water-pictures-64.png | Bin 16671 -> 0 bytes folder-water-video-32.png | Bin 962 -> 0 bytes folder-water-video-64.png | Bin 16671 -> 0 bytes mainwindow.py | 2 +- media-optical-32.png | Bin 1055 -> 0 bytes media-optical-64.png | Bin 2391 -> 0 bytes pdf-32.png | Bin 1070 -> 0 bytes pdf-64.png | Bin 16671 -> 0 bytes picture-32.png | Bin 1441 -> 0 bytes picture-64.png | Bin 16671 -> 0 bytes tar-32.png | Bin 1101 -> 0 bytes tar-64.png | Bin 16671 -> 0 bytes video-32.png | Bin 760 -> 0 bytes video-64.png | Bin 16671 -> 0 bytes warning.png | Bin 1648 -> 0 bytes 34 files changed, 352 insertions(+), 164 deletions(-) delete mode 100644 audio-32.png delete mode 100644 audio-64.png delete mode 100644 computer-32.png delete mode 100644 computer-64.png delete mode 100644 document-32.png delete mode 100644 document-64.png delete mode 100644 file-python-32.png delete mode 100644 file-python-64.png delete mode 100644 folder-water-32.png delete mode 100644 folder-water-64.png delete mode 100644 folder-water-documents-32.png delete mode 100644 folder-water-documents-64.png delete mode 100644 folder-water-download-32.png delete mode 100644 folder-water-download-64.png delete mode 100644 folder-water-music-32.png delete mode 100644 folder-water-music-64.png delete mode 100644 folder-water-pictures-32.png delete mode 100644 folder-water-pictures-64.png delete mode 100644 folder-water-video-32.png delete mode 100644 folder-water-video-64.png delete mode 100644 media-optical-32.png delete mode 100644 media-optical-64.png delete mode 100644 pdf-32.png delete mode 100644 pdf-64.png delete mode 100644 picture-32.png delete mode 100644 picture-64.png delete mode 100644 tar-32.png delete mode 100644 tar-64.png delete mode 100644 video-32.png delete mode 100644 video-64.png delete mode 100644 warning.png diff --git a/__pycache__/custom_file_dialog.cpython-312.pyc b/__pycache__/custom_file_dialog.cpython-312.pyc index 50f3c0255b1dff740272204e2a39816cdc71d696..2723f90333668a20c7bb73aad45cf8145154c010 100644 GIT binary patch delta 14145 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 I@Z01619>jL!!-rhRXk=GE~eugScX*SF7=u*cJ; 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 diff --git a/audio-32.png b/audio-32.png deleted file mode 100644 index 0058d3d6985dfc0f5c877651afd6f834a4faa277..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 969 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7e6l0AZa85pY67#JE_7#My5g&JNk zFq9fFFuY1&V6d9Oz#v{QXIG#N0|R4EfKP}kP{F~Y;fIeU@7&{h{ABg!?FJjSs&Ck$ zcJgff)?J~i*K2Lusu}_F?#a`wTecf*+NN{#MA7k6HOEd=fsEa%cH(r+@l(}6^MMG+ z01BQsU3=<$^MS*Kd-kVq+~&Swjn3)~AWMO0?Iw^iAX>Xot-V)f;Zo(*>s8l)(ZVIl z?L9K#5yGkIV(FP;U}dTh#{+Ey+Om0@{*mK_K*NFNY}lf?d3)ggLj?zq6dpWWxN4oo zvXweZSL&|cth|1+($<|um#?{Cm1~{9et+J%#|{_*A3omL zxyN?fF7s`>EZ@Dq{`TFqZ99Q%iw#>ePM>Z2@#E9!v#skk>h9i~dg5f)@snM<_NJ`e z2=toLLc_;%f$`x~666;Qq)`Evw2U+-SMS3oPad`KNZ#UTQd+pY2yCc%<)kA ziH!7v`_kM~pTB-Jm0L*9z_YvH7SIUBByV?@=#o8CO@JKE0*}aI1_nK45N51cYF`Ev zWH0gbb!C6aF2$vydvf^fh#mumTwK$p4ytff0&t={*-?GV!2VXpp=V;i;bDtS#J$j%-)3u zPRx*wZ4CC%U})RL{QNhB}(r%d;{6I!hl$SAZ;<*&9j?Uh0|Bn9d-h)dO z3^grPO;s&51(!2T;F)qLfI9gY!Fw_dd|!c YYPx+xSsu@SU^p{)y85}Sb4q9e0B%OMtpET3 diff --git a/audio-64.png b/audio-64.png deleted file mode 100644 index 98a91ecabb307d571b4ac04ff7d01be744622410..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16671 zcmeI4TS!zv7{|Za-E!T<+BR52s0<||B&?U{0%>V#qLtM{PuZQIBGF3nA&G*5NGO7? z&`T6SK}9`u!S1Dz-7E^i!iaV^k!{Veb$3rQ)mEH!Ju`FWtb5jTWOmNXeE)Ce`^|Uu zEPHX^qKe`)TZRn)(n?DTD{-Aqigh@CJh!2`9aon11?2?*7aQ%tmBVlw)l?SGMQ@vP zcj89o>XOQGfE^P78g>H&a94vHU~3+Lw+dk95rFh9C$24?jR%IWDl0AoiTs_qdFBxA zN!?Piyar%O7AdIi^qg(DGo`k)yeP$!l97t0w{Oh8g(rd1!h)rB2<7KDHDL?mFbEg~ zhA;s{8~f$U`J?S4M;tdH^L&JmomR(cXEA3Un>FLWdR85;JvD$EO=ai%f}NFpecd2Q zA>R2Eb?L5UAcduUGp6sUQ#2M}V50T$5b$Xld}J-igtk9yuHPGJYgtnR2!(sn zv|NbXcf24_1JE+<<-teV@qj=LAhM`<*IGkJcmM>rmJoCSKuZX^0iYEGT>;Png6;r_ zhM-FTA|dD&fG7yM1|R~0?g6NUkZ=HkLGnf*`$1kTJ!q+KU{xj@fUd3%))@ZUn-JQ` z3L)VDeCccjkLMlmW&(k5=i#QKf2k;(SQN(NKJ0WN@P285_wOG;I4p6^KgwxYhlNz{ zDkU5M6V6GO3x8nX;)v@)@AnZE#HbJjj|*1&)!qU^b^x?-H+$ zdIFiDCIBYq)IfIDTG>>}OGxD|9W%dB{HGB?ak z;Q&TCa+w!F1iU(~$^H`w2k@Won5Tijx0quC4Fm!`0}XSH2?yZuzEE6<+w(lihEDe^ zN~g9%IDnUJCl%M!_Bz^zSEo3cf`M=VU;VeC6ao1b+X$sBvChlq1Ft;jaU1 zb`!jM(+Hp4tuSrs8W@v4<=2u(+COPM4nF@~a5|%>jivkSe)dcEwfkPbI>vaT%&C7n zaPdkG)92RTd&1!J1);b1x6Eoq;BZ)g1Uk^ctCRa&SoW4Gw&<;pd*W=9Ky7yN(>b<- zSI0KXKkI?FA`(x@m0(+b$H6{IqMJ&H(&`c8k{OVB4{*)l9oscW0n& z@+8|hYYNK1-_K)zcB7q0g&r9Qq>Q?c`5rH)p7Y8oX;Qnai zRgvHJ`EdD&3pqCqgFw;}sLmU|0S8w`{x5)_AeVHYv#!k@_ldjGqKd)`bE|g!1jiye A8UO$Q diff --git a/computer-32.png b/computer-32.png deleted file mode 100644 index 4fa092960c118b6d3d5ab5a5460b5245ee77b605..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4327 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzmUKs7M+SzC{oH>NS%G}U;vjb? z#+xT~>Om@#J%W507^>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f-TA0 z-G$*l2rk&Wd@@jkv%n*=n1Ml08H5=tmfDvA1=&kHeO=jKvP zybPRNph5xxkV6103bOpsy*mgMRAk91sbDyOiHhcvWz?txMnhmU1V%$(Gz11b1TZQi zP>ltuG-v@pW}^eR17Ix>E?{*D!t?@g2XHd~r6A-9z6IdEG(SE!NK7QbO z-Yoe4@82JgVxYx;fBg8d`_-#gKVh0-QIE`ri&^KkbF*@CKL<*Z8!BIafB!0ZbaExA z9S8%UxQ53!JOrS!D3VN^+<*TvF#d(5r3Y0Agnr11J|WBd4CE+J LS3j3^P6!lvI6;x#X;^) zj5kl})B`yR$sR$z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBD8ZKG z?e4)< zj|G>y!7R?m#Po-allwV4CztHXMf0%w6|cv*c=TA8_0jM_|!4slN)|Z{9q_<|eG`=%5Ng zTR!B0m=}m~sw*lgIs;WdAXHypp9vm|{{!Vd12M?+ShE4nLJ+FqHju^(PO~WDm8XN` zSxW4{Sq4yI=upx-8URBnwrJs2icFVdQ I&MBb@06RH*%>V!Z diff --git a/custom_file_dialog.py b/custom_file_dialog.py index 5cbabfe..2a311e6 100644 --- a/custom_file_dialog.py +++ b/custom_file_dialog.py @@ -8,9 +8,11 @@ from datetime import datetime SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__)) MAX_ITEMS_TO_DISPLAY = 1000 + def get_icon_path(icon_name): return os.path.join(SCRIPT_DIR, icon_name) + def get_xdg_user_dir(dir_key, fallback_name): home = os.path.expanduser("~") fallback_path = os.path.join(home, fallback_name) @@ -33,6 +35,7 @@ def get_xdg_user_dir(dir_key, fallback_name): pass return fallback_path + class Tooltip: def __init__(self, widget, text, wraplength=250): self.widget = widget @@ -46,11 +49,15 @@ class Tooltip: def enter(self, event=None): self.schedule() def leave(self, event=None): self.unschedule(); self.hide_tooltip() - def schedule(self): self.unschedule(); self.id = self.widget.after(500, self.show_tooltip) + + def schedule(self): self.unschedule( + ); self.id = self.widget.after(500, self.show_tooltip) + def unschedule(self): id = self.id self.id = None - if id: self.widget.after_cancel(id) + if id: + self.widget.after_cancel(id) def show_tooltip(self, event=None): x, y, _, _ = self.widget.bbox("insert") @@ -66,7 +73,9 @@ class Tooltip: def hide_tooltip(self): tw = self.tooltip_window self.tooltip_window = None - if tw: tw.destroy() + if tw: + tw.destroy() + class CustomFileDialog(tk.Toplevel): def __init__(self, parent, initial_dir=None, filetypes=None): @@ -79,7 +88,8 @@ class CustomFileDialog(tk.Toplevel): self.grab_set() self.selected_file = None - self.current_dir = os.path.abspath(initial_dir) if initial_dir else os.path.expanduser("~") + self.current_dir = os.path.abspath( + initial_dir) if initial_dir else os.path.expanduser("~") self.filetypes = filetypes if filetypes else [("Alle Dateien", "*.*")] self.current_filter_pattern = self.filetypes[0][1] self.history = [] @@ -97,22 +107,28 @@ class CustomFileDialog(tk.Toplevel): def load_icons(self): self.icons = {} icon_files = { - 'computer_small': 'computer-32.png', - 'downloads_small': 'folder-water-download-32.png', - 'documents_small': 'folder-water-documents-32.png', - 'pictures_small': 'folder-water-pictures-32.png', - 'music_small': 'folder-water-music-32.png', - 'video_small': 'folder-water-video-32.png', - 'warning_small': 'warning.png', 'warning_large': 'warning.png', - 'folder_large': 'folder-water-64.png', 'file_large': 'document-64.png', - 'python_large': 'file-python-64.png', 'pdf_large': 'pdf-64.png', - 'archive_large': 'tar-64.png', 'audio_large': 'audio-64.png', - 'video_large': 'video-64.png', 'picture_large': 'picture-64.png', - 'iso_large': 'media-optical-64.png', 'folder_small': 'folder-water-32.png', - 'file_small': 'document-32.png', 'python_small': 'file-python-32.png', - 'pdf_small': 'pdf-32.png', 'archive_small': 'tar-32.png', - 'audio_small': 'audio-32.png', 'video_small_file': 'video-32.png', - 'picture_small': 'picture-32.png', 'iso_small': 'media-optical-32.png' + 'computer_small': '/usr/share/icons/lx-icons/32/computer-32.png', + 'computer_large': '/usr/share/icons/lx-icons/48/computer-48.png', + 'downloads_small': '/usr/share/icons/lx-icons/32/folder-water-download-32.png', + 'downloads_large': '/usr/share/icons/lx-icons/482/folder-water-download-48.png', + 'documents_small': '/usr/share/icons/lx-icons/32/folder-water-documents-32.png', + 'documents_large': '/usr/share/icons/lx-icons/48/folder-water-documents-48.png', + 'pictures_small': '/usr/share/icons/lx-icons/32/folder-water-pictures-32.png', + 'pictures_large': '/usr/share/icons/lx-icons/48/folder-water-pictures-48.png', + 'music_small': '/usr/share/icons/lx-icons/32/folder-water-music-32.png', + 'music_large': '/usr/share/icons/lx-icons/48/folder-water-music-48.png', + 'video_small': '/usr/share/icons/lx-icons/32/folder-water-video-32.png', + 'video_large_folder': '/usr/share/icons/lx-icons/48/folder-water-video-48.png', + 'warning_small': '/usr/share/icons/lx-icons/32/warning.png', 'warning_large': '/usr/share/icons/lx-icons/64/warning.png', + 'folder_large': '/usr/share/icons/lx-icons/64/folder-water-64.png', 'file_large': '/usr/share/icons/lx-icons/64/document-64.png', + 'python_large': '/usr/share/icons/lx-icons/64/file-python-64.png', 'pdf_large': '/usr/share/icons/lx-icons/64/pdf-64.png', + 'archive_large': '/usr/share/icons/lx-icons/64/tar-64.png', 'audio_large': '/usr/share/icons/lx-icons/64/audio-64.png', + 'video_large': '/usr/share/icons/lx-icons/64/video-64.png', 'picture_large': '/usr/share/icons/lx-icons/64/picture-64.png', + 'iso_large': '/usr/share/icons/lx-icons/64/media-optical-64.png', 'folder_small': '/usr/share/icons/lx-icons/32/folder-water-32.png', + 'file_small': '/usr/share/icons/lx-icons/32/document-32.png', 'python_small': '/usr/share/icons/lx-icons/32/file-python-32.png', + 'pdf_small': '/usr/share/icons/lx-icons/32/pdf-32.png', 'archive_small': '/usr/share/icons/lx-icons/32/tar-32.png', + 'audio_small': '/usr/share/icons/lx-icons/32/audio-32.png', 'video_small_file': '/usr/share/icons/lx-icons/32/video-32.png', + 'picture_small': '/usr/share/icons/lx-icons/32/picture-32.png', 'iso_small': '/usr/share/icons/lx-icons/32/media-optical-32.png' } for key, filename in icon_files.items(): try: @@ -123,92 +139,175 @@ class CustomFileDialog(tk.Toplevel): def get_file_icon(self, filename, size='large'): ext = os.path.splitext(filename)[1].lower() - if ext == '.svg': return self.icons[f'warning_{size}'] - if ext == '.py': return self.icons[f'python_{size}'] - if ext == '.pdf': return self.icons[f'pdf_{size}'] - if ext in ['.tar', '.zip', '.rar', '.7z', '.gz']: return self.icons[f'archive_{size}'] - if ext in ['.mp3', '.wav', '.ogg', '.flac']: return self.icons[f'audio_{size}'] - if ext in ['.mp4', '.mkv', '.avi', '.mov']: return self.icons[f'video_{size}'] if size == 'large' else self.icons['video_small_file'] - if ext in ['.jpg', '.jpeg', '.png', '.gif', '.bmp']: return self.icons[f'picture_{size}'] - if ext == '.iso': return self.icons[f'iso_{size}'] + if ext == '.svg': + return self.icons[f'warning_{size}'] + if ext == '.py': + return self.icons[f'python_{size}'] + if ext == '.pdf': + return self.icons[f'pdf_{size}'] + if ext in ['.tar', '.zip', '.rar', '.7z', '.gz']: + return self.icons[f'archive_{size}'] + if ext in ['.mp3', '.wav', '.ogg', '.flac']: + return self.icons[f'audio_{size}'] + if ext in ['.mp4', '.mkv', '.avi', '.mov']: + return self.icons[f'video_{size}'] if size == 'large' else self.icons['video_small_file'] + if ext in ['.jpg', '.jpeg', '.png', '.gif', '.bmp']: + return self.icons[f'picture_{size}'] + if ext == '.iso': + return self.icons[f'iso_{size}'] return self.icons[f'file_{size}'] def create_styles(self): style = ttk.Style(self) - self.selection_color = "#D5E5F5"; self.selection_fg_color = "black" - self.icon_bg_color = style.lookup('TFrame', 'background') - style.configure("Item.TFrame", background=self.icon_bg_color) - style.map('Item.TFrame', background=[('selected', self.selection_color)]) - style.configure("Item.TLabel", background=self.icon_bg_color) - style.map('Item.TLabel', background=[('selected', self.selection_color)], foreground=[('selected', self.selection_fg_color)]) - style.configure("Icon.TLabel", background=self.icon_bg_color) - style.map('Icon.TLabel', background=[('selected', self.selection_color)]) - style.configure("Treeview.Heading", relief="raised", borderwidth=1, font=('TkDefaultFont', 10, 'bold')) - style.configure("Treeview", rowheight=28) + base_bg = self.cget('background') + is_dark = sum(self.winfo_rgb(base_bg)) / 3 < 32768 + + if is_dark: + self.selection_color = "#4a6984" # Darker blue for selection + self.sidebar_color = "#2c2c2c" # Slightly lighter dark grey for sidebar + self.icon_bg_color = "#333333" # Main background for content + else: + self.selection_color = "#cce5ff" # Light blue for selection + self.sidebar_color = "#f0f0f0" # Light grey for sidebar + self.icon_bg_color = base_bg # Main background for content + + style.configure("Sidebar.TFrame", background=self.sidebar_color) + style.configure("Sidebar.TButton", + background=self.sidebar_color, anchor="w", padding=5) + style.map("Sidebar.TButton", background=[ + ('active', self.selection_color)]) + style.configure("Content.TFrame", background=self.icon_bg_color) - style.map("Treeview", background=[('selected', self.selection_color)], foreground=[('selected', self.selection_fg_color)]) - ttk.Style().configure("Sidebar.TButton", anchor="w", padding=5) + style.configure("Item.TFrame", background=self.icon_bg_color) + style.map('Item.TFrame', background=[ + ('selected', self.selection_color)]) + style.configure("Item.TLabel", background=self.icon_bg_color) + style.map('Item.TLabel', background=[('selected', self.selection_color)], foreground=[ + ('selected', "black" if not is_dark else "white")]) + style.configure("Icon.TLabel", background=self.icon_bg_color) + style.map('Icon.TLabel', background=[ + ('selected', self.selection_color)]) + + style.configure("Treeview.Heading", relief="raised", + borderwidth=1, font=('TkDefaultFont', 10, 'bold')) + style.configure("Treeview", rowheight=28, + background=self.icon_bg_color, fieldbackground=self.icon_bg_color) + style.map("Treeview", background=[('selected', self.selection_color)], foreground=[ + ('selected', "black" if not is_dark else "white")]) def create_widgets(self): - main_frame = ttk.Frame(self, padding="10"); main_frame.pack(fill="both", expand=True) - paned_window = ttk.PanedWindow(main_frame, orient=tk.HORIZONTAL); paned_window.pack(fill="both", expand=True) + main_frame = ttk.Frame(self, padding="10") + main_frame.pack(fill="both", expand=True) + paned_window = ttk.PanedWindow(main_frame, orient=tk.HORIZONTAL) + paned_window.pack(fill="both", expand=True) - sidebar_frame = ttk.Frame(paned_window, padding=5); paned_window.add(sidebar_frame, weight=0) + sidebar_frame = ttk.Frame( + paned_window, padding=5, style="Sidebar.TFrame") + paned_window.add(sidebar_frame, weight=0) sidebar_frame.grid_rowconfigure(1, weight=1) - sidebar_nav_frame = ttk.Frame(sidebar_frame); sidebar_nav_frame.grid(row=0, column=0, sticky="ew", pady=(0, 10)) - self.back_button = ttk.Button(sidebar_nav_frame, text="◀", command=self.go_back, state=tk.DISABLED, width=3); self.back_button.pack(side="left", fill="x", expand=True) - self.home_button = ttk.Button(sidebar_nav_frame, text="🏠", command=lambda: self.navigate_to(os.path.expanduser("~")), width=3); self.home_button.pack(side="left", fill="x", expand=True, padx=2) - self.forward_button = ttk.Button(sidebar_nav_frame, text="▶", command=self.go_forward, state=tk.DISABLED, width=3); self.forward_button.pack(side="left", fill="x", expand=True) + sidebar_nav_frame = ttk.Frame(sidebar_frame, style="Sidebar.TFrame") + sidebar_nav_frame.grid(row=0, column=0, sticky="ew", pady=(0, 10)) + self.back_button = ttk.Button( + sidebar_nav_frame, text="◀", command=self.go_back, state=tk.DISABLED, width=3) + self.back_button.pack(side="left", fill="x", expand=True) + self.home_button = ttk.Button(sidebar_nav_frame, text="🏠", command=lambda: self.navigate_to( + os.path.expanduser("~")), width=3) + self.home_button.pack(side="left", fill="x", expand=True, padx=2) + self.forward_button = ttk.Button( + sidebar_nav_frame, text="▶", command=self.go_forward, state=tk.DISABLED, width=3) + self.forward_button.pack(side="left", fill="x", expand=True) - sidebar_buttons_frame = ttk.Frame(sidebar_frame); sidebar_buttons_frame.grid(row=1, column=0, sticky="nsew") + sidebar_buttons_frame = ttk.Frame( + sidebar_frame, style="Sidebar.TFrame") + sidebar_buttons_frame.grid(row=1, column=0, sticky="nsew") sidebar_buttons_config = [ - {'name': 'Computer', 'icon': self.icons['computer_small'], 'path': '/'}, - {'name': 'Downloads', 'icon': self.icons['downloads_small'], 'path': get_xdg_user_dir("XDG_DOWNLOAD_DIR", "Downloads")}, - {'name': 'Dokumente', 'icon': self.icons['documents_small'], 'path': get_xdg_user_dir("XDG_DOCUMENTS_DIR", "Documents")}, - {'name': 'Bilder', 'icon': self.icons['pictures_small'], 'path': get_xdg_user_dir("XDG_PICTURES_DIR", "Pictures")}, - {'name': 'Musik', 'icon': self.icons['music_small'], 'path': get_xdg_user_dir("XDG_MUSIC_DIR", "Music")}, - {'name': 'Videos', 'icon': self.icons['video_small'], 'path': get_xdg_user_dir("XDG_VIDEO_DIR", "Videos")}, + {'name': 'Computer', + 'icon': self.icons['computer_small'], 'path': '/'}, + {'name': 'Downloads', 'icon': self.icons['downloads_small'], 'path': get_xdg_user_dir( + "XDG_DOWNLOAD_DIR", "Downloads")}, + {'name': 'Dokumente', 'icon': self.icons['documents_small'], 'path': get_xdg_user_dir( + "XDG_DOCUMENTS_DIR", "Documents")}, + {'name': 'Bilder', 'icon': self.icons['pictures_small'], 'path': get_xdg_user_dir( + "XDG_PICTURES_DIR", "Pictures")}, + {'name': 'Musik', 'icon': self.icons['music_small'], 'path': get_xdg_user_dir( + "XDG_MUSIC_DIR", "Music")}, + {'name': 'Videos', 'icon': self.icons['video_small'], 'path': get_xdg_user_dir( + "XDG_VIDEO_DIR", "Videos")}, ] for config in sidebar_buttons_config: - btn = ttk.Button(sidebar_buttons_frame, text=f" {config['name']}", image=config['icon'], compound="left", command=lambda p=config['path']: self.navigate_to(p), style="Sidebar.TButton"); btn.pack(fill="x", pady=1) + btn = ttk.Button(sidebar_buttons_frame, text=f" {config['name']}", image=config['icon'], + compound="left", command=lambda p=config['path']: self.navigate_to(p), style="Sidebar.TButton") + btn.pack(fill="x", pady=1) - content_frame = ttk.Frame(paned_window, padding=(5, 0, 0, 0)); paned_window.add(content_frame, weight=1) - content_frame.grid_rowconfigure(1, weight=1); content_frame.grid_columnconfigure(0, weight=1) + content_frame = ttk.Frame(paned_window, padding=(5, 0, 0, 0)) + paned_window.add(content_frame, weight=1) + content_frame.grid_rowconfigure(2, weight=1) + content_frame.grid_columnconfigure(0, weight=1) - top_bar = ttk.Frame(content_frame); top_bar.grid(row=0, column=0, sticky="ew", pady=(5, 5)); top_bar.grid_columnconfigure(0, weight=1) - self.path_entry = ttk.Entry(top_bar); self.path_entry.grid(row=0, column=0, sticky="ew"); self.path_entry.bind("", lambda e: self.navigate_to(self.path_entry.get())) - self.hidden_files_button = ttk.Checkbutton(top_bar, text="Versteckte Dateien", variable=self.show_hidden_files, command=self.populate_files); self.hidden_files_button.grid(row=0, column=1, padx=5) - view_switch = ttk.Frame(top_bar, padding=(5, 0)); view_switch.grid(row=0, column=2) - ttk.Radiobutton(view_switch, text="Kacheln", variable=self.view_mode, value="icons", command=self.populate_files).pack(side="left") - ttk.Radiobutton(view_switch, text="Liste", variable=self.view_mode, value="list", command=self.populate_files).pack(side="left") - self.filter_combobox = ttk.Combobox(top_bar, values=[ft[0] for ft in self.filetypes], state="readonly", width=20); self.filter_combobox.grid(row=0, column=3, padx=5) - self.filter_combobox.bind("<>", self.on_filter_change); self.filter_combobox.set(self.filetypes[0][0]) + top_bar = ttk.Frame(content_frame) + top_bar.grid(row=0, column=0, sticky="ew", pady=(5, 0)) + top_bar.grid_columnconfigure(0, weight=1) + self.path_entry = ttk.Entry(top_bar) + self.path_entry.grid(row=0, column=0, sticky="ew") + self.path_entry.bind( + "", lambda e: self.navigate_to(self.path_entry.get())) + self.hidden_files_button = ttk.Checkbutton( + top_bar, text="Versteckte Dateien", variable=self.show_hidden_files, command=self.populate_files) + self.hidden_files_button.grid(row=0, column=1, padx=5) + view_switch = ttk.Frame(top_bar, padding=(5, 0)) + view_switch.grid(row=0, column=2) + ttk.Radiobutton(view_switch, text="Kacheln", variable=self.view_mode, + value="icons", command=self.populate_files).pack(side="left") + ttk.Radiobutton(view_switch, text="Liste", variable=self.view_mode, + value="list", command=self.populate_files).pack(side="left") + self.filter_combobox = ttk.Combobox( + top_bar, values=[ft[0] for ft in self.filetypes], state="readonly", width=20) + self.filter_combobox.grid(row=0, column=3, padx=5) + self.filter_combobox.bind( + "<>", self.on_filter_change) + self.filter_combobox.set(self.filetypes[0][0]) - self.file_list_frame = ttk.Frame(content_frame, style="Content.TFrame"); self.file_list_frame.grid(row=1, column=0, sticky="nsew"); self.bind("", self.on_window_resize) + ttk.Separator(content_frame, orient='horizontal').grid( + row=1, column=0, sticky="ew", pady=5) - bottom_frame = ttk.Frame(content_frame); bottom_frame.grid(row=2, column=0, sticky="ew", pady=(5, 0)); bottom_frame.grid_columnconfigure(0, weight=1) - self.status_bar = ttk.Label(bottom_frame, text="", anchor="w"); self.status_bar.grid(row=0, column=0, sticky="ew") - action_buttons_frame = ttk.Frame(bottom_frame); action_buttons_frame.grid(row=0, column=1) - ttk.Button(action_buttons_frame, text="Öffnen", command=self.on_open).pack(side="right") - ttk.Button(action_buttons_frame, text="Abbrechen", command=self.on_cancel).pack(side="right", padx=5) + self.file_list_frame = ttk.Frame(content_frame, style="Content.TFrame") + self.file_list_frame.grid(row=2, column=0, sticky="nsew") + self.bind("", self.on_window_resize) + + bottom_frame = ttk.Frame(content_frame) + bottom_frame.grid(row=3, column=0, sticky="ew", pady=(5, 0)) + bottom_frame.grid_columnconfigure(0, weight=1) + self.status_bar = ttk.Label(bottom_frame, text="", anchor="w") + self.status_bar.grid(row=0, column=0, sticky="ew") + action_buttons_frame = ttk.Frame(bottom_frame) + action_buttons_frame.grid(row=0, column=1) + ttk.Button(action_buttons_frame, text="Öffnen", + command=self.on_open).pack(side="right") + ttk.Button(action_buttons_frame, text="Abbrechen", + command=self.on_cancel).pack(side="right", padx=5) def on_window_resize(self, event): new_width = self.file_list_frame.winfo_width() if self.view_mode.get() == "icons" and abs(new_width - self.last_width) > 50: - if self.resize_job: self.after_cancel(self.resize_job) + if self.resize_job: + self.after_cancel(self.resize_job) self.resize_job = self.after(200, self.populate_files) self.last_width = new_width def populate_files(self): - for widget in self.file_list_frame.winfo_children(): widget.destroy() - self.path_entry.delete(0, tk.END); self.path_entry.insert(0, self.current_dir) + for widget in self.file_list_frame.winfo_children(): + widget.destroy() + self.path_entry.delete(0, tk.END) + self.path_entry.insert(0, self.current_dir) self.selected_file = None - # Clear status bar before populating, but preserve important warnings current_status = self.status_bar.cget("text") - if not current_status.startswith("Zeige"): self.update_status_bar() - if self.view_mode.get() == "list": self.populate_list_view() - else: self.populate_icon_view() + if not current_status.startswith("Zeige"): + self.update_status_bar() + if self.view_mode.get() == "list": + self.populate_list_view() + else: + self.populate_icon_view() def _get_sorted_items(self): try: @@ -218,96 +317,146 @@ class CustomFileDialog(tk.Toplevel): if num_items > MAX_ITEMS_TO_DISPLAY: warning_message = f"Zeige {MAX_ITEMS_TO_DISPLAY} von {num_items} Einträgen." items = items[:MAX_ITEMS_TO_DISPLAY] - dirs = sorted([d for d in items if os.path.isdir(os.path.join(self.current_dir, d))], key=str.lower) - files = sorted([f for f in items if not os.path.isdir(os.path.join(self.current_dir, f))], key=str.lower) + dirs = sorted([d for d in items if os.path.isdir( + os.path.join(self.current_dir, d))], key=str.lower) + files = sorted([f for f in items if not os.path.isdir( + os.path.join(self.current_dir, f))], key=str.lower) return (dirs + files, None, warning_message) - except PermissionError: return ([], "Zugriff verweigert.", None) - except FileNotFoundError: return ([], "Verzeichnis nicht gefunden.", None) + except PermissionError: + return ([], "Zugriff verweigert.", None) + except FileNotFoundError: + return ([], "Verzeichnis nicht gefunden.", None) def populate_icon_view(self): - canvas = tk.Canvas(self.file_list_frame, highlightthickness=0, bg=self.icon_bg_color) - v_scrollbar = ttk.Scrollbar(self.file_list_frame, orient="vertical", command=canvas.yview) - canvas.pack(side="left", fill="both", expand=True); v_scrollbar.pack(side="right", fill="y") + canvas = tk.Canvas(self.file_list_frame, + highlightthickness=0, bg=self.icon_bg_color) + v_scrollbar = ttk.Scrollbar( + self.file_list_frame, orient="vertical", command=canvas.yview) + canvas.pack(side="left", fill="both", expand=True) + v_scrollbar.pack(side="right", fill="y") container_frame = ttk.Frame(canvas, style="Content.TFrame") canvas.create_window((0, 0), window=container_frame, anchor="nw") - container_frame.bind("", lambda e: canvas.configure(scrollregion=canvas.bbox("all"))) + container_frame.bind("", lambda e: canvas.configure( + scrollregion=canvas.bbox("all"))) def _on_mouse_wheel(event): - if event.num == 4 or event.delta > 0: canvas.yview_scroll(-1, "units") - elif event.num == 5 or event.delta < 0: canvas.yview_scroll(1, "units") - - for widget in [canvas, container_frame]: - widget.bind("", _on_mouse_wheel); widget.bind("", _on_mouse_wheel); widget.bind("", _on_mouse_wheel) + delta = -1 if event.num == 4 else 1 + canvas.yview_scroll(delta, "units") + + canvas.bind_all("", _on_mouse_wheel) + canvas.bind_all("", _on_mouse_wheel) + canvas.bind_all("", _on_mouse_wheel) items, error, warning = self._get_sorted_items() - if warning: self.status_bar.config(text=warning) - if error: ttk.Label(container_frame, text=error).pack(pady=20); return + if warning: + self.status_bar.config(text=warning) + if error: + ttk.Label(container_frame, text=error).pack(pady=20) + return - item_width, item_height = 115, 100 + item_width, item_height = 110, 100 frame_width = self.file_list_frame.winfo_width() col_count = max(1, frame_width // item_width) row, col = 0, 0 for name in items: - if not self.show_hidden_files.get() and name.startswith('.'): continue + if not self.show_hidden_files.get() and name.startswith('.'): + continue path = os.path.join(self.current_dir, name) is_dir = os.path.isdir(path) - if not is_dir and not self._matches_filetype(name): continue + if not is_dir and not self._matches_filetype(name): + continue - item_frame = ttk.Frame(container_frame, width=item_width, height=item_height, style="Item.TFrame") - item_frame.grid(row=row, column=col, padx=5, pady=5); item_frame.grid_propagate(False) - icon = self.icons['folder_large'] if is_dir else self.get_file_icon(name, 'large') - icon_label = ttk.Label(item_frame, image=icon, style="Icon.TLabel"); icon_label.pack(pady=(10, 5)) - name_label = ttk.Label(item_frame, text=self.shorten_text(name, 15), anchor="center", style="Item.TLabel"); name_label.pack(fill="x", expand=True) + item_frame = ttk.Frame( + container_frame, width=item_width, height=item_height, style="Item.TFrame") + item_frame.grid(row=row, column=col, padx=5, pady=5) + item_frame.grid_propagate(False) + icon = self.icons['folder_large'] if is_dir else self.get_file_icon( + name, 'large') + icon_label = ttk.Label(item_frame, image=icon, style="Icon.TLabel") + icon_label.pack(pady=(10, 5)) + name_label = ttk.Label(item_frame, text=self.shorten_text( + name, 14), anchor="center", style="Item.TLabel") + name_label.pack(fill="x", expand=True) Tooltip(item_frame, name) for widget in [item_frame, icon_label, name_label]: - widget.bind("", lambda e, p=path: self.on_item_double_click(p)) - widget.bind("", lambda e, p=path, f=item_frame: self.on_item_select(p, f)) - widget.bind("", _on_mouse_wheel); widget.bind("", _on_mouse_wheel); widget.bind("", _on_mouse_wheel) + widget.bind("", lambda e, + p=path: self.on_item_double_click(p)) + widget.bind("", lambda e, p=path, + f=item_frame: self.on_item_select(p, f)) col = (col + 1) % col_count - if col == 0: row += 1 + if col == 0: + row += 1 def populate_list_view(self): - tree_frame = ttk.Frame(self.file_list_frame); tree_frame.pack(fill='both', expand=True) - columns = ("name", "size", "type", "modified"); self.tree = ttk.Treeview(tree_frame, columns=columns, show="headings") - self.tree.heading("name", text="Name", anchor="w"); self.tree.column("name", anchor="w", width=300, stretch=True) - self.tree.heading("size", text="Größe", anchor="e"); self.tree.column("size", anchor="e", width=120, stretch=False) - self.tree.heading("type", text="Typ", anchor="w"); self.tree.column("type", anchor="w", width=120, stretch=False) - self.tree.heading("modified", text="Geändert am", anchor="w"); self.tree.column("modified", anchor="w", width=160, stretch=False) - v_scrollbar = ttk.Scrollbar(tree_frame, orient="vertical", command=self.tree.yview); h_scrollbar = ttk.Scrollbar(tree_frame, orient="horizontal", command=self.tree.xview) - self.tree.configure(yscrollcommand=v_scrollbar.set, xscrollcommand=h_scrollbar.set) - self.tree.pack(side="left", fill="both", expand=True); v_scrollbar.pack(side="right", fill="y"); h_scrollbar.pack(side="bottom", fill="x") - self.tree.bind("", self.on_list_double_click); self.tree.bind("<>", self.on_list_select) + tree_frame = ttk.Frame(self.file_list_frame) + tree_frame.pack(fill='both', expand=True) + columns = ("name", "size", "type", "modified") + self.tree = ttk.Treeview(tree_frame, columns=columns, show="headings") + self.tree.heading("name", text="Name", anchor="w") + self.tree.column("name", anchor="w", width=300, stretch=True) + self.tree.heading("size", text="Größe", anchor="e") + self.tree.column("size", anchor="e", width=120, stretch=False) + self.tree.heading("type", text="Typ", anchor="w") + self.tree.column("type", anchor="w", width=120, stretch=False) + self.tree.heading("modified", text="Geändert am", anchor="w") + self.tree.column("modified", anchor="w", width=160, stretch=False) + v_scrollbar = ttk.Scrollbar( + tree_frame, orient="vertical", command=self.tree.yview) + h_scrollbar = ttk.Scrollbar( + tree_frame, orient="horizontal", command=self.tree.xview) + self.tree.configure(yscrollcommand=v_scrollbar.set, + xscrollcommand=h_scrollbar.set) + self.tree.pack(side="left", fill="both", expand=True) + v_scrollbar.pack(side="right", fill="y") + h_scrollbar.pack(side="bottom", fill="x") + self.tree.bind("", self.on_list_double_click) + self.tree.bind("<>", self.on_list_select) items, error, warning = self._get_sorted_items() - if warning: self.status_bar.config(text=warning) - if error: self.tree.insert("", "end", values=(error,)); return + if warning: + self.status_bar.config(text=warning) + if error: + self.tree.insert("", "end", values=(error,)) + return for name in items: - if not self.show_hidden_files.get() and name.startswith('.'): continue - path = os.path.join(self.current_dir, name); is_dir = os.path.isdir(path) - if not is_dir and not self._matches_filetype(name): continue + if not self.show_hidden_files.get() and name.startswith('.'): + continue + path = os.path.join(self.current_dir, name) + is_dir = os.path.isdir(path) + if not is_dir and not self._matches_filetype(name): + continue try: - stat = os.stat(path); modified_time = datetime.fromtimestamp(stat.st_mtime).strftime('%d.%m.%Y %H:%M') + stat = os.stat(path) + modified_time = datetime.fromtimestamp( + stat.st_mtime).strftime('%d.%m.%Y %H:%M') if is_dir: icon, file_type, size = self.icons['folder_small'], "Ordner", "" else: - icon, file_type, size = self.get_file_icon(name, 'small'), "Datei", self._format_size(stat.st_size) - self.tree.insert("", "end", text=name, image=icon, values=(name, size, file_type, modified_time)) - except (FileNotFoundError, PermissionError): continue + icon, file_type, size = self.get_file_icon( + name, 'small'), "Datei", self._format_size(stat.st_size) + self.tree.insert("", "end", text=name, image=icon, values=( + name, size, file_type, modified_time)) + except (FileNotFoundError, PermissionError): + continue def on_item_select(self, path, item_frame): if hasattr(self, 'selected_item_frame') and self.selected_item_frame.winfo_exists(): self.selected_item_frame.state(['!selected']) for child in self.selected_item_frame.winfo_children(): - if isinstance(child, ttk.Label): child.state(['!selected']) - item_frame.state(['selected']); + if isinstance(child, ttk.Label): + child.state(['!selected']) + item_frame.state(['selected']) for child in item_frame.winfo_children(): - if isinstance(child, ttk.Label): child.state(['selected']) - self.selected_item_frame = item_frame; self.selected_file = path + if isinstance(child, ttk.Label): + child.state(['selected']) + self.selected_item_frame = item_frame + self.selected_file = path self.update_status_bar() def on_list_select(self, event): - if not self.tree.selection(): return + if not self.tree.selection(): + return item_id = self.tree.selection()[0] item_text = self.tree.item(item_id, 'values')[0] self.selected_file = os.path.join(self.current_dir, item_text) @@ -315,92 +464,131 @@ class CustomFileDialog(tk.Toplevel): def _handle_unsupported_file(self, path): if path.lower().endswith('.svg'): - self.status_bar.config(text="SVG-Dateien werden nicht unterstützt.") + self.status_bar.config( + text="SVG-Dateien werden nicht unterstützt.") return True return False def on_item_double_click(self, path): - if self._handle_unsupported_file(path): return - if os.path.isdir(path): self.navigate_to(path) - else: self.selected_file = path; self.destroy() + if self._handle_unsupported_file(path): + return + if os.path.isdir(path): + self.navigate_to(path) + else: + self.selected_file = path + self.destroy() def on_list_double_click(self, event): - if not self.tree.selection(): return + if not self.tree.selection(): + return item_id = self.tree.selection()[0] item_text = self.tree.item(item_id, 'values')[0] path = os.path.join(self.current_dir, item_text) - if self._handle_unsupported_file(path): return - if os.path.isdir(path): self.navigate_to(path) - else: self.selected_file = path; self.destroy() + if self._handle_unsupported_file(path): + return + if os.path.isdir(path): + self.navigate_to(path) + else: + self.selected_file = path + self.destroy() def on_filter_change(self, event): selected_desc = self.filter_combobox.get() for desc, pattern in self.filetypes: - if desc == selected_desc: self.current_filter_pattern = pattern; break + if desc == selected_desc: + self.current_filter_pattern = pattern + break self.populate_files() def navigate_to(self, path): try: - real_path = os.path.realpath(os.path.abspath(os.path.expanduser(path))) + real_path = os.path.realpath( + os.path.abspath(os.path.expanduser(path))) if not os.path.isdir(real_path): - self.status_bar.config(text=f"Fehler: Verzeichnis '{os.path.basename(path)}' nicht gefunden."); return + self.status_bar.config( + text=f"Fehler: Verzeichnis '{os.path.basename(path)}' nicht gefunden.") + return if not os.access(real_path, os.R_OK): - self.status_bar.config(text=f"Zugriff auf '{os.path.basename(path)}' verweigert."); return + self.status_bar.config( + text=f"Zugriff auf '{os.path.basename(path)}' verweigert.") + return self.current_dir = real_path - if self.history_pos < len(self.history) - 1: self.history = self.history[:self.history_pos + 1] + if self.history_pos < len(self.history) - 1: + self.history = self.history[:self.history_pos + 1] if not self.history or self.history[-1] != self.current_dir: - self.history.append(self.current_dir); self.history_pos = len(self.history) - 1 - self.populate_files(); self.update_nav_buttons() - except Exception as e: self.status_bar.config(text=f"Fehler: {e}") + self.history.append(self.current_dir) + self.history_pos = len(self.history) - 1 + self.populate_files() + self.update_nav_buttons() + except Exception as e: + self.status_bar.config(text=f"Fehler: {e}") def go_back(self): if self.history_pos > 0: - self.history_pos -= 1; self.current_dir = self.history[self.history_pos] - self.populate_files(); self.update_nav_buttons() + self.history_pos -= 1 + self.current_dir = self.history[self.history_pos] + self.populate_files() + self.update_nav_buttons() def go_forward(self): if self.history_pos < len(self.history) - 1: - self.history_pos += 1; self.current_dir = self.history[self.history_pos] - self.populate_files(); self.update_nav_buttons() + self.history_pos += 1 + self.current_dir = self.history[self.history_pos] + self.populate_files() + self.update_nav_buttons() def update_nav_buttons(self): - self.back_button.config(state=tk.NORMAL if self.history_pos > 0 else tk.DISABLED) - self.forward_button.config(state=tk.NORMAL if self.history_pos < len(self.history) - 1 else tk.DISABLED) + self.back_button.config( + state=tk.NORMAL if self.history_pos > 0 else tk.DISABLED) + self.forward_button.config(state=tk.NORMAL if self.history_pos < len( + self.history) - 1 else tk.DISABLED) def update_status_bar(self): try: - _, _, free = shutil.disk_usage(self.current_dir); free_str = self._format_size(free) + _, _, free = shutil.disk_usage(self.current_dir) + free_str = self._format_size(free) status_text = f"Freier Speicher: {free_str}" if self.selected_file and os.path.exists(self.selected_file) and not os.path.isdir(self.selected_file): - size = os.path.getsize(self.selected_file); size_str = self._format_size(size) + size = os.path.getsize(self.selected_file) + size_str = self._format_size(size) status_text += f" | '{os.path.basename(self.selected_file)}' Größe: {size_str}" self.status_bar.config(text=status_text) - except FileNotFoundError: self.status_bar.config(text="Verzeichnis nicht gefunden") + except FileNotFoundError: + self.status_bar.config(text="Verzeichnis nicht gefunden") def on_open(self): if self.selected_file and os.path.isfile(self.selected_file): - if self._handle_unsupported_file(self.selected_file): return + if self._handle_unsupported_file(self.selected_file): + return self.destroy() def on_cancel(self): - self.selected_file = None; self.destroy() + self.selected_file = None + self.destroy() def get_selected_file(self): return self.selected_file def _matches_filetype(self, filename): - if self.current_filter_pattern == "*.*": return True - patterns = self.current_filter_pattern.replace("*.", "").lower().split() + if self.current_filter_pattern == "*.*": + return True + patterns = self.current_filter_pattern.replace( + "*.", "").lower().split() fn_lower = filename.lower() for p in patterns: - if fn_lower.endswith(p): return True + if fn_lower.endswith(p): + return True return False def _format_size(self, size_bytes): - if size_bytes is None: return "" - if size_bytes < 1024: return f"{size_bytes} B" - if size_bytes < 1024**2: return f"{size_bytes/1024:.1f} KB" - if size_bytes < 1024**3: return f"{size_bytes/1024**2:.1f} MB" + if size_bytes is None: + return "" + if size_bytes < 1024: + return f"{size_bytes} B" + if size_bytes < 1024**2: + return f"{size_bytes/1024:.1f} KB" + if size_bytes < 1024**3: + return f"{size_bytes/1024**2:.1f} MB" return f"{size_bytes/1024**3:.1f} GB" def shorten_text(self, text, max_len): diff --git a/document-32.png b/document-32.png deleted file mode 100644 index a9df0458b8d26d0bc6cea5736e54e16e7e09ce0d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 524 zcmV+n0`vWeP)kdg0000WV@Og>004R> z004l5008;`004mK004C`008P>0026e000+ooVrmw00002VoOIv0RM-N%)bBt010qN zS#tmYE+YT{E+YYWr9XB6000McNliru=?5ALBrhkm(kK7`0dYx0K~zY`<&-f_!$1&4 z|E!$^8>dJ*BxFh`;4lPg?f{nH00;>xT59e97eRu8h9U@25CstwM>abY#IfTY#~Ub_ z${vs3{y#grz#oIMhgZNyCx0)LaC4x?-Nk@D*jJ~t563J~x_#X^*P|5?;Lb=L?&(lo zMIABoMJytw00syRK|dG(Jc<;wh)|gmlI-W-PL54aqE63eBll4yu}`(gvMtt@tPd~AjEhtCVc0hc{O>qQ~(e>c=IVI7qnCp zr7#q5|N&|(tH7BpJOFKcteMGL!g7MkLoR00?Zfsvy+Knk!*l_=88 z=|po0@QBah#!b6N?n1o)K%9QuJ`IC1oN?Igt}BZRM(aWUazOQkcJU3Ddw+qye5qjo O0000T diff --git a/document-64.png b/document-64.png deleted file mode 100644 index f6cb0c8ae23306f90256afee391fe146d0818738..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 612 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=Ea{HEjtmSN`?>!lvI6;x#X;^) zj5kl})B`yR$sR$z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBD8ZKG z?e4LI=9d?jl|Dc~fL5NdOhAF7FbAtPYyVEb&b~jD2vMLRiKYFyifU{)P(uJ80 ztAm)H`b~eN(Ye$5{o?=sr#$4C9{>KeeG7-XUR?I8+a;aWsCerq> zR)9r(8^a$n>0qz9noG~*o%nwK^{%?NU#r5+7+fy5daV?`%>RG0rlQ{KUHeM88akY2 zZ_ea)oN#z!;{%fhUY6&KKFS*y3_1_69S~vCW)S9h!%(8Uf#pKy0Wk-0rfddTjyH_E zlq}dc#I4`0aAyPiidCyldrE9`E#O=)O>5^>-7a!qO#+ zG%|L^Oq%k^|9i*d8Ix2#Mlikb+JFChL|?;KHb!7z0YOe-&0TYuUN<-MIjNF<3=Af0 z>kmmVZefUGP;L-&;7(w)CYul+bD15iL6q`g6oLGvm5^!7jYVT+TPE)wPWqo=^7_M279{txvXz82)Gli%yP;sg-e+R@{wanMBC0yS9$VP|4VaXoZMDI=y7 z0Dx6=6eAJt4*S#WEx0l|ZcObP8BvLG0DR*LKnWKB1EfmS09^9{K*ItcxDf!G{M*8W zlK>by#eaM@912!eR#sP634++(-o|l!cXwB%QY|elp(r{$JWP@#6ugE;qgh*9gBpcG zp?n3kTCLOR3+4#r7GBNI&r79Jm_q&v0)ap* z7Q>{Fgy`+<&CkzA5QNL+LNQGBIyejhQ|tA5=maZ)(H0jM=jP^coKO&iQbDK`gy<>W zIxepoz}m*;VhKJyhkwzA(JD|6MCOUePL!hOo6)H`yk$(zo0MPe#JoAEH%I1$$ZCh= zN~Hqde+MpE#{XW#OYdP)9m#7};gNIhI4nmt$*DAFj-kBM+`v9BRoW`3@w{ z(a;yBTz)(&!Rghgf0;C|R!~>ZZK!8AHXy>*96isI-wVGLqD9ZUYJr!MgNIzuTPh%q%#DefZfkr`iBmG zNkCB|GYRf*K%v@E%_-kwgq&+hmFYQ_c7z@d#6rh0!>CkLW>Kg5S7UM5%g0UcG7jC0 zF2+VOEbQke_YL#>sMJCLyqx!^(N~?Pzl5Y|QFL6m>58c><$YhN@L4SMX^3Woou&Pm z!E!j@v$3`@VKfGg2v7F6)(Fh(DsEKvx4PHV_|ZY3TlRZ?*4=#tNAp=(d2T=SAgN)8 z!r66)n<$nh>f=7vt^DzJkZf|-IEPwe?Edv7>ws>GNA8SP8y1=z_tUXoj8B+Gn$6A< zp-E^arj=_na?4~sZ~W$GNb_)cd6x~-M6?_-di|vlJ52QSU0Q0&(1CKUp}aJb5fL6a z&GK~&@CtGCbqfk|@%KCxY)fYsMr55EJRKhr^g*EaSnEN0Si-&ZL|S}s&`8HX_elFk zwsGvj^T~z?k>oR@E&oU4c`xZ|hiiU_}zmTtz&k=&}CgyYX6g-wDbz+zV@F3bC(9P@vNGi4=J=?2ikl`F1Z}c zWfv3;(Ap?NMY>HZ%fCw4qjwJ3cq9~1n;S2JBN=(^1tFmM`LM~khcU2)07Qo~89irM F$p4XTj(q?C diff --git a/file-python-64.png b/file-python-64.png deleted file mode 100644 index 9bbed593c0fc4f1e6381ca9204ded61f3aab98e5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16671 zcmeI4e`p(39KgSKxix9BG#R?ZrI{T}q>9Qg7OW1|&ek?=oom^^A5*8|O8=WoT~SMm z_{RjnKPsZG;7~-+ZZHPQ9Ag_YaDQwl7DiYR8oOjk3tQTnrfYKN_q#1c;$8FZ?%gfH ze9QIj-ur&v`+h%n@7;UvuKj4o_71N*=mr39q_eFD_bs%!YVh~>eQ*AWJE^y|s}>-r3Uy@b3KpLmvX%z@(w80B>&uNbLc5;&Xt&zLB51 zH(^H2Yg;?oK%t+*r@kA;l-hlr&+i9#WCLwN|F@gp!9?dC>oDl`4TMf&Vc9fi?DMG6Y6g#v#3iWd~q-dRlJ`OZo_55NDCPAe0?| zR4N7WcpOaJ34@tT=8GjNB@UQZgeE5^l@euf$6bEMgmr|357yTv6WpDPz%P&v?>5A=~hD7%&WpYf|*P!@MBbl-{K0S<^Zy}Tcx_t zi@-{NjX@EfX%wKoj;Zy{wB?>>3*Q1T7Gw(y8RI&BNrrix^Blj#79`o&A+|jczQ)dw zwsI5h0I2h$_D@Z~>{YBkxA_(?L4=$u1hb(RAhRaIl_6IE^w^``oVzG8Nb@mRb@?EO zH?F}Pg5V|G`T!d6&@5!wmq9_DT(S^my&i@Jvwh;JJECPf^S2YE-kV zjcVraIMn4SL67z_nKONnTUFcuBypV2Q=Yr~gl2J4Hm;ecH-lRzSeWGKb>QFnB950f z_!nT8|0mcb(PxnABIM`QGYq7115m2&<~38$>;DQKRL;N(SSY1#TRt}cH00H~3z}Ca z;WHmTx;S+cilderAZ~pC&F!_M&yU~xa+I74zy9SU+yKzRhL$wKd95r%=?lKFAv-lA zZLig|mr0{l9a`8>6P|5e5hVC~EzbEk2{!<=q(!SbR?AGo8#m_#yz1fB36ev!q_qnB zCtBE`xxLxR&{B{z8LC|ev-L0HWT;~)na2TF0OZh9_ldX_xpuDTobmL^lV=$Jl)IdcEdXdGhehfp4ngqOPN_A;DUQoB#GP?#fQ+6SM2M z(Tf9PpPQ9kNL7cb1k?$1KK8@Mn6s7sFMzs+?$k}5_kS5qc8`%^q+b_KhaRbm9zMG!; z@BIoyavH`?llQu%E!)przx(RhlNV1PThBe;f9~zh`pB}W#SCy!<} zG&EQ-${Z7ZA_Ig^WPl_PiJm>f>^X6YCo?0Hz`@(wfaWkJdAqx$>0G&~3gmDWctjR6 zFz6|RFk{71`!b*)dx@v7EBi}!DJ~Ub<1KyZK%tACE{-7)55(H#e+ACg47Z?|;T=lcHt<^oD=|q6NGpiXJpYr1sFJ?sOD5zPTy3x_x zc>IWoo}Ho~w?{|6vGMcN2b(wecpYP$q_g&i#E-SPK|#SAny!dQXVz$82)<`A7Y_810eX(X M)78&qol`;+0O7AUPyhe` diff --git a/folder-water-64.png b/folder-water-64.png deleted file mode 100644 index 771c805aa53ca3d8670a9ecef09ac28b8de989dd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16671 zcmeHPTS!zv82-<3-E}S93MCOAj6z$p%Yy}llDlXsrkK=2SYicMSW%c73AJ5btRN_g zf}kFXKq2h%5P_OKRrI2XT|_IWG<`79Roly%{;{;vnQ-D=i0065C36YK)W&oB%Eu!J^aI4 zVDwW>63!ed%P`Lv0tT5}dGqS}A*icUraIqDjgz$#J4f7`N8R3Ofv0m)?p$64 z`bXU0bdxe`%D$WUTE`Hsy?&r=h5)w$(~-T;_=jCy7;-7a)|xbYmz`aSAz(VP=Rq4m zRXN>Csr7v0P1sgTKLyN+#7Hvg#N(;o_g)a&0@MKnqE7cUx(8voS$jRd1kA_hc*Xh{urIODdsjPtR@#Fu1sb{r;KK7B zeEN7NVnpRFm@s}<{1Q-!;PVp~YRAoLn=Vwr@?SAKo_(2!)z=fw?~>YZ<%2cZmqhvv z-7f*bB70v*BTXT`nkTifw*XPVJJ1JYbO_&P>8pG4qyfQZc)C0Ai&q(Ba|FndQB3#@ z0g|&HRwP*=dga=&&Idm+V}h!|R&ro0-oDo_;eAIZ6FWmdVqyYBC#NtSgS{bofQ0P z06Yd%zPU?=3M8*82;i}!2cJ-Y9#)x$Q7C}NjvjnM0eVAetqF^SsF!EAdvTk2n4s;YK=?d((I@O5aHk`jlR9=c-)QV$NIIz2hrkNGp^ zKc^^z2!IGxFd!HZ3$uV`KrnI?v(`sWoogpVPKjWUg+b_KhaRbm9zMG!; z@BIoyavH`?llQu%E!)przx(RhlNV1PThBe;f9~z=MA0J4h1dW8|6ehu zp#whCB^Mk>mf)+R8k+Y4jZ+Dlb?#=&QfE>;OkH}&M20djEW~^9hUj`IpFY)ws zWq-*o#ie3;>$)~DZ87S3x;TbdoK8+yV4EN!C@S2}!0D-}=EHjClF__40R?UK^M|?? zHuySTlxC}$G9~oJMbUy4tA1Aec52+dt4&QNBeVPEiz1_fmzq_-f3hENNDz==X|H%G zU0__Wa@Eh)wpRCqrV|17&a7r^e9DhkyqFQ8qo8JW>PAO%UT6 zA8g*><8_R2lFr&65HPtX%N8uyuwuuK6-z`GGWj}2R=TF9rn-8Dn(_&s%5vb+%6|RoqxK37edPrU z+S<5IaqeK0;X5!PL*sz>B+HvOduQGdb$HBVX?DTq0E+@^Q`tAq9Zx39ykU`Sk(oOu qwtyi$+&nSiQ2F-*oOf1EEN3(+})T zbMHO(p5O1Bci&C8w5_hTA}eEN1^{GLRhHLdSw^pEdi*^3&G-FS=(bpEtN>^CXL>fI zqb@YnSJ;FHf0g`Aiva9<0bE#Re+jT-5x}bkfTafjW;7nUv}zeP=r>kZ zlmnrEM>|jajy1-{%CDOM78cS=Xg&UAGgcaYsH$0E_{T7F+C04z&bQ+vP*rYS-6{xW zWnEp^g9~SXGr$?(3~&at%77pTUSRJq88b|O3P7p_K`_bNC!vo3Aw7h^zPl~9^OLYs zwJSqF(Z0*=qyKu>x;zp{=)F=AaO8ARgiL)J=tT0zy&DI&!>Ln}((w{yC&~wQjJa1j z-QJkM(=jP`F0TYbV{UM`$u`U4tw(TM#}F=`Uu~Tsz%4;6X&==8QI{9qx}^1%w&l2& zO)g;wh$ZdAK^w!Ya=4|uhSO_7*l0+^zog>>G+v|q?r_=c>YTdiN1m57{ zsFonfCWB5~n_0`-7q+ z(5#7BmT&4j>^ln(RBhG8K_ZapWI diff --git a/folder-water-download-32.png b/folder-water-download-32.png deleted file mode 100644 index 2aa8dcbb5075aa6175d221f45bb095ddf0281039..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 973 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7e6l0AZa85pY67#JE_7#My5g&JNk zFq9fFFuY1&V6d9Oz#v{QXIG#N0|R4!fKP}kP=R{qZoTe3a?QIKYPadM?-8xrq0_lX zxOTfn$8M3j9dgaPC8{?_RBv=z^&s%r|G=aF{kFa`N^3SqYu4)BrrNPrwS6y;RO{HQ z*|FDs#!mT`T~dv^BpP+b_KhaRbm9zMG!; z@BIoyavH`?llQu%E!)przx(RhlNV1PThBe;f9~zC=La|Mxri6Bwi>vo9D-J!LrUv?efk^XBp7FG)e!*Z*pb?B#)eU(Xj3USXowb#Da>pa&ByjNdHlR6-N#5=*ElC%m3V|HX0*}aI1_nK45N51c zYF`EvWH0gbb!C6aF2$u{=6tUTm~a@KJzX3_EKVmUEU--w5fl|}XW;bIRP$jybIE94 zoPdJ1`uRg$3mbeLFG{o3OqmjTodjEp<(G;lg_vAlgVx!|O_(^b diff --git a/folder-water-download-64.png b/folder-water-download-64.png deleted file mode 100644 index 60c479098ba647a0a6c746311b47e1c7f8dcbee2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16671 zcmeHPduUTv82|1~+L+cfDlLi=u_&!st5c|s$%aj+G_khS;{K2_sR}-D4#g)5ThRTZ z8w@t~5Vv)RBKYj4e~6$J|C+BqeBirP$DGc>YN=^!9{2d2ZizSNBu#CWlicQf<>sF6 zJnr}Xe&_qnJqd^Is;{fI<&Dn+0Gr2M)qwX(dX31%&qJ%%x8u#c(pl>S`1Py&;L;q_ zl?@HmF6GXJ^3PD2wA|fL3$U#O!23CXAFI4i0XEG5c-90k=LdkX>wY}F@O^B^T~a=i z3GK=eP_p~%{+^eiMt@KP4ZR<#DEQC!ZEvahdu%|mZ}m)@LNuZSuKLIj@U z;wVaxWV^+zHs)CiXmo$1x0@CM^bUw9({+umL3m%l+Dk~lNPLfPdT$)KitRLa+3^{v zcl$Ls)7}MN{{9r-KB0(@72%72A~1Z+m|b)}=(aT%@CiK?Iaug~7|k0ZXudc!50 zQYX&5QN>kUkkIvn1Q;dkV<9cDm||5&)$u7nGzfKd0O@;y`&qhmFOM2vG$r`t9{%vE zf@-yaT2RQj&k>;bI-%@s2NX@4)!%vTBW{eLDx6Ip_xsy%{UY4G*T(tI5l~uM0!8H& zTt}l<6iu6r5EOXE0O8hv;RrsAIULnto!&VD^o`k2mIP$OEDwZHM!-PqWJ4SG8WaV( zb>H_qni5j-uWCRS`sU0M+td9U;dxE>? zPQl|p9>kp&{T|`1iN#P->5kj?|7;Kz0TfWaE%EPlw2vt8lt^I&P-C+fHiF3&1 z?ITiz5fa2~mI5r$bm@|SbTOYPc2m9v zq&kO_B~qq9vJ4u1yo>;&&tS6t%Lrf@47OkUjjbCldho%u78VP4qNwM|qZ?zVluuB{ zj4Ne38(9ywU2VDe^_K0vzuG$VIAR^zrKC*2iype;2+|KWP??^b?8NI&yk4K8G!Ovk ws$@ViAQ_MhL@}`VpCffxQA7VPKvcufmC5hk|JgQouZKRtGq0}dn5${WE9=Y^L;wH) diff --git a/folder-water-music-32.png b/folder-water-music-32.png deleted file mode 100644 index 6d1207466bef930450a49865b43af59676761df2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 993 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7e6l0AZa85pY67#JE_7#My5g&JNk zFq9fFFuY1&V6d9Oz#v{QXIG#N0|Vo{0G|+7paS*I-Fn@7SLL#K0( zaP4-Dj@=@4JLH;oOH^-=sNU$b>OtVK|A9yU`)z$?l-6vJ)~waLO|@gMYWrRwsn)Sq zvtzIOjGgi=yQCU-Ni^(~ZQiBQwi{>~&=BdSU8?PS%z8n_0+D3nPKDOpN^N_T+xDmc zwYTrl>)sAj2Gl6uvRk-r2M`HXZxtzDtJtzrsb!~V`C9vBx4pK%w_kc2;s&5Id^bJw z-}@Da!O%|%%F4eeGvty4|=N_G| zy}Dg{wLAC9HtlNMeE!t+duMOnKYQc;$?NyjTehFMe)rY0Coi5pww`;w|J>WzS3b_V z@-gt}Kffa&zXu-qA8_Qq@BW{jyFLdU`)@M)f@uDHv4RB#Q%?$J&d{H7Lc9Nv_nxmo z$NvYP`0sz{m(SjBIunlg?E9|WdqA>eiCEq|gK4J>rk*mNcUd5P8h_dpzLd#^)6ZBe zxXPb8#bW+d^Lbaadk#nzFZSB~<^TWx4VN8O0e#|G666;Q_7fVxXjR>ir@<(4{NGty znJ1SVS!A9(n%U6MV8tkNO!$cm5I&Isl0YPS_6)P<#3`Q4j7$OtZ*K#d!*5(EU1#f7&A|jn# z$Ho{f-4Y-rm7A>Huu4JImYL;JaDnEDGpEj-JbCimsUs^D%=uR+=!-DUt z1{ZBT?OV6BPaSmO(sM7HvZR4i#*tUZ&)d0+OQ*1r&4G*M?VHI3C)F))a2jz~T3POX qz;JF|-k}36@82~F?+8|Y&&1#&!?i=|j!-`+LOosmT-G@yGywpC7ojfz diff --git a/folder-water-music-64.png b/folder-water-music-64.png deleted file mode 100644 index 45b9e9dc3742914f681b4cc57bb31c4b7ac7eea9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16671 zcmeHPeP|R%6o0$94=?s|{kWJQ{-Icsp2p%ITCiH0yPhN=CM2PS7OBJvZAB|;{6fJV zZU5003N8JDiltau4A^M%M-^fqC|D^4t<<)Xv|??(gc#x_>FwQ4-z45;Zzq@A&E0OY zck{w#=Dm6I=Dpv%ncdqP?pQ;8mAi0pApp2*s)J2fR?=&M1OK1izNZHZ+Z+BmKfu`! z7e=?*kr!H;ssh3vKUKVq%+hVuO?3c=%K$>}0Yp#~>I2xn8epIq;MvasN_KyFp>YE? zI9{u*3Id^jUv+%@F-ly!t6ymWczQX#ghSsve*lHfeKmC(o&CF5ai*1fXWsuSP*^+>k?V<<^9R*+$$tO2|{$dxjw#u`$XH-8? zZ8$t8Z5o$i83j*mQtToz8HUCr2uoy#Z_S%0@v)8pTs^+oJOh9vLndiIt^cEu7(9r` zTYSf!!)Mv~MGOF$r2R~xjbT=WCHZyV`xj5bOQ-3lfO$boN_vm}IQxaKAtaZ*0Nf7o z1`)`+M2dF(exw>d?aUpS4gd|+ULfG+XqzZSx?37dgpgrbChgMH4H0QaorecT+)A_Upvw27MwT}3pzUsaAfCjclNFr!ZQHM$33xk)`v~!MtdjQAMOx%6m`2Y;btLd_3lOR>yf-G5{zW^P$cG$cI^;DMp?FGoh0Y zZF!#o%yWPlv)=jjXS#;*Z`rO(UypL`Wq*YIgExkI1 z0wCZU*;Hh+Po0<0s+Y=ECUQdocw$lN4bQu%G~u^ay+nsBRtyDTMX(O+4kzQT-QfV= z3sc`(Yt>^6WkJB?XyfG!&dH^4h;DNC`X^7tcuPu?f>(CYs;BIuxBmV5~WZC5`!cqII9_nDJV&w(!&BprRnLzV9{{!q< BL+=0p diff --git a/folder-water-pictures-32.png b/folder-water-pictures-32.png deleted file mode 100644 index 48743dd5c48fba2ea99eee898d5aca0ecddfb19e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1042 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7e6l0AZa85pY67#JE_7#My5g&JNk zFq9fFFuY1&V6d9Oz#v{QXIG#N0|VoU0G|+7paS*I-Fn@7SLL#K0( zaP4-Dj@=@4JLH;oOH^-=sNU$b>OtVK|A9yU`)z$?l-6vJ)~waLO|@gMYWrRwsn)Sq zvtzIOjGgi=yQCU-Ni^(~ZQiBQwi{>~&=BdSU8?PS%z8n_0+D3nPKDOpN^N_T+xDmc zwYTrl>)sAj2Gl6uvRk-r2M`HXZxtzDtJtzrsb!~V`C9vBx4pK%w_kc2;s&5Id^bJw z-}@Da!O%|%%F4eeGvty4|=N_G| zy}Dg{wLAC9HtlNMeE!t+duMOnKYQc;$?NyjTehFMe)rY0Coi5pww`;w|J>WzS3b_V z@-gt}Kffa&zXu-q9{^+=`yX`dzu&>%77MN!Og&{V?UdK&z>bge!(EmqXR~(>V`ZGMv>$H&f3a6x#Y+q^W@RY zhK2?!Mww&6Ph^1bi42egBGI#Fm^~*>@nmLX5;%B!8_*!eByV?@>Cf_{*8@461s;*b z3=De8Ak0{?)V>TT$X?><>&pI;U5ZP^@^WH&B~XvQr;B5V#p&dP1-1zyf}+Ch44j^t zYCf!IE*Z^>6Hw4rKYyreVS}&ZMQOI0DN{mkTof%>vFc~VZ>PrXyV}%bGBUegz9=#( zc&SNdC+V#HA@O5vZctG0hNdeb(%E%vjM1}2<{UT{ z#;{O9SJjr8>r$hP53ArJ|>XUV)~-md*Z$ROdfQP(PvYyCK1s~T7jTSag#Cp2=xvXNWs@@`DpCigYZ zyi;!8J@@0>^ZVWN?z``C>4DCU7N=vG0|1<@pj1(p0>rQ=d<9_V?EqJM0q%YaV9EA(j&};7CIcn|CIcn|CIh9)fS?7wBHZV;JKS#wptK2s;MUg9L7xCcIio0W z@ciz;=X2<%Yg2}Rx`QX*pZrVei6vx^(fj#|fR@Wd5h}_pU=@|ufB5e0r{TyEdA{~| z^%J#*qf_xs({U*;@MM#?i%Bw!O~oM^SGIZAJ$?wcbqwL!@%7dj0^%~{6ZRSXpNvUx zEhazYJ+J}yvc)9~0r`Y|HfU2ARnfTosQ0ClhhXzzdJ8BDVM228b4TZYJIPaq7o?A$;3eIMJN|f?8$~aB;NGTt!+fIg6qwJu>;PDIAx<*%>c(??4Ah>>?=O8GaFlYm_azN7voZNH+{X`(t;{o`}^ z)UPRDGd}Y5k$KaMAu@*eTD!bItC4^z2I51ex~tL7nweWD)9F{Ipgo>+0*dz&@kgW zLqL6f9e8}}n1)6#@T_S>2m)Ny0AbdE|0DP$=44bSb-FSHs4Gh$ZxT=nvz!g183EbY zDTO*S0!m?)vteX5LfIP6rEd7k<8bLh1iudF_a$7wZS3+}YoMknIG5o8HjH#mB+mlO zvM0COp%6q61|suPgx${05?{_{+z7}w3e=t#(w5pT<+%}{9jI7!lYnBK8NK|{H3Di^ zHNeV-wR&Nj)i~T9iQ3T#{PMoV1Q4F8_170iH9k)ReyHV40QXx!4X7CN+#-P9=x7h$|K6K<<0f0Y zgqvl0oh^jpWTOgg@e<~!M%Pz)oRj0_WdZGe(v*HYgh68f--bukIGCLvRuUSLL#K0( zaP4-Dj@=@4JLH;oOH^-=sNU$b>OtVK|A9yU`)z$?l-6vJ)~waLO|@gMYWrRwsn)Sq zvtzIOjGgi=yQCU-Ni^(~ZQiBQwi{>~&=BdSU8?PS%z8n_0+D3nPKDOpN^N_T+xDmc zwYTrl>)sAj2Gl6uvRk-r2M`HXZxtzDtJtzrsb!~V`C9vBx4pK%w_kc2;s&5Id^bJw z-}@Da!O%|%%F4eeGvty4|=N_G| zy}Dg{wLAC9HtlNMeE!t+duMOnKYQc;$?NyjTehFMe)rY0Coi5pww`;w|J>WzS3b_V z@-gt}Kffa&zXu-qA8_P<(6Rq+n_nAFKW#Ael)Wog8%hzwiDZo;yAW zq)!Vt^xI(4QRA6s`BJCoPCQ~X^`v0NG=r%p`O~H<)~prJpU;~zNq6E=<7uY^Go}X| z{$nudnDNYWe*1s?|Np<|SlTO~2RuuH{DQ$=K_eKgsvGh&7)6f%J8LWRTT$X?><>&pI;U5ZP^$}7X{Fi?+?r;B5V#p&dP1-1zyf}+Ch44j^t zYCf!IE*Z^>6Hw4rKYyreVS}&ZMQOI0DN{mkTof%>vFc~VZ>PrXyV}%bGBUegz9=#( zc&SNdC+V#HA@O5vZctG0hNdeb(%E%vjM1}2<{UT{ z#;{O9S5=m)!6%0+$jE5(rbY#AWA-&N&W=@Sd2$j@(w>QnBpE8&YOm+u`LwCq+w1a1 zjT3EJ8rthutU0uN!LDW7^rY8we&y|r@O9X+aOF-_+5P%a8-FUPvWxLa-ZO5Wj KT-G@yGywo&&5+6f diff --git a/folder-water-video-64.png b/folder-water-video-64.png deleted file mode 100644 index 3fffff18558ec3c103e5b1d5fc402f165924d455..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16671 zcmeHPeP|R%6o0#S$>pNSsThUZu)NRF5gLxqZ1QU%*$TP)TO6x%~Z zFe-wgC6>Wc-Ohc)+naO8+ZQ&w z@6F7c_xsJ;*_q9foprU9IobKy0FdLZDzC?L89lNx@%NdpzH7&m`3q-_6X3$$5rNM$ zP?y%$SGuIuUmZW9Qn<3Jz6M}Z5rAhqfDcWc=K$+I0C>>=Fy|1!xHU(9Sv(I5GFMbr zmII+b$1b1Vj~45is-fxFc>fxNLL0VHSj`Dlg*lKJ17CEmL$ohE`JNX2MD=I2sHk&!S(Z7 zv`cAKhJd2RD<^yZ3oi2o6i_hwL`6c+8L|u`GEHEX$$@*nAO053o>da{$E%&JcI@r* zFY5OPHG!u-DR;i00$qK6@cPN>lF~1a;DgdNY)G!0w~lBlZ2C_dEhM5*^;vmLb?@&TTXSi4FAweaoe&TjKq{{3yhi6BJTFrB7ngvM_#9t1dpx)%+33Bi zZm&zd$EU#M_HNjH?KwVufA|%$}AfL$OAB z!o?j@Cyu_7)%t1iL$d^uNUQEM2-g!WxLC1fD&> z7q2qN)*O&?$1>qF1W4X4m_Drp@@C8$sQgU_(?%$Rv*GK3csp-jhx-rOnAjNt?Dita zbCfa_MK|Ql_y{3L@InQInFHQO@Pn8KvwBdcXNG{#!gRPc2uO!fj)l?4fLQFLLz$5Q z=`hN%Fft3FSe1uc)^V*F9zVPfijvq{a2a2xPn=?h!jH>_+a+7iG&2A6;I{y5X+#T` z+d&HvG)hWh$HUf$0VmtYg@8n}AQW6QAAkMU5?W33H5URjM-{~Z1>bh>Zj{o*%)$`B z13aZn2m*M47lHtu;B`*`Z}7S&K$hdb-=iS3h_2^=f)D4y)af&|;EUT<*96e$d6S@f z0(g@k1OYrr;Ic8I0rL=gJ1EMVzxySl4=x!%cXnDOnvV&y7HD-H)?Rz0VeVcjbXyw@ zK!oayiMB1ATFlsa7?@8r7GKryog9w{lkD^S-0;s+xMV<*W9I74Ab=~q0ysA^K!8Ew z8lsT_Trv1 zhRxomZJnVwn3W(FQc?==pdZ~a1ffktp*yH9JpRTbxw|P5*)U=@7%&(x7!aRvh diff --git a/mainwindow.py b/mainwindow.py index 3d809be..00ce153 100644 --- a/mainwindow.py +++ b/mainwindow.py @@ -58,7 +58,7 @@ if __name__ == "__main__": style = ttk.Style(root) root.tk.call('source', f"{theme_path}/water.tcl") try: - root.tk.call('set_theme', 'light') + root.tk.call('set_theme', 'dark') except tk.TclError: pass root.mainloop() diff --git a/media-optical-32.png b/media-optical-32.png deleted file mode 100644 index 449ab36e1b514404181156c4da8a50b0d4c358bc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1055 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 JPDHLkV1mKMbBzE1 diff --git a/pdf-32.png b/pdf-32.png deleted file mode 100644 index 34fc0e6381b445bd1bdee1ac0a67a49a3f6bb51d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1070 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7e6l0AZa85pY67#JE_7#My5g&JNk zFq9fFFuY1&V6d9Oz#v{QXIG#N0|VpB0G|+7pn{`5Zr8*74?5d@%1At5WwPJQ;DD+A z0W*VdImuT8ymp%z?lsllYob3_TWzkk`g>>VkIvRWEysM^kNdhG^L0Pz=W#D8=%A~^ zAqT5Nb{0T%+{xxee8kVZ^aIwW2P}-`g=_DCu^##Gtk~?qPGi-rf8_fNr~smN$1N; z0~H(vS_F18#I7UOCa;sCzGNouH#fZK>;613@rz&=7#%C^iIcwpG}TGXk!L+ z+ns5X&lKh!w6nZ5b<*jS_vV!yHOnVgLKYgZq%vpAg`|KiZWqn<9; zyV`H9Sa!Xw=~P7UwJ8(#dN^O7GxK6z)_!B18-3l!QxXnEhTdDd`u2q0t2GrD%Zkqz z=AMcUJDV7DXX&ET*=grX3Qm_59j`7w)7o@r{o1SZW}m7kJyn=@)Xm|}oSA3pYxW2E z?sm4@ZE3vQNN1Rl7#*^+Je!tuV`AUM&bHmA`uj}u_899Pv@*TY zP;>!D^SC#Q`(@|NsBLTz+sBFtQy>g8YJk zG#cQNmXVR>UkmfJ`Q>7A%_qx?xxNh(8 zna|R~r00O$0(ZCL$J7%p9awXijp6SVlQU<|oz>UTd)dg65D^y{8-4%Aom=;AnoeT4 zaPQy2hZi@VEGeogt8--7v1ix5ouV01UT(aJe?|X! zedAR2isw(2zxWpR3uFVdQ&MBb@0KyW_)c^nh diff --git a/pdf-64.png b/pdf-64.png deleted file mode 100644 index 6b4160593287aa92a63ea439510843f80cb80bf0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16671 zcmeI4eQ*qC9LK-6_kQVJB$0%RydXtO5?bRAQVk-nLy4d?NZN^rs_N*Asu`xE9oo@O znW8DGqeg2`N>W7|MW;m+9Z`~s6GBMtkoROScm3^UqQ-P$@3OmhM}FqX?%qDXXP@t9 zf6ueeKKqQ76UHa%bw(WkeR5KK8g1jaq*2k|?YVE1(MFLoYTPJb&!;}tEF~Sw7N#YR zmR&qPXek{;ypohQ4p`g|ShgH!p`Vsj0&filZe;?)*8{-|HXN83OD9w>rzXb3&i&i` z^R_kgi*`ZMw1q%)UoOcOZGHZ2`ceI6^0=|;n`)!x*{IWpu3G6LNRA(szDOpEiz_Uo z99`B$po_p`OhCq0`=K#o{54AZT1LjCKn6WuKWFpx?-`sIuyJdSvwp7TSMYUI%UeIU z)i+MHwoun>xAS##I-e>$bau_0tlNh5UoCRl*#!rNuTN`3V~VZ0Syb`ub&<*N4nbJa zek|seHvm{!gP0Y0uxzOy@CRVCJy=K4kEMXXAAsm`|NjDFL-2S292PMlcm)74A$Sb{ zu^@OA05KqV9RQ&rcqITKA$TnSp&)oQ03jfFJ%G+a@HhZ1)>clF)8-f~n?-?OiD&mR{Lyb9DtwOLX&Mx?PToZ6XL#JH20CWo9 zBj7A~AHb+oh+e%8=3_@7*ZIJdx7Mu~C2s=S@Cf)0c?P8g`%qh754n$zTLDNP0sa9F z!K(T?R2LnGjQh^uMw2`On(3}{rqb(Sy<7%6%eqlMAUOcmVsQvobn}CuS15gD6UjD5 zG!(S21>kuJ$(sXvqXO2ZM(FxP($p`|SaykLRmI6BIRH5gbuA?&&_~CBt*sSDl@p~( z-W<5_H~)1O#)Kr;XsL_4O>zL7V9Ti@sC<10mS(w?dG<3DB!=ujv^$yJ-UyIxTu-%yKIL$)5rNu_K`l3W8~49#|R~4#}Q_ z>O()F!DMm^2+1QLWM&phcYhCqmBqDhzQ*11D;ThRh1;5fqyYSf$HFk+DO@Ju+=aVQ zDxCi+6#m^Y@S{(_y){a0(gC2hA4cI`vU?XambO`7ZcN~7sYXH83~0i8BWB$OXnORN zl!0V@Kwx|Vp6DBiOAB9zo?x__lJ*TWJl;Ef3KGBEgrVQ=MCIN+VAN`;0|TM-^LMP4 z04>*PA#jb?uHwe79cZ{>YA>QwTS)+Lp&gMs59cWKHRfuEAh}ixL-b%621UUT6$78h zNZhTcKxzJ7gpPO)J|Q8ve)I^6R(*t8>L+aU3azD=slb7Q5Ro$%7Z!7?qC0Pr05DFT z3Pz_x#g6TWoREg@aibyE8(=wm8dZOv$GIQ#QB`&sN*WrgC?ZZ!3QI~sRK`riug!z` z_uo)e_)A;<1N&hnAEBmH{)@$jz;yK+fx_U6VLN|7ZRHIb0iH)?(Mgz&9YsAwf|ij( z%`ng~GAL==UK#EUq1I}}9ZJd`A?TlwfFOz#-^eE&a|z|!x1pLMr6Y?wai+bvj%ZAHObn7wWQ7 z$f*r`vI!OeCHwZ^=@%xzCoCNMb7#Z$XA$%Y&usVi-w?q7l&<*<#WdmBLXWCImC`H3 zb07o*(49nkqY2grc%yi(&b$G%+U@S2#OF!5)n>2ZnUy~P3(FqnTd2G9-L_hJ*OhlS zUD?E*i_+`DGz?>;H9gLcX(gaSQCeqa*@LT1*WW8|YP!YelFmG&Iar~TxS1^8;P_NR zz&zZF%R7{=QsVZztc$=SOW?cMl1U^kmHU4I1QIzXbAP|;nwvAY;*!UXkKZ*q^ZkDT DVx{xK diff --git a/picture-32.png b/picture-32.png deleted file mode 100644 index 9b8c448870f74f7355d64ee6a74cb76cf1a42508..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1441 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 KFDzO2v;P8fUJ6|R diff --git a/tar-32.png b/tar-32.png deleted file mode 100644 index 5043933653c769b8285193659947ec6c1ecde8db..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1101 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7e6l0AZa85pY67#JE_7#My5g&JNk zFq9fFFuY1&V6d9Oz#v{QXIG#N0|VpZ0G|+7pn~E9y~#UL zleVP=Zww3G5bm=+z`-OtzVe)v zdFe|tw_V=$@!Q9m&9%k*fU@NodvX$Xq{M8Ej|QS`@ll&%{bvTcP4rxPYWe%G?~|6M zMsAGB*qxKTCpU6SED&Yw$P3*V;lDn}e|>Q1h6te55ZfUR0J_0*rLXr|5NXk9<-Wwr zZLzmmy|sD0mCHO2&lSF&t9)JNdYIQ)0X?PYqpX#rqm!zqm87fSqwK#S7-)z$(1caK z9#g$1@1HvV*n&y>rueJ_S>d_LCvbMi-B))#C;K=|aQ0g5=Q+)1^1dk!6P>-M_%1lH z=`>SSbn(4XP*R9htDLpAMA<-kk!=cs5InUMK-@m@TJ|G~#CEwL+iC=I^ zNLy>$_kO(YeGOsk?9QiCvfAw!$lBUHtAldy;mfPCYZ-YpvhZv(v*j zN6$GwFKK6**E;{?o$2$=F8~Hh!Sq2GRNFG9Fli#OUgU}L8&{ET#FWR>8yD4YPk-hkhX!g zkju4}wLsGtlf2zsn*VG$e+kIpEbxddW?;}$24TjErS@e&LG}_)Usv{*>{48+ER%$! zG=X}uJzX3_EKVmUDDX(My1E>6@QHB>@``c`<2fWcRXB~w%Xsq%Z4E8W=Ekm7vv##D z6Kh$#X32^LXHOkFux|0|*X)e{7#kfADmF6y3#ePMex4mW^YX@p^W!C0THIaO++B}5 zR3_HdxgCq)xudr1pTWc#FIGG_(NQ2_e&+s_mf4NR&&cQr2uO>|h)Xj(Z=X5)V}nn_ z=ZkANxS3}*tYNsz#ltEQwm@4U$F;^ONhnU6X>xGT$HPqHi^`8%e9@r;8TXVDc*|`Ife2M=)KhvLK z&#%ZIb|5>kQ{cn*)!&>a@o(PpAoaoKO?-zLoere v9psu5d$+}5=JmUWFLP^u_*ST{^q!ev-XXgTe~DWM4fmPhEE diff --git a/tar-64.png b/tar-64.png deleted file mode 100644 index e2887cea49d6c631bfb11c4840324fc3ce941a28..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16671 zcmeHPYiv|S6#njO+ittvh9GU)Qc0Q^W16BEAc2Z3w$Qp;T3Y>K)P#biAtj~;HE2cA z$Pa%ssFkXbA5DA(e4v!3q}nv1LKM-+Luh=2zJxCJv2E#Nckfl;b6mQ&MGNu{lQZ*jch+ozV7E)+?m2WNUs&A@Jf|z@FCuCsFOW0z7vwVBZX^dJjmhI?%i+hg2B0 zSU2QCqyOq#KCLC1xT^feb^_U%Gzq&te(-ssjCr=8FfXPjCN*|-tgWo2fjB`yuH}(k zg0OaNYb&vcN|b>p1M`>xArST*-|bkUxuut7LCPaGDS{x#foy}(4|feQW*A~oyOoTlX>LHfqH3OI4enR>KeWHYUweKD*xs@uU(lq34(CAPHPgI&X&iH>mx+#dHWgV+1uQKrkI%i{vY&^gp)cENpUYhz`G-ZvB0&T(~j&qzV;&@4Tw1=qK3pei;Is znlnXjG*`+_jHl|cFhhXMnv70=(yf#yCOg^&@8RGN8xsL^@|dgQ4;w?kTm>HpS6IW{ zpHtpp@2?NOx_KV~^PT|iLm-l?fN$tefU5Re(3+ zH}Mx80yiNj8P5JeIp#3p32rr_a)!1Z?lf^3xAd_cigS672hguarIk%98^a%5*` zWAEO*+#k4d*FIPfrI;zM{ABtqWJ4+Yr!$ zEiEl&FfCrZ7&ybI!>ZsG0g5tpJrD>{FgAhCovEH10W0lb=v)Ng z1KbF3scy(|fu|hBD8r??xRbz*fX@C7EM1fx5a6=p`_SIk5wJd772F7D{G$n*?|Bjl zN&nC1oBHQ0@Y-;d(R#RkMKiX&f>gqMS(o4%UnA@Hme z>V6Qn6yT9djrjb`VR&5Ep9YJH1Vf^M3wVE!_z^(86B1&~G2Y~_Gm+47n*$;NE*PIt z0vMLOUtKWTxuNibjfnu&<>{FlXjv2l+hx6$A;9SvpZcanZ+)AW#|NAYHim%CZ!f*2 zsh+{x94pg(kJ~fQeysgXeFd{G)qB48s&P?#x9Lukh1{jZ>QA^G%M|>-tzA_YK0Mn( z`akWvAcg>H(DU=5*iltqJ-B#J^j1c8Z`Sxp9+@W`0&9_blvJb&Q)3x9rb zk$yeKypb{OvQP(zKFCiYiEirCE!-Q~lImF}^pc)_icP=WqZ2#-du`%0Dp3Z)#ei{3 j=HsMoEB$`~Lgb@s{G}3$<%eHsa|L-DbH7}-`L+K6qH?p! diff --git a/video-32.png b/video-32.png deleted file mode 100644 index cb5de25c38eb0bce83164bf7ab4c13e31bf3455c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 760 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7e6l0AZa85pY67#JE_7#My5g&JNk zFq9fFFuY1&V6d9Oz#v{QXIG#N0|TRGfKP}kP{D+`4<^oi&^+;W%fvh7Z8r-WZxlA( zENZ%0&~Pm-XKQ@U*8l(i1Jz8L_i)nuM?jUWlW#Zl->&PuQ`d8+q5n?XWRR|s7KlcW zUWj&x2|&{#)7NB_AIqz~lvj5NNCMeW>1)jGGabEZoV@ES?6VLyHr}Y|zTMb=7iesG z+pU{-zkK-g`~AmX?>_umvFUk!!wsM}=dXHN&~Rh>f!7OGJ21szhsx=A7EM^>;O;KZRkA_r!bM|)76#>H*#%iXtZZt_(h?H# z5?3xxUfR6Q;r@j)Qd~JXrElKIe$Xf=DKOezcx>^3qgT&Lt!FCd&;G+@vvIwF5$fpR=X%$npB>u5k#S-L7XT&fxgFaVwL8Ryfe}44$rj JF6*2UngI6IV^RPB diff --git a/video-64.png b/video-64.png deleted file mode 100644 index a0875907900e7c279597675ba95b0229e89e1bbd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16671 zcmeI4Ur19?7{I@~Ki1^ z7w+TeU}dW>P!G^q4A9jLFoi^2-vExR2l(C$P<9SrdE3Q%jpb+{t);Hk3nKpOx!-ph zNvv(YrgngJYjEc}u5LMsg#2NDeGNaxJFSL|2Ykf?XcF*yJ=;4tuCj7)5NWW+2rvSS z03*N%FarN60ge=R_u2O=c%!k$z;Wdq$MGaREz3nwjG+EF7Kt_=J6QBp%2$(=5X+1r zT>d#3tqw;75Ji%fw&ffLyoEP-?KZooE|k>bRK!U6~}u|g_% zEHjV>rlO*iG^RIsqF9Ik^jh{($w?Fo5rCATRFp9QshCwcF|i7eLn{?^Sp}qGR^`OR zDnJgcRMce^kcwHA6BBVYD91>=ZqwF$C@skV197JzUR(OPfL3wCuY+*CAAKmIa-;qd zD0Mp&1&`y!@HUh`KIguS)Ty@pCaoP)iN*%z$T}kdtlaYhnfdZ&1 z%TDfud9l8HhV4%4o#{GLDK+mmeq!!c>rod&;O1|rkpkph>y$YkORIL<(Q%|M!$rd$+b;n1&%C(j?8=@=V*Gb&{} z(T+R*ien+_8K@I0Marm#WCHRfi25hgqZ;yyxxxrA0*nA7zz8TJkR3gb?mO+(Ve(xkDG5b=)%-5@_P=!G>DDKR1>qLOgYrV>en1X4mI#H2wG zB83QBK%m;XeqNljN;@;{?BB4v?wf2F=FCj@d%yR5=bdj4D}(?A{HY;t>PID*6dWVYVg$ zpdYxIOWFTCJR7z7n3Sb8z80%_plU%6@F7qS%*-|dcB}!3S_Qv-yZnpZUQ2=wD+2xiz690*)!C#1 zA24{w;gTU9o zTfj4bC)0zk@#{6+6jUG}a{IPeqP^X8eH3J^BH?G?6QBW@m+1r?-(#2k?ryO~B%-Fr zhTTwpH*A4I)EBGAa%nup}<5NVo*-1R4QB*PCJug+dYvg`}saXZS#OwwJHHiP`@yh=zm?q z6yWkDiGp6TpqyQHza-s@&tpSRwEf>U1uxL>V+bUjFOh;g$vV;ckn0`%O0L*tI z`*VSTQ+C#U;krPqCh7C|?X?i+3V9uP>Q$A@Dw6>1bMUE|t3)7kX#{s!u zmHEm_k?YsRDdJK<8ZC0X3fR`B=YR7(A`fpzOrZjs|5;Du7CSz$F&R|hpU z>90N&70}XRI$a9{)UR%3z$2P~qEwrn-h+09@5Bj-7jaL4G;neQ zSY_Vt7rAmJ;UqRSHAz!blN>vCEU^c;)J3-6)v;$!QYuck2)fust^%ab&h*&*z!4__ zot>SDKP1gvWcytm$z(0nh_8$6c*&`+)O-0%4-W=K1_v{TfcPx(Oed>AA@J^dc7}T8 zN+>AEoQAx|qrQ_fi(KMF1`?mr&av=B{s4eJP^5b=Z zzd17CVgEM_W2%T8sDx) z(;&O{>&5mPi!Oj|z_+6*Aa-uNwgDx&59rfNYXRA}VKKG~{SdISZvGJo3n682$kyLx48#4@yM<0000