diff --git a/linux/keyman-config/downloadkeyboard.py b/linux/keyman-config/downloadkeyboard.py index 0249c72be7..aa7087d6da 100755 --- a/linux/keyman-config/downloadkeyboard.py +++ b/linux/keyman-config/downloadkeyboard.py @@ -1,22 +1,15 @@ #!/usr/bin/python3 -import os -import subprocess -import webbrowser import urllib.parse import pathlib -import tempfile +import subprocess +import webbrowser import gi gi.require_version('Gtk', '3.0') gi.require_version('WebKit', '3.0') from gi.repository import Gtk, WebKit -from distutils.version import StrictVersion from get_kmp import get_download_folder, download_kmp_file -from install_kmp import install_kmp, extract_kmp, get_metadata -from list_installed_kmp import get_kmp_version -from kmpmetadata import get_fonts -from welcome import WelcomeView -from uninstall_kmp import uninstall_kmp +from install_window import InstallKmpWindow def process_kmp(view, url, downloadfile, verbose=False): @@ -67,234 +60,6 @@ def check_mime_type(webview, frame, request, mimetype, policy_decision): return True return False -class InstallKmpWindow(Gtk.Window): - - def __init__(self, kmpfile): - print("kmpfile:", kmpfile) - self.kmpfile = kmpfile - keyboardid = os.path.basename(os.path.splitext(kmpfile)[0]) - installed_kmp_ver = get_kmp_version(keyboardid) - if installed_kmp_ver: - print("installed kmp version", installed_kmp_ver) - - windowtitle = "Installing keyboard/package " + keyboardid - Gtk.Window.__init__(self, title=windowtitle) - - self.set_border_width(3) - - vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=6) - - mainhbox = Gtk.Box() - - with tempfile.TemporaryDirectory() as tmpdirname: - extract_kmp(kmpfile, tmpdirname) - info, system, options, keyboards, files = get_metadata(tmpdirname) - self.kbname = keyboards[0]['name'] - self.checkcontinue = True - - if installed_kmp_ver: - if info['version']['description'] == installed_kmp_ver: - dialog = Gtk.MessageDialog(self, 0, Gtk.MessageType.QUESTION, - Gtk.ButtonsType.YES_NO, "Keyboard is installed already") - dialog.format_secondary_text( - "The " + self.kbname + " keyboard is already installed at version " + installed_kmp_ver + - ". Do you want to uninstall then reinstall it?") - response = dialog.run() - dialog.destroy() - if response == Gtk.ResponseType.YES: - print("QUESTION dialog closed by clicking YES button") - uninstall_kmp(keyboardid) - elif response == Gtk.ResponseType.NO: - print("QUESTION dialog closed by clicking NO button") - self.checkcontinue = False - else: - try: - print("package version", info['version']['description']) - print("installed kmp version", installed_kmp_ver) - if StrictVersion(info['version']['description']) <= StrictVersion(installed_kmp_ver): - dialog = Gtk.MessageDialog(self, 0, Gtk.MessageType.QUESTION, - Gtk.ButtonsType.YES_NO, "Keyboard is installed already") - dialog.format_secondary_text( - "The " + self.kbname + " keyboard is already installed with a newer version " + installed_kmp_ver + - ". Do you want to uninstall it and install the older version" + info['version']['description'] + "?") - response = dialog.run() - dialog.destroy() - if response == Gtk.ResponseType.YES: - print("QUESTION dialog closed by clicking YES button") - uninstall_kmp(keyboardid) - elif response == Gtk.ResponseType.NO: - print("QUESTION dialog closed by clicking NO button") - self.checkcontinue = False - except: - print("exception") - pass - - image = Gtk.Image() - if options and "graphicFile" in options: - image.set_from_file(os.path.join(tmpdirname, options['graphicFile'])) - else: - image.set_from_file("defaultpackage.gif") - - mainhbox.pack_start(image, False, False, 0) - - self.page1 = Gtk.Box() - self.page1.set_border_width(10) - - grid = Gtk.Grid() - self.page1.add(grid) - - label1 = Gtk.Label() - label1.set_text("Keyboard layouts: ") - label1.set_halign(Gtk.Align.END) - grid.add(label1) - prevlabel = label1 - label = Gtk.Label() - keyboardlayout = "" - for kb in keyboards: - if keyboardlayout != "": - keyboardlayout = keyboardlayout + "\n" - keyboardlayout = keyboardlayout + kb['name'] - label.set_text(keyboardlayout) - label.set_halign(Gtk.Align.START) - grid.attach_next_to(label, label1, Gtk.PositionType.RIGHT, 1, 1) - - fonts = get_fonts(files) - if fonts: - label2 = Gtk.Label() - # Fonts are optional - label2.set_text("Fonts: ") - label2.set_halign(Gtk.Align.END) - grid.attach_next_to(label2, prevlabel, Gtk.PositionType.BOTTOM, 1, 1) - prevlabel = label2 - label = Gtk.Label() - fontlist = "" - for font in fonts: - if fontlist != "": - fontlist = fontlist + "\n" - if font['description'][:5] == "Font ": - fontdesc = font['description'][5:] - else: - fontdesc = font['description'] - fontlist = fontlist + fontdesc - label.set_text(fontlist) - label.set_halign(Gtk.Align.START) - grid.attach_next_to(label, label2, Gtk.PositionType.RIGHT, 1, 1) - - label3 = Gtk.Label() - label3.set_text("Package version: ") - label3.set_halign(Gtk.Align.END) - grid.attach_next_to(label3, prevlabel, Gtk.PositionType.BOTTOM, 1, 1) - prevlabel = label3 - label = Gtk.Label() - label.set_text(info['version']['description']) - label.set_halign(Gtk.Align.START) - grid.attach_next_to(label, label3, Gtk.PositionType.RIGHT, 1, 1) - - if info and 'author' in info: - label4 = Gtk.Label() - label4.set_text("Author: ") - label4.set_halign(Gtk.Align.END) - grid.attach_next_to(label4, prevlabel, Gtk.PositionType.BOTTOM, 1, 1) - prevlabel = label4 - label = Gtk.Label() - label.set_text(info['author']['description']) - label.set_halign(Gtk.Align.START) - grid.attach_next_to(label, label4, Gtk.PositionType.RIGHT, 1, 1) - - - if info and 'website' in info: - label5 = Gtk.Label() - # Website is optional and may be a mailto for the author - label5.set_text("Website: ") - label5.set_halign(Gtk.Align.END) - grid.attach_next_to(label5, prevlabel, Gtk.PositionType.BOTTOM, 1, 1) - prevlabel = label5 - label = Gtk.Label() - label.set_text(info['website']['description']) - label.set_halign(Gtk.Align.START) - grid.attach_next_to(label, label5, Gtk.PositionType.RIGHT, 1, 1) - - if info and 'copyright' in info: - label6 = Gtk.Label() - label6.set_text("Copyright: ") - label6.set_halign(Gtk.Align.END) - grid.attach_next_to(label6, prevlabel, Gtk.PositionType.BOTTOM, 1, 1) - label = Gtk.Label() - label.set_text(info['copyright']['description']) - label.set_halign(Gtk.Align.START) - grid.attach_next_to(label, label6, Gtk.PositionType.RIGHT, 1, 1) - - self.page2 = Gtk.Box() - #self.page2.set_border_width(10) - s = Gtk.ScrolledWindow() - webview = WebKit.WebView() - webview.connect("mime-type-policy-decision-requested", check_mime_type) - - if options and "readmeFile" in options: - readme_file = os.path.join(tmpdirname, options['readmeFile']) - else: - readme_file = os.path.join(tmpdirname, "readme.htm") - if os.path.isfile(readme_file): - readme_uri = pathlib.Path(readme_file).as_uri() - webview.load_uri(readme_uri) - s.add(webview) - self.page2.pack_start(s, True, True, 0) - - self.notebook = Gtk.Notebook() - self.notebook.set_tab_pos(Gtk.PositionType.BOTTOM) - mainhbox.pack_start(self.notebook, True, True, 0) - self.notebook.append_page( - self.page1, - Gtk.Label('Details')) - self.notebook.append_page( - self.page2, - Gtk.Label('README') - ) - else: - mainhbox.pack_start(self.page1, True, True, 0) - vbox.pack_start(mainhbox, True, True, 0) - - hbox = Gtk.Box(spacing=6) - #hbox.set_halign(Gtk.Align.FILL) - vbox.pack_start(hbox, False, False, 0) - - button = Gtk.Button.new_with_mnemonic("_Install") - button.connect("clicked", self.on_install_clicked) - hbox.pack_start(button, False, False, 0) - - button = Gtk.Button.new_with_mnemonic("_Cancel") - button.connect("clicked", self.on_cancel_clicked) - hbox.pack_end(button, False, False, 0) - - self.add(vbox) - self.resize(635, 270) - - def on_install_clicked(self, button): - print("Installing keyboard") - install_kmp(self.kmpfile, True) - keyboardid = os.path.basename(os.path.splitext(self.kmpfile)[0]) - welcome_file = os.path.join("/usr/local/share/doc/keyman", keyboardid, "welcome.htm") - if os.path.isfile(welcome_file): - uri_path = pathlib.Path(welcome_file).as_uri() - print(uri_path) - w = WelcomeView(uri_path, self.kbname) - w.resize(800, 600) - w.show_all() - # view.load_uri(uri_path) - else: - dialog = Gtk.MessageDialog(self, 0, Gtk.MessageType.INFO, - Gtk.ButtonsType.OK, "Keyboard " + self.kbname + " installed") - #dialog.format_secondary_text( - # "And this is the secondary text that explains things.") - dialog.run() - print("INFO dialog closed") - dialog.destroy() - self.close() - - def on_cancel_clicked(self, button): - print("Cancel install keyboard") - self.close() - class DownloadKmpWindow(Gtk.Window): def __init__(self): diff --git a/linux/keyman-config/install_window.py b/linux/keyman-config/install_window.py new file mode 100644 index 0000000000..a4fdb5e197 --- /dev/null +++ b/linux/keyman-config/install_window.py @@ -0,0 +1,248 @@ +#!/usr/bin/python3 + +# Install confirmation with details window + +import os.path +import pathlib +import subprocess +import webbrowser +import tempfile +import gi +gi.require_version('Gtk', '3.0') +gi.require_version('WebKit', '3.0') +from gi.repository import Gtk, WebKit +from distutils.version import StrictVersion +from install_kmp import install_kmp, extract_kmp, get_metadata +from list_installed_kmp import get_kmp_version +from kmpmetadata import get_fonts +from welcome import WelcomeView +from uninstall_kmp import uninstall_kmp +from get_kmp import get_download_folder + +class InstallKmpWindow(Gtk.Window): + + def __init__(self, kmpfile): + print("kmpfile:", kmpfile) + self.kmpfile = kmpfile + keyboardid = os.path.basename(os.path.splitext(kmpfile)[0]) + installed_kmp_ver = get_kmp_version(keyboardid) + if installed_kmp_ver: + print("installed kmp version", installed_kmp_ver) + + windowtitle = "Installing keyboard/package " + keyboardid + Gtk.Window.__init__(self, title=windowtitle) + + self.set_border_width(3) + + vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=6) + + mainhbox = Gtk.Box() + + with tempfile.TemporaryDirectory() as tmpdirname: + extract_kmp(kmpfile, tmpdirname) + info, system, options, keyboards, files = get_metadata(tmpdirname) + self.kbname = keyboards[0]['name'] + self.checkcontinue = True + + if installed_kmp_ver: + if info['version']['description'] == installed_kmp_ver: + dialog = Gtk.MessageDialog(self, 0, Gtk.MessageType.QUESTION, + Gtk.ButtonsType.YES_NO, "Keyboard is installed already") + dialog.format_secondary_text( + "The " + self.kbname + " keyboard is already installed at version " + installed_kmp_ver + + ". Do you want to uninstall then reinstall it?") + response = dialog.run() + dialog.destroy() + if response == Gtk.ResponseType.YES: + print("QUESTION dialog closed by clicking YES button") + uninstall_kmp(keyboardid) + elif response == Gtk.ResponseType.NO: + print("QUESTION dialog closed by clicking NO button") + self.checkcontinue = False + else: + try: + print("package version", info['version']['description']) + print("installed kmp version", installed_kmp_ver) + if StrictVersion(info['version']['description']) <= StrictVersion(installed_kmp_ver): + dialog = Gtk.MessageDialog(self, 0, Gtk.MessageType.QUESTION, + Gtk.ButtonsType.YES_NO, "Keyboard is installed already") + dialog.format_secondary_text( + "The " + self.kbname + " keyboard is already installed with a newer version " + installed_kmp_ver + + ". Do you want to uninstall it and install the older version" + info['version']['description'] + "?") + response = dialog.run() + dialog.destroy() + if response == Gtk.ResponseType.YES: + print("QUESTION dialog closed by clicking YES button") + uninstall_kmp(keyboardid) + elif response == Gtk.ResponseType.NO: + print("QUESTION dialog closed by clicking NO button") + self.checkcontinue = False + except: + print("exception") + pass + + image = Gtk.Image() + if options and "graphicFile" in options: + image.set_from_file(os.path.join(tmpdirname, options['graphicFile'])) + else: + image.set_from_file("defaultpackage.gif") + + mainhbox.pack_start(image, False, False, 0) + + self.page1 = Gtk.Box() + self.page1.set_border_width(10) + + grid = Gtk.Grid() + self.page1.add(grid) + + label1 = Gtk.Label() + label1.set_text("Keyboard layouts: ") + label1.set_halign(Gtk.Align.END) + grid.add(label1) + prevlabel = label1 + label = Gtk.Label() + keyboardlayout = "" + for kb in keyboards: + if keyboardlayout != "": + keyboardlayout = keyboardlayout + "\n" + keyboardlayout = keyboardlayout + kb['name'] + label.set_text(keyboardlayout) + label.set_halign(Gtk.Align.START) + grid.attach_next_to(label, label1, Gtk.PositionType.RIGHT, 1, 1) + + fonts = get_fonts(files) + if fonts: + label2 = Gtk.Label() + # Fonts are optional + label2.set_text("Fonts: ") + label2.set_halign(Gtk.Align.END) + grid.attach_next_to(label2, prevlabel, Gtk.PositionType.BOTTOM, 1, 1) + prevlabel = label2 + label = Gtk.Label() + fontlist = "" + for font in fonts: + if fontlist != "": + fontlist = fontlist + "\n" + if font['description'][:5] == "Font ": + fontdesc = font['description'][5:] + else: + fontdesc = font['description'] + fontlist = fontlist + fontdesc + label.set_text(fontlist) + label.set_halign(Gtk.Align.START) + grid.attach_next_to(label, label2, Gtk.PositionType.RIGHT, 1, 1) + + label3 = Gtk.Label() + label3.set_text("Package version: ") + label3.set_halign(Gtk.Align.END) + grid.attach_next_to(label3, prevlabel, Gtk.PositionType.BOTTOM, 1, 1) + prevlabel = label3 + label = Gtk.Label() + label.set_text(info['version']['description']) + label.set_halign(Gtk.Align.START) + grid.attach_next_to(label, label3, Gtk.PositionType.RIGHT, 1, 1) + + if info and 'author' in info: + label4 = Gtk.Label() + label4.set_text("Author: ") + label4.set_halign(Gtk.Align.END) + grid.attach_next_to(label4, prevlabel, Gtk.PositionType.BOTTOM, 1, 1) + prevlabel = label4 + label = Gtk.Label() + label.set_text(info['author']['description']) + label.set_halign(Gtk.Align.START) + grid.attach_next_to(label, label4, Gtk.PositionType.RIGHT, 1, 1) + + + if info and 'website' in info: + label5 = Gtk.Label() + # Website is optional and may be a mailto for the author + label5.set_text("Website: ") + label5.set_halign(Gtk.Align.END) + grid.attach_next_to(label5, prevlabel, Gtk.PositionType.BOTTOM, 1, 1) + prevlabel = label5 + label = Gtk.Label() + label.set_text(info['website']['description']) + label.set_halign(Gtk.Align.START) + grid.attach_next_to(label, label5, Gtk.PositionType.RIGHT, 1, 1) + + if info and 'copyright' in info: + label6 = Gtk.Label() + label6.set_text("Copyright: ") + label6.set_halign(Gtk.Align.END) + grid.attach_next_to(label6, prevlabel, Gtk.PositionType.BOTTOM, 1, 1) + label = Gtk.Label() + label.set_text(info['copyright']['description']) + label.set_halign(Gtk.Align.START) + grid.attach_next_to(label, label6, Gtk.PositionType.RIGHT, 1, 1) + + self.page2 = Gtk.Box() + #self.page2.set_border_width(10) + s = Gtk.ScrolledWindow() + webview = WebKit.WebView() + webview.connect("mime-type-policy-decision-requested", check_mime_type) + + if options and "readmeFile" in options: + readme_file = os.path.join(tmpdirname, options['readmeFile']) + else: + readme_file = os.path.join(tmpdirname, "readme.htm") + if os.path.isfile(readme_file): + readme_uri = pathlib.Path(readme_file).as_uri() + webview.load_uri(readme_uri) + s.add(webview) + self.page2.pack_start(s, True, True, 0) + + self.notebook = Gtk.Notebook() + self.notebook.set_tab_pos(Gtk.PositionType.BOTTOM) + mainhbox.pack_start(self.notebook, True, True, 0) + self.notebook.append_page( + self.page1, + Gtk.Label('Details')) + self.notebook.append_page( + self.page2, + Gtk.Label('README') + ) + else: + mainhbox.pack_start(self.page1, True, True, 0) + vbox.pack_start(mainhbox, True, True, 0) + + hbox = Gtk.Box(spacing=6) + #hbox.set_halign(Gtk.Align.FILL) + vbox.pack_start(hbox, False, False, 0) + + button = Gtk.Button.new_with_mnemonic("_Install") + button.connect("clicked", self.on_install_clicked) + hbox.pack_start(button, False, False, 0) + + button = Gtk.Button.new_with_mnemonic("_Cancel") + button.connect("clicked", self.on_cancel_clicked) + hbox.pack_end(button, False, False, 0) + + self.add(vbox) + self.resize(635, 270) + + def on_install_clicked(self, button): + print("Installing keyboard") + install_kmp(self.kmpfile, True) + keyboardid = os.path.basename(os.path.splitext(self.kmpfile)[0]) + welcome_file = os.path.join("/usr/local/share/doc/keyman", keyboardid, "welcome.htm") + if os.path.isfile(welcome_file): + uri_path = pathlib.Path(welcome_file).as_uri() + print(uri_path) + w = WelcomeView(uri_path, self.kbname) + w.resize(800, 600) + w.show_all() + # view.load_uri(uri_path) + else: + dialog = Gtk.MessageDialog(self, 0, Gtk.MessageType.INFO, + Gtk.ButtonsType.OK, "Keyboard " + self.kbname + " installed") + #dialog.format_secondary_text( + # "And this is the secondary text that explains things.") + dialog.run() + print("INFO dialog closed") + dialog.destroy() + self.close() + + def on_cancel_clicked(self, button): + print("Cancel install keyboard") + self.close() diff --git a/linux/keyman-config/keyboard_details.py b/linux/keyman-config/keyboard_details.py new file mode 100644 index 0000000000..2f6df6637d --- /dev/null +++ b/linux/keyman-config/keyboard_details.py @@ -0,0 +1,16 @@ +#!/usr/bin/python3 + +# Keyboard details window + +import gi +gi.require_version('Gtk', '3.0') +gi.require_version('WebKit', '3.0') +from gi.repository import Gtk, WebKit + +class KeyboardDetailsView(Gtk.Window): + def __init__(self, kmp): + if "keyboard" in kmp["name"].lower(): + wintitle = kmp["name"] + else: + wintitle = kmp["name"] + " keyboard" + Gtk.Window.__init__(self, title=wintitle) \ No newline at end of file diff --git a/linux/keyman-config/view_installed.py b/linux/keyman-config/view_installed.py index eda87e8a01..c61c8eea38 100755 --- a/linux/keyman-config/view_installed.py +++ b/linux/keyman-config/view_installed.py @@ -9,6 +9,7 @@ gi.require_version('WebKit', '3.0') from gi.repository import Gtk, Gdk, WebKit from list_installed_kmp import get_installed_kmp from welcome import WelcomeView +from keyboard_details import KeyboardDetailsView from uninstall_kmp import uninstall_kmp class KeyboardBox(Gtk.Box): @@ -34,6 +35,7 @@ class KeyboardBox(Gtk.Box): self.expandimage = Gtk.Image.new_from_file("expand20.png") self.expandbutton.set_image(self.expandimage) #grid.attach_next_to(expandbutton, helpbutton, Gtk.PositionType.RIGHT, 1, 1) + self.expandbutton.connect("clicked", self.on_expand_clicked) self.pack_end(self.expandbutton, False, False, 0) self.uninstallbutton = Gtk.Button() @@ -77,6 +79,12 @@ class KeyboardBox(Gtk.Box): elif response == Gtk.ResponseType.NO: print("Not uninstalling keyboard", self.kmp["name"]) + def on_expand_clicked(self, button): + print("Show keyboard details of", self.kmp["name"]) + w = KeyboardDetailsView(self.kmp) + w.resize(800, 450) + w.show_all() + class KmpGrid(Gtk.Grid): def __init__(self): Gtk.Grid.__init__(self)