X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Ffrontends%2Fqt4%2FDialogs.cpp;h=4be491f48dd0b182764ff9f077fea86dbb57cf17;hb=bb5f33e4d919ec25bffdfce44ad583041dbfb40c;hp=e7788db147a0cd7f8b3b846352848334601b3407;hpb=e1ce2f92db49d50c688414a32944be8e718faa2e;p=lyx.git diff --git a/src/frontends/qt4/Dialogs.cpp b/src/frontends/qt4/Dialogs.cpp index e7788db147..4be491f48d 100644 --- a/src/frontends/qt4/Dialogs.cpp +++ b/src/frontends/qt4/Dialogs.cpp @@ -11,14 +11,189 @@ #include #include "Dialogs.h" +#include "Dialog.h" #include using std::string; namespace lyx { + +extern bool quitting; + namespace frontend { +Dialogs::Dialogs(LyXView & lyxview) + : lyxview_(lyxview), in_show_(false) +{} + + +Dialog * Dialogs::find_or_build(string const & name) +{ + if (!isValidName(name)) + return 0; + + std::map::iterator it = + dialogs_.find(name); + + if (it != dialogs_.end()) + return it->second.get(); + + dialogs_[name].reset(build(name)); + return dialogs_[name].get(); +} + + +void Dialogs::show(string const & name, string const & data, Inset * inset) +{ + if (in_show_) + return; + + in_show_ = true; + Dialog * dialog = find_or_build(name); + if (dialog) { + dialog->showData(data); + if (inset) + open_insets_[name] = inset; + } + in_show_ = false; +} + + +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()->isVisibleView(); +} + + +void Dialogs::update(string const & name, string const & data) +{ + std::map::const_iterator it = dialogs_.find(name); + if (it == dialogs_.end()) + return; + + Dialog * const dialog = it->second.get(); + if (dialog->isVisibleView()) + dialog->updateData(data); +} + + +void Dialogs::hide(string const & name, Inset* inset) +{ + // Don't send the signal if we are quitting, because on MSVC it is + // destructed before the cut stack in CutAndPaste.cpp, and this method + // is called from some inset destructor if the cut stack is not empty + // on exit. + if (quitting) + return; + + 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->isVisibleView()) + dialog->hide(); + open_insets_[name] = 0; +} + + +void Dialogs::disconnect(string const & name) +{ + if (!isValidName(name)) + return; + + if (open_insets_.find(name) != open_insets_.end()) + open_insets_[name] = 0; +} + + +Inset * Dialogs::getOpenInset(string const & name) const +{ + if (!isValidName(name)) + return 0; + + std::map::const_iterator it = + open_insets_.find(name); + return it == open_insets_.end() ? 0 : it->second; +} + + +void Dialogs::hideAll() const +{ + std::map::const_iterator it = dialogs_.begin(); + std::map::const_iterator end = dialogs_.end(); + + for(; it != end; ++it) + it->second->hide(); +} + + +void Dialogs::hideBufferDependent() const +{ + std::map::const_iterator it = dialogs_.begin(); + std::map::const_iterator end = dialogs_.end(); + + for(; it != end; ++it) { + Dialog * dialog = it->second.get(); + if (dialog->isBufferDependent()) + dialog->hide(); + } +} + + +void Dialogs::updateBufferDependent(bool switched) const +{ + std::map::const_iterator it = dialogs_.begin(); + std::map::const_iterator end = dialogs_.end(); + + for(; it != end; ++it) { + Dialog * dialog = it->second.get(); + if (switched && dialog->isBufferDependent()) { + if (dialog->isVisibleView() && dialog->initialiseParams("")) + dialog->updateView(); + else + dialog->hide(); + } else { + // A bit clunky, but the dialog will request + // that the kernel provides it with the necessary + // data. + dialog->slotRestore(); + } + } +} + + +void Dialogs::redraw() const +{ + std::map::const_iterator it = dialogs_.begin(); + std::map::const_iterator end = dialogs_.end(); + + for(; it != end; ++it) + 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 && dialog->isVisibleView()) + dialog->checkStatus(); + } +} + + namespace { // This list should be kept in sync with the list of insets in