def show_path_info(self, w): if not self.g_path_info_dlg: self.g_path_info_dlg = Gtk.Dialog(_("_File locations").replace("_", ""), self, buttons=(Gtk.STOCK_OK, Gtk.ResponseType.ACCEPT)) sc = Gtk.ScrolledWindow() sc.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.NEVER) self.g_path_info_dlg.vbox.pack_start(sc, True, True, 0) # vbox = gu.hig_dlg_vbox() sc.add_with_viewport(vbox) box1, box2 = gu.hig_category_vbox(_("_File locations").replace("_", "")) vbox.pack_start(box1, True, True, 0) sizegroup = Gtk.SizeGroup(Gtk.SizeGroupMode.HORIZONTAL) # statistics.sqlite # win32 solfegerc # win32 langenviron.txt box2.pack_start(gu.hig_label_widget(_("Solfege application data:"), Gtk.Label(label=filesystem.app_data()), sizegroup), False, False, 0) box2.pack_start(gu.hig_label_widget(_("Solfege user data:"), Gtk.Label(label=filesystem.user_data()), sizegroup), False, False, 0) box2.pack_start(gu.hig_label_widget(_("Solfege config file:"), Gtk.Label(label=filesystem.rcfile()), sizegroup), False, False, 0) box2.pack_start(gu.hig_label_widget(_("Solfege installation directory:"), Gtk.Label(label=os.getcwd()), sizegroup), False, False, 0) box2.pack_start(gu.hig_label_widget(_("User manual in HTML format:"), Gtk.Label(label=os.path.join(os.getcwd(), "help")), sizegroup), False, False, 0) box2.pack_start(gu.hig_label_widget("gtk:", Gtk.Label(label=str(Gtk)), sizegroup), False, False, 0) box2.pack_start(gu.hig_label_widget("pyalsa:", Gtk.Label(label=str(alsaseq)), sizegroup), False, False, 0) box2.pack_start(gu.hig_label_widget("PYTHONHOME", Gtk.Label(os.environ.get('PYTHONHOME', 'Not defined')), sizegroup), False, False, 0) self.g_path_info_dlg.show_all() def f(*w): self.g_path_info_dlg.hide() return True self.g_path_info_dlg.connect('response', f) self.g_path_info_dlg.connect('delete-event', f) sc.set_size_request(min(vbox.size_request().width + gu.hig.SPACE_LARGE * 2, Gdk.Screen.width() * 0.9), vbox.size_request().height)
def __init__(self, default_profile): gtk.Dialog.__init__(self, _("GNU Solfege - Choose User Profile")) # We save the initially selected profile, because we need to keep # track of it if the user renames it and then presses cancel. self.m_default_profile = default_profile vbox = gu.hig_dlg_vbox() self.vbox.pack_start(vbox, False) l = gtk.Label( _("Solfege will save your statistics and test results in the user profile. By adding additional user profiles to Solfege, multiple users can share a user account on the operating system." )) l.set_alignment(0.0, 0.5) l.set_line_wrap(True) vbox.pack_start(l) hbox = gtk.HBox() hbox.set_spacing(gu.hig.SPACE_MEDIUM) vbox.pack_start(hbox) button_box = gtk.VBox() self.g_create_profile = gtk.Button(_(u"_Create profile\u2026")) self.g_create_profile.connect('clicked', self.on_create_profile) button_box.pack_start(self.g_create_profile, False) self.g_rename_profile = gtk.Button(_(u"_Rename profile\u2026")) self.g_rename_profile.connect('clicked', self.on_rename_profile) button_box.pack_start(self.g_rename_profile, False) self.g_delete_profile = gtk.Button(_(u"_Delete profile\u2026")) self.g_delete_profile.connect('clicked', self.on_delete_profile) button_box.pack_start(self.g_delete_profile, False) hbox.pack_start(button_box, False) self.g_liststore = liststore = gtk.ListStore(gobject.TYPE_STRING) liststore.append((_("Standard profile"), )) if os.path.exists(os.path.join(filesystem.app_data(), 'profiles')): for subdir in os.listdir( os.path.join(filesystem.app_data(), 'profiles')): liststore.append((subdir, )) # self.g_tw = tw = gtk.TreeView(liststore) tw.connect('row-activated', lambda a, b, c: self.response(gtk.RESPONSE_ACCEPT)) tw.set_headers_visible(False) renderer = gtk.CellRendererText() column = gtk.TreeViewColumn(None, renderer, text=0) tw.append_column(column) hbox.pack_start(tw, False) tw.show() tw.connect('cursor-changed', self.on_cursor_changed) tw.set_cursor((0, )) for idx, s in enumerate(self.g_liststore): if s[0] == default_profile: tw.set_cursor((idx, )) # chk = gu.nCheckButton("app", "noprofilemanager", _("D_on't ask at startup")) vbox.pack_start(chk, False) self.show_all()
def __init__(self, parent, default_profile): Gtk.Dialog.__init__(self, _("GNU Solfege - Choose User Profile"), parent) # Set a small size, and let the widgets expand the dialog self.set_default_size(100, 100) # We save the initially selected profile, because we need to keep # track of it if the user renames it and then presses cancel. self.m_default_profile = default_profile vbox = gu.hig_dlg_vbox() self.get_content_area().pack_start(vbox, False, False, 0) l = Gtk.Label(_("Solfege will save your statistics and test results in the user profile. By adding additional user profiles to Solfege, multiple users can share a user account on the operating system.")) l.set_alignment(0.0, 0.5) l.set_line_wrap(True) vbox.pack_start(l, True, True, 0) hbox = Gtk.HBox() hbox.set_spacing(gu.hig.SPACE_MEDIUM) vbox.pack_start(hbox, True, True, 0) button_box = Gtk.VBox() self.g_create_profile = Gtk.Button.new_with_mnemonic(_("_Create profile\u2026")) self.g_create_profile.connect('clicked', self.on_create_profile) button_box.pack_start(self.g_create_profile, False, False, 0) self.g_rename_profile = Gtk.Button.new_with_mnemonic(_("_Rename profile\u2026")) self.g_rename_profile.connect('clicked', self.on_rename_profile) button_box.pack_start(self.g_rename_profile, False, False, 0) self.g_delete_profile = Gtk.Button.new_with_mnemonic(_("_Delete profile\u2026")) self.g_delete_profile.connect('clicked', self.on_delete_profile) button_box.pack_start(self.g_delete_profile, False, False, 0) hbox.pack_start(button_box, False, False, 0) self.g_liststore = liststore = Gtk.ListStore(GObject.TYPE_STRING) liststore.append((_("Standard profile"),)) if os.path.exists(os.path.join(filesystem.app_data(), 'profiles')): for subdir in os.listdir(os.path.join(filesystem.app_data(), 'profiles')): liststore.append((subdir,)) # self.g_tw = tw = Gtk.TreeView(liststore) tw.connect('row-activated', lambda a, b, c: self.response(Gtk.ResponseType.ACCEPT)) tw.set_headers_visible(False) renderer = Gtk.CellRendererText() column = Gtk.TreeViewColumn(None, renderer, text=0) tw.append_column(column) hbox.pack_start(tw, False, False, 0) tw.show() tw.connect('cursor-changed', self.on_cursor_changed) tw.set_cursor((0,)) for idx, s in enumerate(self.g_liststore): if s[0] == default_profile: tw.set_cursor((idx, )) # chk = gu.nCheckButton("app", "noprofilemanager", _("D_on't ask at startup")) vbox.pack_start(chk, False, False, 0) self.show_all()
def create_mainwin_ui(self): qbox = gu.hig_dlg_vbox() self.g_notebook.append_page(qbox, Gtk.Label(label=_("Questions"))) gu.bLabel(qbox, _("Enter new chords using the mouse"), False, False) hbox = gu.bHBox(qbox, False, False) self.g_displayer = mpd.musicdisplayer.ChordEditor() self.g_displayer.connect('clicked', self.on_displayer_clicked) self.g_displayer.clear(2) gu.bLabel(hbox, "") hbox.pack_start(self.g_displayer, False) gu.bLabel(hbox, "") ## self.g_question_name = Gtk.Entry() qbox.pack_start(gu.hig_label_widget(_("Question title:", True, True, 0), self.g_question_name, None), False) self.g_navinfo = Gtk.Label(label="") qbox.pack_start(self.g_navinfo, False) ## self.m_P = EditorLessonfile() cvbox = Gtk.VBox() self.g_notebook.append_page(cvbox, Gtk.Label(label=_("Lessonfile header"))) # Header section sizegroup = Gtk.SizeGroup(Gtk.SizeGroupMode.HORIZONTAL) self.g_title = Gtk.Entry() cvbox.pack_start(gu.hig_label_widget(_("File title:", True, True, 0), self.g_title, sizegroup)) self.g_content_chord = Gtk.RadioButton(None, "chord") self.g_content_chord_voicing = Gtk.RadioButton(self.g_content_chord, "chord-voicing") self.g_content_idbyname = Gtk.RadioButton(self.g_content_chord, "id-by-name") box = Gtk.HBox() box.pack_start(self.g_content_chord, True, True, 0) box.pack_start(self.g_content_chord_voicing, True, True, 0) box.pack_start(self.g_content_idbyname, True, True, 0) cvbox.pack_start(gu.hig_label_widget(_("Content:", True, True, 0), box, sizegroup)) self.g_random_transpose = Gtk.Entry() cvbox.pack_start(gu.hig_label_widget(_("Random transpose:", True, True, 0), self.g_random_transpose, sizegroup)) # #self.g_statusbar = Gtk.Statusbar() #self.toplevel_vbox.pack_start(self.g_statusbar, False) self.update_appwin()
def __init__(self, oldname): Gtk.Dialog.__init__(self, _(u"_Rename profile\u2026").replace("_", "").replace(u"\u2026", "")) self.add_buttons(Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL, Gtk.STOCK_OK, Gtk.ResponseType.ACCEPT) vbox = gu.hig_dlg_vbox() self.vbox.pack_start(vbox, True, True, 0) label = Gtk.Label(label=_(u"Rename the profile «%s» to:") % oldname) label.set_alignment(0.0, 0.5) vbox.pack_start(label, False, False, 0) self.g_entry = Gtk.Entry() self.g_entry.set_text(oldname) self.g_entry.set_activates_default(True) self.g_entry.connect('changed', self.on_entry_changed) vbox.pack_start(self.g_entry, False, False, 0) self.g_info = Gtk.Label() self.g_info.set_no_show_all(True) vbox.pack_start(self.g_info, False, False, 0) self.set_default_response(Gtk.ResponseType.ACCEPT)
def __init__(self, oldname): Gtk.Dialog.__init__(self, _("_Rename profile\u2026").replace("_", "").replace("\u2026", "")) self.add_buttons(Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL, Gtk.STOCK_OK, Gtk.ResponseType.ACCEPT) vbox = gu.hig_dlg_vbox() self.vbox.pack_start(vbox, True, True, 0) label = Gtk.Label(label=_("Rename the profile «%s» to:") % oldname) label.set_alignment(0.0, 0.5) vbox.pack_start(label, False, False, 0) self.g_entry = Gtk.Entry() self.g_entry.set_text(oldname) self.g_entry.set_activates_default(True) self.g_entry.connect('changed', self.on_entry_changed) vbox.pack_start(self.g_entry, False, False, 0) self.g_info = Gtk.Label() self.g_info.set_no_show_all(True) vbox.pack_start(self.g_info, False, False, 0) self.set_default_response(Gtk.ResponseType.ACCEPT)
def __init__(self): Gtk.Dialog.__init__( self, _(u"_Create profile\u2026").replace(u"\u2026", "").replace("_", "")) self.add_buttons(Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL, Gtk.STOCK_OK, Gtk.ResponseType.ACCEPT) vbox = gu.hig_dlg_vbox() self.vbox.pack_start(vbox, True, True, 0) # label = Gtk.Label(label=_("Enter the name of the new folder:")) label.set_alignment(0.0, 0.5) vbox.pack_start(label, False, False, 0) # self.g_entry = Gtk.Entry() self.g_entry.connect('changed', self.on_entry_changed) self.g_entry.set_activates_default(True) vbox.pack_start(self.g_entry, False, False, 0) # label = Gtk.Label(label=_("Your profile data will be stored in:")) label.set_alignment(0.0, 0.5) vbox.pack_start(label, False, False, 0) # self.g_profile_location = Gtk.Label() vbox.pack_start(self.g_profile_location, False, False, 0) # self.g_statusbox = Gtk.HBox() self.g_statusbox.set_no_show_all(True) vbox.pack_start(self.g_statusbox, False, False, 0) im = Gtk.Image() im.set_from_stock(Gtk.STOCK_DIALOG_WARNING, Gtk.IconSize.MENU) self.g_statusbox.pack_start(im, False, False, 0) im.show() self.g_status = Gtk.Label() self.g_status.show() self.g_statusbox.pack_start(self.g_status, False, False, 0) self.g_entry.set_text(_("New Profile")) self.set_default_response(Gtk.ResponseType.ACCEPT)
def __init__(self): Gtk.Dialog.__init__(self, _(u"_Create profile\u2026").replace(u"\u2026", "").replace("_", "")) self.add_buttons(Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL, Gtk.STOCK_OK, Gtk.ResponseType.ACCEPT) vbox = gu.hig_dlg_vbox() self.vbox.pack_start(vbox, True, True, 0) # label = Gtk.Label(label=_("Enter the name of the new folder:")) label.set_alignment(0.0, 0.5) vbox.pack_start(label, False, False, 0) # self.g_entry = Gtk.Entry() self.g_entry.connect('changed', self.on_entry_changed) self.g_entry.set_activates_default(True) vbox.pack_start(self.g_entry, False, False, 0) # label = Gtk.Label(label=_("Your profile data will be stored in:")) label.set_alignment(0.0, 0.5) vbox.pack_start(label, False, False, 0) # self.g_profile_location = Gtk.Label() vbox.pack_start(self.g_profile_location, False, False, 0) # self.g_statusbox = Gtk.HBox() self.g_statusbox.set_no_show_all(True) vbox.pack_start(self.g_statusbox, False, False, 0) im = Gtk.Image() im.set_from_stock(Gtk.STOCK_DIALOG_WARNING, Gtk.IconSize.MENU) self.g_statusbox.pack_start(im, False, False, 0) im.show() self.g_status = Gtk.Label() self.g_status.show() self.g_statusbox.pack_start(self.g_status, False, False, 0) self.g_entry.set_text(_("New Profile")) self.set_default_response(Gtk.ResponseType.ACCEPT)
def __init__(self, initial_value, parent): Gtk.Dialog.__init__(self, _("Set transposition"), parent, 0, ( Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL, Gtk.STOCK_OK, Gtk.ResponseType.OK, )) dlg_vbox = gu.hig_dlg_vbox() self.vbox.pack_start(dlg_vbox, True, True, 0) xbox, vbox = gu.hig_category_vbox( _("Select how to do random transposition")) dlg_vbox.pack_start(xbox, True, True, 0) label = Gtk.Label(label=_( """You can read about the different types of transposition in the lesson file documentation available on the Help menu.""" )) spin_sg = Gtk.SizeGroup(Gtk.SizeGroupMode.HORIZONTAL) label.set_line_wrap(True) vbox.pack_start(label, True, True, 0) sizegroup = Gtk.SizeGroup(Gtk.SizeGroupMode.HORIZONTAL) self.m_buttons = {} self.m_spins = {} self.m_buttons['no'] = b1 = Gtk.RadioButton.new_with_label( None, _("No")) self.m_spins['no'] = [] vbox.pack_start(b1, True, True, 0) self.m_buttons[ 'yes'] = b2 = Gtk.RadioButton.new_with_label_from_widget( b1, _("Yes")) self.m_spins['yes'] = [] hbox = gu.bHBox(vbox) label_b = Gtk.Label() label_b.set_alignment(0.4, 0.5) label_b.set_markup('<span size="xx-large">♭</span>') label_x = Gtk.Label() label_x.set_alignment(0.4, 0.5) label_x.set_markup('<span size="xx-large">♯</span>') spin_sg.add_widget(label_b) spin_sg.add_widget(label_x) hbox.pack_start(b2, True, True, 0) hbox.pack_start(label_b, True, True, 0) hbox.pack_start(label_x, True, True, 0) self.m_buttons[ 'accidentals'] = Gtk.RadioButton.new_with_label_from_widget( b1, _("Fifths relative to C major/a minor")) hbox = gu.bHBox(vbox) hbox.pack_start(self.m_buttons['accidentals'], True, True, 0) self.m_spins['accidentals'] = [ Gtk.SpinButton( adjustment=Gtk.Adjustment(0, -7, 7, 1, 1)), # 0.0, 0), Gtk.SpinButton(adjustment=Gtk.Adjustment(0, -7, 7, 1, 1)) ] #, 0.0, 0)] spin_sg.add_widget(self.m_spins['accidentals'][0]) spin_sg.add_widget(self.m_spins['accidentals'][1]) hbox.pack_start(self.m_spins['accidentals'][0], True, True, 0) hbox.pack_start(self.m_spins['accidentals'][1], True, True, 0) gu.SpinButtonRangeController(self.m_spins['accidentals'][0], self.m_spins['accidentals'][1], -7, 7) self.m_buttons['key'] = Gtk.RadioButton.new_with_label_from_widget( b1, _i("Fifths relative to current key")) hbox = gu.bHBox(vbox) hbox.pack_start(self.m_buttons['key'], True, True, 0) self.m_spins['key'] = [ Gtk.SpinButton( adjustment=Gtk.Adjustment(0, -10, 10, 1, 1)), # 0.0, 0), Gtk.SpinButton(adjustment=Gtk.Adjustment(0, -10, 10, 1, 1)) ] #, 0.0, 0)] hbox.pack_start(self.m_spins['key'][0], True, True, 0) hbox.pack_start(self.m_spins['key'][1], True, True, 0) gu.SpinButtonRangeController(self.m_spins['key'][0], self.m_spins['key'][1], -10, 10) self.m_buttons['atonal'] = Gtk.RadioButton.new_with_label_from_widget( b1, _i("Transpose notes without changing key")) hbox = gu.bHBox(vbox) hbox.pack_start(self.m_buttons['atonal'], True, True, 0) self.m_spins['atonal'] = [ Gtk.SpinButton( adjustment=Gtk.Adjustment(0, -10, 10, 1, 1)), # 0.0, 0), Gtk.SpinButton(adjustment=Gtk.Adjustment(0, -10, 10, 1, 1)) ] #, 0.0, 0)] hbox.pack_start(self.m_spins['atonal'][0], True, True, 0) hbox.pack_start(self.m_spins['atonal'][1], True, True, 0) gu.SpinButtonRangeController(self.m_spins['atonal'][0], self.m_spins['atonal'][1], -10, 10) self.m_buttons[ 'semitones'] = Gtk.RadioButton.new_with_label_from_widget( b1, _("Semitones")) hbox = gu.bHBox(vbox) hbox.pack_start(self.m_buttons['semitones'], True, True, 0) self.m_spins['semitones'] = [ Gtk.SpinButton( adjustment=Gtk.Adjustment(0, -100, 100, 1, 1)), #, 0.0, 0), Gtk.SpinButton(adjustment=Gtk.Adjustment(0, -100, 100, 1, 1)) ] #, 0.0, 0)] hbox.pack_start(self.m_spins['semitones'][0], True, True, 0) hbox.pack_start(self.m_spins['semitones'][1], True, True, 0) gu.SpinButtonRangeController(self.m_spins['semitones'][0], self.m_spins['semitones'][1], -100, 100) for n, w in self.m_buttons.items(): sizegroup.add_widget(w) for ww in self.m_spins[n]: ww.set_sensitive(False) w.connect('clicked', self.on_spins_clicked, n) if initial_value[0] == False: k = 'no' elif initial_value[0] == True: k = 'yes' else: k = initial_value[0] self.m_buttons[k].set_active(True) if k in ('accidentals', 'key', 'semitones', 'atonal'): t, v1, v2 = initial_value # FIXME Because of the RangeController, we have to do this # twice to be sure both values are set properly. self.m_spins[t][1].set_value(v2) self.m_spins[t][0].set_value(v1) self.m_spins[t][1].set_value(v2) self.m_spins[t][0].set_value(v1) self.show_all()
def show_path_info(self, w): if not self.g_path_info_dlg: self.g_path_info_dlg = Gtk.Dialog( _("_File locations").replace("_", ""), self, buttons=(Gtk.STOCK_OK, Gtk.ResponseType.ACCEPT)) sc = Gtk.ScrolledWindow() sc.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.NEVER) self.g_path_info_dlg.vbox.pack_start(sc, True, True, 0) # vbox = gu.hig_dlg_vbox() sc.add_with_viewport(vbox) box1, box2 = gu.hig_category_vbox( _("_File locations").replace("_", "")) vbox.pack_start(box1, True, True, 0) sizegroup = Gtk.SizeGroup(Gtk.SizeGroupMode.HORIZONTAL) # statistics.sqlite # win32 solfegerc # win32 langenviron.txt box2.pack_start( gu.hig_label_widget(_("Solfege application data:"), Gtk.Label(label=filesystem.app_data()), sizegroup), False, False, 0) box2.pack_start( gu.hig_label_widget(_("Solfege user data:"), Gtk.Label(label=filesystem.user_data()), sizegroup), False, False, 0) box2.pack_start( gu.hig_label_widget(_("Solfege config file:"), Gtk.Label(label=filesystem.rcfile()), sizegroup), False, False, 0) box2.pack_start( gu.hig_label_widget(_("Solfege installation directory:"), Gtk.Label(label=os.getcwd()), sizegroup), False, False, 0) box2.pack_start( gu.hig_label_widget( _("User manual in HTML format:"), Gtk.Label(label=os.path.join(os.getcwd(), "help")), sizegroup), False, False, 0) box2.pack_start( gu.hig_label_widget("gtk:", Gtk.Label(label=str(Gtk)), sizegroup), False, False, 0) box2.pack_start( gu.hig_label_widget("pyalsa:", Gtk.Label(label=str(alsaseq)), sizegroup), False, False, 0) box2.pack_start( gu.hig_label_widget( "PYTHONHOME", Gtk.Label(os.environ.get('PYTHONHOME', 'Not defined')), sizegroup), False, False, 0) self.g_path_info_dlg.show_all() def f(*w): self.g_path_info_dlg.hide() return True self.g_path_info_dlg.connect('response', f) self.g_path_info_dlg.connect('delete-event', f) sc.set_size_request( min(vbox.size_request().width + gu.hig.SPACE_LARGE * 2, Gdk.Screen.width() * 0.9), vbox.size_request().height)
def __init__(self, initial_value, parent): gtk.Dialog.__init__(self, _("Set transposition"), parent, 0, (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_OK, gtk.RESPONSE_OK, )) dlg_vbox = gu.hig_dlg_vbox() self.vbox.pack_start(dlg_vbox) xbox, vbox = gu.hig_category_vbox(_("Select how to do random transposition")) dlg_vbox.pack_start(xbox) label = gtk.Label(_("""You can read about the different types of transposition in the lesson file documentation available on the Help menu.""")) spin_sg = gtk.SizeGroup(gtk.SIZE_GROUP_HORIZONTAL) label.set_line_wrap(True) vbox.pack_start(label) sizegroup = gtk.SizeGroup(gtk.SIZE_GROUP_HORIZONTAL) self.m_buttons = {} self.m_spins = {} self.m_buttons['no'] = b1 = gtk.RadioButton(None, _("No")) self.m_spins['no'] = [] vbox.pack_start(b1) self.m_buttons['yes'] = b2 = gtk.RadioButton(b1, _("Yes")) self.m_spins['yes'] = [] hbox = gu.bHBox(vbox) label_b = gtk.Label() label_b.set_alignment(0.4, 0.5) label_b.set_markup('<span size="xx-large">♭</span>') label_x = gtk.Label() label_x.set_alignment(0.4, 0.5) label_x.set_markup('<span size="xx-large">♯</span>') spin_sg.add_widget(label_b) spin_sg.add_widget(label_x) hbox.pack_start(b2) hbox.pack_start(label_b) hbox.pack_start(label_x) self.m_buttons['accidentals'] = gtk.RadioButton(b1, _("Fifths relative to C major/a minor")) hbox = gu.bHBox(vbox) hbox.pack_start(self.m_buttons['accidentals']) self.m_spins['accidentals'] = [ gtk.SpinButton(gtk.Adjustment(0, -7, 7, 1, 1), 0.0, 0), gtk.SpinButton(gtk.Adjustment(0, -7, 7, 1, 1), 0.0, 0)] spin_sg.add_widget(self.m_spins['accidentals'][0]) spin_sg.add_widget(self.m_spins['accidentals'][1]) hbox.pack_start(self.m_spins['accidentals'][0]) hbox.pack_start(self.m_spins['accidentals'][1]) gu.SpinButtonRangeController(self.m_spins['accidentals'][0], self.m_spins['accidentals'][1], -7, 7) self.m_buttons['key'] = gtk.RadioButton(b1, _i("Fifths relative to current key")) hbox = gu.bHBox(vbox) hbox.pack_start(self.m_buttons['key']) self.m_spins['key'] = [ gtk.SpinButton(gtk.Adjustment(0, -10, 10, 1, 1), 0.0, 0), gtk.SpinButton(gtk.Adjustment(0, -10, 10, 1, 1), 0.0, 0)] hbox.pack_start(self.m_spins['key'][0]) hbox.pack_start(self.m_spins['key'][1]) gu.SpinButtonRangeController(self.m_spins['key'][0], self.m_spins['key'][1], -10, 10) self.m_buttons['atonal'] = gtk.RadioButton(b1, _i("Transpose notes without changing key")) hbox = gu.bHBox(vbox) hbox.pack_start(self.m_buttons['atonal']) self.m_spins['atonal'] = [ gtk.SpinButton(gtk.Adjustment(0, -10, 10, 1, 1), 0.0, 0), gtk.SpinButton(gtk.Adjustment(0, -10, 10, 1, 1), 0.0, 0)] hbox.pack_start(self.m_spins['atonal'][0]) hbox.pack_start(self.m_spins['atonal'][1]) gu.SpinButtonRangeController(self.m_spins['atonal'][0], self.m_spins['atonal'][1], -10, 10) self.m_buttons['semitones'] = gtk.RadioButton(b1, _("Semitones")) hbox = gu.bHBox(vbox) hbox.pack_start(self.m_buttons['semitones']) self.m_spins['semitones'] = [ gtk.SpinButton(gtk.Adjustment(0, -100, 100, 1, 1), 0.0, 0), gtk.SpinButton(gtk.Adjustment(0, -100, 100, 1, 1), 0.0, 0)] hbox.pack_start(self.m_spins['semitones'][0]) hbox.pack_start(self.m_spins['semitones'][1]) hbox.pack_start(self.m_spins['semitones'][0]) hbox.pack_start(self.m_spins['semitones'][1]) gu.SpinButtonRangeController(self.m_spins['semitones'][0], self.m_spins['semitones'][1], -100, 100) for n, w in self.m_buttons.items(): sizegroup.add_widget(w) for ww in self.m_spins[n]: ww.set_sensitive(False) w.connect('clicked', self.on_spins_clicked, n) if initial_value[0] == False: k = 'no' elif initial_value[0] == True: k = 'yes' else: k = initial_value[0] self.m_buttons[k].set_active(True) if k in ('accidentals', 'key', 'semitones', 'atonal'): t, v1, v2 = initial_value # FIXME Because of the RangeController, we have to do this # twice to be sure both values are set properly. self.m_spins[t][1].set_value(v2) self.m_spins[t][0].set_value(v1) self.m_spins[t][1].set_value(v2) self.m_spins[t][0].set_value(v1) self.show_all()