1
0
mirror of https://github.com/EDCD/EDMarketConnector.git synced 2025-04-17 17:42:20 +03:00

Merge pull request #2210 from HullSeals/enhancement/1173/right-click-provider-options

[1173] Add Right-Click Menu to UI Elements
This commit is contained in:
Phoebe 2024-05-14 01:48:54 +02:00 committed by GitHub
commit 95fa67ca86
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 98 additions and 24 deletions

View File

@ -417,25 +417,10 @@ from hotkey import hotkeymgr
from l10n import translations as tr from l10n import translations as tr
from monitor import monitor from monitor import monitor
from theme import theme from theme import theme
from ttkHyperlinkLabel import HyperlinkLabel from ttkHyperlinkLabel import HyperlinkLabel, SHIPYARD_HTML_TEMPLATE
SERVER_RETRY = 5 # retry pause for Companion servers [s] SERVER_RETRY = 5 # retry pause for Companion servers [s]
SHIPYARD_HTML_TEMPLATE = """
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="refresh" content="0; url={link}">
<title>Redirecting you to your {ship_name} at {provider_name}...</title>
</head>
<body>
<a href="{link}">
You should be redirected to your {ship_name} at {provider_name} shortly...
</a>
</body>
</html>
"""
class AppWindow: class AppWindow:
"""Define the main application window.""" """Define the main application window."""
@ -500,13 +485,13 @@ class AppWindow:
self.cmdr_label = tk.Label(frame, name='cmdr_label') self.cmdr_label = tk.Label(frame, name='cmdr_label')
self.cmdr = tk.Label(frame, compound=tk.RIGHT, anchor=tk.W, name='cmdr') self.cmdr = tk.Label(frame, compound=tk.RIGHT, anchor=tk.W, name='cmdr')
self.ship_label = tk.Label(frame, name='ship_label') self.ship_label = tk.Label(frame, name='ship_label')
self.ship = HyperlinkLabel(frame, compound=tk.RIGHT, url=self.shipyard_url, name='ship') self.ship = HyperlinkLabel(frame, compound=tk.RIGHT, url=self.shipyard_url, name='ship', popup_copy=True)
self.suit_label = tk.Label(frame, name='suit_label') self.suit_label = tk.Label(frame, name='suit_label')
self.suit = tk.Label(frame, compound=tk.RIGHT, anchor=tk.W, name='suit') self.suit = tk.Label(frame, compound=tk.RIGHT, anchor=tk.W, name='suit')
self.system_label = tk.Label(frame, name='system_label') self.system_label = tk.Label(frame, name='system_label')
self.system = HyperlinkLabel(frame, compound=tk.RIGHT, url=self.system_url, popup_copy=True, name='system') self.system = HyperlinkLabel(frame, compound=tk.RIGHT, url=self.system_url, popup_copy=True, name='system')
self.station_label = tk.Label(frame, name='station_label') self.station_label = tk.Label(frame, name='station_label')
self.station = HyperlinkLabel(frame, compound=tk.RIGHT, url=self.station_url, name='station') self.station = HyperlinkLabel(frame, compound=tk.RIGHT, url=self.station_url, name='station', popup_copy=True)
# system and station text is set/updated by the 'provider' plugins # system and station text is set/updated by the 'provider' plugins
# edsm and inara. Look for: # edsm and inara. Look for:
# #
@ -1613,7 +1598,7 @@ class AppWindow:
hotkeymgr.play_bad() hotkeymgr.play_bad()
def shipyard_url(self, shipname: str) -> str | None: def shipyard_url(self, shipname: str) -> str | None:
"""Despatch a ship URL to the configured handler.""" """Dispatch a ship URL to the configured handler."""
if not (loadout := monitor.ship()): if not (loadout := monitor.ship()):
logger.warning('No ship loadout, aborting.') logger.warning('No ship loadout, aborting.')
return '' return ''
@ -1640,13 +1625,13 @@ class AppWindow:
return f'file://localhost/{file_name}' return f'file://localhost/{file_name}'
def system_url(self, system: str) -> str | None: def system_url(self, system: str) -> str | None:
"""Despatch a system URL to the configured handler.""" """Dispatch a system URL to the configured handler."""
return plug.invoke( return plug.invoke(
config.get_str('system_provider', default='EDSM'), 'EDSM', 'system_url', monitor.state['SystemName'] config.get_str('system_provider', default='EDSM'), 'EDSM', 'system_url', monitor.state['SystemName']
) )
def station_url(self, station: str) -> str | None: def station_url(self, station: str) -> str | None:
"""Despatch a station URL to the configured handler.""" """Dispatch a station URL to the configured handler."""
return plug.invoke( return plug.invoke(
config.get_str('station_provider', default='EDSM'), 'EDSM', 'station_url', config.get_str('station_provider', default='EDSM'), 'EDSM', 'station_url',
monitor.state['SystemName'], monitor.state['StationName'] monitor.state['SystemName'], monitor.state['StationName']

View File

@ -788,3 +788,6 @@
/* myNotebook.py: Can't Paste Images or Files in Text; */ /* myNotebook.py: Can't Paste Images or Files in Text; */
"Cannot paste non-text content." = "Cannot paste non-text content."; "Cannot paste non-text content." = "Cannot paste non-text content.";
/* ttkHyperlinkLabel.py: Open Element In Selected Provider; */
"Open in {URL}" = "Open in {URL}";

View File

@ -121,7 +121,7 @@ class EntryMenu(ttk.Entry):
class Entry(EntryMenu): class Entry(EntryMenu):
"""Custom ttk.Entry class to fix some display issues.""" """Custom ttk.Entry class to fix some display issues."""
# DEPRECATED: Migrate to EntryMenu. Will remove in 5.12 or later. # DEPRECATED: Migrate to EntryMenu. Will remove in 6.0 or later.
def __init__(self, master: ttk.Frame | None = None, **kw): def __init__(self, master: ttk.Frame | None = None, **kw):
EntryMenu.__init__(self, master, **kw) EntryMenu.__init__(self, master, **kw)
@ -139,7 +139,7 @@ class Button(ttk.Button):
class ColoredButton(tk.Button): class ColoredButton(tk.Button):
"""Custom tk.Button class to fix some display issues.""" """Custom tk.Button class to fix some display issues."""
# DEPRECATED: Migrate to tk.Button. Will remove in 5.12 or later. # DEPRECATED: Migrate to tk.Button. Will remove in 6.0 or later.
def __init__(self, master: ttk.Frame | None = None, **kw): def __init__(self, master: ttk.Frame | None = None, **kw):
tk.Button.__init__(self, master, **kw) tk.Button.__init__(self, master, **kw)

View File

@ -19,14 +19,34 @@ In addition to standard ttk.Label arguments, takes the following arguments:
May be imported by plugins May be imported by plugins
""" """
from __future__ import annotations from __future__ import annotations
import html
from functools import partial
import sys import sys
import tkinter as tk import tkinter as tk
import webbrowser import webbrowser
from tkinter import font as tk_font from tkinter import font as tk_font
from tkinter import ttk from tkinter import ttk
from typing import Any from typing import Any
import plug
from os import path
from config import config, logger
from l10n import translations as tr from l10n import translations as tr
from monitor import monitor
SHIPYARD_HTML_TEMPLATE = """
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="refresh" content="0; url={link}">
<title>Redirecting you to your {ship_name} at {provider_name}...</title>
</head>
<body>
<a href="{link}">
You should be redirected to your {ship_name} at {provider_name} shortly...
</a>
</body>
</html>
"""
class HyperlinkLabel(tk.Label or ttk.Label): # type: ignore class HyperlinkLabel(tk.Label or ttk.Label): # type: ignore
@ -64,6 +84,72 @@ class HyperlinkLabel(tk.Label or ttk.Label): # type: ignore
text=kw.get('text'), text=kw.get('text'),
font=kw.get('font', ttk.Style().lookup('TLabel', 'font'))) font=kw.get('font', ttk.Style().lookup('TLabel', 'font')))
# Add Menu Options
self.plug_options = kw.pop('plug_options', None)
self.name = kw.get('name', None)
if self.name == 'ship':
self.menu.add_separator()
for url in plug.provides('shipyard_url'):
self.menu.add_command(
label=tr.tl("Open in {URL}").format(URL=url), # LANG: Open Element In Selected Provider
command=partial(self.open_shipyard, url)
)
if self.name == 'station':
self.menu.add_separator()
for url in plug.provides('station_url'):
self.menu.add_command(
label=tr.tl("Open in {URL}").format(URL=url), # LANG: Open Element In Selected Provider
command=partial(self.open_station, url)
)
if self.name == 'system':
self.menu.add_separator()
for url in plug.provides('system_url'):
self.menu.add_command(
label=tr.tl("Open in {URL}").format(URL=url), # LANG: Open Element In Selected Provider
command=partial(self.open_system, url)
)
def open_shipyard(self, url: str):
"""Open the Current Ship Loadout in the Selected Provider."""
if not (loadout := monitor.ship()):
logger.warning('No ship loadout, aborting.')
return ''
if not bool(config.get_int("use_alt_shipyard_open")):
opener = plug.invoke(url, 'EDSY', 'shipyard_url', loadout, monitor.is_beta)
if opener:
return webbrowser.open(opener)
else:
# Avoid file length limits if possible
provider = config.get_str('shipyard_provider', default='EDSY')
target = plug.invoke(provider, 'EDSY', 'shipyard_url', loadout, monitor.is_beta)
file_name = path.join(config.app_dir_path, "last_shipyard.html")
with open(file_name, 'w') as f:
f.write(SHIPYARD_HTML_TEMPLATE.format(
link=html.escape(str(target)),
provider_name=html.escape(str(provider)),
ship_name=html.escape("Ship")
))
webbrowser.open(f'file://localhost/{file_name}')
def open_system(self, url: str):
"""Open the Current System in the Selected Provider."""
opener = plug.invoke(url, 'EDSM', 'system_url', monitor.state['SystemName'])
if opener:
return webbrowser.open(opener)
def open_station(self, url: str):
"""Open the Current Station in the Selected Provider."""
opener = plug.invoke(
url, 'EDSM', 'station_url',
monitor.state['SystemName'], monitor.state['StationName']
)
if opener:
return webbrowser.open(opener)
def configure( # noqa: CCR001 def configure( # noqa: CCR001
self, cnf: dict[str, Any] | None = None, **kw: Any self, cnf: dict[str, Any] | None = None, **kw: Any
) -> dict[str, tuple[str, str, str, Any, Any]] | None: ) -> dict[str, tuple[str, str, str, Any, Any]] | None: