helpdialog.cpp
来自「奇趣公司比较新的qt/emd版本」· C++ 代码 · 共 1,320 行 · 第 1/3 页
CPP
1,320 行
QFile file(*i); if (!file.exists()) { QMessageBox::warning(this, tr("Warning"), tr("Documentation file %1 does not exist!\n" "Skipping file.").arg(QFileInfo(file).absoluteFilePath())); continue; } fileAges += QFileInfo(file).lastModified().toTime_t(); DocuParser *handler = DocuParser::createParser(*i); bool ok = handler->parse(&file); file.close(); if (!ok){ QString msg = QString::fromLatin1("In file %1:\n%2") .arg(QFileInfo(file).absoluteFilePath()) .arg(handler->errorProtocol()); QMessageBox::critical(this, tr("Parse Error"), tr(msg.toUtf8())); delete handler; continue; } QList<IndexItem*> indLst = handler->getIndexItems(); int counter = 0; foreach (IndexItem *indItem, indLst) { QFileInfo fi(indItem->reference); lst.append(IndexKeyword(indItem->keyword, indItem->reference)); if (++counter%100 == 0) { if (ui.progressPrepare) ui.progressPrepare->setValue(counter); processEvents(); if (lwClosed) { return; } } } delete handler; } if (!lst.isEmpty()) qSort(lst); QFile indexout(cacheFilesPath + QDir::separator() + QLatin1String("indexdb40.") + Config::configuration()->profileName()); if (verifyDirectory(cacheFilesPath) && indexout.open(QFile::WriteOnly)) { QDataStream s(&indexout); s << fileAges; s << lst; indexout.close(); }}void HelpDialog::setupTitleMap(){ if (titleMapDone) return; bool needRebuild = false; if (Config::configuration()->profileName() == QLatin1String("default")) { const QStringList docuFiles = Config::configuration()->docFiles(); for (QStringList::ConstIterator it = docuFiles.begin(); it != docuFiles.end(); ++it) { if (!QFile::exists(*it)) { Config::configuration()->saveProfile(Profile::createDefaultProfile()); Config::configuration()->loadDefaultProfile(); needRebuild = true; break; } } } if (Config::configuration()->docRebuild() || needRebuild) { removeOldCacheFiles(); Config::configuration()->setDocRebuild(false); Config::configuration()->saveProfile(Config::configuration()->profile()); } if (contentList.isEmpty()) getAllContents(); titleMapDone = true; titleMap.clear(); for (QList<QPair<QString, ContentList> >::Iterator it = contentList.begin(); it != contentList.end(); ++it) { ContentList lst = (*it).second; foreach (ContentItem item, lst) { titleMap[item.reference] = item.title.trimmed(); } } processEvents();}void HelpDialog::getAllContents(){ QFile contentFile(cacheFilesPath + QDir::separator() + QLatin1String("contentdb40.") + Config::configuration()->profileName()); contentList.clear(); if (!contentFile.open(QFile::ReadOnly)) { buildContentDict(); return; } QDataStream ds(&contentFile); quint32 fileAges; ds >> fileAges; if (fileAges != getFileAges()) { contentFile.close(); removeOldCacheFiles(true); buildContentDict(); return; } QString key; QList<ContentItem> lst; while (!ds.atEnd()) { ds >> key; ds >> lst; contentList += qMakePair(key, QList<ContentItem>(lst)); } contentFile.close(); processEvents();}void HelpDialog::buildContentDict(){ QStringList docuFiles = Config::configuration()->docFiles(); quint32 fileAges = 0; for (QStringList::iterator it = docuFiles.begin(); it != docuFiles.end(); ++it) { QFile file(*it); if (!file.exists()) { QMessageBox::warning(this, tr("Warning"), tr("Documentation file %1 does not exist!\n" "Skipping file.").arg(QFileInfo(file).absoluteFilePath())); continue; } fileAges += QFileInfo(file).lastModified().toTime_t(); DocuParser *handler = DocuParser::createParser(*it); if (!handler) { QMessageBox::warning(this, tr("Warning"), tr("Documentation file %1 is not compatible!\n" "Skipping file.").arg(QFileInfo(file).absoluteFilePath())); continue; } bool ok = handler->parse(&file); file.close(); if (ok) { contentList += qMakePair(*it, QList<ContentItem>(handler->getContentItems())); delete handler; } else { QString msg = QString::fromLatin1("In file %1:\n%2") .arg(QFileInfo(file).absoluteFilePath()) .arg(handler->errorProtocol()); QMessageBox::critical(this, tr("Parse Error"), tr(msg.toUtf8())); continue; } } QFile contentOut(cacheFilesPath + QDir::separator() + QLatin1String("contentdb40.") + Config::configuration()->profileName()); if (contentOut.open(QFile::WriteOnly)) { QDataStream s(&contentOut); s << fileAges; for (QList<QPair<QString, ContentList> >::Iterator it = contentList.begin(); it != contentList.end(); ++it) { s << *it; } contentOut.close(); }}void HelpDialog::currentTabChanged(int index){ QString s = ui.tabWidget->widget(index)->objectName(); if (s == QLatin1String("indexPage")) QTimer::singleShot(0, this, SLOT(loadIndexFile())); else if (s == QLatin1String("bookmarkPage")) insertBookmarks(); else if (s == QLatin1String("contentPage")) QTimer::singleShot(0, this, SLOT(insertContents())); else if (s == QLatin1String("searchPage")) QTimer::singleShot(0, this, SLOT(setupFullTextIndex()));}void HelpDialog::showInitDoneMessage(){ if (initDoneMsgShown) return; initDoneMsgShown = true; help->statusBar()->showMessage(tr("Done"), 3000);}void HelpDialog::showTopic(QTreeWidgetItem *item){ if (item) showTopic();}void HelpDialog::showTopic(){ QString tabName = ui.tabWidget->currentWidget()->objectName(); if (tabName == QLatin1String("indexPage")) showIndexTopic(); else if (tabName == QLatin1String("bookmarkPage")) showBookmarkTopic(); else if (tabName == QLatin1String("contentPage")) showContentsTopic();}void HelpDialog::showIndexTopic(){ int row = ui.listIndex->currentIndex().row(); if (row == -1 || row >= indexModel->rowCount()) return; QString description = indexModel->description(row); QStringList links = indexModel->links(row); bool blocked = ui.editIndex->blockSignals(true); ui.editIndex->setText(description); ui.editIndex->blockSignals(blocked); if (links.count() == 1) { emit showLink(links.first()); } else { qSort(links); QStringList::Iterator it = links.begin(); QStringList linkList; QStringList linkNames; for (; it != links.end(); ++it) { linkList << *it; linkNames << titleOfLink(*it); } QString link = TopicChooser::getLink(this, linkNames, linkList, description); if (!link.isEmpty()) emit showLink(link); } ui.listIndex->setCurrentIndex(indexModel->index(indexModel->stringList().indexOf(description))); ui.listIndex->scrollTo(ui.listIndex->currentIndex(), QAbstractItemView::PositionAtTop);}void HelpDialog::searchInIndex(const QString &searchString){ QRegExp atoz(QLatin1String("[A-Z]")); int matches = searchString.count(atoz); if (matches > 0 && !searchString.contains(QLatin1String(".*"))) { int start = 0; QString newSearch; for (; matches > 0; --matches) { int match = searchString.indexOf(atoz, start+1); if (match <= start) continue; newSearch += searchString.mid(start, match-start); newSearch += QLatin1String(".*"); start = match; } newSearch += searchString.mid(start); ui.listIndex->setCurrentIndex(indexModel->filter(newSearch, searchString)); } else ui.listIndex->setCurrentIndex(indexModel->filter(searchString, searchString));}QString HelpDialog::titleOfLink(const QString &link){ QString s = HelpDialog::removeAnchorFromLink(link); s = titleMap[s]; if (s.isEmpty()) return link; return s;}bool HelpDialog::eventFilter(QObject * o, QEvent * e){ if (o == ui.editIndex && e->type() == QEvent::KeyPress) { switch (static_cast<QKeyEvent*>(e)->key()) { case Qt::Key_Up: case Qt::Key_Down: case Qt::Key_PageDown: case Qt::Key_PageUp: QApplication::sendEvent(ui.listIndex, e); break; default: break; } } else if (o == ui.listContents->viewport()) { if (e->type() == QEvent::MouseButtonRelease) { QMouseEvent *me = static_cast<QMouseEvent*>(e); if (me->button() == Qt::LeftButton) { QTreeWidgetItem *item = ui.listContents->itemAt(me->pos()); QRect vRect = ui.listContents->visualItemRect(item); // only show topic if we clicked an item if (item && vRect.contains(me->pos())) showTopic(item); } } } return QWidget::eventFilter(o, e);}void HelpDialog::addBookmark(){ if (!bookmarksInserted) insertBookmarks(); QString link = help->browsers()->currentBrowser()->source().toString(); QString title = help->browsers()->currentBrowser()->documentTitle(); if (title.isEmpty()) title = titleOfLink(link); QTreeWidgetItem *i = new QTreeWidgetItem(ui.listBookmarks, 0); i->setText(0, title); i->setData(0, LinkRole, link); ui.buttonRemove->setEnabled(true); saveBookmarks(); help->updateBookmarkMenu();}void HelpDialog::on_buttonAdd_clicked(){ addBookmark();}void HelpDialog::on_buttonRemove_clicked(){ if (!ui.listBookmarks->currentItem()) return; delete ui.listBookmarks->currentItem(); saveBookmarks(); if (ui.listBookmarks->topLevelItemCount() != 0) { ui.listBookmarks->setCurrentItem(ui.listBookmarks->topLevelItem(0)); } ui.buttonRemove->setEnabled(ui.listBookmarks->topLevelItemCount() > 0); help->updateBookmarkMenu();}void HelpDialog::insertBookmarks(){ if (bookmarksInserted) return; bookmarksInserted = true; ui.listBookmarks->clear(); QFile f(cacheFilesPath + QDir::separator() + QLatin1String("bookmarks.") + Config::configuration()->profileName()); if (!f.open(QFile::ReadOnly)) return; QTextStream ts(&f); while (!ts.atEnd()) { QTreeWidgetItem *i = new QTreeWidgetItem(ui.listBookmarks, 0); i->setText(0, ts.readLine()); i->setData(0, LinkRole, ts.readLine()); } ui.buttonRemove->setEnabled(ui.listBookmarks->topLevelItemCount() > 0); help->updateBookmarkMenu(); showInitDoneMessage();}void HelpDialog::showBookmarkTopic(){ if (!ui.listBookmarks->currentItem()) return; QTreeWidgetItem *i = (QTreeWidgetItem*)ui.listBookmarks->currentItem(); emit showLink(i->data(0, LinkRole).toString());}static void store(QTreeWidgetItem *i, QTextStream &ts){ ts << i->text(0) << endl; ts << i->data(0, LinkRole).toString() << endl; for (int index = 0; index < i->childCount(); ++index) store(i->child(index), ts);}static void store(QTreeWidget *tw, QTextStream &ts){ for (int index = 0; index < tw->topLevelItemCount(); ++index) store(tw->topLevelItem(index), ts);}void HelpDialog::saveBookmarks(){ QFile f(cacheFilesPath + QDir::separator() + QLatin1String("bookmarks.") + Config::configuration()->profileName()); if (!f.open(QFile::WriteOnly)) return; QTextStream ts(&f); store(ui.listBookmarks, ts); f.close();}void HelpDialog::insertContents(){#ifdef Q_WS_MAC static const QLatin1String IconPath(":/trolltech/assistant/images/win/book.png");#else static const QLatin1String IconPath(":/trolltech/assistant/images/win/book.png");#endif if (contentsInserted) return; if (contentList.isEmpty()) getAllContents(); contentsInserted = true; ui.listContents->clear(); setCursor(Qt::WaitCursor); if (!titleMapDone) setupTitleMap();#if 0 // ### port me ui.listContents->setSorting(-1);#endif for (QList<QPair<QString, ContentList> >::Iterator it = contentList.begin(); it != contentList.end(); ++it) { QTreeWidgetItem *newEntry; QTreeWidgetItem *contentEntry; QStack<QTreeWidgetItem*> stack; stack.clear(); int depth = 0; bool root = false; QTreeWidgetItem *lastItem[64]; for (int j = 0; j < 64; ++j) lastItem[j] = 0; ContentList lst = (*it).second; for (ContentList::ConstIterator it = lst.constBegin(); it != lst.constEnd(); ++it) { ContentItem item = *it; if (item.depth == 0) { newEntry = new QTreeWidgetItem(ui.listContents, 0); newEntry->setIcon(0, QIcon(IconPath)); newEntry->setText(0, item.title); newEntry->setData(0, LinkRole, item.reference); stack.push(newEntry); depth = 1; root = true;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?