From 15931f20a2cce6af1fdf3d384f2582f08d276888 Mon Sep 17 00:00:00 2001 From: Stephen Heumann Date: Wed, 17 Apr 2019 16:55:36 -0500 Subject: [PATCH] Switch back to using single buttons, and draw our own outlines around them. This provides a less flickery display, and arguably cleaner code. The outlines should perfectly match the look of the stock "default" buttons, although obviously this wouldn't work right if their design was ever changed. --- diskbrowser.c | 120 ++++++++++++++++++++++++++++-------------------- diskbrowser.rez | 41 ++--------------- 2 files changed, 76 insertions(+), 85 deletions(-) diff --git a/diskbrowser.c b/diskbrowser.c index d9220ae..5ab85aa 100644 --- a/diskbrowser.c +++ b/diskbrowser.c @@ -44,9 +44,6 @@ char finderRequestName[] = "\pApple~Finder~"; #define disksList 1007 #define mountDiskButton 1008 -#define searchButtonDefault (searchButton+50) -#define mountDiskButtonDefault (mountDiskButton+50) - #define searchErrorAlert 3000 Word resourceFileID; @@ -59,8 +56,14 @@ Word myUserID; GrafPortPtr window; CtlRecHndl disksListHandle; -CtlRecHndl mountButtonHandle, mountButtonDefaultHandle; -CtlRecHndl searchButtonHandle, searchButtonDefaultHandle; +CtlRecHndl mountButtonHandle; +CtlRecHndl searchButtonHandle; + +/* Rectangles outlining the buttons in the style of "default" buttons */ +static Rect searchRect = {8, 305, 26, 414}; +static Rect mountRect = {150, 301, 168, 414}; + +Boolean defaultButtonIsSearch; unsigned long lastTargetCtlID = 0; @@ -123,6 +126,25 @@ void InstallMenuItem(void) { } } +/* Draw outlines of buttons as default or not, as appropriate. */ +void DrawButtonOutlines(boolean justChanged) { + PenNormal(); + SetPenSize(3, 1); + if (defaultButtonIsSearch) { + FrameRRect(&searchRect, 36, 12); + if (justChanged) { + SetSolidPenPat(white); + FrameRRect(&mountRect, 36, 12); + } + } else { + FrameRRect(&mountRect, 36, 12); + if (justChanged) { + SetSolidPenPat(white); + FrameRRect(&searchRect, 36, 12); + } + } +} + #pragma databank 1 void DrawContents(void) { Word origResourceApp = GetCurResourceApp(); @@ -131,6 +153,8 @@ void DrawContents(void) { PenNormal(); /* use a "normal" pen */ DrawControls(GetPort()); /* draw controls in window */ + DrawButtonOutlines(false); + SetCurResourceApp(origResourceApp); } #pragma databank 0 @@ -168,8 +192,6 @@ boolean DoLEEdit (int editAction) { unsigned long id; /* control ID */ GrafPortPtr port; /* caller's GrafPort */ - port = GetPort(); - SetPort(window); ctl = FindTargetCtl(); id = GetCtlID(ctl); if (id == searchLine) { @@ -191,7 +213,6 @@ boolean DoLEEdit (int editAction) { break; }; }; - SetPort(port); return (id == searchLine); } @@ -380,13 +401,42 @@ errorReturn: ShowErrorAlert(result); } +/* Update state of controls based on user input */ +void UpdateControlState(void) { + unsigned long targetCtlID = GetCtlID(FindTargetCtl()); + if (targetCtlID != lastTargetCtlID) { + /* Make appropriate button respond to the "return" key */ + lastTargetCtlID = targetCtlID; + if (targetCtlID == searchLine) { + SetCtlMoreFlags(GetCtlMoreFlags(mountButtonHandle) & 0x1FFF, + mountButtonHandle); + SetCtlMoreFlags(GetCtlMoreFlags(searchButtonHandle) | fCtlWantEvents, + searchButtonHandle); + defaultButtonIsSearch = true; + } else if (targetCtlID == disksList) { + SetCtlMoreFlags(GetCtlMoreFlags(searchButtonHandle) & 0x1FFF, + searchButtonHandle); + SetCtlMoreFlags(GetCtlMoreFlags(mountButtonHandle) | fCtlWantEvents, + mountButtonHandle); + defaultButtonIsSearch = false; + } + DrawButtonOutlines(true); + } + + /* Only allow "Mount Disk" to be clicked if there is a disk selected */ + if (NextMember2(0, (Handle)disksListHandle) != 0) { + HiliteControl(noHilite, mountButtonHandle); + } else { + HiliteControl(inactiveHilite, mountButtonHandle); + } +} + /* Handle an event after TaskMasterDA processing */ void HandleEvent(int eventCode, WmTaskRec *taskRec) { switch (eventCode) { case wInControl: switch (taskRec->wmTaskData4) { case searchButton: - case searchButtonDefault: DoSearch(); break; @@ -398,7 +448,6 @@ void HandleEvent(int eventCode, WmTaskRec *taskRec) { break; case mountDiskButton: - case mountDiskButtonDefault: // TODO break; } @@ -422,36 +471,6 @@ void HandleEvent(int eventCode, WmTaskRec *taskRec) { } break; } - - unsigned long targetCtlID = GetCtlID(FindTargetCtl()); - if (targetCtlID != lastTargetCtlID) { - /* Make button corresponding to target control the default */ - lastTargetCtlID = targetCtlID; - if (targetCtlID == searchLine) { - SetCtlMoreFlags(GetCtlMoreFlags(mountButtonDefaultHandle) & 0x1FFF, - mountButtonDefaultHandle); - SetCtlMoreFlags(GetCtlMoreFlags(searchButtonDefaultHandle) | 0x3000, - searchButtonDefaultHandle); - ShowControl(searchButtonDefaultHandle); - HideControl(mountButtonDefaultHandle); - } else if (targetCtlID == disksList) { - SetCtlMoreFlags(GetCtlMoreFlags(searchButtonDefaultHandle) & 0x1FFF, - searchButtonDefaultHandle); - SetCtlMoreFlags(GetCtlMoreFlags(mountButtonDefaultHandle) | 0x3000, - mountButtonDefaultHandle); - ShowControl(mountButtonDefaultHandle); - HideControl(searchButtonDefaultHandle); - } - } - - /* Only allow "Mount Disk" to be clicked if there is a disk selected */ - if (NextMember2(0, (Handle)disksListHandle) != 0) { - HiliteControl(noHilite, mountButtonHandle); - HiliteControl(noHilite, mountButtonDefaultHandle); - } else { - HiliteControl(inactiveHilite, mountButtonHandle); - HiliteControl(inactiveHilite, mountButtonDefaultHandle); - } } /* NDA-style action routine for our window */ @@ -460,6 +479,12 @@ int ActionProc(EventRecord *eventRec, int actionCode) { static WmTaskRec taskRec; int handledAction = 0; + if (!windowOpened) + return 0; + + GrafPortPtr port = GetPort(); + SetPort(window); + switch (actionCode) { case eventAction: /* Copy basic event rec & use our own wmTaskMask, as per IIgs TN 84 */ @@ -468,6 +493,7 @@ int ActionProc(EventRecord *eventRec, int actionCode) { taskRec.wmTaskMask = 0x1F7FFF; /* everything except tmInfo */ HandleEvent(TaskMasterDA(0, &taskRec), &taskRec); + UpdateControlState(); break; case cursorAction: @@ -477,12 +503,12 @@ int ActionProc(EventRecord *eventRec, int actionCode) { case copyAction: case pasteAction: case clearAction: - if (windowOpened) { - handledAction = DoLEEdit(actionCode); - } + handledAction = DoLEEdit(actionCode); break; } + SetPort(port); + return handledAction; } #pragma databank 0 @@ -540,18 +566,14 @@ void ShowBrowserWindow(void) { auxWindInfo->NDASysWindPtr = (Ptr)&sysWindRecord; disksListHandle = GetCtlHandleFromID(window, disksList); - mountButtonDefaultHandle = GetCtlHandleFromID(window, mountDiskButtonDefault); - searchButtonDefaultHandle = GetCtlHandleFromID(window, searchButtonDefault); mountButtonHandle = GetCtlHandleFromID(window, mountDiskButton); searchButtonHandle = GetCtlHandleFromID(window, searchButton); - HideControl(GetCtlHandleFromID(window, mountDiskButtonDefault)); - HiliteControl(inactiveHilite, disksListHandle); HiliteControl(inactiveHilite, mountButtonHandle); - HiliteControl(inactiveHilite, mountButtonDefaultHandle); - + lastTargetCtlID = 0; + defaultButtonIsSearch = true; cleanup: if (resourceFileOpened && !windowOpened) { diff --git a/diskbrowser.rez b/diskbrowser.rez index 15e11dc..b3cee18 100644 --- a/diskbrowser.rez +++ b/diskbrowser.rez @@ -10,9 +10,6 @@ #define disksList 1007 #define mountDiskButton 1008 -#define searchButtonDefault (searchButton+50) -#define mountDiskButtonDefault (mountDiskButton+50) - resource rWindParam1 (winDiskBrowser) { fTitle+fClose+fFlex+fMove+fVis, /* wFrameBits */ nil, /* wTitle */ @@ -33,14 +30,12 @@ resource rWindParam1 (winDiskBrowser) { }; resource rControlList (winDiskBrowser) {{ - mountDiskButtonDefault, mountDiskButton, disksList, findDisksForText, forIIGSRadio, forAnyAppleIIRadio, searchLine, - searchButtonDefault, searchButton }}; @@ -59,11 +54,11 @@ resource rControlTemplate (searchLine) { resource rPString (searchLine) { "" }; -resource rControlTemplate (searchButtonDefault) { - searchButtonDefault, - {10, 309, 0, 0}, +resource rControlTemplate (searchButton) { + searchButton, + {10, 309, 24, 410}, SimpleButtonControl {{ - DefaultButton, + 0, $3000+RefIsResource, 0, searchButton, @@ -72,19 +67,6 @@ resource rControlTemplate (searchButtonDefault) { }}; }; -resource rControlTemplate (searchButton) { - searchButton, - {10, 309, 0, 0}, - SimpleButtonControl {{ - 0, - $1000+RefIsResource, - 0, - searchButton, - 0, /* color table ref */ - {"","",0,0} /* key equivalent = Return */ - }}; -}; - resource rPString(searchButton) { "Find Disks" }; @@ -149,26 +131,13 @@ resource rControlTemplate (disksList) { resource rControlTemplate (mountDiskButton) { mountDiskButton, - {152, 305, 0, 0}, + {152, 305, 166, 410}, SimpleButtonControl {{ 0, $1000+RefIsResource, 0, mountDiskButton, 0, /* color table ref */ - {"","",0,0} /* key equivalent */ - }}; -}; - -resource rControlTemplate (mountDiskButtonDefault) { - mountDiskButtonDefault, - {152, 305, 0, 0}, - SimpleButtonControl {{ - DefaultButton, - $3000+RefIsResource, - 0, - mountDiskButton, - 0, /* color table ref */ {"\$0D","\$0D",0,0} /* key equivalent */ }}; };