X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Ffrontends%2Fqt4%2FGuiParagraph.cpp;h=6cad13767308076f0881beec28e7ee244d43d5a6;hb=425d092204118ea6c24c28e85fdf03fcf2bb51a4;hp=55704b0f04704cb55066ce76430f4362ef390959;hpb=9358073e145884e45ff4cfa9f68e8ffcde415fef;p=lyx.git diff --git a/src/frontends/qt4/GuiParagraph.cpp b/src/frontends/qt4/GuiParagraph.cpp index 55704b0f04..6cad137673 100644 --- a/src/frontends/qt4/GuiParagraph.cpp +++ b/src/frontends/qt4/GuiParagraph.cpp @@ -6,6 +6,7 @@ * \author Edwin Leuven * \author Richard Heck * \author Abdelrazak Younes + * \author Angus Leeming * * Full author contact details are available in file CREDITS. */ @@ -13,34 +14,40 @@ #include #include "GuiParagraph.h" -#include "qt_helpers.h" -#include "ControlParagraph.h" +#include "qt_helpers.h" -#include "debug.h" -#include "frontend_helpers.h" -#include "gettext.h" +#include "Buffer.h" +#include "BufferParams.h" +#include "BufferView.h" +#include "Cursor.h" +#include "FuncRequest.h" +#include "GuiView.h" +#include "Lexer.h" +#include "Paragraph.h" #include "ParagraphParameters.h" #include "Spacing.h" +#include "support/debug.h" +#include "support/gettext.h" + #include -#include #include #include +#include +#include -#include +#include -using std::string; -using std::endl; +using namespace std; namespace lyx { namespace frontend { -GuiParagraph::GuiParagraph(ControlParagraph & controller, QWidget * parent) - : QWidget(parent), controller_(controller) +GuiParagraph::GuiParagraph(GuiView & lv) + : DialogView(lv, "paragraph", qt_("Paragraph Settings")) { setupUi(this); - setWindowTitle(qt_("Paragraph Settings")); connect(alignDefaultRB, SIGNAL(clicked()), this, SLOT(changed())); connect(alignJustRB, SIGNAL(clicked()), this, SLOT(changed())); @@ -48,18 +55,26 @@ GuiParagraph::GuiParagraph(ControlParagraph & controller, QWidget * parent) connect(alignRightRB, SIGNAL(clicked()), this, SLOT(changed())); connect(alignCenterRB, SIGNAL(clicked()), this, SLOT(changed())); connect(linespacing, SIGNAL(activated(int)), this, SLOT(changed())); - connect(linespacingValue, SIGNAL(textChanged(const QString &)), + connect(linespacingValue, SIGNAL(textChanged(QString)), this, SLOT(changed())); connect(indentCB, SIGNAL(clicked()), this, SLOT(changed())); - connect(labelWidth, SIGNAL(textChanged(const QString &)), + connect(labelWidth, SIGNAL(textChanged(QString)), this, SLOT(changed())); - +#ifdef Q_WS_MACX + // On Mac it's common to have tool windows which are always in the + // foreground and are hidden when the main window is not focused. + setWindowFlags(Qt::Tool); + synchronizedViewCB->setChecked(true); + closePB->setText(qt_("&Cancel")); +#else synchronizedViewCB->setChecked(false); +#endif + on_synchronizedViewCB_toggled(); linespacingValue->setValidator(new QDoubleValidator(linespacingValue)); - labelWidth->setWhatsThis( qt_( + labelWidth->setWhatsThis(qt_( "As described in the User Guide, the width of" " this text determines the width of the label part" " of each item in environments like List and" @@ -70,13 +85,13 @@ GuiParagraph::GuiParagraph(ControlParagraph & controller, QWidget * parent) " items is used." )); - radioMap[LYX_ALIGN_LAYOUT] = alignDefaultRB; - radioMap[LYX_ALIGN_BLOCK] = alignJustRB; - radioMap[LYX_ALIGN_LEFT] = alignLeftRB; - radioMap[LYX_ALIGN_RIGHT] = alignRightRB; - radioMap[LYX_ALIGN_CENTER] = alignCenterRB; + radioMap_[LYX_ALIGN_LAYOUT] = alignDefaultRB; + radioMap_[LYX_ALIGN_BLOCK] = alignJustRB; + radioMap_[LYX_ALIGN_LEFT] = alignLeftRB; + radioMap_[LYX_ALIGN_RIGHT] = alignRightRB; + radioMap_[LYX_ALIGN_CENTER] = alignCenterRB; - const_cast(alignDefaultLabel) = alignDefaultRB->text(); + alignDefaultLabel_ = alignDefaultRB->text(); } @@ -86,28 +101,33 @@ void GuiParagraph::on_linespacing_activated(int index) } -void GuiParagraph::checkAlignmentRadioButtons() { - LyXAlignment const alignPossible = controller_.alignPossible(); +void GuiParagraph::checkAlignmentRadioButtons() +{ + static std::map labelMap_; + if (labelMap_.empty()) { + labelMap_[LYX_ALIGN_BLOCK] = qt_("Justified"); + labelMap_[LYX_ALIGN_LEFT] = qt_("Left"); + labelMap_[LYX_ALIGN_RIGHT] = qt_("Right"); + labelMap_[LYX_ALIGN_CENTER] = qt_("Center"); + } - RadioMap::iterator it = radioMap.begin(); - for (; it != radioMap.end(); ++it) { + RadioMap::iterator it = radioMap_.begin(); + for (; it != radioMap_.end(); ++it) { LyXAlignment const align = it->first; - it->second->setEnabled(align & alignPossible); + it->second->setEnabled(align & alignPossible()); } - if (controller_.haveMulitParSelection()) - alignDefaultRB->setText(alignDefaultLabel); + if (haveMultiParSelection()) + alignDefaultRB->setText(alignDefaultLabel_); else - alignDefaultRB->setText(alignDefaultLabel + " (" - + radioMap[controller_.alignDefault()]->text() + ")"); + alignDefaultRB->setText(alignDefaultLabel_ + " (" + + labelMap_[alignDefault()] + ")"); } void GuiParagraph::alignmentToRadioButtons(LyXAlignment align) { - RadioMap::const_iterator it = radioMap.begin(); - for (;it != radioMap.end(); ++it) { - if (!it->second->isEnabled()) - continue; + RadioMap::const_iterator it = radioMap_.begin(); + for (;it != radioMap_.end(); ++it) { it->second->blockSignals(true); it->second->setChecked(align == it->first); it->second->blockSignals(false); @@ -115,11 +135,11 @@ void GuiParagraph::alignmentToRadioButtons(LyXAlignment align) } -LyXAlignment GuiParagraph::getAlignmentFromDialog() +LyXAlignment GuiParagraph::getAlignmentFromDialog() const { LyXAlignment alignment = LYX_ALIGN_NONE; - RadioMap::const_iterator it = radioMap.begin(); - for (; it != radioMap.end(); ++it) { + RadioMap::const_iterator it = radioMap_.begin(); + for (; it != radioMap_.end(); ++it) { if (it->second->isChecked()) { alignment = it->first; break; @@ -134,6 +154,11 @@ void GuiParagraph::on_synchronizedViewCB_toggled() bool in_sync = synchronizedViewCB->isChecked(); restorePB->setEnabled(!in_sync); applyPB->setEnabled(!in_sync); + okPB->setEnabled(!in_sync); + if (!in_sync) + closePB->setText(qt_("&Cancel")); + else + closePB->setText(qt_("&Close")); } @@ -146,9 +171,34 @@ void GuiParagraph::changed() void GuiParagraph::on_applyPB_clicked() { - ParagraphParameters & params = controller_.params(); + applyView(); +} + + +void GuiParagraph::on_okPB_clicked() +{ + applyView(); + hide(); +} + + +void GuiParagraph::on_closePB_clicked() +{ + hide(); +} + + +void GuiParagraph::on_restorePB_clicked() +{ + updateView(); +} + + +void GuiParagraph::applyView() +{ + params_ = params(); - params.align(getAlignmentFromDialog()); + params_.align(getAlignmentFromDialog()); // get spacing Spacing::Space ls = Spacing::Default; @@ -168,25 +218,19 @@ void GuiParagraph::on_applyPB_clicked() break; case 4: ls = Spacing::Other; - other = fromqstr(linespacingValue->text()); + other = widgetToDoubleStr(linespacingValue); break; } Spacing const spacing(ls, other); - params.spacing(spacing); + params_.spacing(spacing); // label width - params.labelWidthString(qstring_to_ucs4(labelWidth->text())); + params_.labelWidthString(qstring_to_ucs4(labelWidth->text())); // indendation - params.noindent(!indentCB->isChecked()); + params_.noindent(!indentCB->isChecked()); - controller_.dispatchParams(); -} - - -void GuiParagraph::on_restorePB_clicked() -{ - updateView(); + dispatchParams(); } @@ -194,31 +238,30 @@ void GuiParagraph::updateView() { on_synchronizedViewCB_toggled(); - ParagraphParameters const & params = controller_.params(); + ParagraphParameters const & pp = params(); // label width - docstring const & labelwidth = params.labelWidthString(); - // FIXME We should not compare translated strings - if (labelwidth != _("Senseless with this layout!")) { + docstring const & labelwidth = pp.labelWidthString(); + if (hasLabelwidth()) { labelwidthGB->setEnabled(true); labelWidth->setText(toqstr(labelwidth)); } else { labelwidthGB->setEnabled(false); - labelWidth->setText(""); + labelWidth->setText(QString()); } // alignment checkAlignmentRadioButtons(); - alignmentToRadioButtons(params.align()); + alignmentToRadioButtons(pp.align()); //indentation - bool const canindent = controller_.canIndent(); + bool const canindent = canIndent(); indentCB->setEnabled(canindent); - indentCB->setChecked(canindent && !params.noindent()); + indentCB->setChecked(canindent && !pp.noindent()); // linespacing int ls; - Spacing const & space = params.spacing(); + Spacing const & space = pp.spacing(); switch (space.getSpace()) { case Spacing::Single: ls = 1; @@ -238,7 +281,7 @@ void GuiParagraph::updateView() } linespacing->setCurrentIndex(ls); if (space.getSpace() == Spacing::Other) { - linespacingValue->setText(toqstr(space.getValueAsString())); + doubleToWidget(linespacingValue, space.getValue()); linespacingValue->setEnabled(true); } else { linespacingValue->setText(QString()); @@ -247,19 +290,101 @@ void GuiParagraph::updateView() } -Dialog * createGuiParagraph(LyXView & lv) +void GuiParagraph::enableView(bool enable) { - GuiViewBase & guiview = static_cast(lv); -#ifdef USE_DOCK_WIDGET - return new DockView(guiview, name, - Qt::TopDockWidgetArea); -#else - return new DialogView(guiview, name); -#endif + indentCB->setEnabled(enable); + linespacing->setEnabled(enable); + labelWidth->setEnabled(enable); + synchronizedViewCB->setEnabled(enable); + applyPB->setEnabled(enable); + restorePB->setEnabled(enable); + if (!enable) + synchronizedViewCB->setChecked(true); + RadioMap::const_iterator it = radioMap_.begin(); + for (; it != radioMap_.end(); ++it) + it->second->setEnabled(enable); +} + + +ParagraphParameters const & GuiParagraph::params() const +{ + if (haveMultiParSelection()) { + // FIXME: in case of multi-paragraph selection, it would be nice to + // initialise the parameters that are common to all paragraphs. + static ParagraphParameters empty; + return empty; + } + return bufferview()->cursor().innerParagraph().params(); +} + + +void GuiParagraph::dispatchParams() +{ + ostringstream data; + params_.write(data); + FuncRequest const fr(getLfun(), data.str()); + dispatch(fr); +} + + +bool GuiParagraph::haveMultiParSelection() const +{ + Cursor const & cur = bufferview()->cursor(); + return cur.selection() && cur.selBegin().pit() != cur.selEnd().pit(); +} + + +bool GuiParagraph::canIndent() const +{ + return buffer().params().paragraph_separation + == BufferParams::ParagraphIndentSeparation; +} + + +LyXAlignment GuiParagraph::alignPossible() const +{ + return bufferview()->cursor().innerParagraph().layout().alignpossible; +} + + +LyXAlignment GuiParagraph::alignDefault() const +{ + return bufferview()->cursor().innerParagraph().layout().align; +} + + +bool GuiParagraph::hasLabelwidth() const +{ + Layout layout = bufferview()->cursor().innerParagraph().layout(); + return (layout.margintype == MARGIN_MANUAL + || layout.latextype == LATEX_BIB_ENVIRONMENT); +} + + +void GuiParagraph::saveSession() const +{ + Dialog::saveSession(); + QSettings settings; + settings.setValue(sessionKey() + "/autoapply", synchronizedViewCB->isChecked()); +} + + +void GuiParagraph::restoreSession() +{ + Dialog::restoreSession(); + QSettings settings; + synchronizedViewCB->setChecked( + settings.value(sessionKey() + "/autoapply").toBool()); +} + + +Dialog * createGuiParagraph(GuiView & lv) +{ + return new GuiParagraph(lv); } } // namespace frontend } // namespace lyx -#include "GuiParagraph_moc.cpp" +#include "moc_GuiParagraph.cpp"