Removed text boxes for paths to prevent accidental incorrect path entry

This commit is contained in:
2025-08-25 11:18:48 -05:00
committed by Jason Ross
parent 9dcab57d0a
commit 2930bdb081
2 changed files with 67 additions and 41 deletions
+32 -15
View File
@@ -16,8 +16,12 @@ class AndroidFileBrowser:
self.adb_manager = adb_manager
self.remote_path_var = remote_path_var
def show_browser(self):
"""Show a browsable Android folder tree for Windows users."""
def show_browser(self, direction="pull"):
"""Show a browsable Android folder tree.
Args:
direction: "pull" to show files and folders, "push" to show folders only
"""
# Check if device is connected
device = self.adb_manager.check_device()
if not device:
@@ -29,14 +33,20 @@ class AndroidFileBrowser:
# Create browsable folder dialog
browser_window = tk.Toplevel(self.parent)
browser_window.title("Browse Android Files and Folders")
if direction == "push":
browser_window.title("Browse Android Folders (Destination)")
label_text = "Browse Android device folders (select destination):"
else:
browser_window.title("Browse Android Files and Folders")
label_text = "Browse Android device files and folders:"
browser_window.geometry("500x400")
browser_window.transient(self.parent)
browser_window.grab_set()
tk.Label(
browser_window,
text="Browse Android device files and folders:",
text=label_text,
font=("Arial", 10, "bold"),
).pack(pady=10)
@@ -174,8 +184,8 @@ class AndroidFileBrowser:
and not folder_name.startswith(".")
):
folders.append(folder_name)
elif line.startswith("-"):
# Regular file entry
elif line.startswith("-") and direction != "push":
# Regular file entry - only show files if not in push mode
parts = line.split()
if len(parts) >= 8:
# Extract file name using same method as folders
@@ -220,8 +230,8 @@ class AndroidFileBrowser:
# Add a dummy child to make it expandable
tree.insert(item, "end", text="Loading...")
# Add files to tree (sorted)
if files:
# Add files to tree (sorted) - only if not in push mode
if files and direction != "push":
for file in sorted(files):
file_path = f"{path.rstrip('/')}/{file}"
tree.insert(
@@ -232,9 +242,10 @@ class AndroidFileBrowser:
)
# If no folders or files found, show indicator
if not folders and not files:
if not folders and (not files or direction == "push"):
empty_text = "(No Folders)" if direction == "push" else "(Empty Directory)"
tree.insert(
parent_item, "end", text="(Empty Directory)", values=["", ""]
parent_item, "end", text=empty_text, values=["", ""]
)
self.parent.after(0, update_tree)
@@ -451,10 +462,15 @@ class AndroidFileBrowser:
item_path = item_values[0]
# Check if it's a file or folder (if we have type info)
if len(item_values) >= 2 and item_values[1] == "file":
# It's a file - select the file path directly
self.remote_path_var.set(item_path)
browser_window.destroy()
return
if direction == "push":
# In push mode, don't allow file selection
messagebox.showwarning("Invalid Selection", "Please select a folder as the destination.")
return
else:
# It's a file and we're in pull mode - select the file path directly
self.remote_path_var.set(item_path)
browser_window.destroy()
return
elif len(item_values) >= 2 and item_values[1] == "folder":
# It's a folder - select the folder path directly
self.remote_path_var.set(item_path)
@@ -467,7 +483,8 @@ class AndroidFileBrowser:
self.remote_path_var.set(current_path)
browser_window.destroy()
else:
messagebox.showwarning("No Selection", "Please select a file or folder.")
selection_type = "folder" if direction == "push" else "file or folder"
messagebox.showwarning("No Selection", f"Please select a {selection_type}.")
tk.Button(
button_frame, text="Select", command=select_current_item
+35 -26
View File
@@ -101,11 +101,13 @@ class AndroidFileHandlerGUI(tk.Tk):
android_path_frame = tk.Frame(self.android_frame)
android_path_frame.pack(fill="x", pady=(0, 10))
self.remote_path_var = tk.StringVar()
self.remote_path_entry = tk.Entry(
android_path_frame, textvariable=self.remote_path_var, width=50
self.remote_path_var = tk.StringVar(value="Please select file or folder ->")
self.remote_path_display = tk.Label(
android_path_frame,
textvariable=self.remote_path_var,
anchor="w"
)
self.remote_path_entry.pack(side="left", fill="x", expand=True)
self.remote_path_display.pack(side="left", fill="x", expand=True)
tk.Button(
android_path_frame, text="Browse...", command=self.browse_remote_folder
).pack(side="right", padx=(5, 0))
@@ -117,11 +119,13 @@ class AndroidFileHandlerGUI(tk.Tk):
computer_path_frame = tk.Frame(self.computer_frame)
computer_path_frame.pack(fill="x", pady=(0, 10))
self.local_path_var = tk.StringVar()
self.local_path_entry = tk.Entry(
computer_path_frame, textvariable=self.local_path_var, width=50
self.local_path_var = tk.StringVar(value="Please select file or folder ->")
self.local_path_display = tk.Label(
computer_path_frame,
textvariable=self.local_path_var,
anchor="w"
)
self.local_path_entry.pack(side="left", fill="x", expand=True)
self.local_path_display.pack(side="left", fill="x", expand=True)
tk.Button(
computer_path_frame, text="Browse...", command=self.browse_local_folder
).pack(side="right", padx=(5, 0))
@@ -244,51 +248,56 @@ class AndroidFileHandlerGUI(tk.Tk):
def browse_remote_folder(self):
"""Browse remote Android files and folders."""
self.browser.show_browser()
# Pass the current direction to the browser
direction = self.direction_var.get()
self.browser.show_browser(direction)
def browse_local_folder(self):
"""Browse for local folder or file based on direction."""
import tkinter.filedialog as fd
import os
direction = self.direction_var.get()
# Set initial directory to user's home directory
initial_dir = os.path.expanduser("~")
if direction == "push":
# For push, show a unified dialog that handles both files and folders
# Start with file selection dialog that has "Open" and "Cancel"
# If user selects a file, use it. If they navigate and click "Cancel" on file dialog,
# we'll assume they want to select the current folder
# For push, show file selection first, then folder selection if cancelled
import tkinter.filedialog as fd
import os
# Use askopenfilename but allow folder selection by providing both options
# First try file selection
selected_path = fd.askopenfilename(
title="Select file to push (or Cancel and then select folder)",
title="Select file to push to Android device",
initialdir=initial_dir,
filetypes=[("All files", "*.*")]
)
# If no file was selected, offer folder selection
# If no file was selected, offer folder selection as an alternative
if not selected_path:
selected_path = fd.askdirectory(
title="Select folder to push to Android device"
title="Select folder to push to Android device",
initialdir=initial_dir
)
# Set the path if something was selected
# Only set the path if something was actually selected
# If user cancels both dialogs, selected_path will be empty and nothing happens
if selected_path:
self.local_path_var.set(selected_path)
else: # pull direction
# For pull, only allow folder selection (destination)
folder = filedialog.askdirectory(
title="Select destination folder for pulled files"
title="Select destination folder for pulled files",
initialdir=initial_dir
)
if folder:
self.local_path_var.set(folder)
def disable_controls(self):
"""Disable UI controls during operations."""
self.remote_path_entry.config(state="disabled")
self.local_path_entry.config(state="disabled")
# Path displays are already read-only (Labels), no need to disable them
# Don't disable start_btn here - it will be handled by button mode switching
pass
def enable_controls(self):
"""Enable UI controls after operations (thread-safe)."""
@@ -297,9 +306,9 @@ class AndroidFileHandlerGUI(tk.Tk):
def _enable_controls_ui(self):
"""Internal method to enable controls on main thread."""
self.remote_path_entry.config(state="normal")
self.local_path_entry.config(state="normal")
# Path displays are already read-only (Labels), no need to enable them
# Button state is handled by mode switching methods
pass
def _on_direction_change(self):
"""Handle radio button direction change."""