ページ

2009年7月19日日曜日

ホットキー変更対応(29) - リセットの実装

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

さてホットキー変更対応もいよいよ(というかやっと)大詰め。最後の機能であるリセットを実装する。いろいろいじくり回し最終的に下記のようになった。

まずはインターフェイスから。ウィンドウへ「Reset」ボタンを追加し、- [AppController reset:] を呼ぶように設定する。



次に Hotkeyのイニシャライザに targetを加える。これによって NSUserDefaults から取得した値を使い、1回で初期化ができる。
Hotkey.h

- (id)initWithSavekey:(NSString*)savekey number:(NSNumber*)number target:(id)target;



コントローラは初期化とリセット両方で使う共通処理をくくり出してメソッドにしておく。
AppController.m
- (void)initializeHotkeysFromDefaults
{
NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];
NSNumber* number;
Hotkey *hotkey;

number = [defaults objectForKey:@"HOTKEY1"];
hotkey = [[[Hotkey alloc] initWithSavekey:@"HOTKEY1"
number:number
target:self] autorelease];
[_hotkey_register registHotkey:hotkey];
[defaults setObject:[hotkey numberValue] forKey:[hotkey savekey]];

_text1.hotkey = hotkey;
_text1.target = self;

number = [defaults objectForKey:@"HOTKEY2"];
hotkey = [[[Hotkey alloc] initWithSavekey:@"HOTKEY2"
number:number
target:self] autorelease];
[_hotkey_register registHotkey:hotkey];
[defaults setObject:[hotkey numberValue] forKey:[hotkey savekey]];

_text2.hotkey = hotkey;
_text2.target = self;
}


このメソッドでは NSUserDefaultsから取得した値を無条件に使って Hotkeyを作成&登録する。起動時の初期化とリセット処理からこのメソッドを呼出す。


まずはリセット処理から。
- (IBAction)reset:(id)sender
{
[_hotkey_register unregistAll];
[self resetHotkeyDefaults];
[self initializeHotkeysFromDefaults];
}

リセッットボタンが押されたら、一旦すべてのホットキーの登録を解除(unregistAll)する。

続いて resetHotkeyDetails を呼出し、NSUserDefaults の値を初期化する。
- (void)resetHotkeyDefaults
{
NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];
NSNumber* number;

number = [Hotkey numberValueWithKeycode:0x23 modifier:(cmdKey | optionKey)];
[defaults setObject:number forKey:@"HOTKEY1"];

number = [Hotkey numberValueWithKeycode:0x25 modifier:(cmdKey | optionKey)];
[defaults setObject:number forKey:@"HOTKEY2"];

}

そして最後に initializeHotkeysFromDefaults を使い、ホットキーの再登録を行う。

まとめると、リセット処理は:
 1. ホットキー全登録解除
 2. NSUserDefaults初期化
 3. NSUserDefaultsの値を使いホットキーを登録する
となる。


一方、起動時の初期化処理はこんな感じ。
- (void)awakeFromNib
{
_hotkey_register = [HotkeyRegister sharedRegister];
if (![[NSUserDefaults standardUserDefaults] objectForKey:@"HOTKEY1"]) {
[self resetHotkeyDefaults];
}
[self initializeHotkeysFromDefaults];
}


if 文は、アプリの起動が初めてかどうかの判断を意味している。今回は安易に HOTKEY1 の値の存在だけで判断している。アプリケーションへ組み込む場合は、そのアプリに合った判断を書くべきだろう。もし初めてであればリセット処理と同じ動きとなる。そうでなければ NSUserDefaultsの値を使いホットキーを登録する。

初期化処理をまとめると:
 1. もし初めてなら NSUserDefaults を初期化する
 2. NSUserDefaultsの値を使いホットキーを登録する
となる。


なおNSUserDefaultsへ保存する NSNumber値の計算メソッッドをHotkeyのクラスメソッドとして公開しておく。以前のコードもそれに合わせて書き直す。
Hotkey.m
+ (NSNumber*)numberValueWithKeycode:(UInt32)code modifier:(UInt32)modifier
{
return [NSNumber numberWithUnsignedInt:(modifier<<16|code)];
}

- (NSNumber*)numberValue
{
return [Hotkey numberValueWithKeycode:self.code modifier:self.modifier];
}





サンプル:Hotkey-7.zip

- - - -
ようやく一通りの実装ができた。
いよいよ SimpleCap への組み込みに入る。