from .pyside import QtCore from .geometry import split_line def align_shapes(shapes, direction): _direction_matches[direction](shapes) def align_left(shapes): left = min(s.bounding_rect().left() for s in shapes) for shape in shapes: shape_left = left + (shape.rect.left() - shape.bounding_rect().left()) shape.rect.moveLeft(shape_left) shape.synchronize_rect() shape.update_path() def align_h_center(shapes): x = sum(s.bounding_rect().center().x() for s in shapes) / len(shapes) for shape in shapes: offset = shape.bounding_rect().center().x() - shape.rect.center().x() shape_x = x - offset shape.rect.moveCenter(QtCore.QPointF(shape_x, shape.rect.center().y())) shape.synchronize_rect() shape.update_path() def align_right(shapes): right = max(s.bounding_rect().right() for s in shapes) for shape in shapes: offset = right - shape.bounding_rect().right() shape.rect.moveLeft(shape.rect.left() + offset) shape.synchronize_rect() shape.update_path() def align_top(shapes): top = min(s.bounding_rect().top() for s in shapes) for shape in shapes: shape_top = top + (shape.rect.top() - shape.bounding_rect().top()) shape.rect.moveTop(shape_top) shape.synchronize_rect() shape.update_path() def align_v_center(shapes): y = sum(s.bounding_rect().center().y() for s in shapes) / len(shapes) for shape in shapes: offset = shape.bounding_rect().center().y() - shape.rect.center().y() shape_y = y - offset shape.rect.moveCenter(QtCore.QPointF(shape.rect.center().x(), shape_y)) shape.synchronize_rect() shape.update_path() def align_bottom(shapes): bottom = max(s.bounding_rect().bottom() for s in shapes) for shape in shapes: offset = shape.rect.bottom() - shape.bounding_rect().bottom() shape_bottom = bottom + offset shape.rect.moveBottom(shape_bottom) shape.synchronize_rect() shape.update_path() def arrange_horizontal(shapes): if len(shapes) < 3: return shapes = sorted(shapes, key=lambda s: s.bounding_rect().center().x()) centers = split_line( point1=shapes[0].bounding_rect().center(), point2=shapes[-1].bounding_rect().center(), step_number=len(shapes)) for shape, center in zip(shapes, centers): offset = shape.bounding_rect().center().x() - shape.rect.center().x() point = QtCore.QPointF(center.x() - offset, shape.rect.center().y()) shape.rect.moveCenter(point) shape.synchronize_rect() shape.update_path() def arrange_vertical(shapes): if len(shapes) < 3: return shapes = sorted(shapes, key=lambda s: s.bounding_rect().center().y()) centers = split_line( point1=shapes[0].bounding_rect().center(), point2=shapes[-1].bounding_rect().center(), step_number=len(shapes)) for shape, center in zip(shapes, centers): offset = shape.bounding_rect().center().y() - shape.rect.center().y() point = QtCore.QPointF(shape.rect.center().x(), center.y() - offset) shape.rect.moveCenter(point) shape.synchronize_rect() shape.update_path() def align_shapes_on_line(shapes, point1, point2): centers = split_line(point1, point2, len(shapes)) for center, shape in zip(centers, shapes): shape.rect.moveCenter(center) shape.synchronize_rect() shape.update_path() _direction_matches = { 'left': align_left, 'h_center': align_h_center, 'right': align_right, 'top': align_top, 'v_center': align_v_center, 'bottom': align_bottom }