1
0
mirror of https://github.com/EDCD/EDMarketConnector.git synced 2025-04-13 07:47:14 +03:00

Attempting to re-enable Windows "minimize to system tray" support

1. It's not actually hiding the task bar icon currently.
2. As this touched prefs.py I've done a flake8 and mypy cleanup pass
   too.  But some of that will want reviewing later as I noqa'd some
   things.
This commit is contained in:
Athanasius 2021-11-12 13:17:27 +00:00
parent 5301865c9f
commit 4d069cb406
No known key found for this signature in database
GPG Key ID: AE3E527847057C7D
4 changed files with 46 additions and 46 deletions

View File

@ -9,7 +9,7 @@ import pathlib
import queue
import re
import sys
# import threading
import threading
import webbrowser
from builtins import object, str
from os import chdir, environ
@ -371,7 +371,7 @@ if __name__ == '__main__': # noqa: C901
if TYPE_CHECKING:
from logging import TRACE # type: ignore # noqa: F401 # Needed to update mypy
import update
# from infi.systray import SysTrayIcon
from infi.systray import SysTrayIcon
# isort: on
def _(x: str) -> str:
@ -442,16 +442,16 @@ class AppWindow(object):
self.prefsdialog = None
# if platform == 'win32':
# from infi.systray import SysTrayIcon
if platform == 'win32':
from infi.systray import SysTrayIcon
# def open_window(systray: 'SysTrayIcon') -> None:
# self.w.deiconify()
def open_window(systray: 'SysTrayIcon') -> None:
self.w.deiconify()
# menu_options = (("Open", None, open_window),)
# # Method associated with on_quit is called whenever the systray is closing
# self.systray = SysTrayIcon("EDMarketConnector.ico", applongname, menu_options, on_quit=self.exit_tray)
# self.systray.start()
menu_options = (("Open", None, open_window),)
# Method associated with on_quit is called whenever the systray is closing
self.systray = SysTrayIcon("EDMarketConnector.ico", applongname, menu_options, on_quit=self.exit_tray)
self.systray.start()
plug.load_plugins(master)
@ -1663,18 +1663,18 @@ class AppWindow(object):
with open(f, 'wb') as h:
h.write(str(companion.session.capi_raw_data).encode(encoding='utf-8'))
# def exit_tray(self, systray: 'SysTrayIcon') -> None:
# """Tray icon is shutting down."""
# exit_thread = threading.Thread(target=self.onexit)
# exit_thread.setDaemon(True)
# exit_thread.start()
def exit_tray(self, systray: 'SysTrayIcon') -> None:
"""Tray icon is shutting down."""
exit_thread = threading.Thread(target=self.onexit)
exit_thread.setDaemon(True)
exit_thread.start()
def onexit(self, event=None) -> None:
"""Application shutdown procedure."""
# if platform == 'win32':
# shutdown_thread = threading.Thread(target=self.systray.shutdown)
# shutdown_thread.setDaemon(True)
# shutdown_thread.start()
if platform == 'win32':
shutdown_thread = threading.Thread(target=self.systray.shutdown)
shutdown_thread.setDaemon(True)
shutdown_thread.start()
config.set_shutdown() # Signal we're in shutdown now.

View File

