Files
QuickGit/quickgit/ui.py
2026-02-16 00:01:44 +08:00

186 lines
6.7 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""
UI交互模块 - 处理用户界面和交互逻辑
"""
from .git_operations import GitOperations
from .remote_manager import RemoteManager
from .utils import OutputFormatter, InputValidator, Colors
class GitManagerUI:
"""Git管理器UI"""
def __init__(self):
self.git_ops = GitOperations()
self.remote_mgr = RemoteManager()
def show_welcome(self):
"""显示欢迎信息"""
from .utils import Colors
# 简洁的标题
print(f"\n{Colors.BRIGHT_CYAN}{'=' * 60}")
print(f"{Colors.BRIGHT_MAGENTA}{Colors.BOLD} QuickGit - 萌芽一键Git管理工具 v1.0{Colors.ENDC}")
print(f"{Colors.BRIGHT_CYAN}{'=' * 60}{Colors.ENDC}")
# 显示当前状态
is_repo = self.git_ops.is_git_repo()
repo_status = f"{Colors.BRIGHT_GREEN}[已初始化]{Colors.ENDC}" if is_repo else f"{Colors.BRIGHT_RED}[未初始化]{Colors.ENDC}"
print(f"{Colors.BRIGHT_YELLOW}当前目录:{Colors.ENDC} {Colors.WHITE}{self.git_ops.current_dir}{Colors.ENDC}")
print(f"{Colors.BRIGHT_YELLOW}Git状态:{Colors.ENDC} {repo_status}")
print(f"{Colors.CYAN}{'-' * 60}{Colors.ENDC}")
def show_main_menu(self):
"""显示主菜单"""
print(f"\n{Colors.BRIGHT_MAGENTA}{Colors.BOLD}>> 主菜单{Colors.ENDC}")
print(f"{Colors.CYAN}{'-' * 60}{Colors.ENDC}")
OutputFormatter.menu_item(1, "初始化Git仓库")
OutputFormatter.menu_item(2, "提交并推送更改")
OutputFormatter.menu_item(3, "从远程仓库拉取")
OutputFormatter.menu_item(4, "查看仓库状态")
OutputFormatter.menu_item(5, "管理远程仓库")
OutputFormatter.menu_item(6, "退出程序")
print(f"{Colors.CYAN}{'-' * 60}{Colors.ENDC}")
def handle_init_repo(self):
"""处理初始化仓库"""
OutputFormatter.header("初始化Git仓库")
if self.git_ops.init_repo():
# 配置远程仓库
self.remote_mgr.configure_remotes_interactive()
def handle_commit_and_push(self):
"""处理提交并推送"""
OutputFormatter.header("提交并推送更改")
if not self.git_ops.is_git_repo():
OutputFormatter.error("当前目录不是Git仓库请先初始化")
return
# 提示:先拉取再提交
OutputFormatter.tip("建议先拉取最新代码再提交,减少代码冲突")
print(f"{Colors.CYAN}{'-' * 60}{Colors.ENDC}")
# 检查是否有更改
OutputFormatter.status('running', "检查文件更改中...")
if not self.git_ops.has_changes():
OutputFormatter.warning("没有文件更改,无需提交")
return
# 显示更改
print(f"\n{Colors.BRIGHT_YELLOW}>> 当前更改的文件:{Colors.ENDC}")
_, status = self.git_ops.get_status()
print(f"{Colors.CYAN}{status}{Colors.ENDC}")
print(f"{Colors.CYAN}{'-' * 60}{Colors.ENDC}")
# 输入提交信息
commit_msg = InputValidator.get_input(
f"{Colors.BRIGHT_CYAN}>> 请输入提交信息 (回车使用默认): {Colors.ENDC}",
allow_empty=True
)
# 添加并提交
if not self.git_ops.add_all():
return
if not self.git_ops.commit(commit_msg or ""):
return
# 推送到远程仓库
selected_remotes = self.remote_mgr.select_remote_for_push()
for remote in selected_remotes:
self.git_ops.push(remote)
def handle_pull(self):
"""处理拉取"""
OutputFormatter.header("从远程仓库拉取")
if not self.git_ops.is_git_repo():
OutputFormatter.error("当前目录不是Git仓库")
return
remote = self.remote_mgr.select_remote_for_pull()
if remote:
self.git_ops.pull(remote)
def handle_show_status(self):
"""处理显示状态"""
OutputFormatter.header("仓库状态")
if not self.git_ops.is_git_repo():
OutputFormatter.error("当前目录不是Git仓库")
return
self.git_ops.show_status()
# 显示远程仓库
self.remote_mgr.show_remotes()
def handle_manage_remotes(self):
"""处理远程仓库管理"""
OutputFormatter.header("管理远程仓库")
if not self.git_ops.is_git_repo():
OutputFormatter.error("当前目录不是Git仓库")
return
while True:
print(f"\n{Colors.BRIGHT_BLUE}{Colors.BOLD}>> 远程仓库管理{Colors.ENDC}")
print(f"{Colors.CYAN}{'-' * 60}{Colors.ENDC}")
OutputFormatter.menu_item(1, "查看远程仓库")
OutputFormatter.menu_item(2, "添加GitHub远程仓库")
OutputFormatter.menu_item(3, "添加Gitea远程仓库")
OutputFormatter.menu_item(4, "删除远程仓库")
OutputFormatter.menu_item(5, "返回主菜单")
print(f"{Colors.CYAN}{'-' * 60}{Colors.ENDC}")
choice = InputValidator.get_choice(
f"{Colors.BRIGHT_CYAN}>> 请选择 [1-5]: {Colors.ENDC}",
range(1, 6)
)
if choice == 1:
self.remote_mgr.show_remotes()
elif choice == 2:
self.remote_mgr.add_github_remote()
elif choice == 3:
self.remote_mgr.add_gitea_remote()
elif choice == 4:
self.remote_mgr.remove_remote()
elif choice == 5:
break
def run(self):
"""运行主程序"""
self.show_welcome()
while True:
self.show_main_menu()
choice = InputValidator.get_choice(
f"{Colors.BRIGHT_MAGENTA}>> 请输入选项 [1-6]: {Colors.ENDC}",
range(1, 7)
)
if choice == 1:
self.handle_init_repo()
elif choice == 2:
self.handle_commit_and_push()
elif choice == 3:
self.handle_pull()
elif choice == 4:
self.handle_show_status()
elif choice == 5:
self.handle_manage_remotes()
elif choice == 6:
print(f"\n{Colors.BRIGHT_GREEN}{'=' * 60}")
print(f"{Colors.BRIGHT_GREEN}{Colors.BOLD} 感谢使用QuickGit祝您工作愉快{Colors.ENDC}")
print(f"{Colors.BRIGHT_GREEN}{'=' * 60}{Colors.ENDC}\n")
break