Atalhos
Os atalhos de teclado do Studio são baseados em um registro central de
comandos (editor.shortcuts), em vez de verificações de tecla fixas
espalhadas pelos painéis. Todo atalho pode ser remapeado, conflitos são
detectados automaticamente, e os itens de menu mostram seu binding atual.
Atalhos padrão
| Comando | Padrão | Contexto |
|---|---|---|
| Desfazer (Undo) | Ctrl+Z |
Global |
| Refazer (Redo) | Ctrl+Shift+Z, Ctrl+Y |
Global |
| Copiar | Ctrl+C |
Global |
| Recortar | Ctrl+X |
Global |
| Colar | Ctrl+V |
Global |
| Play / Stop | Ctrl+P |
Global |
| Salvar | Ctrl+S |
Global |
| Salvar Tudo | Ctrl+Shift+S |
Global |
| Fechar Aba | Ctrl+W |
Global |
| Próxima / Aba Anterior | Ctrl+Tab / Ctrl+Shift+Tab |
Global |
| Ferramenta Mover / Rotacionar / Escalar | W / E / R |
Scene View (hover) |
| Focar Seleção | F |
Scene View (hover) |
| Renomear | F2 |
Hierarchy / Asset Browser (em foco) |
| Excluir | Delete, Backspace |
Hierarchy / Asset Browser (em foco) |
Comandos "Global" disparam independentemente de qual painel está em foco.
Comandos com escopo de painel (as teclas de ferramenta da Scene View, o
renomear e a navegação da Hierarchy/Asset Browser) só disparam enquanto
aquele painel específico é o que você está de fato interagindo — passando
o mouse sobre o viewport, ou tendo clicado em uma linha/tile — não apenas
porque o painel está aberto em algum lugar da tela. É isso que impede, por
exemplo, que a tecla R da Scene View mude o gizmo para Escala enquanto
você digita um R em um campo de renomear em outro lugar.
Digitar em qualquer campo de texto também suprime todo atalho que não seja pressionado com Ctrl ou Cmd — letras simples e Shift+letra sempre chegam ao campo que você está editando.
Remapeando
Abra Turian ▸ Settings, selecione a categoria Shortcuts na barra lateral. Cada linha mostra o comando, a qual painel ele está vinculado, e seu binding atual:
- Clique no botão de binding e pressione uma nova combinação de teclas. Esc cancela; Backspace limpa o binding por completo (o comando fica sem vínculo, não apenas "redefinido para o padrão").
- Um ícone de aviso aparece ao lado de um binding que colide com outro comando cujo escopo se sobrepõe a ele (dois comandos Global, ou um Global e um com escopo de painel) — passe o mouse sobre ele para ver com qual comando ele conflita. Bindings conflitantes ainda são permitidos, assim como na maioria dos editores; é um aviso, não um bloqueio rígido.
- O ícone de reverter ao lado de uma linha substituída redefine aquele comando de volta ao padrão. Reset All faz o mesmo para todos os comandos.
- Os remapeamentos têm efeito imediato assim que você os faz. Save os grava no arquivo de configurações; Reload descarta quaisquer remapeamentos não salvos.
Rótulos de menu
Itens de menu que têm um comando registrado mostram seu atalho atual alinhado à direita e esmaecido, obtido ao vivo do registro — um remapeamento no painel de configurações Shortcuts é refletido no menu no próximo frame, sem nenhum texto separado para manter sincronizado.
Para autores de plugins / módulos
Os comandos são registrados em tempo de execução, não declarados em um
único arquivo central — cada módulo de funcionalidade é dono de seus
próprios comandos, da mesma forma que studio/main-window/Panels.zig
permite que cada painel se registre:
const Shortcuts = @import("studio/services/Shortcuts.zig");
const my_commands = [_]Shortcuts.CommandDesc{
.{
.id = "myPlugin.doThing",
.title = "Do The Thing",
.context = .global, // ou .scene_viewport / .hierarchy / .asset_browser / .ui_editor / .text_input
.requires_focus = false, // true se isso só faz sentido enquanto seu painel está de fato em uso
.defaults = &.{Shortcuts.Binding.single(.{ .key = .t, .ctrl = true })},
},
};
const my_handlers = [_]?Shortcuts.Handler{myHandler};
// uma vez, por exemplo no primeiro draw:
Shortcuts.register(&my_commands, &my_handlers);
Para um comando com escopo no seu próprio painel (context diferente de
.global), não passe um handler — em vez disso, verifique-o diretamente
dentro do próprio loop de eventos do seu painel, no lugar de uma
verificação de tecla fixa:
for (gui.events()) |*e| {
if (Shortcuts.eventMatches(e, "myPlugin.panelAction", panel_is_engaged)) {
e.handle(@src(), my_widget_data);
doPanelAction();
}
}
panel_is_engaged é o que quer que "o usuário está olhando para o meu
painel" signifique para você — foco de teclado real do dvui para um painel
baseado em widget, ou hover do mouse para uma superfície não focável, como
um viewport 3D.
IDs de comando são strings namespaced (area.action) e também servem como
sufixo da chave de configuração (shortcut.<command_id>) — escolha um que
você esteja disposto a manter estável, já que renomeá-lo deixa órfão
qualquer remapeamento salvo de um usuário.