GBWindow::GBWindow(GBView * contents, short left, short top, bool vis) : showGrowBox(false), //TODO window(nil), view(contents), visible(vis) { Rect bounds; bounds.left = left; bounds.top = top; bounds.right = left + view->PreferredWidth(); bounds.bottom = top + view->PreferredHeight(); Str255 s; ToPascalString(view->Name(), s); view->SetBounds(GBRect(0, 0, view->PreferredWidth(), view->PreferredHeight())); if ( CreateNewWindow(kDocumentWindowClass, view->Resizable() ? kWindowStandardDocumentAttributes : (kWindowCloseBoxAttribute | kWindowCollapseBoxAttribute), &bounds, &window) ) throw GBOutOfMemoryError(); SetWTitle(window, s); SetWRefCon(window, (long)this); SetWindowKind(window, kMacWindowKind); view->SetGraphics(&graphics); if ( vis ) ShowWindow(window); }
void GBRobot::Draw(GBGraphics & g, const GBRect & where, bool detailed) const { if(where.Width() <= 5) { DrawMini(g,where); return; } // shield if ( hardware.ActualShield() > 0 ) g.DrawOpenRect(where, GBColor(0.3f, 0.5f, 1) * (hardware.ActualShield() / (mass * kStandardShieldPerMass)).ToDouble()); // body g.DrawSolidOval(where, Owner()->Color()); // meters if ( detailed ) { short meterWidth = std::max(1, (where.Width() + 10) / 10); short arcsize; GBRect meterRect = where; meterRect.Shrink((meterWidth + 1) / 2); //TODO is this portable? // energy meter if ( hardware.MaxEnergy() ) { arcsize = round(hardware.Energy() / hardware.MaxEnergy() * 180); g.DrawArc(meterRect, 180 - arcsize, arcsize, Owner()->Color().ChooseContrasting(GBColor::green, GBColor(0, 0.5f, 1), kMinMeterContrast), meterWidth); } // armor meter arcsize = round(max(hardware.Armor(), 0) / hardware.MaxArmor() * 180); g.DrawArc(meterRect, 180, arcsize, Owner()->Color().ChooseContrasting(GBColor::lightGray, GBColor::darkGray, kMinMeterContrast), meterWidth); // gestation meter meterRect.Shrink(meterWidth); if ( hardware.constructor.Progress() ) { arcsize = round(hardware.constructor.Fraction() * 360); g.DrawArc(meterRect, 360 - arcsize, arcsize, Owner()->Color().ChooseContrasting(GBColor(1, 1, 0), GBColor(0, 0.5f, 0), kMinMeterContrast), meterWidth); } } // decoration short thickness = (15 + where.right - where.left) / 15; //was 2 for >15 else 1 GBRect dec((where.left * 2 + where.right + 2) / 3, (where.top * 2 + where.bottom + 2) / 3, (where.left + where.right * 2 + 1) / 3, (where.top + where.bottom * 2 + 1) / 3); short dx = where.Width() / 4; short dy = where.Height() / 4; //cross, hline, and vline draw in bigDec instead of dec GBRect bigDec(where.CenterX() - dx, where.CenterY() - dy, where.CenterX() + dx, where.CenterY() + dy); switch ( type->Decoration() ) { case rdDot: g.DrawSolidOval(GBRect(where.CenterX() - thickness, where.CenterY() - thickness, where.CenterX() + thickness, where.CenterY() + thickness), type->DecorationColor()); break; case rdCircle: g.DrawOpenOval(dec, type->DecorationColor(), thickness); break; case rdSquare: g.DrawOpenRect(dec, type->DecorationColor(), thickness); break; case rdTriangle: g.DrawLine(dec.left, dec.bottom, dec.CenterX(), dec.top, type->DecorationColor(), thickness); g.DrawLine(dec.CenterX(), dec.top, dec.right, dec.bottom, type->DecorationColor(), thickness); g.DrawLine(dec.left, dec.bottom, dec.right, dec.bottom, type->DecorationColor(), thickness); break; case rdCross: g.DrawLine(where.CenterX(), bigDec.top, where.CenterX(), bigDec.bottom, type->DecorationColor(), thickness); g.DrawLine(bigDec.left, where.CenterY(), bigDec.right, where.CenterY(), type->DecorationColor(), thickness); break; case rdX: g.DrawLine(dec.left, dec.top, dec.right, dec.bottom, type->DecorationColor(), thickness); g.DrawLine(dec.left, dec.bottom, dec.right, dec.top, type->DecorationColor(), thickness); break; case rdHLine: g.DrawLine(bigDec.left, where.CenterY(), bigDec.right, where.CenterY(), type->DecorationColor(), thickness); break; case rdVLine: g.DrawLine(where.CenterX(), bigDec.top, where.CenterX(), bigDec.bottom, type->DecorationColor(), thickness); break; case rdSlash: g.DrawLine(dec.left, dec.bottom, dec.right, dec.top, type->DecorationColor(), thickness); break; case rdBackslash: g.DrawLine(dec.left, dec.top, dec.right, dec.bottom, type->DecorationColor(), thickness); break; case rdNone: default: break; } //rim (last in case something is slightly in the wrong place) g.DrawOpenOval(where, type->Color()); }