home *** CD-ROM | disk | FTP | other *** search
/ Big Green CD 8 / BGCD_8_Dev.iso / NEXTSTEP / Graphics / ToyViewer-2.6a / src / ADController.bproj / ADController.m next >
Encoding:
Text File  |  1997-01-24  |  3.8 KB  |  197 lines

  1. #import "../ADController.h"
  2. #import <appkit/Button.h>
  3. #import "ADSlave.h"
  4. #import "../TVController.h"
  5. #import "../PrefControl.h"
  6.  
  7. #define  Stat_INIT    0
  8. #define  Stat_PLAY    1
  9. #define  Stat_PAUSE    2
  10. #define  Stat_QUIT    3
  11.  
  12. static id activePanel = nil;
  13.  
  14.  
  15. @implementation ADController
  16.  
  17. #define  Panel_X(n)    (6.0 + ((n) % 4) * 16.0 + ((n) / 8) * 9.0)
  18. #define  Panel_Y(n)    (400.0 - ((n) % 8) * 20.0)
  19.  
  20. /* Local Method */
  21. - locatePanel
  22. {
  23.     static int panelNum = 0;
  24.  
  25.     [panel moveTopLeftTo: Panel_X(panelNum): Panel_Y(panelNum)];
  26.     ++panelNum;
  27.     return self;
  28. }
  29.  
  30. /* Local Method */
  31. - jumpTo:(int) pos
  32. {
  33.     [slider setIntValue: pos];
  34.     currentNum = pos;
  35.     [nextFile setStringValue: [dirlist filenameAt: pos]];
  36.     return self;
  37. }
  38.  
  39.  
  40. - init:sender dir:(const char *)dir with:(DirList *)list
  41. {
  42.     int i, m;
  43.  
  44.     [NXApp loadNibSection:"AutoDisplay.nib" owner:self];
  45.     dirlist = list;
  46.     status = Stat_INIT;
  47.     fileNum = [dirlist fileNumber];
  48.     [slider setMaxValue: (fileNum - 1)];
  49.     [sliderMax setIntValue: fileNum];
  50.     [[self locatePanel] jumpTo: 0];
  51.     for (i = m = 0; dir[i]; i++)
  52.         if (dir[i] == '/') m = i + 1;
  53.     [[[panel setTitle: &dir[m]] display] makeKeyAndOrderFront: self];
  54.     [[panel setFloatingPanel:YES] setWorksWhenModal:YES];
  55.     [panel setFreeWhenClosed:YES];
  56.     [[lButton setContinuous:YES] setPeriodicDelay:0.5 andInterval:0.2];
  57.     [[rButton setContinuous:YES] setPeriodicDelay:0.5 andInterval:0.2];
  58.     NXPing();
  59.     slave = [[ADSlave alloc] init:self with:sender dir:dir];
  60.     waiting = NO;
  61.     return self;
  62. }
  63.  
  64. - free
  65. {
  66.     [dirlist free];
  67.     [slave free];
  68.     [super free];
  69.     return nil;
  70. }
  71.  
  72.  
  73. /* Local Method */
  74. - setButton:(int)stat
  75. {
  76.     if (activePanel == self && stat != Stat_PLAY)
  77.         activePanel = nil;    /* UNLOCKED */
  78.     [playButton setState:(stat == Stat_PLAY)];
  79.     [pauseButton setState:(stat == Stat_PAUSE)];
  80.     [quitButton setState:(stat == Stat_INIT)];
  81.     [stepButton setState:NO];
  82.     [slider setEnabled:(stat != Stat_PLAY)];
  83.     return self;
  84. }
  85.  
  86. - pausePush:sender
  87. {
  88.     [self setButton: (status = Stat_PAUSE)];
  89.     return self;
  90. }
  91.  
  92. - playPush:sender
  93. {
  94.     if (activePanel != nil && activePanel != self) {
  95.         [self setButton: status];
  96.         NXBeep();
  97.         return self;
  98.     }
  99.     activePanel = self;    /* LOCKED */
  100.     [self setButton: Stat_PLAY];
  101.     if (status != Stat_PLAY) {
  102.         status = Stat_PLAY;
  103.         [slave perform:@selector(donext:) with:self
  104.                 afterDelay: 300 cancelPrevious:YES];
  105.         waiting = YES;
  106.     }
  107.     return self;
  108. }
  109.  
  110. - stepPush:sender
  111. {
  112.     if (activePanel != nil && activePanel != self) {
  113.         [self setButton: status];
  114.         NXBeep();
  115.         return self;
  116.     }
  117.     activePanel = self;    /* LOCKED */
  118.     [playButton setState: NO];
  119.     [pauseButton setState: NO];
  120.     [quitButton setState: NO];
  121.     status = Stat_PLAY;
  122.     [slave dostep:self];
  123.     [self setButton: (status = Stat_PAUSE)];    /* UNLOCKED */
  124.     [self sliderUp: self];
  125.     return self;
  126. }
  127.  
  128. - quitPush:sender
  129. {
  130.     [self setButton: Stat_INIT];
  131.     [panel close];
  132.     NXPing();
  133.     if (waiting) {
  134.         status = Stat_QUIT;
  135.         return self;
  136.     }
  137.     return [self free];
  138. }
  139.  
  140.  
  141. - sliderChange:sender
  142. {
  143.     int n = [slider intValue];
  144.     if (currentNum != n)
  145.         [self jumpTo: n];
  146.     return self;
  147. }
  148.  
  149. - sliderDown:sender
  150. {
  151.     if (status != Stat_PLAY && currentNum > 0)
  152.         [self jumpTo: currentNum - 1];
  153.     return self;
  154. }
  155.  
  156. - sliderUp:sender
  157. {
  158.     if (status != Stat_PLAY && currentNum < fileNum-1)
  159.         [self jumpTo: currentNum + 1];
  160.     return self;
  161. }
  162.  
  163.  
  164. - (const char *)nextFilename
  165. {
  166.     return (status == Stat_PLAY) ? [dirlist filenameAt: currentNum] : NULL;
  167. }
  168.  
  169. - continueLoop:(BOOL)cont
  170. {
  171.     int intv;
  172.  
  173.     if (status == Stat_QUIT) return [self free];
  174.     if (!cont) {
  175.         waiting = NO;
  176.         return self;
  177.     }
  178.     if (currentNum >= fileNum-1) {
  179.         [self pausePush: self];
  180.         waiting = NO;
  181.         return self;
  182.     }
  183.     [self jumpTo: currentNum + 1];
  184.     intv = (thePreference) ? [thePreference autoDisplayInterval] : 2500;
  185.     [slave perform:@selector(donext:) with:self
  186.             afterDelay: intv cancelPrevious:YES];
  187.     waiting = YES;
  188.     return self;
  189. }
  190.  
  191. - (BOOL) scanFixPosition
  192. {
  193.     return ([thePreference windowPosition] == pos_FixScan);
  194. }
  195.  
  196. @end
  197.