Started work on Ember

This commit is contained in:
2018-07-28 23:56:23 +03:00
commit ac582a8b0b
32 changed files with 239149 additions and 0 deletions

26
ui/ember_application.py Normal file
View File

@ -0,0 +1,26 @@
from PyQt5.QtWidgets import QApplication
from PyQt5.QtGui import QFontDatabase
from ui.main_window import MainWindow
from business.project_manager import ProjectManager
from storage.appdata_storage import AppDataStorage
class EmberApplication(QApplication):
def __init__(self, argv):
super().__init__(argv)
def start(self):
QFontDatabase.addApplicationFont(":/FontAwesome-Solid.otf")
QFontDatabase.addApplicationFont(":/FontAwesome-Regular.otf")
# setup resources
appDataStorage = AppDataStorage()
projectManager = ProjectManager(appDataStorage)
projectManager.debug_populateRecentProjects()
# show main window
mainwindow = MainWindow(projectManager)
mainwindow.show()
exit(self.exec_())

31
ui/main_window.py Normal file
View File

@ -0,0 +1,31 @@
from PyQt5.QtWidgets import QMainWindow, QVBoxLayout, QWidget
from ui.project.project_panel import ProjectPanel
from ui.welcome.welcome_dialog import WelcomeDialog
class MainWindow(QMainWindow):
def __init__(self, projectManager):
super().__init__()
self.__projectManager = projectManager
self.setupUi()
self.initializeApp()
def setupUi(self):
self.projectPanel = ProjectPanel()
layout = QVBoxLayout()
layout.addWidget(self.projectPanel)
cwidget = QWidget()
cwidget.setLayout(layout)
self.setCentralWidget(cwidget)
def initializeApp(self):
# Show welcome dialog
welcome = WelcomeDialog(self.__projectManager)
res = welcome.exec()
print("Dialog result:", res)

View File

@ -0,0 +1,12 @@
from PyQt5 import QtCore, QtWidgets, uic
import os
from ui.project.project_panel_ui import Ui_Form
class ProjectPanel(QtWidgets.QWidget):
def __init__(self):
super(ProjectPanel, self).__init__()
self.ui = Ui_Form()
self.ui.setupUi(self)

View File

@ -0,0 +1,58 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>Form</class>
<widget class="QWidget" name="Form">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>400</width>
<height>300</height>
</rect>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
<widget class="QPushButton" name="pushButton">
<property name="geometry">
<rect>
<x>90</x>
<y>40</y>
<width>84</width>
<height>34</height>
</rect>
</property>
<property name="text">
<string>PushButton</string>
</property>
</widget>
<widget class="QCheckBox" name="checkBox">
<property name="geometry">
<rect>
<x>80</x>
<y>150</y>
<width>86</width>
<height>22</height>
</rect>
</property>
<property name="text">
<string>CheckBox</string>
</property>
</widget>
<widget class="QCheckBox" name="checkBox_2">
<property name="geometry">
<rect>
<x>80</x>
<y>180</y>
<width>86</width>
<height>22</height>
</rect>
</property>
<property name="text">
<string>CheckBox</string>
</property>
</widget>
</widget>
<resources/>
<connections/>
</ui>

View File

@ -0,0 +1,34 @@
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'ui/project/project_panel.ui'
#
# Created by: PyQt5 UI code generator 5.10.1
#
# WARNING! All changes made in this file will be lost!
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_Form(object):
def setupUi(self, Form):
Form.setObjectName("Form")
Form.resize(400, 300)
self.pushButton = QtWidgets.QPushButton(Form)
self.pushButton.setGeometry(QtCore.QRect(90, 40, 84, 34))
self.pushButton.setObjectName("pushButton")
self.checkBox = QtWidgets.QCheckBox(Form)
self.checkBox.setGeometry(QtCore.QRect(80, 150, 86, 22))
self.checkBox.setObjectName("checkBox")
self.checkBox_2 = QtWidgets.QCheckBox(Form)
self.checkBox_2.setGeometry(QtCore.QRect(80, 180, 86, 22))
self.checkBox_2.setObjectName("checkBox_2")
self.retranslateUi(Form)
QtCore.QMetaObject.connectSlotsByName(Form)
def retranslateUi(self, Form):
_translate = QtCore.QCoreApplication.translate
Form.setWindowTitle(_translate("Form", "Form"))
self.pushButton.setText(_translate("Form", "PushButton"))
self.checkBox.setText(_translate("Form", "CheckBox"))
self.checkBox_2.setText(_translate("Form", "CheckBox"))

View File

