| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162 | """/***************************************************************************Name                 : DB ManagerDescription          : Database manager plugin for QGISDate                 : May 23, 2011copyright            : (C) 2011 by Giuseppe Sucameliemail                : brush.tyler@gmail.com ***************************************************************************//*************************************************************************** *                                                                         * *   This program is free software; you can redistribute it and/or modify  * *   it under the terms of the GNU General Public License as published by  * *   the Free Software Foundation; either version 2 of the License, or     * *   (at your option) any later version.                                   * *                                                                         * ***************************************************************************/"""from qgis.PyQt.QtCore import Qtfrom qgis.PyQt.QtWidgets import QTextBrowser, QApplicationfrom qgis.utils import OverrideCursorfrom .db_plugins.plugin import BaseError, DbError, DBPlugin, Schema, Tablefrom .dlg_db_error import DlgDbErrorclass InfoViewer(QTextBrowser):    def __init__(self, parent=None):        QTextBrowser.__init__(self, parent)        self.setOpenLinks(False)        self.item = None        self.dirty = False        self._clear()        self._showPluginInfo()        self.anchorClicked.connect(self._linkClicked)    def _linkClicked(self, url):        if self.item is None:            return        if url.scheme() == "action":            with OverrideCursor(Qt.WaitCursor):                try:                    if self.item.runAction(url.path()):                        self.refresh()                except BaseError as e:                    DlgDbError.showError(e, self)    def refresh(self):        self.setDirty(True)        self.showInfo(self.item)    def showInfo(self, item):        if item == self.item and not self.dirty:            return        self._clear()        if item is None:            return        if isinstance(item, DBPlugin):            self._showDatabaseInfo(item)        elif isinstance(item, Schema):            self._showSchemaInfo(item)        elif isinstance(item, Table):            self._showTableInfo(item)        else:            return        self.item = item        item.aboutToChange.connect(self.setDirty)    def setDirty(self, val=True):        self.dirty = val    def _clear(self):        if self.item is not None:            # skip exception on RuntimeError fixes #6892            try:                self.item.aboutToChange.disconnect(self.setDirty)            except RuntimeError:                pass        self.item = None        self.dirty = False        self.item = None        self.setHtml("")    def _showPluginInfo(self):        from .db_plugins import getDbPluginErrors        html = '<div style="background-color:rgba(255,255,95,0.3);"><h1> ' + self.tr("DB Manager") + '</h1></div>'        html += '<div style="margin-left:8px;">'        for msg in getDbPluginErrors():            html += "<p>%s" % msg        self.setHtml(html)    def _showDatabaseInfo(self, connection):        html = '<div style="background-color:rgba(120,255,100,0.3);"><h1> %s</h1></div>' % connection.connectionName()        html += '<div style="margin-left:8px;">'        try:            if connection.database() is None:                html += connection.info().toHtml()            else:                html += connection.database().info().toHtml()        except DbError as e:            html += '<p style="color:red">%s</p>' % str(e).replace('\n', '<br>')        html += '</div>'        self.setHtml(html)    def _showSchemaInfo(self, schema):        html = '<div style="background-color:rgba(255,100,100,0.3);"><h1> %s</h1></div>' % schema.name        html += '<div style="margin-left:8px;">'        try:            html += schema.info().toHtml()        except DbError as e:            html += '<p style="color:red">%s</p>' % str(e).replace('\n', '<br>')        html += "</div>"        self.setHtml(html)    def _showTableInfo(self, table):        html = '<div style="background-color:rgba(100,100,255,0.3)"><h1> %s</h1></div>' % table.name        html += '<div style="margin-left:8px;">'        try:            html += table.info().toHtml()        except DbError as e:            html += '<p style="color:red">%s</p>' % str(e).replace('\n', '<br>')        html += '</div>'        self.setHtml(html)        return True    def setHtml(self, html):        # convert special tags :)        html = str(html).replace('<warning>', '<img src=":/db_manager/warning">   ')        # add default style        html = """<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"><html><head><style type="text/css">        .section { margin-top: 25px; }        table th { background-color: palette(midlight); color: palette(shadow); }        table td { background-color: palette(light); }        table th, table td { padding: 0px 10px; }        table td { padding-right: 20px; }        .underline { text-decoration:underline; }</style></head><body>%s <br></body></html>""" % html        # print(">>>>>\n", html, "\n<<<<<<")        return QTextBrowser.setHtml(self, html)
 |