Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 10 additions & 1 deletion Gui/install_pack.py
Original file line number Diff line number Diff line change
Expand Up @@ -216,7 +216,7 @@ def apply_titleBar(self, window: QMainWindow | QDialog):
'''应用标题栏样式'''
hwnd = window.winId().__int__()

if select_styles.css_data['.meta']['--mode'] == 'dark':
if select_styles.css_data['.meta']['mode'] == 'dark':
is_dark_mode = 1
else:
is_dark_mode = 0
Expand Down Expand Up @@ -614,6 +614,9 @@ def update_buttons(self):
self.next_btn.setVisible(True)
self.cancel_btn.setVisible(True)
self.finish_btn.setVisible(False)

if self.current_page == self.PAGE_read_license:
self.next_btn.setEnabled(False)

# 复制错误
if self.current_page == self.PAGE_error:
Expand Down Expand Up @@ -813,6 +816,12 @@ def on_prev(self):
if self.current_page == self.PAGE_set_components and is_ipk:
# 第四页ipk:回滚要跳跃
self.set_page(self.PAGE_hello)
return
if self.current_page == self.PAGE_read_license:
# 读取许可协议返回:回复启用按钮
self.next_btn.setEnabled(True)
self.emua_checkbox.setChecked(False)
super().on_prev()

def closeEvent(self, event):
if self.current_page < self.PAGE_finish:
Expand Down
2 changes: 1 addition & 1 deletion Gui/logger.py
Original file line number Diff line number Diff line change
Expand Up @@ -157,7 +157,7 @@ def wrapper(*args, **kwargs):
result = func(*args, **kwargs)
except Exception as e:
trace = traceback.format_exc()
self.exception(out_service_id, trace, f'Function {function_name} raised an unexpected exception', extra={'service_id': out_service_id, **end_extra_out})
self.exception(out_service_id, f'Function {function_name} raised an unexpected exception', extra={'service_id': out_service_id, **end_extra_out}, mode=ExceptionVal.raise_trace | ExceptionVal.output_msg | ExceptionVal.exit)
QMessageBox.critical(None, 'An unexpected error occurred', f'An unexpected error occurred in {function_name}: \n{trace}\nPlease look the log path: {(folder_path / f"{log_id}.log").resolve()} and send me the log file on issue: https://github.com/xystudiocode/pyClickMouse/issues/new/choose')
sys.exit(1) # 退出程序
log_func(f'Function {function_name} running successfull, returned: {result}', extra={'service_id': out_service_id, **end_extra_out})
Expand Down
129 changes: 97 additions & 32 deletions Gui/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,12 +11,13 @@
except:
logger.exception('clickmouse.main', mode=ExceptionVal.all)
from uiStyles.QUI import *
from PySide6.QtWebEngineWidgets import QWebEngineView
from PySide6.QtWebEngineCore import QWebEngineProfile, QWebEngineScript
from uiStyles import *
from datetime import datetime # 检查时间
from pynput import keyboard # 热键功能库
import pyautogui # 鼠标操作库
from time import sleep, time # 延迟
from webbrowser import open as open_url # 关于作者
from check_update import check_update, web_data, download_file # 更新检查
from uiStyles import indexes as style_indexes
from sharelibs import __version__ # 版本号
Expand Down Expand Up @@ -507,7 +508,15 @@ def get_num(input_value, value_default, err_use_default, default_var):
if type == InputChange.setting_window:
on_input_change(type=InputChange.main_window) # 刷新主窗口
return 0


@logger.auto_logger('clickmouse.main')
def open_url(url, title: str=None, width:int=None, height:int=None, fixed:bool=False):
if dev_flags.get('inline_website'):
webview.show(url, title, width, height, fixed)
else:
from webbrowser import open as open_webbrowser
open_webbrowser(url)

class UMainWindow(QMainWindow):
'''自定义窗口基类'''
def __init__(self):
Expand All @@ -532,7 +541,7 @@ def closeEvent(self, event):
'''窗口关闭事件'''
color_getter.style_changed.disconnect(self.func)
return super().closeEvent(event)

class UDialog(QDialog):
'''自定义对话框基类'''
def __init__(self):
Expand All @@ -559,6 +568,51 @@ def closeEvent(self, event):
color_getter.style_changed.disconnect(self.func)
return super().closeEvent(event)

