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

Add Transparent theme on Windows

This commit is contained in:
Jonathan Harris 2017-01-29 12:36:30 +00:00
parent d7aae5dee3
commit e571e2860d
18 changed files with 77 additions and 21 deletions

View File

@ -88,7 +88,7 @@ class AppWindow:
else:
from PIL import Image, ImageTk
self.w.tk.call('wm', 'iconphoto', self.w, '-default', ImageTk.PhotoImage(Image.open("EDMarketConnector.png")))
self.theme_icon = tk.PhotoImage(data = 'R0lGODlhFAAQAMZVAAAAAAEAAAIBAAMBAAQCAAYDAAcDAAkEAAoEAAwGAQ8IARAIAREJARYKABkLARsMASMQASgSAiUUAy0UAjAVAioXBDIWAy4YBC4ZBS8ZBTkZA0EdBDsgBkUfA0MkB00iA1AjA1IlBFQmBE4qCFgoBVkoBFArCF0qBVQtCGUrBGMtBWYtBWA0Cm8xBW8xBm8yBXMzBXU1Bms5C3s1BXs2BXw2BX02BXw4B4A5B3Q/DIJGDYNGDYJHDoNHDYdJDppGCItLD4xLDo5MDo5MD5hSD59VEKdaEbJgErtlE7tlFLxlE8BpFMJpFMNpFMZrFdFxFtl1F995GOB6GOF6GP+LG////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////yH5BAEKAH8ALAAAAAAUABAAAAejgACCgiODhoeGBABPPgACj48DA4gAk00cSRUYGZycEogBAE4LCUM8Oj2pOzlQBAKHSBeKlABKBq+DHkS0g0wJiCZFvABHJBuHBSxADFRTUs/PUUsiKhaIKEZBKTM13TU0Nj8IIRqThjJCK8MnFIgKMMMAJRGGAQUvvAIPLocBAjgdPggcKMLAgRi0GjxYyNBBCwjwQoEKQLEiABA3HMU7NOFQIAA7')
self.theme_icon = tk.PhotoImage(data = 'R0lGODlhFAAQAMZQAAoKCQoKCgsKCQwKCQsLCgwLCg4LCQ4LCg0MCg8MCRAMCRANChINCREOChIOChQPChgQChgRCxwTCyYVCSoXCS0YCTkdCTseCT0fCTsjDU0jB0EnDU8lB1ElB1MnCFIoCFMoCEkrDlkqCFwrCGEuCWIuCGQvCFs0D1w1D2wyCG0yCF82D182EHE0CHM0CHQ1CGQ5EHU2CHc3CHs4CH45CIA6CIE7CJdECIdLEolMEohQE5BQE41SFJBTE5lUE5pVE5RXFKNaFKVbFLVjFbZkFrxnFr9oFsNqFsVrF8RsFshtF89xF9NzGNh1GNl2GP+KG////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////yH5BAEKAH8ALAAAAAAUABAAAAeegAGCgiGDhoeIRDiIjIZGKzmNiAQBQxkRTU6am0tPCJSGShuSAUcLoIIbRYMFra4FAUgQAQCGJz6CDQ67vAFJJBi0hjBBD0w9PMnJOkAiJhaIKEI7HRoc19ceNAolwbWDLD8uAQnl5ga1I9CHEjEBAvDxAoMtFIYCBy+kFDKHAgM3ZtgYSLAGgwkp3pEyBOJCC2ELB31QATGioAoVAwEAOw==')
self.theme_minimize = tk.BitmapImage(data = '#define im_width 16\n#define im_height 16\nstatic unsigned char im_bits[] = {\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x3f,\n 0xfc, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };\n')
self.theme_close = tk.BitmapImage(data = '#define im_width 16\n#define im_height 16\nstatic unsigned char im_bits[] = {\n 0x00, 0x00, 0x00, 0x00, 0x0c, 0x30, 0x1c, 0x38, 0x38, 0x1c, 0x70, 0x0e,\n 0xe0, 0x07, 0xc0, 0x03, 0xc0, 0x03, 0xe0, 0x07, 0x70, 0x0e, 0x38, 0x1c,\n 0x1c, 0x38, 0x0c, 0x30, 0x00, 0x00, 0x00, 0x00 };\n')
@ -133,7 +133,7 @@ class AppWindow:
row = frame.grid_size()[1]
self.button.grid(row=row, columnspan=2, sticky=tk.NSEW)
self.theme_button.grid(row=row, columnspan=2, sticky=tk.NSEW)
theme.register_alternate((self.button, self.theme_button), {'row':row, 'columnspan':2, 'sticky':tk.NSEW})
theme.register_alternate((self.button, self.theme_button, self.theme_button), {'row':row, 'columnspan':2, 'sticky':tk.NSEW})
self.status.grid(columnspan=2, sticky=tk.EW)
self.button.bind('<Button-1>', self.getandsend)
theme.button_bind(self.theme_button, self.getandsend)
@ -234,7 +234,10 @@ class AppWindow:
theme.register_highlight(theme_titlebar)
theme.register(self.theme_minimize) # images aren't automatically registered
theme.register(self.theme_close)
theme.register_alternate((self.menubar, self.theme_menubar), {'row':0, 'columnspan':2, 'sticky':tk.NSEW})
self.blank_menubar = tk.Frame(frame)
tk.Label(self.blank_menubar).grid()
tk.Label(self.blank_menubar).grid()
theme.register_alternate((self.menubar, self.theme_menubar, self.blank_menubar), {'row':0, 'columnspan':2, 'sticky':tk.NSEW})
self.set_labels()
@ -264,7 +267,11 @@ class AppWindow:
theme.register_highlight(self.station)
theme.apply(self.w)
self.w.bind("<Map>", self.onmap) # Special handling for overrideredict
self.w.bind('<Map>', self.onmap) # Special handling for overrideredict
self.w.bind('<Enter>', self.onenter) # Special handling for transparency
self.w.bind('<FocusIn>', self.onenter) # "
self.w.bind('<Leave>', self.onleave) # "
self.w.bind('<FocusOut>', self.onleave) # "
self.w.bind('<Return>', self.getandsend)
self.w.bind('<KP_Enter>', self.getandsend)
self.w.bind_all('<<Invoke>>', self.getandsend) # Hotkey monitoring
@ -817,6 +824,17 @@ class AppWindow:
if event.widget == self.w:
theme.apply(self.w)
def onenter(self, event=None):
if config.getint('theme') > 1:
self.w.attributes("-transparentcolor", '')
self.blank_menubar.grid_remove()
self.theme_menubar.grid(row=0, columnspan=2, sticky=tk.NSEW)
def onleave(self, event=None):
if config.getint('theme') > 1 and event.widget==self.w:
self.w.attributes("-transparentcolor", 'grey4')
self.theme_menubar.grid_remove()
self.blank_menubar.grid(row=0, columnspan=2, sticky=tk.NSEW)
# Run the app
if __name__ == "__main__":

