Exemplo n.º 1
0
SimplePartWidget::SimplePartWidget(QWidget *parent, Imap::Network::MsgPartNetAccessManager *manager,
                                   const QModelIndex &partIndex, MessageView *messageView):
    EmbeddedWebView(parent, manager), m_partIndex(partIndex), m_messageView(messageView), m_netAccessManager(manager)
{
    Q_ASSERT(partIndex.isValid());

    if (m_messageView) {
        connect(this, &QWebView::loadStarted, m_messageView, &MessageView::onWebViewLoadStarted);
        connect(this, &QWebView::loadFinished, m_messageView, &MessageView::onWebViewLoadFinished);
    }

    QUrl url;
    url.setScheme(QStringLiteral("trojita-imap"));
    url.setHost(QStringLiteral("msg"));
    url.setPath(partIndex.data(Imap::Mailbox::RolePartPathToPart).toString());
    if (partIndex.data(Imap::Mailbox::RolePartMimeType).toString() == QLatin1String("text/plain")) {
        if (partIndex.data(Imap::Mailbox::RolePartOctets).toULongLong() < 100 * 1024) {
            connect(this, &QWebView::loadFinished, this, &SimplePartWidget::slotMarkupPlainText);
        } else {
            QFont font(QFontDatabase::systemFont(QFontDatabase::FixedFont));
            setStaticWidth(QFontMetrics(font).maxWidth()*90);
            addCustomStylesheet(QStringLiteral("pre{word-wrap:normal !important;white-space:pre !important;}"));
            QWebSettings *s = settings();
            s->setFontFamily(QWebSettings::StandardFont, font.family());
        }
    }
    load(url);

    m_savePart = new QAction(UiUtils::loadIcon(QStringLiteral("document-save")), tr("Save this message part..."), this);
    connect(m_savePart, &QAction::triggered, this, &SimplePartWidget::slotDownloadPart);
    this->addAction(m_savePart);

    m_saveMessage = new QAction(UiUtils::loadIcon(QStringLiteral("document-save-all")), tr("Save whole message..."), this);
    connect(m_saveMessage, &QAction::triggered, this, &SimplePartWidget::slotDownloadMessage);
    this->addAction(m_saveMessage);

    m_findAction = new QAction(UiUtils::loadIcon(QStringLiteral("edit-find")), tr("Search..."), this);
    m_findAction->setShortcut(tr("Ctrl+F"));
    connect(m_findAction, &QAction::triggered, this, &SimplePartWidget::searchDialogRequested);
    addAction(m_findAction);

    setContextMenuPolicy(Qt::CustomContextMenu);

    // It is actually OK to construct this widget without any connection to a messageView -- this is often used when
    // displaying message source or message headers. Let's silence the QObject::connect warning.
    if (m_messageView) {
        connect(this, &QWidget::customContextMenuRequested, m_messageView, &MessageView::partContextMenuRequested);
        connect(this, &SimplePartWidget::searchDialogRequested, m_messageView, &MessageView::triggerSearchDialog);
        // The targets expect the sender() of the signal to be a SimplePartWidget, not a QWebPage,
        // which means we have to do this indirection
        connect(page(), &QWebPage::linkHovered, this, &SimplePartWidget::linkHovered);
        connect(this, &SimplePartWidget::linkHovered, m_messageView, &MessageView::partLinkHovered);
        connect(page(), &QWebPage::downloadRequested, this, &SimplePartWidget::slotDownloadImage);

        installEventFilter(m_messageView);
    }
}
Exemplo n.º 2
0
EmbeddedWebView::EmbeddedWebView(QWidget *parent, QNetworkAccessManager *networkManager)
    : QWebView(parent)
    , m_scrollParent(nullptr)
    , m_resizeInProgress(0)
    , m_staticWidth(0)
    , m_colorScheme(ColorScheme::System)
{
    // set to expanding, ie. "freely" - this is important so the widget will attempt to shrink below the sizehint!
    setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
    setFocusPolicy(Qt::StrongFocus); // not by the wheel
    setPage(new ErrorCheckingPage(this));
    page()->setNetworkAccessManager(networkManager);

    QWebSettings *s = settings();
    s->setAttribute(QWebSettings::JavascriptEnabled, false);
    s->setAttribute(QWebSettings::JavaEnabled, false);
    s->setAttribute(QWebSettings::PluginsEnabled, false);
    s->setAttribute(QWebSettings::PrivateBrowsingEnabled, true);
    s->setAttribute(QWebSettings::JavaEnabled, false);
    s->setAttribute(QWebSettings::OfflineStorageDatabaseEnabled, false);
    s->setAttribute(QWebSettings::OfflineWebApplicationCacheEnabled, false);
    s->setAttribute(QWebSettings::LocalStorageDatabaseEnabled, false);
    s->clearMemoryCaches();

    page()->setLinkDelegationPolicy(QWebPage::DelegateAllLinks);
    connect(this, &QWebView::linkClicked, this, &EmbeddedWebView::slotLinkClicked);
    connect(this, &QWebView::loadFinished, this, &EmbeddedWebView::handlePageLoadFinished);
    connect(page()->mainFrame(), &QWebFrame::contentsSizeChanged, this, &EmbeddedWebView::handlePageLoadFinished);

    // Scrolling is implemented on upper layers
    page()->mainFrame()->setScrollBarPolicy(Qt::Horizontal, Qt::ScrollBarAlwaysOff);
    page()->mainFrame()->setScrollBarPolicy(Qt::Vertical, Qt::ScrollBarAlwaysOff);

    // Setup shortcuts for standard actions
    QAction *copyAction = page()->action(QWebPage::Copy);
    copyAction->setShortcut(tr("Ctrl+C"));
    addAction(copyAction);

    m_autoScrollTimer = new QTimer(this);
    m_autoScrollTimer->setInterval(50);
    connect(m_autoScrollTimer, &QTimer::timeout, this, &EmbeddedWebView::autoScroll);

    m_sizeContrainTimer = new QTimer(this);
    m_sizeContrainTimer->setInterval(50);
    m_sizeContrainTimer->setSingleShot(true);
    connect(m_sizeContrainTimer, &QTimer::timeout, this, &EmbeddedWebView::constrainSize);

    setContextMenuPolicy(Qt::NoContextMenu);
    findScrollParent();

    addCustomStylesheet(QString());
}
Exemplo n.º 3
0
void EmbeddedWebView::setColorScheme(const ColorScheme colorScheme)
{
    m_colorScheme = colorScheme;
    addCustomStylesheet(m_customCss);
}