class UWebView(UMainWindow):
def __init__(self):
super().__init__()
self.setWindowFlags(
Qt.Window | Qt.WindowMinimizeButtonHint | Qt.WindowCloseButtonHint
) # 设置窗口属性
self.web = QWebEngineView()
self.profile = QWebEngineProfile.defaultProfile()
self.engine_script = QWebEngineScript()

self.setCentralWidget(self.web)

def show(self, url, title: str=None, width:int=None, height:int=None, fixed:bool=False):
title = title if title is not None else 'UWebView'
_width = width if width is not None else 640
_height = height if height is not None else 480

webview.setWindowTitle(title)
webview.resize(_width, _height)
if fixed:
webview.setFixedSize(_width, _height)

self.update_script(color_getter.is_dark_mode)

self.web.setUrl(QUrl(url))

return super().show()

def closeEvent(self, event):
'''窗口关闭事件'''
self.web.setUrl(QUrl('about:blank')) # 隐藏网页
return super().closeEvent(event)

@logger.auto_logger('clickmouse.webview', ['UWebView'])
def update_script(self, is_dark_mode: bool):
with open(get_resource_path('WebviewTheme.js'), "r", encoding='utf-8') as f:
self.script = f"var theme = '{'dark' if is_dark_mode else 'light'}';\n" + f.read()

self.engine_script.setName('dark-mode')
self.engine_script.setInjectionPoint(QWebEngineScript.DocumentCreation) # 尽早注入
self.engine_script.setWorldId(QWebEngineScript.MainWorld)
self.engine_script.setRunsOnSubFrames(True)
self.engine_script.setSourceCode(self.script) # 设置代码,配置深色浅色模式
self.profile.scripts().insert(self.engine_script)

class MessageBox(UMessageBox):
def __init__(self, parent: QWidget | None, title: str, text: str, icon: MessageIcon, buttons: MessageButton, defaultButton: MessageButton):
super().__init__(parent, title, text, icon, buttons, defaultButton)
Expand Down Expand Up @@ -871,7 +925,7 @@ def do_step(self, codes):
logger.error(f'Step {code.__name__} Running failed: {e}')

def refresh_title(self):
QTimer.singleShot(setting_value.soft_delay, color_getter.style_changed.emit)
QTimer.singleShot(setting_value.soft_delay, lambda: color_getter.style_changed.emit(bool(color_getter.is_dark_mode)))

def left_check(self):
if clicker.left_clicked:
Expand Down Expand Up @@ -914,7 +968,7 @@ def run(self):
run_software(python_path, exe_path)

class ColorGetter(QObject):
style_changed = Signal()
style_changed = Signal(bool)

def __init__(self):
super().__init__()
Expand All @@ -923,6 +977,7 @@ def __init__(self):

# 记录当前主题
self.style = setting_value.select_style
self.is_dark_mode = 0

self.current_theme, self.windows_theme, self.windows_color, self.use_windows_color = self.load_theme()
try:
Expand Down Expand Up @@ -1020,15 +1075,15 @@ def apply_titleBar(self, window: QMainWindow | QDialog):
hwnd = window.winId().__int__()

if select_styles.css_data['.meta']['mode'] == 'dark':
is_dark_mode = 1
self.is_dark_mode = 1
else:
is_dark_mode = 0
self.is_dark_mode = 0

# 设置深色模式
ctypes.windll.dwmapi.DwmSetWindowAttribute(
wintypes.HWND(hwnd),
DWMWA_USE_IMMERSIVE,
ctypes.byref(wintypes.INT(is_dark_mode)),
ctypes.byref(wintypes.INT(self.is_dark_mode)),
ctypes.sizeof(wintypes.INT)
)

Expand Down Expand Up @@ -1212,40 +1267,40 @@ def create_menu_bar(self):
menu_bar = self.menuBar()

# 文件菜单
file_menu = menu_bar.addMenu(get_lang('01'))
file_menu: QMenu = menu_bar.addMenu(get_lang('01'))

# 清理缓存动作
clean_cache_action = file_menu.addAction(get_lang('02'))
clean_cache_action: QAction = file_menu.addAction(get_lang('02'))

# 退出动作
exit_action = file_menu.addAction(get_lang('03'))
exit_action: QAction = file_menu.addAction(get_lang('03'))

