Exemple #1
0
    def __init__(self, mapping, system_mapping=False):
        self.mapping = mapping

        self.builder = gtk.Builder()
        if not self.builder.add_objects_from_file(MAPPING_UI, ["mapping_editor_dlg"]):  # , 'mapping_buffer']):
            raise "Cant load %s" % MAPPING_UI
        self.builder.connect_signals(self)

        self.mapping_editor_dlg = self.builder.get_object("mapping_editor_dlg")
        self.name_entry = self.builder.get_object("name_entry")
        self.comment_entry = self.builder.get_object("comment_entry")
        self.version_entry = self.builder.get_object("version_entry")
        self.authors_entry = self.builder.get_object("authors_entry")
        self.scrolledwindow2 = self.builder.get_object("scrolledwindow2")
        self.icon_image = self.builder.get_object("icon_image")
        self.execute_btn = self.builder.get_object("execute_btn")

        lm = gtksourceview2.LanguageManager()
        self.mapping_buffer = gtksourceview2.Buffer()
        self.mapping_buffer.set_data("languages-manager", lm)
        view = gtksourceview2.View(self.mapping_buffer)
        view.set_show_line_numbers(True)
        view.set_auto_indent(True)

        self.scrolledwindow2.add(view)
        self.scrolledwindow2.show_all()

        if system_mapping:
            self.warning_box = self.builder.get_object("warning_box")
            self.warning_frame = self.builder.get_object("warning_frame")
            self.warning_box.modify_bg(gtk.STATE_NORMAL, gtk.gdk.color_parse("#F6FA9C"))
            self.warning_frame.show_all()

        # FIXME: iconfilechooser with default dialog from glade 3.6.7 crashes
        self.icon_dlg = IconChooserDialog(self.mapping_editor_dlg)
        self.iconfilechooser_btn = gtk.FileChooserButton(self.icon_dlg)
        self.iconfilechooser_btn.show()
        self.iconfilechooser_btn.connect("file-set", self.iconfilechooser_btn_file_set_cb)
        self.builder.get_object("hbox2").add(self.iconfilechooser_btn)

        # Populate dialog with mapping values
        pixbuf = gtk.gdk.pixbuf_new_from_file_at_size(self.mapping.get_icon(), 48, 48)
        self.icon_image.set_from_pixbuf(pixbuf)
        self.name_entry.set_text(self.mapping.get_name() or "")
        self.comment_entry.set_text(self.mapping.get_comment() or "")
        self.version_entry.set_text(self.mapping.get_version() or "")
        self.authors_entry.set_text(self.mapping.get_authors() or "")
        self.mapping_buffer.set_text(self.mapping.get_mapping() or "")
        self.mapping_buffer.place_cursor(self.mapping_buffer.get_start_iter())
        self.mapping_editor_dlg.set_title(_("Editing ") + self.mapping.get_name())

        # Initial error underlining and colorize comments
        self.mapping_buffer.create_tag("underline_error", underline=pango.UNDERLINE_ERROR)
        self.mapping_buffer.create_tag("comment", foreground="darkblue")
        self.validator = MappingValidator()
        self.changed_cb(None)
        self.mapping_buffer.connect("changed", self.changed_cb)

        # Connect and manage wiican service status
        bus = dbus.SessionBus()
        self.wiican_iface = dbus.Interface(bus.get_object(WIICAN_URI, WIICAN_PATH), WIICAN_URI)

        # FIXME: I think that handler_block/unblock its a bad design for this
        self.sig_id = self.execute_btn.connect("clicked", self.execute_btn_clicked_cb)

        def wiican_status_changed(new_status):
            if new_status & WC_WIIMOTE_DISCOVERING:
                if not self.execute_btn.get_active():
                    self.execute_btn.handler_block(self.sig_id)
                    self.execute_btn.set_active(True)
                    self.execute_btn.handler_unblock(self.sig_id)
                    self.execute_btn.set_tooltip_text(_("A mapping is running"))
                    self.execute_btn.set_image(gtk.image_new_from_pixbuf(wiican_disc3_icon))

            elif new_status == (WC_UINPUT_PRESENT | WC_BLUEZ_PRESENT):
                self.execute_btn.set_sensitive(True)
                self.execute_btn.set_tooltip_text(_("Execute this mapping"))
                self.execute_btn.set_image(gtk.image_new_from_pixbuf(wiican_on_icon))
                if self.execute_btn.get_active():
                    self.execute_btn.handler_block(self.sig_id)
                    self.execute_btn.set_active(False)
                    self.execute_btn.handler_unblock(self.sig_id)
            else:
                self.execute_btn.set_sensitive(False)
                self.execute_btn.set_image(gtk.image_new_from_pixbuf(wiican_off_icon))
                self.execute_btn.set_tooltip_text(
                    _("Ensure a bluetooth " + "adapter its available and uinput module its loaded")
                )

        self.wiican_iface.connect_to_signal("StatusChanged", wiican_status_changed, dbus_interface="org.gnome.Wiican")

        status = self.wiican_iface.GetStatus()
        wiican_status_changed(status)

        self.notificator = Notificator("wiican")
