Graphite 菜单栏(Menu Bar)完整操作指南:File、Edit、Layer、Select、View、Window、Help 菜单逐项详解
【免费下载链接】GraphiteCommunity-built comprehensive 2D content creation appplication for graphic design, digital art, and interactive real-time motion graphics powered by a node-based procedural graphics engine项目地址: https://gitcode.com/GitHub_Trending/gr/Graphite
Graphite 的**菜单栏(menu bar)**位于编辑器顶部标题栏(title bar)的左侧,是一组横排菜单,为文件处理、图层编辑、选区管理、画布导航、面板显隐与软件信息等高频操作提供了统一入口。阅读本篇后,你将能逐一掌握每个菜单下所有动作的含义、键盘快捷键与适用场景,并理解菜单项在无文档、无选区、节点图打开等状态下的自动禁用逻辑——这份指南既可作为日常操作速查手册,也可作为开发者理解 Graphite 菜单系统架构的入口。
菜单栏是什么
菜单栏由File(文件)、Edit(编辑)、Layer(图层)、Select(选择)、View(视图)、Window(窗口)和Help(帮助)七个下拉菜单组成,左侧还有一个app 按钮。点击任意菜单会弹出可点击的动作列表,每一行右侧都会列出对应的键盘快捷键——学会使用快捷键是显著提升工作流速度的关键。
从源码结构看,菜单栏的完整布局由 菜单栏消息处理器 中的layout()方法动态构建:每个菜单项都对应一个MenuListEntry,通过.on_commit(...)绑定要派发的消息、通过.tooltip_shortcut(action_shortcut!(...))绑定快捷键提示、通过.disabled(...)声明禁用条件。构建好的布局经由 布局消息处理器 做差异(diff)计算后推送到前端,最终由 TitleBar.svelte 订阅MenuBar布局更新并在窗口顶部渲染。值得注意的平台差异是:在 macOS 上菜单栏会渲染进系统原生菜单栏(布局处理器对 macOS 直接发送完整MenuBar布局以构建原生菜单),而 Windows/Linux/Web 平台则在编辑器窗口内渲染;同时 macOS 的标题栏中不渲染菜单按钮。
以下各节按菜单逐一展开,作为完整动作参考。如果你是第一次通读用户手册,可以跳过本节直接进入后续章节。
App 按钮
app 按钮显示为 Graphite 的 Logo 图标,点击它会打开网站首页。在源码中,该按钮在非 macOS 平台被实现为带有GraphiteLogo图标、点击后触发访问https://graphite.art的TextButton;在 macOS 平台则被实现为一个下拉菜单,内含About Graphite…、Preferences…、Hide Graphite、Hide Others、Show All、Quit Graphite等应用级命令(见 menu_bar_message_handler.rs)。
File 菜单
File 菜单列出了与文件处理相关的动作:
| 菜单项 | 说明 |
|---|---|
| New… | 打开新建文档(New Document)对话框,用于在新编辑器标签页中创建空白画布。参数包括:
DialogMessage::RequestNewDocumentDialog(menu_bar_message_handler.rs)。 |
| Open… | 打开操作系统文件选择器,从磁盘选择.graphite文件,并在新编辑器标签页中打开。对应消息PortfolioMessage::Open(menu_bar_message_handler.rs)。 |
| Open Demo Artwork… | 打开示例作品(Demo Artwork)对话框,加载仓库 demo-artwork 目录下预置的示例文件(如isometric-fountain.graphite、marbled-mandelbrot.graphite、red-dress.graphite等)供你探索。点击每张图片下方的按钮即可打开对应作品。 |
| Close | 关闭当前活动文档。若文档有未保存的更改(文件名后显示*号),会询问你保存还是放弃更改。对应PortfolioMessage::CloseActiveDocumentWithConfirmation(menu_bar_message_handler.rs)。 |
| Close All | 关闭所有已打开的文档。为避免意外丢失未保存的工作,会要求你确认继续,确认后将放弃所有打开文档中的未保存更改。对应PortfolioMessage::CloseAllDocumentsWithConfirmation(menu_bar_message_handler.rs)。 |
| Save | 将活动文档保存为.graphite文件写入磁盘。Web 版可能弹出操作系统下载对话框询问保存位置;该对话框允许你选择同名文件以覆盖先前版本,而不是以带数字后缀的新实例保存。对应DocumentMessage::SaveDocument(menu_bar_message_handler.rs)。此外,非 Web(原生桌面)构建还会额外提供Save As…(另存为),对应DocumentMessage::SaveDocumentAs(menu_bar_message_handler.rs)。 |
| Import… | 打开操作系统文件选择器,选择磁盘上的图片文件,作为新的位图图层或 SVG 内容置入当前活动文档。对应PortfolioMessage::Import(menu_bar_message_handler.rs)。 |
| Export… | 打开导出(Export)对话框,将作品保存为PNG、JPG或SVG文件类型。Scale Factor(缩放因子)会乘以内容文档比例,例如值为 2 时会把 300×400 的内容导出为 600×800 像素。Bounds(范围)选择渲染区域:All Artwork使用所有图层的包围盒,Selection使用当前选中图层的包围盒,Artboard: [Name]使用该画板的边界。对应DialogMessage::RequestExportDialog(menu_bar_message_handler.rs)。 |
| Preferences… | 打开编辑器偏好设置(Editor Preferences)对话框,用于配置 Graphite 的各项设置。在非 macOS 平台该菜单项位于 File 菜单内,在 macOS 平台则位于 app 按钮菜单中(menu_bar_message_handler.rs)。 |
Edit 菜单
Edit 菜单列出了与编辑工作流相关的动作:
| 菜单项 | 说明 |
|---|---|
| Undo | 在活动文档的更改历史中后退一步。对应DocumentMessage::Undo(menu_bar_message_handler.rs)。 |
| Redo | 在活动文档的更改历史中前进一步。对应DocumentMessage::Redo(menu_bar_message_handler.rs)。 |
| Cut | 将选中的图层复制到剪贴板,然后删除它们。对应ClipboardMessage::Cut(menu_bar_message_handler.rs)。 |
| Copy | 将选中的图层复制到剪贴板。对应ClipboardMessage::Copy(menu_bar_message_handler.rs)。 |
| Paste | 将剪贴板中的图层粘贴到文档中,粘贴后位于选中图层正上方,否则位于文件夹结构底部。在 Web 版中,浏览器会请求剪贴板读取权限,你必须授予;另一种方式是直接使用快捷键CtrlV(macOS:⌘V),这样无需浏览器权限。对应ClipboardMessage::Paste(menu_bar_message_handler.rs)。 |
| Duplicate | 在图层堆叠中,于原图层正上方创建所选图层的副本。对应DocumentMessage::DuplicateSelectedLayers(menu_bar_message_handler.rs)。 |
| Delete | 删除所有选中的图层和文件夹。对应DocumentMessage::DeleteSelectedLayers(menu_bar_message_handler.rs)。 |
| Convert to Infinite Canvas | 将文档中的所有画板替换为普通图层。当文档不再有任何画板时,即成为无限画布。对应DocumentMessage::RemoveArtboards(menu_bar_message_handler.rs)。 |
Layer 菜单
Layer 菜单列出了与文档内图层相关的动作:
| 菜单项 | 说明 |
|---|---|
| New | 在当前活动文档中创建新图层。新图层位于选中图层正上方,否则位于文件夹结构底部。对应DocumentMessage::CreateEmptyFolder(menu_bar_message_handler.rs)。 |
| Group | 在选中图层的位置创建新文件夹,并将选中图层移入该文件夹。对应DocumentMessage::GroupSelectedLayers(以GroupFolderType::Layer分组)(menu_bar_message_handler.rs)。 |
| Ungroup | 移除选中的文件夹,将其内容在图层堆叠中上移一层。对应DocumentMessage::UngroupSelectedLayers(menu_bar_message_handler.rs)。 |
| Hide/Show | 切换选中图层的可见性,决定其是否作为作品的一部分参与渲染。对应DocumentMessage::ToggleSelectedVisibility(menu_bar_message_handler.rs)。 |
| Lock/Unlock | 切换选中图层的锁定状态,锁定后无法在视口中被工具选中。对应DocumentMessage::ToggleSelectedLocked(menu_bar_message_handler.rs)。 |
| Grab | 开始抓取选中图层,随光标移动进行平移(移动)。按X或Y锁定到某一轴,然后使用数字键输入像素距离值。左键点击或Enter确认,右键点击或Esc取消。对应TransformLayerMessage::BeginGrab(menu_bar_message_handler.rs)。 |
| Rotate | 开始绕选中图层的枢轴点随光标移动旋转。使用数字键以度为单位输入角度值。左键点击或Enter确认,右键点击或Esc取消。对应TransformLayerMessage::BeginRotate(menu_bar_message_handler.rs)。 |
| Scale | 开始绕选中图层的枢轴点随光标移动缩放。按X或Y锁定到某一轴,使用数字键输入缩放倍数。左键点击或Enter确认,右键点击或Esc取消。对应TransformLayerMessage::BeginScale(menu_bar_message_handler.rs)。 |
| Arrange ▸ Raise to Front | 将选中图层重排到同文件夹内所有其他图层之上,使其在图层堆叠中显示并渲染于其他图层之上。对应DocumentMessage::SelectedLayersRaiseToFront(menu_bar_message_handler.rs)。 |
| Arrange ▸ Raise | 将选中图层在图层堆叠中上移一位,原本紧邻其上的图层会紧邻其下。对应DocumentMessage::SelectedLayersRaise(menu_bar_message_handler.rs)。 |
| Arrange ▸ Lower | 将选中图层在图层堆叠中下移一位,原本紧邻其下的图层会紧邻其上。对应DocumentMessage::SelectedLayersLower(menu_bar_message_handler.rs)。 |
| Arrange ▸ Lower to Back | 将选中图层重排到同文件夹内所有其他图层之下,使其渲染于其他图层之下。对应DocumentMessage::SelectedLayersLowerToBack(menu_bar_message_handler.rs)。 |
| Arrange ▸ Reverse | 通过上下互换位置来反转选中图层的顺序。反转作用于每组选中的兄弟图层(即共享同一父级的图层)。对应DocumentMessage::SelectedLayersReverse(menu_bar_message_handler.rs)。 |
| Align ▸ Align Left | 移动选中图层,使其左边缘与选区包围盒的最左边缘对齐(源码中以AlignAxis::X+AlignAggregate::Min实现,见 menu_bar_message_handler.rs)。 |
| Align ▸ Align Horizontal Center | 移动选中图层,使其水平中心与选区包围盒的水平中心对齐(AlignAxis::X+AlignAggregate::Center,menu_bar_message_handler.rs)。 |
| Align ▸ Align Right | 移动选中图层,使其右边缘与选区包围盒的最右边缘对齐(AlignAxis::X+AlignAggregate::Max,menu_bar_message_handler.rs)。 |
| Align ▸ Align Top | 移动选中图层,使其顶边缘与选区包围盒的最顶边缘对齐(AlignAxis::Y+AlignAggregate::Min,menu_bar_message_handler.rs)。 |
| Align ▸ Align Vertical Center | 移动选中图层,使其垂直中心与选区包围盒的垂直中心对齐(AlignAxis::Y+AlignAggregate::Center,menu_bar_message_handler.rs)。 |
| Align ▸ Align Bottom | 移动选中图层,使其底边缘与选区包围盒的最底边缘对齐(AlignAxis::Y+AlignAggregate::Max,menu_bar_message_handler.rs)。 |
| Flip ▸ Flip Horizontal | 在选区包围盒内水平镜像选中的图层(FlipAxis::X,menu_bar_message_handler.rs)。 |
| Flip ▸ Flip Vertical | 在选区包围盒内垂直镜像选中的图层(FlipAxis::Y,menu_bar_message_handler.rs)。 |
| Turn ▸ Turn -90° | 绕选区包围盒中心将选中图层逆时针旋转四分之一圈(对应DocumentMessage::RotateSelectedLayers { degrees: -90. },menu_bar_message_handler.rs)。 |
| Turn ▸ Turn 90° | 绕选区包围盒中心将选中图层顺时针旋转四分之一圈(对应DocumentMessage::RotateSelectedLayers { degrees: 90. },menu_bar_message_handler.rs)。 |
| Boolean ▸ Union | 合并所选矢量图层的所有路径,同时挖除重叠区域(包括单条路径的内部)。源码中将选中图层以GroupFolderType::BooleanOperation(BooleanOperation::Union)分组实现(menu_bar_message_handler.rs)。 |
| Boolean ▸ Subtract Front | 从所选矢量图层的最后一个中挖除重叠区域(BooleanOperation::SubtractFront,menu_bar_message_handler.rs)。 |
| Boolean ▸ Subtract Back | 从所选矢量图层的第一个中挖除重叠区域(BooleanOperation::SubtractBack,menu_bar_message_handler.rs)。 |
| Boolean ▸ Intersect | 挖除其余部分,仅保留所选矢量图层所有路径共享的重叠区域(BooleanOperation::Intersect,menu_bar_message_handler.rs)。 |
| Boolean ▸ Difference | 挖除所选矢量图层所有路径共享的重叠区域,只保留非重叠区域(BooleanOperation::Difference,menu_bar_message_handler.rs)。 |
| Blend | 对选中的图层执行混合(插值)操作。对应DocumentMessage::BlendSelectedLayers(menu_bar_message_handler.rs)。 |
| Morph | 对选中的图层执行变形(形态插值)操作。对应DocumentMessage::MorphSelectedLayers(menu_bar_message_handler.rs)。 |
| Make Path Editable | 对选中的矢量图层应用路径编辑操作(Path 节点),在其它非破坏性操作之后捕获几何体,使其可被Path与Pen工具直接修改。对应NodeGraphMessage::AddPathNode,仅在make_path_editable_is_allowed为真时可用(menu_bar_message_handler.rs)。 |
| Expand Fill/Stroke | 将选中图层的填充/描边展开为可编辑路径。对应DocumentMessage::ExpandFillStrokeOnSelectedLayers(menu_bar_message_handler.rs)。 |
Select 菜单
Select 菜单列出了与文档内图层选择相关的动作:
| 菜单项 | 说明 |
|---|---|
| Select All | 选择文档中的所有图层和文件夹。对应DocumentMessage::SelectAllLayers(menu_bar_message_handler.rs)。 |
| Deselect All | 取消选择文档中的所有内容。对应DocumentMessage::DeselectAllLayers(menu_bar_message_handler.rs)。 |
| Select Parent | 选择当前选中图层的父文件夹。对应DocumentMessage::SelectParentLayer(menu_bar_message_handler.rs)。 |
| Previous Selection | 在选择历史中回到上一次选中的图层或节点集合。如果你的鼠标侧面有导航按钮,可以使用后退按钮作为快捷方式(Firefox 不支持)。对应DocumentMessage::SelectionStepBack,仅在存在可回溯的选择历史时可用(menu_bar_message_handler.rs)。 |
| Next Selection | 在选择历史中前进到下一个选中的图层或节点集合。鼠标侧面的前进按钮可作快捷方式(Firefox 不支持)。对应DocumentMessage::SelectionStepForward(menu_bar_message_handler.rs)。 |
View 菜单
View 菜单列出了与视口内画布视图相关的动作:
| 菜单项 | 说明 |
|---|---|
| Tilt | 根据鼠标移动开始倾斜视口角度。倾斜时按住Shift可按 15° 增量吸附。左键点击或Enter确认,右键点击或Esc取消。对应NavigationMessage::BeginCanvasTilt(menu_bar_message_handler.rs)。 |
| Reset Tilt | 将视口倾斜角度重置为 0°。对应NavigationMessage::CanvasTiltSet { angle_radians: 0 },仅在画布已倾斜时可用(menu_bar_message_handler.rs)。 |
| Zoom In | 缩小视图到下一个整档缩放增量,档位例如:25%、33.33%、40%、50%、66.67%、80%、100%、125%、160%、200%、250%、320%、400%、500%。对应NavigationMessage::CanvasZoomIncrease(menu_bar_message_handler.rs)。 |
| Zoom Out | 放大视图到上一个整档缩放增量(档位同上)。对应NavigationMessage::CanvasZoomDecrease(menu_bar_message_handler.rs)。 |
| Zoom to Selection | 缩放并将视口取景到选中图层的包围盒。对应NavigationMessage::FitViewportToSelection(menu_bar_message_handler.rs)。 |
| Zoom to Fit | 缩放并将视口取景到所有画板,若使用无限画布则取景全部作品。对应DocumentMessage::ZoomCanvasToFitAll(menu_bar_message_handler.rs)。 |
| Zoom to 100% | 将视口缩放至 100% 比例,使文档与视口比例 1:1 匹配。对应DocumentMessage::ZoomCanvasTo100Percent(menu_bar_message_handler.rs)。 |
| Zoom to 200% | 将视口缩放至 200% 比例,以实际大小的两倍显示作品。对应DocumentMessage::ZoomCanvasTo200Percent(menu_bar_message_handler.rs)。 |
| Flip | 水平镜像视口,翻转作品的视图直到取消激活。对应NavigationMessage::CanvasFlip,菜单项前的复选框图标(CheckboxChecked/CheckboxUnchecked)会实时反映画布当前是否处于翻转状态(menu_bar_message_handler.rs)。 |
| Rulers | 切换视口顶部/左侧边缘标尺的可见性。对应PortfolioMessage::ToggleRulers,图标同样以复选框形式反映标尺当前是否可见(menu_bar_message_handler.rs)。 |
需要留意的是,Tilt、Reset Tilt、Flip 等视图变换动作在节点图(node graph)打开时会自动禁用,因为此时视口导航被节点图界面接管(见 menu_bar_message_handler.rs)。
Window 菜单
Window 菜单列出了与应用窗口内工作区面板显隐相关的动作:
| 菜单项 | 说明 |
|---|---|
| Fullscreen | 切换全屏模式。对应AppWindowMessage::Fullscreen(menu_bar_message_handler.rs)。 |
| Focus Document | 切换“聚焦文档”模式,隐藏面板以将全部空间让给画布。对应PortfolioMessage::ToggleFocusDocument,以复选框图标显示当前状态;聚焦模式下 Properties、Layers、Data 三个面板的开关会被禁用(menu_bar_message_handler.rs)。 |
| Reset Workspace | 将工作区布局重置为默认。对应PortfolioMessage::ResetWorkspaceLayout(menu_bar_message_handler.rs)。 |
| Properties | 切换工作区右上侧Properties 面板(属性面板)的可见性。该面板用于查看和编辑图形操作(节点)参数的值,选中的图层或节点会在其中显示参数化控件。对应PortfolioMessage::TogglePropertiesPanelOpen(menu_bar_message_handler.rs)。 |
| Layers | 切换工作区右下侧Layers 面板(图层面板)的可见性。该面板用于组织和选择构成文档结构的画板与图层。对应PortfolioMessage::ToggleLayersPanelOpen(menu_bar_message_handler.rs)。 |
| Data | 切换工作区左下侧Data 面板(数据面板)的可见性。该面板用于检查选中节点输出的数据流,以便对节点图内生成的内容做技术性调试。对应PortfolioMessage::ToggleDataPanelOpen(menu_bar_message_handler.rs)。 |
Help 菜单
Help 菜单列出了与 Graphite 相关信息相关的动作:
| 菜单项 | 说明 |
|---|---|
| About Graphite… | 打开关于 Graphite对话框,显示版本与许可证信息。你可以从中查看当前编辑器版本的发布日期。在非 macOS 平台位于 Help 菜单内,macOS 平台位于 app 按钮菜单(menu_bar_message_handler.rs)。 |
| User Manual | 打开本用户手册(menu_bar_message_handler.rs)。 |
| Donate to Graphite | 打开 Graphite 开发基金页面,你可以通过捐款支持项目的持续开发(menu_bar_message_handler.rs)。 |
| Report a Bug | 打开用于提交新 bug 报告的页面(menu_bar_message_handler.rs)。 |
| Visit on GitHub | 打开 Graphite 的 GitHub 仓库主页(menu_bar_message_handler.rs)。 |
| Developer Debug | 仅供开发者的动作分区,普通用户应忽略。包含以下开关与工具(menu_bar_message_handler.rs):
|
理解菜单栏的自动禁用(disabled)机制
细心的读者会发现,同一个菜单项在不同状态下可能置灰不可用。从 MenuBarMessageHandler 的状态字段 可以看出,菜单栏处理器维护了一组实时状态,包括has_active_document(是否存在活动文档)、has_selected_layers/has_selected_nodes(是否选中图层/节点)、has_selection_history(是否存在可回溯的选择历史)、canvas_tilted(画布是否已倾斜)、canvas_flipped(画布是否已翻转)、rulers_visible(标尺是否可见)、node_graph_open(节点图是否打开)、focus_document(是否聚焦文档模式)以及三个面板的打开状态。每个菜单项都通过这些状态推导出.disabled(...)条件,例如:
- 没有活动文档时,Close、Save、Undo、Redo、Paste、所有图层操作等涉及文档内容的菜单项全部禁用;
- 没有选中图层时,Cut、Copy、Group、Align、Flip、Turn、Boolean 等基于选区的操作禁用;
- 没有选择历史时,Previous Selection / Next Selection 禁用;
- 节点图打开时,Tilt、Reset Tilt、Flip 等视口导航操作禁用。
由于每个菜单项最终都会映射到一个具体的编辑器消息(如DocumentMessage、PortfolioMessage、NavigationMessage、TransformLayerMessage、DialogMessage、AppWindowMessage、FrontendMessage等),这套菜单体系本质上是消息驱动架构的入口之一:菜单栏中的每次点击都通过on_commit回调向消息队列派发对应动作,再经 dispatcher.rs 分发到相应处理器执行。理解了这一点,无论是日常使用还是参与开发,都能更准确地预判菜单行为。
【免费下载链接】GraphiteCommunity-built comprehensive 2D content creation appplication for graphic design, digital art, and interactive real-time motion graphics powered by a node-based procedural graphics engine项目地址: https://gitcode.com/GitHub_Trending/gr/Graphite
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考