# 设置菜单
settings_menu = menu_bar.addMenu(get_lang('04'))
settings_action = settings_menu.addAction(get_lang('05'))
attr_action = settings_menu.addAction(get_lang('8c'))
settings_menu: QMenu = menu_bar.addMenu(get_lang('04'))
settings_action: QAction = settings_menu.addAction(get_lang('05'))
attr_action: QAction = settings_menu.addAction(get_lang('8c'))

# 更新菜单
update_menu = menu_bar.addMenu(get_lang('06'))
update_menu: QMenu = menu_bar.addMenu(get_lang('06'))

# 更新菜单动作
update_check = update_menu.addAction(get_lang('07'))
update_log = update_menu.addAction(get_lang('08'))
update_check: QAction = update_menu.addAction(get_lang('07'))
update_log: QAction = update_menu.addAction(get_lang('08'))

# 帮助菜单
help_menu = menu_bar.addMenu(get_lang('09'))
about_action = help_menu.addAction(get_lang('0a'))
help_menu: QMenu = menu_bar.addMenu(get_lang('09'))
about_action: QAction = help_menu.addAction(get_lang('0a'))

# 发送反馈
create_issue_action = help_menu.addAction(get_lang('ba'))
create_issue_action: QAction = help_menu.addAction(get_lang('ba'))

# 文档菜单
doc = help_menu.addAction(get_lang('5f'))
doc: QAction = help_menu.addAction(get_lang('5f'))
doc.triggered.connect(self.open_doc)

# 扩展菜单
extension_menu = menu_bar.addMenu(get_lang('8e'))
official_extension_menu = extension_menu.addMenu(get_lang('90'))
extension_menu: QMenu = menu_bar.addMenu(get_lang('8e'))
official_extension_menu: QMenu = extension_menu.addMenu(get_lang('90'))
if not any(show_list):
# 无官方扩展提示
official_extension_menu.addAction(get_lang('91')).setDisabled(True)
Expand All @@ -1254,7 +1309,7 @@ def create_menu_bar(self):
for name, show, package_id in zip(package_names, show_list, package_ids):
if show:
official_extension_menu.addAction(name).triggered.connect(lambda chk, idx=package_id: self.do_extension(idx)) # 给菜单项添加ID,方便绑定事件
manage_extension_menu = official_extension_menu.addAction(get_lang('92'))
manage_extension_menu: QAction = official_extension_menu.addAction(get_lang('92'))
manage_extension_menu.triggered.connect(self.show_manage_extension) # 管理扩展菜单
manage_extension_menu.setEnabled(has_packages)

Expand Down Expand Up @@ -1288,7 +1343,7 @@ def create_menu_bar(self):
update_check.triggered.connect(lambda: self.on_update(True))
settings_action.triggered.connect(self.show_setting)
exit_action.triggered.connect(app.quit)
create_issue_action.triggered.connect(lambda: open_url(setting_value.feedback))
create_issue_action.triggered.connect(lambda: open_url(setting_value.feedback, filter_hotkey(get_lang('ba')), 1000, 600, True))
attr_action.triggered.connect(self.show_attr)

def open_doc(self, *, path: str=''):
Expand All @@ -1307,7 +1362,7 @@ def open_doc(self, *, path: str=''):
if doc_choice_lang not in supported_doc_lang: # 不受支持的语言包
doc_choice_lang = 'en' # 默认英文

open_url(f'{setting_value.default_doc_link}/{path}'.format(lang=doc_choice_lang))
open_url(f'{setting_value.default_doc_link}/{path}'.format(lang=doc_choice_lang), filter_hotkey(get_lang('5f')), 1000, 600, True)

logger.info(f'{setting_value.default_doc_link}/{path}'.format(lang=doc_choice_lang))

Expand Down Expand Up @@ -1425,7 +1480,7 @@ def on_check_update(self):
def save(self):
'''保存更新缓存'''
if should_check_update_res:
save_update_cache(should_update=result[0], latest_version=result[1], update_info=result[2], hash=result[3], update_version_tag=result[4]) # 缓存最新版本
save_update_cache(should_update=result[0], latest_version=result[1], hash=result[3], update_version_tag=result[4]) # 缓存最新版本

