From e9a272903795310f81d4b51fd10c48d1cd7f0fef Mon Sep 17 00:00:00 2001 From: Bo Peng Date: Fri, 7 Sep 2007 16:33:55 +0000 Subject: [PATCH] Embedding: bring embedding dialog back to shape git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@20129 a592a061-630c-0410-9148-cb99ea01b6c8 --- src/EmbeddedFiles.cpp | 10 +- src/EmbeddedFiles.h | 10 +- .../controllers/ControlEmbeddedFiles.cpp | 20 ++- .../controllers/ControlEmbeddedFiles.h | 8 +- src/frontends/qt4/GuiEmbeddedFiles.cpp | 139 +++++++++++------- src/frontends/qt4/GuiEmbeddedFiles.h | 6 +- src/frontends/qt4/ui/EmbeddedFilesUi.ui | 53 ++++++- 7 files changed, 173 insertions(+), 73 deletions(-) diff --git a/src/EmbeddedFiles.cpp b/src/EmbeddedFiles.cpp index 83531f131f..e67d151141 100644 --- a/src/EmbeddedFiles.cpp +++ b/src/EmbeddedFiles.cpp @@ -139,7 +139,7 @@ bool EmbeddedFile::extract(Buffer const * buf) const } -bool EmbeddedFile::embed(Buffer const * buf) +bool EmbeddedFile::update(Buffer const * buf) const { string ext_file = absFilename(); string emb_file = embeddedFile(buf); @@ -161,17 +161,16 @@ bool EmbeddedFile::embed(Buffer const * buf) if (!fs::is_directory(path)) makedir(const_cast(path.c_str()), 0755); fs::copy_file(ext_file, emb_file, false); - embedded_ = true; } catch (fs::filesystem_error const & fe) { Alert::error(_("Copy file failure"), bformat(_("Cannot copy file %1$s to %2$s.\n" "Please check whether the directory exists and is writeable."), from_utf8(ext_file), from_utf8(emb_file))); LYXERR(Debug::DEBUG) << "Fs error: " << fe.what() << endl; - embedded_ = false; + return false; } } - return embedded_; + return true; } @@ -207,7 +206,8 @@ void EmbeddedFiles::registerFile(string const & filename, // find this filename if (it != file_list_.end()) { it->setParIter(pit); - it->embed(buffer_); + it->update(buffer_); + it->setEmbed(true); it->validate(); return; } diff --git a/src/EmbeddedFiles.h b/src/EmbeddedFiles.h index 9c63c2d8d5..de050c5622 100644 --- a/src/EmbeddedFiles.h +++ b/src/EmbeddedFiles.h @@ -127,6 +127,9 @@ public: /// embedding status of this file bool embedded() const { return embedded_; } + /// set embedding status. update() should be called before this + /// to sync the embedded file with external one. + bool setEmbed(bool embed) { embedded_ = embed; } // A flag indicating whether or not this filename is valid. // When lyx runs, InsetGraphics etc may be added or removed so filename @@ -137,10 +140,11 @@ public: bool valid() const { return valid_; } void validate() { valid_ = true; } void invalidate() { valid_ = false; } - /// + + /// extract file, does not change embedding status bool extract(Buffer const * buf) const; - /// - bool embed(Buffer const * buf); + /// update embedded file from external file, does not change embedding status + bool update(Buffer const * buf) const; private: /// filename in zip file diff --git a/src/frontends/controllers/ControlEmbeddedFiles.cpp b/src/frontends/controllers/ControlEmbeddedFiles.cpp index 674568020b..1ea646cf2a 100644 --- a/src/frontends/controllers/ControlEmbeddedFiles.cpp +++ b/src/frontends/controllers/ControlEmbeddedFiles.cpp @@ -59,10 +59,11 @@ void ControlEmbeddedFiles::updateEmbeddedFiles() } -void ControlEmbeddedFiles::dispatchParams() +void ControlEmbeddedFiles::dispatchMessage(string const & msg) { + // FIXME: the right thing to do? QT guys? // lyx view will only be updated if we do something to the main window. :-) - kernel().dispatch(FuncRequest(LFUN_MESSAGE, message_)); + kernel().dispatch(FuncRequest(LFUN_MESSAGE, msg)); } @@ -82,6 +83,16 @@ void ControlEmbeddedFiles::view(EmbeddedFile const & item) } +void ControlEmbeddedFiles::setEmbed(EmbeddedFile & item, bool embed) +{ + if (embed) + item.update(&kernel().buffer()); + else + item.extract(&kernel().buffer()); + item.setEmbed(embed); +} + + docstring const ControlEmbeddedFiles::browseFile() { std::pair dir1(_("Documents|#o#O"), @@ -99,5 +110,10 @@ bool ControlEmbeddedFiles::extract(EmbeddedFile const & item) } +bool ControlEmbeddedFiles::update(EmbeddedFile const & item) +{ + return item.update(&kernel().buffer()); +} + } // namespace frontend } // namespace lyx diff --git a/src/frontends/controllers/ControlEmbeddedFiles.h b/src/frontends/controllers/ControlEmbeddedFiles.h index e50c98d007..426f42e82d 100644 --- a/src/frontends/controllers/ControlEmbeddedFiles.h +++ b/src/frontends/controllers/ControlEmbeddedFiles.h @@ -40,17 +40,21 @@ public: /// virtual bool canApplyToReadOnly() const { return true; } /// - void setMessage(std::string const & msg) { message_ = msg; } + void dispatchMessage(std::string const & msg); /// - void dispatchParams(); + void dispatchParams() {}; /// void goTo(EmbeddedFile const & item); /// void view(EmbeddedFile const & item); /// + void setEmbed(EmbeddedFile & item, bool embed); + /// docstring const browseFile(); /// bool extract(EmbeddedFile const & item); + /// + bool update(EmbeddedFile const & item); protected: // diff --git a/src/frontends/qt4/GuiEmbeddedFiles.cpp b/src/frontends/qt4/GuiEmbeddedFiles.cpp index 0698e7da8b..886ecde1ce 100644 --- a/src/frontends/qt4/GuiEmbeddedFiles.cpp +++ b/src/frontends/qt4/GuiEmbeddedFiles.cpp @@ -17,10 +17,6 @@ namespace lyx { namespace frontend { -static QString const INVALID_COLOR = "gray"; -static QString const EMBEDDED_COLOR = "black"; -static QString const EXTERNAL_COLOR = "blue"; - GuiEmbeddedFilesDialog::GuiEmbeddedFilesDialog(LyXView & lv) : GuiDialog(lv, "embedding") @@ -44,34 +40,56 @@ ControlEmbeddedFiles & GuiEmbeddedFilesDialog::controller() const } +void GuiEmbeddedFilesDialog::on_filesLW_itemChanged(QListWidgetItem* item) +{ + EmbeddedFiles & files = controller().embeddedFiles(); + if (item->checkState() == Qt::Checked) { + controller().setEmbed(files[filesLW->row(item)], true); + controller().dispatchMessage("Embed file " + fromqstr(item->text())); + } else { + controller().setEmbed(files[filesLW->row(item)], false); + controller().dispatchMessage("Stop embedding file " + fromqstr(item->text())); + } +} + + void GuiEmbeddedFilesDialog::on_filesLW_itemSelectionChanged() { EmbeddedFiles & files = controller().embeddedFiles(); QList selection = filesLW->selectedItems(); + if (selection.empty()) { + fullpathLE->setEnabled(false); + selectPB->setEnabled(false); + unselectPB->setEnabled(false); + extractPB->setEnabled(false); + updatePB->setEnabled(false); + return; + } + fullpathLE->setEnabled(selection.size() == 1); - // try to find a common mode, otherwise return NONE. + // try to find a common embedding status QList::iterator it = selection.begin(); QList::iterator it_end = selection.end(); // if the selection is not empty if (it != it_end) { int idx = filesLW->row(*it); fullpathLE->setText(toqstr(files[idx].absFilename())); - // go to the first selected item controller().goTo(files[idx]); } - - bool mode = false; + // are the items all selected or unselected? + bool hasSelected = false; + bool hasUnselected = false; for (; it != it_end; ++it) { - int idx = filesLW->row(*it); - if (mode) { - mode = true; - continue; - } + if ((*it)->checkState() == Qt::Checked) + hasSelected = true; + else + hasUnselected = true; } - + selectPB->setEnabled(hasUnselected); + unselectPB->setEnabled(hasSelected); } @@ -86,25 +104,48 @@ void GuiEmbeddedFilesDialog::on_filesLW_itemDoubleClicked() void GuiEmbeddedFilesDialog::updateView() { filesLW->clear(); - // EmbeddedFiles const & files = controller().embeddedFiles(); EmbeddedFiles::EmbeddedFileList::const_iterator it = files.begin(); EmbeddedFiles::EmbeddedFileList::const_iterator it_end = files.end(); for (; it != it_end; ++it) { QListWidgetItem * item = new QListWidgetItem(toqstr(it->inzipName())); - if (!it->valid()) - item->setTextColor(INVALID_COLOR); - else if(it->embedded()) - item->setTextColor(EMBEDDED_COLOR); + Qt::ItemFlags flag = Qt::ItemIsUserCheckable | Qt::ItemIsSelectable; + if (it->valid()) + flag |= Qt::ItemIsEnabled; + item->setFlags(flag); + if(it->embedded()) + item->setCheckState(Qt::Checked); else - item->setTextColor(EXTERNAL_COLOR); + item->setCheckState(Qt::Unchecked); filesLW->addItem(item); } - // - bool enabled = files.enabled(); - enableCB->setChecked(enabled); - fullpathLE->setEnabled(enabled); +} + + +void GuiEmbeddedFilesDialog::on_selectPB_clicked() +{ + EmbeddedFiles & files = controller().embeddedFiles(); + QList selection = filesLW->selectedItems(); + for (QList::iterator it = selection.begin(); + it != selection.end(); ++it) { + (*it)->setCheckState(Qt::Checked); + controller().setEmbed(files[filesLW->row(*it)], true); + } + controller().dispatchMessage("Embedding files"); +} + + +void GuiEmbeddedFilesDialog::on_unselectPB_clicked() +{ + EmbeddedFiles & files = controller().embeddedFiles(); + QList selection = filesLW->selectedItems(); + for (QList::iterator it = selection.begin(); + it != selection.end(); ++it) { + (*it)->setCheckState(Qt::Checked); + controller().setEmbed(files[filesLW->row(*it)], false); + } + controller().dispatchMessage("Stop embedding files"); } @@ -114,7 +155,8 @@ void GuiEmbeddedFilesDialog::on_addPB_clicked() if (!file.empty()) { EmbeddedFiles & files = controller().embeddedFiles(); files.registerFile(to_utf8(file), true); - } + } + controller().dispatchMessage("Add an embedded file"); } @@ -125,46 +167,33 @@ void GuiEmbeddedFilesDialog::on_extractPB_clicked() for (QList::iterator it = selection.begin(); it != selection.end(); ++it) controller().extract(files[filesLW->row(*it)]); + // FIXME: collect extraction status and display a dialog + controller().dispatchMessage("Extract embedded files"); +} + + +void GuiEmbeddedFilesDialog::on_updatePB_clicked() +{ + EmbeddedFiles const & files = controller().embeddedFiles(); + QList selection = filesLW->selectedItems(); + for (QList::iterator it = selection.begin(); + it != selection.end(); ++it) + controller().update(files[filesLW->row(*it)]); + // FIXME: collect update status and display a dialog + controller().dispatchMessage("Update embedded files from external file"); } + void GuiEmbeddedFilesDialog::on_enableCB_toggled(bool enable) { - // FIXME: - // - // When a embedded file is turned to disabled, it should save its - // embedded files. Otherwise, embedded files will be lost!!! // controller().embeddedFiles().enable(enable); // immediately post the change to buffer (and bufferView) if (enable) - controller().setMessage("Enable file embedding"); - else - controller().setMessage("Disable file embedding"); - // update bufferView - controller().dispatchParams(); -} - - -void GuiEmbeddedFilesDialog::set_embedding_status(bool embed) -{ - EmbeddedFiles & files = controller().embeddedFiles(); - QList selection = filesLW->selectedItems(); - for (QList::iterator it = selection.begin(); - it != selection.end(); ++it) { - int row = filesLW->row(*it); - // FIXME: mark buffer dirty - if(embed) - (*it)->setTextColor(EMBEDDED_COLOR); - else - (*it)->setTextColor(EXTERNAL_COLOR); - } - if (embed) - controller().setMessage("Embed file"); + controller().dispatchMessage("Enable file embedding"); else - controller().setMessage("Extract file"); - // update bufferView - controller().dispatchParams(); + controller().dispatchMessage("Disable file embedding"); } diff --git a/src/frontends/qt4/GuiEmbeddedFiles.h b/src/frontends/qt4/GuiEmbeddedFiles.h index 3d98d8f485..44cc425082 100644 --- a/src/frontends/qt4/GuiEmbeddedFiles.h +++ b/src/frontends/qt4/GuiEmbeddedFiles.h @@ -29,17 +29,19 @@ public: public Q_SLOTS: /// + void on_filesLW_itemChanged(QListWidgetItem* item); void on_filesLW_itemSelectionChanged(); - /// void on_filesLW_itemDoubleClicked(); /// void updateView(); /// void on_enableCB_toggled(bool enable); /// + void on_selectPB_clicked(); + void on_unselectPB_clicked(); void on_addPB_clicked(); - // void on_extractPB_clicked(); + void on_updatePB_clicked(); private: ControlEmbeddedFiles & controller() const; diff --git a/src/frontends/qt4/ui/EmbeddedFilesUi.ui b/src/frontends/qt4/ui/EmbeddedFilesUi.ui index bcf320acc8..4eb5e0d84e 100644 --- a/src/frontends/qt4/ui/EmbeddedFilesUi.ui +++ b/src/frontends/qt4/ui/EmbeddedFilesUi.ui @@ -8,7 +8,7 @@ 0 0 - 145 + 199 390 @@ -25,7 +25,14 @@ - Enable embedding + Save file in bundled format + + + + + + + Embedding status @@ -60,6 +67,44 @@ 6 + + + + Embed selected files + + + ... + + + ../../../../lib/images/tabular-feature_set-all-lines.png + + + + 20 + 20 + + + + + + + + Do not embed selected files + + + ... + + + ../../../../lib/images/tabular-feature_set-all-lines.png + + + + 20 + 20 + + + + @@ -82,7 +127,7 @@ - Extract selected file. + Extract selected file, without changing embedding status. ... @@ -107,7 +152,7 @@ ... - ../../../../lib/images/copy.png + ../../../../lib/images/depth-decrement.png -- 2.39.5