#include "BufferParams.h"
#include "BufferView.h"
#include "Color.h"
+#include "ColorCache.h"
#include "Encoding.h"
#include "FloatPlacement.h"
+#include "Format.h"
#include "FuncRequest.h"
#include "Language.h"
#include "LaTeXFeatures.h"
#include "frontends/alert.h"
#include <QAbstractItemModel>
+#include <QColor>
+#include <QColorDialog>
#include <QCloseEvent>
#include <QFontDatabase>
#include <QScrollBar>
#endif
+// a style sheet for buttons
+// this is for example used for the background color setting button
+static inline QString colorButtonStyleSheet(QColor const & bgColor)
+{
+ if (bgColor.isValid()) {
+ QString rc = QLatin1String("background:");
+ rc += bgColor.name();
+ return rc;
+ }
+ return QLatin1String("");
+}
+
+
using namespace std;
using namespace lyx::support;
namespace lyx {
+RGBColor set_backgroundcolor;
+
namespace {
// used when sorting the textclass list.
class less_textclass_avail_desc
// initialize the length validator
bc().addCheckedLineEdit(textLayoutModule->skipLE);
- fontModule = new UiWidget<Ui::FontUi>;
+ // output
+ outputModule = new UiWidget<Ui::OutputUi>;
+
+ connect(outputModule->xetexCB, SIGNAL(clicked()),
+ this, SLOT(change_adaptor()));
+ connect(outputModule->xetexCB, SIGNAL(toggled(bool)),
+ this, SLOT(xetexChanged(bool)));
+ connect(outputModule->defaultFormatCO, SIGNAL(activated(int)),
+ this, SLOT(change_adaptor()));
+
// fonts
+ fontModule = new UiWidget<Ui::FontUi>;
connect(fontModule->fontsRomanCO, SIGNAL(activated(int)),
this, SLOT(change_adaptor()));
connect(fontModule->fontsRomanCO, SIGNAL(activated(int)),
this, SLOT(change_adaptor()));
connect(fontModule->fontOsfCB, SIGNAL(clicked()),
this, SLOT(change_adaptor()));
- connect(fontModule->xetexCB, SIGNAL(clicked()),
- this, SLOT(change_adaptor()));
- connect(fontModule->xetexCB, SIGNAL(toggled(bool)),
- this, SLOT(xetexChanged(bool)));
updateFontlist();
this, SLOT(change_adaptor()));
connect(pageLayoutModule->pagestyleCO, SIGNAL(activated(int)),
this, SLOT(change_adaptor()));
+ connect(pageLayoutModule->backgroundTB, SIGNAL(clicked()),
+ this, SLOT(changeBackgroundColor()));
+ connect(pageLayoutModule->delbackgroundTB, SIGNAL(clicked()),
+ this, SLOT(deleteBackgroundColor()));
pageLayoutModule->pagestyleCO->addItem(qt_("Default"));
pageLayoutModule->pagestyleCO->addItem(qt_("empty"));
docPS->addPanel(floatModule, qt_("Float Placement"));
docPS->addPanel(bulletsModule, qt_("Bullets"));
docPS->addPanel(branchesModule, qt_("Branches"));
+ docPS->addPanel(outputModule, qt_("Output"));
docPS->addPanel(preambleModule, qt_("LaTeX Preamble"));
docPS->setCurrentPanel(qt_("Document Class"));
// FIXME: hack to work around resizing bug in Qt >= 4.2
marginsModule->columnsepUnit->setEnabled(enableColSep);
}
+void GuiDocument::changeBackgroundColor()
+{
+ QColor const & newColor = QColorDialog::getColor(
+ rgb2qcolor(set_backgroundcolor), qApp->focusWidget());
+ if (!newColor.isValid())
+ return;
+ // set the button color
+ pageLayoutModule->backgroundTB->setStyleSheet(
+ colorButtonStyleSheet(newColor));
+ // save color
+ set_backgroundcolor = rgbFromHexName(fromqstr(newColor.name()));
+ changed();
+}
+
+
+void GuiDocument::deleteBackgroundColor()
+{
+ // set the button color back to white
+ pageLayoutModule->backgroundTB->setStyleSheet(
+ colorButtonStyleSheet(QColor(Qt::white)));
+ // save white as the set color
+ set_backgroundcolor = rgbFromHexName("#ffffff");
+ changed();
+}
+
void GuiDocument::xetexChanged(bool xetex)
{
updateFontlist();
+ updateDefaultFormat();
langModule->encodingCO->setEnabled(!xetex &&
!langModule->defaultencodingRB->isChecked());
langModule->defaultencodingRB->setEnabled(!xetex);
langModule->otherencodingRB->setEnabled(!xetex);
-
+
fontModule->fontsDefaultCO->setEnabled(!xetex);
- if (xetex)
- fontModule->fontScCB->setEnabled(false);
+ fontModule->fontsDefaultLA->setEnabled(!xetex);
+ fontModule->cjkFontLE->setEnabled(!xetex);
+ fontModule->cjkFontLA->setEnabled(!xetex);
+ string font;
+ if (!xetex)
+ font = tex_fonts_sans[fontModule->fontsSansCO->currentIndex()];
+ bool scaleable = providesScale(font);
+ fontModule->scaleSansSB->setEnabled(scaleable);
+ fontModule->scaleSansLA->setEnabled(scaleable);
+ if (!xetex)
+ font = tex_fonts_monospaced[fontModule->fontsTypewriterCO->currentIndex()];
+ scaleable = providesScale(font);
+ fontModule->scaleTypewriterSB->setEnabled(scaleable);
+ fontModule->scaleTypewriterLA->setEnabled(scaleable);
+ if (!xetex)
+ font = tex_fonts_roman[fontModule->fontsRomanCO->currentIndex()];
+ fontModule->fontScCB->setEnabled(providesSC(font));
+ fontModule->fontOsfCB->setEnabled(providesOSF(font));
}
fontModule->fontsTypewriterCO->clear();
// With XeTeX, we have access to all system fonts, but not the LaTeX fonts
- if (fontModule->xetexCB->isChecked()) {
+ if (outputModule->xetexCB->isChecked()) {
fontModule->fontsRomanCO->addItem(qt_("Default"));
fontModule->fontsSansCO->addItem(qt_("Default"));
fontModule->fontsTypewriterCO->addItem(qt_("Default"));
void GuiDocument::romanChanged(int item)
{
- if (fontModule->xetexCB->isChecked()) {
- fontModule->fontScCB->setEnabled(false);
+ if (outputModule->xetexCB->isChecked())
return;
- }
string const font = tex_fonts_roman[item];
fontModule->fontScCB->setEnabled(providesSC(font));
fontModule->fontOsfCB->setEnabled(providesOSF(font));
void GuiDocument::sansChanged(int item)
{
- if (fontModule->xetexCB->isChecked()) {
- fontModule->fontScCB->setEnabled(false);
+ if (outputModule->xetexCB->isChecked())
return;
- }
string const font = tex_fonts_sans[item];
bool scaleable = providesScale(font);
fontModule->scaleSansSB->setEnabled(scaleable);
void GuiDocument::ttChanged(int item)
{
- if (fontModule->xetexCB->isChecked()) {
- fontModule->fontScCB->setEnabled(false);
+ if (outputModule->xetexCB->isChecked())
return;
- }
string const font = tex_fonts_monospaced[item];
bool scaleable = providesScale(font);
fontModule->scaleTypewriterSB->setEnabled(scaleable);
}
+void GuiDocument::updateDefaultFormat()
+{
+ // make a copy in order to consider unapplied changes
+ Buffer * tmpbuf = const_cast<Buffer *>(&buffer());
+ tmpbuf->params().useXetex = outputModule->xetexCB->isChecked();
+ int idx = latexModule->classCO->currentIndex();
+ if (idx >= 0) {
+ string const classname = classes_model_.getIDString(idx);
+ tmpbuf->params().setBaseClass(classname);
+ tmpbuf->params().makeDocumentClass();
+ }
+ outputModule->defaultFormatCO->blockSignals(true);
+ outputModule->defaultFormatCO->clear();
+ outputModule->defaultFormatCO->addItem(qt_("Default"),
+ QVariant(QString("default")));
+ typedef vector<Format const *> Formats;
+ Formats formats = tmpbuf->exportableFormats(true);
+ Formats::const_iterator cit = formats.begin();
+ Formats::const_iterator end = formats.end();
+ for (; cit != end; ++cit)
+ outputModule->defaultFormatCO->addItem(qt_((*cit)->prettyname()),
+ QVariant(toqstr((*cit)->name())));
+ outputModule->defaultFormatCO->blockSignals(false);
+}
+
+
void GuiDocument::applyView()
{
// preamble
QString const lang = langModule->languageCO->itemData(
langModule->languageCO->currentIndex()).toString();
- bp_.language = lyx::languages.getLanguage(fromqstr(lang));
+ bp_.language = languages.getLanguage(fromqstr(lang));
// numbering
if (bp_.documentClass().hasTocLevels()) {
bp_.float_placement = floatModule->get();
- // fonts
- bool const xetex = fontModule->xetexCB->isChecked();
+ // output
+ bp_.defaultOutputFormat = fromqstr(outputModule->defaultFormatCO->itemData(
+ outputModule->defaultFormatCO->currentIndex()).toString());
+
+ bool const xetex = outputModule->xetexCB->isChecked();
bp_.useXetex = xetex;
+ // fonts
if (xetex) {
if (fontModule->fontsRomanCO->currentIndex() == 0)
bp_.fontsRoman = "default";
else
bp_.orientation = ORIENTATION_PORTRAIT;
+ bp_.backgroundcolor = set_backgroundcolor;
+
// margins
bp_.use_geometry = !marginsModule->marginCB->isChecked()
|| geom_papersize;
floatModule->set(bp_.float_placement);
+ // Output
+ // update combobox with formats
+ updateDefaultFormat();
+ int index = outputModule->defaultFormatCO->findData(toqstr(
+ bp_.defaultOutputFormat));
+ // set to default if format is not found
+ if (index == -1)
+ index = 0;
+ outputModule->defaultFormatCO->setCurrentIndex(index);
+ outputModule->xetexCB->setEnabled(bp_.baseClass()->outputType() == lyx::LATEX);
+ outputModule->xetexCB->setChecked(
+ bp_.baseClass()->outputType() == lyx::LATEX && bp_.useXetex);
+
// Fonts
updateFontsize(documentClass().opt_fontsize(),
bp_.fontsize);
- fontModule->xetexCB->setChecked(bp_.useXetex);
-
if (bp_.useXetex) {
for (int i = 0; i < fontModule->fontsRomanCO->count(); ++i) {
if (fontModule->fontsRomanCO->itemText(i) == toqstr(bp_.fontsRoman)) {
pageLayoutModule->facingPagesCB->setChecked(
bp_.sides == TwoSides);
+ pageLayoutModule->backgroundTB->setStyleSheet(
+ colorButtonStyleSheet(rgb2qcolor(bp_.backgroundcolor)));
+ set_backgroundcolor = bp_.backgroundcolor;
lengthToWidgets(pageLayoutModule->paperwidthLE,
pageLayoutModule->paperwidthUnitCO, bp_.paperwidth, defaultUnit);
-
lengthToWidgets(pageLayoutModule->paperheightLE,
pageLayoutModule->paperheightUnitCO, bp_.paperheight, defaultUnit);
bool GuiDocument::providesOSF(string const & font) const
{
+ if (outputModule->xetexCB->isChecked())
+ // FIXME: we should check if the fonts really
+ // have OSF support. But how?
+ return true;
if (font == "cmr")
return isFontAvailable("eco");
if (font == "palatino")
bool GuiDocument::providesSC(string const & font) const
{
+ if (outputModule->xetexCB->isChecked())
+ return false;
if (font == "palatino")
return isFontAvailable("mathpazo");
if (font == "utopia")
bool GuiDocument::providesScale(string const & font) const
{
+ if (outputModule->xetexCB->isChecked())
+ return true;
return font == "helvet" || font == "luximono"
|| font == "berasans" || font == "beramono";
}