def __init__(self, parent, welcomeurl, keyboardname, newlyInstalled=False): self.accelerators = None if newlyInstalled: kbtitle = _("{name} installed").format(name=keyboardname) else: kbtitle = keyboardname self.welcomeurl = welcomeurl Gtk.Dialog.__init__(self, kbtitle, parent) init_accel(self) s = Gtk.ScrolledWindow() self.webview = WebKit2.WebView() self.webview.connect("decide-policy", self.doc_policy) self.webview.load_uri(welcomeurl) s.add(self.webview) self.get_content_area().pack_start(s, True, True, 0) hbox = Gtk.Box(spacing=12) self.get_content_area().pack_start(hbox, False, False, 6) button = Gtk.Button.new_with_mnemonic(_("Open in _Web browser")) button.connect("clicked", self.on_openweb_clicked) button.set_tooltip_text( _("Open in the default web browser to do things like printing")) hbox.pack_start(button, False, False, 12) button = Gtk.Button.new_with_mnemonic(_("_OK")) button.connect("clicked", self.on_ok_clicked) hbox.pack_end(button, False, False, 12) bind_accelerator(self.accelerators, button, '<Control>w') self.resize(800, 600) self.show_all()
def __init__(self, view=None): self.accelerators = None Gtk.Window.__init__(self, title="Download Keyman keyboards") self.endonclose = False self.viewwindow = view init_accel(self) vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL) s = Gtk.ScrolledWindow() webview = WebKit2.WebView() webview.connect("decide-policy", self.keyman_policy) webview.load_uri("https://keyman.com/go/linux/" + __releaseversion__ + "/download-keyboards") s.add(webview) vbox.pack_start(s, True, True, 0) bbox = Gtk.ButtonBox(spacing=12, orientation=Gtk.Orientation.HORIZONTAL) button = Gtk.Button.new_with_mnemonic("_Close") button.connect("clicked", self.on_close_clicked) bbox.pack_end(button, False, False, 12) bind_accelerator(self.accelerators, button, '<Control>w') vbox.pack_start(bbox, False, False, 12) self.add(vbox) self.getinfo = GetInfo(self.viewwindow.incomplete_kmp)
def __init__(self, welcomeurl, keyboardname): self.accelerators = None kbtitle = keyboardname + " installed" self.welcomeurl = welcomeurl Gtk.Window.__init__(self, title=kbtitle) init_accel(self) vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=6) s = Gtk.ScrolledWindow() self.webview = WebKit2.WebView() self.webview.connect("decide-policy", self.doc_policy) self.webview.load_uri(welcomeurl) s.add(self.webview) vbox.pack_start(s, True, True, 0) hbox = Gtk.Box(spacing=12) vbox.pack_start(hbox, False, False, 6) button = Gtk.Button.new_with_mnemonic("Open in _Web browser") button.connect("clicked", self.on_openweb_clicked) button.set_tooltip_text( "Open in the default web browser to do things like printing") hbox.pack_start(button, False, False, 12) button = Gtk.Button.new_with_mnemonic("_OK") button.connect("clicked", self.on_ok_clicked) hbox.pack_end(button, False, False, 12) bind_accelerator(self.accelerators, button, '<Control>w') self.add(vbox)
def __init__(self, view=None): self.accelerators = None Gtk.Window.__init__(self, title="Download Keyman keyboards") self.endonclose = False self.viewwindow = view init_accel(self) vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL) s = Gtk.ScrolledWindow() webview = WebKit2.WebView() webview.connect("decide-policy", self.keyman_policy) webview.load_uri("https://keyman.com/go/linux/"+__majorversion__+"/download-keyboards") s.add(webview) vbox.pack_start(s, True, True, 0) bbox = Gtk.ButtonBox(spacing=12, orientation=Gtk.Orientation.HORIZONTAL) button = Gtk.Button.new_with_mnemonic("_Close") button.connect("clicked", self.on_close_clicked) bbox.pack_end(button, False, False, 12) bind_accelerator(self.accelerators, button, '<Control>w') vbox.pack_start(bbox, False, False, 12) self.add(vbox) self.getinfo = GetInfo(self.viewwindow.incomplete_kmp)
def __init__(self, welcomeurl, keyboardname): self.accelerators = None kbtitle = keyboardname + " installed" self.welcomeurl = welcomeurl Gtk.Window.__init__(self, title=kbtitle) init_accel(self) vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=6) s = Gtk.ScrolledWindow() self.webview = WebKit2.WebView() self.webview.connect("decide-policy", self.doc_policy) self.webview.load_uri(welcomeurl) s.add(self.webview) vbox.pack_start(s, True, True, 0) hbox = Gtk.Box(spacing=12) vbox.pack_start(hbox, False, False, 6) button = Gtk.Button.new_with_mnemonic("Open in _Web browser") button.connect("clicked", self.on_openweb_clicked) button.set_tooltip_text("Open in the default web browser to do things like printing") hbox.pack_start(button, False, False, 12) button = Gtk.Button.new_with_mnemonic("_OK") button.connect("clicked", self.on_ok_clicked) hbox.pack_end(button, False, False, 12) bind_accelerator(self.accelerators, button, '<Control>w') self.add(vbox)
def __init__(self, kmpfile, online=False, viewkmp=None, downloadwindow=None): logging.debug("InstallKmpWindow: kmpfile: %s", kmpfile) self.kmpfile = kmpfile self.online = online self.endonclose = False self.viewwindow = viewkmp self.download = downloadwindow self.accelerators = None keyboardid = os.path.basename(os.path.splitext(kmpfile)[0]) installed_kmp_ver = get_kmp_version(keyboardid) if installed_kmp_ver: logging.info("installed kmp version %s", installed_kmp_ver) windowtitle = "Installing keyboard/package " + keyboardid Gtk.Window.__init__(self, title=windowtitle) init_accel(self) self.set_border_width(12) vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=12) 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: logging.debug("QUESTION dialog closed by clicking YES button") uninstall_kmp(keyboardid) elif response == Gtk.ResponseType.NO: logging.debug("QUESTION dialog closed by clicking NO button") self.checkcontinue = False else: try: logging.info("package version %s", info['version']['description']) logging.info("installed kmp version %s", 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: logging.debug("QUESTION dialog closed by clicking YES button") uninstall_kmp(keyboardid) elif response == Gtk.ResponseType.NO: logging.debug("QUESTION dialog closed by clicking NO button") self.checkcontinue = False except: logging.warning("Exception uninstalling an old kmp, continuing") pass image = Gtk.Image() if options and "graphicFile" in options: image.set_from_file(os.path.join(tmpdirname, options['graphicFile'])) else: img_default = find_keyman_image("defaultpackage.gif") image.set_from_file(img_default) mainhbox.pack_start(image, False, False, 0) self.page1 = Gtk.Box() self.page1.set_border_width(12) 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) label.set_selectable(True) 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) label.set_selectable(True) 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) label.set_selectable(True) 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() if 'url' in info['author']: label.set_markup("<a href=\"" + info['author']['url'] + "\" title=\"" + info['author']['url'] + "\">" + info['author']['description'] + "</a>") else: label.set_text(info['author']['description']) label.set_halign(Gtk.Align.START) label.set_selectable(True) 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_markup("<a href=\"" + info['website']['description'] + "\">" + info['website']['description'] + "</a>") label.set_halign(Gtk.Align.START) label.set_selectable(True) 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) label.set_selectable(True) grid.attach_next_to(label, label6, Gtk.PositionType.RIGHT, 1, 1) self.page2 = Gtk.Box() webview = WebKit2.WebView() webview.connect("decide-policy", self.doc_policy) if options and "readmeFile" in options: self.readme = options['readmeFile'] else: self.readme = "noreadme" readme_file = os.path.join(tmpdirname, self.readme) if os.path.isfile(readme_file): with open(readme_file, "r") as read_file: readme_data = read_file.read() readme_uri = pathlib.Path(readme_file).as_uri() logging.debug(readme_data) webview.load_html(readme_data, readme_uri) s = Gtk.ScrolledWindow() 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) 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) bind_accelerator(self.accelerators, button, '<Control>w') self.add(vbox) self.resize(635, 270)
def __init__(self): ViewInstalledWindowBase.__init__(self) # window is split left/right hbox # right is ButtonBox # possibly 2 ButtonBox in a vbox # top one with _Remove, _About, ?_Welcome? or ?Read_Me?, _Options # bottom one with _Download, _Install, Re_fresh, _Close # left is GtkTreeView - does it need to be inside anything else apart from the hbox? # with liststore which defines columns # GdkPixbuf icon # gchararray name # gchararray version # gchararray packageID (hidden) # enum? area (user, shared, system) (icon or hidden?) # gchararray welcomefile (hidden) (or just use area and packageID?) # changing selected item in treeview changes what buttons are activated # on selected_item_changed signal set the data that the buttons will use in their callbacks # see https://developer.gnome.org/gtk3/stable/TreeWidget.html#TreeWidget hbox = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL) s = Gtk.ScrolledWindow() hbox.pack_start(s, True, True, 0) self.store = Gtk.ListStore( GdkPixbuf.Pixbuf, #icon str, # name str, # version str, # packageID int, # enum InstallArea (KmpArea is GObject version) str, # path to welcome file if it exists or None str) # path to options file if it exists or None # add installed keyboards to the the store e.g. # treeiter = store.append([GdkPixbuf.Pixbuf.new_from_file_at_size("/usr/local/share/keyman/libtralo/libtralo.ico.png", 16, 16), \ # "LIBTRALO", "1.6.1", \ # "libtralo", KmpArea.SHARED, True]) self.refresh_installed_kmp() self.tree = Gtk.TreeView(self.store) renderer = Gtk.CellRendererPixbuf() column = Gtk.TreeViewColumn("Icon", renderer, pixbuf=0) self.tree.append_column(column) renderer = Gtk.CellRendererText() column = Gtk.TreeViewColumn("Name", renderer, text=1) self.tree.append_column(column) column = Gtk.TreeViewColumn("Version", renderer, text=2) self.tree.append_column(column) select = self.tree.get_selection() select.connect("changed", self.on_tree_selection_changed) s.add(self.tree) vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=12) bbox_top = Gtk.ButtonBox(spacing=12, orientation=Gtk.Orientation.VERTICAL) bbox_top.set_layout(Gtk.ButtonBoxStyle.START) self.uninstall_button = Gtk.Button.new_with_mnemonic("_Uninstall") self.uninstall_button.set_tooltip_text("Uninstall keyboard package") self.uninstall_button.connect("clicked", self.on_uninstall_clicked) bbox_top.add(self.uninstall_button) self.about_button = Gtk.Button.new_with_mnemonic("_About") self.about_button.set_tooltip_text("About keyboard package") self.about_button.connect("clicked", self.on_about_clicked) bbox_top.add(self.about_button) self.help_button = Gtk.Button.new_with_mnemonic("_Help") self.help_button.set_tooltip_text("Help for keyboard package") self.help_button.connect("clicked", self.on_help_clicked) bbox_top.add(self.help_button) self.options_button = Gtk.Button.new_with_mnemonic("_Options") self.options_button.set_tooltip_text("Settings for keyboard") self.options_button.connect("clicked", self.on_options_clicked) self.options_button.set_sensitive(False) bbox_top.add(self.options_button) vbox.pack_start(bbox_top, False, False, 12) bbox_bottom = Gtk.ButtonBox(spacing=12, orientation=Gtk.Orientation.VERTICAL) bbox_bottom.set_layout(Gtk.ButtonBoxStyle.END) button = Gtk.Button.new_with_mnemonic("_Refresh") button.set_tooltip_text("Refresh keyboard package list") button.connect("clicked", self.on_refresh_clicked) bbox_bottom.add(button) button = Gtk.Button.new_with_mnemonic("_Download") button.set_tooltip_text( "Download and install a keyboard package from the Keyman website") button.connect("clicked", self.on_download_clicked) bbox_bottom.add(button) button = Gtk.Button.new_with_mnemonic("_Install") button.set_tooltip_text("Install a keyboard package from a file") button.connect("clicked", self.on_installfile_clicked) bbox_bottom.add(button) button = Gtk.Button.new_with_mnemonic("_Close") button.set_tooltip_text("Close window") button.connect("clicked", self.on_close_clicked) bind_accelerator(self.accelerators, button, '<Control>q') bind_accelerator(self.accelerators, button, '<Control>w') bbox_bottom.add(button) vbox.pack_end(bbox_bottom, False, False, 12) hbox.pack_start(vbox, False, False, 12) self.add(hbox)
def __init__(self): ViewInstalledWindowBase.__init__(self) # window is split left/right hbox # right is ButtonBox # possibly 2 ButtonBox in a vbox # top one with _Remove, _About, ?_Welcome? or ?Read_Me? # bottom one with _Download, _Install, Re_fresh, _Close # left is GtkTreeView - does it need to be inside anything else apart from the hbox? # with liststore which defines columns # GdkPixbuf icon # gchararray name # gchararray version # gchararray packageID (hidden) # enum? area (user, shared, system) (icon or hidden?) # gchararray welcomefile (hidden) (or just use area and packageID?) # changing selected item in treeview changes what buttons are activated # on selected_item_changed signal set the data that the buttons will use in their callbacks # see https://developer.gnome.org/gtk3/stable/TreeWidget.html#TreeWidget hbox = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL) s = Gtk.ScrolledWindow() hbox.pack_start(s, True, True, 0) self.store = Gtk.ListStore(GdkPixbuf.Pixbuf, #icon str, # name str, # version str, # packageID int, # enum InstallArea (KmpArea is GObject version) str) # path to welcome file if it exists or None # add installed keyboards to the the store e.g. # treeiter = store.append([GdkPixbuf.Pixbuf.new_from_file_at_size("/usr/local/share/keyman/libtralo/libtralo.ico.png", 16, 16), \ # "LIBTRALO", "1.6.1", \ # "libtralo", KmpArea.SHARED, True]) self.refresh_installed_kmp() self.tree = Gtk.TreeView(self.store) renderer = Gtk.CellRendererPixbuf() column = Gtk.TreeViewColumn("Icon", renderer, pixbuf=0) self.tree.append_column(column) renderer = Gtk.CellRendererText() column = Gtk.TreeViewColumn("Name", renderer, text=1) self.tree.append_column(column) column = Gtk.TreeViewColumn("Version", renderer, text=2) self.tree.append_column(column) select = self.tree.get_selection() select.connect("changed", self.on_tree_selection_changed) s.add(self.tree) vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=12) bbox_top = Gtk.ButtonBox(spacing=12, orientation=Gtk.Orientation.VERTICAL) bbox_top.set_layout(Gtk.ButtonBoxStyle.START) self.uninstall_button = Gtk.Button.new_with_mnemonic("_Uninstall") self.uninstall_button.set_tooltip_text("Uninstall keyboard package") self.uninstall_button.connect("clicked", self.on_uninstall_clicked) bbox_top.add(self.uninstall_button) self.about_button = Gtk.Button.new_with_mnemonic("_About") self.about_button.set_tooltip_text("About keyboard package") self.about_button.connect("clicked", self.on_about_clicked) bbox_top.add(self.about_button) self.help_button = Gtk.Button.new_with_mnemonic("_Help") self.help_button.set_tooltip_text("Help for keyboard package") self.help_button.connect("clicked", self.on_help_clicked) bbox_top.add(self.help_button) vbox.pack_start(bbox_top, False, False, 12) bbox_bottom = Gtk.ButtonBox(spacing=12, orientation=Gtk.Orientation.VERTICAL) bbox_bottom.set_layout(Gtk.ButtonBoxStyle.END) button = Gtk.Button.new_with_mnemonic("_Refresh") button.set_tooltip_text("Refresh keyboard package list") button.connect("clicked", self.on_refresh_clicked) bbox_bottom.add(button) button = Gtk.Button.new_with_mnemonic("_Download") button.set_tooltip_text("Download and install a keyboard package from the Keyman website") button.connect("clicked", self.on_download_clicked) bbox_bottom.add(button) button = Gtk.Button.new_with_mnemonic("_Install") button.set_tooltip_text("Install a keyboard package from a file") button.connect("clicked", self.on_installfile_clicked) bbox_bottom.add(button) button = Gtk.Button.new_with_mnemonic("_Close") button.set_tooltip_text("Close window") button.connect("clicked", self.on_close_clicked) bind_accelerator(self.accelerators, button, '<Control>q') bind_accelerator(self.accelerators, button, '<Control>w') bbox_bottom.add(button) vbox.pack_end(bbox_bottom, False, False, 12) hbox.pack_start(vbox, False, False, 12) self.add(hbox)
def __init__(self, kmp): #kmp has name, version, packageID, area if "keyboard" in kmp["name"].lower(): wintitle = kmp["name"] else: wintitle = kmp["name"] + " keyboard" Gtk.Window.__init__(self, title=wintitle) init_accel(self) vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=12) packageDir = os.path.join(kmp['areapath'], kmp['packageID']) kmp_json = os.path.join(packageDir, "kmp.json") info, system, options, keyboards, files = parsemetadata(kmp_json) if (info == None): raise Exception("could not parse kmp.json", kmp['packageID'], packageDir, kmp_json) kbdata = None jsonfile = os.path.join(packageDir, kmp['packageID'] + ".json") if os.path.isfile(jsonfile): with open(jsonfile, "r") as read_file: kbdata = json.load(read_file) box = Gtk.Box(spacing=10) #self.add(box) grid = Gtk.Grid() #grid.set_column_homogeneous(True) box.add(grid) #self.add(grid) # kbdatapath = os.path.join("/usr/local/share/keyman", kmp["id"], kmp["id"] + ".json") # Package info lbl_pkg_name = Gtk.Label() lbl_pkg_name.set_text("Package name: ") lbl_pkg_name.set_halign(Gtk.Align.END) grid.add(lbl_pkg_name) prevlabel = lbl_pkg_name label = Gtk.Label() label.set_text(info['name']['description']) label.set_halign(Gtk.Align.START) label.set_selectable(True) grid.attach_next_to(label, lbl_pkg_name, Gtk.PositionType.RIGHT, 1, 1) lbl_pkg_id = Gtk.Label() lbl_pkg_id.set_text("Package id: ") lbl_pkg_id.set_halign(Gtk.Align.END) grid.attach_next_to(lbl_pkg_id, prevlabel, Gtk.PositionType.BOTTOM, 1, 1) prevlabel = lbl_pkg_id label = Gtk.Label() label.set_text(kmp['packageID']) label.set_halign(Gtk.Align.START) label.set_selectable(True) grid.attach_next_to(label, lbl_pkg_id, Gtk.PositionType.RIGHT, 1, 1) lbl_pkg_vrs = Gtk.Label() lbl_pkg_vrs.set_text("Package version: ") lbl_pkg_vrs.set_halign(Gtk.Align.END) grid.attach_next_to(lbl_pkg_vrs, prevlabel, Gtk.PositionType.BOTTOM, 1, 1) prevlabel = lbl_pkg_vrs label = Gtk.Label() label.set_text(info['version']['description']) label.set_halign(Gtk.Align.START) label.set_selectable(True) grid.attach_next_to(label, lbl_pkg_vrs, Gtk.PositionType.RIGHT, 1, 1) if kbdata: lbl_pkg_desc = Gtk.Label() lbl_pkg_desc.set_text("Package description: ") lbl_pkg_desc.set_halign(Gtk.Align.END) grid.attach_next_to(lbl_pkg_desc, prevlabel, Gtk.PositionType.BOTTOM, 1, 1) prevlabel = lbl_pkg_desc label = Gtk.Label() label.set_text(kbdata['description']) label.set_halign(Gtk.Align.START) label.set_selectable(True) label.set_line_wrap(80) grid.attach_next_to(label, lbl_pkg_desc, Gtk.PositionType.RIGHT, 1, 1) if "author" in info: lbl_pkg_auth = Gtk.Label() lbl_pkg_auth.set_text("Package author: ") lbl_pkg_auth.set_halign(Gtk.Align.END) grid.attach_next_to(lbl_pkg_auth, prevlabel, Gtk.PositionType.BOTTOM, 1, 1) prevlabel = lbl_pkg_auth label = Gtk.Label() label.set_text(info['author']['description']) label.set_halign(Gtk.Align.START) label.set_selectable(True) grid.attach_next_to(label, lbl_pkg_auth, Gtk.PositionType.RIGHT, 1, 1) if "copyright" in info: lbl_pkg_cpy = Gtk.Label() lbl_pkg_cpy.set_text("Package copyright: ") lbl_pkg_cpy.set_halign(Gtk.Align.END) grid.attach_next_to(lbl_pkg_cpy, prevlabel, Gtk.PositionType.BOTTOM, 1, 1) prevlabel = lbl_pkg_cpy label = Gtk.Label() label.set_text(info['copyright']['description']) label.set_halign(Gtk.Align.START) label.set_selectable(True) grid.attach_next_to(label, lbl_pkg_cpy, Gtk.PositionType.RIGHT, 1, 1) # Padding and full width horizontal divider lbl_pad = Gtk.Label() lbl_pad.set_text("") lbl_pad.set_halign(Gtk.Align.END) grid.attach_next_to(lbl_pad, prevlabel, Gtk.PositionType.BOTTOM, 2, 1) prevlabel = lbl_pad divider_pkg = Gtk.HSeparator() grid.attach_next_to(divider_pkg, prevlabel, Gtk.PositionType.BOTTOM, 2, 1) # Keyboard info for each keyboard if keyboards: for kbd in keyboards: kbdata = None jsonfile = os.path.join(packageDir, kbd['id'] + ".json") if os.path.isfile(jsonfile): with open(jsonfile, "r") as read_file: kbdata = json.load(read_file) # show the icon somewhere lbl_kbd_file = Gtk.Label() lbl_kbd_file.set_text("Keyboard filename: ") lbl_kbd_file.set_halign(Gtk.Align.END) grid.attach_next_to(lbl_kbd_file, prevlabel, Gtk.PositionType.BOTTOM, 1, 1) prevlabel = lbl_kbd_file label = Gtk.Label() label.set_text(os.path.join(packageDir, kbd['id'] + ".kmx")) label.set_halign(Gtk.Align.START) label.set_selectable(True) grid.attach_next_to(label, lbl_kbd_file, Gtk.PositionType.RIGHT, 1, 1) if kbdata: if kbdata['id'] != kmp['packageID']: lbl_kbd_name = Gtk.Label() lbl_kbd_name.set_text("Keyboard name: ") lbl_kbd_name.set_halign(Gtk.Align.END) grid.attach_next_to(lbl_kbd_name, prevlabel, Gtk.PositionType.BOTTOM, 1, 1) prevlabel = lbl_kbd_name label = Gtk.Label() label.set_text(kbdata['name']) label.set_halign(Gtk.Align.START) label.set_selectable(True) grid.attach_next_to(label, lbl_kbd_name, Gtk.PositionType.RIGHT, 1, 1) lbl_kbd_id = Gtk.Label() lbl_kbd_id.set_text("Keyboard id: ") lbl_kbd_id.set_halign(Gtk.Align.END) grid.attach_next_to(lbl_kbd_id, prevlabel, Gtk.PositionType.BOTTOM, 1, 1) prevlabel = lbl_kbd_id label = Gtk.Label() label.set_text(kbdata['id']) label.set_halign(Gtk.Align.START) label.set_selectable(True) grid.attach_next_to(label, lbl_kbd_id, Gtk.PositionType.RIGHT, 1, 1) lbl_kbd_vrs = Gtk.Label() lbl_kbd_vrs.set_text("Keyboard version: ") lbl_kbd_vrs.set_halign(Gtk.Align.END) grid.attach_next_to(lbl_kbd_vrs, prevlabel, Gtk.PositionType.BOTTOM, 1, 1) prevlabel = lbl_kbd_vrs label = Gtk.Label() label.set_text(kbdata['version']) label.set_halign(Gtk.Align.START) label.set_selectable(True) grid.attach_next_to(label, lbl_kbd_vrs, Gtk.PositionType.RIGHT, 1, 1) if "author" in info: lbl_kbd_auth = Gtk.Label() lbl_kbd_auth.set_text("Keyboard author: ") lbl_kbd_auth.set_halign(Gtk.Align.END) grid.attach_next_to(lbl_kbd_auth, prevlabel, Gtk.PositionType.BOTTOM, 1, 1) prevlabel = lbl_kbd_auth label = Gtk.Label() label.set_text(kbdata['authorName']) label.set_halign(Gtk.Align.START) label.set_selectable(True) grid.attach_next_to(label, lbl_kbd_auth, Gtk.PositionType.RIGHT, 1, 1) lbl_kbd_lic = Gtk.Label() lbl_kbd_lic.set_text("Keyboard license: ") lbl_kbd_lic.set_halign(Gtk.Align.END) grid.attach_next_to(lbl_kbd_lic, prevlabel, Gtk.PositionType.BOTTOM, 1, 1) prevlabel = lbl_kbd_lic label = Gtk.Label() label.set_text(kbdata['license']) label.set_halign(Gtk.Align.START) label.set_selectable(True) grid.attach_next_to(label, lbl_kbd_lic, Gtk.PositionType.RIGHT, 1, 1) lbl_kbd_desc = Gtk.Label() lbl_kbd_desc.set_text("Keyboard description: ") lbl_kbd_desc.set_halign(Gtk.Align.END) grid.attach_next_to(lbl_kbd_desc, prevlabel, Gtk.PositionType.BOTTOM, 1, 1) prevlabel = lbl_kbd_desc label = Gtk.Label() label.set_text(kbdata['description']) label.set_halign(Gtk.Align.START) label.set_selectable(True) label.set_line_wrap(80) grid.attach_next_to(label, lbl_kbd_desc, Gtk.PositionType.RIGHT, 1, 1) # Padding and full width horizontal divider lbl_pad = Gtk.Label() lbl_pad.set_text("") lbl_pad.set_halign(Gtk.Align.END) grid.attach_next_to(lbl_pad, prevlabel, Gtk.PositionType.BOTTOM, 2, 1) prevlabel = lbl_pad divider_pkg = Gtk.HSeparator() grid.attach_next_to(divider_pkg, prevlabel, Gtk.PositionType.BOTTOM, 2, 1) # label7 = Gtk.Label() # label7.set_text("On Screen Keyboard: ") # label7.set_halign(Gtk.Align.END) # grid.attach_next_to(label7, prevlabel, Gtk.PositionType.BOTTOM, 1, 1) # prevlabel = label7 # # label = Gtk.Label() # # label.set_text(info['version']['description']) # # label.set_halign(Gtk.Align.START) # # label.set_selectable(True) # # grid.attach_next_to(label, label7, Gtk.PositionType.RIGHT, 1, 1) # label8 = Gtk.Label() # label8.set_text("Documentation: ") # label8.set_halign(Gtk.Align.END) # grid.attach_next_to(label8, prevlabel, Gtk.PositionType.BOTTOM, 1, 1) # prevlabel = label8 # #TODO need to know which area keyboard is installed in to show this # # label = Gtk.Label() # # welcome_file = os.path.join("/usr/local/share/doc/keyman", kmp["id"], "welcome.htm") # # if os.path.isfile(welcome_file): # # label.set_text("Installed") # # else: # # label.set_text("Not installed") # # label.set_halign(Gtk.Align.START) # # label.set_selectable(True) # # grid.attach_next_to(label, label8, Gtk.PositionType.RIGHT, 1, 1) # label9 = Gtk.Label() # # stored in kmx # label9.set_text("Message: ") # label9.set_halign(Gtk.Align.END) # grid.attach_next_to(label9, prevlabel, Gtk.PositionType.BOTTOM, 1, 1) # prevlabel = label9 # label = Gtk.Label() # label.set_line_wrap(True) # label.set_text("This keyboard is distributed under the MIT license (MIT) as described somewhere") # #label.set_text(kmp["description"]) # label.set_halign(Gtk.Align.START) # label.set_selectable(True) # grid.attach_next_to(label, label9, Gtk.PositionType.RIGHT, 1, 1) vbox.pack_start(box, True, True, 0) hbox = Gtk.Box(spacing=6) vbox.pack_start(hbox, False, False, 0) # Add an entire row of padding lbl_pad = Gtk.Label() lbl_pad.set_text("") lbl_pad.set_halign(Gtk.Align.END) grid.attach_next_to(lbl_pad, prevlabel, Gtk.PositionType.BOTTOM, 2, 1) prevlabel = lbl_pad # If it doesn't exist, generate QR code to share keyboard package path_qr = packageDir + "/qrcode.png" if not os.path.isfile(path_qr): qr = qrcode.QRCode( version=1, error_correction=qrcode.constants.ERROR_CORRECT_H, box_size=4, border=4) url = "https://keyman.com/go/keyboard/" + kmp[ 'packageID'] + "/share" qr.add_data(url) qr.make(fit=True) img = qr.make_image() img.save(path_qr) # Display QR Code, spanning 2 columns so it will be centered image = Gtk.Image() image.set_from_file(path_qr) grid.attach_next_to(image, prevlabel, Gtk.PositionType.BOTTOM, 2, 1) lbl_share_kbd = Gtk.Label() lbl_share_kbd.set_text("Scan this code to load this keyboard\n" "on another device or share online") lbl_share_kbd.set_halign(Gtk.Align.CENTER) lbl_share_kbd.set_line_wrap(True) grid.attach_next_to(lbl_share_kbd, image, Gtk.PositionType.BOTTOM, 2, 1) prevlabel = lbl_share_kbd button = Gtk.Button.new_with_mnemonic("_Close") button.set_tooltip_text("Close window") button.connect("clicked", self.on_close_clicked) hbox.pack_end(button, False, False, 0) bind_accelerator(self.accelerators, button, '<Control>w') self.add(vbox) self.resize(635, 270)
def __init__(self, kmp): #kmp has name, version, packageID, area if "keyboard" in kmp["name"].lower(): wintitle = kmp["name"] else: wintitle = kmp["name"] + " keyboard" Gtk.Window.__init__(self, title=wintitle) init_accel(self) vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=12) packageDir = os.path.join(kmp['areapath'], kmp['packageID']) kmp_json = os.path.join(packageDir, "kmp.json") info, system, options, keyboards, files = parsemetadata(kmp_json) if (info == None): raise Exception("could not parse kmp.json", kmp['packageID'], packageDir, kmp_json) kbdata = None jsonfile = os.path.join(packageDir, kmp['packageID'] + ".json") if os.path.isfile(jsonfile): with open(jsonfile, "r") as read_file: kbdata = json.load(read_file) box = Gtk.Box(spacing=10) #self.add(box) grid = Gtk.Grid() #grid.set_column_homogeneous(True) box.add(grid) #self.add(grid) # kbdatapath = os.path.join("/usr/local/share/keyman", kmp["id"], kmp["id"] + ".json") # Package info lbl_pkg_name = Gtk.Label() lbl_pkg_name.set_text("Package name: ") lbl_pkg_name.set_halign(Gtk.Align.END) grid.add(lbl_pkg_name) prevlabel = lbl_pkg_name label = Gtk.Label() label.set_text(info['name']['description']) label.set_halign(Gtk.Align.START) label.set_selectable(True) grid.attach_next_to(label, lbl_pkg_name, Gtk.PositionType.RIGHT, 1, 1) lbl_pkg_id = Gtk.Label() lbl_pkg_id.set_text("Package id: ") lbl_pkg_id.set_halign(Gtk.Align.END) grid.attach_next_to(lbl_pkg_id, prevlabel, Gtk.PositionType.BOTTOM, 1, 1) prevlabel = lbl_pkg_id label = Gtk.Label() label.set_text(kmp['packageID']) label.set_halign(Gtk.Align.START) label.set_selectable(True) grid.attach_next_to(label, lbl_pkg_id, Gtk.PositionType.RIGHT, 1, 1) lbl_pkg_vrs = Gtk.Label() lbl_pkg_vrs.set_text("Package version: ") lbl_pkg_vrs.set_halign(Gtk.Align.END) grid.attach_next_to(lbl_pkg_vrs, prevlabel, Gtk.PositionType.BOTTOM, 1, 1) prevlabel = lbl_pkg_vrs label = Gtk.Label() label.set_text(info['version']['description']) label.set_halign(Gtk.Align.START) label.set_selectable(True) grid.attach_next_to(label, lbl_pkg_vrs, Gtk.PositionType.RIGHT, 1, 1) if kbdata: lbl_pkg_desc = Gtk.Label() lbl_pkg_desc.set_text("Package description: ") lbl_pkg_desc.set_halign(Gtk.Align.END) grid.attach_next_to(lbl_pkg_desc, prevlabel, Gtk.PositionType.BOTTOM, 1, 1) prevlabel = lbl_pkg_desc label = Gtk.Label() label.set_text(kbdata['description']) label.set_halign(Gtk.Align.START) label.set_selectable(True) label.set_line_wrap(80) grid.attach_next_to(label, lbl_pkg_desc, Gtk.PositionType.RIGHT, 1, 1) if "author" in info: lbl_pkg_auth = Gtk.Label() lbl_pkg_auth.set_text("Package author: ") lbl_pkg_auth.set_halign(Gtk.Align.END) grid.attach_next_to(lbl_pkg_auth, prevlabel, Gtk.PositionType.BOTTOM, 1, 1) prevlabel = lbl_pkg_auth label = Gtk.Label() label.set_text(info['author']['description']) label.set_halign(Gtk.Align.START) label.set_selectable(True) grid.attach_next_to(label, lbl_pkg_auth, Gtk.PositionType.RIGHT, 1, 1) lbl_pkg_cpy = Gtk.Label() lbl_pkg_cpy.set_text("Package copyright: ") lbl_pkg_cpy.set_halign(Gtk.Align.END) grid.attach_next_to(lbl_pkg_cpy, prevlabel, Gtk.PositionType.BOTTOM, 1, 1) prevlabel = lbl_pkg_cpy label = Gtk.Label() label.set_text(info['copyright']['description']) label.set_halign(Gtk.Align.START) label.set_selectable(True) grid.attach_next_to(label, lbl_pkg_cpy, Gtk.PositionType.RIGHT, 1, 1) # Keyboard info for each keyboard if keyboards: for kbd in keyboards: kbdata = None jsonfile = os.path.join(packageDir, kbd['id'] + ".json") if os.path.isfile(jsonfile): with open(jsonfile, "r") as read_file: kbdata = json.load(read_file) # show the icon somewhere lbl_kbd_file = Gtk.Label() lbl_kbd_file.set_text("Keyboard filename: ") lbl_kbd_file.set_halign(Gtk.Align.END) grid.attach_next_to(lbl_kbd_file, prevlabel, Gtk.PositionType.BOTTOM, 1, 1) prevlabel = lbl_kbd_file label = Gtk.Label() label.set_text(os.path.join(packageDir, kbd['id'] + ".kmx")) label.set_halign(Gtk.Align.START) label.set_selectable(True) grid.attach_next_to(label, lbl_kbd_file, Gtk.PositionType.RIGHT, 1, 1) if kbdata: if kbdata['id'] != kmp['packageID']: lbl_kbd_name = Gtk.Label() lbl_kbd_name.set_text("Keyboard name: ") lbl_kbd_name.set_halign(Gtk.Align.END) grid.attach_next_to(lbl_kbd_name, prevlabel, Gtk.PositionType.BOTTOM, 1, 1) prevlabel = lbl_kbd_name label = Gtk.Label() label.set_text(kbdata['name']) label.set_halign(Gtk.Align.START) label.set_selectable(True) grid.attach_next_to(label, lbl_kbd_name, Gtk.PositionType.RIGHT, 1, 1) lbl_kbd_id = Gtk.Label() lbl_kbd_id.set_text("Keyboard id: ") lbl_kbd_id.set_halign(Gtk.Align.END) grid.attach_next_to(lbl_kbd_id, prevlabel, Gtk.PositionType.BOTTOM, 1, 1) prevlabel = lbl_kbd_id label = Gtk.Label() label.set_text(kbdata['id']) label.set_halign(Gtk.Align.START) label.set_selectable(True) grid.attach_next_to(label, lbl_kbd_id, Gtk.PositionType.RIGHT, 1, 1) lbl_kbd_vrs = Gtk.Label() lbl_kbd_vrs.set_text("Keyboard version: ") lbl_kbd_vrs.set_halign(Gtk.Align.END) grid.attach_next_to(lbl_kbd_vrs, prevlabel, Gtk.PositionType.BOTTOM, 1, 1) prevlabel = lbl_kbd_vrs label = Gtk.Label() label.set_text(kbdata['version']) label.set_halign(Gtk.Align.START) label.set_selectable(True) grid.attach_next_to(label, lbl_kbd_vrs, Gtk.PositionType.RIGHT, 1, 1) if "author" in info: lbl_kbd_auth = Gtk.Label() lbl_kbd_auth.set_text("Keyboard author: ") lbl_kbd_auth.set_halign(Gtk.Align.END) grid.attach_next_to(lbl_kbd_auth, prevlabel, Gtk.PositionType.BOTTOM, 1, 1) prevlabel = lbl_kbd_auth label = Gtk.Label() label.set_text(kbdata['authorName']) label.set_halign(Gtk.Align.START) label.set_selectable(True) grid.attach_next_to(label, lbl_kbd_auth, Gtk.PositionType.RIGHT, 1, 1) lbl_kbd_lic = Gtk.Label() lbl_kbd_lic.set_text("Keyboard license: ") lbl_kbd_lic.set_halign(Gtk.Align.END) grid.attach_next_to(lbl_kbd_lic, prevlabel, Gtk.PositionType.BOTTOM, 1, 1) prevlabel = lbl_kbd_lic label = Gtk.Label() label.set_text(kbdata['license']) label.set_halign(Gtk.Align.START) label.set_selectable(True) grid.attach_next_to(label, lbl_kbd_lic, Gtk.PositionType.RIGHT, 1, 1) lbl_kbd_desc = Gtk.Label() lbl_kbd_desc.set_text("Keyboard description: ") lbl_kbd_desc.set_halign(Gtk.Align.END) grid.attach_next_to(lbl_kbd_desc, prevlabel, Gtk.PositionType.BOTTOM, 1, 1) prevlabel = lbl_kbd_desc label = Gtk.Label() label.set_text(kbdata['description']) label.set_halign(Gtk.Align.START) label.set_selectable(True) label.set_line_wrap(80) grid.attach_next_to(label, lbl_kbd_desc, Gtk.PositionType.RIGHT, 1, 1) # label7 = Gtk.Label() # label7.set_text("On Screen Keyboard: ") # label7.set_halign(Gtk.Align.END) # grid.attach_next_to(label7, prevlabel, Gtk.PositionType.BOTTOM, 1, 1) # prevlabel = label7 # # label = Gtk.Label() # # label.set_text(info['version']['description']) # # label.set_halign(Gtk.Align.START) # # label.set_selectable(True) # # grid.attach_next_to(label, label7, Gtk.PositionType.RIGHT, 1, 1) # label8 = Gtk.Label() # label8.set_text("Documentation: ") # label8.set_halign(Gtk.Align.END) # grid.attach_next_to(label8, prevlabel, Gtk.PositionType.BOTTOM, 1, 1) # prevlabel = label8 # #TODO need to know which area keyboard is installed in to show this # # label = Gtk.Label() # # welcome_file = os.path.join("/usr/local/share/doc/keyman", kmp["id"], "welcome.htm") # # if os.path.isfile(welcome_file): # # label.set_text("Installed") # # else: # # label.set_text("Not installed") # # label.set_halign(Gtk.Align.START) # # label.set_selectable(True) # # grid.attach_next_to(label, label8, Gtk.PositionType.RIGHT, 1, 1) # label9 = Gtk.Label() # # stored in kmx # label9.set_text("Message: ") # label9.set_halign(Gtk.Align.END) # grid.attach_next_to(label9, prevlabel, Gtk.PositionType.BOTTOM, 1, 1) # prevlabel = label9 # label = Gtk.Label() # label.set_line_wrap(True) # label.set_text("This keyboard is distributed under the MIT license (MIT) as described somewhere") # #label.set_text(kmp["description"]) # label.set_halign(Gtk.Align.START) # label.set_selectable(True) # grid.attach_next_to(label, label9, Gtk.PositionType.RIGHT, 1, 1) vbox.pack_start(box, True, True, 0) hbox = Gtk.Box(spacing=6) vbox.pack_start(hbox, False, False, 0) button = Gtk.Button.new_with_mnemonic("_Close") button.set_tooltip_text("Close window") button.connect("clicked", self.on_close_clicked) hbox.pack_end(button, False, False, 0) bind_accelerator(self.accelerators, button, '<Control>w') self.add(vbox) self.resize(635, 270)