mirror of
https://github.com/elasota/Aerofoil.git
synced 2025-09-23 06:53:43 +00:00
Lots of stuff
This commit is contained in:
511
GpApp/Marquee.cpp
Normal file
511
GpApp/Marquee.cpp
Normal file
@@ -0,0 +1,511 @@
|
||||
//============================================================================
|
||||
//----------------------------------------------------------------------------
|
||||
// Marquee.c
|
||||
//----------------------------------------------------------------------------
|
||||
//============================================================================
|
||||
|
||||
|
||||
#include "Externs.h"
|
||||
#include "Marquee.h"
|
||||
#include "Objects.h"
|
||||
#include "ObjectEdit.h"
|
||||
#include "RectUtils.h"
|
||||
|
||||
|
||||
#define kMarqueePatListID 128
|
||||
#define kHandleSideLong 9
|
||||
|
||||
|
||||
void DrawGliderMarquee (void);
|
||||
void DrawMarquee (void);
|
||||
|
||||
|
||||
marquee theMarquee;
|
||||
Rect marqueeGliderRect;
|
||||
Boolean gliderMarqueeUp;
|
||||
|
||||
|
||||
extern Cursor handCursor, vertCursor, horiCursor, diagCursor;
|
||||
extern Rect leftStartGliderSrc;
|
||||
|
||||
|
||||
//============================================================== Functions
|
||||
//-------------------------------------------------------------- DoMarquee
|
||||
|
||||
void DoMarquee (void)
|
||||
{
|
||||
if ((!theMarquee.active) || (theMarquee.paused))
|
||||
return;
|
||||
|
||||
SetPortWindowPort(mainWindow);
|
||||
PenMode(patXor);
|
||||
PenPat(&theMarquee.pats[theMarquee.index]);
|
||||
DrawMarquee();
|
||||
theMarquee.index++;
|
||||
if (theMarquee.index >= kNumMarqueePats)
|
||||
theMarquee.index = 0;
|
||||
PenPat(&theMarquee.pats[theMarquee.index]);
|
||||
DrawMarquee();
|
||||
PenNormal();
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------- StartMarquee
|
||||
|
||||
void StartMarquee (Rect *theRect)
|
||||
{
|
||||
if (theMarquee.active)
|
||||
StopMarquee();
|
||||
|
||||
if (objActive == kNoObjectSelected)
|
||||
return;
|
||||
|
||||
SetPortWindowPort(mainWindow);
|
||||
theMarquee.bounds = *theRect;
|
||||
theMarquee.active = true;
|
||||
theMarquee.paused = false;
|
||||
theMarquee.handled = false;
|
||||
PenMode(patXor);
|
||||
PenPat(&theMarquee.pats[theMarquee.index]);
|
||||
DrawMarquee();
|
||||
PenNormal();
|
||||
SetCoordinateHVD(theMarquee.bounds.left, theMarquee.bounds.top, -1);
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------- StartMarqueeHandled
|
||||
|
||||
void StartMarqueeHandled (Rect *theRect, short direction, short dist)
|
||||
{
|
||||
if (theMarquee.active)
|
||||
StopMarquee();
|
||||
|
||||
if (objActive == kNoObjectSelected)
|
||||
return;
|
||||
|
||||
SetPortWindowPort(mainWindow);
|
||||
theMarquee.bounds = *theRect;
|
||||
theMarquee.active = true;
|
||||
theMarquee.paused = false;
|
||||
theMarquee.handled = true;
|
||||
QSetRect(&theMarquee.handle, 0, 0, kHandleSideLong, kHandleSideLong);
|
||||
QOffsetRect(&theMarquee.handle, kHandleSideLong / -2, kHandleSideLong / -2);
|
||||
switch (direction)
|
||||
{
|
||||
case kAbove:
|
||||
QOffsetRect(&theMarquee.handle, theMarquee.bounds.left,
|
||||
theMarquee.bounds.top);
|
||||
QOffsetRect(&theMarquee.handle, HalfRectWide(&theMarquee.bounds), -dist);
|
||||
break;
|
||||
|
||||
case kToRight:
|
||||
QOffsetRect(&theMarquee.handle, theMarquee.bounds.right,
|
||||
theMarquee.bounds.top);
|
||||
QOffsetRect(&theMarquee.handle, dist, HalfRectTall(&theMarquee.bounds));
|
||||
break;
|
||||
|
||||
case kBelow:
|
||||
QOffsetRect(&theMarquee.handle, theMarquee.bounds.left,
|
||||
theMarquee.bounds.bottom);
|
||||
QOffsetRect(&theMarquee.handle, HalfRectWide(&theMarquee.bounds), dist);
|
||||
break;
|
||||
|
||||
case kToLeft:
|
||||
QOffsetRect(&theMarquee.handle, theMarquee.bounds.left,
|
||||
theMarquee.bounds.top);
|
||||
QOffsetRect(&theMarquee.handle, -dist, HalfRectTall(&theMarquee.bounds));
|
||||
break;
|
||||
|
||||
case kBottomCorner:
|
||||
QOffsetRect(&theMarquee.handle, theMarquee.bounds.right,
|
||||
theMarquee.bounds.bottom);
|
||||
break;
|
||||
|
||||
case kTopCorner:
|
||||
QOffsetRect(&theMarquee.handle, theMarquee.bounds.right,
|
||||
theMarquee.bounds.top);
|
||||
break;
|
||||
}
|
||||
theMarquee.direction = direction;
|
||||
theMarquee.dist = dist;
|
||||
|
||||
PenMode(patXor);
|
||||
PenPat(&theMarquee.pats[theMarquee.index]);
|
||||
DrawMarquee();
|
||||
PenNormal();
|
||||
SetCoordinateHVD(theMarquee.bounds.left, theMarquee.bounds.top, dist);
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------- StopMarquee
|
||||
|
||||
void StopMarquee (void)
|
||||
{
|
||||
if (gliderMarqueeUp)
|
||||
{
|
||||
DrawGliderMarquee();
|
||||
gliderMarqueeUp = false;
|
||||
}
|
||||
|
||||
if (!theMarquee.active)
|
||||
return;
|
||||
|
||||
SetPortWindowPort(mainWindow);
|
||||
PenMode(patXor);
|
||||
PenPat(&theMarquee.pats[theMarquee.index]);
|
||||
DrawMarquee();
|
||||
PenNormal();
|
||||
theMarquee.active = false;
|
||||
SetCoordinateHVD(-1, -1, -1);
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------- PauseMarquee
|
||||
|
||||
void PauseMarquee (void)
|
||||
{
|
||||
if (!theMarquee.active)
|
||||
return;
|
||||
|
||||
theMarquee.paused = true;
|
||||
StopMarquee();
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------- ResumeMarquee
|
||||
|
||||
void ResumeMarquee (void)
|
||||
{
|
||||
if (!theMarquee.paused)
|
||||
return;
|
||||
|
||||
if (theMarquee.handled)
|
||||
{
|
||||
StartMarqueeHandled(&theMarquee.bounds, theMarquee.direction, theMarquee.dist);
|
||||
HandleBlowerGlider();
|
||||
}
|
||||
else
|
||||
StartMarquee(&theMarquee.bounds);
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------- DragOutMarqueeRect
|
||||
|
||||
void DragOutMarqueeRect (Point start, Rect *theRect)
|
||||
{
|
||||
Point wasPt, newPt;
|
||||
|
||||
SetPortWindowPort(mainWindow);
|
||||
InitCursor();
|
||||
QSetRect(theRect, start.h, start.v, start.h, start.v);
|
||||
PenMode(patXor);
|
||||
PenPat(&theMarquee.pats[theMarquee.index]);
|
||||
FrameRect(theRect);
|
||||
wasPt = start;
|
||||
|
||||
while (WaitMouseUp())
|
||||
{
|
||||
GetMouse(&newPt);
|
||||
if (DeltaPoint(wasPt, newPt))
|
||||
{
|
||||
FrameRect(theRect);
|
||||
QSetRect(theRect, start.h, start.v, newPt.h, newPt.v);
|
||||
NormalizeRect(theRect);
|
||||
FrameRect(theRect);
|
||||
wasPt = newPt;
|
||||
}
|
||||
}
|
||||
FrameRect(theRect);
|
||||
PenNormal();
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------- DragMarqueeRect
|
||||
|
||||
void DragMarqueeRect (Point start, Rect *theRect, Boolean lockH, Boolean lockV)
|
||||
{
|
||||
Point wasPt, newPt;
|
||||
short deltaH, deltaV;
|
||||
|
||||
SetCursor(&handCursor);
|
||||
StopMarquee();
|
||||
PenMode(patXor);
|
||||
PenPat(&theMarquee.pats[theMarquee.index]);
|
||||
theMarquee.bounds = *theRect;
|
||||
FrameRect(&theMarquee.bounds);
|
||||
|
||||
wasPt = start;
|
||||
while (WaitMouseUp())
|
||||
{
|
||||
GetMouse(&newPt);
|
||||
if (DeltaPoint(wasPt, newPt))
|
||||
{
|
||||
if (lockV)
|
||||
deltaH = 0;
|
||||
else
|
||||
deltaH = newPt.h - wasPt.h;
|
||||
if (lockH)
|
||||
deltaV = 0;
|
||||
else
|
||||
deltaV = newPt.v - wasPt.v;
|
||||
FrameRect(&theMarquee.bounds);
|
||||
QOffsetRect(&theMarquee.bounds, deltaH, deltaV);
|
||||
FrameRect(&theMarquee.bounds);
|
||||
wasPt = newPt;
|
||||
SetCoordinateHVD(theMarquee.bounds.left, theMarquee.bounds.top, -2);
|
||||
}
|
||||
}
|
||||
FrameRect(&theMarquee.bounds);
|
||||
*theRect = theMarquee.bounds;
|
||||
PenNormal();
|
||||
InitCursor();
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------- DragMarqueeHandle
|
||||
|
||||
void DragMarqueeHandle (Point start, short *dragged)
|
||||
{
|
||||
Point wasPt, newPt;
|
||||
short deltaH, deltaV;
|
||||
|
||||
if ((theMarquee.direction == kAbove) || (theMarquee.direction == kBelow))
|
||||
SetCursor(&vertCursor);
|
||||
else
|
||||
SetCursor(&horiCursor);
|
||||
StopMarquee();
|
||||
PenMode(patXor);
|
||||
PenPat(&theMarquee.pats[theMarquee.index]);
|
||||
FrameRect(&theMarquee.bounds);
|
||||
PaintRect(&theMarquee.handle);
|
||||
|
||||
wasPt = start;
|
||||
while (WaitMouseUp())
|
||||
{
|
||||
GetMouse(&newPt);
|
||||
if (DeltaPoint(wasPt, newPt))
|
||||
{
|
||||
switch (theMarquee.direction)
|
||||
{
|
||||
case kAbove:
|
||||
deltaH = 0;
|
||||
deltaV = newPt.v - wasPt.v;
|
||||
*dragged -= deltaV;
|
||||
if (*dragged <= 0)
|
||||
{
|
||||
deltaV += *dragged;
|
||||
*dragged = 0;
|
||||
}
|
||||
DeltaCoordinateD(*dragged);
|
||||
break;
|
||||
|
||||
case kToRight:
|
||||
deltaH = newPt.h - wasPt.h;
|
||||
deltaV = 0;
|
||||
*dragged += deltaH;
|
||||
if (*dragged <= 0)
|
||||
{
|
||||
deltaH -= *dragged;
|
||||
*dragged = 0;
|
||||
}
|
||||
DeltaCoordinateD(*dragged);
|
||||
break;
|
||||
|
||||
case kBelow:
|
||||
deltaH = 0;
|
||||
deltaV = newPt.v - wasPt.v;
|
||||
*dragged += deltaV;
|
||||
if (*dragged <= 0)
|
||||
{
|
||||
deltaV -= *dragged;
|
||||
*dragged = 0;
|
||||
}
|
||||
DeltaCoordinateD(*dragged);
|
||||
break;
|
||||
|
||||
case kToLeft:
|
||||
deltaH = newPt.h - wasPt.h;
|
||||
deltaV = 0;
|
||||
*dragged -= deltaH;
|
||||
if (*dragged <= 0)
|
||||
{
|
||||
deltaH += *dragged;
|
||||
*dragged = 0;
|
||||
}
|
||||
DeltaCoordinateD(*dragged);
|
||||
break;
|
||||
}
|
||||
|
||||
PaintRect(&theMarquee.handle);
|
||||
QOffsetRect(&theMarquee.handle, deltaH, deltaV);
|
||||
PaintRect(&theMarquee.handle);
|
||||
wasPt = newPt;
|
||||
}
|
||||
}
|
||||
FrameRect(&theMarquee.bounds);
|
||||
PaintRect(&theMarquee.handle);
|
||||
PenNormal();
|
||||
InitCursor();
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------- DragMarqueeCorner
|
||||
|
||||
void DragMarqueeCorner (Point start, short *hDragged, short *vDragged, Boolean isTop)
|
||||
{
|
||||
Point wasPt, newPt;
|
||||
short deltaH, deltaV;
|
||||
|
||||
SetCursor(&diagCursor);
|
||||
StopMarquee();
|
||||
PenMode(patXor);
|
||||
PenPat(&theMarquee.pats[theMarquee.index]);
|
||||
FrameRect(&theMarquee.bounds);
|
||||
PaintRect(&theMarquee.handle);
|
||||
|
||||
wasPt = start;
|
||||
while (WaitMouseUp())
|
||||
{
|
||||
GetMouse(&newPt);
|
||||
if (DeltaPoint(wasPt, newPt))
|
||||
{
|
||||
deltaH = newPt.h - wasPt.h;
|
||||
if (isTop)
|
||||
deltaV = wasPt.v - newPt.v;
|
||||
else
|
||||
deltaV = newPt.v - wasPt.v;
|
||||
*hDragged += deltaH;
|
||||
if (*hDragged <= 0)
|
||||
{
|
||||
deltaH -= *hDragged;
|
||||
*hDragged = 0;
|
||||
}
|
||||
*vDragged += deltaV;
|
||||
if (*vDragged <= 0)
|
||||
{
|
||||
deltaV -= *vDragged;
|
||||
*vDragged = 0;
|
||||
}
|
||||
FrameRect(&theMarquee.bounds);
|
||||
PaintRect(&theMarquee.handle);
|
||||
if (isTop)
|
||||
{
|
||||
QOffsetRect(&theMarquee.handle, deltaH, -deltaV);
|
||||
theMarquee.bounds.right += deltaH;
|
||||
theMarquee.bounds.top -= deltaV;
|
||||
}
|
||||
else
|
||||
{
|
||||
QOffsetRect(&theMarquee.handle, deltaH, deltaV);
|
||||
theMarquee.bounds.right += deltaH;
|
||||
theMarquee.bounds.bottom += deltaV;
|
||||
}
|
||||
FrameRect(&theMarquee.bounds);
|
||||
PaintRect(&theMarquee.handle);
|
||||
wasPt = newPt;
|
||||
}
|
||||
}
|
||||
FrameRect(&theMarquee.bounds);
|
||||
PaintRect(&theMarquee.handle);
|
||||
PenNormal();
|
||||
InitCursor();
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------- MarqueeHasHandles
|
||||
|
||||
Boolean MarqueeHasHandles (short *direction, short *dist)
|
||||
{
|
||||
if (theMarquee.handled)
|
||||
{
|
||||
*direction = theMarquee.direction;
|
||||
*dist = theMarquee.dist;
|
||||
return (true);
|
||||
}
|
||||
else
|
||||
{
|
||||
*direction = 0;
|
||||
*dist = 0;
|
||||
return (false);
|
||||
}
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------- PtInMarqueeHandle
|
||||
|
||||
Boolean PtInMarqueeHandle (Point where)
|
||||
{
|
||||
return (PtInRect(where, &theMarquee.handle));
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------- DrawGliderMarquee
|
||||
|
||||
void DrawGliderMarquee (void)
|
||||
{
|
||||
CopyBits((BitMap *)*GetGWorldPixMap(blowerMaskMap),
|
||||
GetPortBitMapForCopyBits(GetWindowPort(mainWindow)),
|
||||
&leftStartGliderSrc,
|
||||
&marqueeGliderRect,
|
||||
srcXor, nil);
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------- SetMarqueeGliderCenter
|
||||
|
||||
void SetMarqueeGliderRect (short h, short v)
|
||||
{
|
||||
marqueeGliderRect = leftStartGliderSrc;
|
||||
ZeroRectCorner(&marqueeGliderRect);
|
||||
QOffsetRect(&marqueeGliderRect, h - kHalfGliderWide, v - kGliderHigh);
|
||||
|
||||
DrawGliderMarquee();
|
||||
gliderMarqueeUp = true;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------- DrawMarquee
|
||||
|
||||
void DrawMarquee (void)
|
||||
{
|
||||
FrameRect(&theMarquee.bounds);
|
||||
if (theMarquee.handled)
|
||||
{
|
||||
PaintRect(&theMarquee.handle);
|
||||
switch (theMarquee.direction)
|
||||
{
|
||||
case kAbove:
|
||||
MoveTo(theMarquee.handle.left + (kHandleSideLong / 2),
|
||||
theMarquee.handle.bottom);
|
||||
LineTo(theMarquee.handle.left + (kHandleSideLong / 2),
|
||||
theMarquee.bounds.top - 1);
|
||||
break;
|
||||
|
||||
case kToRight:
|
||||
MoveTo(theMarquee.handle.left,
|
||||
theMarquee.handle.top + (kHandleSideLong / 2));
|
||||
LineTo(theMarquee.bounds.right,
|
||||
theMarquee.handle.top + (kHandleSideLong / 2));
|
||||
break;
|
||||
|
||||
case kBelow:
|
||||
MoveTo(theMarquee.handle.left + (kHandleSideLong / 2),
|
||||
theMarquee.handle.top - 1);
|
||||
LineTo(theMarquee.handle.left + (kHandleSideLong / 2),
|
||||
theMarquee.bounds.bottom);
|
||||
break;
|
||||
|
||||
case kToLeft:
|
||||
MoveTo(theMarquee.handle.right,
|
||||
theMarquee.handle.top + (kHandleSideLong / 2));
|
||||
LineTo(theMarquee.bounds.left,
|
||||
theMarquee.handle.top + (kHandleSideLong / 2));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (gliderMarqueeUp)
|
||||
DrawGliderMarquee();
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------- InitMarquee
|
||||
|
||||
void InitMarquee (void)
|
||||
{
|
||||
short i;
|
||||
|
||||
for (i = 0; i < kNumMarqueePats; i++)
|
||||
GetIndPattern(&theMarquee.pats[i], kMarqueePatListID, i + 1);
|
||||
theMarquee.index = 0;
|
||||
theMarquee.active = false;
|
||||
theMarquee.paused = false;
|
||||
theMarquee.handled = false;
|
||||
gliderMarqueeUp = false;
|
||||
}
|
||||
|
Reference in New Issue
Block a user