View File

@ -448,6 +448,9 @@
/* Explorer rank. [stats.py] */
"Trailblazer" = "Trailblazer";
/* Appearance theme setting. [prefs.py] */
"Transparent" = "Průhledná";
/* Trade rank. [stats.py] */
"Tycoon" = "Tycoon";

View File

@ -448,6 +448,9 @@
/* Explorer rank. [stats.py] */
"Trailblazer" = "Wegebner";
/* Appearance theme setting. [prefs.py] */
"Transparent" = "Transparent";
/* Trade rank. [stats.py] */
"Tycoon" = "Magnat";

View File

@ -448,6 +448,9 @@
/* Explorer rank. [stats.py] */
"Trailblazer" = "Trailblazer";
/* Appearance theme setting. [prefs.py] */
"Transparent" = "Transparent";
/* Trade rank. [stats.py] */
"Tycoon" = "Tycoon";

View File

@ -448,6 +448,9 @@
/* Explorer rank. [stats.py] */
"Trailblazer" = "Rastreador";
/* Appearance theme setting. [prefs.py] */
"Transparent" = "Transparente";
/* Trade rank. [stats.py] */
"Tycoon" = "Magnate";

View File

@ -448,6 +448,9 @@
/* Explorer rank. [stats.py] */
"Trailblazer" = "Prospecteur";
/* Appearance theme setting. [prefs.py] */
"Transparent" = "Transparent";
/* Trade rank. [stats.py] */
"Tycoon" = "Magnat";

View File

@ -448,6 +448,9 @@
/* Explorer rank. [stats.py] */
"Trailblazer" = "Trailblazer";
/* Appearance theme setting. [prefs.py] */
"Transparent" = "Trasparente";
/* Trade rank. [stats.py] */
"Tycoon" = "Tycoon";

View File

@ -448,6 +448,9 @@
/* Explorer rank. [stats.py] */
"Trailblazer" = "Trailblazer";
/* Appearance theme setting. [prefs.py] */
"Transparent" = "透明";
/* Trade rank. [stats.py] */
"Tycoon" = "Tycoon";

View File

@ -448,6 +448,9 @@
/* Explorer rank. [stats.py] */
"Trailblazer" = "Trailblazer";
/* Appearance theme setting. [prefs.py] */
"Transparent" = "Caurspīdīga";
/* Trade rank. [stats.py] */
"Tycoon" = "Tycoon";

View File

@ -448,6 +448,9 @@
/* Explorer rank. [stats.py] */
"Trailblazer" = "Trailblazer";
/* Appearance theme setting. [prefs.py] */
"Transparent" = "Transparent";
/* Trade rank. [stats.py] */
"Tycoon" = "Tycoon";

View File

@ -448,6 +448,9 @@
/* Explorer rank. [stats.py] */
"Trailblazer" = "Trailblazer";
/* Appearance theme setting. [prefs.py] */
"Transparent" = "Przezroczyste";
/* Trade rank. [stats.py] */
"Tycoon" = "Tycoon";

View File

@ -448,6 +448,9 @@
/* Explorer rank. [stats.py] */
"Trailblazer" = "Путешественние";
/* Appearance theme setting. [prefs.py] */
"Transparent" = "Прозрачный";
/* Trade rank. [stats.py] */
"Tycoon" = "Магнат";

