この章ではメニューとステータスバーとツールバーの紹介をします。
macOSで、wxHaskellのメニューを正常に動作させるには、「はじめに」で紹介したように、アプリケーションをバンドルにしなければなりません。もしバンドルにしない場合は、アプリケーションの起動直後は、メニューが反応しません。アプリケーションを一度非アクティブにして、再度アクティブすると、メニューが反応するようになります。なお、Windowsでは、特に何もしなくても正常に動作します。
module Main where
import Graphics.UI.WX
import Graphics.UI.WXCore
main :: IO ()
main = start gui
gui :: IO ()
gui = do
f <- frame [text := "簡単なメニュー", clientSize := sz 250 150]
m <- menuPane [text := "ファイル"]
quit <- menuQuit m [on command := close f]
set f [menuBar := [m]]
return ()
macでは、アプリケーションをバンドルにするか、アプリケーションを一度非アクティブにして、再度アクティブしてからしか、メニューが反応しません。
main :: IO ()
main = start gui
gui :: IO ()
gui = do
f <- frame [text := "サブメニュー", clientSize := sz 250 150]
m <- menuPane [text := "ファイル"]
sub <- menuPane [text := "読み込み"]
ms1 <- menuItem sub [text := "ニュースフィードの読み込み..."]
ms2 <- menuItem sub [text := "ブックマークの読み込み..."]
ms3 <- menuItem sub [text := "メールの読み込み..."]
menuSub m sub []
separa <- menuLine m
quit <- menuQuit m [on command := close f]
set f [menuBar := [m]]
return ()
macでは、アプリケーションをバンドルにするか、アプリケーションを一度非アクティブにして、再度アクティブしてからしか、メニューが反応しません。
module Main where
import Graphics.UI.WX
import Graphics.UI.WXCore
main :: IO ()
main = start gui
gui :: IO ()
gui = do
f <- frame [text := "チェックメニューアイテム"]
m <- menuPane [text := "表示"]
check <- menuItem m [text := "チェック", checkable := True]
p <- panel f []
t <- staticText p [text := "..."]
set check [on command ::= menuChecked t]
set f [menuBar := [m], layout := margin 15 $ container p $
floatLeft (widget t), clientSize := sz 250 150]
return ()
where
menuChecked t check = do
bool <- get check checked
if bool
then set t [text := "チェックされました。"]
else set t [text := "..."]
macでは、アプリケーションをバンドルにするか、アプリケーションを一度非アクティブにして、再度アクティブしてからしか、メニューが反応しません。
module Main where
import Graphics.UI.WX
main :: IO ()
main = start gui
gui :: IO ()
gui = do
f <- frame [text := "PopupMenu", clientSize := sz 250 150]
m <- menuPane []
about <- menuAbout m [on command := infoDialog f "About PopupMenu"
"PopupMenu version 1.0\n© appdesign.jp"]
quit <- menuQuit m [on command := close f]
set f [on clickRight := pop m f]
return ()
where
pop m f pt = do
menuPopup m pt f
メニュー項目にショートカットキーを設定するには、メニュー項目の text 属性に「Ctrl+キー」と書き加えるだけです。
「Ctrl+キー」と記述していても、macOSでは、実際のアプリケーションでは、自動的に「⌘キー」に変わります。
module Main where
import Graphics.UI.WX
main :: IO ()
main = start gui
gui :: IO ()
gui = do
f <- frame [text := "ショートカットキー"]
m <- menuPane [text := "ファイル"]
about <- menuAbout m [on command := infoDialog f
"ショートカットキーについて"
"ショートカットキー\nバージョン 1.0\n© appdesign.jp"]
sep1 <- menuLine m
new <- menuItem m [text := "新規\tCtrl+N", on command := infoDialog f
"お知らせ"
"「新規」メニューが選ばれました"]
open <- menuItem m [text := "開く\tCtrl+O", on command := infoDialog f
"お知らせ"
"「開く」メニューが選ばれました"]
save <- menuItem m [text := "保存\tCtrl+S", on command := infoDialog f
"お知らせ"
"「保存」メニューが選ばれました"]
sep2 <- menuLine m
quit <- menuQuit m [on command := close f]
set f [menuBar := [m], clientSize := sz 250 150]
return ()
module Main where
import Graphics.UI.WX
import Graphics.UI.WXCore
main :: IO ()
main = start gui
gui :: IO ()
gui = do
f <- frame [text := "ステータスバー"]
p <- panel f []
menu <- menuPane [text := "ファイル"]
about <- menuAbout menu [help := "About..."]
clear <- menuItem menu [text := "消去", help := "消去メニュー"]
separa <- menuLine menu
q <- menuQuit menu [help := "終了メニュー"]
stat <- statusField []
b1 <- button p [text := "おはよう", on command ::= buttonClicked stat]
b2 <- button p [text := "おやすみ", on command ::= buttonClicked stat]
set clear [on command := clearStat stat]
set f [menuBar := [menu], statusBar := [stat],
layout := margin 5 $ container p $ row 5
[hfill (widget b1), hfill (widget b2)],
clientSize := sz 250 150
]
return ()
where
buttonClicked stat b = do
str <- get b text
set stat [text := str]
return ()
clearStat stat = do
set stat [text := ""]
サンプルで使用する画像はここからダウンロードできます。解凍した img フォルダをコードファイルと同じディレクトリに置いてください。
module Main where
import Graphics.UI.WX
import Graphics.UI.WXCore
main :: IO ()
main = start gui
gui :: IO ()
gui = do
f <- frame [text := "ツールバー"]
p <- panel f []
menu <- menuPane [text := "ファイル"]
about <- menuAbout menu [help := "About..."]
separa <- menuLine menu
q <- menuQuit menu [help := "終了メニュー"]
tbar <- toolBar f []
toolMenu tbar q "" "img/exit.png" [on command := close f]
stat <- statusField []
set f [menuBar := [menu], statusBar := [stat],
clientSize := sz 250 150
]
return ()