class TableCellButtons(QWidget): deleteItem = pyqtSignal(object) editItem = pyqtSignal(object) def __init__(self): QWidget.__init__(self) self.delete = FlatButton(":/images/trash_normal.png", ":/images/trash_hover.png") self.edit = FlatButton(":/images/edit_normal.png", ":/images/edit_hover.png") self.edit.setToolTip( QCoreApplication.translate("TableCellButtons", "Edit Item")) self.delete.setToolTip( QCoreApplication.translate("TableCellButtons", "Delete Item")) self.item = None hbox = QHBoxLayout() hbox.addWidget(self.edit) hbox.addWidget(self.delete) self.setLayout(hbox) self.delete.clicked.connect(self.deleteItemClicked) self.edit.clicked.connect(self.editItemClicked) def setItem(self, item): self.item = item def deleteItemClicked(self): self.deleteItem.emit(self.item) def editItemClicked(self): self.editItem.emit(self.item)
def __init__(self): QWidget.__init__(self) self.filename = "" self.undoStack = QUndoStack() self.undo = FlatButton(":/images/undo_normal.png", ":/images/undo_hover.png", "", ":/images/undo_disabled.png") self.redo = FlatButton(":/images/redo_normal.png", ":/images/redo_hover.png", "", ":/images/redo_disabled.png") self.undo.setToolTip("Undo") self.redo.setToolTip("Redo") self.undo.setEnabled(False) self.redo.setEnabled(False) hbox = QHBoxLayout() hbox.addStretch(0) hbox.addWidget(self.undo) hbox.addWidget(self.redo) self.titleLabel = QLabel() fnt = self.titleLabel.font() fnt.setPointSize(20) fnt.setBold(True) self.titleLabel.setFont(fnt) self.layout = QGridLayout() self.layout.addWidget(self.titleLabel, 0, 0) self.layout.addLayout(hbox, 0, 2) self.setLayout(self.layout)
def __init__(self): QWidget.__init__(self) self.changed = False self.grid = QGridLayout() self.cssclass = QLineEdit() self.setAutoFillBackground(True) close = FlatButton(":/images/close_normal.png", ":/images/close_hover.png") close.setToolTip("Close Editor") titleLabel = QLabel("Row Module Settings") fnt = titleLabel.font() fnt.setPointSize(16) fnt.setBold(True) titleLabel.setFont(fnt) vbox = QVBoxLayout() vbox.addStretch() self.grid.addWidget(titleLabel, 0, 0) self.grid.addWidget(close, 0, 1, 1, 1, Qt.AlignRight) self.grid.addWidget(QLabel("CSS Class"), 1, 0) self.grid.addWidget(self.cssclass, 2, 0, 1, 2) self.grid.addLayout(vbox, 3, 0) self.setLayout(self.grid) close.clicked.connect(self.closeEditor) self.cssclass.textChanged.connect(self.contentChanged)
def __init__(self, theme): QWidget.__init__(self) self.theme = theme self.themename = theme.name self.setMaximumWidth(400) picurl = ":/images/theme.png" self.url = theme.sample_url if theme.sample_pic: picurl = theme.sample_pic pic = FlatButton(picurl, picurl) map = QPixmap(400, 200) p = QPainter(map) p.setRenderHint(QPainter.Antialiasing) p.setRenderHint(QPainter.TextAntialiasing) p.drawImage(QRect(0, 0, 400, 200), QImage(picurl)) p.fillRect(0, 0, map.size().width(), map.size().height(), QColor(69, 187, 230, 125)) if self.url: w = 100 h = 30 p.fillRect(QRect((400 - w) / 2, (200 - h) / 2, w, h), QColor(69, 187, 230, 255)) p.drawRoundedRect(QRect((400 - w) / 2, (200 - h) / 2, w, h), 5, 5) font = QFont() font.setFamily("Arial") font.setBold(True) font.setPixelSize(20) p.setFont(font) p.setPen(QPen(Qt.black)) p.drawText(QRectF(0, 0, 400, 200), "PREVIEW", QTextOption(Qt.AlignHCenter | Qt.AlignVCenter)) pic.clicked.connect(self.clicked) else: pic.setCursor(Qt.ArrowCursor) del p pic.setHoverPixmap(map) pic.setMaximumSize(400, 200) pic.setScaledContents(True) if theme.aktiv: name = QLabel(theme.name.upper() + " (Aktiv)") else: name = QLabel(theme.name.upper()) fnt = name.font() fnt.setPointSize(13) fnt.setBold(True) name.setFont(fnt) layout = QGridLayout() layout.addWidget(pic, 0, 0, 1, 2) layout.addWidget(name, 1, 0) if not theme.aktiv: activate = QPushButton("Activate") layout.addWidget(activate, 1, 1, 1, 1, Qt.AlignRight) activate.clicked.connect(self.activate) self.setLayout(layout)
def __init__(self): ElementEditorInterface.__init__(self) self.class_name = "RevolutionSliderEditor" self.display_name = "RevolutionSlider" self.tag_name = "RevolutionSlider" self.version = "1.0" self.icon = QImage(":/revolution.png") self.changed = False self.setAutoFillBackground(True) grid = QGridLayout() self.id = QLineEdit() self.id.setMaximumWidth(200) self.adminlabel = QLineEdit() self.adminlabel.setMaximumWidth(200) titleLabel = QLabel("Slider Module") fnt = titleLabel.font() fnt.setPointSize(16) fnt.setBold(True) titleLabel.setFont(fnt) close = FlatButton(":/images/close_normal.png", ":/images/close_hover.png") close.setToolTip("Close Editor") addSlide = QPushButton("Add Slide") addSlide.setMaximumWidth(120) self.list = QTableWidget(0, 2, self) self.list.verticalHeader().hide() self.list.setSelectionMode(QAbstractItemView.SingleSelection) self.list.setSelectionBehavior(QAbstractItemView.SelectRows) self.list.horizontalHeader().setSectionResizeMode( 1, QHeaderView.Stretch) self.list.setToolTip("Double click to edit item") labels = ["", "Name"] self.list.setHorizontalHeaderLabels(labels) grid.addWidget(titleLabel, 0, 0) grid.addWidget(close, 0, 2, 1, 1, Qt.AlignRight) grid.addWidget(addSlide, 1, 0) grid.addWidget(self.list, 2, 0, 1, 3) grid.addWidget(QLabel("Id"), 4, 0) grid.addWidget(self.id, 5, 0) grid.addWidget(QLabel("Admin Label"), 6, 0) grid.addWidget(self.adminlabel, 7, 0) self.setLayout(grid) addSlide.clicked.connect(self.addSlide) self.adminlabel.textChanged.connect(self.contentChanged) self.id.textChanged.connect(self.contentChanged) close.clicked.connect(self.closeEditor) self.list.cellDoubleClicked.connect(self.tableDoubleClicked) self.installEventFilter(self)
def __init__(self): super().__init__() self.changed = False self.setAutoFillBackground(True) grid = QGridLayout() seek = QPushButton("...") seek.setMaximumWidth(50) self.adminlabel = QLineEdit() self.adminlabel.setMaximumWidth(200) titleLabel = QLabel("Slide") fnt = titleLabel.font() fnt.setPointSize(16) fnt.setBold(True) titleLabel.setFont(fnt) self.source = QLineEdit() self.image = ImageSelector() self.image.setImage(QImage(":/images/image_placeholder.png")) close = FlatButton(":/images/close_normal.png", ":/images/close_hover.png") close.setToolTip("Close Editor") font = QFont() font.setFamily("Courier") font.setFixedPitch(True) font.setPointSize(13) self.innerHtml = QTextEdit() self.innerHtml.setMaximumHeight(120) self.innerHtml.setFont(font) self.innerHtml.setAcceptRichText(False) self.innerHtml.setLineWrapMode(QTextEdit.NoWrap) metrics = QFontMetrics(font) self.innerHtml.setTabStopWidth(4 * metrics.width(' ')) XmlHighlighter(self.innerHtml.document()) grid.addWidget(titleLabel, 0, 0) grid.addWidget(close, 0, 2, 1, 1, Qt.AlignRight) grid.addWidget(QLabel("Path"), 1, 0) grid.addWidget(self.source, 2, 0, 1, 2) grid.addWidget(seek, 2, 2) grid.addWidget(self.image, 3, 0, 1, 2) grid.setRowStretch(3, 1) grid.addWidget(QLabel("Inner HTML"), 4, 0) grid.addWidget(self.innerHtml, 5, 0, 1, 3) grid.addWidget(QLabel("Admin Label"), 6, 0) grid.addWidget(self.adminlabel, 7, 0) self.setLayout(grid) close.clicked.connect(self.closeEditor) self.image.clicked.connect(self.seek) seek.clicked.connect(self.seek) self.source.textChanged.connect(self.contentChanged) self.adminlabel.textChanged.connect(self.contentChanged) self.innerHtml.textChanged.connect(self.contentChanged)
def __init__(self): ElementEditorInterface.__init__(self) self.site = None self.class_name = "TextEditor" self.display_name = "Text" self.tag_name = "Text" self.version = "1.0" self.icon = QImage(":/texteditor.png") self.changed = False self.setAutoFillBackground(True) font = QFont() font.setFamily("Courier") font.setFixedPitch(True) font.setPointSize(15) grid = QGridLayout() close = FlatButton(":/images/close_normal.png", ":/images/close_hover.png") close.setToolTip(QCoreApplication.translate("general", "Close Editor")) self.html = QTextEdit() self.html.setFont(font) self.html.setAcceptRichText(False) self.html.setLineWrapMode(QTextEdit.NoWrap) metrics = QFontMetrics(font) self.html.setTabStopWidth(4 * metrics.width(' ')) self.highlighter = XmlHighlighter(self.html.document()) self.adminlabel = QLineEdit() self.adminlabel.setMaximumWidth(200) self.titleLabel = QLabel( QCoreApplication.translate("TextEditor", "Text Module")) fnt = self.titleLabel.font() fnt.setPointSize(16) fnt.setBold(True) self.titleLabel.setFont(fnt) grid.addWidget(self.titleLabel, 0, 0) grid.addWidget(close, 0, 1, 1, 1, Qt.AlignRight) grid.addWidget(self.html, 1, 0, 1, 2) grid.addWidget( QLabel(QCoreApplication.translate("TextEditor", "Admin Label")), 2, 0) grid.addWidget(self.adminlabel, 3, 0, 1, 2) self.setLayout(grid) close.clicked.connect(self.closeEditor) self.html.textChanged.connect(self.contentChanged) self.adminlabel.textChanged.connect(self.contentChanged)
class Dashboard(QWidget): createSite = pyqtSignal() def __init__(self): QWidget.__init__(self) vbox = QVBoxLayout() layout = QGridLayout() title = QLabel() title.setText("Dashboard") fnt = title.font() fnt.setPointSize(20) fnt.setBold(True) title.setFont(fnt) self.browser = QTextBrowser() self.browser.setOpenLinks(False) self.create_button = FlatButton(":/images/create_normal.png", ":/images/create_hover.png", ":/images/create_pressed.png") self.create_button.setToolTip("Add a client") self.info = QLabel() self.info.setText("Welcome to Maria...") space = QWidget() space2 = QWidget() space3 = QWidget() space.setMinimumHeight(30) space2.setMinimumHeight(30) space3.setMinimumHeight(30) layout.addWidget(title, 0, 0, 1, 3) layout.addWidget(self.info, 1, 0, 1, 3) layout.addWidget(space, 2, 0) layout.addWidget(self.create_button, 3, 0, 1, 1, Qt.AlignCenter) vbox.addLayout(layout) vbox.addSpacing(40) vbox.addWidget(self.browser) self.setLayout(vbox) self.create_button.clicked.connect(self.createClicked) @pyqtSlot() def createClicked(self): self.createSite.emit()
def __init__(self): QWidget.__init__(self) self.delete = FlatButton(":/images/trash_normal.png", ":/images/trash_hover.png") self.edit = FlatButton(":/images/edit_normal.png", ":/images/edit_hover.png") self.edit.setToolTip( QCoreApplication.translate("TableCellButtons", "Edit Item")) self.delete.setToolTip( QCoreApplication.translate("TableCellButtons", "Delete Item")) self.item = None hbox = QHBoxLayout() hbox.addWidget(self.edit) hbox.addWidget(self.delete) self.setLayout(hbox) self.delete.clicked.connect(self.deleteItemClicked) self.edit.clicked.connect(self.editItemClicked)
def __init__(self): AnimateableEditor.__init__(self) self.grid = QGridLayout() self.cssclass = QLineEdit() self.style = QLineEdit() self.attributes = QLineEdit() self.id = QLineEdit() self.changed = False self.setAutoFillBackground(True) close = FlatButton(":/images/close_normal.png", ":/images/close_hover.png") close.setToolTip("Close Editor") titleLabel = QLabel("Section Module Settings") fnt = titleLabel.font() fnt.setPointSize(16) fnt.setBold(True) titleLabel.setFont(fnt) vbox = QVBoxLayout() vbox.addStretch() self.grid.addWidget(titleLabel, 0, 0) self.grid.addWidget(close, 0, 1, 1, 1, Qt.AlignRight) self.grid.addWidget(QLabel("CSS Class"), 1, 0) self.grid.addWidget(self.cssclass, 2, 0, 1, 2) self.grid.addWidget(QLabel("Style"), 3, 0) self.grid.addWidget(self.style, 4, 0, 1, 2) self.grid.addWidget(QLabel("Aditional Attributes"), 5, 0) self.grid.addWidget(self.attributes, 6, 0, 1, 2) self.grid.addWidget(QLabel("Id"), 7, 0) self.grid.addWidget(self.id, 8, 0, 1, 2) self.grid.addLayout(vbox, 10, 0) self.setLayout(self.grid) close.clicked.connect(self.closeEditor) self.cssclass.textChanged.connect(self.contentChanged) self.style.textChanged.connect(self.contentChanged) self.attributes.textChanged.connect(self.contentChanged) self.id.textChanged.connect(self.contentChanged)
def __init__(self): QWidget.__init__(self) from widgets.content import ContentType from widgets.flatbutton import FlatButton from widgets.hyperlink import HyperLink from widgets.section import Section self.editButton = FlatButton(":/images/edit_normal.png", ":/images/edit_hover.png") self.copyButton = FlatButton(":/images/copy_normal.png", ":/images/copy_hover.png") self.deleteButton = FlatButton(":/images/trash_normal.png", ":/images/trash_hover.png") self.addColumns = HyperLink( QCoreApplication.translate("RowEditor", "(+) Add Columns")) self.editButton.setToolTip( QCoreApplication.translate("RowEditor", "Edit Row")) self.deleteButton.setToolTip( QCoreApplication.translate("RowEditor", "Delete Row")) self.copyButton.setToolTip( QCoreApplication.translate("RowEditor", "Copy Row")) self.editButton.setMaximumWidth(24) self.copyButton.setMaximumWidth(24) self.deleteButton.setMaximumWidth(24) vbox = QVBoxLayout() vbox.setAlignment(Qt.AlignTop) vbox.setSpacing(5) vbox.addWidget(self.editButton) vbox.addWidget(self.copyButton) vbox.addWidget(self.deleteButton, 0, Qt.AlignBottom) layout = QHBoxLayout() pal = self.palette() pal.setColor(QPalette.Background, QColor(self.palette().alternateBase().color())) self.setPalette(pal) self.setAutoFillBackground(True) self.highlightedRect = QRect() self.layout = QGridLayout() self.layout.addWidget(self.addColumns, 0, 0, 1, 1, Qt.AlignCenter) self.layout.setColumnStretch(0, 1) layout.addItem(vbox) layout.addLayout(self.layout) self.setLayout(layout) self.deleteButton.clicked.connect(self.delete) self.copyButton.clicked.connect(self.copy) self.editButton.clicked.connect(self.edit) self.addColumns.clicked.connect(self.insertColumns)
class UndoableEditor(QWidget): def __init__(self): QWidget.__init__(self) self.filename = "" self.undoStack = QUndoStack() self.undo = FlatButton(":/images/undo_normal.png", ":/images/undo_hover.png", "", ":/images/undo_disabled.png") self.redo = FlatButton(":/images/redo_normal.png", ":/images/redo_hover.png", "", ":/images/redo_disabled.png") self.undo.setToolTip("Undo") self.redo.setToolTip("Redo") self.undo.setEnabled(False) self.redo.setEnabled(False) hbox = QHBoxLayout() hbox.addStretch(0) hbox.addWidget(self.undo) hbox.addWidget(self.redo) self.titleLabel = QLabel() fnt = self.titleLabel.font() fnt.setPointSize(20) fnt.setBold(True) self.titleLabel.setFont(fnt) self.layout = QGridLayout() self.layout.addWidget(self.titleLabel, 0, 0) self.layout.addLayout(hbox, 0, 2) self.setLayout(self.layout) #connect(self.redo, SIGNAL(clicked()), self, SLOT(redo())) #connect(self.undo, SIGNAL(clicked()), self, SLOT(undo())) #connect(self.undoStack, SIGNAL(canUndoChanged(bool)), self, SLOT(canUndoChanged(bool))) #connect(self.undoStack, SIGNAL(canRedoChanged(bool)), self, SLOT(canRedoChanged(bool))) #connect(self.undoStack, SIGNAL(undoTextChanged(QString)), self, SLOT(undoTextChanged(QString))) #connect(self.undoStack, SIGNAL(redoTextChanged(QString)), self, SLOT(redoTextChanged(QString))) def contentChanged(self, text): changeCommand = ChangeFileCommand(self, self.filename, text) self.undoStack.push(changeCommand)
def __init__(self): QWidget.__init__(self) self.content = None self.type = "" self.setAutoFillBackground(True) self.setMinimumWidth(120) self.setMinimumHeight(50) self.setMaximumHeight(50) self.zoom = False self.mode = Mode.EMPTY self.normalColor = QColor( self.palette().base().color().name()).lighter().name() self.enabledColor = self.palette().base().color().name() self.dropColor = QColor( self.palette().base().color().name()).lighter().lighter().name() self.setColor(self.normalColor) self.link = HyperLink( QCoreApplication.translate("ElementEditor", "(+) Insert Module")) self.editButton = FlatButton(":/images/edit_normal.png", ":/images/edit_hover.png") self.copyButton = FlatButton(":/images/copy_normal.png", ":/images/copy_hover.png") self.deleteButton = FlatButton(":/images/trash_normal.png", ":/images/trash_hover.png") self.editButton.setVisible(False) self.copyButton.setVisible(False) self.deleteButton.setVisible(False) self.editButton.setToolTip( QCoreApplication.translate("ElementEditor", "Edit Element")) self.deleteButton.setToolTip( QCoreApplication.translate("ElementEditor", "Delete Element")) self.copyButton.setToolTip( QCoreApplication.translate("ElementEditor", "Copy Element")) self.text = QLabel(QCoreApplication.translate("ElementEditor", "Text")) self.text.setVisible(False) layout = QHBoxLayout() layout.addWidget(self.link, 0, Qt.AlignCenter) layout.addWidget(self.editButton) layout.addWidget(self.copyButton) layout.addWidget(self.text, 1, Qt.AlignCenter) layout.addWidget(self.deleteButton) self.setLayout(layout) self.editButton.clicked.connect(self.edit) self.deleteButton.clicked.connect(self.delete) self.copyButton.clicked.connect(self.copy) self.link.clicked.connect(self.enable)
def createButton(self, icon, text): btn = FlatButton() pmNormal = QPixmap.fromImage(QImage(":/images/module_normal.png")) pmHover = QPixmap.fromImage(QImage(":/images/module_hover.png")) title = QLabel() pal = self.palette() pal.setColor(QPalette.Background, QColor("#999999")) pal.setColor(QPalette.Foreground, QColor("#000000")) title.setPalette(pal) title.setText(text) title.setFixedWidth(90) title.render(pmNormal, QPoint(80, 40)) title.render(pmHover, QPoint(80, 40)) iconLabel = QLabel() iconLabel.setPixmap(QPixmap.fromImage(icon)) iconLabel.render(pmNormal, QPoint(33, 33)) iconLabel.render(pmHover, QPoint(33, 33)) btn.setNormalPixmap(pmNormal) btn.setHoverPixmap(pmHover) return btn
class ElementEditor(QWidget): elementCopied = pyqtSignal(object) elementEnabled = pyqtSignal() elementDragged = pyqtSignal() def __init__(self): QWidget.__init__(self) self.content = None self.type = "" self.setAutoFillBackground(True) self.setMinimumWidth(120) self.setMinimumHeight(50) self.setMaximumHeight(50) self.zoom = False self.mode = Mode.EMPTY self.normalColor = QColor( self.palette().base().color().name()).lighter().name() self.enabledColor = self.palette().base().color().name() self.dropColor = QColor( self.palette().base().color().name()).lighter().lighter().name() self.setColor(self.normalColor) self.link = HyperLink( QCoreApplication.translate("ElementEditor", "(+) Insert Module")) self.editButton = FlatButton(":/images/edit_normal.png", ":/images/edit_hover.png") self.copyButton = FlatButton(":/images/copy_normal.png", ":/images/copy_hover.png") self.deleteButton = FlatButton(":/images/trash_normal.png", ":/images/trash_hover.png") self.editButton.setVisible(False) self.copyButton.setVisible(False) self.deleteButton.setVisible(False) self.editButton.setToolTip( QCoreApplication.translate("ElementEditor", "Edit Element")) self.deleteButton.setToolTip( QCoreApplication.translate("ElementEditor", "Delete Element")) self.copyButton.setToolTip( QCoreApplication.translate("ElementEditor", "Copy Element")) self.text = QLabel(QCoreApplication.translate("ElementEditor", "Text")) self.text.setVisible(False) layout = QHBoxLayout() layout.addWidget(self.link, 0, Qt.AlignCenter) layout.addWidget(self.editButton) layout.addWidget(self.copyButton) layout.addWidget(self.text, 1, Qt.AlignCenter) layout.addWidget(self.deleteButton) self.setLayout(layout) self.editButton.clicked.connect(self.edit) self.deleteButton.clicked.connect(self.delete) self.copyButton.clicked.connect(self.copy) self.link.clicked.connect(self.enable) def enable(self): from widgets.columneditor import ColumnEditor from widgets.sectioneditor import SectionEditor dlg = ModulDialog() dlg.exec() if not dlg.result: return editor = Plugins.element_plugins[dlg.result] self.content = editor.getDefaultContent() if isinstance(self.parentWidget(), ColumnEditor): self.parentWidget().column._items.append(self.content) elif isinstance(self.parentWidget(), SectionEditor): self.parentWidget().section._items.append(self.content) self.type = editor.tag_name self.text.setText(editor.display_name) self.setMode(Mode.ENABLED) self.elementEnabled.emit() self.edit() def copy(self): self.elementCopied.emit(self) def delete(self): self.parentWidget().removeElement(self.content) self.parentWidget().layout.removeWidget(self) self.hide() ce = self.getContentEditor() if ce: ce.editChanged("Delete Element") def edit(self): ce = self.getContentEditor() if ce: ce.elementEdit(self) def setColor(self, name): pal = self.palette() pal.setColor(QPalette.Background, QColor(name)) self.setPalette(pal) def setMode(self, mode): self.mode = mode if mode == Mode.EMPTY: self.link.setVisible(True) self.editButton.setVisible(False) self.copyButton.setVisible(False) self.deleteButton.setVisible(False) self.text.setVisible(False) self.setColor(self.normalColor) elif mode == Mode.ENABLED: self.link.setVisible(False) self.editButton.setVisible(True) self.copyButton.setVisible(True) self.deleteButton.setVisible(True) self.text.setVisible(True) self.setColor(self.enabledColor) elif mode == Mode.DROPZONE: self.link.setVisible(False) self.editButton.setVisible(False) self.copyButton.setVisible(False) self.deleteButton.setVisible(False) self.text.setVisible(True) self.text.setText( QCoreApplication.translate("ElementEditor", "Drop Here")) self.setColor(self.dropColor) def getContentEditor(self): se = self.getSectionEditor() if se: pe = se.parentWidget() if pe: sa = pe.parentWidget() if sa: vp = sa.parentWidget() if vp: cee = vp.parentWidget() if cee: return cee return None def getSectionEditor(self): from widgets.sectioneditor import SectionEditor from widgets.columneditor import ColumnEditor se = self.parentWidget() if isinstance(se, SectionEditor): return se elif isinstance(se, ColumnEditor): re = se.parentWidget() if re: se = re.parentWidget() if se: return se return None def getContent(self): return self.content def setContent(self, content): self.content = content self.type = content.tag_name if content.adminlabel: self.text.setText(content.adminlabel) else: if content.display_name: self.text.setText(content.display_name) else: self.text.setText(content.tag_name) def mousePressEvent(self, event): from widgets.columneditor import ColumnEditor from widgets.sectioneditor import SectionEditor if self.mode != Mode.ENABLED or event.button() != Qt.LeftButton: return if self.parentWidget().layout.count() == 1: self.elementDragged.emit() mimeData = WidgetMimeData() mimeData.setData(self) parent = self.parentWidget() if isinstance(parent, ColumnEditor): mimeData.source_list = parent.column._items elif isinstance(parent, SectionEditor): mimeData.source_list = parent.section._items pixmap = QPixmap(self.size()) self.render(pixmap) drag = QDrag(self) drag.setMimeData(mimeData) drag.setHotSpot(event.pos()) drag.setPixmap(pixmap) self.hide() if drag.exec(Qt.MoveAction) == Qt.IgnoreAction: self.show() def dropped(self): #seems to be a bug that after dropping the item the bgcolor changes self.setColor(self.enabledColor)
class RowEditor(QWidget): rowEditorCopied = pyqtSignal(object) def __init__(self): QWidget.__init__(self) from widgets.content import ContentType from widgets.flatbutton import FlatButton from widgets.hyperlink import HyperLink from widgets.section import Section self.editButton = FlatButton(":/images/edit_normal.png", ":/images/edit_hover.png") self.copyButton = FlatButton(":/images/copy_normal.png", ":/images/copy_hover.png") self.deleteButton = FlatButton(":/images/trash_normal.png", ":/images/trash_hover.png") self.addColumns = HyperLink("(+) Add Columns") self.editButton.setToolTip("Edit Row") self.deleteButton.setToolTip("Delete Row") self.copyButton.setToolTip("Copy Row") self.editButton.setMaximumWidth(24) self.copyButton.setMaximumWidth(24) self.deleteButton.setMaximumWidth(24) vbox = QVBoxLayout() vbox.setAlignment(Qt.AlignTop) vbox.setSpacing(5) vbox.addWidget(self.editButton) vbox.addWidget(self.copyButton) vbox.addWidget(self.deleteButton, 0, Qt.AlignBottom) layout = QHBoxLayout() pal = self.palette() pal.setColor(QPalette.Background, QColor(self.palette().alternateBase().color())) self.setPalette(pal) self.setAutoFillBackground(True) self.highlightedRect = QRect() self.layout = QGridLayout() self.layout.addWidget(self.addColumns, 0, 0, 1, 1, Qt.AlignCenter) self.layout.setColumnStretch(0, 1) layout.addItem(vbox) layout.addLayout(self.layout) self.setLayout(layout) self.deleteButton.clicked.connect(self.delete) self.copyButton.clicked.connect(self.copy) self.editButton.clicked.connect(self.edit) self.addColumns.clicked.connect(self.insertColumns) def edit(self): ce = self.getContentEditor() if ce: ce.rowEdit(self) def copy(self): self.rowEditorCopied.emit(self) def delete(self): se = self.parentWidget() if se: se.removeRowEditor(self) se.section._items.remove(self.row) ce = self.getContentEditor() if ce: ce.editChanged("Delete Row") def addColumn(self, ce, column): if self.addColumns.isVisible(): self.addColumns.setVisible(False) self.layout.removeWidget(self.addColumns) self.layout.addWidget(ce, 0, column) self.layout.setColumnStretch(column, ce.column.span) def load(self, row): from widgets.columneditor import ColumnEditor self.row = row i = 0 for column in self.row.columns: ce = ColumnEditor() ce.load(column) self.addColumn(ce, i) i = i + 1 def getContentEditor(self): se = self.parentWidget() if se: pe = se.parentWidget() if pe: sa = pe.parentWidget() if sa: vp = sa.parentWidget() if vp: cee = vp.parentWidget() if cee: return cee return None def insertColumns(self): dlg = ColumnsDialog() dlg.exec() if dlg.result == 0: return if dlg.result == 1: # 1/1 col = Column() col.span = 12 self.row._columns.append(col) ce = ColumnEditor() ce.load(col) self.addColumn(ce, 0) elif dlg.result == 2: # 1/2 - 1/2 for i in range(2): col = Column() col.span = 6 self.row._columns.append(col) ce = ColumnEditor() ce.load(col) self.addColumn(ce, i) elif dlg.result == 3: # 1/3 - 1/3 - 1/3 for i in range(3): col = Column() col.span = 4 self.row._columns.append(col) ce = ColumnEditor() ce.load(col) self.addColumn(ce, i) elif dlg.result == 4: # 1/4 - 1/4 - 1/4 - 1/4 for i in range(4): col = Column() col.span = 3 self.row._columns.append(col) ce = ColumnEditor() ce.load(col) self.addColumn(ce, i) elif dlg.result == 5: # 2/3 - 1/3 col = Column() col.span = 8 self.row._columns.append(col) ce = ColumnEditor() ce.load(col) self.addColumn(ce, 0) col = Column() col.span = 4 self.row._columns.append(col) ce = ColumnEditor() ce.load(col) self.addColumn(ce, 1) elif dlg.result == 6: # 1/3 - 2/3 col = Column() col.span = 4 self.row._columns.append(col) ce = ColumnEditor() ce.load(col) self.addColumn(ce, 0) col = Column() col.span = 8 self.row._columns.append(col) ce = ColumnEditor() ce.load(col) self.addColumn(ce, 1) elif dlg.result == 7: # 1/4 - 3/4 col = Column() col.span = 2 self.row._columns.append(col) ce = ColumnEditor() ce.load(col) self.addColumn(ce, 0) col = Column() col.span = 9 self.row._columns.append(col) ce = ColumnEditor() ce.load(col) self.addColumn(ce, 1) elif dlg.result == 8: # 3/4 - 1/4 col = Column() col.span = 9 self.row._columns.append(col) ce = ColumnEditor() ce.load(col) self.addColumn(ce, 0) col = Column() col.span = 3 self.row._columns.append(col) ce = ColumnEditor() ce.load(col) self.addColumn(ce, 1) elif dlg.result == 9: # 1/2 - 1/4 - 1/4 col = Column() col.span = 6 self.row._columns.append(col) ce = ColumnEditor() ce.load(col) self.addColumn(ce, 0) col = Column() col.span = 3 self.row._columns.append(col) ce = ColumnEditor() ce.load(col) self.addColumn(ce, 1) col = Column() col.span = 3 self.row._columns.append(col) ce = ColumnEditor() ce.load(col) self.addColumn(ce, 2) elif dlg.result == 10: # 1/4 - 1/4 - 1/2 col = Column() col.span = 3 self.row._columns.append(col) ce = ColumnEditor() ce.load(col) self.addColumn(ce, 0) col = Column() col.span = 3 self.row._columns.append(col) ce = ColumnEditor() ce.load(col) self.addColumn(ce, 1) col = Column() col.span = 6 self.row._columns.append(col) ce = ColumnEditor() ce.load(col) self.addColumn(ce, 2) elif dlg.result == 11: # 1/4 - 1/2 - 1/4 col = Column() col.span = 3 self.row._columns.append(col) ce = ColumnEditor() ce.load(col) self.addColumn(ce, 0) col = Column() col.span = 6 self.row._columns.append(col) ce = ColumnEditor() ce.load(col) self.addColumn(ce, 1) col = Column() col.span = 3 self.row._columns.append(col) ce = ColumnEditor() ce.load(col) self.addColumn(ce, 2) ce = self.getContentEditor() if ce: ce.editChanged("Add Columns") def enableColumnAcceptDrop(self, mode): for i in range(self.layout.count()): ce = self.layout.itemAt(i).widget() if ce: ce.setAcceptDrops(mode) def mousePressEvent(self, event): from widgets.sectioneditor import SectionEditor mimeData = WidgetMimeData() mimeData.setSize(self.size().width(), self.size().height()) mimeData.setData(self) parent = self.parentWidget() if isinstance(parent, SectionEditor): mimeData.source_list = parent.section._items pixmap = QPixmap(self.size()) self.render(pixmap) drag = QDrag(self) drag.setMimeData(mimeData) drag.setHotSpot(event.pos()) drag.setPixmap(pixmap) se = self.parentWidget() se.removeRowEditor(self) pe = se.parentWidget() pe.enableColumnAcceptDrop(False) self.hide() if drag.exec(Qt.MoveAction) == Qt.IgnoreAction: se.addRowEditor(self) self.show() pe.enableColumnAcceptDrop(True)
def __init__(self, fullwidth): QWidget.__init__(self) from widgets.hyperlink import HyperLink from widgets.flatbutton import FlatButton from widgets.section import Section from widgets.content import ContentType from widgets.elementeditor import ElementEditor, Mode self.fullwidth = fullwidth self.section = None self.id = None self.cssclass = None self.style = None self.attributes = None self.setAutoFillBackground(True) self.setAcceptDrops(True) self.setBGColor() vbox = QVBoxLayout() vbox.setAlignment(Qt.AlignTop) vbox.setSpacing(5) self.edit_button = FlatButton(":/images/edit_normal.png", ":/images/edit_hover.png") self.copy_button = FlatButton(":/images/copy_normal.png", ":/images/copy_hover.png") self.delete_button = FlatButton(":/images/trash_normal.png", ":/images/trash_hover.png") self.edit_button.setToolTip("Edit Section") self.delete_button.setToolTip("Delete Section") self.copy_button.setToolTip("Copy Section") self.edit_button.setMaximumWidth(24) self.copy_button.setMaximumWidth(24) self.delete_button.setMaximumWidth(24) vbox.addWidget(self.edit_button) vbox.addWidget(self.copy_button) vbox.addWidget(self.delete_button) vboxRight = QVBoxLayout() vboxRight.setAlignment(Qt.AlignLeft) layout = QHBoxLayout() self.layout = QVBoxLayout() layout.addLayout(vbox) addRow = HyperLink("(+) Add Row") vboxRight.addLayout(self.layout) if self.fullwidth: ee = ElementEditor() ee.elementEnabled.connect(self.addElement) ee.elementDragged.connect(self.addElement) # connect(ee, SIGNAL(elementCopied(ElementEditor*)), self, SLOT(copyElement(ElementEditor*))) self.layout.addWidget(ee, 0, Qt.AlignTop) else: vboxRight.addWidget(addRow) layout.addLayout(vboxRight) self.setLayout(layout) self.delete_button.clicked.connect(self.delete) self.copy_button.clicked.connect(self.copy) addRow.clicked.connect(self.addRow) self.edit_button.clicked.connect(self.edit)
class SectionEditor(QWidget): sectionEditorCopied = pyqtSignal(object) def __init__(self, fullwidth): QWidget.__init__(self) from widgets.hyperlink import HyperLink from widgets.flatbutton import FlatButton from widgets.section import Section from widgets.content import ContentType from widgets.elementeditor import ElementEditor, Mode self.fullwidth = fullwidth self.section = None self.id = None self.cssclass = None self.style = None self.attributes = None self.setAutoFillBackground(True) self.setAcceptDrops(True) self.setBGColor() vbox = QVBoxLayout() vbox.setAlignment(Qt.AlignTop) vbox.setSpacing(5) self.edit_button = FlatButton(":/images/edit_normal.png", ":/images/edit_hover.png") self.copy_button = FlatButton(":/images/copy_normal.png", ":/images/copy_hover.png") self.delete_button = FlatButton(":/images/trash_normal.png", ":/images/trash_hover.png") self.edit_button.setToolTip("Edit Section") self.delete_button.setToolTip("Delete Section") self.copy_button.setToolTip("Copy Section") self.edit_button.setMaximumWidth(24) self.copy_button.setMaximumWidth(24) self.delete_button.setMaximumWidth(24) vbox.addWidget(self.edit_button) vbox.addWidget(self.copy_button) vbox.addWidget(self.delete_button) vboxRight = QVBoxLayout() vboxRight.setAlignment(Qt.AlignLeft) layout = QHBoxLayout() self.layout = QVBoxLayout() layout.addLayout(vbox) addRow = HyperLink("(+) Add Row") vboxRight.addLayout(self.layout) if self.fullwidth: ee = ElementEditor() ee.elementEnabled.connect(self.addElement) ee.elementDragged.connect(self.addElement) # connect(ee, SIGNAL(elementCopied(ElementEditor*)), self, SLOT(copyElement(ElementEditor*))) self.layout.addWidget(ee, 0, Qt.AlignTop) else: vboxRight.addWidget(addRow) layout.addLayout(vboxRight) self.setLayout(layout) self.delete_button.clicked.connect(self.delete) self.copy_button.clicked.connect(self.copy) addRow.clicked.connect(self.addRow) self.edit_button.clicked.connect(self.edit) def edit(self): ce = self.getContentEditor() if ce: ce.sectionEdit(self) def addRow(self): row = Row() self.section._items.append(row) re = RowEditor() re.load(row) self.addRowEditor(re) ce = self.getContentEditor() if ce: ce.editChanged("Add Row") def addRowEditor(self, re): re.rowEditorCopied.connect(self.copyRowEditor) self.layout.addWidget(re) def copyRowEditor(self, re): ren = RowEditor() row = re.row.clone() ren.load(row) self.section._items.append(row) self.addRowEditor(ren) ce = self.getContentEditor() if ce: ce.editChanged("Copy Row") def copy(self): self.sectionEditorCopied.emit(self) def delete(self): pe = self.parentWidget() if pe: pe.removeSection(self) def setBGColor(self): pal = self.palette() if self.fullwidth: pal.setColor(QPalette.Background, QColor("#800080")) else: pal.setColor(QPalette.Background, QColor(self.palette().base().color().name())) self.setPalette(pal) def addElement(self): ee = ElementEditor() self.layout.addWidget(ee, 0, Qt.AlignTop) ee.elementEnabled.connect(self.addElement) ee.elementDragged.connect(self.addElement) # connect(ee, SIGNAL(elementCopied(ElementEditor*)), self, SLOT(copyElement(ElementEditor*))) def addElementEditor(self, ee): ee.elementEnabled.connect(self.addElement) ee.elementDragged.connect(self.addElement) # connect(ee, SIGNAL(elementCopied(ElementEditor*)), self, SLOT(copyElement(ElementEditor*))) self.layout.insertWidget(self.layout.count() - 1, ee, 0, Qt.AlignTop) def setSection(self, section): self.section = section def removeRowEditor(self, re): re.setVisible(False) self.layout.removeWidget(re) def load(self, section): from widgets.elementeditor import ElementEditor, Mode from widgets.roweditor import RowEditor self.section = section for item in self.section.items: if isinstance(item, Row): re = RowEditor() re.load(item) self.addRowEditor(re) else: ee = ElementEditor() ee.setContent(item) ee.setMode(Mode.ENABLED) self.addElementEditor(ee) def getContentEditor(self): pe = self.parentWidget() if pe: sa = pe.parentWidget() if sa: vp = sa.parentWidget() if vp: cee = vp.parentWidget() if cee: return cee return None def dragEnterEvent(self, event): myData = event.mimeData() if myData: if not self.section.fullwidth and isinstance( myData.getData(), RowEditor): # insert a dropzone at the end self.layout.addWidget(DropZone(myData.width, myData.height)) event.accept() elif self.section.fullwidth and isinstance(myData.getData(), ElementEditor): for i in range(self.layout.count()): editor = self.layout.itemAt(i).widget() if editor and editor.mode == Mode.EMPTY: editor.setMode(Mode.DROPZONE) break event.accept() else: event.ignore() else: event.ignore() def dragLeaveEvent(self, event): # remove dropzones for i in range(self.layout.count()): dz = self.layout.itemAt(i).widget() if isinstance(dz, DropZone): dz.hide() self.layout.removeWidget(dz) del dz break editor = self.layout.itemAt(i).widget() if isinstance(editor, ElementEditor) and editor.mode == Mode.DROPZONE: # put editor to the end of the list editor.setMode(Mode.EMPTY) self.layout.removeWidget(editor) self.layout.addWidget(editor) break event.accept() def dragMoveEvent(self, event): myData = event.mimeData() if myData: re = myData.getData() if isinstance(re, RowEditor): height = 0 row = 0 # evaluate position for the dropzone to be placed for i in range(self.layout.count()): editor = self.layout.itemAt(i).widget() if isinstance(editor, RowEditor): if event.pos().y() > height and event.pos().y( ) < height + editor.height(): break height += editor.height() row = row + 1 # find dropzone and replace it to location for i in range(self.layout.count()): dz = self.layout.itemAt(i).widget() if isinstance(dz, DropZone): if i != row: self.layout.insertWidget(row, dz) break event.setDropAction(Qt.MoveAction) event.accept() else: ee = myData.getData() if ee: row = event.pos().y() / 50 for i in range(self.layout.count()): editor = self.layout.itemAt(i).widget() if editor and editor.mode == Mode.DROPZONE: if i != row: # put dropzone under mouse pointer self.layout.insertWidget(row, editor) break event.setDropAction(Qt.MoveAction) event.accept() else: event.ignore() else: event.ignore() def dropEvent(self, event): myData = event.mimeData() if myData: re = myData.getData() if isinstance(re, RowEditor): # place the dragged RowEditor to the place where DropZone is now for i in range(self.layout.count()): dz = self.layout.itemAt(i).widget() if isinstance(dz, DropZone): dz.hide() self.layout.replaceWidget(dz, re) new_pos = i re.show() del dz break ce = self.getContentEditor() if ce: myData.source_list.remove(re.row) self.section.insertElement(re.row, new_pos) ce.editChanged("Move Row") event.setDropAction(Qt.MoveAction) event.accept() else: ee = myData.getData() if isinstance(ee, ElementEditor): for i in range(self.layout.count()): dz = self.layout.itemAt(i).widget() if isinstance( dz, ElementEditor) and dz.mode == Mode.DROPZONE: # remove widget if it belongs to self layout self.layout.removeWidget(ee) # replace dropzone with dragged element self.layout.replaceWidget(dz, ee) new_pos = i # and put dropzone to the end of the list dz.setMode(Mode.EMPTY) self.layout.removeWidget(dz) self.layout.addWidget(dz) break ee.dropped() ee.show() ee.elementEnabled.disconnect() ee.elementDragged.disconnect() # ee.elementCopied.disconnect() ee.elementEnabled.connect(self.addElement) ee.elementDragged.connect(self.addElement) # ee.elementCopied.connect(self.copyElement) ce = self.getContentEditor() if ce: myData.source_list.remove(ee.content) self.section.insertElement(ee.content, new_pos) ce.editChanged("Move Element") event.setDropAction(Qt.MoveAction) event.accept() else: event.ignore() else: event.ignore() def enableColumnAcceptDrop(self, mode): for i in range(self.layout.count()): re = self.layout.itemAt(i).widget() if isinstance(re, RowEditor): re.enableColumnAcceptDrop(mode) def mousePressEvent(self, event): mimeData = WidgetMimeData() mimeData.setSize(self.size().width(), self.size().height()) mimeData.setData(self) pixmap = QPixmap(self.size()) self.render(pixmap) drag = QDrag(self) drag.setMimeData(mimeData) drag.setHotSpot(event.pos()) drag.setPixmap(pixmap) pe = self.parentWidget() pe.removeSectionEditor(self) pe.enableColumnAcceptDrop(False) pe.enableSectionAcceptDrop(False) self.hide() if drag.exec(Qt.MoveAction) == Qt.IgnoreAction: pe.addSection(self) self.show() pe.enableColumnAcceptDrop(True) pe.enableSectionAcceptDrop(True) def removeElement(self, content): self.section._items.remove(content)
class MainWindow(QMainWindow): siteLoaded = pyqtSignal(object) def __init__(self): QMainWindow.__init__(self) self.site = None self.editor = "" self.install_directory = os.getcwd() self.content_after_animation = "" self.default_path = "" self.method_after_animation = "" Generator.install_directory = self.install_directory self.initUndoRedo() self.initGui() self.readSettings() self.loadPlugins() if self.default_path: if self.loadProject(os.path.join(self.default_path, "Site.qml")): gen = Generator() gen.generateSite(self, self.site) self.dashboard.setExpanded(True) self.showDashboard() self.statusBar().showMessage( QCoreApplication.translate("MainWindow", "Ready")) def actualThemeChanged(self, themename): self.theme_settings_button.setVisible(False) for name in Plugins.themePluginNames(): tei = Plugins.getThemePlugin(name) if tei: if tei.theme_name == themename: self.theme_settings_button.setVisible(True) break def loadProject(self, filename): self.default_path = filename[0:-9] # - /Site.qml if self.reloadProject(filename): # create temp dir for undo redo tempPath = self.site.source_path[self.site.source_path.rfind("/") + 1:] temp = QDir(os.path.join(QDir.tempPath(), "FlatSiteBuilder")) temp.mkdir(tempPath) temp.cd(tempPath) temp.mkdir("pages") temp.mkdir("posts") # in case these subfolders were empty and not published to github dir = QDir(self.site.source_path) dir.mkdir("pages") dir.mkdir("posts") dir.mkdir("assets") dir.cd("assets") dir.mkdir("images") return True else: return False def initUndoRedo(self): self.undoStack = QUndoStack() temp = QDir(os.path.join(QDir.tempPath(), "FlatSiteBuilder")) if temp.exists(): temp.removeRecursively() temp.setPath(QDir.tempPath()) temp.mkdir("FlatSiteBuilder") def initGui(self): self.installEventFilter(self) self.dashboard = Expander( QCoreApplication.translate("MainWindow", "Dashboard"), ":/images/dashboard_normal.png", ":/images/dashboard_hover.png", ":/images/dashboard_selected.png") self.content = Expander( QCoreApplication.translate("MainWindow", "Content"), ":/images/pages_normal.png", ":/images/pages_hover.png", ":/images/pages_selected.png") self.appearance = Expander( QCoreApplication.translate("MainWindow", "Appearance"), ":/images/appearance_normal.png", ":/images/appearance_hover.png", ":/images/appearance_selected.png") self.settings = Expander( QCoreApplication.translate("MainWindow", "Settings"), ":/images/settings_normal.png", ":/images/settings_hover.png", ":/images/settings_selected.png") self.setWindowTitle(QCoreApplication.applicationName() + " " + QCoreApplication.applicationVersion()) vbox = QVBoxLayout() vbox.addWidget(self.dashboard) vbox.addWidget(self.content) vbox.addWidget(self.appearance) vbox.addWidget(self.settings) vbox.addStretch() content_box = QVBoxLayout() pages_button = HyperLink( QCoreApplication.translate("MainWindow", "Pages")) posts_button = HyperLink( QCoreApplication.translate("MainWindow", "Posts")) content_box.addWidget(pages_button) content_box.addWidget(posts_button) self.content.addLayout(content_box) app_box = QVBoxLayout() themes_button = HyperLink( QCoreApplication.translate("MainWindow", "Themes")) menus_button = HyperLink( QCoreApplication.translate("MainWindow", "Menus")) self.theme_settings_button = HyperLink( QCoreApplication.translate("MainWindow", "Theme Settings")) self.theme_settings_button.setVisible(False) app_box.addWidget(menus_button) app_box.addWidget(themes_button) app_box.addWidget(self.theme_settings_button) self.appearance.addLayout(app_box) scroll_content = QWidget() scroll_content.setLayout(vbox) scroll = QScrollArea() scroll.setHorizontalScrollBarPolicy(Qt.ScrollBarAsNeeded) scroll.setVerticalScrollBarPolicy(Qt.ScrollBarAsNeeded) scroll.setWidget(scroll_content) scroll.setWidgetResizable(True) scroll.setMaximumWidth(200) scroll.setMinimumWidth(200) self.navigationdock = QDockWidget( QCoreApplication.translate("MainWindow", "Navigation"), self) self.navigationdock.setAllowedAreas(Qt.LeftDockWidgetArea | Qt.RightDockWidgetArea) self.navigationdock.setWidget(scroll) self.navigationdock.setObjectName("Navigation") self.addDockWidget(Qt.LeftDockWidgetArea, self.navigationdock) self.showDock = FlatButton(":/images/edit_normal.png", ":/images/edit_hover.png") self.showDock.setToolTip( QCoreApplication.translate("MainWindow", "Show Navigation")) self.statusBar().addPermanentWidget(self.showDock) self.dashboard.expanded.connect(self.dashboardExpanded) self.dashboard.clicked.connect(self.showDashboard) self.content.expanded.connect(self.contentExpanded) self.content.clicked.connect(self.showPages) self.appearance.expanded.connect(self.appearanceExpanded) self.appearance.clicked.connect(self.showMenus) self.settings.expanded.connect(self.settingsExpanded) self.settings.clicked.connect(self.showSettings) menus_button.clicked.connect(self.showMenus) pages_button.clicked.connect(self.showPages) posts_button.clicked.connect(self.showPosts) themes_button.clicked.connect(self.showThemes) self.theme_settings_button.clicked.connect(self.showThemesSettings) self.showDock.clicked.connect(self.showMenu) self.navigationdock.visibilityChanged.connect( self.dockVisibilityChanged) def showDashboard(self): if self.editor: self.method_after_animation = "showDashboard" self.editor.closeEditor() return db = Dashboard(self.site, self.default_path) db.loadSite.connect(self.loadProject) db.previewSite.connect(self.previewSite) db.publishSite.connect(self.publishSite) db.createSite.connect(self.createSite) db.buildSite.connect(self.buildSite) self.siteLoaded.connect(db.siteLoaded) self.setCentralWidget(db) def setCentralWidget(self, widget): # do not delete plugin editors old_widget = self.takeCentralWidget() if not isinstance(old_widget, PublisherInterface) and not isinstance( old_widget, ThemeEditorInterface): del old_widget super().setCentralWidget(widget) widget.show() def closeEvent(self, event): self.writeSettings() event.accept() def writeSettings(self): settings = QSettings(QSettings.IniFormat, QSettings.UserScope, QCoreApplication.organizationName(), QCoreApplication.applicationName()) settings.setValue("geometry", self.saveGeometry()) settings.setValue("state", self.saveState()) if self.site: settings.setValue("lastSite", self.site.source_path) def readSettings(self): settings = QSettings(QSettings.IniFormat, QSettings.UserScope, QCoreApplication.organizationName(), QCoreApplication.applicationName()) geometry = settings.value("geometry", QByteArray()) if geometry.isEmpty(): availableGeometry = QApplication.desktop().availableGeometry(self) self.resize(int(availableGeometry.width() / 2), int(availableGeometry.height() / 2)) self.move(int(((availableGeometry.width() - self.width()) / 2)), int((availableGeometry.height() - self.height()) / 2)) else: self.restoreGeometry(geometry) self.restoreState(settings.value("state")) self.default_path = settings.value("lastSite") def reloadProject(self, filename): sys.stdout.flush() engine = QQmlEngine() self.site_component = component = QQmlComponent(engine) self.site_component.loadUrl(QUrl.fromLocalFile(filename)) self.site = self.site_component.create() if self.site is not None: self.site.setFilename(filename) self.site.setWindow(self) else: for error in self.site_component.errors(): print(error.toString()) return False if self.site.output == "": self.site.output = "docs" self.site.loadMenus() self.site.loadPages() self.site.loadPosts() self.theme_settings_button.setVisible(False) Plugins.setActualThemeEditorPlugin("") for key in Plugins.themePluginNames(): tei = Plugins.getThemePlugin(key) if tei: if tei.theme_name == self.site.theme: Plugins.setActualThemeEditorPlugin(tei.class_name) self.theme_settings_button.setVisible(True) break #if not self.site.publisher: # if len(Plugins.publishPluginNames()) > 0: # self.site.publisher = Plugins.publishPluginNames[0] Plugins.setActualPublishPlugin(self.site.publisher) self.siteLoaded.emit(self.site) return True def dashboardExpanded(self, value): if value: self.content.setExpanded(False) self.appearance.setExpanded(False) self.settings.setExpanded(False) def contentExpanded(self, value): if value: self.dashboard.setExpanded(False) self.appearance.setExpanded(False) self.settings.setExpanded(False) def appearanceExpanded(self, value): if value: self.dashboard.setExpanded(False) self.content.setExpanded(False) self.settings.setExpanded(False) def settingsExpanded(self, value): if value: self.dashboard.setExpanded(False) self.content.setExpanded(False) self.appearance.setExpanded(False) def showMenus(self): if self.editor: self.method_after_animation = "showMenus" self.editor.closeEditor() return edit = MenuList(self, self.site) edit.editContent.connect(self.editMenu) self.setCentralWidget(edit) def showPages(self): if self.editor: self.method_after_animation = "showPages" self.editor.closeEditor() return list = ContentList(self.site, ContentType.PAGE) list.editContent.connect(self.editContent) self.setCentralWidget(list) def showPosts(self): if self.editor: self.method_after_animation = "showPosts" self.editor.closeEditor() return list = ContentList(self.site, ContentType.POST) list.editContent.connect(self.editContent) self.setCentralWidget(list) def showThemes(self): if self.editor: self.method_after_animation = "showThemes" self.editor.closeEditor() return tc = ThemeChooser(self, self.site) self.setCentralWidget(tc) def showThemesSettings(self): tei = Plugins.getThemePlugin(Plugins.actualThemeEditorPlugin()) if tei: if self.editor: self.method_after_animation = "showThemesSettings" self.editor.closeEditor() return path = self.site.source_path tei.setWindow(self) tei.setSourcePath(path) self.setCentralWidget(tei) else: self.statusBar().showMessage( QCoreApplication.translate("MainWindow", "Unable to load plugin") + " " + Plugins.actualThemeEditorPlugin()) def showSettings(self): if self.editor: self.method_after_animation = "showSettings" self.editor.closeEditor() return sse = SiteSettingsEditor(self, self.site) self.setCentralWidget(sse) def showMenu(self): self.navigationdock.setVisible(True) def dockVisibilityChanged(self, visible): self.showDock.setVisible(not visible) def previewSite(self, content=None): if self.editor and content: self.content_after_animation = content self.editor.closeEditor() return dir = os.path.join(self.default_path, self.site.output) if not content: if len(self.site.pages) > 0: content = self.site.pages[0] for c in self.site.pages: if c.url == "index.html": content = c break elif len(self.site.posts) > 0: content = self.site.posts()[0] if content: file = content.url self.webView = QWebEngineView() self.webView.loadFinished.connect(self.webViewLoadFinished) url = pathlib.Path(os.path.join(dir, file)).as_uri() self.webView.setUrl(QUrl(url)) self.setCursor(Qt.WaitCursor) else: self.statusBar().showMessage( QCoreApplication.translate( "MainWindow", "Site has no pages or posts to preview.")) def webViewLoadFinished(self, success): if success: self.setCentralWidget(self.webView) self.webView.loadFinished.disconnect(self.webViewLoadFinished) else: QMessageBox.warning( self, "FlatSiteBuilder", QCoreApplication.translate("MainWindow", "Unable to open webpage.")) self.setCursor(Qt.ArrowCursor) def publishSite(self): pluginName = Plugins.actualPublishPlugin() pi = Plugins.getPublishPlugin(pluginName) if pi: self.setCentralWidget(pi) pi.setSitePath(self.install_directory, self.site.source_path) else: QMessageBox.warning( self, "FlatSiteBuilder", QCoreApplication.translate( "MainWindow", "Website has no publish plugin configured.")) def createSite(self): wiz = SiteWizard(self.install_directory, parent=self) wiz.loadSite.connect(self.loadProject) wiz.buildSite.connect(self.buildSite) wiz.show() def buildSite(self): self.site.loadMenus() self.site.loadPages() self.site.loadPosts() if len(self.site.pages) == 0 and len(self.site.posts) == 0: self.statusBar().showMessage( QCoreApplication.translate( "MainWindow", "Site has no pages or posts to build.")) else: gen = Generator() gen.generateSite(self, self.site) self.statusBar().showMessage( self.site.title + " " + QCoreApplication.translate("MainWindow", "has been generated")) def editMenu(self, item): menu = item.data(Qt.UserRole) me = MenuEditor(self, menu, self.site) self.editor = me list = self.centralWidget() if list: list.registerMenuEditor(me) list.editedItemChanged.connect(self.editedItemChanged) self.editor.closes.connect(self.editorClosed) self.editor.contentChanged.connect(self.menuChanged) self.animate(item) def editContent(self, item): content = item.data(Qt.UserRole) self.editor = ContentEditor(self, self.site, content) self.siteLoaded.connect(self.editor.siteLoaded) self.editor.closes.connect(self.editorClosed) self.editor.preview.connect(self.previewSite) self.animate(item) def animate(self, item): panel = self.centralWidget() self.list = item.tableWidget() self.row = item.row() # create a cell widget to get the right position in the table self.cellWidget = QWidget() self.cellWidget.setMaximumHeight(0) self.list.setCellWidget(self.row, 1, self.cellWidget) pos = self.cellWidget.mapTo(panel, QPoint(0, 0)) self.editor.setParent(panel) self.editor.move(pos) self.editor.resize(self.cellWidget.size()) self.editor.show() self.animation = QPropertyAnimation(self.editor, "geometry".encode("utf-8")) self.animation.setDuration(300) self.animation.setStartValue( QRect(pos.x(), pos.y(), self.cellWidget.size().width(), self.cellWidget.size().height())) self.animation.setEndValue( QRect(0, 0, panel.size().width(), panel.size().height())) self.animation.start() def eventFilter(self, watched, event): if watched == self and event.type() == QEvent.Resize and self.editor: w = self.centralWidget() if w: self.editor.resize(w.size()) return False def editorClosed(self): pos = self.cellWidget.mapTo(self.centralWidget(), QPoint(0, 0)) # correct end values in case of resizing the window self.animation.setStartValue( QRect(pos.x(), pos.y(), self.cellWidget.size().width(), self.cellWidget.size().height())) self.animation.finished.connect(self.animationFineshedZoomOut) self.animation.setDirection(QAbstractAnimation.Backward) self.animation.start() def animationFineshedZoomOut(self): self.list.removeCellWidget(self.row, 1) del self.animation # in the case self.editor was a MenuEditor, we have to unregister it in the MenuList # should be refactored some day :-) list = self.centralWidget() if list is MenuEditor: list.unregisterMenuEditor() if isinstance(list, ContentList): list.reload() del self.editor self.editor = None if self.method_after_animation == "showDashboard": self.showDashboard() self.method_after_animation = "" elif self.method_after_animation == "showSettings": self.showSettings() elif self.method_after_animation == "showThemesSettings": self.showThemesSettings() elif self.method_after_animation == "showThemes": self.showThemes() elif self.method_after_animation == "showMenus": self.showMenus() elif self.method_after_animation == "showPages": self.showPages() elif self.method_after_animation == "showPosts": self.showPosts() if self.content_after_animation: self.previewSite(self.content_after_animation) self.content_after_animation = None def contentChanged(self, content): self.list.item(self.row, 1).setText(content.title()) self.list.item(self.row, 2).setText(content.source()) self.list.item(self.row, 3).setText(content.layout()) self.list.item(self.row, 4).setText(content.author()) self.list.item(self.row, 5).setText(content.date().toString("dd.MM.yyyy")) def menuChanged(self, menu): self.list.item(self.row, 1).setText(menu.name()) def editedItemChanged(self, item): # this will happen, if the MenuList.reloadMenu() has been called by the undo.command self.list = item.tableWidget() self.row = item.row() self.cellWidget = QWidget() self.list.setCellWidget(self.row, 1, self.cellWidget) def loadPlugins(self): # check if we are running in a frozen environment (pyinstaller --onefile) if getattr(sys, "frozen", False): bundle_dir = sys._MEIPASS # if we are running in a onefile environment, then copy all plugin to /tmp/... if bundle_dir != os.getcwd(): os.mkdir(os.path.join(bundle_dir, "plugins")) for root, dirs, files in os.walk( os.path.join(os.getcwd(), "plugins")): for file in files: shutil.copy(os.path.join(root, file), os.path.join(bundle_dir, "plugins")) print("copy", file) break # do not copy __pycache__ else: bundle_dir = os.getcwd() plugins_dir = os.path.join(bundle_dir, "plugins") for root, dirs, files in os.walk(plugins_dir): for file in files: modulename, ext = os.path.splitext(file) if ext == ".py": module = import_module("plugins." + modulename) for name, klass in inspect.getmembers( module, inspect.isclass): if klass.__module__ == "plugins." + modulename: instance = klass() if isinstance(instance, ElementEditorInterface): Plugins.addElementPlugin(name, instance) instance.registerContenType() elif isinstance(instance, ThemeEditorInterface): Plugins.addThemePlugin(name, instance) elif isinstance(instance, PublisherInterface): Plugins.addPublishPlugin(name, instance) elif isinstance(instance, GeneratorInterface): Plugins.addGeneratorPlugin(name, instance) break # not to list __pycache__
class ContentList(QWidget): editContent = pyqtSignal(object) def __init__(self, site, type): QWidget.__init__(self) self.site = site self.addedContentName = "" self.type = type self.undoStack = QUndoStack() vbox = QVBoxLayout() layout = QGridLayout() titleLabel = QLabel() button = QPushButton() if self.type == ContentType.PAGE: button.setText("Add Page") else: button.setText("Add Post") button.setMaximumWidth(120) if self.type == ContentType.PAGE: titleLabel.setText("Pages") else: titleLabel.setText("Posts") fnt = titleLabel.font() fnt.setPointSize(20) fnt.setBold(True) titleLabel.setFont(fnt) self.undo = FlatButton(":/images/undo_normal.png", ":/images/undo_hover.png", "", ":/images/undo_disabled.png") self.redo = FlatButton(":/images/redo_normal.png", ":/images/redo_hover.png", "", ":/images/redo_disabled.png") self.undo.setToolTip("Undo") self.redo.setToolTip("Redo") self.undo.setEnabled(False) self.redo.setEnabled(False) hbox = QHBoxLayout() hbox.addStretch(0) hbox.addWidget(self.undo) hbox.addWidget(self.redo) self.list = QTableWidget(0, 6, self) self.list.verticalHeader().hide() self.list.setSelectionMode(QAbstractItemView.SingleSelection) self.list.setSelectionBehavior(QAbstractItemView.SelectRows) self.list.horizontalHeader().setSectionResizeMode( 1, QHeaderView.Stretch) self.list.setToolTip("Double click to edit item") labels = ["", "Name", "Source", "Layout", "Author", "Date"] self.list.setHorizontalHeaderLabels(labels) self.reload() layout.addWidget(titleLabel, 0, 0) layout.addLayout(hbox, 0, 2) layout.addWidget(button, 1, 0) layout.addWidget(self.list, 2, 0, 1, 3) vbox.addLayout(layout) self.setLayout(vbox) button.clicked.connect(self.addPage) self.list.cellDoubleClicked.connect(self.tableDoubleClicked) self.redo.clicked.connect(self.doredo) self.undo.clicked.connect(self.doundo) self.undoStack.canUndoChanged.connect(self.canUndoChanged) self.undoStack.canRedoChanged.connect(self.canRedoChanged) self.undoStack.redoTextChanged.connect(self.redoTextChanged) def reload(self): self.list.setRowCount(0) row = -1 itemToEdit = None if self.type == ContentType.PAGE: self.site.loadPages() for i in range(len(self.site.pages)): content = self.site.pages[i] self.addListItem(content) if content.source == self.addedContentName: row = self.list.rowCount() - 1 itemToEdit = self.list.item(row, 1) else: self.site.loadPosts() for i in range(0, len(self.site.posts)): content = self.site.posts[i] self.addListItem(content) if content.source == self.addedContentName: row = self.list.rowCount() - 1 if itemToEdit: self.addedContentName = "" self.list.selectRow(row) self.editContent.emit(itemToEdit) def addListItem(self, content): rows = self.list.rowCount() self.list.setRowCount(rows + 1) tcb = TableCellButtons() tcb.setItem(content) tcb.deleteItem.connect(self.deleteContent) tcb.editItem.connect(self.edit) self.list.setCellWidget(rows, 0, tcb) self.list.setRowHeight(rows, tcb.sizeHint().height()) titleItem = QTableWidgetItem(content.title) titleItem.setFlags(titleItem.flags() ^ Qt.ItemIsEditable) titleItem.setData(Qt.UserRole, content) self.list.setItem(rows, 1, titleItem) sourceItem = QTableWidgetItem(content.source) sourceItem.setFlags(titleItem.flags() ^ Qt.ItemIsEditable) self.list.setItem(rows, 2, sourceItem) layoutItem = QTableWidgetItem(content.layout) layoutItem.setFlags(layoutItem.flags() ^ Qt.ItemIsEditable) self.list.setItem(rows, 3, layoutItem) authorItem = QTableWidgetItem(content.author) authorItem.setFlags(authorItem.flags() ^ Qt.ItemIsEditable) self.list.setItem(rows, 4, authorItem) dateItem = QTableWidgetItem(content.date.toString("dd.MM.yyyy")) dateItem.setFlags(dateItem.flags() ^ Qt.ItemIsEditable) self.list.setItem(rows, 5, dateItem) def canUndoChanged(self, can): self.undo.setEnabled(can) def canRedoChanged(self, can): self.redo.setEnabled(can) def undoTextChanged(self, text): self.undo.setToolTip("Undo " + text) def redoTextChanged(self, text): self.redo.setToolTip("Redo " + text) def doundo(self): self.undoStack.undo() def doredo(self): self.undoStack.redo() def addPage(self): self.addedContentName = self.site.createTemporaryContent(self.type) info = QFileInfo(self.addedContentName) self.addedContentName = info.fileName() self.reload() def tableDoubleClicked(self, r, i): item = self.list.item(r, 1) self.undoStack.clear() self.editContent.emit(item) def edit(self, content): for row in range(self.list.rowCount()): item = self.list.item(row, 1) m = item.data(Qt.UserRole) if m == content: self.list.selectRow(row) self.undoStack.clear() self.editContent.emit(item) break def deleteContent(self, content): for row in range(self.list.rowCount()): item = self.list.item(row, 1) m = item.data(Qt.UserRole) if m == content: if m.content_type == ContentType.PAGE: subdir = "pages" else: subdir = "posts" delCommand = DeleteContentCommand( self, os.path.join(self.site.source_path, subdir, m.source), "delete content " + m.title) self.undoStack.push(delCommand) break
def __init__(self, win, menu, site): AnimateableEditor.__init__(self) self.win = win self.menu = menu self.site = site self.changed = False self.setAutoFillBackground(True) titleLabel = QLabel("Menu Editor") fnt = titleLabel.font() fnt.setPointSize(20) fnt.setBold(True) titleLabel.setFont(fnt) self.close = FlatButton(":/images/close_normal.png", ":/images/close_hover.png") self.close.setToolTip("Close Content Editor") self.undo = FlatButton(":/images/undo_normal.png", ":/images/undo_hover.png", "", ":/images/undo_disabled.png") self.redo = FlatButton(":/images/redo_normal.png", ":/images/redo_hover.png", "", ":/images/redo_disabled.png") self.undo.setToolTip("Undo") self.redo.setToolTip("Redo") self.undo.setEnabled(False) self.redo.setEnabled(False) hbox = QHBoxLayout() hbox.addStretch(0) hbox.addWidget(self.undo) hbox.addWidget(self.redo) hbox.addWidget(self.close) addButton = QPushButton("Add Menuitem") addButton.setMaximumWidth(120) self.name = QLineEdit() self.name.setText(menu.name) self.name.setMaximumWidth(200) labels = ["Title", "Url", "Icon", "", "Sort"] self.tree = QTreeWidget() self.tree.setHeaderLabels(labels) self.tree.header().setSectionResizeMode(0, QHeaderView.Stretch) self.tree.header().hideSection(4) self.tree.setSelectionMode(QAbstractItemView.NoSelection) self.tree.setToolTip("Double Click To Edit") self.tree.setColumnWidth(2, 40) layout = QGridLayout() layout.addWidget(titleLabel, 0, 0) layout.addLayout(hbox, 0, 2) layout.addWidget(QLabel("Name"), 1, 0) layout.addWidget(self.name, 2, 0) layout.addWidget(addButton, 3, 0) layout.addWidget(self.tree, 4, 0, 1, 3) self.setLayout(layout) self.reloadMenu(menu) addButton.clicked.connect(self.addButtonClicked) self.close.clicked.connect(self.closeEditor) self.name.editingFinished.connect(self.nameChanged) self.redo.clicked.connect(self.redoEdit) self.undo.clicked.connect(self.undoEdit) self.tree.itemChanged.connect(self.itemChanged)
class MenuEditor(AnimateableEditor): contentChanged = pyqtSignal(object) menuChanged = pyqtSignal(str) def __init__(self, win, menu, site): AnimateableEditor.__init__(self) self.win = win self.menu = menu self.site = site self.changed = False self.setAutoFillBackground(True) titleLabel = QLabel("Menu Editor") fnt = titleLabel.font() fnt.setPointSize(20) fnt.setBold(True) titleLabel.setFont(fnt) self.close = FlatButton(":/images/close_normal.png", ":/images/close_hover.png") self.close.setToolTip("Close Content Editor") self.undo = FlatButton(":/images/undo_normal.png", ":/images/undo_hover.png", "", ":/images/undo_disabled.png") self.redo = FlatButton(":/images/redo_normal.png", ":/images/redo_hover.png", "", ":/images/redo_disabled.png") self.undo.setToolTip("Undo") self.redo.setToolTip("Redo") self.undo.setEnabled(False) self.redo.setEnabled(False) hbox = QHBoxLayout() hbox.addStretch(0) hbox.addWidget(self.undo) hbox.addWidget(self.redo) hbox.addWidget(self.close) addButton = QPushButton("Add Menuitem") addButton.setMaximumWidth(120) self.name = QLineEdit() self.name.setText(menu.name) self.name.setMaximumWidth(200) labels = ["Title", "Url", "Icon", "", "Sort"] self.tree = QTreeWidget() self.tree.setHeaderLabels(labels) self.tree.header().setSectionResizeMode(0, QHeaderView.Stretch) self.tree.header().hideSection(4) self.tree.setSelectionMode(QAbstractItemView.NoSelection) self.tree.setToolTip("Double Click To Edit") self.tree.setColumnWidth(2, 40) layout = QGridLayout() layout.addWidget(titleLabel, 0, 0) layout.addLayout(hbox, 0, 2) layout.addWidget(QLabel("Name"), 1, 0) layout.addWidget(self.name, 2, 0) layout.addWidget(addButton, 3, 0) layout.addWidget(self.tree, 4, 0, 1, 3) self.setLayout(layout) self.reloadMenu(menu) addButton.clicked.connect(self.addButtonClicked) self.close.clicked.connect(self.closeEditor) self.name.editingFinished.connect(self.nameChanged) self.redo.clicked.connect(self.redoEdit) self.undo.clicked.connect(self.undoEdit) self.tree.itemChanged.connect(self.itemChanged) def reloadMenu(self, menu): if not menu: self.close.emit() return self.menu = menu self.tree.clear() self.name.setText(menu.name) for i in range(0, len(self.menu.items)): item = self.menu.items[i] self.addTreeItem(item) self.tree.expandAll() self.tree.sortItems(4, Qt.AscendingOrder) self.updateButtonStates() def addTreeItem(self, item): twi = QTreeWidgetItem() twi.setFlags(twi.flags() | Qt.ItemIsEditable) twi.setText(0, item.title) twi.setText(1, item.url) twi.setText(4, str(self.tree.topLevelItemCount())) twi.setData(0, Qt.UserRole, item) self.tree.addTopLevelItem(twi) self.addTableCellButtons(item, twi) for i in range(len(item.items)): sub = item.items[i] stwi = QTreeWidgetItem() stwi.setFlags(stwi.flags() | Qt.ItemIsEditable) stwi.setText(0, sub.title) stwi.setText(1, sub.url) stwi.setText(4, str(i)) stwi.setData(0, Qt.UserRole, sub) twi.addChild(stwi) self.addTableCellButtons(sub, stwi) def addTableCellButtons(self, item, twi): tcb = MenuEditorTableCellButtons() tcb.setMenuItem(item) self.tree.setItemWidget(twi, 3, tcb) self.tree.setColumnWidth(3, tcb.sizeHint().width()) if item.isSubitem(): tcb.deleteItem.connect(self.deleteSubItem) tcb.itemLeft.connect(self.itemLeft) else: tcb.deleteItem.connect(self.deleteItem) tcb.itemUp.connect(self.itemUp) tcb.itemDown.connect(self.itemDown) tcb.itemRight.connect(self.itemRight) tcb.editItem.connect(self.editItem) imgs = ImageSelector() imgs.setToolTip("Click to select image, right click to reset image") imgs.setItem(item) imgs.setMaximumSize(24, 24) isw = QWidget() vbox = QVBoxLayout() vbox.addWidget(imgs) isw.setLayout(vbox) if not item.icon: imgs.setImage(QImage(":/images/image_placeholder.png")) else: imgs.setImage(QImage(self.site.source_path + "/" + item.icon)) self.tree.setItemWidget(twi, 2, isw) imgs.clicked.connect(self.iconClicked) def registerUndoStack(self, stack): self.undoStack = stack self.undoStack.canUndoChanged.connect(self.canUndoChanged) self.undoStack.canRedoChanged.connect(self.canRedoChanged) self.undoStack.undoTextChanged.connect(self.undoTextChanged) self.undoStack.redoTextChanged.connect(self.redoTextChanged) self.undo.setEnabled(self.undoStack.canUndo()) self.redo.setEnabled(self.undoStack.canRedo()) self.undo.setToolTip("Undo " + self.undoStack.undoText()) self.redo.setToolTip("Redo " + self.undoStack.redoText()) def canUndoChanged(self, can): self.undo.setEnabled(can) def canRedoChanged(self, can): self.redo.setEnabled(can) def undoTextChanged(self, text): self.undo.setToolTip("Undo " + text) def redoTextChanged(self, text): self.redo.setToolTip("Redo " + text) def getUndoRedoText(self, item, action): return "menuitem (" + item.title + ") from menu (" + self.menu.name + ") " + action def undoEdit(self): self.undoStack.undo() def redoEdit(self): self.undoStack.redo() def addButtonClicked(self): menuitem = MenuItem() self.menu.addMenuitem(menuitem) self.addTreeItem(menuitem) self.menuChanged.emit(self.getUndoRedoText(menuitem, "added")) self.updateButtonStates() item = self.tree.topLevelItem(self.getRow(menuitem)) self.tree.editItem(item, 0) def closeEditor(self): self.closes.emit() def nameChanged(self): if self.menu.name != self.name.text: action = "menu name changed from \"" + self.menu.name + "\" to \"" + self.name.text + "\"" self.menu.setName(self.name.text()) self.contentChanged.emit(self.menu) self.menuChanged.emit(action) def itemChanged(self, twi, column): action = "" item = twi.data(0, Qt.UserRole) if column == 0: item.title = twi.text(0) action = "title changed" elif column == 1: item.url = twi.text(1) action = "url changed" self.menuChanged.emit(self.getUndoRedoText(item, action)) def getRow(self, menuitem): for i in range(0, self.tree.topLevelItemCount()): item = self.tree.topLevelItem(i) mi = item.data(0, Qt.UserRole) if mi == menuitem: return i return -1 def deleteSubItem(self, menuitem): row = self.getRow(menuitem.parentItem) parent = self.tree.topLevelItem(row) if parent: for i in range(0, parent.childCount()): child = parent.child(i) mi = child.data(0, Qt.UserRole) if mi == menuitem: parent.removeChild(child) del child break if menuitem.parentItem: menuitem.parentItem.removeMenuitem(menuitem) self.updateButtonStates() self.menuChanged.emit(self.getUndoRedoText(menuitem, "deleted")) def itemLeft(self, menuitem): row = self.getRow(menuitem.parentItem()) parent = self.tree.topLevelItem(row) for i in range(parent.childCount()): child = parent.child(i) mi = child.data(0, Qt.UserRole) if mi == menuitem: menuitem.parentItem().removeMenuitem(menuitem) menuitem.setSubitem(False) self.menu.addMenuitem(menuitem) parent.takeChild(i) self.addTreeItem(menuitem) break self.updateButtonStates() self.menuChanged.emit( self.getUndoRedoText(menuitem, "changed to top item")) def iconClicked(self, itemselector, button): mi = itemselector.item() action = "" if button == Qt.LeftButton: fileName = "" dialog = QFileDialog() dialog.setFileMode(QFileDialog.AnyFile) dialog.setNameFilter("Images (*.png *.gif *.jpg)All (*)") dialog.setWindowTitle("Load Image") dialog.setOption(QFileDialog.DontUseNativeDialog, True) dialog.setAcceptMode(QFileDialog.AcceptOpen) if dialog.exec_(): fileName = dialog.selectedFiles().first() del dialog if not fileName: return # copy file to assets dir info = QFileInfo(fileName) name = info.fileName().replace(" ", "_") path = self.site.source_path + "/assets/images/" + name QFile.copy(fileName, path) # also copy file to deploy dir for previews dpath = self.site.deploy_path + "/assets/images/" + name QFile.copy(fileName, dpath) mi.setIcon(path.mid(path.indexOf("assets/images/"))) itemselector.setImage(QImage(path)) action = "icon changed" elif button == Qt.RightButton: action = "icon removed" mi.setIcon("") itemselector.setImage(QImage(":/images/image_placeholder.png")) self.menuChanged.emit(self.getUndoRedoText(mi, action)) def updateButtonStates(self): for i in range(0, self.tree.topLevelItemCount()): twi = self.tree.topLevelItem(i) tcb = self.tree.itemWidget(twi, 3) menuitem = twi.data(0, Qt.UserRole) tcb.setEnableDown(i != self.tree.topLevelItemCount() - 1) tcb.setEnableUp(i != 0) tcb.setEnableRight(i != 0 and len(menuitem.items) == 0) tcb.setEnableLeft(False) for j in range(0, twi.childCount()): stwi = twi.child(j) stcb = self.tree.itemWidget(stwi, 3) stcb.setEnableLeft(True)
def __init__(self): ElementEditorInterface.__init__(self) self.site = None self.animation = "" self.class_name = "ImageEditor" self.display_name = QCoreApplication.translate("ImageEditor", "Image") self.tag_name = "Image" self.version = "1.0" self.icon = QImage(":/imageeditor.png") self.changed = False self.setAutoFillBackground(True) grid = QGridLayout() self.source = QLineEdit() self.alt = QLineEdit() self.alt.setMaximumWidth(200) self.title = QLineEdit() self.title.setMaximumWidth(200) self.link = QLineEdit() self.link.setMaximumWidth(200) self.adminlabel = QLineEdit() self.adminlabel.setMaximumWidth(200) seek = QPushButton("...") seek.setMaximumWidth(50) titleLabel = QLabel( QCoreApplication.translate("ImageEditor", "Image Module")) fnt = titleLabel.font() fnt.setPointSize(16) fnt.setBold(True) titleLabel.setFont(fnt) self.image = ImageSelector() self.image.setImage(QImage(":/images/image_placeholder.png")) close = FlatButton(":/images/close_normal.png", ":/images/close_hover.png") close.setToolTip(QCoreApplication.translate("general", "Close Editor")) self.animation_type = QListWidget() self.animation_type.addItem("None") self.animation_type.addItem("Attention Seekers") self.animation_type.addItem("Bouncing Entrances") self.animation_type.addItem("Bouncing Exits") self.animation_type.addItem("Fading Entrances") self.animation_type.addItem("Fading Exits") self.animation_type.addItem("Flippers") self.animation_type.addItem("Rotating Entrances") self.animation_type.addItem("Rotating Exits") self.animation_type.addItem("Sliding Entrances") self.animation_type.addItem("Sliding Exits") self.animation_type.addItem("Zoom Entrances") self.animation_type.addItem("Zoom Exits") self.animation_subtype = QListWidget() grid.addWidget(titleLabel, 0, 0) grid.addWidget(close, 0, 3, 1, 1, Qt.AlignRight) grid.addWidget( QLabel(QCoreApplication.translate("ImageEditor", "Path")), 1, 0) grid.addWidget(self.source, 2, 0, 1, 3) grid.addWidget(seek, 2, 3) grid.addWidget(self.image, 3, 0, 1, 4) grid.setRowStretch(3, 1) grid.addWidget( QLabel(QCoreApplication.translate("ImageEditor", "Alt")), 6, 0) grid.addWidget(self.alt, 7, 0) grid.addWidget( QLabel(QCoreApplication.translate("ImageEditor", "Title")), 8, 0) grid.addWidget(self.title, 9, 0) grid.addWidget( QLabel(QCoreApplication.translate("ImageEditor", "Hyperlink")), 10, 0) grid.addWidget(self.link, 11, 0) grid.addWidget( QLabel(QCoreApplication.translate("ImageEditor", "Animation")), 6, 1) grid.addWidget(self.animation_type, 7, 1, 8, 1) grid.addWidget(self.animation_subtype, 7, 2, 8, 1) grid.addWidget( QLabel(QCoreApplication.translate("ImageEditor", "Admin Label")), 13, 0) grid.addWidget(self.adminlabel, 14, 0) self.setLayout(grid) close.clicked.connect(self.closeEditor) self.source.textChanged.connect(self.contentChanged) self.alt.textChanged.connect(self.contentChanged) self.title.textChanged.connect(self.contentChanged) self.link.textChanged.connect(self.contentChanged) self.adminlabel.textChanged.connect(self.contentChanged) seek.clicked.connect(self.seek) self.image.clicked.connect(self.seek) self.animation_type.currentTextChanged.connect( self.animationTypeChanged) self.animation_subtype.currentTextChanged.connect(self.contentChanged)
def initGui(self): self.dashboard = Expander("Dashboard", ":/images/dashboard_normal.png", ":/images/dashboard_hover.png", ":/images/dashboard_selected.png") self.content = Expander("Clients", ":/images/clients_normal.png", ":/images/clients_hover.png", ":/images/clients_selected.png") self.settings = Expander("Settings", ":/images/settings_normal.png", ":/images/settings_hover.png", ":/images/settings_selected.png") self.setWindowTitle(QCoreApplication.applicationName() + " " + QCoreApplication.applicationVersion()) vbox = QVBoxLayout() vbox.addWidget(self.dashboard) vbox.addWidget(self.content) vbox.addWidget(self.settings) vbox.addStretch() content_box = QVBoxLayout() filter_label = QLabel("Filter") self.filter = QLineEdit() self.filter.textChanged.connect(self.filterChanged) self.client_list = QListWidget() self.client_list.setSizePolicy(QSizePolicy.Ignored, QSizePolicy.Fixed) self.client_list.currentItemChanged.connect(self.clientChanged) button_layout = QHBoxLayout() plus_button = FlatButton(":/images/plus.svg") self.trash_button = FlatButton(":/images/trash.svg") self.trash_button.enabled = False button_layout.addWidget(plus_button) button_layout.addWidget(self.trash_button) content_box.addWidget(filter_label) content_box.addWidget(self.filter) content_box.addWidget(self.client_list) content_box.addLayout(button_layout) self.content.addLayout(content_box) scroll_content = QWidget() scroll_content.setLayout(vbox) scroll = QScrollArea() scroll.setHorizontalScrollBarPolicy(Qt.ScrollBarAsNeeded) scroll.setVerticalScrollBarPolicy(Qt.ScrollBarAsNeeded) scroll.setWidget(scroll_content) scroll.setWidgetResizable(True) scroll.setMaximumWidth(200) scroll.setMinimumWidth(200) self.navigationdock = QDockWidget("Navigation", self) self.navigationdock.setAllowedAreas(Qt.LeftDockWidgetArea | Qt.RightDockWidgetArea) self.navigationdock.setWidget(scroll) self.navigationdock.setObjectName("Navigation") self.addDockWidget(Qt.LeftDockWidgetArea, self.navigationdock) self.showDock = FlatButton(":/images/menu.svg") self.showDock.setToolTip("Show Navigation") self.statusBar().addPermanentWidget(self.showDock) plus_button.clicked.connect(self.addClient) self.trash_button.clicked.connect(self.deleteClient) self.dashboard.expanded.connect(self.dashboardExpanded) self.dashboard.clicked.connect(self.showDashboard) self.content.expanded.connect(self.contentExpanded) self.content.clicked.connect(self.showClient) self.settings.expanded.connect(self.settingsExpanded) self.settings.clicked.connect(self.showSettings) self.showDock.clicked.connect(self.showMenu) self.navigationdock.visibilityChanged.connect( self.dockVisibilityChanged) self.client = None self.client_editor = None
class MainWindow(QMainWindow): def __init__(self, app): QMainWindow.__init__(self) self.app = app self.clients = None self.initGui() self.readSettings() self.dashboard.setExpanded(True) self.showDashboard() self.loadDatabase() self.loadClients() self.statusBar().showMessage("Ready") def initGui(self): self.dashboard = Expander("Dashboard", ":/images/dashboard_normal.png", ":/images/dashboard_hover.png", ":/images/dashboard_selected.png") self.content = Expander("Clients", ":/images/clients_normal.png", ":/images/clients_hover.png", ":/images/clients_selected.png") self.settings = Expander("Settings", ":/images/settings_normal.png", ":/images/settings_hover.png", ":/images/settings_selected.png") self.setWindowTitle(QCoreApplication.applicationName() + " " + QCoreApplication.applicationVersion()) vbox = QVBoxLayout() vbox.addWidget(self.dashboard) vbox.addWidget(self.content) vbox.addWidget(self.settings) vbox.addStretch() content_box = QVBoxLayout() filter_label = QLabel("Filter") self.filter = QLineEdit() self.filter.textChanged.connect(self.filterChanged) self.client_list = QListWidget() self.client_list.setSizePolicy(QSizePolicy.Ignored, QSizePolicy.Fixed) self.client_list.currentItemChanged.connect(self.clientChanged) button_layout = QHBoxLayout() plus_button = FlatButton(":/images/plus.svg") self.trash_button = FlatButton(":/images/trash.svg") self.trash_button.enabled = False button_layout.addWidget(plus_button) button_layout.addWidget(self.trash_button) content_box.addWidget(filter_label) content_box.addWidget(self.filter) content_box.addWidget(self.client_list) content_box.addLayout(button_layout) self.content.addLayout(content_box) scroll_content = QWidget() scroll_content.setLayout(vbox) scroll = QScrollArea() scroll.setHorizontalScrollBarPolicy(Qt.ScrollBarAsNeeded) scroll.setVerticalScrollBarPolicy(Qt.ScrollBarAsNeeded) scroll.setWidget(scroll_content) scroll.setWidgetResizable(True) scroll.setMaximumWidth(200) scroll.setMinimumWidth(200) self.navigationdock = QDockWidget("Navigation", self) self.navigationdock.setAllowedAreas(Qt.LeftDockWidgetArea | Qt.RightDockWidgetArea) self.navigationdock.setWidget(scroll) self.navigationdock.setObjectName("Navigation") self.addDockWidget(Qt.LeftDockWidgetArea, self.navigationdock) self.showDock = FlatButton(":/images/menu.svg") self.showDock.setToolTip("Show Navigation") self.statusBar().addPermanentWidget(self.showDock) plus_button.clicked.connect(self.addClient) self.trash_button.clicked.connect(self.deleteClient) self.dashboard.expanded.connect(self.dashboardExpanded) self.dashboard.clicked.connect(self.showDashboard) self.content.expanded.connect(self.contentExpanded) self.content.clicked.connect(self.showClient) self.settings.expanded.connect(self.settingsExpanded) self.settings.clicked.connect(self.showSettings) self.showDock.clicked.connect(self.showMenu) self.navigationdock.visibilityChanged.connect( self.dockVisibilityChanged) self.client = None self.client_editor = None def showDashboard(self): db = Dashboard() db.clients.connect(self.showClient) db.settings.connect(self.showSettings) self.setCentralWidget(db) def showClient(self): self.client_editor = ClientEditor(self) self.setCentralWidget(self.client_editor) def showSettings(self): s = SettingsEditor(self) self.setCentralWidget(s) def closeEvent(self, event): self.writeSettings() event.accept() def writeSettings(self): settings = QSettings(QSettings.IniFormat, QSettings.UserScope, QCoreApplication.organizationName(), QCoreApplication.applicationName()) settings.setValue("geometry", self.saveGeometry()) settings.setValue("state", self.saveState()) settings.setValue("database", self.database) settings.setValue("fontSize", str(self.fontSize)) def readSettings(self): settings = QSettings(QSettings.IniFormat, QSettings.UserScope, QCoreApplication.organizationName(), QCoreApplication.applicationName()) geometry = settings.value("geometry", QByteArray()) if geometry.isEmpty(): availableGeometry = QApplication.desktop().availableGeometry(self) self.resize(availableGeometry.width() / 3, availableGeometry.height() / 2) self.move(int(((availableGeometry.width() - self.width()) / 2)), int((availableGeometry.height() - self.height()) / 2)) else: self.restoreGeometry(geometry) self.restoreState(settings.value("state")) self.database = settings.value("database") if not self.database: self.database = "." fs = settings.value("fontSize") if not fs: fs = 10 self.fontSize = int(fs) font = QFont("Sans Serif", self.fontSize) self.app.setFont(font) def dashboardExpanded(self, value): if value: self.content.setExpanded(False) self.settings.setExpanded(False) def contentExpanded(self, value): if value: self.dashboard.setExpanded(False) self.settings.setExpanded(False) def settingsExpanded(self, value): if value: self.dashboard.setExpanded(False) self.content.setExpanded(False) def showMenu(self): self.navigationdock.setVisible(True) def dockVisibilityChanged(self, visible): self.showDock.setVisible(not visible) def filterChanged(self): self.loadClients() def loadClients(self): if not self.clients: return self.client_list.clear() filter = self.filter.text() a = [] for c in self.clients: if filter.lower() in c["name"].lower(): a.append(c) s = sorted(a, key=namesort) for c in s: item = QListWidgetItem() item.setText(c["name"]) item.setData(3, c) self.client_list.addItem(item) self.client_list.setCurrentRow(0) def addClient(self): now = datetime.now() newclient = { "number": "", "name": "", "birthday_year": 1990, "birthday_month": 1, "birthday_day": 1, "profession": "", "address": "", "mobile": "", "email": "", "notes": "" } self.clients.insert(newclient) self.showClient() self.loadClients() q = Query() self.client = self.clients.get(q.name == "") self.client["name"] = "" self.client_editor.reload() def deleteClient(self): self.clients.remove(doc_ids=[self.client.doc_id]) self.loadClients() def loadDatabase(self): try: self.db = TinyDB(os.path.join(self.database, "lob.json")) self.clients = self.db.table('Clients') except: print("Unable to openthe database") def updateClient(self): for i in range(self.client_list.count()): item = self.client_list.item(i) c = item.data(3) if c.doc_id == self.client.doc_id: item.setData(3, self.client) item.setText(self.client["name"]) break def clientChanged(self, item): if item: self.client = item.data(3) if self.client_editor: self.client_editor.reload() self.trash_button.enabled = True else: self.client = None self.client_editor.reload() self.trash_button.enabled = False
class MenuEditorTableCellButtons(QWidget): deleteItem = pyqtSignal(object) editItem = pyqtSignal(object) itemLeft = pyqtSignal(object) itemRight = pyqtSignal(object) itemUp = pyqtSignal(object) itemDown = pyqtSignal(object) def __init__(self): QWidget.__init__(self) self.delete = FlatButton(":/images/trash_normal.png", ":/images/trash_hover.png") self.edit = FlatButton(":/images/edit_normal.png", ":/images/edit_hover.png") self.left = FlatButton(":/images/left_normal.png", ":/images/left_hover.png", "", ":/images/left_disabled.png") self.right = FlatButton(":/images/right_normal.png", ":/images/right_hover.png", "", ":/images/right_disabled.png") self.up = FlatButton(":/images/up_normal.png", ":/images/up_hover.png", "", ":/images/up_disabled.png") self.down = FlatButton(":/images/down_normal.png", ":/images/down_hover.png", "", ":/images/down_disabled.png") self.edit.setToolTip("Edit Item") self.delete.setToolTip("Delete Item") self.left.setToolTip("Make Mainitem") self.right.setToolTip("Make Subitem") self.up.setToolTip("Sort Up") self.down.setToolTip("Sort Down") self.left.setEnabled(False) self.right.setEnabled(False) self.up.setEnabled(False) self.down.setEnabled(False) self.item = None hbox = QHBoxLayout() hbox.addWidget(self.edit) hbox.addWidget(self.up) hbox.addWidget(self.down) hbox.addWidget(self.left) hbox.addWidget(self.right) hbox.addWidget(self.delete) self.setLayout(hbox) self.delete.clicked.connect(self.deleteItemClicked) self.edit.clicked.connect(self.editItemClicked) self.left.clicked.connect(self.itemLeftClicked) self.right.clicked.connect(self.itemRightClicked) self.up.clicked.connect(self.itemUpClicked) self.down.clicked.connect(self.itemDownClicked) def setMenuItem(self, m): self.item = m def deleteItemClicked(self): self.deleteItem.emit(self.item) def editItemClicked(self): self.editItem.emit(self.item) def itemLeftClicked(self): self.itemLeft.emit(self.item) def itemRightClicked(self): self.itemRight.emit(self.item) def itemUpClicked(self): self.itemUp.emit(self.item) def itemDownClicked(self): self.itemDown.emit(self.item) def setEnableLeft(self, mode): self.left.setEnabled(mode) def setEnableRight(self, mode): self.right.setEnabled(mode) def setEnableUp(self, mode): self.up.setEnabled(mode) def setEnableDown(self, mode): self.down.setEnabled(mode)
def __init__(self): QDialog.__init__(self) self.result = 0 self.setWindowTitle(QCoreApplication.translate("ColumnsDialog", "Insert Columns")) grid = QGridLayout() b1 = FlatButton(":/images/columns1.png", ":/images/columns1_hover.png") b2 = FlatButton(":/images/columns2.png", ":/images/columns2_hover.png") b3 = FlatButton(":/images/columns3.png", ":/images/columns3_hover.png") b4 = FlatButton(":/images/columns4.png", ":/images/columns4_hover.png") b5 = FlatButton(":/images/columns5.png", ":/images/columns5_hover.png") b6 = FlatButton(":/images/columns6.png", ":/images/columns6_hover.png") b7 = FlatButton(":/images/columns7.png", ":/images/columns7_hover.png") b8 = FlatButton(":/images/columns8.png", ":/images/columns8_hover.png") b9 = FlatButton(":/images/columns9.png", ":/images/columns9_hover.png") b10 = FlatButton(":/images/columns10.png", ":/images/columns10_hover.png") b11 = FlatButton(":/images/columns11.png", ":/images/columns11_hover.png") grid.addWidget(b1, 0, 0) grid.addWidget(b2, 0, 1) grid.addWidget(b3, 0, 2) grid.addWidget(b4, 1, 0) grid.addWidget(b5, 1, 1) grid.addWidget(b6, 1, 2) grid.addWidget(b7, 3, 0) grid.addWidget(b8, 3, 1) grid.addWidget(b9, 3, 2) grid.addWidget(b10, 4, 0) grid.addWidget(b11, 4, 1) closeButton = QPushButton(QCoreApplication.translate("general", "Close")) buttonsLayout = QHBoxLayout() buttonsLayout.addStretch(1) buttonsLayout.addWidget(closeButton) mainLayout = QVBoxLayout() mainLayout.addLayout(grid) mainLayout.addStretch(1) mainLayout.addSpacing(12) mainLayout.addLayout(buttonsLayout) self.setLayout(mainLayout) closeButton.clicked.connect(self.close) b1.clicked.connect(self.close1) b2.clicked.connect(self.close2) b3.clicked.connect(self.close3) b4.clicked.connect(self.close4) b5.clicked.connect(self.close5) b6.clicked.connect(self.close6) b7.clicked.connect(self.close7) b8.clicked.connect(self.close8) b9.clicked.connect(self.close9) b10.clicked.connect(self.close10) b11.clicked.connect(self.close11)
def __init__(self): QWidget.__init__(self) self.delete = FlatButton(":/images/trash_normal.png", ":/images/trash_hover.png") self.edit = FlatButton(":/images/edit_normal.png", ":/images/edit_hover.png") self.left = FlatButton(":/images/left_normal.png", ":/images/left_hover.png", "", ":/images/left_disabled.png") self.right = FlatButton(":/images/right_normal.png", ":/images/right_hover.png", "", ":/images/right_disabled.png") self.up = FlatButton(":/images/up_normal.png", ":/images/up_hover.png", "", ":/images/up_disabled.png") self.down = FlatButton(":/images/down_normal.png", ":/images/down_hover.png", "", ":/images/down_disabled.png") self.edit.setToolTip("Edit Item") self.delete.setToolTip("Delete Item") self.left.setToolTip("Make Mainitem") self.right.setToolTip("Make Subitem") self.up.setToolTip("Sort Up") self.down.setToolTip("Sort Down") self.left.setEnabled(False) self.right.setEnabled(False) self.up.setEnabled(False) self.down.setEnabled(False) self.item = None hbox = QHBoxLayout() hbox.addWidget(self.edit) hbox.addWidget(self.up) hbox.addWidget(self.down) hbox.addWidget(self.left) hbox.addWidget(self.right) hbox.addWidget(self.delete) self.setLayout(hbox) self.delete.clicked.connect(self.deleteItemClicked) self.edit.clicked.connect(self.editItemClicked) self.left.clicked.connect(self.itemLeftClicked) self.right.clicked.connect(self.itemRightClicked) self.up.clicked.connect(self.itemUpClicked) self.down.clicked.connect(self.itemDownClicked)
def __init__(self, site, type): QWidget.__init__(self) self.site = site self.addedContentName = "" self.type = type self.undoStack = QUndoStack() vbox = QVBoxLayout() layout = QGridLayout() titleLabel = QLabel() button = QPushButton() if self.type == ContentType.PAGE: button.setText("Add Page") else: button.setText("Add Post") button.setMaximumWidth(120) if self.type == ContentType.PAGE: titleLabel.setText("Pages") else: titleLabel.setText("Posts") fnt = titleLabel.font() fnt.setPointSize(20) fnt.setBold(True) titleLabel.setFont(fnt) self.undo = FlatButton(":/images/undo_normal.png", ":/images/undo_hover.png", "", ":/images/undo_disabled.png") self.redo = FlatButton(":/images/redo_normal.png", ":/images/redo_hover.png", "", ":/images/redo_disabled.png") self.undo.setToolTip("Undo") self.redo.setToolTip("Redo") self.undo.setEnabled(False) self.redo.setEnabled(False) hbox = QHBoxLayout() hbox.addStretch(0) hbox.addWidget(self.undo) hbox.addWidget(self.redo) self.list = QTableWidget(0, 6, self) self.list.verticalHeader().hide() self.list.setSelectionMode(QAbstractItemView.SingleSelection) self.list.setSelectionBehavior(QAbstractItemView.SelectRows) self.list.horizontalHeader().setSectionResizeMode( 1, QHeaderView.Stretch) self.list.setToolTip("Double click to edit item") labels = ["", "Name", "Source", "Layout", "Author", "Date"] self.list.setHorizontalHeaderLabels(labels) self.reload() layout.addWidget(titleLabel, 0, 0) layout.addLayout(hbox, 0, 2) layout.addWidget(button, 1, 0) layout.addWidget(self.list, 2, 0, 1, 3) vbox.addLayout(layout) self.setLayout(vbox) button.clicked.connect(self.addPage) self.list.cellDoubleClicked.connect(self.tableDoubleClicked) self.redo.clicked.connect(self.doredo) self.undo.clicked.connect(self.doundo) self.undoStack.canUndoChanged.connect(self.canUndoChanged) self.undoStack.canRedoChanged.connect(self.canRedoChanged) self.undoStack.redoTextChanged.connect(self.redoTextChanged)
def initGui(self): self.installEventFilter(self) self.dashboard = Expander( QCoreApplication.translate("MainWindow", "Dashboard"), ":/images/dashboard_normal.png", ":/images/dashboard_hover.png", ":/images/dashboard_selected.png") self.content = Expander( QCoreApplication.translate("MainWindow", "Content"), ":/images/pages_normal.png", ":/images/pages_hover.png", ":/images/pages_selected.png") self.appearance = Expander( QCoreApplication.translate("MainWindow", "Appearance"), ":/images/appearance_normal.png", ":/images/appearance_hover.png", ":/images/appearance_selected.png") self.settings = Expander( QCoreApplication.translate("MainWindow", "Settings"), ":/images/settings_normal.png", ":/images/settings_hover.png", ":/images/settings_selected.png") self.setWindowTitle(QCoreApplication.applicationName() + " " + QCoreApplication.applicationVersion()) vbox = QVBoxLayout() vbox.addWidget(self.dashboard) vbox.addWidget(self.content) vbox.addWidget(self.appearance) vbox.addWidget(self.settings) vbox.addStretch() content_box = QVBoxLayout() pages_button = HyperLink( QCoreApplication.translate("MainWindow", "Pages")) posts_button = HyperLink( QCoreApplication.translate("MainWindow", "Posts")) content_box.addWidget(pages_button) content_box.addWidget(posts_button) self.content.addLayout(content_box) app_box = QVBoxLayout() themes_button = HyperLink( QCoreApplication.translate("MainWindow", "Themes")) menus_button = HyperLink( QCoreApplication.translate("MainWindow", "Menus")) self.theme_settings_button = HyperLink( QCoreApplication.translate("MainWindow", "Theme Settings")) self.theme_settings_button.setVisible(False) app_box.addWidget(menus_button) app_box.addWidget(themes_button) app_box.addWidget(self.theme_settings_button) self.appearance.addLayout(app_box) scroll_content = QWidget() scroll_content.setLayout(vbox) scroll = QScrollArea() scroll.setHorizontalScrollBarPolicy(Qt.ScrollBarAsNeeded) scroll.setVerticalScrollBarPolicy(Qt.ScrollBarAsNeeded) scroll.setWidget(scroll_content) scroll.setWidgetResizable(True) scroll.setMaximumWidth(200) scroll.setMinimumWidth(200) self.navigationdock = QDockWidget( QCoreApplication.translate("MainWindow", "Navigation"), self) self.navigationdock.setAllowedAreas(Qt.LeftDockWidgetArea | Qt.RightDockWidgetArea) self.navigationdock.setWidget(scroll) self.navigationdock.setObjectName("Navigation") self.addDockWidget(Qt.LeftDockWidgetArea, self.navigationdock) self.showDock = FlatButton(":/images/edit_normal.png", ":/images/edit_hover.png") self.showDock.setToolTip( QCoreApplication.translate("MainWindow", "Show Navigation")) self.statusBar().addPermanentWidget(self.showDock) self.dashboard.expanded.connect(self.dashboardExpanded) self.dashboard.clicked.connect(self.showDashboard) self.content.expanded.connect(self.contentExpanded) self.content.clicked.connect(self.showPages) self.appearance.expanded.connect(self.appearanceExpanded) self.appearance.clicked.connect(self.showMenus) self.settings.expanded.connect(self.settingsExpanded) self.settings.clicked.connect(self.showSettings) menus_button.clicked.connect(self.showMenus) pages_button.clicked.connect(self.showPages) posts_button.clicked.connect(self.showPosts) themes_button.clicked.connect(self.showThemes) self.theme_settings_button.clicked.connect(self.showThemesSettings) self.showDock.clicked.connect(self.showMenu) self.navigationdock.visibilityChanged.connect( self.dockVisibilityChanged)