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.
This commit is contained in:
Stephen Heumann 2019-04-17 16:55:36 -05:00
parent ec309557b5
commit 15931f20a2
2 changed files with 76 additions and 85 deletions

View File

@ -44,9 +44,6 @@ char finderRequestName[] = "\pApple~Finder~";
#define disksList 1007 #define disksList 1007
#define mountDiskButton 1008 #define mountDiskButton 1008
#define searchButtonDefault (searchButton+50)
#define mountDiskButtonDefault (mountDiskButton+50)
#define searchErrorAlert 3000 #define searchErrorAlert 3000
Word resourceFileID; Word resourceFileID;
@ -59,8 +56,14 @@ Word myUserID;
GrafPortPtr window; GrafPortPtr window;
CtlRecHndl disksListHandle; CtlRecHndl disksListHandle;
CtlRecHndl mountButtonHandle, mountButtonDefaultHandle; CtlRecHndl mountButtonHandle;
CtlRecHndl searchButtonHandle, searchButtonDefaultHandle; 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; 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 #pragma databank 1
void DrawContents(void) { void DrawContents(void) {
Word origResourceApp = GetCurResourceApp(); Word origResourceApp = GetCurResourceApp();
@ -131,6 +153,8 @@ void DrawContents(void) {
PenNormal(); /* use a "normal" pen */ PenNormal(); /* use a "normal" pen */
DrawControls(GetPort()); /* draw controls in window */ DrawControls(GetPort()); /* draw controls in window */
DrawButtonOutlines(false);
SetCurResourceApp(origResourceApp); SetCurResourceApp(origResourceApp);
} }
#pragma databank 0 #pragma databank 0
@ -168,8 +192,6 @@ boolean DoLEEdit (int editAction) {
unsigned long id; /* control ID */ unsigned long id; /* control ID */
GrafPortPtr port; /* caller's GrafPort */ GrafPortPtr port; /* caller's GrafPort */
port = GetPort();
SetPort(window);
ctl = FindTargetCtl(); ctl = FindTargetCtl();
id = GetCtlID(ctl); id = GetCtlID(ctl);
if (id == searchLine) { if (id == searchLine) {
@ -191,7 +213,6 @@ boolean DoLEEdit (int editAction) {
break; break;
}; };
}; };
SetPort(port);
return (id == searchLine); return (id == searchLine);
} }
@ -380,13 +401,42 @@ errorReturn:
ShowErrorAlert(result); 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 */ /* Handle an event after TaskMasterDA processing */
void HandleEvent(int eventCode, WmTaskRec *taskRec) { void HandleEvent(int eventCode, WmTaskRec *taskRec) {
switch (eventCode) { switch (eventCode) {
case wInControl: case wInControl:
switch (taskRec->wmTaskData4) { switch (taskRec->wmTaskData4) {
case searchButton: case searchButton:
case searchButtonDefault:
DoSearch(); DoSearch();
break; break;
@ -398,7 +448,6 @@ void HandleEvent(int eventCode, WmTaskRec *taskRec) {
break; break;
case mountDiskButton: case mountDiskButton:
case mountDiskButtonDefault:
// TODO // TODO
break; break;
} }
@ -422,36 +471,6 @@ void HandleEvent(int eventCode, WmTaskRec *taskRec) {
} }
break; 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 */ /* NDA-style action routine for our window */
@ -460,6 +479,12 @@ int ActionProc(EventRecord *eventRec, int actionCode) {
static WmTaskRec taskRec; static WmTaskRec taskRec;
int handledAction = 0; int handledAction = 0;
if (!windowOpened)
return 0;
GrafPortPtr port = GetPort();
SetPort(window);
switch (actionCode) { switch (actionCode) {
case eventAction: case eventAction:
/* Copy basic event rec & use our own wmTaskMask, as per IIgs TN 84 */ /* 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 */ taskRec.wmTaskMask = 0x1F7FFF; /* everything except tmInfo */
HandleEvent(TaskMasterDA(0, &taskRec), &taskRec); HandleEvent(TaskMasterDA(0, &taskRec), &taskRec);
UpdateControlState();
break; break;
case cursorAction: case cursorAction:
@ -477,12 +503,12 @@ int ActionProc(EventRecord *eventRec, int actionCode) {
case copyAction: case copyAction:
case pasteAction: case pasteAction:
case clearAction: case clearAction:
if (windowOpened) { handledAction = DoLEEdit(actionCode);
handledAction = DoLEEdit(actionCode);
}
break; break;
} }
SetPort(port);
return handledAction; return handledAction;
} }
#pragma databank 0 #pragma databank 0
@ -540,18 +566,14 @@ void ShowBrowserWindow(void) {
auxWindInfo->NDASysWindPtr = (Ptr)&sysWindRecord; auxWindInfo->NDASysWindPtr = (Ptr)&sysWindRecord;
disksListHandle = GetCtlHandleFromID(window, disksList); disksListHandle = GetCtlHandleFromID(window, disksList);
mountButtonDefaultHandle = GetCtlHandleFromID(window, mountDiskButtonDefault);
searchButtonDefaultHandle = GetCtlHandleFromID(window, searchButtonDefault);
mountButtonHandle = GetCtlHandleFromID(window, mountDiskButton); mountButtonHandle = GetCtlHandleFromID(window, mountDiskButton);
searchButtonHandle = GetCtlHandleFromID(window, searchButton); searchButtonHandle = GetCtlHandleFromID(window, searchButton);
HideControl(GetCtlHandleFromID(window, mountDiskButtonDefault));
HiliteControl(inactiveHilite, disksListHandle); HiliteControl(inactiveHilite, disksListHandle);
HiliteControl(inactiveHilite, mountButtonHandle); HiliteControl(inactiveHilite, mountButtonHandle);
HiliteControl(inactiveHilite, mountButtonDefaultHandle);
lastTargetCtlID = 0; lastTargetCtlID = 0;
defaultButtonIsSearch = true;
cleanup: cleanup:
if (resourceFileOpened && !windowOpened) { if (resourceFileOpened && !windowOpened) {

View File

@ -10,9 +10,6 @@
#define disksList 1007 #define disksList 1007
#define mountDiskButton 1008 #define mountDiskButton 1008
#define searchButtonDefault (searchButton+50)
#define mountDiskButtonDefault (mountDiskButton+50)
resource rWindParam1 (winDiskBrowser) { resource rWindParam1 (winDiskBrowser) {
fTitle+fClose+fFlex+fMove+fVis, /* wFrameBits */ fTitle+fClose+fFlex+fMove+fVis, /* wFrameBits */
nil, /* wTitle */ nil, /* wTitle */
@ -33,14 +30,12 @@ resource rWindParam1 (winDiskBrowser) {
}; };
resource rControlList (winDiskBrowser) {{ resource rControlList (winDiskBrowser) {{
mountDiskButtonDefault,
mountDiskButton, mountDiskButton,
disksList, disksList,
findDisksForText, findDisksForText,
forIIGSRadio, forIIGSRadio,
forAnyAppleIIRadio, forAnyAppleIIRadio,
searchLine, searchLine,
searchButtonDefault,
searchButton searchButton
}}; }};
@ -59,11 +54,11 @@ resource rControlTemplate (searchLine) {
resource rPString (searchLine) { "" }; resource rPString (searchLine) { "" };
resource rControlTemplate (searchButtonDefault) { resource rControlTemplate (searchButton) {
searchButtonDefault, searchButton,
{10, 309, 0, 0}, {10, 309, 24, 410},
SimpleButtonControl {{ SimpleButtonControl {{
DefaultButton, 0,
$3000+RefIsResource, $3000+RefIsResource,
0, 0,
searchButton, 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" }; resource rPString(searchButton) { "Find Disks" };
@ -149,26 +131,13 @@ resource rControlTemplate (disksList) {
resource rControlTemplate (mountDiskButton) { resource rControlTemplate (mountDiskButton) {
mountDiskButton, mountDiskButton,
{152, 305, 0, 0}, {152, 305, 166, 410},
SimpleButtonControl {{ SimpleButtonControl {{
0, 0,
$1000+RefIsResource, $1000+RefIsResource,
0, 0,
mountDiskButton, mountDiskButton,
0, /* color table ref */ 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 */ {"\$0D","\$0D",0,0} /* key equivalent */
}}; }};
}; };