MinimumMenuを自分好みに改造する

前回 の続き。

自分は、メニューを操作する時に、マウスポインタを画面の上端に放り投げるようにして移動させる癖がある。ということは、必ず MinimumMenu が反応してしまうということ。上端まで勢いよく移動してからまた少し下に移動させなければならないので、これはほんの少しだけ面倒くさい。マウスを使っている時はそれほどでもないけれど、トラックパッドだとちょっとね。
そこで上端を素早く 2 回つっついた時にだけ青い線が出るようにしてみた。
それには、最初につついた時の時刻と 2 回目につついた時の時刻が、ある程度の時間しか経過していなければ表示させればよいだろう。ということは最初につついた時刻を記憶しておく必要がある。なので、インスタンス変数 firstKnockTimeClearWindow.h に宣言する。

NSTimeInterval firstKnockTime;

firstKnockTime の初期値は、アプリケーションが起動した時刻以前であればいつでもよいので、awakeFromNib あたりで 0.0 に初期化する。
2 回目につつかれた時の時刻は、mouseEntered メソッドの中で取り出す。その前に、mouseEntered の中身をがらっと改造してしまうのもいいが、Preferences パネルでお好みを選べるようにしたい。そこで UserDefaults から設定を取り出す supportDoubleKnocking メソッドを実装して場合分けすることにした。とりあえず、Preferences パネルの改造は後回しにするとして、 supportDoubleKnocking は単に YES を返すだけにしておく。

- (BOOL)supportDoubleKnocking {
    return YES;
}

さて、mouseEntered の改造は、まず 2 回目につつかれた時刻を取り出し、最初につつかれた時刻よりもわずかな時間しか経っていなければ、ダブルノックされたと判定する。そのわずかな時間というのも Preferences パネルで設定できるように考慮しておこう。そのために以下のメソッドを定義する。わずかな時間はとりあえず 0.5 秒にしておく。

- (float)doubleKnockingInterval {
    return 0.5;
}

後はウィンドウを表示して、現在アクティブなアプリケーションを保存しておけばよい。ただし、MinimumMenu がアクティブな場合、すなわち ClearWindow がキーウィンドウの時は、現在アクティブなアプリケーション、すなわち MinimumMenu 自身は保存しないようにしておく。もっとも、アクティブなアプリケーションを保存するメソッド storeActiveApp の中で MinimumMenu 自身は保存しないようにしているので、この条件分岐は必要ないかもしれないのでお好みで。
最後に、2 回目につつかれた時刻を最初につつかれた時刻にすれば完了である。

- (void)mouseEntered:(NSEvent *)event {
    ////NSLog(@"mouseEntered");
    if ([self supportDoubleKnocking]) {
        NSTimeInterval secondKnockTime = [NSDate timeIntervalSinceReferenceDate];
        if (secondKnockTime - firstKnockTime > [self doubleKnockingInterval]) {
        }
        else if ([self isKeyWindow]) {
            [self show];
        }
        else {
            [self show];
            [self storeActiveApp];
        }
        firstKnockTime = secondKnockTime;
    }
    else {
        [self show];
        [self storeActiveApp];
    }
}