Pronto para criar um aplicativo legal do City Hall Clock para o seu Mac? Ótimo! Vamos criar um aplicativo que fica na barra de menu, toca a cada 15 minutos e até conta as horas. Vamos detalhar passo a passo e explicarei cada parte do código para que você possa entender o que está acontecendo.
Nosso aplicativo City Hall Clock irá:
Primeiro, vamos configurar nosso projeto:
mkdir CityHallClock cd CityHallClock
go mod init cityhallclock
go get github.com/getlantern/systray go get github.com/faiface/beep
Agora, vamos criar nosso arquivo main.go e examinar cada função:
package main import ( "bytes" "log" "os" "path/filepath" "time" "github.com/faiface/beep" "github.com/faiface/beep/mp3" "github.com/faiface/beep/speaker" "github.com/getlantern/systray" ) var ( audioBuffer *beep.Buffer ) func main() { initAudio() systray.Run(onReady, onExit) } // ... (other functions will go here)
Vamos detalhar cada função:
func main() { initAudio() systray.Run(onReady, onExit) }
É aqui que nosso aplicativo começa. Ele faz duas coisas importantes:
func initAudio() { execPath, err := os.Executable() if err != nil { log.Fatal(err) } resourcesPath := filepath.Join(filepath.Dir(execPath), "..", "Resources") chimeFile := filepath.Join(resourcesPath, "chime.mp3") f, err := os.Open(chimeFile) if err != nil { log.Fatal(err) } defer f.Close() streamer, format, err := mp3.Decode(f) if err != nil { log.Fatal(err) } defer streamer.Close() audioBuffer = beep.NewBuffer(format) audioBuffer.Append(streamer) err = speaker.Init(format.SampleRate, format.SampleRate.N(time.Second/10)) if err != nil { log.Fatal(err) } }
Esta função configura nosso áudio:
Se algo der errado (como não encontrar o arquivo de som), ele registrará o erro e será encerrado.
func onReady() { systray.SetIcon(getIcon()) systray.SetTitle("City Hall Clock") systray.SetTooltip("City Hall Clock") mQuit := systray.AddMenuItem("Quit", "Quit the app") go func() {Esta função configura nosso ícone na barra de menu:
- Define o ícone (usando getIcon()).
- Define o título e a dica de ferramenta.
- Adiciona uma opção "Sair" ao menu.
- Começa a ouvir quando a opção "Sair" é clicada.
- Começa a executar nosso relógio (em uma goroutine separada para não bloquear).
4. Função onExit()
func onExit() { // Cleanup tasks go here }Esta função é chamada quando o aplicativo é encerrado. Não estamos fazendo nada aqui, mas você pode adicionar tarefas de limpeza, se necessário.
5. Função runClock()
func runClock() { ticker := time.NewTicker(time.Minute) defer ticker.Stop() for { select { case t :=Este é o "coração" do nosso relógio:
- Ele cria um ticker que "marca" a cada minuto.
- Em um loop infinito, ele verifica a hora a cada minuto.
- Se for no final da hora ou quinze minutos, ele aciona o sinal sonoro.
6. Função chime()
func chime(t time.Time) { hour := t.Hour() minute := t.Minute() var chimeTimes int if minute == 0 { chimeTimes = hour % 12 if chimeTimes == 0 { chimeTimes = 12 } } else { chimeTimes = 1 } for i := 0; iEsta função toca nossos sinos:
- Ele calcula quantas vezes tocar (uma vez por quarto de hora ou o número da hora no início da hora).
- Em seguida, ele reproduz o som do sino várias vezes, com uma breve pausa entre os sinos.
7. Função getIcon()
func getIcon() []byte { execPath, err := os.Executable() if err != nil { log.Fatal(err) } iconPath := filepath.Join(filepath.Dir(execPath), "..", "Resources", "icon.png") // Read the icon file icon, err := os.ReadFile(iconPath) if err != nil { log.Fatal(err) } return icon }Esta função obtém nosso ícone da barra de menu:
- Ele descobre onde nosso aplicativo está sendo executado.
- Localiza o arquivo de ícone no diretório Recursos.
- Lê o arquivo de ícone e retorna seu conteúdo.
Criando o pacote de aplicativos macOS
Para tornar nosso aplicativo um cidadão macOS adequado, precisamos criar um pacote de aplicativos. Isso envolve a criação de um arquivo Info.plist:
CFBundleExecutable CityHallClock CFBundleIconFile AppIcon CFBundleIdentifier com.yourcompany.cityhallclock CFBundleName City Hall Clock CFBundlePackageType APPL CFBundleShortVersionString 1.0 CFBundleVersion 1 LSMinimumSystemVersion 10.12 LSUIElement NSHighResolutionCapable Salve como Info.plist no diretório do seu projeto.
Adicionando ícones personalizados
Precisamos de dois ícones:
- Ícone da barra de menu: crie um PNG de 22x22 pixels chamado icon.png.
- Ícone do aplicativo: Crie um arquivo .icns:
- Faça imagens com tamanhos de 16x16 a 1024x1024 pixels.
- Salve-os em AppIcon.iconset com nomes como icon_16x16.png.
- Execute: iconutil -c icns AppIcon.iconset
Construção e Embalagem
Vamos criar um script de construção (build.sh):
#!/bin/bash # Build the Go application go build -o CityHallClock # Create the app bundle structure mkdir -p CityHallClock.app/Contents/MacOS mkdir -p CityHallClock.app/Contents/Resources # Move the executable to the app bundle mv CityHallClock CityHallClock.app/Contents/MacOS/ # Copy the Info.plist cp Info.plist CityHallClock.app/Contents/ # Copy the chime sound to Resources cp chime.mp3 CityHallClock.app/Contents/Resources/ # Copy the menu bar icon cp icon.png CityHallClock.app/Contents/Resources/ # Copy the application icon cp AppIcon.icns CityHallClock.app/Contents/Resources/ echo "Application bundle created: CityHallClock.app"Torne-o executável com chmod x build.sh e, em seguida, execute-o com ./build.sh.
Conclusão
E aí está! Você criou um aplicativo City Hall Clock totalmente funcional para macOS. Você aprendeu sobre:
Sinta-se à vontade para expandir isso. Talvez adicione preferências para toques personalizados ou diferentes intervalos de toque. O céu é o limite!
Você pode encontrar o código-fonte completo aqui https://github.com/rezmoss/citychime
Boa programação e aproveite seu novo relógio!
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3