def on_check_update_result(self, check_data):
'''检查更新结果'''
Expand Down Expand Up @@ -1611,7 +1666,8 @@ def init_ui(self):

# 版本信息
version_status_text = get_lang('65') if is_pre else ''
version = QLabel(get_lang('1c').format(__version__, version_status_text))

version = QLabel(get_lang('1c').format(__version__, version_status_text, build_number))
about = QLabel(get_lang('1d'))

# 按钮
Expand All @@ -1621,9 +1677,9 @@ def init_ui(self):

# 布局
central_layout.addWidget(self.image_label, 0, 0, 1, 1)
central_layout.addWidget(version, 0, 1, 1, 2)
central_layout.addWidget(about, 2, 0, 1, 3)
central_layout.addWidget(ok_button, 3, 2)
central_layout.addWidget(version, 0, 1, 1, 4)
central_layout.addWidget(about, 2, 0, 1, 5)
central_layout.addWidget(ok_button, 3, 4)

self.setLayout(central_layout)

Expand Down Expand Up @@ -2292,6 +2348,12 @@ def create_setting_page_value(self):
self.page_update = self.page_choice_buttons[3] # 更新设置
self.page_hotkey = self.page_choice_buttons[4] # 热键设置
self.page_doc = self.page_choice_buttons[5] # 文档设置
if dev_flags.get('new_settings', False):
self.page_notify = self.page_choice_buttons[6] # 通知设置
self.page_flags = self.page_choice_buttons[7] # 标志设置
else:
self.page_flags = self.page_choice_buttons[6] # 标志设置
self.page_notify = ''

def check_values(self):
'''检查设置值'''
Expand Down Expand Up @@ -3112,6 +3174,7 @@ def run_command(self, command):
is_running = any(list(map(lambda x: QSharedMemory(x).attach(), mem_id[3:4])))
if is_running:
# 已经有一个实例在运行
QMessageBox.critical(None, get_lang('14'), get_lang('d6'))
sys.exit(2)

with open(get_resource_path('langs', 'packages.json'), 'r', encoding='utf-8') as f:
Expand Down Expand Up @@ -3171,12 +3234,15 @@ def run_command(self, command):
DWMNCRP_ENABLED = 1

logger.info('Loading services')
icon = get_icon('icon')

refresh = Refresh()
setting_value = SettingValue()
clicker = Click()
auto_start_manager = StartManager()
color_getter = ColorGetter()
run_after = RunAfter()
webview = UWebView()
hotkey_listener = get_hotkey_listener_instance()

logger.info('Loading value')
Expand All @@ -3200,7 +3266,6 @@ def run_command(self, command):
# 创建资源
update_cache = load_update_cache()
should_check_update_res = should_check_update() if setting_value.update_enabled else False
icon = get_icon('icon')

settings_need_restart = False
can_update = False
Expand Down
31 changes: 31 additions & 0 deletions Gui/res/WebviewTheme.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
// -- 1. 覆盖 matchMedia,使 prefers-color-scheme: dark 返回 true --
(function() {
const _origMatchMedia = window.matchMedia.bind(window);
window.matchMedia = function(query) {
const mql = _origMatchMedia(query);
const regex = new RegExp(`prefers-color-scheme\\s*:\\s*${theme}`, 'i');
if (regex.test(query)) {
Object.defineProperty(mql, 'matches', {
get: () => true,
configurable: true,
enumerable: true
});
}
return mql;
};
})();

// -- 2. 注入 color-scheme,让滚动条、表单控件等原生元素使用深色 --
(function() {
function injectColorScheme() {
const style = document.createElement('style');
style.id = `__qt_${theme}_color_scheme__`;
style.textContent = `:root { color-scheme: ${theme} !important; }`;
(document.head || document.documentElement).appendChild(style);
}
if (document.head) {
injectColorScheme();
} else {
document.addEventListener('DOMContentLoaded', injectColorScheme);
}
})();
5 changes: 5 additions & 0 deletions Gui/res/dev_settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,5 +8,10 @@
"name": "Decoupling UI and program",
"key": "decoupling",
"desc": "To decouple the UI and program.This need to restart the program to\nake effect."
},
{
"name": "Inline website",
"key": "inline_website",
"desc": "Website will show as a window if this is enabled."
}
]
Loading
Loading