void WindowArea::DoGroupLayout() { SATWindow* parentWindow = fWindowLayerOrder.ItemAt(0); if (parentWindow == NULL) return; BRect frame = parentWindow->CompleteWindowFrame(); // Make it also work for solver which don't support negative variables frame.OffsetBy(kMakePositiveOffset, kMakePositiveOffset); // adjust window size soft constraints fWidthConstraint->SetRightSide(frame.Width()); fHeightConstraint->SetRightSide(frame.Height()); LinearSpec* linearSpec = fGroup->GetLinearSpec(); Constraint* leftConstraint = linearSpec->AddConstraint(1.0, LeftVar(), kEQ, frame.left); Constraint* topConstraint = linearSpec->AddConstraint(1.0, TopVar(), kEQ, frame.top); // give soft constraints a high penalty fWidthConstraint->SetPenaltyNeg(kHighPenalty); fWidthConstraint->SetPenaltyPos(kHighPenalty); fHeightConstraint->SetPenaltyNeg(kHighPenalty); fHeightConstraint->SetPenaltyPos(kHighPenalty); // After we set the new parameter solve and apply the new layout. ResultType result; for (int32 tries = 0; tries < 15; tries++) { result = fGroup->GetLinearSpec()->Solve(); if (result == kInfeasible) { debug_printf("can't solve constraints!\n"); break; } if (result == kOptimal) { const WindowAreaList& areas = fGroup->GetAreaList(); for (int32 i = 0; i < areas.CountItems(); i++) { WindowArea* area = areas.ItemAt(i); area->_MoveToSAT(parentWindow); } break; } } // set penalties back to normal fWidthConstraint->SetPenaltyNeg(kExtentPenalty); fWidthConstraint->SetPenaltyPos(kExtentPenalty); fHeightConstraint->SetPenaltyNeg(kExtentPenalty); fHeightConstraint->SetPenaltyPos(kExtentPenalty); linearSpec->RemoveConstraint(leftConstraint); linearSpec->RemoveConstraint(topConstraint); }
void GroupCookie::DoGroupLayout(SATWindow* triggerWindow) { if (!fSATGroup.Get()) return; BRect frame = triggerWindow->CompleteWindowFrame(); // Make it also work for solver which don't support negative variables frame.OffsetBy(kMakePositiveOffset, kMakePositiveOffset); // adjust window size soft constraints fWidthConstraint->SetRightSide(frame.Width()); fHeightConstraint->SetRightSide(frame.Height()); LinearSpec* linearSpec = fSATGroup->GetLinearSpec(); fLeftConstraint = linearSpec->AddConstraint(1.0, fLeftBorder, kEQ, frame.left); fTopConstraint = linearSpec->AddConstraint(1.0, fTopBorder, kEQ, frame.top); // adjust window position soft constraints // (a bit more penalty for them so they take precedence) fWidthConstraint->SetPenaltyNeg(-1); fWidthConstraint->SetPenaltyPos(-1); fHeightConstraint->SetPenaltyNeg(-1); fHeightConstraint->SetPenaltyPos(-1); // After we set the new parameter solve and apply the new layout. ResultType result; for (int32 tries = 0; tries < 15; tries++) { result = fSATGroup->GetLinearSpec()->Solve(); if (result == kInfeasible) { debug_printf("can't solve constraints!\n"); break; } if (result == kOptimal) { fSATGroup->AdjustWindows(triggerWindow); _UpdateWindowSize(frame); break; } } // set penalties back to normal fWidthConstraint->SetPenaltyNeg(kExtentPenalty); fWidthConstraint->SetPenaltyPos(kExtentPenalty); fHeightConstraint->SetPenaltyNeg(kExtentPenalty); fHeightConstraint->SetPenaltyPos(kExtentPenalty); linearSpec->RemoveConstraint(fLeftConstraint); fLeftConstraint = NULL; linearSpec->RemoveConstraint(fTopConstraint); fTopConstraint = NULL; }
void WindowArea::_UninitConstraints() { LinearSpec* linearSpec = fGroup->GetLinearSpec(); linearSpec->RemoveConstraint(fMinWidthConstraint, true); linearSpec->RemoveConstraint(fMinHeightConstraint, true); linearSpec->RemoveConstraint(fMaxWidthConstraint, true); linearSpec->RemoveConstraint(fMaxHeightConstraint, true); linearSpec->RemoveConstraint(fWidthConstraint, true); linearSpec->RemoveConstraint(fHeightConstraint, true); fMinWidthConstraint = NULL; fMinHeightConstraint = NULL; fMaxWidthConstraint = NULL; fMaxHeightConstraint = NULL; fWidthConstraint = NULL; fHeightConstraint = NULL; }