X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Ffrontends%2Fqt4%2FGuiView.cpp;h=225033b10a332ceb3f9a832fee6db4ee2185d37f;hb=d57f66022c7159fff6a5c63fabe4dcde80ad7ef3;hp=1344d4f0045a17bd28c38f38acf810b1b763b379;hpb=3d08e8295764715b14abbe7519f5673a6a0e0924;p=lyx.git diff --git a/src/frontends/qt4/GuiView.cpp b/src/frontends/qt4/GuiView.cpp index 1344d4f004..225033b10a 100644 --- a/src/frontends/qt4/GuiView.cpp +++ b/src/frontends/qt4/GuiView.cpp @@ -88,9 +88,11 @@ #include #include #include +#include #include #include #include +#include #include #include #include @@ -134,6 +136,11 @@ using namespace std; using namespace lyx::support; namespace lyx { + +using support::addExtension; +using support::changeExtension; +using support::removeExtension; + namespace frontend { namespace { @@ -158,9 +165,8 @@ public: font.setStyleHint(QFont::SansSerif); font.setWeight(QFont::Bold); font.setPointSize(int(toqstr(lyxrc.font_sizes[FONT_SIZE_LARGE]).toDouble())); - int width = QFontMetrics(font).width(text); pain.setFont(font); - pain.drawText(397 - width, 15, text); + pain.drawText(190, 225, text); setFocusPolicy(Qt::StrongFocus); } @@ -205,10 +211,23 @@ struct GuiView::GuiViewPrivate in_show_(false) { // hardcode here the platform specific icon size - smallIconSize = 14; // scaling problems - normalIconSize = 20; // ok, default + smallIconSize = 16; // scaling problems + normalIconSize = 20; // ok, default if iconsize.png is missing bigIconSize = 26; // better for some math icons + // if it exists, use width of iconsize.png as normal size + QString const dir = toqstr(addPath("images", lyxrc.icon_set)); + FileName const fn = lyx::libFileSearch(dir, "iconsize.png"); + if (!fn.empty()) { + QImage image(toqstr(fn.absFileName())); + if (image.width() < int(smallIconSize)) + normalIconSize = smallIconSize; + else if (image.width() > int(bigIconSize)) + normalIconSize = bigIconSize; + else + normalIconSize = image.width(); + } + splitter_ = new QSplitter; bg_widget_ = new BackgroundWidget; stack_widget_ = new QStackedWidget; @@ -388,9 +407,6 @@ public: bool (Buffer::*syncFunc)(string const &, bool, bool) const, bool (Buffer::*previewFunc)(string const &, bool) const); - QTimer processing_cursor_timer_; - bool indicates_processing_; - QMap orig_cursors_; QVector guiWorkAreas(); }; @@ -441,18 +457,33 @@ GuiView::GuiView(int id) // For Drag&Drop. setAcceptDrops(true); +#if (QT_VERSION >= 0x040400) + + // add busy indicator to statusbar + QLabel * busylabel = new QLabel(statusBar()); + statusBar()->addPermanentWidget(busylabel); + QString fn = toqstr(lyx::libFileSearch("images", "busy.gif").absFileName()); + QMovie * busyanim = new QMovie(fn, QByteArray(), busylabel); + busylabel->setMovie(busyanim); + busyanim->start(); + busylabel->hide(); + + connect(&d.processing_thread_watcher_, SIGNAL(started()), + busylabel, SLOT(show())); + connect(&d.processing_thread_watcher_, SIGNAL(finished()), + busylabel, SLOT(hide())); + statusBar()->setSizeGripEnabled(true); updateStatusBar(); -#if (QT_VERSION >= 0x040400) connect(&d.autosave_watcher_, SIGNAL(finished()), this, SLOT(autoSaveThreadFinished())); + + connect(&d.processing_thread_watcher_, SIGNAL(started()), this, + SLOT(processingThreadStarted())); connect(&d.processing_thread_watcher_, SIGNAL(finished()), this, SLOT(processingThreadFinished())); - d.processing_cursor_timer_.setInterval(1000 * 3); - connect(&d.processing_cursor_timer_, SIGNAL(timeout()), this, - SLOT(indicateProcessing())); #endif connect(this, SIGNAL(triggerShowDialog(QString const &, QString const &, Inset *)), @@ -498,53 +529,9 @@ QVector GuiView::GuiViewPrivate::guiWorkAreas() #if QT_VERSION >= 0x040400 -void GuiView::setCursorShapes(Qt::CursorShape shape) -{ - QVector areas = d.guiWorkAreas(); - Q_FOREACH(GuiWorkArea* wa, areas) { - wa->setCursorShape(shape); - } -} - - -void GuiView::restoreCursorShapes() -{ - QVector areas = d.guiWorkAreas(); - Q_FOREACH(GuiWorkArea* wa, areas) { - if (d.orig_cursors_.contains(wa)) { - wa->setCursorShape(d.orig_cursors_[wa]); - } - } -} - - -void GuiView::saveCursorShapes() -{ - d.orig_cursors_.clear(); - QVector areas = d.guiWorkAreas(); - Q_FOREACH(GuiWorkArea* wa, areas) { - d.orig_cursors_[wa] = wa->cursorShape(); - } -} - - -void GuiView::indicateProcessing() -{ - if (d.indicates_processing_) { - restoreCursorShapes(); - } else { - setCursorShapes(Qt::BusyCursor); - } - d.indicates_processing_ = !d.indicates_processing_; -} - void GuiView::processingThreadStarted() { - saveCursorShapes(); - d.indicates_processing_ = false; - indicateProcessing(); - d.processing_cursor_timer_.start(); } @@ -555,18 +542,22 @@ void GuiView::processingThreadFinished(bool show_errors) message(watcher->result()); updateToolbars(); if (show_errors) { + BufferView const * const bv = currentBufferView(); + if (bv && !bv->buffer().errorList("Export").empty()) { + errors("Export"); + return; + } errors(d.last_export_format); } - d.processing_cursor_timer_.stop(); - restoreCursorShapes(); - d.indicates_processing_ = false; } + void GuiView::processingThreadFinished() { processingThreadFinished(true); } + void GuiView::autoSaveThreadFinished() { processingThreadFinished(false); @@ -574,25 +565,6 @@ void GuiView::autoSaveThreadFinished() #else -void GuiView::setCursorShapes(Qt::CursorShape) -{ -} - - -void GuiView::restoreCursorShapes() -{ -} - - -void GuiView::saveCursorShapes() -{ -} - - -void GuiView::indicateProcessing() -{ -} - void GuiView::processingThreadStarted() { @@ -654,7 +626,16 @@ bool GuiView::restoreLayout() return false; //code below is skipped when when ~/.config/LyX is (re)created - setIconSize(settings.value(icon_key).toSize()); + QSize icon_size = settings.value(icon_key).toSize(); + // Check whether session size changed. + if (icon_size.width() != int(d.smallIconSize) && + icon_size.width() != int(d.normalIconSize) && + icon_size.width() != int(d.bigIconSize)) { + icon_size.setWidth(d.normalIconSize); + icon_size.setHeight(d.normalIconSize); + } + setIconSize(icon_size); + #ifdef Q_WS_X11 QPoint pos = settings.value("pos", QPoint(50, 50)).toPoint(); QSize size = settings.value("size", QSize(690, 510)).toSize(); @@ -795,10 +776,10 @@ void GuiView::focusInEvent(QFocusEvent * e) QMainWindow::focusInEvent(e); // Make sure guiApp points to the correct view. guiApp->setCurrentView(this); - if (currentMainWorkArea()) - currentMainWorkArea()->setFocus(); - else if (currentWorkArea()) + if (currentWorkArea()) currentWorkArea()->setFocus(); + else if (currentMainWorkArea()) + currentMainWorkArea()->setFocus(); else d.bg_widget_->setFocus(); } @@ -916,7 +897,7 @@ void GuiView::dropEvent(QDropEvent * event) = theConverters().importableFormats(); vector::const_iterator it = import_formats.begin(); for (; it != import_formats.end(); ++it) - if ((*it)->extension() == ext) + if ((*it)->hasExtension(ext)) found_formats.push_back(*it); FuncRequest cmd; @@ -1192,7 +1173,9 @@ void GuiView::setBusy(bool busy) return; if (d.current_work_area_) { - d.current_work_area_->setUpdatesEnabled(!busy); + //Why would we want to stop updates only for one workarea and + //not for the others ? This leads to problems as in #7314 (vfr). + //d.current_work_area_->setUpdatesEnabled(!busy); if (busy) d.current_work_area_->stopBlinkingCursor(); else @@ -1410,11 +1393,12 @@ void GuiView::setBuffer(Buffer * newBuffer) { LYXERR(Debug::DEBUG, "Setting buffer: " << newBuffer << endl); LASSERT(newBuffer, return); - setBusy(true); - + GuiWorkArea * wa = workArea(*newBuffer); if (wa == 0) { + setBusy(true); newBuffer->masterBuffer()->updateBuffer(); + setBusy(false); wa = addWorkArea(*newBuffer); // scroll to the position when the BufferView was last closed if (lyxrc.use_lastfilepos) { @@ -1429,8 +1413,6 @@ void GuiView::setBuffer(Buffer * newBuffer) connectBuffer(*newBuffer); connectBufferView(wa->bufferView()); setCurrentWorkArea(wa); - - setBusy(false); } @@ -1466,9 +1448,20 @@ void GuiView::errors(string const & error_type, bool from_master) if (!bv) return; - ErrorList & el = from_master ? +#if EXPORT_in_THREAD && (QT_VERSION >= 0x040400) + // We are called with from_master == false by default, so we + // have to figure out whether that is the case or not. + ErrorList & el = bv->buffer().errorList(error_type); + if (el.empty()) { + el = bv->buffer().masterBuffer()->errorList(error_type); + from_master = true; + } +#else + ErrorList const & el = from_master ? bv->buffer().masterBuffer()->errorList(error_type) : bv->buffer().errorList(error_type); +#endif + if (el.empty()) return; @@ -1557,8 +1550,10 @@ void GuiView::autoSave() Buffer * buffer = documentBufferView() ? &documentBufferView()->buffer() : 0; - if (!buffer) + if (!buffer) { + resetAutosaveTimers(); return; + } #if (QT_VERSION >= 0x040400) GuiViewPrivate::busyBuffers.insert(buffer); @@ -1621,8 +1616,8 @@ bool GuiView::getStatus(FuncRequest const & cmd, FuncStatus & flag) } string format = to_utf8(cmd.argument()); if (cmd.argument().empty()) - format = doc_buffer->getDefaultOutputFormat(); - enable = doc_buffer->isExportableFormat(format); + format = doc_buffer->params().getDefaultOutputFormat(); + enable = doc_buffer->params().isExportableFormat(format); break; } @@ -1726,16 +1721,14 @@ bool GuiView::getStatus(FuncRequest const & cmd, FuncStatus & flag) || name == "progress" || name == "compare"; else if (name == "print") - enable = doc_buffer->isExportable("dvi") + enable = doc_buffer->params().isExportable("dvi") && lyxrc.print_command != "none"; else if (name == "character" || name == "symbols") { if (!buf || buf->isReadonly()) enable = false; else { - // FIXME we should consider passthru - // paragraphs too. - Inset const & in = currentBufferView()->cursor().inset(); - enable = !in.getLayout().isPassThru(); + Cursor const & cur = currentBufferView()->cursor(); + enable = !(cur.inTexted() && cur.paragraph().isPassThru()); } } else if (name == "latexlog") @@ -1895,20 +1888,19 @@ Buffer * GuiView::loadDocument(FileName const & filename, bool tolastfiles) setBusy(false); throw(e); } + setBusy(false); if (!newBuffer) { message(_("Document not loaded.")); - setBusy(false); return 0; } - newBuffer->errors("Parse"); setBuffer(newBuffer); + newBuffer->errors("Parse"); if (tolastfiles) theSession().lastFiles().add(filename); - setBusy(false); return newBuffer; } @@ -2074,10 +2066,10 @@ void GuiView::importDocument(string const & argument) toqstr(addPath(package().system_support().absFileName(), "examples"))); docstring filter = formats.prettyName(format); - filter += " (*."; + filter += " (*.{"; // FIXME UNICODE - filter += from_utf8(formats.extension(format)); - filter += ')'; + filter += from_utf8(formats.extensions(format)); + filter += "})"; FileDialog::Result result = dlg.open(toqstr(initpath), fileFilters(toqstr(filter))); @@ -2938,6 +2930,13 @@ bool GuiView::goToFileRow(string const & argument) return false; } } + if (!buf) { + message(bformat( + _("No buffer for file: %1$s."), + makeDisplayPath(file_name)) + ); + return false; + } setBuffer(buf); documentBufferView()->setCursorFromRow(row); return true; @@ -2952,7 +2951,11 @@ docstring GuiView::GuiViewPrivate::runAndDestroy(const T& func, Buffer const * o buffer->params().maintain_unincluded_children && !buffer->params().getIncludedChildren().empty(); bool const success = func(format, update_unincluded); - delete buffer; + + // the cloning operation will have produced a clone of the entire set of + // documents, starting from the master. so we must delete those. + Buffer * mbuf = const_cast(buffer->masterBuffer()); + delete mbuf; busyBuffers.remove(orig); if (msg == "preview") { return success @@ -3025,10 +3028,9 @@ bool GuiView::GuiViewPrivate::asyncBufferProcessing( string format = argument; if (format.empty()) - format = used_buffer->getDefaultOutputFormat(); + format = used_buffer->params().getDefaultOutputFormat(); #if EXPORT_in_THREAD && (QT_VERSION >= 0x040400) - gv_->processingThreadStarted(); if (!msg.empty()) { progress_->clearMessages(); gv_->message(msg); @@ -3040,7 +3042,7 @@ bool GuiView::GuiViewPrivate::asyncBufferProcessing( used_buffer->clone(), format); setPreviewFuture(f); - last_export_format = used_buffer->bufferFormat(); + last_export_format = used_buffer->params().bufferFormat(); (void) syncFunc; (void) previewFunc; // We are asynchronous, so we don't know here anything about the success @@ -3072,7 +3074,7 @@ void GuiView::dispatchToBufferView(FuncRequest const & cmd, DispatchResult & dr) // Try with the document BufferView dispatch if any. BufferView * doc_bv = documentBufferView(); - if (doc_bv) { + if (doc_bv && doc_bv != bv) { doc_bv->dispatch(cmd, dr); if (dr.dispatched()) return; @@ -3138,7 +3140,7 @@ void GuiView::dispatch(FuncRequest const & cmd, DispatchResult & dr) #if QT_VERSION < 0x040400 if (!doc_buffer->doExport(argument, false)) { dr.setError(true); - dr.setMessage(bformat(_("Error exporting to format: %1$s."), + dr.setMessage(bformat(_("Error exporting to format: %1$s"), cmd.argument())); } #else @@ -3358,10 +3360,9 @@ void GuiView::dispatch(FuncRequest const & cmd, DispatchResult & dr) } case LFUN_DIALOG_TOGGLE: { - if (isDialogVisible(cmd.getArg(0))) - dispatch(FuncRequest(LFUN_DIALOG_HIDE, cmd.argument()), dr); - else - dispatch(FuncRequest(LFUN_DIALOG_SHOW, cmd.argument()), dr); + FuncCode const func_code = isDialogVisible(cmd.getArg(0)) + ? LFUN_DIALOG_HIDE : LFUN_DIALOG_SHOW; + dispatch(FuncRequest(func_code, cmd.argument()), dr); break; } @@ -3519,20 +3520,29 @@ void GuiView::dispatch(FuncRequest const & cmd, DispatchResult & dr) break; case LFUN_FORWARD_SEARCH: { - FileName const path(doc_buffer->temppath()); - string const texname = doc_buffer->latexName(); + Buffer const * doc_master = doc_buffer->masterBuffer(); + FileName const path(doc_master->temppath()); + string const texname = doc_master->isChild(doc_buffer) + ? DocFileName(changeExtension( + doc_buffer->absFileName(), + "tex")).mangledFileName() + : doc_buffer->latexName(); + string const mastername = + removeExtension(doc_master->latexName()); FileName const dviname(addName(path.absFileName(), - support::changeExtension(texname, "dvi"))); + addExtension(mastername, "dvi"))); FileName const pdfname(addName(path.absFileName(), - support::changeExtension(texname, "pdf"))); - if (!dviname.exists() && !pdfname.exists()) { + addExtension(mastername, "pdf"))); + bool const have_dvi = dviname.exists(); + bool const have_pdf = pdfname.exists(); + if (!have_dvi && !have_pdf) { dr.setMessage(_("Please, preview the document first.")); break; } string outname = dviname.onlyFileName(); string command = lyxrc.forward_search_dvi; - if (!dviname.exists() || - pdfname.lastModified() > dviname.lastModified()) { + if (!have_dvi || (have_pdf && + pdfname.lastModified() > dviname.lastModified())) { outname = pdfname.onlyFileName(); command = lyxrc.forward_search_pdf; }