ebook-snipping-tool/widget.py

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()