Files
Aerofoil/GpApp/Tools.cpp
2020-06-13 04:33:41 -04:00

570 lines
13 KiB
C++

//============================================================================
//----------------------------------------------------------------------------
// Tools.c
//----------------------------------------------------------------------------
//============================================================================
#include "PLControlDefinitions.h"
#include "PLPasStr.h"
#include "PLStandardColors.h"
#include "Externs.h"
#include "Environ.h"
#include "FontFamily.h"
#include "PLWidgets.h"
#include "PLPopupMenuWidget.h"
#include "QDPixMap.h"
#include "RectUtils.h"
#include "ResolveCachingColor.h"
#include "Utilities.h"
#include "WindowDef.h"
#include "WindowManager.h"
#define kToolsHigh 4
#define kToolsWide 4
#define kTotalTools 16 // kToolsHigh * kToolsWide
#define kPopUpControl 129
#define kFirstBlower 1
#define kLastBlower 15
#define kBlowerBase 1
#define kFirstFurniture 1
#define kLastFurniture 15
#define kFurnitureBase 21
#define kFirstBonus 1
#define kLastBonus 15
#define kBonusBase 41
#define kFirstTransport 1
#define kLastTransport 12
#define kTransportBase 61
#define kFirstSwitch 1
#define kLastSwitch 9
#define kSwitchBase 81
#define kFirstLight 1
#define kLastLight 8
#define kLightBase 101
#define kFirstAppliance 1
#define kLastAppliance 14
#define kApplianceBase 121
#define kFirstEnemy 1
#define kLastEnemy 9
#define kEnemyBase 141
#define kFirstClutter 1
#define kLastClutter 15
#define kClutterBase 161
#define kToolsPictID 1011
void CreateToolsOffscreen (void);
void KillToolsOffscreen (void);
void FrameSelectedTool (DrawSurface *);
void DrawToolName (DrawSurface *);
void DrawToolTiles (DrawSurface *);
void SwitchToolModes (short);
void KeepWindowInBounds (Window *window);
Rect toolsWindowRect, toolSrcRect, toolTextRect;
Rect toolRects[kTotalTools];
PortabilityLayer::Widget *classPopUp;
DrawSurface *toolSrcMap;
WindowPtr toolsWindow;
short isToolsH, isToolsV;
short toolSelected, toolMode;
short firstTool, lastTool, objectBase;
Boolean isToolsOpen;
//============================================================== Functions
//-------------------------------------------------------------- CreateToolsOffscreen
#ifndef COMPILEDEMO
void CreateToolsOffscreen (void)
{
DrawSurface *wasCPort;
PLError_t theErr;
if (toolSrcMap == nil)
{
QSetRect(&toolSrcRect, 0, 0, 360, 216);
theErr = CreateOffScreenGWorld(&toolSrcMap, &toolSrcRect);
LoadGraphic(toolSrcMap, kToolsPictID);
}
}
#endif
//-------------------------------------------------------------- KillToolsOffscreen
#ifndef COMPILEDEMO
void KillToolsOffscreen (void)
{
if (toolSrcMap != nil)
{
DisposeGWorld(toolSrcMap);
// KillOffScreenPixMap(toolSrcMap);
toolSrcMap = nil;
}
}
#endif
//-------------------------------------------------------------- FrameSelectedTool
#ifndef COMPILEDEMO
void FrameSelectedTool (DrawSurface *surface)
{
Rect theRect;
short toolIcon;
toolIcon = toolSelected;
if ((toolMode == kBlowerMode) && (toolIcon >= 7))
{
toolIcon--;
}
else if ((toolMode == kTransportMode) && (toolIcon >= 7))
{
if (toolIcon >= 15)
toolIcon -= 4;
else
toolIcon = ((toolIcon - 7) / 2) + 7;
}
theRect = toolRects[toolIcon];
PortabilityLayer::ResolveCachingColor redColor = StdColors::Red();
surface->FrameRect(theRect, redColor);
InsetRect(&theRect, 1, 1);
surface->FrameRect(theRect, redColor);
}
#endif
//-------------------------------------------------------------- DrawToolName
#ifndef COMPILEDEMO
void DrawToolName (DrawSurface *surface)
{
Str255 theString;
if (toolSelected == 0)
PasStringCopy(PSTR("Selection Tool"), theString);
else
GetIndString(theString, kObjectNameStrings,
toolSelected + ((toolMode - 1) * 0x0010));
PortabilityLayer::ResolveCachingColor whiteColor = StdColors::White();
surface->FillRect(toolTextRect, whiteColor);
const Point textPoint = Point::Create(toolTextRect.left + 3, toolTextRect.bottom - 6);
PortabilityLayer::RenderedFont *appFont = GetApplicationFont(9, PortabilityLayer::FontFamilyFlag_Bold, true);
ColorText(surface, textPoint, theString, 171L, appFont);
}
#endif
//-------------------------------------------------------------- DrawToolTiles
#ifndef COMPILEDEMO
void DrawToolTiles (DrawSurface *surface)
{
Rect srcRect, destRect;
short i;
DrawCIcon(surface, 2000, toolRects[0].left, toolRects[0].top); // Selection Tool
for (i = 0; i < 15; i++) // Other tools
{
QSetRect(&srcRect, 0, 0, 24, 24);
QSetRect(&destRect, 0, 0, 24, 24);
QOffsetRect(&srcRect, i * 24, (toolMode - 1) * 24);
QOffsetRect(&destRect, toolRects[i + 1].left + 2, toolRects[i + 1].top + 2);
CopyBits((BitMap *)*GetGWorldPixMap(toolSrcMap),
GetPortBitMapForCopyBits(toolsWindow->GetDrawSurface()),
&srcRect, &destRect, srcCopy);
}
}
#endif
//-------------------------------------------------------------- EraseSelectedTool
void EraseSelectedTool (void)
{
#ifndef COMPILEDEMO
DrawSurface *surface = toolsWindow->GetDrawSurface();
Rect theRect;
short toolIcon;
if (toolsWindow == nil)
return;
SetPort(toolsWindow->GetDrawSurface());
toolIcon = toolSelected;
if ((toolMode == kBlowerMode) && (toolIcon >= 7))
{
toolIcon--;
}
else if ((toolMode == kTransportMode) && (toolIcon >= 7))
{
if (toolIcon >= 15)
toolIcon -= 4;
else
toolIcon = ((toolIcon - 7) / 2) + 7;
}
theRect = toolRects[toolIcon];
PortabilityLayer::ResolveCachingColor whiteColor = StdColors::White();
surface->FrameRect(theRect, whiteColor);
InsetRect(&theRect, 1, 1);
surface->FrameRect(theRect, whiteColor);
#endif
}
//-------------------------------------------------------------- SelectTool
void SelectTool (short which)
{
#ifndef COMPILEDEMO
Rect theRect;
short toolIcon;
if (toolsWindow == nil)
return;
DrawSurface *surface = toolsWindow->GetDrawSurface();
toolIcon = which;
if ((toolMode == kBlowerMode) && (toolIcon >= 7))
{
toolIcon--;
}
else if ((toolMode == kTransportMode) && (toolIcon >= 7))
{
if (toolIcon >= 15)
toolIcon -= 4;
else
toolIcon = ((toolIcon - 7) / 2) + 7;
}
theRect = toolRects[toolIcon];
PortabilityLayer::ResolveCachingColor redColor = StdColors::Red();
surface->FrameRect(theRect, redColor);
InsetRect(&theRect, 1, 1);
surface->FrameRect(theRect, redColor);
toolSelected = which;
DrawToolName(surface);
#endif
}
//-------------------------------------------------------------- UpdateToolsWindow
void UpdateToolsWindow (void)
{
#ifndef COMPILEDEMO
if (toolsWindow == nil)
return;
DrawSurface *surface = toolsWindow->GetDrawSurface();
PortabilityLayer::ResolveCachingColor lineColor = DkGrayForeColor();
surface->DrawLine(Point::Create(4, 25), Point::Create(112, 25), lineColor);
DrawToolTiles(surface);
FrameSelectedTool(surface);
DrawToolName(surface);
#endif
}
//-------------------------------------------------------------- OpenToolsWindow
void OpenToolsWindow (void)
{
#ifndef COMPILEDEMO
Rect src, dest;
Point globalMouse;
short h, v;
PortabilityLayer::WindowManager *wm = PortabilityLayer::WindowManager::GetInstance();
if (toolsWindow == nil)
{
QSetRect(&toolsWindowRect, 0, 0, 116, 152); // 143
QSetRect(&toolTextRect, 0, 0, 116, 12);
InsetRect(&toolTextRect, -1, -1);
QOffsetRect(&toolTextRect, 0, 157 - 15);
{
const uint16_t windowStyle = PortabilityLayer::WindowStyleFlags::kTitleBar | PortabilityLayer::WindowStyleFlags::kMiniBar | PortabilityLayer::WindowStyleFlags::kCloseBox;
PortabilityLayer::WindowDef wdef = PortabilityLayer::WindowDef::Create(toolsWindowRect, windowStyle, false, 0, 0, PSTR("Tools"));
toolsWindow = wm->CreateWindow(wdef);
}
if (toolsWindow == nil)
RedAlert(kErrNoMemory);
// if (OptionKeyDown())
// {
// isToolsH = qd.screenBits.bounds.right - 120;
// isToolsV = 35;
// }
MoveWindow(toolsWindow, isToolsH, isToolsV, true);
GetWindowRect(toolsWindow, &dest);
wm->PutWindowBehind(toolsWindow, wm->GetPutInFrontSentinel());
wm->ShowWindow(toolsWindow);
// FlagWindowFloating(toolsWindow); TEMP - use flaoting windows
{
PortabilityLayer::WidgetBasicState state;
state.m_min = 1;
state.m_max = 3;
state.m_rect = Rect::Create(2, 4, 22, 112);
state.m_state = 1;
state.m_resID = 141;
state.m_window = toolsWindow;
classPopUp = PortabilityLayer::PopupMenuWidget::Create(state, nullptr);
}
toolsWindow->DrawControls();
if (classPopUp == nil)
RedAlert(kErrFailedResourceLoad);
classPopUp->SetState(toolMode);
for (v = 0; v < kToolsHigh; v++)
for (h = 0; h < kToolsWide; h++)
{
QSetRect(&toolRects[(v * kToolsWide) + h], 2, 29, 30, 57);
QOffsetRect(&toolRects[(v * kToolsWide) + h], h * 28, v * 28);
}
CreateToolsOffscreen();
SwitchToolModes(toolMode);
toolSelected = kSelectTool;
KeepWindowInBounds(toolsWindow);
}
UpdateToolsCheckmark(true);
UpdateToolsWindow();
#endif
}
//-------------------------------------------------------------- CloseToolsWindow
void CloseToolsWindow (void)
{
#ifndef COMPILEDEMO
CloseThisWindow(&toolsWindow);
KillToolsOffscreen();
UpdateToolsCheckmark(false);
#endif
}
//-------------------------------------------------------------- ToggleToolsWindow
void ToggleToolsWindow (void)
{
#ifndef COMPILEDEMO
if (toolsWindow == nil)
{
OpenToolsWindow();
isToolsOpen = true;
}
else
{
CloseToolsWindow();
isToolsOpen = true;
}
#endif
}
//-------------------------------------------------------------- SwitchToolModes
#ifndef COMPILEDEMO
void SwitchToolModes (short newMode)
{
if (toolsWindow == nil)
return;
SelectTool(kSelectTool);
switch (newMode)
{
case kBlowerMode:
firstTool = kFirstBlower;
lastTool = kLastBlower;
objectBase = kBlowerBase;
break;
case kFurnitureMode:
firstTool = kFirstFurniture;
lastTool = kLastFurniture;
objectBase = kFurnitureBase;
break;
case kBonusMode:
firstTool = kFirstBonus;
lastTool = kLastBonus;
objectBase = kBonusBase;
break;
case kTransportMode:
firstTool = kFirstTransport;
lastTool = kLastTransport;
objectBase = kTransportBase;
break;
case kSwitchMode:
firstTool = kFirstSwitch;
lastTool = kLastSwitch;
objectBase = kSwitchBase;
break;
case kLightMode:
firstTool = kFirstLight;
lastTool = kLastLight;
objectBase = kLightBase;
break;
case kApplianceMode:
firstTool = kFirstAppliance;
lastTool = kLastAppliance;
objectBase = kApplianceBase;
break;
case kEnemyMode:
firstTool = kFirstEnemy;
lastTool = kLastEnemy;
objectBase = kEnemyBase;
break;
case kClutterMode:
firstTool = kFirstClutter;
lastTool = kLastClutter;
objectBase = kClutterBase;
break;
}
toolMode = newMode;
}
#endif
//-------------------------------------------------------------- HandleToolsClick
void HandleToolsClick (Point wherePt)
{
#ifndef COMPILEDEMO
PortabilityLayer::Widget *theControl;
short i, part, newMode, toolIcon;
if (toolsWindow == nil)
return;
SetPortWindowPort(toolsWindow);
wherePt -= toolsWindow->GetTopLeftCoord();
part = FindControl(wherePt, toolsWindow, &theControl);
if ((theControl != nil) && (part != 0))
{
part = theControl->Capture(wherePt, nullptr);
if (part != 0)
{
newMode = theControl->GetState();
if (newMode != toolMode)
{
EraseSelectedTool();
SwitchToolModes(newMode);
UpdateToolsWindow();
}
}
}
else
{
for (i = 0; i < kTotalTools; i++)
if ((toolRects[i].Contains(wherePt)) && (i <= lastTool))
{
EraseSelectedTool();
toolIcon = i;
if ((toolMode == kBlowerMode) && (toolIcon >= 7))
{
toolIcon++;
}
if ((toolMode == kTransportMode) && (toolIcon >= 7))
{
if (toolIcon >= 11)
toolIcon += 4;
else
toolIcon = ((toolIcon - 7) * 2) + 7;
}
SelectTool(toolIcon);
break;
}
}
#endif
}
//-------------------------------------------------------------- NextToolMode
void NextToolMode (void)
{
#ifndef COMPILEDEMO
if (toolsWindow == nil)
return;
if ((theMode == kEditMode) && (toolMode < kClutterMode))
{
EraseSelectedTool();
toolMode++;
classPopUp->SetState(toolMode);
SwitchToolModes(toolMode);
toolSelected = kSelectTool;
}
#endif
}
//-------------------------------------------------------------- PrevToolMode
void PrevToolMode (void)
{
#ifndef COMPILEDEMO
if (toolsWindow == nil)
return;
if ((theMode == kEditMode) && (toolMode > kBlowerMode))
{
EraseSelectedTool();
toolMode--;
classPopUp->SetState(toolMode);
SwitchToolModes(toolMode);
toolSelected = kSelectTool;
}
#endif
}
//-------------------------------------------------------------- SetSpecificToolMode
void SetSpecificToolMode (short modeToSet)
{
#ifndef COMPILEDEMO
if ((toolsWindow == nil) || (theMode != kEditMode))
return;
EraseSelectedTool();
toolMode = modeToSet;
classPopUp->SetState(toolMode);
SwitchToolModes(toolMode);
toolSelected = kSelectTool;
#endif
}