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()
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)
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)
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)