xrandroll/xrandroll/monitor_item.py

103 lines
4.2 KiB
Python
Raw Normal View History

2020-01-31 16:56:38 -03:00
from PySide2.QtCore import Qt, QObject
2020-01-31 14:27:59 -03:00
from PySide2.QtWidgets import QGraphicsRectItem, QGraphicsTextItem
2020-02-03 17:10:40 -03:00
from PySide2.QtGui import QBrush, QColor
2020-01-31 14:27:59 -03:00
2020-01-31 16:53:36 -03:00
class MonitorItem(QGraphicsRectItem, QObject):
2020-01-31 16:29:04 -03:00
z = 0
2020-01-31 16:53:36 -03:00
2020-01-31 14:27:59 -03:00
def __init__(self, *a, **kw):
2020-01-31 16:53:36 -03:00
data = kw.pop("data")
self.name = kw.pop("name")
self.window = kw.pop("window")
2020-01-31 17:21:41 -03:00
super().__init__(0, 0, 0, 0)
2020-01-31 14:27:59 -03:00
self.setAcceptedMouseButtons(Qt.LeftButton)
2020-01-31 16:53:36 -03:00
self.label = QGraphicsTextItem("", self)
2020-01-31 20:42:38 -03:00
self.bottom_edge = QGraphicsRectItem(0, 0, 0, 0, self)
self.bottom_edge.setBrush(QBrush("red", Qt.SolidPattern))
2020-01-31 16:53:36 -03:00
self.update_visuals(data)
def update_visuals(self, monitor):
self.setRect(0, 0, monitor.res_x, monitor.res_y)
self.setPos(monitor.pos_x, monitor.pos_y)
if monitor.orientation == "normal":
self.bottom_edge.setRect(0, monitor.res_y - 50, monitor.res_x, 50)
2020-02-05 20:12:50 -03:00
elif monitor.orientation == "left":
self.bottom_edge.setRect(monitor.res_x - 50, 0, 50, monitor.res_y)
2020-02-05 20:12:50 -03:00
elif monitor.orientation == "inverted":
self.bottom_edge.setRect(0, 0, monitor.res_x, 50)
2020-02-05 20:12:50 -03:00
elif monitor.orientation == "right":
self.bottom_edge.setRect(0, 0, 50, monitor.res_y)
if monitor.replica_of:
label_text = f"{self.name} [{','.join(monitor.replica_of)}]"
2020-01-31 16:29:04 -03:00
else:
2020-01-31 16:53:36 -03:00
label_text = self.name
self.label.setPlainText(label_text)
2020-01-31 14:27:59 -03:00
label_scale = min(
self.rect().width() / self.label.boundingRect().width(),
self.rect().height() / self.label.boundingRect().height(),
)
self.label.setScale(label_scale)
if monitor.enabled:
if monitor.primary:
2020-02-03 17:10:40 -03:00
color = QColor("#eee8d5")
color.setAlpha(200)
self.setBrush(QBrush(color, Qt.SolidPattern))
2020-02-03 10:09:40 -03:00
self.setZValue(1000)
else:
2020-02-03 17:10:40 -03:00
color = QColor("#ffffff")
color.setAlpha(200)
self.setBrush(QBrush(color, Qt.SolidPattern))
self.setZValue(self.z)
self.z -= 1
self.show()
2020-01-31 16:29:04 -03:00
else:
2020-02-03 17:10:40 -03:00
color = QColor("#f1f1f1")
color.setAlpha(200)
self.setBrush(QBrush(color, Qt.SolidPattern))
2020-02-03 10:09:40 -03:00
self.setZValue(-1000)
2020-02-03 16:39:24 -03:00
self.hide()
2020-01-31 14:27:59 -03:00
def mousePressEvent(self, event):
2020-02-01 15:55:16 -03:00
self.window.pos_label.show()
2020-01-31 14:27:59 -03:00
self.setCursor(Qt.ClosedHandCursor)
self.orig_pos = self.pos()
self.window.ui.screenCombo.setCurrentText(self.name)
2020-01-31 14:27:59 -03:00
def mouseReleaseEvent(self, event):
self.setCursor(Qt.OpenHandCursor)
2020-02-01 15:55:16 -03:00
self.window.pos_label.hide()
2020-02-07 09:55:02 -03:00
self.window.monitor_moved()
2020-01-31 14:27:59 -03:00
def mouseMoveEvent(self, event):
snaps_x, snaps_y = self.window.possible_snaps(self.name)
2020-01-31 14:27:59 -03:00
view = event.widget().parent()
click_pos = event.buttonDownScreenPos(Qt.LeftButton)
current_pos = event.screenPos()
new_pos = view.mapFromScene(self.orig_pos) + current_pos - click_pos
new_pos = view.mapToScene(new_pos)
2022-06-08 09:00:57 -03:00
delta = abs(view.mapToScene(0, 25).y())
2022-06-08 13:31:41 -03:00
if not event.modifiers() & Qt.ControlModifier: # Ctrl was not pressed, so snap
# This snaps the left and top edges
x = new_pos.x()
delta_x = min((abs(x - sx), i) for i, sx in enumerate(snaps_x))
2020-02-06 18:42:03 -03:00
if delta_x[0] < delta: # snap
new_pos.setX(int(snaps_x[delta_x[1]]))
y = new_pos.y()
delta_y = min((abs(y - sy), i) for i, sy in enumerate(snaps_y))
2020-02-06 18:42:03 -03:00
if delta_y[0] < delta: # snap
new_pos.setY(int(snaps_y[delta_y[1]]))
2022-06-08 13:31:41 -03:00
# This snaps the right and bottom edges
x = new_pos.x() + self.rect().width()
delta_x = min((abs(x - sx), i) for i, sx in enumerate(snaps_x))
if delta_x[0] < delta: # snap
new_pos.setX(int(snaps_x[delta_x[1]]) - self.rect().width())
y = new_pos.y() + self.rect().height()
delta_y = min((abs(y - sy), i) for i, sy in enumerate(snaps_y))
if delta_y[0] < delta: # snap
new_pos.setY(int(snaps_y[delta_y[1]]) - self.rect().height())
self.setPos(new_pos)
2020-02-01 15:55:16 -03:00
self.window.show_pos(int(self.pos().x()), int(self.pos().y()))