void GxDock::myClampFloatPos(GxVec2i view) { int w = myFloatRect.w; int h = myFloatRect.h; myFloatRect.x = GxClamp(myFloatRect.x, 0, GxMax(0, view.x-24)); myFloatRect.y = GxClamp(myFloatRect.y, 0, GxMax(0, view.y-24)); }
void GxFreeLayout::Arrange(GxRecti rect) { int dx = rect.x + myMargin.l; int dy = rect.y + myMargin.t; for(int i=0; i<myItems.Size(); ++i) { GxWidget* w = myItems[i].widget; GxSizePolicyResult pol(w); GxVec2i pos = myItems[i].pos; GxRecti r(dx + pos.x, dy + pos.y, 0, 0); r.w = GxClamp(pol.hint.x, pol.min.x, pol.max.x); r.h = GxClamp(pol.hint.y, pol.min.y, pol.max.y); w->SetRect(r); } }
void GxSliderAbstract::myUpdateValue(double value, bool emitEvent) { bool snap = myFlags[F_SNAPPING]; double min = GxMin(myBegin, myEnd); double max = GxMax(myBegin, myEnd); if(snap && abs(myTickInterval) >= 0.001 && value > min && value < max) { value -= myBegin; value = floor(value/myTickInterval + 0.5) * myTickInterval; value += myBegin; } value = GxClamp(value, min, max); if(myValue != value && emitEvent) { EmitEvent(eChanged(), value); myFlags.Set(F_CHANGED); } myValue = value; if(myVarPtr) *myVarPtr = value; }
void GxDockArea::Tick(float dt) { GxVec2i mpos = GxInput::Get()->GetMousePos(); mpos.x = GxClamp(mpos.x, 0, myRect.w); mpos.y = GxClamp(mpos.y, 0, myRect.h); GxVec2i resizeDir = GxVec2i(0, 0); bool draggingAction = false; if(myHoverDock) { GxDock::Item item = myHoverDock->myGetItemAt(mpos.x, mpos.y); if(item == GxDock::I_BAR) draggingAction = true; if(item == GxDock::I_FRAME) resizeDir = myHoverDock->myGetResizeDir(mpos.x, mpos.y); } // Handle floating dock dragging action. if(myActionType == FA_DRAG) { draggingAction = true; GxRecti r = myActionDims; r.x += mpos.x - myActionPos.x; r.y += mpos.y - myActionPos.y; myFocusDock->myFloatRect = r; myFocusDock->myClampFloatSize(GxVec2i()); myFocusDock->myClampFloatPos(GxVec2i(myRect.w, myRect.h)); myDragHl = GxMin(1.f, myDragHl + dt * 2); } else { myDragHl = GxMax(0.f, myDragHl - dt * 4); } // Handle floating dock resize action. if(myActionType == FA_RESIZE) { resizeDir = myResizeDir; GxRecti r = myActionDims; GxVec2i d = mpos - myActionPos; if(myResizeDir.x < 0) r.Expand(-d.x, 0, 0, 0); if(myResizeDir.y < 0) r.Expand(0, -d.y, 0, 0); if(myResizeDir.x > 0) r.Expand(0, 0, +d.x, 0); if(myResizeDir.y > 0) r.Expand(0, 0, 0, +d.y); myFocusDock->myFloatRect = r; myFocusDock->myClampFloatSize(myResizeDir); myFocusDock->myClampFloatPos(GxVec2i(myRect.w, myRect.h)); } // Change the mouse cursor image when resizing. if(resizeDir.x != 0 || resizeDir.y != 0) { GxVec2i d = resizeDir; GxCursorImage c = GX_CI_DRAG; if(d.x != 0 && d.y == 0) c = GX_CI_SIZE_WE; if(d.x == 0 && d.y != 0) c = GX_CI_SIZE_NS; if(d.x < 0 && d.y < 0) c = GX_CI_SIZE_NWSE; if(d.x > 0 && d.y > 0) c = GX_CI_SIZE_NWSE; if(d.x < 0 && d.y > 0) c = GX_CI_SIZE_NESW; if(d.x > 0 && d.y < 0) c = GX_CI_SIZE_NESW; GetContext()->SetCursor(c); } // Change the mouse cursor image when dragging. if(draggingAction) { GetContext()->SetCursor(GX_CI_DRAG); } // Tick the dock bars. for(int i=0; i<binCount; ++i) if(myBins[i]) myBins[i]->Tick(dt); // Tick the floating docks. for(int i=0; i<myDocks.Size(); ++i) if(myDocks[i]->IsFloating() && !myDocks[i]->IsHidden()) myDocks[i]->Tick(dt); }