Files
RestKit/Examples/RKDiscussionBoardExample/DiscussionBoard/Libraries/three20/Three20UI/TTRecursiveProgress.h

111 lines
3.6 KiB
Objective-C

//
// Copyright 2009-2010 Facebook
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
///////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////
@protocol TTRecursiveProgressDelegate
@required
/**
* @param progress The progress percentage within [0...1].
*/
- (void)didSetProgress:(CGFloat)progress;
@end
/**
* A generic recursive progress object. This object makes it possible to split progress into
* recursive chunks. Here's an example:
*
* 0 Standard progress bar 1
* |-----------------------------------|
*
* It's possible to split this into recursive chunks like so:
*
* 0 Recursive progress bar 1
* |-----------------------------------|
* 0 1 0 1 0 1
* |-------|-------|-------------------|
* 0 1 0 1
* |-------|-----------|
*
* Each progress object only knows about progress from 0...1. Setting the progress on any
* object propagates the number up the tree until it's at the root node, at which point we
* notify the delegate.
*
* An example: You write a method that displays progress. This method has submethods. Each
* submethod also needs to display progress, but they need to do so in sub units.
*
* Coding example:
*
* TTRecursiveProgress* progress = [TTRecursiveProgress progressWithDelegate:self];
* progress.percent = 0.5; // didSetProgress:0.5
*
* TTRecursiveProgress* subProgress = [TTRecursiveProgress
* progressWithParent: progress firstPercent: 0.2 lastPercent: 0.6];
* subProgress.percent = 0.5; // didSetProgress:0.4
*/
@interface TTRecursiveProgress : NSObject {
id<TTRecursiveProgressDelegate> _delegate; // Only valid in the topmost node.
TTRecursiveProgress* _parent; // Only valid in child nodes.
CGFloat _firstPercent;
CGFloat _lastPercent;
}
/**
* The initial percentage within the range of [0...1]
*/
@property (nonatomic) CGFloat firstPercent;
/**
* The final percentage within the range of [0...1].
* Should be >= firstPercent.
*/
@property (nonatomic) CGFloat lastPercent;
/**
* Set the progress at this level and propagate it to the root node.
* Eventually calls didSetProgress: on the delegate with a value from 0...1.
*/
@property (nonatomic) CGFloat percent;
/**
* The root level delegate.
*/
@property (nonatomic, assign) id<TTRecursiveProgressDelegate> delegate;
+ (id)progressWithDelegate:(id<TTRecursiveProgressDelegate>)delegate;
+ (id)progressWithParent: (TTRecursiveProgress*)parent
firstPercent: (CGFloat)firstPercent
lastPercent: (CGFloat)lastPercent;
// Designated initializer for root nodes
- (id)initWithDelegate:(id <TTRecursiveProgressDelegate>)delegate;
// Designated initializer for child nodes
- (id)initWithParent:(TTRecursiveProgress*)parent
firstPercent: (CGFloat)firstPercent
lastPercent: (CGFloat)lastPercent;
@end