127 lines
4.3 KiB
Python
127 lines
4.3 KiB
Python
import sys
|
|
from utils.utils import resource_path
|
|
from PyQt5.QtWidgets import QApplication, QWidget, QRubberBand, QMessageBox
|
|
from PyQt5.QtCore import Qt, QRect, QPoint, QSize
|
|
from PyQt5.QtGui import QGuiApplication, QCursor
|
|
|
|
|
|
class SnippingWidget(QWidget):
|
|
def __init__(self, mainwindow):
|
|
super().__init__()
|
|
self.setWindowTitle("Screen Snipper")
|
|
self.parent = mainwindow
|
|
self.setWindowIcon(self.parent.icon)
|
|
self.rectMode = True
|
|
|
|
# ✅ 최상단 유지 및 입력 포커스 확보
|
|
self.setWindowFlags(
|
|
Qt.FramelessWindowHint
|
|
| Qt.WindowStaysOnTopHint
|
|
| Qt.SplashScreen # ✅ 최상단 유지 및 입력 포커스 확보
|
|
)
|
|
|
|
self.setWindowOpacity(0.3) # ✅ 창을 불투명하게 유지
|
|
self.setAttribute(Qt.WA_NoSystemBackground, False) # ✅ 배경 활성화
|
|
self.clipboard = QApplication.clipboard()
|
|
|
|
# ✅ 전체 화면 설정
|
|
screen_geometry = QGuiApplication.primaryScreen().geometry()
|
|
self.setGeometry(screen_geometry)
|
|
self.activateWindow()
|
|
self.raise_()
|
|
|
|
# ✅ 드래그 초기화
|
|
self.origin = QPoint()
|
|
self.rubberBand = QRubberBand(QRubberBand.Rectangle, self)
|
|
|
|
def showEvent(self, event):
|
|
self.setCursor(Qt.CrossCursor) # ✅ 십자 모양 커서로 변경
|
|
super().showEvent(event)
|
|
|
|
def closeEvent(self, event):
|
|
self.unsetCursor()
|
|
super().closeEvent(event)
|
|
|
|
def mousePressEvent(self, event):
|
|
if event.button() == Qt.LeftButton:
|
|
if self.rectMode == True:
|
|
self.origin = event.pos()
|
|
self.rubberBand.setGeometry(QRect(self.origin, QSize()))
|
|
self.rubberBand.show()
|
|
event.accept()
|
|
|
|
def mouseMoveEvent(self, event):
|
|
if self.rectMode == True:
|
|
if not self.origin.isNull():
|
|
rect = QRect(self.origin, event.pos()).normalized()
|
|
self.rubberBand.setGeometry(rect)
|
|
event.accept()
|
|
|
|
def mouseReleaseEvent(self, event):
|
|
if event.button() == Qt.LeftButton:
|
|
|
|
""" Button Coordinate Setting Mode """
|
|
if self.rectMode == False:
|
|
pos = event.pos()
|
|
btn_x, btn_y = pos.x(), pos.y()
|
|
self.parent.coords["btn_x"] = btn_x
|
|
self.parent.coords["btn_y"] = btn_y
|
|
self.parent.update_btn_coord()
|
|
|
|
self.close_overlay()
|
|
|
|
QMessageBox.information(
|
|
self,
|
|
"버튼 좌표 지정 완료",
|
|
f"x: {btn_x}, y: {btn_y}",
|
|
)
|
|
|
|
""" Snipping Area Setting Mode """
|
|
if self.rectMode == True:
|
|
selected_rect = self.rubberBand.geometry()
|
|
|
|
self.rubberBand.hide()
|
|
QApplication.processEvents()
|
|
self.close_overlay()
|
|
|
|
# 멀티 모니터 지원
|
|
screen = QGuiApplication.screenAt(event.globalPos())
|
|
if not screen:
|
|
screen = QGuiApplication.primaryScreen()
|
|
|
|
# screenshot = screen.grabWindow(
|
|
# 0,
|
|
# selected_rect.x(),
|
|
# selected_rect.y(),
|
|
# selected_rect.width(),
|
|
# selected_rect.height(),
|
|
# )
|
|
|
|
# # ✅ 캡처 이미지 저장 및 클립보드 복사
|
|
# screenshot.save("screenshot.png", "PNG")
|
|
# self.clipboard.setPixmap(screenshot)
|
|
|
|
x, y, w, h = selected_rect.getRect()
|
|
self.parent.coords["x"] = x
|
|
self.parent.coords["y"] = y
|
|
self.parent.coords["w"] = w
|
|
self.parent.coords["h"] = h
|
|
|
|
self.parent.update_rect_coords()
|
|
|
|
QMessageBox.information(
|
|
self,
|
|
"영역 지정 완료",
|
|
f"x: {x}, y: {y}, width: {w}, height: {h}",
|
|
)
|
|
def close_overlay(self):
|
|
self.origin = QPoint()
|
|
self.close()
|
|
|
|
def keyPressEvent(self, event):
|
|
if event.key() == Qt.Key_Escape:
|
|
self.rubberBand.hide()
|
|
self.origin = QPoint()
|
|
self.close()
|
|
event.accept()
|