Skip to content

Commit

Permalink
.
Browse files Browse the repository at this point in the history
  • Loading branch information
HIllya51 committed Jan 22, 2025
1 parent 6710d8b commit a9a4122
Show file tree
Hide file tree
Showing 4 changed files with 148 additions and 15 deletions.
2 changes: 1 addition & 1 deletion cpp/version.cmake
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@

set(VERSION_MAJOR 7)
set(VERSION_MINOR 2)
set(VERSION_PATCH 3)
set(VERSION_PATCH 4)
set(VERSION_REVISION 0)
set(LUNA_VERSION "{${VERSION_MAJOR},${VERSION_MINOR},${VERSION_PATCH},${VERSION_REVISION}}")
add_library(VERSION_DEF ${CMAKE_CURRENT_LIST_DIR}/version_def.cpp)
Expand Down
136 changes: 133 additions & 3 deletions py/LunaTranslator/gui/rangeselect.py
Original file line number Diff line number Diff line change
Expand Up @@ -283,17 +283,147 @@ def mouseReleaseEvent(self, event):
self.callbackfunction(event)


class rangeselect_1(QMainWindow):
def __init__(self, xx):

super(rangeselect_1, self).__init__()
self.xx = xx
self.setWindowFlags(
Qt.WindowType.FramelessWindowHint
| Qt.WindowType.WindowStaysOnTopHint
| Qt.WindowType.Tool
)
self.setAttribute(Qt.WidgetAttribute.WA_TranslucentBackground)
self.backlabel = QLabel(self)
self.backlabel.move(0, 0)
self.backlabel2 = QLabel(self)
self.backlabel2.move(0, 0)
self.rectlabel = QLabel(self)
# self.setWindowOpacity(0.5)
self.setMouseTracking(True)
self.setCursor(Qt.CursorShape.CrossCursor)

def reset(self):
screen = QApplication.primaryScreen()
self.setGeometry(QRect(QPoint(0, 0), screen.size()))

screen_geometry = screen.geometry()
if self.xx:
screenshot = screen.grabWindow(
0,
screen_geometry.x(),
screen_geometry.y(),
screen_geometry.width(),
screen_geometry.height(),
)
self.screenshot = screenshot
self.backlabel.setPixmap(screenshot)
self.once = True
self.is_drawing = False
self.start_point = QPoint()
self.end_point = QPoint()
self.rectlabel.resize(0, 0)
self.rectlabel.setStyleSheet(
" border:%spx solid %s; background-color: rgba(0,0,0, 0)"
% (globalconfig["ocrrangewidth"], globalconfig["ocrrangecolor"])
)
self.backlabel2.setStyleSheet(
"background-color: rgba(255,255,255, %s)" % globalconfig["ocrselectalpha"]
)

def resizeEvent(self, e: QResizeEvent):
self.backlabel.resize(e.size())
self.backlabel2.resize(e.size())

def paintEvent(self, event):

if self.is_drawing:

pp = QPainter(self)
pen = QPen(QColor(globalconfig["ocrrangecolor"]))
pen.setWidth(globalconfig["ocrrangewidth"])
pp.setPen(pen)
_x1 = self.start_point.x()
_y1 = self.start_point.y()
_x2 = self.end_point.x()
_y2 = self.end_point.y()
_sp = QPoint(
min(_x1, _x2) - globalconfig["ocrrangewidth"],
min(_y1, _y2) - globalconfig["ocrrangewidth"],
)
_ep = QPoint(
max(_x1, _x2) + globalconfig["ocrrangewidth"],
max(_y1, _y2) + globalconfig["ocrrangewidth"],
)
self.rectlabel.setGeometry(QRect(_sp, _ep))

def mousePressEvent(self, event):
if event.button() == Qt.MouseButton.RightButton:
self.once = False
self.close()
elif event.button() == Qt.MouseButton.LeftButton:
self.end_point = self.start_point = event.pos()
self.is_drawing = True

def mouseMoveEvent(self, event):

if not self.is_drawing:
self.is_drawing = True
self.end_point = self.start_point = event.pos()
else:
self.end_point = event.pos()
self.update()

def getRange(self):
x1, y1, x2, y2 = (
self.start_point.x() * self.devicePixelRatioF(),
self.start_point.y() * self.devicePixelRatioF(),
self.end_point.x() * self.devicePixelRatioF(),
self.end_point.y() * self.devicePixelRatioF(),
)

