diff --git a/nw/assets/icons/fallback/proj_nwx.svg b/nw/assets/icons/fallback/proj_nwx.svg new file mode 100644 index 00000000..6495b39c --- /dev/null +++ b/nw/assets/icons/fallback/proj_nwx.svg @@ -0,0 +1,252 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + diff --git a/nw/gui/dialogs/projectload.py b/nw/gui/dialogs/projectload.py index 1ae20b64..46d48824 100644 --- a/nw/gui/dialogs/projectload.py +++ b/nw/gui/dialogs/projectload.py @@ -33,7 +33,7 @@ from datetime import datetime from PyQt5.QtCore import Qt from PyQt5.QtWidgets import ( QDialog, QHBoxLayout, QVBoxLayout, QGridLayout, QPushButton, QTreeWidget, - QAbstractItemView, QTreeWidgetItem + QAbstractItemView, QTreeWidgetItem, QDialogButtonBox, QLabel ) from nw.common import formatInt @@ -42,25 +42,33 @@ logger = logging.getLogger(__name__) class GuiProjectLoad(QDialog): + NONE_STATE = 0 + BROWSE_STATE = 1 + NEW_STATE = 2 + OPEN_STATE = 3 + def __init__(self, theParent): QDialog.__init__(self, theParent) logger.debug("Initialising GuiProjectLoad ...") - self.mainConf = nw.CONFIG - self.theParent = theParent - self.sourceItem = None - self.openPath = None + self.mainConf = nw.CONFIG + self.theParent = theParent + self.openState = self.NONE_STATE + self.openPath = None + + self.outerBox = QVBoxLayout() + self.innerBox = QHBoxLayout() + self.outerBox.setSpacing(16) + self.innerBox.setSpacing(16) - self.outerBox = QHBoxLayout() - self.innerBox = QVBoxLayout() self.setWindowTitle("Open Project") - self.setLayout(self.outerBox) + self.setMinimumWidth(650) + self.setMinimumHeight(400) + self.setModal(True) - self.guiDeco = self.theParent.theTheme.loadDecoration("nwicon", (128, 128)) - - self.outerBox.addWidget(self.guiDeco, 0, Qt.AlignTop) - self.outerBox.addLayout(self.innerBox) + self.guiDeco = self.theParent.theTheme.loadDecoration("nwicon", (96, 96)) + self.innerBox.addWidget(self.guiDeco, 0, Qt.AlignTop) self.projectForm = QGridLayout() self.projectForm.setContentsMargins(0, 0, 0, 0) @@ -71,34 +79,45 @@ class GuiProjectLoad(QDialog): self.listBox.setColumnCount(4) self.listBox.setHeaderLabels(["Working Title","Words","Last Opened","Path"]) self.listBox.setRootIsDecorated(False) + self.listBox.setColumnHidden(3, True) + self.listBox.itemClicked.connect(self._doSelectRecent) self.listBox.itemDoubleClicked.connect(self._doOpenRecent) treeHead = self.listBox.headerItem() treeHead.setTextAlignment(1, Qt.AlignRight) treeHead.setTextAlignment(2, Qt.AlignRight) - self.recentButton = QPushButton("Open") - self.recentButton.clicked.connect(self._doOpenRecent) - self.browseButton = QPushButton("Browse") - self.browseButton.clicked.connect(self._doBrowse) - self.closeButton = QPushButton("Close") - self.closeButton.clicked.connect(self._doClose) + self.lblRecent = QLabel("Recently Opened:") + self.lblPath = QLabel("Path:") + self.selPath = QLabel("") + self.selPath.setWordWrap(True) - self.projectForm.addWidget(self.listBox, 0, 0, 1, 4) - self.projectForm.addWidget(self.recentButton, 1, 1) - self.projectForm.addWidget(self.browseButton, 1, 2) - self.projectForm.addWidget(self.closeButton, 1, 3) - self.projectForm.setColumnStretch(0, 1) + self.projectForm.addWidget(self.lblRecent, 0, 0, 1, 2) + self.projectForm.addWidget(self.listBox, 1, 0, 1, 2) + self.projectForm.addWidget(self.lblPath, 2, 0, 1, 1, Qt.AlignTop) + self.projectForm.addWidget(self.selPath, 2, 1, 1, 1, Qt.AlignTop) + self.projectForm.setColumnStretch(1, 1) + self.projectForm.setVerticalSpacing(4) + self.projectForm.setHorizontalSpacing(8) self.innerBox.addLayout(self.projectForm) - self.rejected.connect(self._doClose) - self.setModal(True) - self.setMinimumWidth(750) - self.setMinimumHeight(450) - self.show() + self.buttonBox = QDialogButtonBox(QDialogButtonBox.Open | QDialogButtonBox.Cancel) + self.buttonBox.accepted.connect(self._doOpenRecent) + self.buttonBox.rejected.connect(self._doClose) + + self.newButton = self.buttonBox.addButton("New", QDialogButtonBox.ActionRole) + self.newButton.clicked.connect(self._doNewProject) + + self.browseButton = self.buttonBox.addButton("Browse", QDialogButtonBox.ActionRole) + self.browseButton.clicked.connect(self._doBrowse) + + self.outerBox.addLayout(self.innerBox) + self.outerBox.addWidget(self.buttonBox) + self.setLayout(self.outerBox) self._populateList() + self._doSelectRecent() logger.debug("GuiProjectLoad initialisation complete") @@ -116,10 +135,19 @@ class GuiProjectLoad(QDialog): selItems = self.listBox.selectedItems() if selItems: self.openPath = selItems[0].text(3) + self.openState = self.OPEN_STATE self.accept() else: self.openPath = None + self.openState = self.NONE_STATE + return + def _doSelectRecent(self): + """A recent item has been selected. + """ + selList = self.listBox.selectedItems() + if selList: + self.selPath.setText(selList[0].text(3)) return def _doBrowse(self): @@ -129,6 +157,7 @@ class GuiProjectLoad(QDialog): logger.verbose("GuiProjectLoad browse button clicked") self._saveDialogState() self.openPath = None + self.openState = self.BROWSE_STATE self.accept() return @@ -140,6 +169,16 @@ class GuiProjectLoad(QDialog): self.close() return + def _doNewProject(self): + """Create a new project. + """ + logger.verbose("GuiProjectLoad new project button clicked") + self._saveDialogState() + self.openPath = None + self.openState = self.NEW_STATE + self.accept() + return + ## # Internal Functions ## @@ -156,7 +195,6 @@ class GuiProjectLoad(QDialog): def _populateList(self): """Populate the list box with recent project data. """ - listOrder = [] listData = {} for projPath in self.mainConf.recentProj.keys(): @@ -178,6 +216,7 @@ class GuiProjectLoad(QDialog): hasSelection = False for timeStamp in sorted(listOrder, reverse=True): newItem = QTreeWidgetItem([""]*4) + newItem.setIcon(0, self.theParent.theTheme.getIcon("proj_nwx")) newItem.setText(0, listData[timeStamp][0]) newItem.setText(1, formatInt(listData[timeStamp][1])) newItem.setText(2, datetime.fromtimestamp(timeStamp).strftime("%x %X")) diff --git a/nw/guimain.py b/nw/guimain.py index e8c0840a..558712ed 100644 --- a/nw/guimain.py +++ b/nw/guimain.py @@ -262,7 +262,12 @@ class GuiMain(QMainWindow): dlgProj = GuiProjectLoad(self) dlgProj.exec_() if dlgProj.result() == QDialog.Accepted: - self.openProject(dlgProj.openPath) + if dlgProj.openState == GuiProjectLoad.OPEN_STATE: + self.openProject(dlgProj.openPath) + elif dlgProj.openState == GuiProjectLoad.BROWSE_STATE: + self.openProject(dlgProj.openPath) + elif dlgProj.openState == GuiProjectLoad.NEW_STATE: + self.newProject() return True