@ -5,7 +5,7 @@ import contextlib
import logging
import tkinter as tk
import webbrowser
from os.path import exists, expanduser, expandvars, join, normpath
from os.path import expanduser, expandvars, join, normpath
from sys import platform
from tkinter import colorchooser as tkColorChooser # type: ignore # noqa: N812
from tkinter import ttk
@ -60,17 +60,17 @@ class PrefsVersion:
def __init__(self):
return
def stringToSerial(self, versionStr: str) -> int: # noqa: N802 # used in plugins
def stringToSerial(self, version_str: str) -> int: # noqa: N802 # used in plugins
"""
Convert a version string into a preferences version serial number.
If the version string isn't known returns the 'current' (latest) serial number.
:param versionStr:
:param version_str:
:return int:
"""
if versionStr in self.versions:
return self.versions[versionStr]
if version_str in self.versions:
return self.versions[version_str]
return self.versions['current']
@ -83,7 +83,6 @@ class PrefsVersion:
:raises ValueError: on serial number after the current latest
:return: bool indicating the answer
"""
# config.get('PrefsVersion') is the version preferences we last saved for
pv = config.get_int('PrefsVersion')
# If no PrefsVersion yet exists then return oldTest
@ -202,6 +201,8 @@ elif platform == 'win32':
BrowseCallbackProc = ctypes.WINFUNCTYPE(ctypes.c_int, HWND, ctypes.c_uint, LPARAM, LPARAM)
class BROWSEINFO(ctypes.Structure):
"""Windows file browser fields."""
_fields_ = [("hwndOwner", HWND), ("pidlRoot", LPVOID), ("pszDisplayName", LPWSTR), ("lpszTitle", LPCWSTR),
("ulFlags", UINT), ("lpfn", BrowseCallbackProc), ("lParam", LPCWSTR), ("iImage", ctypes.c_int)]
@ -326,7 +327,7 @@ class PreferencesDialog(tk.Toplevel):
GetWindowRect(GetParent(self.winfo_id()), position)
if CalculatePopupWindowPosition(
POINT(parent.winfo_rootx(), parent.winfo_rooty()),
SIZE(position.right - position.left, position.bottom - position.top),
SIZE(position.right - position.left, position.bottom - position.top), # type: ignore
0x10000, None, position
):
self.geometry(f"+{position.left}+{position.top}")
@ -422,7 +423,7 @@ class PreferencesDialog(tk.Toplevel):
if plugin_frame:
notebook.add(plugin_frame, text=plugin.name)
def __setup_config_tab(self, notebook: Notebook) -> None:
def __setup_config_tab(self, notebook: Notebook) -> None: # noqa: CCR001
config_frame = nb.Frame(notebook)
config_frame.columnconfigure(1, weight=1)
row = AutoInc(start=1)
@ -700,7 +701,7 @@ class PreferencesDialog(tk.Toplevel):
# LANG: The system default language choice in Settings > Appearance
self.lang = tk.StringVar(value=self.languages.get(config.get_str('language'), _('Default')))
self.always_ontop = tk.BooleanVar(value=bool(config.get_int('always_ontop')))
# self.minimize_system_tray = tk.BooleanVar(value=config.get_bool('minimize_system_tray'))
self.minimize_system_tray = tk.BooleanVar(value=config.get_bool('minimize_system_tray'))
self.theme = tk.IntVar(value=config.get_int('theme'))
self.theme_colors = [config.get_str('dark_text'), config.get_str('dark_highlight')]
self.theme_prompts = [
@ -798,7 +799,7 @@ class PreferencesDialog(tk.Toplevel):
self.ui_scale.set(config.get_int('ui_scale'))
self.uiscale_bar = tk.Scale(
appearance_frame,
variable=self.ui_scale, # TODO: intvar, but annotated as DoubleVar
variable=self.ui_scale, # type: ignore # TODO: intvar, but annotated as DoubleVar
orient=tk.HORIZONTAL,
length=300 * (float(theme.startup_ui_scale) / 100.0 * theme.default_ui_scale), # type: ignore # runtime
from_=0,
@ -869,20 +870,20 @@ class PreferencesDialog(tk.Toplevel):
)
self.ontop_button.grid(columnspan=3, padx=self.BUTTONX, sticky=tk.W, row=row.get()) # Appearance setting
# if platform == 'win32':
# nb.Checkbutton(
# appearance_frame,
# text=_('Minimize to system tray'),
# variable=self.minimize_system_tray,
# command=self.themevarchanged
# ).grid(columnspan=3, padx=self.BUTTONX, sticky=tk.W, row=row.get()) # Appearance setting
if platform == 'win32':
nb.Checkbutton(
appearance_frame,
text=_('Minimize to system tray'),
variable=self.minimize_system_tray,
command=self.themevarchanged
).grid(columnspan=3, padx=self.BUTTONX, sticky=tk.W, row=row.get()) # Appearance setting
nb.Label(appearance_frame).grid(sticky=tk.W) # big spacer
# LANG: Label for Settings > Appearance tab
notebook.add(appearance_frame, text=_('Appearance')) # Tab heading in settings
def __setup_plugin_tab(self, notebook: Notebook) -> None:
def __setup_plugin_tab(self, notebook: Notebook) -> None: # noqa: CCR001
# Plugin settings and info
plugins_frame = nb.Frame(notebook)
plugins_frame.columnconfigure(0, weight=1)
@ -993,6 +994,7 @@ class PreferencesDialog(tk.Toplevel):
self.cmdrchanged_alarm = self.after(1000, self.cmdrchanged)
def tabchanged(self, event: tk.Event) -> None:
"""Handle preferences active tab changing."""
self.outvarchanged()
if platform == 'darwin':
# Hack to recompute size so that buttons show up under Mojave
@ -1004,12 +1006,10 @@ class PreferencesDialog(tk.Toplevel):
temp.destroy()
def outvarchanged(self, event: Optional[tk.Event] = None) -> None:
"""Handle Output tab variable changes."""
self.displaypath(self.outdir, self.outdir_entry)
self.displaypath(self.logdir, self.logdir_entry)
logdir = self.logdir.get()
logvalid = exists(logdir) if logdir else False
self.out_label['state'] = tk.NORMAL
self.out_csv_button['state'] = tk.NORMAL
self.out_td_button['state'] = tk.NORMAL
@ -1029,13 +1029,13 @@ class PreferencesDialog(tk.Toplevel):
from sys import platform as sys_platform
directory = None
if sys_platform == 'win32' and current_locale[1] not in ('utf8', 'UTF8', 'utf-8', 'UTF-8'):
def browsecallback(hwnd, uMsg, lParam, lpData):
def browsecallback(hwnd, uMsg, lParam, lpData): # noqa: N803 # Windows API convention
# set initial folder
if uMsg == BFFM_INITIALIZED and lpData:
ctypes.windll.user32.SendMessageW(hwnd, BFFM_SETSELECTION, 1, lpData)
return 0
browseInfo = BROWSEINFO()
browseInfo = BROWSEINFO() # noqa: N806 # Windows convention
browseInfo.lpszTitle = title
browseInfo.ulFlags = BIF_RETURNONLYFSDIRS | BIF_USENEWUI
browseInfo.lpfn = BrowseCallbackProc(browsecallback)
@ -1079,7 +1079,7 @@ class PreferencesDialog(tk.Toplevel):
display = []
components = normpath(pathvar.get()).split('\\')
buf = ctypes.create_unicode_buffer(MAX_PATH)
pidsRes = ctypes.c_int()
pidsRes = ctypes.c_int() # noqa: N806 # Windows convention
for i in range(start, len(components)):
try:
if (not SHGetLocalizedName('\\'.join(components[:i+1]), buf, MAX_PATH, ctypes.byref(pidsRes)) and
@ -1258,7 +1258,7 @@ class PreferencesDialog(tk.Toplevel):
config.set('ui_scale', self.ui_scale.get())
config.set('ui_transparency', self.transparency.get())
config.set('always_ontop', self.always_ontop.get())
# config.set('minimize_system_tray', self.minimize_system_tray.get())
config.set('minimize_system_tray', self.minimize_system_tray.get())
config.set('theme', self.theme.get())
config.set('dark_text', self.theme_colors[0])
config.set('dark_highlight', self.theme_colors[1])
@ -1283,6 +1283,7 @@ class PreferencesDialog(tk.Toplevel):
if platform == 'darwin':
def enableshortcuts(self) -> None:
"""Set up macOS preferences shortcut."""
self.apply()
# popup System Preferences dialog
try:

View File

@ -2,7 +2,7 @@ certifi==2021.10.8
requests==2.26.0
watchdog==2.1.6
# Commented out because this doesn't package well with py2exe
# infi.systray==0.1.12; sys_platform == 'win32'
infi.systray==0.1.12; sys_platform == 'win32'
# argh==0.26.2 watchdog dep
# pyyaml==5.3.1 watchdog dep
semantic-version==2.8.5

View File

@ -197,7 +197,6 @@ elif sys.platform == 'win32':
'_markerlib',
'optparse',
'PIL',
'pkg_resources',
'simplejson',
'unittest'
],