x1, x2 = min(x1, x2), max(x1, x2)
y1, y2 = min(y1, y2), max(y1, y2)

return ((int(x1), int(y1)), (int(x2), int(y2)))

def callbackfunction(self, event):
if not self.once:
return
self.once = False
self.end_point = event.pos()
self.close()
try:
(x1, y1), (x2, y2) = self.getRange()
self.callback(
self.getRange(),
(
self.screenshot.copy(QRect(QPoint(x1, y1), QPoint(x2, y2)))
if self.xx
else None
),
)
except:
print_exc()

def mouseReleaseEvent(self, event):
if event.button() == Qt.MouseButton.LeftButton:
self.callbackfunction(event)


screen_shot_ui = None


def rangeselct_function(callback):
def rangeselct_function(callback, x=True):
global screen_shot_ui
if screen_shot_ui is not None:
# 完全销毁旧的实例
screen_shot_ui.deleteLater()
screen_shot_ui = None

screen_shot_ui = rangeselect()
if len(QApplication.screens()) == 1:
screen_shot_ui = rangeselect_1(x)
else:
screen_shot_ui = rangeselect()
screen_shot_ui.show()
screen_shot_ui.reset()
screen_shot_ui.callback = callback
Expand Down
10 changes: 6 additions & 4 deletions py/LunaTranslator/gui/showword.py
Original file line number Diff line number Diff line change
Expand Up @@ -92,8 +92,9 @@ def crophide(self, s=False):
self.window().hide()
gobject.baseobject.translation_ui.hide_()

def ocroncefunction(rect):
img = imageCut(0, rect[0][0], rect[0][1], rect[1][0], rect[1][1])
def ocroncefunction(rect, img=None):
if not img:
img = imageCut(0, rect[0][0], rect[0][1], rect[1][0], rect[1][1])
fname = gobject.gettempdir(str(uuid.uuid4()) + "." + getimageformat())
img.save(fname)
self.settextsignal.emit(self.editpath, os.path.abspath(fname))
Expand Down Expand Up @@ -1080,10 +1081,11 @@ def __init__(self, parent):
self.state = 0

@threader
def ocr_do_function(self, rect):
def ocr_do_function(self, rect, img=None):
if not rect:
return
img = imageCut(0, rect[0][0], rect[0][1], rect[1][0], rect[1][1])
if not img:
img = imageCut(0, rect[0][0], rect[0][1], rect[1][0], rect[1][1])
text, infotype = ocr_run(img)
if infotype:
gobject.baseobject.displayinfomessage(text, infotype)
Expand Down
15 changes: 8 additions & 7 deletions py/LunaTranslator/gui/translatorUI.py
Original file line number Diff line number Diff line change
Expand Up @@ -495,20 +495,21 @@ def refreshtoolicon(self):
self.changeextendstated()

@threader
def ocr_do_function(self, rect):
def ocr_do_function(self, rect, img=None):
if not rect:
return
img = imageCut(0, rect[0][0], rect[0][1], rect[1][0], rect[1][1])
if not img:
img = imageCut(0, rect[0][0], rect[0][1], rect[1][0], rect[1][1])
text, infotype = ocr_run(img)
if infotype:
gobject.baseobject.displayinfomessage(text, infotype)
else:
gobject.baseobject.textgetmethod(text, False)

def ocr_once_function(self):
def ocroncefunction(rect):
def ocroncefunction(rect, img=None):
self.ocr_once_follow_rect = rect
self.ocr_do_function(rect)
self.ocr_do_function(rect, img)

rangeselct_function(ocroncefunction)

Expand Down Expand Up @@ -1302,16 +1303,16 @@ def clickRange(self):
return
self.showhidestate = False

rangeselct_function(functools.partial(self.afterrange, False))
rangeselct_function(functools.partial(self.afterrange, False), False)

def clickRangeclear(self):
if globalconfig["sourcestatus2"]["ocr"]["use"] == False:
return
self.showhidestate = False
rangeselct_function(functools.partial(self.afterrange, True))
rangeselct_function(functools.partial(self.afterrange, True), False)

@tryprint
def afterrange(self, clear, rect):
def afterrange(self, clear, rect, img=None):
if clear or not globalconfig["multiregion"]:
gobject.baseobject.textsource.clearrange()
gobject.baseobject.textsource.newrangeadjustor()
Expand Down

0 comments on commit a9a4122

Please sign in to comment.