View File

@ -448,6 +448,9 @@
/* Explorer rank. [stats.py] */
"Trailblazer" = "Trailblazer";
/* Appearance theme setting. [prefs.py] */
"Transparent" = "Prosojno";
/* Trade rank. [stats.py] */
"Tycoon" = "Tycoon";

View File

@ -448,6 +448,9 @@
/* Explorer rank. [stats.py] */
"Trailblazer" = "Новатор";
/* Appearance theme setting. [prefs.py] */
"Transparent" = "Прозора";
/* Trade rank. [stats.py] */
"Tycoon" = "Магнат";

View File

@ -26,6 +26,7 @@ Click on the station name to go to its [Elite: Dangerous Database](http://eddb.i
![Windows screenshot](img/win_dark.png) &nbsp; ![Mac screenshot](img/mac_dark.png)
![Windows screenshot](img/win_transparent.png)
Installation
--------

BIN
img/win_transparent.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 72 KiB

View File

@ -259,7 +259,7 @@ class PreferencesDialog(tk.Toplevel):
self.languages = Translations().available_names()
self.lang = tk.StringVar(value = self.languages.get(config.get('language'), _('Default'))) # Appearance theme and language setting
self.always_ontop = tk.BooleanVar(value = config.getint('always_ontop'))
self.theme = tk.IntVar(value = config.getint('theme') and 1 or 0)
self.theme = tk.IntVar(value = config.getint('theme'))
self.theme_colors = [config.get('dark_text'), config.get('dark_highlight')]
self.theme_prompts = [
_('Normal text'), # Dark theme color setting
@ -274,6 +274,8 @@ class PreferencesDialog(tk.Toplevel):
nb.Label(themeframe, text=_('Theme')).grid(columnspan=3, padx=PADX, sticky=tk.W) # Appearance setting
nb.Radiobutton(themeframe, text=_('Default'), variable=self.theme, value=0, command=self.themevarchanged).grid(columnspan=3, padx=BUTTONX, sticky=tk.W) # Appearance theme and language setting
nb.Radiobutton(themeframe, text=_('Dark'), variable=self.theme, value=1, command=self.themevarchanged).grid(columnspan=3, padx=BUTTONX, sticky=tk.W) # Appearance theme setting
if platform == 'win32':
nb.Radiobutton(themeframe, text=_('Transparent'), variable=self.theme, value=2, command=self.themevarchanged).grid(columnspan=3, padx=BUTTONX, sticky=tk.W) # Appearance theme setting
self.theme_label_0 = nb.Label(themeframe, text=self.theme_prompts[0])
self.theme_label_0.grid(row=20, padx=PADX, sticky=tk.W)
self.theme_button_0 = nb.ColoredButton(themeframe, text=_('Station'), background='grey4', command=lambda:self.themecolorbrowse(0)) # Main window

View File

@ -151,19 +151,16 @@ class _Theme:
background = self.current['background'])
for pair, gridopts in self.widgets_pair:
(default, dark) = pair
if isinstance(default, tk.Menu):
for widget in pair:
widget.grid_remove()
if isinstance(pair[0], tk.Menu):
if theme:
root['menu'] = ''
dark.grid(**gridopts)
pair[theme].grid(**gridopts)
else:
root['menu'] = default
dark.grid_remove()
root['menu'] = pair[0]
else:
old = theme and default or dark
current = theme and dark or default
old.grid_remove()
current.grid(**gridopts)
pair[theme].grid(**gridopts)
if self.active == theme:
return # Don't need to mess with the window manager
@ -188,17 +185,16 @@ class _Theme:
elif platform == 'win32':
# tk8.5.9/win/tkWinWm.c:342
import ctypes
GWL_STYLE = -16
WS_BORDER = 0x00800000
WS_OVERLAPPEDWINDOW =0x00CF0000
GWL_EXSTYLE = -20
WS_EX_WINDOWEDGE = 0x00000100
WS_EX_APPWINDOW = 0x00040000
root.overrideredirect(theme and 1 or 0) # Destroys any top-level window
WS_EX_LAYERED = 0x00080000
root.overrideredirect(theme and 1 or 0)
root.attributes("-transparentcolor", theme > 1 and 'grey4' or '')
root.withdraw()
root.update_idletasks() # Size and windows styles get recalculated here
hwnd = ctypes.windll.user32.GetParent(root.winfo_id())
ctypes.windll.user32.SetWindowLongW(hwnd, GWL_STYLE, theme and WS_BORDER or WS_OVERLAPPEDWINDOW)
ctypes.windll.user32.SetWindowLongW(hwnd, GWL_EXSTYLE, theme and WS_EX_APPWINDOW or WS_EX_WINDOWEDGE)
ctypes.windll.user32.SetWindowLongW(hwnd, GWL_EXSTYLE, theme > 1 and WS_EX_APPWINDOW|WS_EX_LAYERED or WS_EX_APPWINDOW) # Add to taskbar
root.deiconify()
root.wait_visibility() # need main window to be displayed before returning