Barry Warsaw | 4638c5b | 1998-10-02 16:20:14 +0000 | [diff] [blame] | 1 | """Switchboard class. |
| 2 | |
| 3 | This class is used to coordinate updates among all Viewers. Every Viewer must |
| 4 | conform to the following interface: |
| 5 | |
| 6 | - it must include a method called update_yourself() which takes three |
| 7 | arguments; the red, green, and blue values of the selected color. |
| 8 | |
| 9 | - When a Viewer selects a color and wishes to update all other Views, it |
| 10 | should call update_views() on the Switchboard object. Not that the |
| 11 | Viewer typically does *not* update itself before calling update_views(), |
| 12 | since this would cause it to get updated twice. |
| 13 | """ |
| 14 | |
Barry Warsaw | 4ab5ae2 | 1998-10-22 18:48:01 +0000 | [diff] [blame] | 15 | import sys |
Barry Warsaw | 8a09e1c | 1998-10-20 20:45:46 +0000 | [diff] [blame] | 16 | from types import DictType |
| 17 | import marshal |
| 18 | |
Barry Warsaw | 987fb92 | 1998-09-28 15:59:21 +0000 | [diff] [blame] | 19 | class Switchboard: |
Barry Warsaw | 0604d72 | 1999-04-26 23:17:16 +0000 | [diff] [blame^] | 20 | def __init__(self, initfile): |
Barry Warsaw | ca07ba0 | 1998-10-22 03:25:59 +0000 | [diff] [blame] | 21 | self.__initfile = initfile |
Barry Warsaw | 0604d72 | 1999-04-26 23:17:16 +0000 | [diff] [blame^] | 22 | self.__colordb = None |
Barry Warsaw | 8a09e1c | 1998-10-20 20:45:46 +0000 | [diff] [blame] | 23 | self.__optiondb = {} |
| 24 | self.__views = [] |
Barry Warsaw | a7ba45b | 1998-10-01 16:46:43 +0000 | [diff] [blame] | 25 | self.__red = 0 |
| 26 | self.__green = 0 |
| 27 | self.__blue = 0 |
Barry Warsaw | ca07ba0 | 1998-10-22 03:25:59 +0000 | [diff] [blame] | 28 | self.__canceled = 0 |
Barry Warsaw | 8a09e1c | 1998-10-20 20:45:46 +0000 | [diff] [blame] | 29 | # read the initialization file |
| 30 | fp = None |
| 31 | if initfile: |
| 32 | try: |
| 33 | try: |
| 34 | fp = open(initfile) |
| 35 | self.__optiondb = marshal.load(fp) |
| 36 | if type(self.__optiondb) <> DictType: |
Barry Warsaw | 4ab5ae2 | 1998-10-22 18:48:01 +0000 | [diff] [blame] | 37 | sys.stderr.write( |
| 38 | 'Problem reading options from file: %s\n' % |
| 39 | initfile) |
Barry Warsaw | 8a09e1c | 1998-10-20 20:45:46 +0000 | [diff] [blame] | 40 | self.__optiondb = {} |
| 41 | except (IOError, EOFError): |
| 42 | pass |
| 43 | finally: |
| 44 | if fp: |
| 45 | fp.close() |
Barry Warsaw | 987fb92 | 1998-09-28 15:59:21 +0000 | [diff] [blame] | 46 | |
| 47 | def add_view(self, view): |
| 48 | self.__views.append(view) |
| 49 | |
Barry Warsaw | 1ac18cd | 1998-09-28 23:41:12 +0000 | [diff] [blame] | 50 | def update_views(self, red, green, blue): |
Barry Warsaw | a7ba45b | 1998-10-01 16:46:43 +0000 | [diff] [blame] | 51 | self.__red = red |
| 52 | self.__green = green |
| 53 | self.__blue = blue |
Barry Warsaw | 987fb92 | 1998-09-28 15:59:21 +0000 | [diff] [blame] | 54 | for v in self.__views: |
Barry Warsaw | 1ac18cd | 1998-09-28 23:41:12 +0000 | [diff] [blame] | 55 | v.update_yourself(red, green, blue) |
Barry Warsaw | fda3ace | 1998-09-29 20:04:19 +0000 | [diff] [blame] | 56 | |
Barry Warsaw | a7ba45b | 1998-10-01 16:46:43 +0000 | [diff] [blame] | 57 | def update_views_current(self): |
| 58 | self.update_views(self.__red, self.__green, self.__blue) |
| 59 | |
Barry Warsaw | cd09867 | 1998-10-05 21:14:12 +0000 | [diff] [blame] | 60 | def current_rgb(self): |
| 61 | return self.__red, self.__green, self.__blue |
| 62 | |
Barry Warsaw | fda3ace | 1998-09-29 20:04:19 +0000 | [diff] [blame] | 63 | def colordb(self): |
| 64 | return self.__colordb |
Barry Warsaw | 8a09e1c | 1998-10-20 20:45:46 +0000 | [diff] [blame] | 65 | |
Barry Warsaw | 0604d72 | 1999-04-26 23:17:16 +0000 | [diff] [blame^] | 66 | def set_colordb(self, colordb): |
| 67 | self.__colordb = colordb |
| 68 | |
Barry Warsaw | 8a09e1c | 1998-10-20 20:45:46 +0000 | [diff] [blame] | 69 | def optiondb(self): |
| 70 | return self.__optiondb |
| 71 | |
Barry Warsaw | ca07ba0 | 1998-10-22 03:25:59 +0000 | [diff] [blame] | 72 | def save_views(self): |
Barry Warsaw | 8a09e1c | 1998-10-20 20:45:46 +0000 | [diff] [blame] | 73 | # save the current color |
| 74 | self.__optiondb['RED'] = self.__red |
| 75 | self.__optiondb['GREEN'] = self.__green |
| 76 | self.__optiondb['BLUE'] = self.__blue |
| 77 | for v in self.__views: |
Barry Warsaw | ca07ba0 | 1998-10-22 03:25:59 +0000 | [diff] [blame] | 78 | if hasattr(v, 'save_options'): |
| 79 | v.save_options(self.__optiondb) |
Barry Warsaw | 0604d72 | 1999-04-26 23:17:16 +0000 | [diff] [blame^] | 80 | # save the name of the file used for the color database. we'll try to |
| 81 | # load this first. |
| 82 | self.__optiondb['DBFILE'] = self.__colordb.filename() |
Barry Warsaw | 8a09e1c | 1998-10-20 20:45:46 +0000 | [diff] [blame] | 83 | fp = None |
| 84 | try: |
| 85 | try: |
Barry Warsaw | ca07ba0 | 1998-10-22 03:25:59 +0000 | [diff] [blame] | 86 | fp = open(self.__initfile, 'w') |
Barry Warsaw | 8a09e1c | 1998-10-20 20:45:46 +0000 | [diff] [blame] | 87 | except IOError: |
Barry Warsaw | 4ab5ae2 | 1998-10-22 18:48:01 +0000 | [diff] [blame] | 88 | sys.stderr.write('Cannot write options to file: %s\n' % |
| 89 | self.__initfile) |
Barry Warsaw | 8a09e1c | 1998-10-20 20:45:46 +0000 | [diff] [blame] | 90 | else: |
| 91 | marshal.dump(self.__optiondb, fp) |
| 92 | finally: |
| 93 | if fp: |
| 94 | fp.close() |
Barry Warsaw | ca07ba0 | 1998-10-22 03:25:59 +0000 | [diff] [blame] | 95 | |
| 96 | def withdraw_views(self): |
| 97 | for v in self.__views: |
| 98 | if hasattr(v, 'withdraw'): |
| 99 | v.withdraw() |
| 100 | |
Barry Warsaw | 4ab5ae2 | 1998-10-22 18:48:01 +0000 | [diff] [blame] | 101 | def canceled(self, flag=1): |
| 102 | self.__canceled = flag |
Barry Warsaw | ca07ba0 | 1998-10-22 03:25:59 +0000 | [diff] [blame] | 103 | |
| 104 | def canceled_p(self): |
| 105 | return self.__canceled |