Skip to content
Snippets Groups Projects
selector.py 2.74 KiB
Newer Older
Benoit Favre's avatar
Benoit Favre committed
from gi.repository import GObject, Gtk, Gdk
import os, sys, glob
import config

class ModelSelector(Gtk.Dialog):
    def __init__(self, xml_filename = '', asr_model = ''):
        super(ModelSelector, self).__init__()
        self.add_button("Cancel", Gtk.ResponseType.CANCEL)
        self.add_button("OK", Gtk.ResponseType.OK)
        box = self.get_content_area()

        xml_box = Gtk.HBox()
        xml_box.pack_start(Gtk.Label('XML file:'), False, False, 10)
        xml_entry = Gtk.Entry()
        xml_entry.set_text(xml_filename)
        xml_entry.set_width_chars(len(xml_filename))
        self.xml_entry = xml_entry
        xml_box.pack_start(xml_entry, True, True, 10)
        xml_button = Gtk.Button("Choose...")
        xml_button.connect('clicked', self.show_filechooser)
        xml_box.pack_start(xml_button, False, False, 10)

        box.pack_start(xml_box, False, False, 5)

        model_box = Gtk.HBox()
        model_box.pack_start(Gtk.Label('ASR model:'), False, False, 10)
        model_chooser = Gtk.ComboBoxText()
        model_chooser.set_entry_text_column(0)
        for i, model in enumerate(self.list_models()):
            model_chooser.append_text(model)
        model_chooser.set_active(0)
        self.model_chooser = model_chooser
        model_box.pack_start(model_chooser, True, True, 10)

        box.pack_start(model_box, False, False, 5)
        self.show_all()

    def show_filechooser(self, button):
        dialog = Gtk.FileChooserDialog("Please choose a file", self, Gtk.FileChooserAction.OPEN, (Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL, Gtk.STOCK_OPEN, Gtk.ResponseType.OK))
        filter_text = Gtk.FileFilter()
        filter_text.set_name("XML files")
        filter_text.add_mime_type("text/xml")
        dialog.add_filter(filter_text)
        dialog.set_current_folder('%s/data' % os.path.dirname(__file__))

        response = dialog.run()
        if response == Gtk.ResponseType.OK:
            self.xml_entry.set_text(dialog.get_filename())
        dialog.destroy()

    def list_models(self):
        self.models = []
        model_names = []
        for filename in glob.glob('asr/*.cfg'):
            try:
                items = config.read(filename)
                self.models.append(filename)
                if 'name' in items:
                    model_names.append(items['name'])
                else:
                    model_names.append(filename)
            except:
               pass
        return model_names

    def run(self):
        response = super(ModelSelector, self).run()
        if response != Gtk.ResponseType.OK:
            return None, None
        asr_model = self.models[self.model_chooser.get_active()]
        xml_filename = self.xml_entry.get_text()
        self.destroy()
        return xml_filename, asr_model