-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmain.py
More file actions
177 lines (160 loc) · 5.87 KB
/
Copy pathmain.py
File metadata and controls
177 lines (160 loc) · 5.87 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
import aqt
from aqt.utils import tooltip
import codecs,os,anki.cards
from .config import ConfigWindow,config,isChinese
mainWindow = aqt.mw
app = aqt.QApplication
#////////////////////////////////////////////////
# 自定义命令
def alwaysOnTop():
windows = [mainWindow]
for dclass, instance in aqt.dialogs._dialogs.values():
if instance:
windows.append(instance)
for window in windows:
windowFlags = window.windowFlags()
windowFlags ^= aqt.Qt.WindowType.WindowStaysOnTopHint
window.setWindowFlags(windowFlags)
window.show()
def titlebarHeight():
return mainWindow.window().windowHandle().frameGeometry().height() - mainWindow.geometry().height()
def screenSize(ignoreTaskbar = None):
ignoreTaskbar = config("ignoreTaskbar") if ignoreTaskbar is None else False
scr = app.primaryScreen()
rect = scr.availableGeometry() if not ignoreTaskbar else scr.virtualGeometry()
return rect
def windowSize():
return mainWindow.geometry()
def normalMode():
# 调整半透明度
mainWindow.setWindowOpacity(1)
# 关闭多余控件
mainWindow.menuBar().show()
if config("toolbarless"):
mainWindow.toolbar.web.show()
# 显示在最上方
mainWindow.setWindowFlags(mainWindow.windowFlags() & ~ (aqt.Qt.WindowType.WindowStaysOnTopHint | (aqt.Qt.WindowType.FramelessWindowHint if config("frameless") else 0)))
mainWindow.show()
def floatMode(forceMode=None):
if (not forceMode if forceMode is not None else mainWindow.windowOpacity() < 0.99999):
return normalMode()
# 关闭多余控件
mainWindow.menuBar().hide()
if config("toolbarless"):
mainWindow.toolbar.web.hide()
# 调整半透明度
mainWindow.setWindowOpacity(config("opacity"))
# 显示在最上方
mainWindow.setWindowFlags(mainWindow.windowFlags() | aqt.Qt.WindowType.WindowStaysOnTopHint | (aqt.Qt.WindowType.FramelessWindowHint if config("frameless") else 0))
mainWindow.show()
# 调整位置大小
def delayMover():
ss = screenSize()
w = ss.width() * float(config("width"))
h = ss.height() - 2 * float(config("margin")) - titlebarHeight()
x = ss.width() - w - float(config("margin"))
y = float(config("margin"))
mainWindow.resize(
w,h
)
mainWindow.move(
x,y
)
aqt.QTimer.singleShot(300,delayMover)
def undo():
aqt.mw.undo()
def initWindow():
if config("auto"):
floatMode(True)
#///////////////////////////////////////////////
# 按钮配置
ExtButtons = {
"浮窗":"Float"
}
# 命令配置
ExtCommands = {
"Float":floatMode,
"undo":mainWindow.undo,
"study":initWindow
}
#///////////////////////////////////////////////
# 注入工具栏
def InjectToolBar(btns):
old_func = mainWindow.toolbar._centerLinks
def new_func(*args,**argsd):
old_value = old_func(*args,**argsd)
for title in btns:
cmd = btns[title]
if not isChinese:
title = cmd
old_value += '\n<a class="hitem" tabindex="-1" aria-label="'+title+'" id="sync" href="#" onclick="return pycmd(\''+cmd+'\')">'+title+'</a>'
return old_value
mainWindow.toolbar._centerLinks = new_func
# 注入命令
def InjectCommand(cmds):
def on_js_msg(a,message: str, context):
#tooltip(message)
if message in cmds:
cmds[message]()
return a
aqt.gui_hooks.webview_did_receive_js_message.append(on_js_msg)
# 注入js
def InjectJavascript(jsdata):
def prepare(html, card:anki.cards.Card, context):
prefix = "<script>document.documentElement.classList.remove('common_question');document.documentElement.classList.remove('common_answer');</script>\n" + "<script>document.documentElement.classList.add('common_"+str(aqt.mw.reviewer.state)+"');</script>\n"
return prefix + ("<script>\n{}\n</script>\n<script>pycmd('init-window');</script>").format(jsdata)+html
aqt.gui_hooks.card_will_show.append(prepare)
# 注入菜单
def InjectMenu():
def togglefs():
if mainWindow.width() != screenSize().width():
mainWindow.resize( screenSize().width(),screenSize().height())
mainWindow.move(0,0)
else:
floatMode(True)
def toggleop():
if aqt.mw.windowOpacity()<0.999999:
aqt.mw.setWindowOpacity(1.0)
else:
aqt.mw.setWindowOpacity(config("opacity"))
def configFloat():
ConfigWindow()
def on_menu_show(a,menu:aqt.QMenu):
menu.addAction(
"浮窗配置" if isChinese else "Float configure"
,configFloat
)#.setDisabled(True)
menu.addSeparator()
menu.addAction(
"开关浮窗模式" if isChinese else "Toggle float mode"
,floatMode
)
menu.addAction(
"开关半透明模式" if isChinese else "Toggle opacity mode"
,toggleop
)
menu.addAction(
"开关全屏幕模式" if isChinese else "Toggle fullscreen mode"
,togglefs
)
def back():
aqt.mw.moveToState("overview")
if config("auto"):
floatMode(False)
menu.addAction(
"回到主界面" if isChinese else "Return to overview",
back,
)
aqt.gui_hooks.webview_will_show_context_menu.append(on_menu_show)
## MAIN WINDOW MENU
mainMenu = mainWindow.menuBar().addMenu("浮窗(&W)" if isChinese else "Float Window(&W)")
on_menu_show(None,mainMenu)
#////////////////////////////////////////////////
def init():
InjectToolBar(ExtButtons)
InjectCommand(ExtCommands)
InjectMenu()
mainWindow.setWindowOpacity(1)
with codecs.open(os.path.join( os.path.dirname( __file__),'common.js') , 'r' ,'utf-8') as file:
jsdata = file.read().replace("</script>","")
InjectJavascript(jsdata)