Exemple #2
0
class MappingEditorDialog(object):
    def __init__(self, mapping, system_mapping=False):
        self.mapping = mapping

        self.builder = gtk.Builder()
        if not self.builder.add_objects_from_file(MAPPING_UI, ["mapping_editor_dlg"]):  # , 'mapping_buffer']):
            raise "Cant load %s" % MAPPING_UI
        self.builder.connect_signals(self)

        self.mapping_editor_dlg = self.builder.get_object("mapping_editor_dlg")
        self.name_entry = self.builder.get_object("name_entry")
        self.comment_entry = self.builder.get_object("comment_entry")
        self.version_entry = self.builder.get_object("version_entry")
        self.authors_entry = self.builder.get_object("authors_entry")
        self.scrolledwindow2 = self.builder.get_object("scrolledwindow2")
        self.icon_image = self.builder.get_object("icon_image")
        self.execute_btn = self.builder.get_object("execute_btn")

        lm = gtksourceview2.LanguageManager()
        self.mapping_buffer = gtksourceview2.Buffer()
        self.mapping_buffer.set_data("languages-manager", lm)
        view = gtksourceview2.View(self.mapping_buffer)
        view.set_show_line_numbers(True)
        view.set_auto_indent(True)

        self.scrolledwindow2.add(view)
        self.scrolledwindow2.show_all()

        if system_mapping:
            self.warning_box = self.builder.get_object("warning_box")
            self.warning_frame = self.builder.get_object("warning_frame")
            self.warning_box.modify_bg(gtk.STATE_NORMAL, gtk.gdk.color_parse("#F6FA9C"))
            self.warning_frame.show_all()

        # FIXME: iconfilechooser with default dialog from glade 3.6.7 crashes
        self.icon_dlg = IconChooserDialog(self.mapping_editor_dlg)
        self.iconfilechooser_btn = gtk.FileChooserButton(self.icon_dlg)
        self.iconfilechooser_btn.show()
        self.iconfilechooser_btn.connect("file-set", self.iconfilechooser_btn_file_set_cb)
        self.builder.get_object("hbox2").add(self.iconfilechooser_btn)

        # Populate dialog with mapping values
        pixbuf = gtk.gdk.pixbuf_new_from_file_at_size(self.mapping.get_icon(), 48, 48)
        self.icon_image.set_from_pixbuf(pixbuf)
        self.name_entry.set_text(self.mapping.get_name() or "")
        self.comment_entry.set_text(self.mapping.get_comment() or "")
        self.version_entry.set_text(self.mapping.get_version() or "")
        self.authors_entry.set_text(self.mapping.get_authors() or "")
        self.mapping_buffer.set_text(self.mapping.get_mapping() or "")
        self.mapping_buffer.place_cursor(self.mapping_buffer.get_start_iter())
        self.mapping_editor_dlg.set_title(_("Editing ") + self.mapping.get_name())

        # Initial error underlining and colorize comments
        self.mapping_buffer.create_tag("underline_error", underline=pango.UNDERLINE_ERROR)
        self.mapping_buffer.create_tag("comment", foreground="darkblue")
        self.validator = MappingValidator()
        self.changed_cb(None)
        self.mapping_buffer.connect("changed", self.changed_cb)

        # Connect and manage wiican service status
        bus = dbus.SessionBus()
        self.wiican_iface = dbus.Interface(bus.get_object(WIICAN_URI, WIICAN_PATH), WIICAN_URI)

        # FIXME: I think that handler_block/unblock its a bad design for this
        self.sig_id = self.execute_btn.connect("clicked", self.execute_btn_clicked_cb)

        def wiican_status_changed(new_status):
            if new_status & WC_WIIMOTE_DISCOVERING:
                if not self.execute_btn.get_active():
                    self.execute_btn.handler_block(self.sig_id)
                    self.execute_btn.set_active(True)
                    self.execute_btn.handler_unblock(self.sig_id)
                    self.execute_btn.set_tooltip_text(_("A mapping is running"))
                    self.execute_btn.set_image(gtk.image_new_from_pixbuf(wiican_disc3_icon))

            elif new_status == (WC_UINPUT_PRESENT | WC_BLUEZ_PRESENT):
                self.execute_btn.set_sensitive(True)
                self.execute_btn.set_tooltip_text(_("Execute this mapping"))
                self.execute_btn.set_image(gtk.image_new_from_pixbuf(wiican_on_icon))
                if self.execute_btn.get_active():
                    self.execute_btn.handler_block(self.sig_id)
                    self.execute_btn.set_active(False)
                    self.execute_btn.handler_unblock(self.sig_id)
            else:
                self.execute_btn.set_sensitive(False)
                self.execute_btn.set_image(gtk.image_new_from_pixbuf(wiican_off_icon))
                self.execute_btn.set_tooltip_text(
                    _("Ensure a bluetooth " + "adapter its available and uinput module its loaded")
                )

        self.wiican_iface.connect_to_signal("StatusChanged", wiican_status_changed, dbus_interface="org.gnome.Wiican")

        status = self.wiican_iface.GetStatus()
        wiican_status_changed(status)

        self.notificator = Notificator("wiican")

    def changed_cb(self, widget, data=None):
        start, end = self.mapping_buffer.get_bounds()
        self.mapping_buffer.remove_all_tags(start, end)

        start, end = self.mapping_buffer.get_bounds()
        self.validator.validate(self.mapping_buffer.get_text(start, end), halt_on_errors=False)

        for error in self.validator.validation_errors:
            if not error:
                continue
            start = self.mapping_buffer.get_iter_at_offset(error.lexpos)
            # FIXME: Finding '\n' for underlining error it's not the best way
            end = self.mapping_buffer.get_iter_at_offset(error.lexpos + error.value.find("\n"))
            self.mapping_buffer.apply_tag_by_name("underline_error", start, end)

        for comment in self.validator.comments:
            start = self.mapping_buffer.get_iter_at_offset(comment.lexpos)
            end = self.mapping_buffer.get_iter_at_offset(comment.lexpos + len(comment.value))
            self.mapping_buffer.apply_tag_by_name("comment", start, end)

    def set_title(self, title=""):
        self.mapping_editor_dlg.set_title(title)

    def run(self):
        return self.mapping_editor_dlg.run()

    def destroy(self):
        self.mapping_editor_dlg.destroy()

    def get_mapping(self):
        start, end = self.mapping_buffer.get_bounds()
        mapping_code = self.mapping_buffer.get_text(start, end)
        # FIXME: If mapping doesn't ends with \n wminput prompts segfault
        if not mapping_code.endswith("\n"):
            mapping_code += "\n"

        self.mapping.set_mapping(mapping_code)
        self.mapping.set_name(self.name_entry.get_text())
        self.mapping.set_comment(self.comment_entry.get_text())
        self.mapping.set_version(self.version_entry.get_text())
        self.mapping.set_authors(self.authors_entry.get_text())

        return self.mapping

    def help_btn_clicked_cb(self, widget):
        webbrowser.open(widget.get_uri())

    def execute_btn_clicked_cb(self, widget):
        if self.execute_btn.get_active():
            start, end = self.mapping_buffer.get_bounds()
            mapping_code = self.mapping_buffer.get_text(start, end)
            # FIXME: If mapping doesn't ends with \n wminput prompts segfault
            if not mapping_code.endswith("\n"):
                mapping_code += "\n"

            # TODO: This file must be unlinked after being used
            filename = tempfile.mktemp()
            fp = open(filename, "w")
            fp.write(mapping_code)
            fp.close()

            try:
                self.wiican_iface.ConnectWiimote(filename, True)
            except dbus.exceptions.DBusException, error:
                if error.message == ("Mapping validation error"):
                    valerr_dlg = ValidationErrorDialog(self.mapping.get_icon(), parent=self.mapping_editor_dlg)
                    valerr_dlg.run()
                    valerr_dlg.destroy()
                    return

            self.notificator.display_notification(
                title=_("Press 1+2"), text=_("To put you Wiimote in discoverable mode now"), icon="wiican"
            )
        else: