Пример #1
0
class WavesPanel(wx.Panel):

    def __init__(self, parent):
        wx.Panel.__init__(self, parent=parent, id=wx.ID_ANY)

        self.wave_panels = []

        for i in xrange(spec.NUM_SYNTHS):
            self.wave_panels.append(WavePanel(self, i))

        self.wave_slider = wx.Slider(
            self, wx.ID_ANY, 0, 0, spec.WAVES_PER_SYNTH - 1)

        self.frame_number = StaticTextViewField(self, lambda x: "%02x" % (x))

        self.Bind(wx.EVT_SCROLL, self.handle_scroll, self.wave_slider)

        channels.SYNTH_CHANGE(parent.project).subscribe(
            self.handle_synth_changed)

        sizer = wx.BoxSizer(wx.VERTICAL)

        map(lambda x: sizer.Add(x, 1, wx.ALL | wx.EXPAND), self.wave_panels)

        slider_sizer = wx.BoxSizer(wx.HORIZONTAL)

        slider_sizer.Add(wx.StaticText(self, label="Frame Number: "))
        self.frame_number.add_to_sizer(slider_sizer, 0, wx.ALL)
        slider_sizer.Add(self.wave_slider, 1, wx.ALL | wx.ALIGN_LEFT)

        sizer.Add(slider_sizer)

        self.SetSizer(sizer)

        self.show_wave_panel(0)

    def handle_synth_changed(self, data):
        self.show_wave_panel(0)

    def field_changed(self):
        pass

    def handle_scroll(self, event):
        val = self.wave_slider.GetValue()
        self.show_wave_panel(val)

    def show_wave_panel(self, index):
        if self.wave_slider.GetValue() != index:
            self.wave_slider.SetValue(index)

        self.frame_number.update(index)

        for i in xrange(len(self.wave_panels)):
            if i == index:
                self.wave_panels[i].Show()
            else:
                self.wave_panels[i].Hide()

        self.Layout()
Пример #2
0
    def __init__(self, parent):
        wx.Panel.__init__(self, parent=parent, id=wx.ID_ANY)

        self.wave_panels = []
        self.active_panel = 0

        for i in xrange(spec.NUM_SYNTHS):
            self.wave_panels.append(WavePanel(self, i))

        self.wave_slider = wx.Slider(
            self, wx.ID_ANY, 0, 0, spec.WAVES_PER_SYNTH - 1)

        self.frame_number = StaticTextViewField(self, self.get_slider_label)

        self.Bind(wx.EVT_SCROLL, self.handle_scroll, self.wave_slider)

        channels.SYNTH_CHANGE(parent.project).subscribe(
            self.handle_synth_changed)

        sizer = wx.BoxSizer(wx.VERTICAL)

        map(lambda x: sizer.Add(x, 1, wx.ALL | wx.EXPAND), self.wave_panels)

        slider_sizer = wx.BoxSizer(wx.HORIZONTAL)

        slider_sizer.Add(wx.StaticText(self, label="Frame Number: "))
        self.frame_number.add_to_sizer(slider_sizer, 0, wx.ALL)
        slider_sizer.Add(self.wave_slider, 1, wx.ALL | wx.ALIGN_LEFT)

        sizer.Add(slider_sizer)

        self.SetSizer(sizer)

        self.show_wave_panel(0)
Пример #3
0
    def add_header_gui(self):
        header_sizer = wx.BoxSizer(wx.HORIZONTAL)

        def header_format(instr):
            return "Instrument %02x" % (instr.index)

        self.instrument_name = StaticTextViewField(self, header_format)
        self.instrument_name.subscribe(self.instr_of_type_channel)
        self.instrument_name.add_to_sizer(header_sizer, 1, wx.ALL)

        self.sizer.Add(header_sizer, 1, wx.EXPAND | wx.ALL)
        self.sizer.AddSpacer(10)
Пример #4
0
class InstrumentPanel(wx.Panel):

    def __init__(self, parent, channel):
        wx.Panel.__init__(self, parent=parent, id=wx.ID_ANY)

        self.num_fields = 0
        self.updated_fields = 0

        self.instrument = None

        self.instr_of_type_channel = None

        if channel is not None:
            self.instr_of_type_channel = channel(parent.project)
            self.instr_of_type_channel.subscribe(self._set_instrument)

        self.instr_imported_channel = channels.INSTR_IMPORT(parent.project)

        self.sizer = wx.BoxSizer(wx.VERTICAL)

        self.main_sizer = wx.FlexGridSizer(cols=2, hgap=20, vgap=10)

        if channel is not None:
            self.add_header_gui()

        self.sizer.Add(self.main_sizer, wx.EXPAND | wx.ALL)

        if channel is not None:
            self.add_footer_gui()

        self.SetSizer(self.sizer)

    def _set_instrument(self, data):
        self.instrument = data

    def add_header_gui(self):
        header_sizer = wx.BoxSizer(wx.HORIZONTAL)

        def header_format(instr):
            return "Instrument %02x" % (instr.index)

        self.instrument_name = StaticTextViewField(self, header_format)
        self.instrument_name.subscribe(self.instr_of_type_channel)
        self.instrument_name.add_to_sizer(header_sizer, 1, wx.ALL)

        self.sizer.Add(header_sizer, 1, wx.EXPAND | wx.ALL)
        self.sizer.AddSpacer(10)

    def add_footer_gui(self):
        import_button = wx.Button(self, wx.ID_ANY, label="Import ...")
        export_button = wx.Button(self, wx.ID_ANY, label="Export ...")

        self.Bind(wx.EVT_BUTTON, self.import_instrument, import_button)
        self.Bind(wx.EVT_BUTTON, self.export_instrument, export_button)

        bottom_buttons_sizer = wx.BoxSizer(wx.HORIZONTAL)
        bottom_buttons_sizer.Add(import_button, 1, wx.EXPAND | wx.ALL)
        bottom_buttons_sizer.AddSpacer(10)
        bottom_buttons_sizer.Add(export_button, 1, wx.EXPAND | wx.ALL)

        self.sizer.AddSpacer(15)
        self.sizer.Add(bottom_buttons_sizer, .2, wx.EXPAND | wx.ALL)
        self.sizer.AddSpacer(5)

    def add_field(self, label_text, control, fields=None):
        label = wx.StaticText(self, label=label_text)

        if fields is None:
            fields = [control]

        self.main_sizer.Add(label, 0, wx.ALL)

        map(lambda x: x.subscribe(self.instr_of_type_channel), fields)
        self.num_fields += len(fields)

        if isinstance(control, ViewField):
            control.add_to_sizer(self.main_sizer, 0, wx.ALL)
        else:
            self.main_sizer.Add(control, 0, wx.ALL)

    def change_instrument(self, instrument):
        # Reset updated fields count since we're about to start changing
        # fields.
        self.updated_fields = 0
        self.instr_of_type_channel.publish(instrument)

    def import_instrument(self, event):
        def ok_handler(dlg, path):
            try:
                index = self.instrument.index
                self.instrument.song.instruments.import_from_file(index, path)
                self.instrument = self.instrument.song.instruments[index]
                self.instr_imported_channel.publish(self.instrument)
            except Exception, e:
                utils.show_error_dialog('Import Failed', str(e), self)

        utils.file_dialog(
            "Load instrument", "*.lsdinst", wx.OPEN, ok_handler)