4 Commits

Author SHA1 Message Date
Serendipity 3302132644 docs: 更新注释与README,补充编译说明和架构描述
- 在 main.c 中添加编译和打包命令的注释
- 在 README.md 中新增“架构与二次开发”章节,说明项目的模块化设计和配置管理
2026-03-18 22:23:54 +08:00
Serendipity 59db3dc33b refactor(ui): 提取UI常量到配置文件并重构全局变量
- 新增 config.h 集中管理所有UI常量,如窗口标题、尺寸、颜色等
- 将全局变量和控件指针移至 globals.c 进行统一管理
- 更新 Makefile 以包含新增的源文件
- 修改 ui.c 使用配置常量替代硬编码值,提高可维护性
2026-03-18 22:21:36 +08:00
Serendipity 197b318c61 docs: 更新 README 以反映新增功能与改进
更新 README.md 文件,详细说明新增的深色模式、多选操作、撤销/重做、导入导出、变量展开预览、合并预览标签页以及全局快捷键等功能。同时完善了使用步骤,使其与当前版本的功能特性保持一致。
2026-03-17 21:35:20 +08:00
Serendipity b35fac5358 refactor: 重构项目结构,拆分回调函数并新增功能模块
- 将 callbacks.c 拆分为 cb_edit.c、cb_file.c、cb_main.c 三个模块,提高代码可维护性
- 新增 ui_utils.c 提供通用 UI 辅助函数
- 新增历史记录功能(撤销/重做)和主题切换支持
- 增加合并预览标签页,优化路径有效性检查和环境变量展开
- 更新 Makefile 以支持新的源文件结构
2026-03-17 21:18:21 +08:00
123 changed files with 2077 additions and 1526 deletions
-80
View File
@@ -1,80 +0,0 @@
cmake_minimum_required(VERSION 3.10)
project(PathEditor VERSION 3.0 LANGUAGES C)
# 启用资源编译器以处理 .rc 文件
enable_language(RC)
# 设置 C 标准
set(CMAKE_C_STANDARD 17)
set(CMAKE_C_STANDARD_REQUIRED ON)
set(CMAKE_C_EXTENSIONS OFF) # 禁用特定编译器的扩展(如 gnu17),强制使用标准 C17
# 定义源文件
set(SOURCES
src/main.c
src/utils/string_ext.c
src/utils/os_env.c
src/ui/ui_utils.c
src/ui/dialogs.c
src/ui/main_window.c
src/core/registry_service.c
src/core/path_manager.c
src/core/app_context.c
src/controller/callbacks.c
ico/resources.rc
)
# 创建 GUI 可执行文件(WIN32 属性会自动添加 -mwindows 参数)
add_executable(${PROJECT_NAME} WIN32 ${SOURCES})
# 添加宏定义
target_compile_definitions(${PROJECT_NAME} PRIVATE
_WIN32
UNICODE
_UNICODE
)
# 添加编译选项
if(CMAKE_C_COMPILER_ID MATCHES "GNU|Clang")
target_compile_options(${PROJECT_NAME} PRIVATE
-Wall
-O2
-fexec-charset=UTF-8
)
endif()
# 设置头文件搜索路径
target_include_directories(${PROJECT_NAME} PRIVATE
${CMAKE_SOURCE_DIR}/include
${CMAKE_SOURCE_DIR}/include/core
${CMAKE_SOURCE_DIR}/include/ui
${CMAKE_SOURCE_DIR}/include/controller
${CMAKE_SOURCE_DIR}/include/utils
${CMAKE_SOURCE_DIR}/libs/IUP/include
)
# 设置库文件搜索路径
target_link_directories(${PROJECT_NAME} PRIVATE
${CMAKE_SOURCE_DIR}/libs/IUP
)
# 链接所需库
target_link_libraries(${PROJECT_NAME} PRIVATE
iup
iupcd
gdi32
comdlg32
comctl32
uuid
ole32
advapi32
)
# 编译完成后,仅将程序实际需要的核心 DLL 文件复制到构建输出目录
set(IUP_REQUIRED_DLLS "${CMAKE_CURRENT_SOURCE_DIR}/libs/IUP/iup.dll")
add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_if_different
${IUP_REQUIRED_DLLS}
"$<TARGET_FILE_DIR:${PROJECT_NAME}>"
COMMENT "Copying required DLLs to build directory..."
)
+13 -4
View File
@@ -18,9 +18,9 @@ CFLAGS = -Wall -O2 -I$(INCLUDE_DIR) -I$(LOCAL_INCLUDE_DIR) -D_WIN32 -DUNICODE -D
LDFLAGS = -L$(LIB_DIR) -liup -liupcd -lgdi32 -lcomdlg32 -lcomctl32 -luuid -lole32 -ladvapi32 -mwindows LDFLAGS = -L$(LIB_DIR) -liup -liupcd -lgdi32 -lcomdlg32 -lcomctl32 -luuid -lole32 -ladvapi32 -mwindows
# Source # Source
SRC = src/main.c src/utils.c src/registry.c src/callbacks.c src/ui.c src/globals.c SRC = src/main.c src/utils.c src/registry.c src/ui.c src/ui_utils.c src/cb_edit.c src/cb_file.c src/cb_main.c src/globals.c
RES = ico/resources.rc RES = ico/resources.rc
OBJ = $(OBJ_DIR)/main.o $(OBJ_DIR)/utils.o $(OBJ_DIR)/registry.o $(OBJ_DIR)/callbacks.o $(OBJ_DIR)/ui.o $(OBJ_DIR)/globals.o $(OBJ_DIR)/resources.o OBJ = $(OBJ_DIR)/main.o $(OBJ_DIR)/utils.o $(OBJ_DIR)/registry.o $(OBJ_DIR)/ui.o $(OBJ_DIR)/ui_utils.o $(OBJ_DIR)/cb_edit.o $(OBJ_DIR)/cb_file.o $(OBJ_DIR)/cb_main.o $(OBJ_DIR)/globals.o $(OBJ_DIR)/resources.o
EXE = $(BIN_DIR)/PathEditor.exe EXE = $(BIN_DIR)/PathEditor.exe
all: $(BIN_DIR) $(OBJ_DIR) $(EXE) all: $(BIN_DIR) $(OBJ_DIR) $(EXE)
@@ -43,10 +43,19 @@ $(OBJ_DIR)/utils.o: src/utils.c
$(OBJ_DIR)/registry.o: src/registry.c $(OBJ_DIR)/registry.o: src/registry.c
$(CC) $(CFLAGS) -c -o $@ $< $(CC) $(CFLAGS) -c -o $@ $<
$(OBJ_DIR)/callbacks.o: src/callbacks.c $(OBJ_DIR)/ui.o: src/ui.c
$(CC) $(CFLAGS) -c -o $@ $< $(CC) $(CFLAGS) -c -o $@ $<
$(OBJ_DIR)/ui.o: src/ui.c $(OBJ_DIR)/ui_utils.o: src/ui_utils.c
$(CC) $(CFLAGS) -c -o $@ $<
$(OBJ_DIR)/cb_edit.o: src/cb_edit.c
$(CC) $(CFLAGS) -c -o $@ $<
$(OBJ_DIR)/cb_file.o: src/cb_file.c
$(CC) $(CFLAGS) -c -o $@ $<
$(OBJ_DIR)/cb_main.o: src/cb_main.c
$(CC) $(CFLAGS) -c -o $@ $< $(CC) $(CFLAGS) -c -o $@ $<
$(OBJ_DIR)/globals.o: src/globals.c $(OBJ_DIR)/globals.o: src/globals.c
+29 -29
View File
@@ -10,19 +10,25 @@
* **只读模式**:非管理员运行时自动切换到只读模式,防止误操作。 * **只读模式**:非管理员运行时自动切换到只读模式,防止误操作。
* **权限检测**:智能检测当前运行权限。 * **权限检测**:智能检测当前运行权限。
* **📑 双视图管理** * **📑 双视图与预览**
* 完美支持 **System (系统变量)****User (用户变量)** 的分离查看与编辑。 * **分离管理**完美支持 **System (系统变量)****User (用户变量)** 的分离查看与编辑。
* 清晰的 Tab 标签页切换 * **合并预览**:新增标签页,展示最终解析后的完整 PATH 顺序(系统在前,用户在后),方便排查冲突
* **变量展开**:鼠标悬停在包含变量(如 `%JAVA_HOME%`)的路径上时,自动显示解析后的绝对路径。
* **🔴 智能诊断与维护** * **🔴 智能诊断与维护**
* **无效路径高亮**:自动检测路径是否存在,不存在的显示为红色。 * **无效路径高亮**:自动检测路径是否存在,不存在的显示为红色。
* **重复路径高亮**:自动检测重复项,重复的显示为橙色。 * **重复路径高亮**:自动检测重复项,重复的显示为橙色。
* **一键清理**:智能移除所有无效和重复的路径,保持环境整洁。 * **一键清理**:智能移除所有无效和重复的路径,保持环境整洁。
* **📂 高交互** * **📂 高交互**
* **多选支持**:支持使用 `Ctrl``Shift` 进行多选,批量删除或移动路径。
* **撤销/重做**:支持 `Ctrl+Z` 撤销和 `Ctrl+Y` 重做,防止误操作,并提供直观的工具栏按钮。
* **拖拽支持**:直接将文件夹拖入窗口即可添加(支持管理员模式下的 UIPI 穿透)。 * **拖拽支持**:直接将文件夹拖入窗口即可添加(支持管理员模式下的 UIPI 穿透)。
* **实时搜索**:顶部搜索框支持不区分大小写的实时过滤查找。 * **实时搜索**:顶部搜索框支持不区分大小写的实时过滤查找(支持快捷键 `Ctrl+F`
* **快捷键**:支持 Delete 键快速删除选中项 * **全局快捷键**:支持 `Ctrl+N` 新建、`Ctrl+S` 保存、`Delete` 删除等快捷操作
* **🎨 个性化**
* **深色模式**:一键切换深色主题,保护视力。
* **便捷管理** * **便捷管理**
* **新建**:添加新路径到列表。 * **新建**:添加新路径到列表。
@@ -30,20 +36,16 @@
* ✏️ **编辑**:双击或点击按钮修改现有路径。 * ✏️ **编辑**:双击或点击按钮修改现有路径。
* 🗑️ **删除**:移除不需要的路径。 * 🗑️ **删除**:移除不需要的路径。
* ⬆️⬇️ **排序**:上移/下移调整路径优先级。 * ⬆️⬇️ **排序**:上移/下移调整路径优先级。
* 📥/📤 **导入导出**:支持将环境变量导出为 `.txt` 文本文件备份,或从文件导入恢复。
* **轻量级**:原生 C 语言编写,无臃肿依赖,运行速度极快。 * **轻量级**:原生 C 语言编写,无臃肿依赖,运行速度极快。
## 🏗️ 架构与二次开发 ## 🏗️ 架构与二次开发
本项目注重代码的模块化和可维护性,采用了经典的 **MVC 分层架构**非常适合作为 C 语言桌面程序开发的参考: 本项目注重代码的模块化和可维护性,非常适合作为 C 语言桌面程序开发的参考:
* **分层设计**
* `src/core/` (Model): 核心数据与业务逻辑,完全脱离 UI 框架(无任何 `<iup.h>` 依赖)。
* `src/ui/` (View): 负责界面布局与组件的纯视觉展示。
* `src/controller/` (Controller): 负责连接用户交互与底层数据。
* `src/utils/` (Utils): 纯粹的底层工具类封装(系统级调用、字符串处理)。
* **统一配置中心**:所有的 UI 尺寸、间距、颜色等常量配置均提取在 `include/config.h` 中,只需修改宏定义即可轻松定制属于你的专属界面风格。 * **统一配置中心**:所有的 UI 尺寸、间距、颜色等常量配置均提取在 `include/config.h` 中,只需修改宏定义即可轻松定制属于你的专属界面风格。
* **清晰的应用状态**摒弃了脆弱的全局变量模式,采用 `AppContext` 统一管理应用运行时的上下文状态,通过指针传递,安全可靠 * **清晰的全局状态**全局变量和常量被独立分离在 `src/globals.c` / `include/globals.h` 中管理,使得核心业务逻辑更加整洁
## 📦 下载与安装 ## 📦 下载与安装
@@ -59,13 +61,11 @@
* Windows 操作系统 * Windows 操作系统
* GCC 编译器 (推荐 MinGW-w64) * GCC 编译器 (推荐 MinGW-w64)
* CMake 工具 (推荐使用 CMake 构建) * Make 工具
* IUP 库 (已包含在 `libs` 目录下) * IUP 库 (已包含在 `libs` 目录下)
* Inno Setup 6 (仅打包需要) * Inno Setup 6 (仅打包需要)
### 编译步骤 (推荐使用 CMake) ### 编译步骤
本项目已迁移至 CMake 构建系统,支持生成更标准的构建文件并集成到各大 IDE。
1. 克隆仓库: 1. 克隆仓库:
@@ -74,18 +74,14 @@
cd PathEditor cd PathEditor
``` ```
2. 使用 CMake 配置和编译: 2. 编译项目
```bash ```bash
# 生成构建系统 (以 MinGW 为例) mingw32-make
cmake -B build -G "MinGW Makefiles"
# 编译项目
cmake --build build
``` ```
3. 运行: 3. 运行:
编译成功后,可执行文件位于 `build/PathEditor.exe`。 编译成功后,可执行文件位于 `bin/PathEditor.exe`。
### 打包 (可选) ### 打包 (可选)
@@ -101,12 +97,16 @@
2. **查看**:程序启动后会自动加载当前的系统 PATH 变量。 2. **查看**:程序启动后会自动加载当前的系统 PATH 变量。
* **红色**条目表示路径不存在。 * **红色**条目表示路径不存在。
* **橙色**条目表示路径重复。 * **橙色**条目表示路径重复。
3. **搜索**:在顶部输入关键词可快速筛选 * **变量预览**:鼠标悬停在带 `%` 的变量上可查看实际路径
3. **搜索**:在顶部输入关键词或按 `Ctrl+F` 可快速筛选。
4. **修改** 4. **修改**
* 拖拽文件夹列表可直接添加。 * **拖拽**:将文件夹拖入列表可直接添加。
* 使用右侧按钮栏进行常规操作 * **多选**:按住 `Ctrl` 或 `Shift` 可选中多项进行批量删除
* 点击“一键清理”可自动删除无效和重复项 * **撤销/重做**:误操作时可使用 `Ctrl+Z` / `Ctrl+Y` 或工具栏按钮回退
5. **保存**:操作完成后,务必点击底部的【确定】按钮保存更改 * **常规操作**:使用右侧按钮栏进行新建、编辑、移动等操作
* **清理**:点击“一键清理”可自动删除无效和重复项。
* **导入/导出**:使用导入导出功能备份或恢复配置。
5. **保存**:操作完成后,务必点击底部的【确定】按钮(或按 `Ctrl+S`)保存更改。
6. **生效**:保存后,某些正在运行的程序可能需要重启才能识别新的环境变量。CMD 或 PowerShell 窗口需要重新打开。 6. **生效**:保存后,某些正在运行的程序可能需要重启才能识别新的环境变量。CMD 或 PowerShell 窗口需要重新打开。
## 👤 作者信息 ## 👤 作者信息
Binary file not shown.
View File
View File
Binary file not shown.
+3
View File
@@ -1,4 +1,7 @@
@echo off @echo off
echo Copying DLLs...
if not exist bin mkdir bin
copy /Y "libs\iup-3.31_Win64_dllw6_lib\*.dll" bin\
echo Building Installer... echo Building Installer...
"D:\Program Files (x86)\Inno Setup 6\ISCC.exe" "dist\installer.iss" "D:\Program Files (x86)\Inno Setup 6\ISCC.exe" "dist\installer.iss"
+2 -2
View File
@@ -37,8 +37,8 @@ Name: "english"; MessagesFile: "compiler:Default.isl"
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked
[Files] [Files]
Source: "d:\Code\doing_exercises\programs\PathEditor\build\{#MyAppExeName}"; DestDir: "{app}"; Flags: ignoreversion Source: "d:\Code\doing_exercises\programs\PathEditor\bin\{#MyAppExeName}"; DestDir: "{app}"; Flags: ignoreversion
Source: "d:\Code\doing_exercises\programs\PathEditor\build\*.dll"; DestDir: "{app}"; Flags: ignoreversion Source: "d:\Code\doing_exercises\programs\PathEditor\bin\*.dll"; DestDir: "{app}"; Flags: ignoreversion
; NOTE: Don't use "Flags: ignoreversion" on any shared system files ; NOTE: Don't use "Flags: ignoreversion" on any shared system files
[Icons] [Icons]
+15
View File
@@ -0,0 +1,15 @@
#ifndef CB_EDIT_H
#define CB_EDIT_H
#include <iup.h>
// 编辑相关回调
int btn_new_cb(Ihandle *self);
int btn_edit_cb(Ihandle *self);
int list_dblclick_cb(Ihandle *self, int item, char *text);
int btn_del_cb(Ihandle *self);
int btn_up_cb(Ihandle *self);
int btn_down_cb(Ihandle *self);
int btn_clean_cb(Ihandle *self);
#endif // CB_EDIT_H
+14
View File
@@ -0,0 +1,14 @@
#ifndef CB_FILE_H
#define CB_FILE_H
#include <iup.h>
// 文件和历史记录回调
int btn_browse_cb(Ihandle *self);
int btn_undo_cb(Ihandle *self);
int btn_redo_cb(Ihandle *self);
int btn_export_cb(Ihandle *self);
int btn_import_cb(Ihandle *self);
int list_dropfiles_cb(Ihandle *self, const char *filename, int num, int x, int y);
#endif // CB_FILE_H
+17
View File
@@ -0,0 +1,17 @@
#ifndef CB_MAIN_H
#define CB_MAIN_H
#include <iup.h>
// 主界面交互回调
int txt_search_cb(Ihandle *self);
int list_k_any_cb(Ihandle *self, int c);
int list_motion_cb(Ihandle *self, int x, int y, char *status);
int dialog_k_any_cb(Ihandle *self, int c);
int btn_ok_cb(Ihandle *self);
int btn_cancel_cb(Ihandle *self);
int btn_help_cb(Ihandle *self);
int tabs_tabchange_cb(Ihandle *self, int new_pos, int old_pos);
int btn_theme_cb(Ihandle *self);
#endif // CB_MAIN_H
+15 -25
View File
@@ -1,33 +1,23 @@
#ifndef CONFIG_H #ifndef CONFIG_H
#define CONFIG_H #define CONFIG_H
// ============================================================================ // UI 常量定义
// UI的配置常量 #define UI_WINDOW_TITLE "Path Editor" // 窗口标题
// ============================================================================ #define UI_WINDOW_SIZE "800x800" // 窗口默认大小 (像素)
// 应用程序名称 // 按钮尺寸
#define APP_NAME "PathEditor" // 编辑环境变量应用程序名称 #define UI_BUTTON_SIZE "100x32" // 按钮默认大小 (像素)
#define APP_NAME_READONLY "PathEditor (只读模式)" // 编辑环境变量只读模式标题 #define UI_BUTTON_SMALL_SIZE "80x32" // 小按钮大小 (像素)
// 对话框设置 // 布局间距
#define UI_DLG_SIZE "800x800" // 对话框默认大小 (像素) #define UI_MARGIN_MAIN "10x10" // 主布局外边距 (像素)
#define UI_DLG_MINSIZE "800x800" // 对话框最小大小 (像素) #define UI_GAP_MAIN "10" // 主布局间距 (像素)
#define UI_GAP_BUTTONS "5" // 按钮间距 (像素)
#define UI_GAP_BOTTOM "10" // 底部间距 (像素)
// 列表控件设置 // 列表属性
#define UI_LIST_ITEM_PADDING "5x5" // 列表项内边距 #define UI_LIST_ITEM_PADDING "5x5" // 列表项内边距 (像素)
#define UI_LIST_BACKCOLOR "255 255 255" // 列表背景颜色 #define UI_LIST_BGCOLOR "255 255 255" // 列表背景颜色 (RGB)
#define UI_LIST_MERGED_BGCOLOR "240 240 240"// 合并列表背景颜色 (RGB)
// 按钮设置
#define UI_BTN_RASTERSIZE "100x32" // 按钮默认大小
// 布局间隙和边距
#define UI_VBOX_GAP "5" // 垂直布局项间隙
#define UI_VBOX_MARGIN "0x0" // 垂直布局外边距
#define UI_VBOX_ALL_MARGIN "10x10" // 垂直布局总外边距
#define UI_VBOX_ALL_GAP "5" // 垂直布局总间隙
#define UI_HBOX_GAP "10" // 水平布局项间隙
#define UI_HBOX_MARGIN "10x10" // 水平布局外边距
#define UI_HBOX_ALIGNMENT "ACENTER" // 水平布局对齐方式
#endif // CONFIG_H #endif // CONFIG_H
-33
View File
@@ -1,33 +0,0 @@
#ifndef CALLBACKS_H
#define CALLBACKS_H
#include <iup.h>
// 按钮回调
int btn_new_cb(Ihandle *self);
int btn_edit_cb(Ihandle *self);
int btn_browse_cb(Ihandle *self);
int btn_del_cb(Ihandle *self);
int btn_up_cb(Ihandle *self);
int btn_down_cb(Ihandle *self);
int btn_clean_cb(Ihandle *self);
int btn_ok_cb(Ihandle *self);
int btn_cancel_cb(Ihandle *self);
int btn_help_cb(Ihandle *self);
// 搜索回调
int txt_search_cb(Ihandle *self);
// 双击回调
int list_dblclick_cb(Ihandle *self, int item, char *text);
// 拖拽回调
int list_dropfiles_cb(Ihandle *self, const char *filename, int num, int x, int y);
// 键盘按键回调
int list_k_any_cb(Ihandle *self, int c);
// 载入数据与更新UI
void load_all_paths(void);
#endif // CALLBACKS_H
-22
View File
@@ -1,22 +0,0 @@
#ifndef APP_CONTEXT_H
#define APP_CONTEXT_H
#include "utils/string_ext.h"
#include <iup.h>
// 应用上下文结构体,用于存储应用运行时的状态
typedef struct {
StringList sys_paths;
StringList user_paths;
} AppContext;
// 创建应用上下文
AppContext* create_app_context(void);
// 销毁应用上下文
void destroy_app_context(AppContext* ctx);
// 获取应用上下文
AppContext* get_app_context(Ihandle *ih);
#endif // APP_CONTEXT_H
-19
View File
@@ -1,19 +0,0 @@
#ifndef PATH_MANAGER_H
#define PATH_MANAGER_H
#include "utils/string_ext.h"
// 移除列表中指定索引的项
void path_manager_remove_at(StringList *list, int index);
// 上移指定索引的项
void path_manager_move_up(StringList *list, int index);
// 下移指定索引的项
void path_manager_move_down(StringList *list, int index);
// 清理无效和重复的路径
// 返回被清理的项数
int path_manager_clean(StringList *list);
#endif // PATH_MANAGER_H
-14
View File
@@ -1,14 +0,0 @@
#ifndef REGISTRY_SERVICE_H
#define REGISTRY_SERVICE_H
#include "utils/string_ext.h"
// 加载系统变量和用户变量到字符串列表
int load_system_paths(StringList *list);
int load_user_paths(StringList *list);
// 从字符串列表保存系统变量和用户变量
int save_system_paths(const StringList *list);
int save_user_paths(const StringList *list);
#endif // REGISTRY_SERVICE_H
+76
View File
@@ -0,0 +1,76 @@
#ifndef GLOBALS_H
#define GLOBALS_H
#include <iup.h>
// 注册表路径常量
#define REG_PATH_SYS L"SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Environment"
#define REG_PATH_USER L"Environment"
#define REG_VALUE L"Path"
// 全局控件句柄声明
extern Ihandle *dlg; // 主对话框句柄
extern Ihandle *tabs_main; // 标签页容器
extern Ihandle *list_sys; // 系统变量列表
extern Ihandle *list_user; // 用户变量列表
extern Ihandle *list_merged; // 合并变量列表
extern Ihandle *lbl_status; // 状态标签句柄
extern Ihandle *btn_new; // 新增按钮句柄
extern Ihandle *btn_edit; // 编辑按钮句柄
extern Ihandle *btn_browse; // 浏览按钮句柄
extern Ihandle *btn_del; // 删除按钮句柄
extern Ihandle *btn_up; // 上移按钮句柄
extern Ihandle *btn_down; // 下移按钮句柄
extern Ihandle *btn_clean; // 一键清理按钮句柄
extern Ihandle *btn_undo; // 撤销按钮句柄
extern Ihandle *btn_redo; // 重做按钮句柄
extern Ihandle *btn_import; // 导入按钮句柄
extern Ihandle *btn_export; // 导出按钮句柄
extern Ihandle *btn_theme; // 主题切换按钮句柄
extern Ihandle *btn_ok; // 确认按钮句柄
extern int is_dark_mode; // 深色模式状态
extern Ihandle *btn_cancel; // 取消按钮句柄
extern Ihandle *btn_help; // 帮助按钮句柄
extern Ihandle *txt_search; // 搜索框
// 简单字符串列表结构,用于搜索缓存
typedef struct {
char **items;
int count;
int capacity;
} StringList;
extern StringList raw_sys_paths;
extern StringList raw_user_paths;
// 历史记录节点
typedef struct HistoryNode {
StringList sys_paths;
StringList user_paths;
struct HistoryNode *next;
} HistoryNode;
// 历史记录栈
typedef struct {
HistoryNode *top;
int count;
} HistoryStack;
extern HistoryStack undo_stack;
extern HistoryStack redo_stack;
extern Ihandle *btn_undo;
extern Ihandle *btn_redo;
// 缓存操作函数声明
void init_string_list(StringList *list);
void add_string_list(StringList *list, const char *str);
void clear_string_list(StringList *list);
void copy_string_list(StringList *dest, StringList *src);
// 历史记录操作
void init_history_stack(HistoryStack *stack);
void push_history(HistoryStack *stack, StringList *sys, StringList *user);
int pop_history(HistoryStack *stack, StringList *out_sys, StringList *out_user);
void clear_history_stack(HistoryStack *stack);
#endif // GLOBALS_H
+10
View File
@@ -0,0 +1,10 @@
#ifndef REGISTRY_H
#define REGISTRY_H
// 从注册表加载所有PATH到列表控件
void load_all_paths();
// 将列表控件中的PATH保存回注册表
void save_all_paths();
#endif // REGISTRY_H
+17
View File
@@ -0,0 +1,17 @@
#ifndef UI_H
#define UI_H
#include <iup.h>
// 创建列表控件
Ihandle *create_path_list();
// 创建右侧功能按钮区域
Ihandle *create_main_buttons();
// 创建底部按钮区域
Ihandle *create_bottom_buttons();
Ihandle *create_main_dialog();
#endif // UI_H
-8
View File
@@ -1,8 +0,0 @@
#ifndef DIALOGS_H
#define DIALOGS_H
// 自定义输入对话框
// 返回值:0-取消,1-确认
int custom_input_dialog(const char *title, const char *label_text, char *buffer, int buffer_size);
#endif // DIALOGS_H
-9
View File
@@ -1,9 +0,0 @@
#ifndef MAIN_WINDOW_H
#define MAIN_WINDOW_H
#include <iup.h>
// 创建主窗口
Ihandle* create_main_window(void);
#endif // MAIN_WINDOW_H
-13
View File
@@ -1,13 +0,0 @@
#ifndef UI_UTILS_H
#define UI_UTILS_H
#include <iup.h>
#include "utils/string_ext.h"
// 刷新单个列表框样式
void refresh_single_list_style(Ihandle *list);
// 同步字符串列表到 UI 列表框
void sync_string_list_to_ui(Ihandle *list_ui, const StringList *str_list);
#endif // UI_UTILS_H
+18
View File
@@ -0,0 +1,18 @@
#ifndef UI_UTILS_H
#define UI_UTILS_H
#include <iup.h>
#include "globals.h"
// 辅助函数声明
int get_first_selected_index(Ihandle *list);
void set_single_selection(Ihandle *list, int index);
void refresh_ui_from_raw(Ihandle *list, StringList *raw);
void record_history();
int custom_input_dialog(const char *title, const char *label_text, char *buffer, int buffer_size);
Ihandle *get_current_list();
void remove_from_raw_data(StringList *list, const char *str);
void toggle_edit_buttons(int enable);
void apply_theme();
#endif // UI_UTILS_H
+33
View File
@@ -0,0 +1,33 @@
#ifndef UTILS_H
#define UTILS_H
#include <windows.h>
#include <wchar.h>
#include <iup.h>
// 宽字符转UTF-8
char* wide_to_utf8(const wchar_t* wstr);
// UTF-8转宽字符
wchar_t* utf8_to_wide(const char* str);
// 检查管理员权限
int check_admin();
// 展开环境变量
char* expand_env_vars(const char* path);
// 检查路径是否有效(存在且为目录)
int is_path_valid(const char *path);
// 刷新列表样式(斑马纹)
void refresh_list_style();
void refresh_single_list_style(Ihandle *list);
// 备份注册表
void backup_registry();
// 不区分大小写的字符串查找
char *stristr(const char *haystack, const char *needle);
#endif // UTILS_H
-13
View File
@@ -1,13 +0,0 @@
#ifndef OS_ENV_H
#define OS_ENV_H
// 检查是否以管理员权限运行
int check_admin(void);
// 检查路径是否有效
int is_path_valid(const char *path);
// 备份注册表
void backup_registry(void);
#endif // OS_ENV_H
-24
View File
@@ -1,24 +0,0 @@
#ifndef STRING_EXT_H
#define STRING_EXT_H
#include <wchar.h>
// 简单字符串列表结构
typedef struct
{
char **items;
int count;
int capacity;
} StringList;
// 字符串列表
void init_string_list(StringList *list);
void add_string_list(StringList *list, const char *str);
void clear_string_list(StringList *list);
// 字符串转换函数
char *wide_to_utf8(const wchar_t *wstr);
wchar_t *utf8_to_wide(const char *str);
char *stristr(const char *haystack, const char *needle);
#endif // STRING_EXT_H
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.

Some files were not shown because too many files have changed in this diff Show More