24556105f6
* don't try to send layers with unsupported data providers * innocent cleanup * remove pip and old installer * risky cleanup * import library after plugin load * proper label with clickable btns * experimental: to uncover title bar * Fix layout with unblocked header * all layouts fixed * removing extras * update specklepy * menu logo fixed * fixed icon and metadata
126 lines
3.3 KiB
Python
126 lines
3.3 KiB
Python
"""Logging Utility Module for Speckle QGIS"""
|
|
|
|
import webbrowser
|
|
|
|
|
|
def display_and_log(
|
|
msg: str,
|
|
func=None, # name of the function from where logging was called
|
|
level: int = 2,
|
|
dockwidget=None,
|
|
url="",
|
|
blue=False,
|
|
report=False,
|
|
):
|
|
|
|
# display in Speckle UI: TODO
|
|
# log_to_user(msg, func, level, dockwidget, url, blue, report)
|
|
|
|
# display in QGIS message panel
|
|
logger.writeToLog(msg.replace("\n", ". ") + " " + url, level, func)
|
|
|
|
|
|
class Logging:
|
|
"""Holds utility methods for logging messages to QGIS"""
|
|
|
|
qgisInterface = None
|
|
|
|
def __init__(self, iface) -> None:
|
|
self.qgisInterface = iface
|
|
|
|
def log(self, message: str, level: int = 0):
|
|
"""Logs a specific message to the Speckle messages panel."""
|
|
try:
|
|
from qgis.core import Qgis, QgsMessageLog
|
|
|
|
if level == 0:
|
|
level = Qgis.Info
|
|
elif level == 1:
|
|
level = Qgis.Warning
|
|
elif level == 2:
|
|
level = Qgis.Critical
|
|
# return
|
|
QgsMessageLog.logMessage(message, "Speckle", level=level)
|
|
except ImportError or ModuleNotFoundError as e:
|
|
print(e)
|
|
|
|
def btnClicked(url):
|
|
try:
|
|
if url == "":
|
|
return
|
|
webbrowser.open(url, new=0, autoraise=True)
|
|
except Exception as e:
|
|
pass
|
|
|
|
def logToUserWithAction(
|
|
self,
|
|
message: str,
|
|
action_text: str,
|
|
url: str = "",
|
|
level: int = 0,
|
|
duration: int = 120,
|
|
):
|
|
self.log(message, level)
|
|
|
|
if not self.qgisInterface:
|
|
return
|
|
try:
|
|
from qgis.core import Qgis
|
|
from qgis.PyQt.QtWidgets import QPushButton
|
|
|
|
if level == 0:
|
|
level = Qgis.Info
|
|
elif level == 1:
|
|
level = Qgis.Warning
|
|
elif level == 2:
|
|
level = Qgis.Critical
|
|
|
|
widget = self.qgisInterface.messageBar().createMessage("Speckle", message)
|
|
button = QPushButton(widget)
|
|
button.setText(action_text)
|
|
button.pressed.connect(lambda: self.btnClicked(url))
|
|
widget.layout().addWidget(button)
|
|
self.qgisInterface.messageBar().pushWidget(widget, level, duration)
|
|
except ImportError:
|
|
pass
|
|
|
|
def logToUserPanel(
|
|
self,
|
|
message: str,
|
|
level: int = 0,
|
|
duration: int = 20,
|
|
func=None,
|
|
plugin=None,
|
|
):
|
|
"""Logs a specific message to the user in QGIS"""
|
|
|
|
self.log(message, level)
|
|
|
|
if not self.qgisInterface:
|
|
return
|
|
try:
|
|
from qgis.core import Qgis
|
|
|
|
if level == 0:
|
|
level = Qgis.Info
|
|
if level == 1:
|
|
level = Qgis.Warning
|
|
if level == 2:
|
|
level = Qgis.Critical
|
|
|
|
if self.qgisInterface:
|
|
self.qgisInterface.messageBar().pushMessage(
|
|
"Speckle", message, level=level, duration=duration
|
|
)
|
|
except ImportError:
|
|
pass
|
|
|
|
def writeToLog(self, msg: str = "", level: int = 2, func=None, plugin=None):
|
|
msg = str(msg)
|
|
if func is not None and func != "None":
|
|
msg += "::" + str(func)
|
|
self.log(msg, level)
|
|
|
|
|
|
logger = Logging(None)
|