123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162 |
- """
- /***************************************************************************
- Name : DB Manager
- Description : Database manager plugin for QGIS
- Date : May 23, 2011
- copyright : (C) 2011 by Giuseppe Sucameli
- email : 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 Qt
- from qgis.PyQt.QtWidgets import QTextBrowser, QApplication
- from qgis.utils import OverrideCursor
- from .db_plugins.plugin import BaseError, DbError, DBPlugin, Schema, Table
- from .dlg_db_error import DlgDbError
- class 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)
|