Worked on welcome dialog implementation.
This commit is contained in:
parent
ac582a8b0b
commit
59cd033cad
12
.vscode/launch.json
vendored
12
.vscode/launch.json
vendored
@ -4,6 +4,12 @@
|
|||||||
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
|
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
|
||||||
"version": "0.2.0",
|
"version": "0.2.0",
|
||||||
"configurations": [
|
"configurations": [
|
||||||
|
{
|
||||||
|
"name": "Python: main.py",
|
||||||
|
"type": "python",
|
||||||
|
"request": "launch",
|
||||||
|
"program": "${workspaceFolder}/main.py"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "Python: Current File",
|
"name": "Python: Current File",
|
||||||
"type": "python",
|
"type": "python",
|
||||||
@ -20,11 +26,5 @@
|
|||||||
"secret": "my_secret",
|
"secret": "my_secret",
|
||||||
"host": "localhost"
|
"host": "localhost"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"name": "Python: main.py",
|
|
||||||
"type": "python",
|
|
||||||
"request": "launch",
|
|
||||||
"program": "${workspaceFolder}/main.py"
|
|
||||||
},
|
|
||||||
]
|
]
|
||||||
}
|
}
|
@ -4,39 +4,46 @@ class ProjectManager(object):
|
|||||||
|
|
||||||
def __init__(self, appDataStorage):
|
def __init__(self, appDataStorage):
|
||||||
self.__appDataStorage = appDataStorage
|
self.__appDataStorage = appDataStorage
|
||||||
self.__recentProjects = []
|
self.__recentProjects = None
|
||||||
|
|
||||||
def getRecentProjects(self):
|
def getRecentProjects(self):
|
||||||
if self.__recentProjects is None:
|
if self.__recentProjects is None:
|
||||||
self.__recentProjects = list(self.__appDataStorage.readRecentProjects())
|
self.__recentProjects = {}
|
||||||
return self.__recentProjects
|
for item in self.__appDataStorage.readRecentProjects():
|
||||||
|
self.__recentProjects[item['path']] = item
|
||||||
|
|
||||||
|
return self.__recentProjects.values()
|
||||||
|
|
||||||
def pinRecentProject(self, entry, isPinned = True):
|
def pinRecentProject(self, entry, isPinned = True):
|
||||||
entry['pinned'] = isPinned
|
entry['pinned'] = isPinned
|
||||||
self.__appDataStorage.writeRecentProjects(self.__recentProjects)
|
self.__appDataStorage.writeRecentProjects(self.__recentProjects.values())
|
||||||
|
|
||||||
|
def deleteRecentProject(self, entry):
|
||||||
|
self.__recentProjects.pop(entry['path'], None)
|
||||||
|
self.__appDataStorage.writeRecentProjects(self.__recentProjects.values())
|
||||||
|
|
||||||
def debug_populateRecentProjects(self):
|
def debug_populateRecentProjects(self):
|
||||||
self.__recentProjects.append({
|
self.__recentProjects['/home/tibi/Videos/project.pro'] = {
|
||||||
'name' : 'Debug project',
|
'name' : 'Debug project',
|
||||||
'path' : '/home/tibi/Videos/project.pro',
|
'path' : '/home/tibi/Videos/project.pro',
|
||||||
'pinned' : True,
|
'pinned' : True,
|
||||||
'date' : 1
|
'date' : 1
|
||||||
})
|
}
|
||||||
self.__recentProjects.append({
|
self.__recentProjects['/home/tibi/Videos/project2.pro'] = {
|
||||||
'name' : 'Debug project 2',
|
'name' : 'Debug project 2',
|
||||||
'path' : '/home/tibi/Videos/project2.pro',
|
'path' : '/home/tibi/Videos/project2.pro',
|
||||||
'pinned' : False,
|
'pinned' : False,
|
||||||
'date' : 2
|
'date' : 2
|
||||||
})
|
}
|
||||||
self.__recentProjects.append({
|
self.__recentProjects['/home/tibi/Videos/project3.pro'] = {
|
||||||
'name' : 'Debug project 3',
|
'name' : 'Debug project 3',
|
||||||
'path' : '/home/tibi/Videos/project3.pro',
|
'path' : '/home/tibi/Videos/project3.pro',
|
||||||
'pinned' : False,
|
'pinned' : False,
|
||||||
'date' : 3
|
'date' : 3
|
||||||
})
|
}
|
||||||
self.__recentProjects.append({
|
self.__recentProjects['/home/tibi/Videos/project4.pro'] = {
|
||||||
'name' : 'Debug project 4',
|
'name' : 'Debug project 4',
|
||||||
'path' : '/home/tibi/Videos/project4.pro',
|
'path' : '/home/tibi/Videos/project4.pro',
|
||||||
'pinned' : False,
|
'pinned' : False,
|
||||||
'date' : 4
|
'date' : 4
|
||||||
})
|
}
|
@ -30,15 +30,20 @@ class AppDataStorage(object):
|
|||||||
def writeSettings(self, settings):
|
def writeSettings(self, settings):
|
||||||
pass # todo: finish this
|
pass # todo: finish this
|
||||||
|
|
||||||
|
def __parseRow(self, row):
|
||||||
|
row['date'] = int(row['date'])
|
||||||
|
row['pinned'] = row['pinned'].lower() in ['true', 'yes', '1', 'on']
|
||||||
|
return row
|
||||||
|
|
||||||
def readRecentProjects(self):
|
def readRecentProjects(self):
|
||||||
if (os.path.exists(self.__recentProjectsPath)):
|
if (os.path.exists(self.__recentProjectsPath)):
|
||||||
with open(self.__recentProjectsPath, 'rb') as recentProjectsFile:
|
with open(self.__recentProjectsPath, 'r') as recentProjectsFile:
|
||||||
csvreader = csv.DictReader(recentProjectsFile, fieldnames=AppDataStorage.RECENT_PROJECTS_FIELDS)
|
csvreader = csv.DictReader(recentProjectsFile, fieldnames=AppDataStorage.RECENT_PROJECTS_FIELDS)
|
||||||
for row in csvreader:
|
for row in csvreader:
|
||||||
yield row
|
yield self.__parseRow(row)
|
||||||
|
|
||||||
def writeRecentProjects(self, items):
|
def writeRecentProjects(self, items):
|
||||||
self.__createPath(self.__recentProjectsPath)
|
self.__createPath(self.__recentProjectsPath)
|
||||||
with open(self.__recentProjectsPath, 'wb') as recentProjectsFile:
|
with open(self.__recentProjectsPath, 'w') as recentProjectsFile:
|
||||||
csvwriter = csv.DictWriter(recentProjectsFile, AppDataStorage.RECENT_PROJECTS_FIELDS)
|
csvwriter = csv.DictWriter(recentProjectsFile, AppDataStorage.RECENT_PROJECTS_FIELDS)
|
||||||
csvwriter.writerows(items)
|
csvwriter.writerows(items)
|
@ -17,7 +17,7 @@ class EmberApplication(QApplication):
|
|||||||
# setup resources
|
# setup resources
|
||||||
appDataStorage = AppDataStorage()
|
appDataStorage = AppDataStorage()
|
||||||
projectManager = ProjectManager(appDataStorage)
|
projectManager = ProjectManager(appDataStorage)
|
||||||
projectManager.debug_populateRecentProjects()
|
#projectManager.debug_populateRecentProjects()
|
||||||
|
|
||||||
# show main window
|
# show main window
|
||||||
mainwindow = MainWindow(projectManager)
|
mainwindow = MainWindow(projectManager)
|
||||||
|
@ -1,11 +1,20 @@
|
|||||||
from PyQt5.QtWidgets import QWidget, QHBoxLayout, QLabel, QToolButton, QLayout
|
from PyQt5.QtWidgets import QWidget, QHBoxLayout, QLabel, QToolButton, QLayout
|
||||||
|
from PyQt5.QtCore import pyqtSignal
|
||||||
from PyQt5.QtGui import QFont
|
from PyQt5.QtGui import QFont
|
||||||
|
|
||||||
class RecentProjectWidget(QWidget):
|
class RecentProjectWidget(QWidget):
|
||||||
|
|
||||||
|
deleted = pyqtSignal()
|
||||||
|
pinned = pyqtSignal(bool)
|
||||||
|
|
||||||
def __init__(self, recentProject):
|
def __init__(self, recentProject):
|
||||||
super().__init__()
|
super().__init__()
|
||||||
|
self.project = recentProject
|
||||||
|
self.__selected = False
|
||||||
self.setupUi()
|
self.setupUi()
|
||||||
self.setProject(recentProject)
|
self.setupActions()
|
||||||
|
self.__setProject(recentProject)
|
||||||
|
self.setSelected(False)
|
||||||
|
|
||||||
def setupUi(self):
|
def setupUi(self):
|
||||||
layout = QHBoxLayout()
|
layout = QHBoxLayout()
|
||||||
@ -18,16 +27,46 @@ class RecentProjectWidget(QWidget):
|
|||||||
layout.addStretch()
|
layout.addStretch()
|
||||||
|
|
||||||
# pin button
|
# pin button
|
||||||
self.__button = QToolButton()
|
self.__pin_button = QToolButton()
|
||||||
self.__button.setFont(QFont("Font Awesome 5 Free"))
|
self.__pin_button.setFont(QFont("Font Awesome 5 Free"))
|
||||||
self.__button.setText("\uf08d")
|
self.__pin_button.setText("\uf08d")
|
||||||
self.__button.setCheckable(True)
|
self.__pin_button.setCheckable(True)
|
||||||
layout.addWidget(self.__button)
|
layout.addWidget(self.__pin_button)
|
||||||
|
|
||||||
|
# delete button
|
||||||
|
self.__del_button = QToolButton()
|
||||||
|
self.__del_button.setFont(QFont("Font Awesome 5 Free"))
|
||||||
|
self.__del_button.setText("\uf2ed")
|
||||||
|
layout.addWidget(self.__del_button)
|
||||||
|
|
||||||
|
# pin indicator
|
||||||
|
self.__pin_indicator = QLabel()
|
||||||
|
self.__pin_indicator.setFont(QFont("Font Awesome 5 Free"))
|
||||||
|
self.__pin_indicator.setText("\uf08d")
|
||||||
|
layout.addWidget(self.__pin_indicator)
|
||||||
|
|
||||||
# done
|
# done
|
||||||
layout.setSizeConstraint(QLayout.SetMinimumSize)
|
layout.setSizeConstraint(QLayout.SetMinimumSize)
|
||||||
self.setLayout(layout)
|
self.setLayout(layout)
|
||||||
|
|
||||||
def setProject(self, project):
|
def setupActions(self):
|
||||||
|
self.__pin_button.toggled.connect(self.__pinnedToggled)
|
||||||
|
self.__del_button.pressed.connect(self.deleted)
|
||||||
|
|
||||||
|
def setSelected(self, selected = True):
|
||||||
|
self.__selected = selected
|
||||||
|
self.__pin_button.setVisible(selected)
|
||||||
|
self.__del_button.setVisible(selected)
|
||||||
|
self.__pin_indicator.setVisible(not self.__selected and self.__pin_button.isChecked())
|
||||||
|
|
||||||
|
def setPinned(self, isPinned = True):
|
||||||
|
self.__pin_button.setChecked(isPinned)
|
||||||
|
|
||||||
|
def __setProject(self, project):
|
||||||
self.__text = project['name']
|
self.__text = project['name']
|
||||||
self.__button.setChecked(project['pinned'])
|
self.setPinned(project['pinned'])
|
||||||
|
|
||||||
|
def __pinnedToggled(self, isPinned):
|
||||||
|
self.__pin_indicator.setVisible(not self.__selected and isPinned)
|
||||||
|
if (isPinned != self.project['pinned']):
|
||||||
|
self.pinned.emit(isPinned)
|
@ -1,27 +1,21 @@
|
|||||||
import os
|
import traceback
|
||||||
import functools
|
|
||||||
from enum import Enum
|
|
||||||
|
|
||||||
from PyQt5.QtWidgets import QDialog, QVBoxLayout, QWidget, QCommandLinkButton, QListWidgetItem
|
from PyQt5.QtWidgets import QDialog, QCommandLinkButton, QListWidgetItem
|
||||||
from PyQt5.QtGui import QPixmap
|
from PyQt5.QtGui import QPixmap
|
||||||
from PyQt5.QtCore import Qt
|
from PyQt5.QtCore import Qt
|
||||||
from PyQt5 import uic
|
|
||||||
|
|
||||||
from util import str_compare
|
|
||||||
from ui.welcome.recent_project import RecentProjectWidget
|
from ui.welcome.recent_project import RecentProjectWidget
|
||||||
from ui.welcome.welcome_dialog_ui import Ui_WelcomeDialog
|
from ui.welcome.welcome_dialog_ui import Ui_WelcomeDialog
|
||||||
|
|
||||||
class WelcomeDialogResult(Enum):
|
|
||||||
NewProject = 0
|
|
||||||
OpenProject = 1
|
|
||||||
OpenRecentProject = 2
|
|
||||||
|
|
||||||
class WelcomeDialog(QDialog):
|
class WelcomeDialog(QDialog):
|
||||||
|
NEW_PROJECT = 0
|
||||||
|
OPEN_PROJECT = 1
|
||||||
|
|
||||||
def __init__(self, projectManager):
|
def __init__(self, projectManager):
|
||||||
super().__init__()
|
super().__init__()
|
||||||
self.__projectManager = projectManager
|
self.__projectManager = projectManager
|
||||||
self.__resultAction = None
|
self.resultAction = None
|
||||||
|
self.projectToOpen = None
|
||||||
self.setResult(QDialog.Rejected)
|
self.setResult(QDialog.Rejected)
|
||||||
self.setupUi()
|
self.setupUi()
|
||||||
self.setupActions()
|
self.setupActions()
|
||||||
@ -35,6 +29,8 @@ class WelcomeDialog(QDialog):
|
|||||||
def setupActions(self):
|
def setupActions(self):
|
||||||
self.ui.buttonNewProject.pressed.connect(self.newProjectPressed)
|
self.ui.buttonNewProject.pressed.connect(self.newProjectPressed)
|
||||||
self.ui.buttonOpenProject.pressed.connect(self.openProjectPressed)
|
self.ui.buttonOpenProject.pressed.connect(self.openProjectPressed)
|
||||||
|
self.ui.listRecentProjects.currentItemChanged.connect(self.listRecentProjectsCurrentChanged)
|
||||||
|
self.ui.listRecentProjects.itemActivated.connect(self.listRecentProjectsItemActivated)
|
||||||
|
|
||||||
def resizeEvent(self, event):
|
def resizeEvent(self, event):
|
||||||
super().resizeEvent(event)
|
super().resizeEvent(event)
|
||||||
@ -48,18 +44,52 @@ class WelcomeDialog(QDialog):
|
|||||||
projects = sorted(projects, key=lambda x: (x['pinned'], x['date']), reverse=True)
|
projects = sorted(projects, key=lambda x: (x['pinned'], x['date']), reverse=True)
|
||||||
|
|
||||||
for project in projects:
|
for project in projects:
|
||||||
|
|
||||||
|
widget = RecentProjectWidget(project)
|
||||||
|
widget.pinned.connect(self.__projectPinned)
|
||||||
|
widget.deleted.connect(self.__projectDeleted)
|
||||||
|
|
||||||
item = QListWidgetItem(project['name'])
|
item = QListWidgetItem(project['name'])
|
||||||
item.setData(Qt.UserRole, project)
|
item.setData(Qt.UserRole, project)
|
||||||
widget = RecentProjectWidget(project)
|
|
||||||
item.setSizeHint(widget.sizeHint())
|
item.setSizeHint(widget.sizeHint())
|
||||||
|
|
||||||
self.ui.listRecentProjects.addItem(item)
|
self.ui.listRecentProjects.addItem(item)
|
||||||
self.ui.listRecentProjects.setItemWidget(item, widget)
|
self.ui.listRecentProjects.setItemWidget(item, widget)
|
||||||
|
|
||||||
def newProjectPressed(self):
|
def newProjectPressed(self):
|
||||||
self.__resultAction = WelcomeDialogResult.NewProject
|
self.resultAction = WelcomeDialog.NEW_PROJECT
|
||||||
self.accept()
|
self.accept()
|
||||||
|
|
||||||
def openProjectPressed(self):
|
def openProjectPressed(self):
|
||||||
self.__resultAction = WelcomeDialogResult.OpenProject
|
# TODO: show open dialog
|
||||||
|
self.resultAction = WelcomeDialog.OPEN_PROJECT
|
||||||
self.accept()
|
self.accept()
|
||||||
|
|
||||||
|
def listRecentProjectsCurrentChanged(self, current, previous):
|
||||||
|
if not current is None:
|
||||||
|
recentProjectWidget = self.ui.listRecentProjects.itemWidget(current)
|
||||||
|
recentProjectWidget.setSelected(True)
|
||||||
|
|
||||||
|
if not previous is None:
|
||||||
|
recentProjectWidget = self.ui.listRecentProjects.itemWidget(previous)
|
||||||
|
if not recentProjectWidget is None:
|
||||||
|
recentProjectWidget.setSelected(False)
|
||||||
|
|
||||||
|
def listRecentProjectsItemActivated(self, item):
|
||||||
|
project = item.data(Qt.UserRole)
|
||||||
|
self.resultAction = WelcomeDialog.OPEN_PROJECT
|
||||||
|
self.projectToOpen = project['path']
|
||||||
|
self.accept()
|
||||||
|
|
||||||
|
def __projectPinned(self, isPinned):
|
||||||
|
project = self.ui.listRecentProjects.currentItem().data(Qt.UserRole)
|
||||||
|
self.__projectManager.pinRecentProject(project, isPinned)
|
||||||
|
|
||||||
|
def __projectDeleted(self):
|
||||||
|
project = self.ui.listRecentProjects.currentItem().data(Qt.UserRole)
|
||||||
|
try:
|
||||||
|
self.__projectManager.deleteRecentProject(project)
|
||||||
|
self.ui.listRecentProjects.takeItem(self.ui.listRecentProjects.currentRow())
|
||||||
|
except:
|
||||||
|
print("Error while deleting! ")
|
||||||
|
traceback.print_exc()
|
Loading…
Reference in New Issue
Block a user