X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Ffrontends%2FDialogs.C;h=5ea2ef5ad3347dea7fa529b244aa8345e074ac29;hb=e7fc677261bd14fdf159e594fcf422e985c72664;hp=dbc2aa8746b583c4e944a5be1ff29abbb0dddfe1;hpb=5ec0a44b097eaed7fa747e4318cadfcc08f5910d;p=lyx.git diff --git a/src/frontends/Dialogs.C b/src/frontends/Dialogs.C index dbc2aa8746..5ea2ef5ad3 100644 --- a/src/frontends/Dialogs.C +++ b/src/frontends/Dialogs.C @@ -2,9 +2,10 @@ * \file frontends/Dialogs.C * This file is part of LyX, the document processor. * Licence details can be found in the file COPYING. + * * \author Angus Leeming * - * Full author contact details are available in file CREDITS + * Full author contact details are available in file CREDITS. * * Common to all frontends' Dialogs */ @@ -12,11 +13,17 @@ #include #include "Dialogs.h" + #include "controllers/Dialog.h" -#include "controllers/ButtonControllerBase.h" + +#include #include +using std::string; +using lyx::frontend::Dialog; + + // Note that static boost signals break some compilers, so this wrapper // initialises the signal dynamically when it is first invoked. template @@ -37,28 +44,36 @@ private: }; -boost::signal0 & Dialogs::redrawGUI() +boost::signal & Dialogs::redrawGUI() { - static BugfixSignal > thesignal; + static BugfixSignal > thesignal; return thesignal(); } +namespace { + +BugfixSignal > hideSignal; + +} + + +void Dialogs::hide(string const & name, InsetBase* inset) +{ + hideSignal()(name, inset); +} + + Dialogs::Dialogs(LyXView & lyxview) - : lyxview_(lyxview) + : lyxview_(lyxview), in_show_(false) { // Connect signals redrawGUI().connect(boost::bind(&Dialogs::redraw, this)); - - // All this is slated to go - init_pimpl(); - // reduce the number of connections needed in - // dialogs by a simple connection here. - hideAllSignal.connect(hideBufferDependentSignal); + hideSignal().connect(boost::bind(&Dialogs::hideSlot, this, _1, _2)); } -Dialog * Dialogs::find(string const & name) +Dialog * Dialogs::find_or_build(string const & name) { if (!isValidName(name)) return 0; @@ -66,53 +81,79 @@ Dialog * Dialogs::find(string const & name) std::map::iterator it = dialogs_.find(name); - if (it == dialogs_.end()) { - dialogs_[name] = DialogPtr(build(name)); - return dialogs_[name].get(); - } + if (it != dialogs_.end()) + return it->second.get(); - return it->second.get(); + dialogs_[name] = build(name); + return dialogs_[name].get(); } -void Dialogs::show(string const & name) +void Dialogs::show(string const & name, string const & data) { - Dialog * dialog = find(name); - if (!dialog) + if (in_show_) { return; - - dialog->show(); + } + in_show_ = true; + Dialog * dialog = find_or_build(name); + if (dialog) { + // FIXME! Should check that the dialog is NOT an inset dialog. + dialog->show(data); + } + in_show_ = false; } void Dialogs::show(string const & name, string const & data, InsetBase * inset) { - Dialog * dialog = find(name); - if (!dialog) + if (in_show_) { return; + } + in_show_ = true; + Dialog * dialog = find_or_build(name); + if (dialog) { + // FIXME! Should check that the dialog IS an inset dialog. + dialog->show(data); + open_insets_[name] = inset; + } + in_show_ = false; +} - dialog->show(data); - open_insets_[name] = inset; + +bool Dialogs::visible(string const & name) const +{ + std::map::const_iterator it = + dialogs_.find(name); + if (it == dialogs_.end()) + return false; + return it->second.get()->isVisible(); } void Dialogs::update(string const & name, string const & data) { - Dialog * dialog = find(name); - if (!dialog) + std::map::const_iterator it = + dialogs_.find(name); + if (it == dialogs_.end()) return; + Dialog * const dialog = it->second.get(); if (dialog->isVisible()) dialog->update(data); } -void Dialogs::hide(string const & name) +void Dialogs::hideSlot(string const & name, InsetBase * inset) { - Dialog * dialog = find(name); - if (!dialog) + std::map::const_iterator it = + dialogs_.find(name); + if (it == dialogs_.end()) + return; + + if (inset && inset != getOpenInset(name)) return; + Dialog * const dialog = it->second.get(); if (dialog->isVisible()) dialog->hide(); open_insets_[name] = 0; @@ -147,7 +188,6 @@ void Dialogs::hideAll() const for(; it != end; ++it) { it->second->hide(); } - hideAllSignal(); } @@ -161,7 +201,6 @@ void Dialogs::hideBufferDependent() const if (dialog->controller().isBufferDependent()) dialog->hide(); } - hideBufferDependentSignal(); } @@ -181,7 +220,6 @@ void Dialogs::updateBufferDependent(bool switched) const dialog->RestoreButton(); } } - updateBufferDependentSignal(switched); } @@ -194,3 +232,16 @@ void Dialogs::redraw() const it->second->redraw(); } } + + +void Dialogs::checkStatus() +{ + std::map::const_iterator it = dialogs_.begin(); + std::map::const_iterator end = dialogs_.end(); + + for(; it != end; ++it) { + Dialog * const dialog = it->second.get(); + if (dialog->isVisible()) + dialog->checkStatus(); + } +}