@ -0,0 +1,33 @@
from PyQt5.QtWidgets import QWidget, QHBoxLayout, QLabel, QToolButton, QLayout
from PyQt5.QtGui import QFont
class RecentProjectWidget(QWidget):
def __init__(self, recentProject):
super().__init__()
self.setupUi()
self.setProject(recentProject)
def setupUi(self):
layout = QHBoxLayout()
# label
self.__text = QLabel()
layout.addWidget(self.__text)
# space
layout.addStretch()
# pin button
self.__button = QToolButton()
self.__button.setFont(QFont("Font Awesome 5 Free"))
self.__button.setText("\uf08d")
self.__button.setCheckable(True)
layout.addWidget(self.__button)
# done
layout.setSizeConstraint(QLayout.SetMinimumSize)
self.setLayout(layout)
def setProject(self, project):
self.__text = project['name']
self.__button.setChecked(project['pinned'])

View File

@ -0,0 +1,65 @@
import os
import functools
from enum import Enum
from PyQt5.QtWidgets import QDialog, QVBoxLayout, QWidget, QCommandLinkButton, QListWidgetItem
from PyQt5.QtGui import QPixmap
from PyQt5.QtCore import Qt
from PyQt5 import uic
from util import str_compare
from ui.welcome.recent_project import RecentProjectWidget
from ui.welcome.welcome_dialog_ui import Ui_WelcomeDialog
class WelcomeDialogResult(Enum):
NewProject = 0
OpenProject = 1
OpenRecentProject = 2
class WelcomeDialog(QDialog):
def __init__(self, projectManager):
super().__init__()
self.__projectManager = projectManager
self.__resultAction = None
self.setResult(QDialog.Rejected)
self.setupUi()
self.setupActions()
self.populateRecentProjects()
def setupUi(self):
self.ui = Ui_WelcomeDialog()
self.ui.setupUi(self)
self.image = QPixmap(self.ui.picture.pixmap())
def setupActions(self):
self.ui.buttonNewProject.pressed.connect(self.newProjectPressed)
self.ui.buttonOpenProject.pressed.connect(self.openProjectPressed)
def resizeEvent(self, event):
super().resizeEvent(event)
picSize = self.ui.picture.size()
pic = self.image.scaled(picSize, Qt.KeepAspectRatioByExpanding, Qt.SmoothTransformation)
self.ui.picture.setPixmap(pic)
def populateRecentProjects(self):
projects = list(self.__projectManager.getRecentProjects())
projects = sorted(projects, key=lambda x: (x['pinned'], x['date']), reverse=True)
for project in projects:
item = QListWidgetItem(project['name'])
item.setData(Qt.UserRole, project)
widget = RecentProjectWidget(project)
item.setSizeHint(widget.sizeHint())
self.ui.listRecentProjects.addItem(item)
self.ui.listRecentProjects.setItemWidget(item, widget)
def newProjectPressed(self):
self.__resultAction = WelcomeDialogResult.NewProject
self.accept()
def openProjectPressed(self):
self.__resultAction = WelcomeDialogResult.OpenProject
self.accept()

View File

@ -0,0 +1,146 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>WelcomeDialog</class>
<widget class="QDialog" name="WelcomeDialog">
<property name="windowModality">
<enum>Qt::WindowModal</enum>
</property>
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>667</width>
<height>601</height>
</rect>
</property>
<property name="windowTitle">
<string>Welcome</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QLabel" name="picture">
<property name="sizePolicy">
<sizepolicy hsizetype="Ignored" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>0</width>
<height>120</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>16777215</width>
<height>120</height>
</size>
</property>
<property name="text">
<string/>
</property>
<property name="pixmap">
<pixmap resource="../../resources.qrc">:/WelcomeBanner.jpg</pixmap>
</property>
<property name="scaledContents">
<bool>false</bool>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QWidget" name="panelRecentProjects" native="true">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>2</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<layout class="QVBoxLayout" name="verticalLayout_3">
<item>
<widget class="QLabel" name="labelRecentProjects">
<property name="font">
<font>
<pointsize>13</pointsize>
</font>
</property>
<property name="text">
<string>Recent projects</string>
</property>
</widget>
</item>
<item>
<widget class="QListWidget" name="listRecentProjects">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Minimum">
<horstretch>0</horstretch>
<verstretch>1</verstretch>
</sizepolicy>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QWidget" name="panelButtons" native="true">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>1</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::MinimumExpanding</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QCommandLinkButton" name="buttonNewProject">
<property name="text">
<string>&amp;New Project</string>
</property>
<property name="description">
<string>Create a new project.</string>
</property>
</widget>
</item>
<item>
<widget class="QCommandLinkButton" name="buttonOpenProject">
<property name="text">
<string>&amp;Open Project</string>
</property>
<property name="description">
<string>Open an existing project.</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
<resources>
<include location="../../resources.qrc"/>
</resources>
<connections/>
</ui>

