diff --git a/src/qtgui/preview.ui b/src/qtgui/preview.ui new file mode 100644 index 00000000..1cf53987 --- /dev/null +++ b/src/qtgui/preview.ui @@ -0,0 +1,104 @@ + + + Preview + + + + 0 + 0 + 611 + 300 + + + + Form + + + + + + 0 + + + true + + + + Tab 1 + + + + + + + + + + &Search for: + + + searchTextCMB + + + + + + + true + + + QComboBox::NoInsert + + + + + + + &Next + + + + + + + &Previous + + + + + + + false + + + Clear + + + + + + + Match &Case + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + diff --git a/src/qtgui/preview_w.cpp b/src/qtgui/preview_w.cpp index 1d84ffae..f8376055 100644 --- a/src/qtgui/preview_w.cpp +++ b/src/qtgui/preview_w.cpp @@ -69,73 +69,27 @@ static const QKeySequence printTabKS(Qt::ControlModifier+Qt::Key_P); void Preview::init() { - setObjectName("Preview"); - QVBoxLayout* previewLayout = new QVBoxLayout(this); + LOGDEB("Preview::init\n"); + // Create the first tab (the tab widget is created with one + // initial tab for ease of use in designer, we remove it). + addEditorTab(); + pvTab->removeTab(0); - pvTab = new QTabWidget(this); - - // Create the first tab. Should be possible to use addEditorTab - // but this causes a pb with the sizeing - QWidget *unnamed = new QWidget(pvTab); - QVBoxLayout *unnamedLayout = new QVBoxLayout(unnamed); - PreviewTextEdit *pvEdit = new PreviewTextEdit(unnamed, "pvEdit", this); - pvEdit->setReadOnly(true); - pvEdit->setUndoRedoEnabled(false); - unnamedLayout->addWidget(pvEdit); - pvTab->addTab(unnamed, ""); - - previewLayout->addWidget(pvTab); - - // Create the buttons and entry field - QHBoxLayout *layout3 = new QHBoxLayout(0); - searchLabel = new QLabel(this); - layout3->addWidget(searchLabel); - - searchTextCMB = new QComboBox(this); - searchTextCMB->setEditable(true); - searchTextCMB->setInsertPolicy(QComboBox::NoInsert); - searchTextCMB->setDuplicatesEnabled(false); - for (unsigned int i = 0; i < m_hData.ugroups.size(); i++) { + for (const auto& ugroup : m_hData.ugroups) { QString s; - for (unsigned int j = 0; j < m_hData.ugroups[i].size(); j++) { - s.append(QString::fromUtf8(m_hData.ugroups[i][j].c_str())); - if (j != m_hData.ugroups[i].size()-1) - s.append(" "); + for (const auto& elt : ugroup) { + s.append(u8s2qs(elt)); } + s = s.trimmed(); searchTextCMB->addItem(s); } - searchTextCMB->setEditText(""); searchTextCMB->setCompleter(0); - layout3->addWidget(searchTextCMB); - - nextButton = new QPushButton(this); - nextButton->setEnabled(true); - layout3->addWidget(nextButton); - prevButton = new QPushButton(this); - prevButton->setEnabled(true); - layout3->addWidget(prevButton); - clearPB = new QPushButton(this); - clearPB->setEnabled(false); - layout3->addWidget(clearPB); - matchCheck = new QCheckBox(this); - layout3->addWidget(matchCheck); - - previewLayout->addLayout(layout3); - - resize(QSize(640, 480).expandedTo(minimumSizeHint())); - - // buddies - searchLabel->setBuddy(searchTextCMB); - - searchLabel->setText(tr("&Search for:")); - nextButton->setText(tr("&Next")); - prevButton->setText(tr("&Previous")); - clearPB->setText(tr("Clear")); - matchCheck->setText(tr("Match &Case")); - - QPushButton * bt = new QPushButton(tr("Close Tab"), this); - pvTab->setCornerWidget(bt); + if (prefs.pvwidth > 100) { + resize(prefs.pvwidth, prefs.pvheight); + } else { + resize(QSize(640, 480).expandedTo(minimumSizeHint())); + } (void)new HelpClient(this); HelpClient::installMap((const char *)objectName().toUtf8(), @@ -146,12 +100,11 @@ void Preview::init() this, SLOT(searchTextFromIndex(int))); connect(searchTextCMB, SIGNAL(editTextChanged(const QString&)), this, SLOT(searchTextChanged(const QString&))); - connect(nextButton, SIGNAL(clicked()), this, SLOT(nextPressed())); - connect(prevButton, SIGNAL(clicked()), this, SLOT(prevPressed())); + connect(nextPB, SIGNAL(clicked()), this, SLOT(nextPressed())); + connect(prevPB, SIGNAL(clicked()), this, SLOT(prevPressed())); connect(clearPB, SIGNAL(clicked()), searchTextCMB, SLOT(clearEditText())); - connect(pvTab, SIGNAL(currentChanged(int)), - this, SLOT(currentChanged(int))); - connect(bt, SIGNAL(clicked()), this, SLOT(closeCurrentTab())); + connect(pvTab, SIGNAL(currentChanged(int)), this, SLOT(currentChanged(int))); + connect(pvTab, SIGNAL(tabCloseRequested(int)), this, SLOT(closeTab(int))); connect(new QShortcut(closeKS, this), SIGNAL (activated()), this, SLOT (close())); @@ -164,9 +117,6 @@ void Preview::init() connect(new QShortcut(printTabKS, this), SIGNAL (activated()), this, SIGNAL (printCurrentPreviewRequest())); - if (prefs.pvwidth > 100) { - resize(prefs.pvwidth, prefs.pvheight); - } currentChanged(pvTab->currentIndex()); } @@ -203,13 +153,9 @@ void Preview::closeEvent(QCloseEvent *e) /* Release all temporary files (but maybe none is actually set) */ for (int i = 0; i < pvTab->count(); i++) { - QWidget *tw = pvTab->widget(i); - if (tw) { - PreviewTextEdit *edit = - tw->findChild("pvEdit"); - if (edit) { - forgetTempFile(edit->m_tmpfilename); - } + PreviewTextEdit *edit = editor(i); + if (edit) { + forgetTempFile(edit->m_tmpfilename); } } emit previewExposed(this, m_searchId, -1); @@ -295,17 +241,6 @@ void Preview::searchTextFromIndex(int idx) m_searchTextFromIndex = idx; } -PreviewTextEdit *Preview::currentEditor() -{ - LOGDEB2("Preview::currentEditor()\n"); - QWidget *tw = pvTab->currentWidget(); - PreviewTextEdit *edit = 0; - if (tw) { - edit = tw->findChild("pvEdit"); - } - return edit; -} - // Save current document to file void Preview::emitSaveDocToFile() { @@ -327,7 +262,7 @@ void Preview::doSearch(const QString &_text, bool next, bool reverse, " word " << wordOnly << "\n"); QString text = _text; - bool matchCase = matchCheck->isChecked(); + bool matchCase = casematchCB->isChecked(); PreviewTextEdit *edit = currentEditor(); if (edit == 0) { // ?? @@ -419,9 +354,7 @@ void Preview::prevPressed() void Preview::currentChanged(int index) { LOGDEB2("PreviewTextEdit::currentChanged\n"); - QWidget *tw = pvTab->widget(index); - PreviewTextEdit *edit = - tw->findChild("pvEdit"); + PreviewTextEdit *edit = editor(index); LOGDEB1("Preview::currentChanged(). Editor: " << edit << "\n"); if (edit == 0) { @@ -430,7 +363,7 @@ void Preview::currentChanged(int index) } edit->setFocus(); // Disconnect the print signal and reconnect it to the current editor - LOGDEB("Disconnecting reconnecting print signal\n"); + LOGDEB1("Disconnecting reconnecting print signal\n"); disconnect(this, SIGNAL(printCurrentPreviewRequest()), 0, 0); connect(this, SIGNAL(printCurrentPreviewRequest()), edit, SLOT(print())); edit->installEventFilter(this); @@ -446,27 +379,45 @@ void Preview::closeCurrentTab() CancelCheck::instance().setCancel(); return; } - PreviewTextEdit *e = currentEditor(); - if (e) - forgetTempFile(e->m_tmpfilename); + closeTab(pvTab->currentIndex()); +} + +void Preview::closeTab(int index) +{ + LOGDEB1("Preview::closeTab: m_loading " << m_loading << "\n"); + if (m_loading) { + CancelCheck::instance().setCancel(); + return; + } + PreviewTextEdit *edit = editor(index); + if (edit) + forgetTempFile(edit->m_tmpfilename); if (pvTab->count() > 1) { - pvTab->removeTab(pvTab->currentIndex()); + pvTab->removeTab(index); } else { close(); } } +PreviewTextEdit *Preview::editor(int index) +{ + return dynamic_cast(pvTab->widget(index)); +} + +PreviewTextEdit *Preview::currentEditor() +{ + LOGDEB2("Preview::currentEditor()\n"); + return editor(pvTab->currentIndex()); +} + PreviewTextEdit *Preview::addEditorTab() { LOGDEB1("PreviewTextEdit::addEditorTab()\n"); - QWidget *anon = new QWidget((QWidget *)pvTab); - QVBoxLayout *anonLayout = new QVBoxLayout(anon); - PreviewTextEdit *editor = new PreviewTextEdit(anon, "pvEdit", this); + PreviewTextEdit *editor = new PreviewTextEdit(pvTab, "pvEdit", this); editor->setReadOnly(true); editor->setUndoRedoEnabled(false ); - anonLayout->addWidget(editor); - pvTab->addTab(anon, "Tab"); - pvTab->setCurrentIndex(pvTab->count() -1); + pvTab->addTab(editor, "Tab"); + pvTab->setCurrentIndex(pvTab->count() - 1); return editor; } @@ -523,15 +474,11 @@ bool Preview::makeDocCurrent(const Rcl::Doc& doc, int docnum, bool sametab) /* Check if we already have this page */ for (int i = 0; i < pvTab->count(); i++) { - QWidget *tw = pvTab->widget(i); - if (tw) { - PreviewTextEdit *edit = - tw->findChild("pvEdit"); - if (edit && !edit->m_url.compare(doc.url) && - !edit->m_ipath.compare(doc.ipath)) { - pvTab->setCurrentIndex(i); - return true; - } + PreviewTextEdit *edit = editor(i); + if (edit && !edit->m_url.compare(doc.url) && + !edit->m_ipath.compare(doc.ipath)) { + pvTab->setCurrentIndex(i); + return true; } } @@ -547,6 +494,7 @@ bool Preview::makeDocCurrent(const Rcl::Doc& doc, int docnum, bool sametab) raise(); return true; } + void Preview::togglePlainPre() { switch (prefs.previewPlainPre) { diff --git a/src/qtgui/preview_w.h b/src/qtgui/preview_w.h index 38872fb5..31e20624 100644 --- a/src/qtgui/preview_w.h +++ b/src/qtgui/preview_w.h @@ -45,6 +45,8 @@ #include "plaintorich.h" #include "rclmain_w.h" +#include "ui_preview.h" + class QTabWidget; class QLabel; class QPushButton; @@ -106,13 +108,15 @@ private: }; -class Preview : public QWidget { - Q_OBJECT; +class Preview : public QWidget, public Ui::Preview { + Q_OBJECT + public: Preview(RclMain *m, int sid, // Search Id const HighlightData& hdata) // Search terms etc. for highlighting - : QWidget(0), m_rclmain(m), m_searchId(sid), m_hData(hdata) { + : m_rclmain(m), m_searchId(sid), m_hData(hdata) { + setupUi(this); init(); } @@ -142,6 +146,7 @@ public slots: // Tabs management virtual void currentChanged(int); virtual void closeCurrentTab(); + virtual void closeTab(int index); virtual void emitShowNext(); virtual void emitShowPrev(); @@ -158,7 +163,7 @@ signals: void saveDocToFile(Rcl::Doc); private: - RclMain *m_rclmain{0}; + RclMain *m_rclmain; // Identifier of search in main window. This is used to check that // we make sense when requesting the next document when browsing // successive search results in a tab. @@ -173,16 +178,9 @@ private: HighlightData m_hData; bool m_justCreated{true}; // First tab create is different - QTabWidget* pvTab{0}; - QLabel* searchLabel{0}; - QComboBox *searchTextCMB{0}; - QPushButton* nextButton{0}; - QPushButton* prevButton{0}; - QPushButton* clearPB{0}; - QCheckBox* matchCheck{0}; - void init(); virtual void setCurTabProps(const Rcl::Doc& doc, int docnum); + virtual PreviewTextEdit *editor(int); virtual PreviewTextEdit *currentEditor(); virtual PreviewTextEdit *addEditorTab(); virtual bool loadDocInCurrentTab(const Rcl::Doc& idoc, int dnm); diff --git a/src/qtgui/recoll.pro.in b/src/qtgui/recoll.pro.in index 0cc6f060..b6448dbf 100644 --- a/src/qtgui/recoll.pro.in +++ b/src/qtgui/recoll.pro.in @@ -91,21 +91,22 @@ SOURCES += \ FORMS = \ advsearch.ui \ crontool.ui \ - widgets/editdialog.ui \ firstidx.ui \ idxsched.ui \ - widgets/listdialog.ui \ + preview.ui \ ptrans.ui \ rclmain.ui \ restable.ui \ rtitool.ui \ + snippets.ui \ specialindex.ui \ spell.ui \ - snippets.ui \ ssearchb.ui \ uiprefs.ui \ viewaction.ui \ - webcache.ui + webcache.ui \ + widgets/editdialog.ui \ + widgets/listdialog.ui RESOURCES = recoll.qrc