Pharo でアプリケーションを作るときの Tips

Pharo でアプリを作る人なんて(以下略)

そういうことになった人のために細かいノウハウをメモしておく。

(なお、ここで記載する内容は Pharo 10 を対象としたもので、前後のバージョンでは使えない可能性が高い)

フルスクリーン表示

OSのホスト画面いっぱいにアプリを表示したいときは以下のようにする。

Display fullscreenOn.

フルスクリーン表示を解除するには以下のようにする。

Display fullscreenOff.

フルスクリーン状態かどうか確認するには、「Display isFullscreen」を使う。

ウィンドウを閉じられないようにする

SpPresenter で作成したウィンドウの閉じるボタンをなくして閉じられなくするには、SpPresenter (のサブクラス)のオブジェクトで以下のようにする。

self window window makeUnclosable.

この設定は SystemWindow のウィンドウメニュー(後述)にある「Make unclosable」と同じ。

Pharo 10でこの設定をするとタイトルバーの表示が乱れてしまう。そのため後の withoutDecorations と併せて設定したほうが良い。

window メッセージを2回送っているのは、最初のメッセージで SpWindowPresenter オブジェクトを取得し、2つ目のメッセージでSystemWindow オブジェクトを取得しているから。(確か)

つまり、SystemWindow が生成された後にしか設定できないので、initializeWindow: (後述)では設定できない。

後で説明するようにウィンドウ装飾をなくせばクローズボタンは操作できなくなるけど、Ctrl-W でウィンドウを閉じられてしまうので、そうしたくないなら必須の設定。

上記設定をするとウィンドウが閉じられなくなるので、元に戻したい場合は以下のようにする。

self window window makeClosable.

ドラッグできないようにする

SpPresenter で作成したウィンドウをドラッグできない(動かせない)ようにするには、以下のようにする。

self window window beSticky.

この設定は SystemWindow のウィンドウメニューにある「Make undraggable」と同じ。

元に戻したい場合は以下のようにする。

self window window beUnsticky.

ウィンドウを最大化する

SpPresenter で作成したウィンドウを Pharo のウィンドウに合わせて最大化するには以下のようにする。

self window window fullscreen.

ただし、この設定を行ってもホストOSのウィンドウサイズが変更された場合、Pharo のウィンドウがそれに追随するわけではない。対応させるには別途細工が必要となる。

リサイズできないようにする

SpPresenter で作成したウィンドウをリサイズできない(マウス操作で大きさを変えない)ようにするには、以下のようにする。

self window beNotResizable.

こちらは SystemWindow の生成に関係なく設定できるので、initializeWindow: でも設定できる。

initializeWindow: は SpPresenter を使ってウィンドウを生成するときに送られてくるメッセージで、ウィンドウに対して各種設定ができる。

例えば以下のようなメソッドを定義しておくと、リサイズできないウィンドウが作られるようになる。

initializeWindow: aWindow

    aWindow beNotResizable

リサイズできるようにするには以下のようにする。

self window beResizable.

タイトル文字列を設定する

ウィンドウタイトルを設定するには以下のようにする。

initializeWindow: aWindow

    aWindow
        title: '適当な文字列'

後述の「ウィンドウの装飾をなくす」を設定すれば消えてしまうので意味ないかもしれない。

ウィンドウの初期サイズを指定する

何らかの事情で SpPresenter オブジェクト内でウィンドウサイズを指定したくなるかも。

例えば 200px × 300pxにするなら以下のように設定する。

initializeWindow: aWindow

    aWindow
        initialExtent: 200 @ 300

ウィンドウの装飾をなくす

ここでいうウィンドウの装飾とは Pharo 内のウィンドウ(SystemWindow)のタイトルバーのこと。タイトルバーには閉じるボタン、最大化・最小化ボタン、ウィンドウタイトル、ウィンドウメニューが含まれる。(下図参照)

SystemWindow のタイトルバー

これを取り除くには、以下のようにする。

self window withoutDecorations.

beResizable/beNotResizable と同様に、こちらの設定も initializeWindow: で行うことができる。

取り除いたタイトルバーを元に戻すには以下のようにする。

self window withDecorations.

ウィンドウが閉じられた際のフックを設定する

ウィンドウクローズ時に何かさせたい時は、以下のように initializeWindow: メソッド内で処理を記述する。

initializeWindow: aWindow

    aWindow
        whenClosedDo: [ "do something" ]

about テキストを設定する

アプリの説明文を追加するには以下のようにする。

initializeWindow: aWindow

    aWindow
        aboutText: '適当な説明文'

ここで設定したテキストは、ウィンドウメニューのAboutを選ぶことで表示できるほか、以下のように SpPresenter オブジェクトからも表示できる。

self window showAbout.

Pharo のメニューを消す

MenubarMorph showMenubar: false.

タスクバーを消す

TaskbarMorph showTaskbar: false.

ワールドメニューを表示させない

Pharo のデスクトップをクリックしても World メニューが表示されないようにする。

PasteUpMorph shouldShowWorldMenu: false.

こんなもんだろうか。

(追記)

Github gist にも投稿してみた。