From 6acf7fa18a305197960de2901baaf94fdda6f11c Mon Sep 17 00:00:00 2001 From: Jonathan Harris Date: Sat, 19 Sep 2015 17:03:01 +0100 Subject: [PATCH] Add Edit->Copy menu item. --- EDMarketConnector.py | 22 +++++++++++++++++-- L10n/en.template | 49 +++++++++++++++++++++++-------------------- L10n/fr.strings | 3 +++ L10n/it.strings | 3 +++ L10n/pl.strings | 3 +++ img/win.png | Bin 13953 -> 5685 bytes 6 files changed, 55 insertions(+), 25 deletions(-) diff --git a/EDMarketConnector.py b/EDMarketConnector.py index d641cff8..2e396d68 100755 --- a/EDMarketConnector.py +++ b/EDMarketConnector.py @@ -75,7 +75,7 @@ class HyperlinkLabel(ttk.Label): webbrowser.open(self.urlfn(self['text'])) def _contextmenu(self, event): - if self['text'] and self['text'] != '-': + if self['text'] and self['text'] != AppWindow.STATION_UNDOCKED: self.menu.post(platform == 'darwin' and event.x_root + 1 or event.x_root, event.y_root) def copy(self): @@ -85,6 +85,8 @@ class HyperlinkLabel(ttk.Label): class AppWindow: + STATION_UNDOCKED = '-' # "Station" name to display when not docked + def __init__(self, master): self.holdofftime = config.getint('querytime') + companion.holdoff @@ -149,6 +151,10 @@ class AppWindow: apple_menu.add_command(label=_("About {APP}").format(APP=applongname), command=lambda:self.w.call('tk::mac::standardAboutPanel')) # App menu entry on OSX apple_menu.add_command(label=_("Check for Updates..."), command=lambda:self.updater.checkForUpdates()) menubar.add_cascade(menu=apple_menu) + self.edit_menu = tk.Menu(menubar, name='edit') + self.edit_menu.add_command(label=_('Copy'), accelerator='Command-c', state=tk.DISABLED, command=self.copy) # As in Copy and Paste + menubar.add_cascade(label=_('Edit'), menu=self.edit_menu) # Menu title + self.w.bind('', self.copy) window_menu = tk.Menu(menubar, name='window') menubar.add_cascade(label=_('Window'), menu=window_menu) # Menu title on OSX # https://www.tcl.tk/man/tcl/TkCmd/tk_mac.htm @@ -166,6 +172,10 @@ class AppWindow: file_menu.add_separator() file_menu.add_command(label=_("Exit"), command=self.onexit) # Item in the File menu on Windows menubar.add_cascade(label=_("File"), menu=file_menu) # Menu title on Windows + self.edit_menu = tk.Menu(menubar, tearoff=tk.FALSE) + self.edit_menu.add_command(label=_('Copy'), accelerator='Ctrl+C', state=tk.DISABLED, command=self.copy) # As in Copy and Paste + menubar.add_cascade(label=_('Edit'), menu=self.edit_menu) # Menu title + self.w.bind('', self.copy) self.w.protocol("WM_DELETE_WINDOW", self.onexit) if platform == 'linux2': # Fix up menu to use same styling as everything else @@ -258,6 +268,7 @@ class AppWindow: self.system['image'] = '' self.status['text'] = _('Fetching station data...') self.button['state'] = tk.DISABLED + self.edit_menu.entryconfigure(_('Copy'), state=tk.DISABLED) self.w.update_idletasks() try: @@ -267,7 +278,7 @@ class AppWindow: self.cmdr['text'] = data.get('commander') and data.get('commander').get('name') or '' self.system['text'] = data.get('lastSystem') and data.get('lastSystem').get('name') or '' - self.station['text'] = data.get('commander') and data.get('commander').get('docked') and data.get('lastStarport') and data.get('lastStarport').get('name') or (EDDB.system(self.system['text']) and '-' or '') + self.station['text'] = data.get('commander') and data.get('commander').get('docked') and data.get('lastStarport') and data.get('lastStarport').get('name') or (EDDB.system(self.system['text']) and self.STATION_UNDOCKED or '') config.set('querytime', querytime) self.holdofftime = querytime + companion.holdoff @@ -289,6 +300,7 @@ class AppWindow: # Stuff we can do while waiting for retry + self.edit_menu.entryconfigure(_('Copy'), state=tk.NORMAL) self.edsm.start_lookup(self.system['text'], EDDB.system(self.system['text'])) self.system['image'] = self.edsm.result['img'] self.w.after(int(EDSM_POLL * 1000), self.edsmpoll) @@ -310,6 +322,7 @@ class AppWindow: h.write(json.dumps(data, indent=2, sort_keys=True)) if not retrying: + self.edit_menu.entryconfigure(_('Copy'), state=tk.NORMAL) self.edsm.start_lookup(self.system['text'], EDDB.system(self.system['text'])) self.system['image'] = self.edsm.result['img'] self.w.after(int(EDSM_POLL * 1000), self.edsmpoll) @@ -409,6 +422,11 @@ class AppWindow: self.button['text'] = _('Update') # Update button in main window self.button['state'] = tk.NORMAL + def copy(self, event=None): + if self.system['text']: + self.w.clipboard_clear() + self.w.clipboard_append(self.station['text'] == self.STATION_UNDOCKED and self.system['text'] or '%s,%s' % (self.system['text'], self.station['text'])) + def onexit(self, event=None): if platform!='darwin' or self.w.winfo_rooty()>0: # http://core.tcl.tk/tk/tktview/c84f660833546b1b84e7 config.set('geometry', '+{1}+{2}'.format(*self.w.geometry().split('+'))) diff --git a/L10n/en.template b/L10n/en.template index bf5aa797..862f3347 100644 --- a/L10n/en.template +++ b/L10n/en.template @@ -1,7 +1,7 @@ /* Use same text as E:D Launcher's verification dialog. [prefs.py:319] */ "A verification code has now been sent to the{CR}email address associated with your Elite account." = "A verification code has now been sent to the{CR}email address associated with your Elite account."; -/* App menu entry on OSX. [EDMarketConnector.py:149] */ +/* App menu entry on OSX. [EDMarketConnector.py:151] */ "About {APP}" = "About {APP}"; /* Folder selection button on Windows. [prefs.py:113] */ @@ -10,16 +10,16 @@ /* Folder selection button on OSX. [prefs.py:112] */ "Change..." = "Change..."; -/* [EDMarketConnector.py:150] */ +/* [EDMarketConnector.py:152] */ "Check for Updates..." = "Check for Updates..."; /* Privacy setting. [prefs.py:152] */ "Cmdr name" = "Cmdr name"; -/* Main window. [EDMarketConnector.py:123] */ +/* Main window. [EDMarketConnector.py:125] */ "Cmdr:" = "Cmdr:"; -/* Update button in main window. [EDMarketConnector.py:406] */ +/* Update button in main window. [EDMarketConnector.py:419] */ "cooldown {SS}s" = "cooldown {SS}s"; /* As in Copy and Paste. [EDMarketConnector.py:51] */ @@ -28,10 +28,13 @@ /* Section heading in settings. [prefs.py:70] */ "Credentials" = "Credentials"; -/* [EDMarketConnector.py:367] */ +/* Menu title. [EDMarketConnector.py:156] */ +"Edit" = "Edit"; + +/* [EDMarketConnector.py:380] */ "Error: Can't connect to EDDN" = "Error: Can't connect to EDDN"; -/* [EDMarketConnector.py:372] */ +/* [EDMarketConnector.py:385] */ "Error: Connection to EDDN timed out" = "Error: Connection to EDDN timed out"; /* [companion.py:110] */ @@ -40,13 +43,13 @@ /* [companion.py:104] */ "Error: Server is down" = "Error: Server is down"; -/* Item in the File menu on Windows. [EDMarketConnector.py:167] */ +/* Item in the File menu on Windows. [EDMarketConnector.py:173] */ "Exit" = "Exit"; -/* [EDMarketConnector.py:259] */ +/* [EDMarketConnector.py:269] */ "Fetching station data..." = "Fetching station data..."; -/* Menu title on Windows. [EDMarketConnector.py:168] */ +/* Menu title on Windows. [EDMarketConnector.py:174] */ "File" = "File"; /* Output folder prompt on Windows. [prefs.py:111] */ @@ -64,10 +67,10 @@ /* Section heading in settings on OSX. [prefs.py:125] */ "Keyboard shortcut" = "Keyboard shortcut"; -/* [EDMarketConnector.py:326] */ +/* [EDMarketConnector.py:339] */ "Last updated at {HH}:{MM}:{SS}" = "Last updated at {HH}:{MM}:{SS}"; -/* [EDMarketConnector.py:209] */ +/* [EDMarketConnector.py:219] */ "Logging in..." = "Logging in..."; /* [prefs.py:102] */ @@ -124,10 +127,10 @@ /* [prefs.py:96] */ "Send station data to the Elite Dangerous Data Network" = "Send station data to the Elite Dangerous Data Network"; -/* [EDMarketConnector.py:346] */ +/* [EDMarketConnector.py:359] */ "Sending data to EDDN..." = "Sending data to EDDN..."; -/* Item in the File menu on Windows. [EDMarketConnector.py:165] */ +/* Item in the File menu on Windows. [EDMarketConnector.py:171] */ "Settings" = "Settings"; /* [prefs.py:106] */ @@ -136,40 +139,40 @@ /* [prefs.py:104] */ "Ship loadout in E:D Shipyard format" = "Ship loadout in E:D Shipyard format"; -/* [EDMarketConnector.py:353] */ +/* [EDMarketConnector.py:366] */ "Station doesn't have a market!" = "Station doesn't have a market!"; -/* [EDMarketConnector.py:351] */ +/* [EDMarketConnector.py:364] */ "Station doesn't have anything!" = "Station doesn't have anything!"; -/* Main window. [EDMarketConnector.py:125] */ +/* Main window. [EDMarketConnector.py:127] */ "Station:" = "Station:"; -/* Main window. [EDMarketConnector.py:124] */ +/* Main window. [EDMarketConnector.py:126] */ "System:" = "System:"; -/* Update button in main window. [EDMarketConnector.py:130] */ +/* Update button in main window. [EDMarketConnector.py:132] */ "Update" = "Update"; /* Use same text as E:D Launcher's login dialog. [prefs.py:75] */ "Username (Email)" = "Username (Email)"; -/* Shouldn't happen. [EDMarketConnector.py:283] */ +/* Shouldn't happen. [EDMarketConnector.py:294] */ "What are you flying?!" = "What are you flying?!"; -/* Shouldn't happen. [EDMarketConnector.py:280] */ +/* Shouldn't happen. [EDMarketConnector.py:291] */ "Where are you?!" = "Where are you?!"; /* Output folder prompt on OSX. [prefs.py:110] */ "Where:" = "Where:"; -/* Shouldn't happen. [EDMarketConnector.py:277] */ +/* Shouldn't happen. [EDMarketConnector.py:288] */ "Who are you?!" = "Who are you?!"; -/* Menu title on OSX. [EDMarketConnector.py:153] */ +/* Menu title on OSX. [EDMarketConnector.py:159] */ "Window" = "Window"; -/* [EDMarketConnector.py:329] */ +/* [EDMarketConnector.py:342] */ "You're not docked at a station!" = "You're not docked at a station!"; /* Shortcut settings prompt on OSX. [prefs.py:133] */ diff --git a/L10n/fr.strings b/L10n/fr.strings index bdc90c8a..af44c83d 100644 --- a/L10n/fr.strings +++ b/L10n/fr.strings @@ -174,3 +174,6 @@ /* As in Copy and Paste. [EDMarketConnector.py:51] */ "Copy" = "Copier"; + +/* Menu title. [EDMarketConnector.py:156] */ +"Edit" = "Édition"; diff --git a/L10n/it.strings b/L10n/it.strings index 8c4ca177..bbd97dc1 100644 --- a/L10n/it.strings +++ b/L10n/it.strings @@ -175,3 +175,6 @@ /* As in Copy and Paste. [EDMarketConnector.py:51] */ "Copy" = "Copia"; + +/* Menu title. [EDMarketConnector.py:156] */ +"Edit" = "Composizione"; diff --git a/L10n/pl.strings b/L10n/pl.strings index 5b7b517f..787819cd 100644 --- a/L10n/pl.strings +++ b/L10n/pl.strings @@ -174,3 +174,6 @@ /* As in Copy and Paste. [EDMarketConnector.py:51] */ "Copy" = "Kopiuj"; + +/* Menu title. [EDMarketConnector.py:156] */ +"Edit" = "Edycja"; diff --git a/img/win.png b/img/win.png index 952c6ad10a8181d2292de7cf639b0a5fb640529a..b371bafcd55889c0e467162fbcd9e642f0f6524d 100644 GIT binary patch literal 5685 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đr{oX zJ~X(s7SO9sJGT$15K68X>_gBbQ8y=S{#^d7cL^d~7=X8y;46|fNnE8AI;{@d{Z-RE zdLr>JVdZ4b4jhd-ObUg^9%0nJTx%}zV%wQo3$aExE|joy7K8kkw2%#nQY>@wTO>39 z0iO~|5w;Lh@~uLG&W^W|5B0m3OC+W+Enk&nxD642F*l|Or64)c1$qAanO?rkRIa~P zuiZkVhni4SGGC23(zhhyYF3H-@5;XBF(gvL7~%baB76A}YYIeb9ZsPtx*^C_))juMas--qykRH{5N1nktflm zGFGTttwj8P9_;_mgnn5JFvIKG!IjM$2mIj;m$N?BY=eUl0$nUi2m(SS`TLa0tsfJ$koEx;b} z<6l+VAL@04i=$epl)E>5y^!|g{RWEDGy#AF90w^+6F~FBw#p@nnG|6w0bwv-o#*!1O~qzx_T%KHGJ3AS183c13~MV4v-X!fEc~Sy z*%W}@E*ewr0L=`EHfyA;hv+LRM8P9kQurRDuktDXpNVf+y`SV(h?x!mVW3F$IdqIo zgVFks^#+*m;fIg=H8?Q1PC6~WJlk#fAdH&1%)~htgR6EEHUT3Y5YPd0kQlpm0i8Pa z-;VwGTRY%&u{`nNG5U&`(I^#xKx83BEa$6btk#H(y`HStpnn>IUTv851(N_o32~ml z1IpC|-t&;cDMQ{&2K}7sr#<>)>n@|VgGVAP(H8&=^@I+>abEgtx(WDTOTLC)_)D0- z82jfj@ZkK3;>`h!F_QR0927O^Lc`r=q7ZSux|pypf7_6`9uT$%gUWQZ+Gd}9&tGZr z+bUU5|Oxv9AVIgyIi+b(nXk{{^YB-t5t*#^XJ3B*sd+-oP+MV1jI=WuB8&aEUuo11iT zRL=m%h*>xOY&@1?Pk+QPJ4_y=FnHbFDw@M9us1Lcy4t@fa**A8J^ELYq^03lQ_+-c zMn|%0A)0T)V)e^wSwFyuZlKaJc7Gb;`F0 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