View File

@ -0,0 +1,90 @@
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'ui/welcome/welcome_dialog.ui'
#
# Created by: PyQt5 UI code generator 5.10.1
#
# WARNING! All changes made in this file will be lost!
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_WelcomeDialog(object):
def setupUi(self, WelcomeDialog):
WelcomeDialog.setObjectName("WelcomeDialog")
WelcomeDialog.setWindowModality(QtCore.Qt.WindowModal)
WelcomeDialog.resize(667, 601)
self.verticalLayout = QtWidgets.QVBoxLayout(WelcomeDialog)
self.verticalLayout.setObjectName("verticalLayout")
self.picture = QtWidgets.QLabel(WelcomeDialog)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Ignored, QtWidgets.QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.picture.sizePolicy().hasHeightForWidth())
self.picture.setSizePolicy(sizePolicy)
self.picture.setMinimumSize(QtCore.QSize(0, 120))
self.picture.setMaximumSize(QtCore.QSize(16777215, 120))
self.picture.setText("")
self.picture.setPixmap(QtGui.QPixmap(":/WelcomeBanner.jpg"))
self.picture.setScaledContents(False)
self.picture.setAlignment(QtCore.Qt.AlignCenter)
self.picture.setObjectName("picture")
self.verticalLayout.addWidget(self.picture)
self.horizontalLayout = QtWidgets.QHBoxLayout()
self.horizontalLayout.setObjectName("horizontalLayout")
self.panelRecentProjects = QtWidgets.QWidget(WelcomeDialog)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred)
sizePolicy.setHorizontalStretch(2)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.panelRecentProjects.sizePolicy().hasHeightForWidth())
self.panelRecentProjects.setSizePolicy(sizePolicy)
self.panelRecentProjects.setObjectName("panelRecentProjects")
self.verticalLayout_3 = QtWidgets.QVBoxLayout(self.panelRecentProjects)
self.verticalLayout_3.setObjectName("verticalLayout_3")
self.labelRecentProjects = QtWidgets.QLabel(self.panelRecentProjects)
font = QtGui.QFont()
font.setPointSize(13)
self.labelRecentProjects.setFont(font)
self.labelRecentProjects.setObjectName("labelRecentProjects")
self.verticalLayout_3.addWidget(self.labelRecentProjects)
self.listRecentProjects = QtWidgets.QListWidget(self.panelRecentProjects)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(1)
sizePolicy.setHeightForWidth(self.listRecentProjects.sizePolicy().hasHeightForWidth())
self.listRecentProjects.setSizePolicy(sizePolicy)
self.listRecentProjects.setObjectName("listRecentProjects")
self.verticalLayout_3.addWidget(self.listRecentProjects)
self.horizontalLayout.addWidget(self.panelRecentProjects)
self.panelButtons = QtWidgets.QWidget(WelcomeDialog)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred)
sizePolicy.setHorizontalStretch(1)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.panelButtons.sizePolicy().hasHeightForWidth())
self.panelButtons.setSizePolicy(sizePolicy)
self.panelButtons.setObjectName("panelButtons")
self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.panelButtons)
self.verticalLayout_2.setObjectName("verticalLayout_2")
spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.MinimumExpanding)
self.verticalLayout_2.addItem(spacerItem)
self.buttonNewProject = QtWidgets.QCommandLinkButton(self.panelButtons)
self.buttonNewProject.setObjectName("buttonNewProject")
self.verticalLayout_2.addWidget(self.buttonNewProject)
self.buttonOpenProject = QtWidgets.QCommandLinkButton(self.panelButtons)
self.buttonOpenProject.setObjectName("buttonOpenProject")
self.verticalLayout_2.addWidget(self.buttonOpenProject)
self.horizontalLayout.addWidget(self.panelButtons)
self.verticalLayout.addLayout(self.horizontalLayout)
self.retranslateUi(WelcomeDialog)
QtCore.QMetaObject.connectSlotsByName(WelcomeDialog)
def retranslateUi(self, WelcomeDialog):
_translate = QtCore.QCoreApplication.translate
WelcomeDialog.setWindowTitle(_translate("WelcomeDialog", "Welcome"))
self.labelRecentProjects.setText(_translate("WelcomeDialog", "Recent projects"))
self.buttonNewProject.setText(_translate("WelcomeDialog", "&New Project"))
self.buttonNewProject.setDescription(_translate("WelcomeDialog", "Create a new project."))
self.buttonOpenProject.setText(_translate("WelcomeDialog", "&Open Project"))
self.buttonOpenProject.setDescription(_translate("WelcomeDialog", "Open an existing project."))
import resources_rc