April 16, Brad --------------- * Support for Sound (faked under Unix) new files: include/amulet/am_sound.h src/gem/gemX_sound.cc src/gem/gemM_sound.h (used to be macsound.h) src/gem/gemM_sound.cc (used to be macsound.cc) src/gem/gemX_sound.cc (used to be wsound.cc) src/gem/testsound.cc (used to be sound_main.cc) on Unix and PC, sounds just beep and print out a message. * testinter has a new test "O" that has a sound for moving. * testanimators has sounds for when the eye bounces and for when the top menu breaks apart. (just faked for now) * testselectionwidget has a screen reader interactor. Turn on by hitting 'O'. Interface: in am_sound.h (which is automatically included by amulet.h now) extern Am_Object Am_Sound; //main prototype extern Am_Object Am_Text_To_Speech_Sound; //has Am_TEXT slot which it reads extern void Am_Destroy_Sound( Am_Object& theSound ); extern Am_Object Am_Load_Generated_Sound( void ); extern Am_Object Am_Load_Sound( char *fileName ); extern Am_Object Am_Load_Resource_Sound( short fileID ); extern void Am_Play_Sound( Am_Object& theSound ); extern void Am_Stop_All_Sound( void ); extern void Am_Stop_Sound( Am_Object& theSound ); High-level interface: Any interactor or animator can have the following slots containing a sound: Am_START_SOUND, Am_INTERIM_SOUND, Am_STOP_SOUND, Am_ABORT_SOUND, If there is an interim_sound it is linked to the end of the start_sound so it will start playing when the start sound is done. The interim should should be marked with Am_SOUND_REPEAT as -1 so it repeats continuously. Any Command Object can have an Am_STOP_SOUND which will be played when the command is executed (when its DO method is called). Special feature of Am_Animation_Object_In_Owner_Command that calls Am_STOP_SOUND when it bounces, in addition to when it stops. April 9, Brad ------------- * if Am_MULTI_OWNERS works for Am_New_Points_Interactor, if moving feedback from one window to another (if num_points == 1) * If Am_MULTI_OWNERS is true and the owner of the feedback is the window, then feedback will move to other windows. March 30, 1998, Brad -------------------- * Text edit interactors support multiple users editing at the same time. If the Am_FEEDBACK_OBJECT slot of the inter is set, then the regular text's cursor_index is not used. The feedback's visible will be turned on and off appropriately, but the programmer is responsible for putting the feedback object in the right place. This usually will involve a complicated formula that depends on the value of the Am_CURSOR_INDEX slot of the interactor. See src/pebbles/pebblesdraw for an example. * Support for multiple user input from PalmPilots - Pebbles_Module will accept input from PalmPilots and use them as different user-id's on PC - PebblesDraw supports multiple people drawing at the same time * Support Am_SPECIAL_HANDLE slot of selection widget being an arbitrary picture, like a bitmap picture, in which case uses that as the handle. Can be any size. March 19, 1998, Brad -------------------- * Fixed button panels so can set the Am_FIXED_WIDTH slot to make them all the same size * Removed an old manual.ps from the repository to decrease the size of the tar file. * Made built-in editing commands beep and not queue for undo if execute when NOT active (normally cmds wouldn't even be executed if not active, but hard to invalidate them in a multi-user situation). * Support for Am_USER_ID of interactors, Am_LAST_USER_ID of the Am_Screen. - Built-in editing commands can take a list of selection handles, instead of a single one, and will use the appropriate one based on the current user-id - undo dialog box will display a user's icon next to each command ========================== put on web March, 15, 1998 Brad -------------------- * Added new slots to selection_widget for Rich: if the next three are set, they are used to grid growing. Otherwise, the regular grid values are used, whichj are the same as for moving Am_SELECT_GRID_GROW_X, // separate gridding for grow vs. move Am_SELECT_GRID_GROW_Y, Am_SELECT_GRID_GROW_METHOD, if the next one is set to true, then draws a 3x3 dot in the center of the selected objects. Am_SELECT_CENTER_DOT there are new commands C and g in testselectionwidget to test these Dec 17, Huebner --------------- * network support and netpong Dec 17, BAM ---------- * break on message call in inspector Sep 11, BAM ---------- (already reported) * Made circuit work with scripting * Other scripting updates for testselectionwidget Sep 1, BAM ---------- * Created new sample: pong, which will (hopefully) be the start of a two-person game: 288 lines as a one-person game Aug 29, BAM ------------ * New interactor Am_Text_Create_Interactor which creates a new text object if click in the background. This is now used in testselectionwidget. - slot of Am_Text_Create_Interactor: Am_CREATE_IF_ZERO_LENGTH: if true, the default, then won't create strings of zero length, silently aborts instead - new methods for the Am_START_WHERE_TEST slot of the text create object: Am_Inter_Not_In_Text_Object_Or_Part and Am_Inter_Not_In_Text_Leaf ** should also have: Am_Inter_Not_In_Text, Am_Inter_Not_In_Text_Part, but don't yet - also takes grid slots Aug 15, Richm ---------- * added directional to Am_Inter_Location // if location is a line, then line may not be distinguishable // when reversed. (Directional for non-lines means that width // and height are not allowed to be negative [which is always true]). -- not fully implemented (not copied!, not tested on operator==) Aug 7, BAM ---------- * Duplicate command now has original object as its Am_OBJECT_MODIFIED * Lots of commands now accept selective_repeat_on_new * New function Am_Parse_Input_As_Type exported by debugger.h, (used by inspector and scripting) allows inspector to parse floats and "Am_No_xxx" values. * New function Am_Parse_Input_As_List_Of_Type for a list containing a single type (not used by the inspector) * Lots of new functions for Am_Inter_Location: void Set_Control (Am_Location_Value_Control a_control, Am_Location_Value_Control b_control, Am_Location_Value_Control c_control, Am_Location_Value_Control d_control, bool make_unique = true); void Set_Control (Am_Location_Value_Control all_control, bool make_unique = true); void Set_A_Control (Am_Location_Value_Control control, bool make_unique = true); void Set_B_Control (Am_Location_Value_Control control, bool make_unique = true); void Set_C_Control (Am_Location_Value_Control control, bool make_unique = true); void Set_D_Control (Am_Location_Value_Control control, bool make_unique = true); void Get_Control (Am_Location_Value_Control &a_control, Am_Location_Value_Control &b_control, Am_Location_Value_Control &c_control, Am_Location_Value_Control &d_control) const; void Get_Control (Am_Location_Value_Control &a_control, Am_Location_Value_Control &b_control) const; bool Is_Zero_Size() const; Aug 3, BAM ---------- * defined type Am_Am_Slot_Key which is a wrapper that can be used for slot keys when put into slots, so their names will be printed out. E.g., Am_Value_List().Add(Am_Am_Slot_Key(Am_LEFT)) then, should print with the names July 31, BAM ------------ * Whole new initialization mechanism: #include INITIALIZERS_H Each file should have a global variable like the following: Am_Initializer* buttons_init = new Am_Initializer("Buttons", Am_Buttons_Initialize, 4.1, buttons_cleanup_proc); where the number is the ordering (lower numbers come first) and the cleanup procedure is optional * New .h file: initializer.h **** Cleanup doesn't actually do anything unless the variable CLEANUP is defined, since not needed on most operating systems, and without it, programs exit faster July 21, BAM ------------ * NOT_BACKWARDS COMPATIBLE: Changed Am_SELECTIVE_REPEAT_NEW_ALLOWED and Am_SELECTIVE_REPEAT_ON_NEW_METHOD methods to have an extra parameter which is the new value to use. * Changed sun.inhouse to use AMULET2_WARNINGs for set vs. add errors * Added Am_Select_Command type to mark commands that are change the selection * Moved Am_Selective_Allowed_Return_True, Am_Selective_Allowed_Return_False, Am_Selective_New_Allowed_Return_False, and Am_Selective_New_Allowed_Return_True to inter.h from inter_advanced.h * added growing boolean to Am_Inter_Locations to say whether this specifies the size. void Set_Growing (bool growing, bool make_unique = true); bool Get_Growing () const; * Am_Value& Am_Value_List::Get_First () const; //returns the first item of the list, ignoring the current element. // error if no first element (don't have to call Start() first) * static bool Am_Value_List::List_Or_Value_Equal(const Am_Value& v1, const Am_Value& v2); returns true of v1 == v2. Or, if either v1 or v2 is a list and the other isn't a list, and the list contains a single value which is == to the other value, then returns true. * Added Am_Value_List Recursive_Copy (); // Creates a copy of the list's contents. If any of the elements of // the list are lists themselves, they are copied as well, // recursively. July 11, BAM ------------ * Changed object created to always be the VALUE of the command. In particular, - for command from new-points, object created now both in Am_OBJECT_MODIFIED and Am_VALUE - for command in paste and duplicate: changed object from Am_OBJECT_MODIFIED to be Am_VALUE Am_OBJECT_MODIFIED now is Am_No_Object * Created new types of command objects for noting that this command creates new objects. Exported by inter.h. These are now used by new_points_inter, paste_command, group command, - Am_Create_Command is the prototype for the commands below that create new objects. These new commands are used for operations that create new objects, so that the macro facility knows it is a create operation. All slots are the same as Am_Command. Normally do NOT use Am_Create_Command, but instead use one of the two following types: - Am_Object_Create_Command: Use this one for commands that create objects "from scratch", like Am_New_Points_Interactor. - Am_From_Other_Create_Command: for operations that create new objects but not from scratch. For example, Duplicate, Paste, group and other operations that cause new objects to appear, but which aren't "regular" creates. * Added new built-in constraint Am_Rest_Of_Height_Above to Opal: extern Am_Formula Am_Rest_Of_Height_Above(Am_Slot_Key sibling, int offset = 0); - put into the height slot to make the object's height be from its top to offset above the sibling. Often, the sibling will use Am_Bottom_Is_Bottom_Of_Owner so it will be at the bottom of the owner. * clicking in background of scrolling menu turns off the selection. * Fixed (?I hope?) a bug in buttons where the object to be displayed was not correctly added as a part so if it had interactors, they didn't always work. July 8, BAM ----------- * Am_Value_List l.Start_Member(v) -- does Start() then Member -- should rename this to be Member and have a new Next_Member function * Added Am_Assoc type to value_list. Can add Am_Assoc's to a value list, and then get out the value from either key: Am_Value_List vlassoc; vlassoc.Add(Am_Assoc(1, "10")).Add(Am_Assoc(2, "20")) .Add(Am_Assoc("backwards-3", 3)) .Add(Am_Assoc("a", a)); then vlassoc.Assoc_1("10") returns 1 and vlassoc.Assoc_2("backwards-3") returns 3 //look for value_1 as the first item of an assoc in the list, and if //found, then returns the corresponding value_2. Error if any items //in list are not Am_Assoc's. Returns Am_No_Value if not found. // Does not affect the position pointer of list (unlike Member) * Added Pop() and Push (val) // Retrieve the value of the first element. // Error if list is empty. Removes the first element from the list. // Same as Start(); Get(); Delete(); Changes the pointer. Am_Value_List& Push (Am_Wrapper* value, bool unique = true) { return Add(value, Am_HEAD, unique); } Am_Value_List& Push (const Am_Value& value, bool unique = true) { return Add(value, Am_HEAD, unique); } July 8, BAM ----------- * Added ability in object.cc to call a function when objects are created, copied or destroyed, like slot setting. * Added interface in the inspector for this. Can select an object, or else will operate on the "main" object being shown. New commands in the Break/Trace menu. * Fixed accelerator in menus so there are no conflicts with items that are not active. This is needed by new Gilt to add menu-bars with predefined command objects into the window. Also fixed a bug in V3 that commands that were inactive because whole menu or whole menubar was inactive in menubars could still be executed through their accelerators June 24, Ellen --------------- added to gdefs.h and gem?_image.cc bool Am_Image_Array::Get_RGB_Image(unsigned_char * storage, bool top_first = true) -- Returns in storage (allocated by caller) the RGB values for each pixel in the image using 1 byte each for R, G and B. If top_first is true, return first row first; else return last row first. Returns true if successful. added to gemX.h and gemX_image.cc, class Am_Image_Array_Data public bool Get_RGB_Image(unsigned char * storage, bool top_first = true) protected bool is_gif() protected make_generic_image_from_name() So that Get_RGB_Image can be called even if an image is not on display, I added make_generic_image_from_name() to read in the GIF image (a drawonable isn't needed). I also changed Am_Image_Array::Get_Size to call make_generic_image_from_name() so that callers can get the size of an image before calling Get_RGB_Image (to allocate storage). June 16, BAM ------------ * Selection handles, can move selection forward, backwards, first, last: - set Am_SELECTION_MOVE_CHARS with list of 4 Am_Inter_Chars (or strings) for forward, backward, first and end. Default is: Am_Value_List() .Add(Am_Inter_Char("ANY_RIGHT_ARROW")) //forward .Add(Am_Inter_Char("ANY_LEFT_ARROW")) //backward .Add(Am_Inter_Char("ANY_HOME")) //home .Add(Am_Inter_Char("ANY_END")) //end ) if control arrow, then adds (extends) the selection. if make Am_SELECTION_MOVE_CHARS slot NULL, then turns off interactor June 10, 1997, BAM -------------- (already report) * modified Undo_Dialog_Box to support scripting. * Moved Undo_Dialog_Box into a new directory src/scripting instead of in widgets. Also added new file scripting_window.cc there and scripting_advanced.h to amulet/include. * Fixed small space leak in command_basics for selective undo/repeat * changed Am_Handler_Selective_Repeat_New_Method and Am_Handler_Selective_Undo_Method types to return the copy of the command object that will be added to the undo history. June 7, 1997, BAM -------------- * Default window icon title is Am_No_Value and if icon title is not valid, uses window's title. ** Value_List.Valid() returns true only when list isn't empty (!Empty()) so is like the other Valid()'s. (Fixed usage in am_generic_add_part) ** Added value_list.Exists() which is like the former Valid() and returns true if value_list has been initialized to a value. Note that Am_Value_List l; l.Exists() is false, but l.Add(x); followed by the Delete does *not* make it not Exists. Make_Empty does make it so Exists is false. ** Added value_list.Nth() returns index of current item. June 6, 1997, BAM --------------- * new built-in formulas: Am_Formula Am_Bottom_Of_Sibling (Am_Object object, int offset, float multiplier = 1.0); Am_Formula Am_Right_Of_Sibling (Am_Object object, int offset, float multiplier = 1.0); June 5, 1997, BAM --------------- * Am_Scrolling_Menu widget: User can select ranges of items. Press and drag to select a range. Shift-click to extend the range. Control-click to start an independent range (non-contiguous). Programmers interface: set the Am_ITEMS slot of the widget to a list like all the other button widgets. Am_VALUE of the widget can be accessed or set to a list of the items. Can set Am_HOW_SET, but Am_CHOICE_LIST_TOGGLE does the weird list select; but Am_CHOICE_SET, Am_CHOICE_CLEAR and Am_CHOICE_TOGGLE do usual kind of single select. Note: unlike all other widgets, the DO method of commands for the individual items are NOT called. Instead, the DO method of the widget itself is ALWAYS called instead, even if the items have their own commands. This is because multiple items can be selected at a time. The Am_VALUE of the command (and the widget) will have the full current value as a list. June 5, 1997, BAM --------------- * export Am_Checkbox, Am_Menu_Item, Am_Radio_Button May, 1997, James Kwon --------------------- Lots of gilt updates: undo, etc. May, 1997: Richm ---------------- Ability to migrate saved file format with