ページ

2008年6月29日日曜日

タイマーダイアログ(その6)

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

タイマー開始ボタンを押したら、一時停止ボタンへ差し替える処理を加える。

最初は開始ボタンで、


開始後、一時停止ボタンになる。


ソース:TimerDialog-04.zip


今回の動作を行わせる為に、ThinButtonBar へグループという概念を追加した。

まずボタンを作る際にグループ(文字列)を指定するようにした。

[_button_bar addButtonWithImageResource:@"icon_cancel"
alterImageResource:@"icon_cancel2"
tag:TAG_CANCEL_TIMER
tooltip:NSLocalizedString(@"CancelTimer", @"")
group:nil];

[_button_bar addButtonWithImageResource:@"icon_start_timer"
alterImageResource:@"icon_start_timer2"
tag:TAG_START_TIMER
tooltip:NSLocalizedString(@"StartTimer", @"")
group:@"START_PAUSE"];

[_button_bar addButtonWithImageResource:@"icon_pause_timer"
alterImageResource:@"icon_pause_timer2"
tag:TAG_PAUSE_TIMER
tooltip:NSLocalizedString(@"PauseTimer", @"")
group:@"START_PAUSE"];

上記では2番目(開始ボタン)と3番目(一時停止ボタン)が同じ "START_PAUSE"グループに所属する。


ThinButtonBar にグループを管理する _group_list を追加した。これを使い、ボタン登録時に同じグループのボタンが存在する場合は従来の管理リスト _list へは追加せず、_group_list へ追加するようにした。ボタンの描画やヒットテストは _list を対象としているので特に修正はいらない。

ボタンが押された場合、そのボタンがグループに所属する場合にはグループ内の次の順番のボタンに _listを置き換える。これで開始ボタンを押した後に一時停止ボタンに表示が変わる。
ThinButton.m

    :
NSArray* group_array = [_group_list objectForKey:[hitButton group]];

if (group_array) {
NSUInteger i = 0;
ThinButton* button;
for (button in group_array) {
i++;
if (button == hitButton) {
break;
}
}
if (i == [group_array count]) {
i = 0;
}
button = [group_array objectAtIndex:i];
[self exchangeButtonFrom:hitButton To:button];
}
    :


タイマー完了後は元の開始ボタンに表示を変える為に #resetGroup を呼出している。このメソッドはグループ内の0番目のボタンへ戻す処理を行う。
- (void)resetGroup:(NSString*)group
{
NSArray* group_array = [_group_list objectForKey:group];
if (group_array && [group_array count] > 0) {
ThinButton *new = [group_array objectAtIndex:0];
for (ThinButton *old in _list) {
if ([group isEqualToString:[old group]]) {
[self exchangeButtonFrom:old To:new];
}
}
}
}