manuskript/manuskript/importer/abstractImporter.py
2018-01-29 10:30:41 -07:00

211 lines
6.9 KiB
Python

#!/usr/bin/env python
# --!-- coding: utf8 --!--
import os
import shutil
import subprocess
from PyQt5.QtCore import QSettings
from PyQt5.QtWidgets import QWidget, QVBoxLayout, QCheckBox, QHBoxLayout, \
QLabel, QSpinBox, QComboBox, QLineEdit
from manuskript.ui.collapsibleGroupBox2 import collapsibleGroupBox2
from manuskript.ui import style
class abstractImporter:
"""
abstractImporter is used to import documents into manuskript.
The startImport function must be subclassed. It takes a filePath (str to
the document to import), and must return `outlineItem`s.
"""
name = ""
description = ""
fileFormat = "" # File format accepted. For example: "OPML Files (*.opml)"
# For folder, use "<<folder>>"
icon = ""
engine = "Internal"
def __init__(self):
self.settingsList = [] # Keep the name of the settings in order
self.settings = {}
def startImport(self, filePath, parentItem, settingsWidget):
"""
Takes a str path to the file/folder to import, and the settingsWidget
returned by `self.settingsWidget()` containing the user set settings,
and return `outlineItem`s.
"""
pass
@classmethod
def isValid(cls):
return False
def settingsWidget(self, widget):
"""
Takes a QWidget that can be modified and must be returned.
"""
return widget
def addPage(self, widget, title):
"""
Convenience function to add a page to the settingsWidget `widget`, at
the end.
Returns the page widget.
"""
w = QWidget(widget)
w.setLayout(QVBoxLayout())
widget.toolBox.insertItem(widget.toolBox.count(), w, title)
widget.toolBox.layout().setSpacing(0)
return w
def addGroup(self, parent, title):
"""
Adds a collapsible group to the given widget.
"""
g = collapsibleGroupBox2(title=title)
parent.layout().addWidget(g)
g.setLayout(QVBoxLayout())
return g
def addSetting(self, name, type, label, widget=None, default=None,
tooltip=None, min=None, max=None, vals=None, suffix=""):
self.settingsList.append(name)
self.settings[name] = self.setting(name, type, label, widget, default,
tooltip, min, max, vals, suffix)
def widget(self, name):
if name in self.settings:
return self.settings[name].widget()
def getSetting(self, name):
if name in self.settings:
return self.settings[name]
def addSettingsTo(self, widget):
"""
Adds all the settings to the given widget. Assume that the settings
have not been called yet, so calling `.widget()` will create their
widgets.
"""
for name in self.settingsList:
self.settings[name].widget(widget)
class setting:
"""
A class used to store setting, and display a widget for the user to
modify it.
"""
def __init__(self, name, type, label, widget=None, default=None,
tooltip=None, min=None, max=None, vals=None, suffix=""):
self.name = name
self.type = type
self.label = label
self._widget = widget
self.default = default
self.min = min
self.max = max
self.vals = vals.split("|") if vals else []
self.suffix = suffix
self.tooltip = tooltip
def widget(self, parent=None):
"""
Returns the widget used, or creates it if not done yet. If parent
is given, widget is inserted in parent's layout.
"""
if self._widget:
return self._widget
else:
if "checkbox" in self.type:
self._widget = QCheckBox(self.label)
if self.default:
self._widget.setChecked(True)
if parent:
parent.layout().addWidget(self._widget)
elif "number" in self.type:
l = QHBoxLayout()
label = QLabel(self.label, parent)
label.setWordWrap(True)
l.addWidget(label, 8)
self._widget = QSpinBox()
self._widget.setValue(self.default if self.default else 0)
if self.min:
self._widget.setMinimum(self.min)
if self.max:
self._widget.setMaximum(self.max)
if self.suffix:
self._widget.setSuffix(self.suffix)
l.addWidget(self._widget, 2)
if parent:
parent.layout().addLayout(l)
elif "combo" in self.type:
l = QHBoxLayout()
label = QLabel(self.label, parent)
label.setWordWrap(True)
l.addWidget(label, 6)
self._widget = QComboBox()
self._widget.addItems(self.vals)
if self.default:
self._widget.setCurrentText(self.default)
l.addWidget(self._widget, 2)
if parent:
parent.layout().addLayout(l)
elif "text" in self.type:
l = QHBoxLayout()
label = QLabel(self.label, parent)
label.setWordWrap(True)
l.addWidget(label, 5)
self._widget = QLineEdit()
self._widget.setStyleSheet(style.lineEditSS())
if self.default:
self._widget.setText(self.default)
l.addWidget(self._widget, 3)
if parent:
parent.layout().addLayout(l)
elif "label" in self.type:
self._widget = QLabel(self.label, parent)
self._widget.setWordWrap(True)
if parent:
parent.layout().addWidget(self._widget)
if self.tooltip:
self._widget.setToolTip(self.tooltip)
return self._widget
def value(self):
"""
Return the value contained in the widget.
"""
if not self._widget:
return self.default
else:
if "checkbox" in self.type:
return self._widget.isChecked()
elif "number" in self.type:
return self._widget.value()
elif "combo" in self.type:
return self._widget.currentText()
elif "text" in self.type:
return self._widget.text()