class Settings(SymbolManager, QWidget): """ The widget where users can set other preferences. """ def __init__(self, parent): QWidget.__init__(self, parent) SymbolManager.__init__(self) parent.addPage(self, i18n("Score settings")) h = QHBoxLayout(self) v = QVBoxLayout() h.addLayout(v) score = QGroupBox(i18n("Score settings")) v.addWidget(score) lily = QGroupBox(i18n("LilyPond")) v.addWidget(lily) v = QVBoxLayout() h.addLayout(v) prefs = QGroupBox(i18n("General preferences")) v.addWidget(prefs) instr = QGroupBox(i18n("Instrument names")) v.addWidget(instr) # Score settings: v = QVBoxLayout(score) h = KHBox() v.addWidget(h) l = QLabel(i18n("Key signature:"), h) self.key = QComboBox(h) # the key names are filled in later self.mode = QComboBox(h) self.mode.addItems([title for name, title in ly.modes(i18n)]) l.setBuddy(self.key) h = KHBox() v.addWidget(h) l = QLabel(i18n("Time signature:"), h) self.time = QComboBox(h) self.time.setEditable(True) self.time.addItems([ '(4/4)', '(2/2)', '2/4', '3/4', '4/4', '5/4', '6/4', '7/4', '2/2', '3/2', '4/2', '3/8', '5/8', '6/8', '7/8', '8/8', '9/8', '12/8', '3/16', '6/16', '12/16']) # palette sensitive icons for the first two items self.addItemSymbol(self.time, 0, 'time_c44') self.addItemSymbol(self.time, 1, 'time_c22') l.setBuddy(self.time) h = KHBox() v.addWidget(h) l = QLabel(i18n("Pickup measure:"), h) self.pickup = QComboBox(h) self.pickup.addItem(i18n("None")) self.pickup.insertSeparator(1) durs = [('note_' + d.replace('.', 'd'), d) for d in durations] for icon, text in durs: self.addItemSymbol(self.pickup, self.pickup.count(), icon) self.pickup.addItem(text) l.setBuddy(self.pickup) h = KHBox() v.addWidget(h) l = QLabel(i18n("Metronome mark:"), h) self.metroDur = QComboBox(h) l.setBuddy(self.metroDur) for icon, text in durs: self.addItemSymbol(self.metroDur, self.metroDur.count(), icon) self.metroDur.addItem('') l = QLabel('=', h) l.setAlignment(Qt.AlignCenter) l.setMaximumWidth(20) self.metroVal = QComboBox(h) self.metroVal.setEditable(True) metroValues, start = [], 40 for end, step in (60, 2), (72, 3), (120, 4), (144, 6), (210, 8): metroValues.extend(range(start, end, step)) start = end # reverse so mousewheeling is more intuitive self.metroValues = metroValues[::-1] self.metroVal.addItems(map(str, self.metroValues)) def tap(bpm): """ Tap the tempo tap button """ l = [abs(t - bpm) for t in self.metroValues] m = min(l) if m < 6: self.metroVal.setCurrentIndex(l.index(m)) TapButton(h, tap) h = KHBox() v.addWidget(h) l = QLabel(i18n("Tempo indication:"), h) self.tempoInd = KLineEdit(h) parent.complete(self.tempoInd, "tempo") l.setBuddy(self.tempoInd) h.setToolTip(i18n("A tempo indication, e.g. \"Allegro.\"")) # LilyPond settings v = QVBoxLayout(lily) h = KHBox() v.addWidget(h) l = QLabel(i18n("Pitch name language:"), h) self.languageNames = list(sorted(ly.keyNames)) self.lylang = QComboBox(h) l.setBuddy(self.lylang) self.lylang.addItem(i18n("Default")) self.lylang.insertSeparator(1) self.lylang.addItems([l.title() for l in self.languageNames]) h.setToolTip(i18n( "The LilyPond language you want to use for the pitch names.")) self.lylang.currentIndexChanged.connect(self.slotLanguageChanged) self.slotLanguageChanged(0) # init with default h = KHBox() v.addWidget(h) l = QLabel(i18n("Version:"), h) self.lyversion = QComboBox(h) self.lyversion.setEditable(True) l.setBuddy(self.lyversion) version = defaultVersion() if version: self.lyversion.addItem(str(version)) self.lyversion.addItems(('2.12.0', '2.10.0')) h.setToolTip(i18n( "The LilyPond version you will be using for this document.")) # General preferences v = QVBoxLayout(prefs) self.typq = QCheckBox(i18n("Use typographical quotes")) self.typq.setToolTip(i18n( "Replace normal quotes in titles with nice typographical quotes.")) v.addWidget(self.typq) self.tagl = QCheckBox(i18n("Remove default tagline")) self.tagl.setToolTip(i18n( "Suppress the default tagline output by LilyPond.")) v.addWidget(self.tagl) self.barnum = QCheckBox(i18n("Remove bar numbers")) self.barnum.setToolTip(i18n( "Suppress the display of measure numbers at the beginning of " "every system.")) v.addWidget(self.barnum) self.midi = QCheckBox(i18n("Create MIDI output")) self.midi.setToolTip(i18n( "Create a MIDI file in addition to the PDF file.")) v.addWidget(self.midi) self.metro = QCheckBox(i18n("Show metronome mark")) self.metro.setToolTip(i18n( "If checked, show the metronome mark at the beginning of the " "score. The MIDI output also uses the metronome setting.")) v.addWidget(self.metro) self.book = QCheckBox(i18n("Wrap score in \\book block")) self.book.setToolTip(i18n( "If checked, wraps the \\score block inside a \\book block.")) v.addWidget(self.book) # paper size: h = KHBox() v.addWidget(h) h.setSpacing(2) l = QLabel(i18n("Paper size:"), h) self.paper = QComboBox(h) l.setBuddy(self.paper) self.paperLandscape = QCheckBox(i18n("Landscape"), h) self.paper.addItem(i18n("Default")) self.paper.addItems(ly.paperSizes) self.paper.activated.connect(lambda i: self.paperLandscape.setEnabled(bool(i))) # Instrument names instr.setCheckable(True) self.instr = instr v = QVBoxLayout(instr) h = KHBox() v.addWidget(h) l = QLabel(i18n("First system:"), h) self.instrFirst = QComboBox(h) l.setBuddy(self.instrFirst) self.instrFirst.addItems((i18n("Long"), i18n("Short"))) h.setToolTip(i18n( "Use long or short instrument names before the first system.")) h = KHBox() v.addWidget(h) l = QLabel(i18n("Other systems:"), h) self.instrOther = QComboBox(h) l.setBuddy(self.instrOther) self.instrOther.addItems((i18n("Long"), i18n("Short"), i18n("None"))) h.setToolTip(i18n( "Use short, long or no instrument names before the next systems.")) h = KHBox() v.addWidget(h) l = QLabel(i18n("Language:"), h) self.instrLang = QComboBox(h) l.setBuddy(self.instrLang) self.instrLang.addItems((i18n("Default"), KGlobal.locale().languageCodeToName("en"))) h.setToolTip(i18n("Which language to use for the instrument names.")) langs = KGlobal.dirs().findAllResources("locale", "*/LC_MESSAGES/frescobaldi.mo") self.instrLanguages = list(sorted(set(lang.split('/')[-3] for lang in langs))) self.instrLang.addItems(map(KGlobal.locale().languageCodeToName, self.instrLanguages)) self.default() self.loadConfig() def saveConfig(self): conf = config() conf.writeEntry('language', self.getLanguage() or 'default') conf.writeEntry('typographical', self.typq.isChecked()) conf.writeEntry('remove tagline', self.tagl.isChecked()) conf.writeEntry('remove barnumbers', self.barnum.isChecked()) conf.writeEntry('midi', self.midi.isChecked()) conf.writeEntry('metronome mark', self.metro.isChecked()) conf.writeEntry('wrap in book', self.book.isChecked()) if self.paper.currentIndex() > 0: conf.writeEntry('paper size', ly.paperSizes[self.paper.currentIndex() - 1]) conf.writeEntry('paper landscape', self.paperLandscape.isChecked()) g = config('instrument names') g.writeEntry('show', self.instr.isChecked()) g.writeEntry('first', ['long', 'short'][self.instrFirst.currentIndex()]) g.writeEntry('other', ['long', 'short', 'none'][self.instrOther.currentIndex()]) g.writeEntry('lang', (['default', 'english'] + self.instrLanguages)[self.instrLang.currentIndex()]) def loadConfig(self): conf = config() self.setLanguage(conf.readEntry('language', 'default')) self.typq.setChecked(conf.readEntry('typographical', True)) self.tagl.setChecked(conf.readEntry('remove tagline', False)) self.barnum.setChecked(conf.readEntry('remove barnumbers', False)) self.midi.setChecked(conf.readEntry('midi', True)) self.metro.setChecked(conf.readEntry('metronome mark', False)) self.book.setChecked(conf.readEntry('wrap in book', False)) psize = conf.readEntry('paper size', "") if psize in ly.paperSizes: self.paper.setCurrentIndex(ly.paperSizes.index(psize) + 1) self.paperLandscape.setChecked(conf.readEntry('paper landscape', False)) self.paperLandscape.setEnabled(psize in ly.paperSizes) g = config('instrument names') def readconf(entry, itemlist, defaultIndex): item = g.readEntry(entry, itemlist[defaultIndex]) if item in itemlist: return itemlist.index(item) else: return defaultIndex first = readconf('first', ['long', 'short'], 0) other = readconf('other', ['long', 'short', 'none'], 2) lang = readconf('lang', ['default', 'english'] + self.instrLanguages, 0) self.instrFirst.setCurrentIndex(first) self.instrOther.setCurrentIndex(other) self.instrLang.setCurrentIndex(lang) self.instr.setChecked(g.readEntry('show', True)) def default(self): """ Set various items to their default state """ self.lylang.setCurrentIndex(0) self.key.setCurrentIndex(0) self.mode.setCurrentIndex(0) self.time.setCurrentIndex(0) self.pickup.setCurrentIndex(0) self.metroVal.setCurrentIndex(self.metroValues.index(100)) self.metroDur.setCurrentIndex(durations.index('4')) self.tempoInd.clear() self.typq.setChecked(True) self.tagl.setChecked(False) self.barnum.setChecked(False) self.midi.setChecked(True) self.metro.setChecked(False) self.book.setChecked(False) self.paper.setCurrentIndex(0) self.paperLandscape.setEnabled(False) self.instrFirst.setCurrentIndex(0) self.instrOther.setCurrentIndex(2) self.instrLang.setCurrentIndex(0) self.instr.setChecked(True) def getLanguage(self): """ Return the configured LilyPond pitch language, '' for default. """ if self.lylang.currentIndex() >= 2: return self.languageNames[self.lylang.currentIndex() - 2] else: return '' def setLanguage(self, lang): """ Sets the language combobox to the specified language """ if lang not in self.languageNames: self.lylang.setCurrentIndex(0) else: self.lylang.setCurrentIndex(self.languageNames.index(lang) + 2) def slotLanguageChanged(self, index): """ Change the LilyPond language, affects key names """ lang = index < 2 and "nederlands" or self.languageNames[index - 2] key = self.key.currentIndex() if key == -1: key = 0 self.key.clear() self.key.addItems(ly.keyNames[lang]) self.key.setCurrentIndex(key)