module Main where

import Common

import qualified Sound.MIDI.Message.Channel.Mode as Mode
import qualified Sound.MIDI.Message.Channel as ChannelMsg
import qualified Sound.MIDI.ALSA as MidiAlsa

import qualified Sound.ALSA.Sequencer.Event as Event
import qualified Sound.ALSA.Sequencer as SndSeq

import Graphics.UI.WX
   (Prop((:=)), set, get, text, selection, command, on,
    close, container, widget,
    layout, margin, label, row, column, )

import qualified Graphics.UI.WX as WX


makeGUI :: Sequencer SndSeq.OutputMode -> IO ()
makeGUI sequ = do
   f <- WX.frame [text := "MIDI Mode"]
   p <- WX.panel f []
   allNotesOff <- WX.button p [text := "All Notes Off"]
   allSoundOff <- WX.button p [text := "All Sound Off"]
   chan <- WX.spinCtrl p 0 15 []
   let getChan = fmap ChannelMsg.toChannel $ get chan selection
   set allNotesOff [
      on command := getChan >>=
         \c -> sendMode sequ c Mode.AllNotesOff
      ]
   set allSoundOff [
      on command := getChan >>=
         \c -> sendMode sequ c Mode.AllSoundOff
      ]
   quit <- WX.button p [text := "Quit", on command := close f]
   set f [layout := container p $ margin 10 $
             column 5 $
                WX.hfill (widget allNotesOff) :
                WX.hfill (widget allSoundOff) :
                (row 5 $ WX.valignCentre (label "Channel") : widget chan : []) :
                WX.hfill (widget quit) :
                []]


sendMode :: Sequencer SndSeq.OutputMode -> ChannelMsg.Channel -> Mode.T -> IO ()
sendMode h chan mode = do
   sendEvent h $
      Event.CtrlEv Event.Controller $ MidiAlsa.modeEvent chan mode


main :: IO ()
main =
   withSequencer "Mode" $ WX.start . makeGUI
