class PageProjects(QtGui.QWidget): # Signals gotoProject = QtCore.pyqtSignal(int) def __init__(self, parent, databaseCon): logging.info("PageProjects->__init__(self, parent, databaseCon)") QtGui.QWidget.__init__(self, parent) self.databaseCon = databaseCon self.settings = QtCore.QSettings("tracks-queue", "tracks-queue") # latitudeLabel = QtGui.QLabel("Latitude:") # layout = QtGui.QGridLayout(self) # layout.addWidget(latitudeLabel, 0, 0) # The main page layout self.horizontalLayout = QtGui.QHBoxLayout(self) self.horizontalLayout.setSpacing(0) self.horizontalLayout.setMargin(0) # Scroll area for lists self.scrollArea = QtGui.QScrollArea() self.scrollArea.setWidgetResizable(True) # Layout for scroll area widget = QtGui.QWidget() self.scrollArea.setWidget(widget) self.verticalLayout = QtGui.QVBoxLayout(widget) self.horizontalLayout.addWidget(self.scrollArea) # Add the project editor form self.projectEditor = WidgetProjectEditor(self.databaseCon) self.projectEditor.setVisible(False) self.horizontalLayout.addWidget(self.projectEditor) self.projectEditor.projectModified.connect(self.refresh) # Add the project lists # Active projects self.activeProjectsList = WidgetProjectList(self.databaseCon, "Active Projects", None, True) self.activeProjectsList.gotoProject.connect(self.slotGotoProject) self.activeProjectsList.editProject.connect(self.projectEditor.setCurrentProjectID) self.verticalLayout.addWidget(self.activeProjectsList) # Hidden projects self.hiddenProjectsList = WidgetProjectList(self.databaseCon, "Hidden Projects", None, False) self.hiddenProjectsList.gotoProject.connect(self.slotGotoProject) self.hiddenProjectsList.editProject.connect(self.projectEditor.setCurrentProjectID) self.verticalLayout.addWidget(self.hiddenProjectsList) # Completed projects self.completedProjectsList = WidgetProjectList(self.databaseCon, "Completed Projects", None, False) self.completedProjectsList.gotoProject.connect(self.slotGotoProject) self.completedProjectsList.editProject.connect(self.projectEditor.setCurrentProjectID) self.completedProjectsList.setHasDoubleExpander(True) self.verticalLayout.addWidget(self.completedProjectsList) # Connect project save event to refresh lists self.projectEditor.projectModified.connect(self.refresh) # Add a vertical spacer spacerItem = QtGui.QSpacerItem(1, 1, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) self.verticalLayout.addItem(spacerItem) self.current_user_id = None def refresh(self, userId=None): logging.info("PageProjects->refresh()") if userId: self.current_user_id = userId # Active projects queryActive = ( "SELECT projects.id, projects.name, SUM(CASE WHEN \ todos.state IS 'active' THEN 1 ELSE 0 END), SUM(CASE \ WHEN todos.state = 'completed' THEN 1 ELSE 0 END) FROM \ projects LEFT JOIN todos ON projects.id=todos.project_id AND projects.user_id=todos.user_id\ WHERE projects.state='active' and projects.user_id=%s GROUP BY projects.id ORDER BY (CASE WHEN projects.id IN (select successor_id from dependencies where relationship_type='subproject') THEN 1 ELSE 0 END), projects.name" % (self.current_user_id) ) self.activeProjectsList.setDBQuery(queryActive) # Hidden projects queryHidden = ( "SELECT projects.id, projects.name, SUM(CASE WHEN \ todos.state IS 'active' THEN 1 ELSE 0 END), SUM(CASE \ WHEN todos.state = 'completed' THEN 1 ELSE 0 END) FROM \ projects LEFT JOIN todos ON projects.id=todos.project_id AND projects.user_id=todos.user_id \ WHERE projects.state='hidden' and projects.user_id=%s GROUP BY projects.id ORDER BY projects.name" % (self.current_user_id) ) self.hiddenProjectsList.setDBQuery(queryHidden) # Completed Projects queryCompleted = ( "SELECT projects.id, projects.name, SUM(CASE WHEN \ todos.state IS 'active' THEN 1 ELSE 0 END), SUM(CASE \ WHEN todos.state = 'completed' THEN 1 ELSE 0 END) FROM\ projects LEFT JOIN todos ON projects.id=\ todos.project_id AND projects.user_id=todos.user_id WHERE projects.state='completed' and projects.user_id=%s \ GROUP BY projects.id ORDER BY projects.name LIMIT 10" % (self.current_user_id) ) self.completedProjectsList.setDBQuery(queryCompleted) queryCompleted = ( "SELECT projects.id, projects.name, SUM(CASE WHEN \ todos.state IS 'active' THEN 1 ELSE 0 END), SUM(CASE \ WHEN todos.state = 'completed' THEN 1 ELSE 0 END) FROM\ projects LEFT JOIN todos ON projects.id=\ todos.project_id AND projects.user_id=todos.user_id WHERE projects.state='completed' and projects.user_id=%s \ GROUP BY projects.id ORDER BY projects.name" % (self.current_user_id) ) self.completedProjectsList.setExpandedDBQuery(queryCompleted) self.projectEditor.setCurrentUser(self.current_user_id) self.projectEditor.refresh() def setFormVisible(self, visible): logging.info("PageProjects->setFormVisible(self, visible)") self.projectEditor.setVisible(visible) self.projectEditor.setFocus() def slotGotoProject(self, id): logging.info("PageProjects->slotGotoProject(self, id)") self.emit(QtCore.SIGNAL("gotoProject(int)"), id) def moveExclusiveExpandUp(self): logging.info("tracks->moveExclusiveExpandUp") # shrink all lists but the expanded list focuspos = None posList = {} for key in self.homeContexts.keys(): pos = self.homeContexts[key].pos().y() posList[pos] = key if self.homeContexts[key].isExpanded(): if (not focuspos) or (pos < focuspos): focuspos = pos self.homeContexts[key].setExpanded(False) posKeys = posList.keys() posKeys.sort(reverse=True) done = False for pos in posKeys: if focuspos and pos < focuspos: self.homeContexts[posList[pos]].setExpanded(True) done = True break if done == False: self.homeContexts[posList[posKeys[len(posKeys) - 1]]].setExpanded(True) def moveExclusiveExpandDown(self): logging.info("PageProjects->moveExclusiveExpandDown(self)") # shrink all lists but the expanded list focuspos = None posList = {} for key in self.homeContexts.keys(): pos = self.homeContexts[key].pos().y() posList[pos] = key if self.homeContexts[key].isExpanded(): if (not focuspos) or (pos > focuspos): focuspos = pos self.homeContexts[key].setExpanded(False) posKeys = posList.keys() posKeys.sort() done = False for pos in posKeys: if focuspos and pos > focuspos: self.homeContexts[posList[pos]].setExpanded(True) done = True break if done == False: self.homeContexts[posList[posKeys[len(posKeys) - 1]]].setExpanded(True) def moveFocusUp(self): # moves the keyboard focus up to the next expanded list logging.info("PageProjects->moveFocusUp") keyfocuspos = None posList = {} # find the list with keyboard focus if there is one for key in self.homeContexts.keys(): pos = self.homeContexts[key].pos().y() posList[pos] = key if self.homeContexts[key].isAncestorOf(QtGui.QApplication.focusWidget()): keyfocuspos = pos # sort the lists by position posKeys = posList.keys() posKeys.sort(reverse=True) done = False # set keyboard focus on the next highest list that is expanded for pos in posKeys: if pos < keyfocuspos: if self.homeContexts[posList[pos]].isExpanded(): self.homeContexts[posList[pos]].listWidget.setFocus() else: self.homeContexts[posList[pos]].toggleListButton.setFocus() done = True break # If none were expanded set to highest list and expand if done == False: if self.homeContexts[posList[posKeys[0]]].isExpanded(): self.homeContexts[posList[posKeys[0]]].listWidget.setFocus() # setExpanded(True) else: self.homeContexts[posList[posKeys[0]]].toggleListButton.setFocus() def moveFocusDown(self): # moves the keyboard focus down to the next expanded list logging.info("PageProjects->moveFocusDown") keyfocuspos = None posList = {} # find the list with keyboard focus if there is one for key in self.homeContexts.keys(): pos = self.homeContexts[key].pos().y() posList[pos] = key if self.homeContexts[key].isAncestorOf(QtGui.QApplication.focusWidget()): keyfocuspos = pos # sort the lists by position posKeys = posList.keys() posKeys.sort() done = False # set keyboard focus on the next lowest list that is expanded for pos in posKeys: if keyfocuspos and pos > keyfocuspos: if self.homeContexts[posList[pos]].isExpanded(): self.homeContexts[posList[pos]].listWidget.setFocus() else: self.homeContexts[posList[pos]].toggleListButton.setFocus() done = True break # If none were expanded set to lowest list if done == False: if self.homeContexts[posList[posKeys[0]]].isExpanded(): self.homeContexts[posList[posKeys[0]]].listWidget.setFocus() # setExpanded(True) else: self.homeContexts[posList[posKeys[0]]].toggleListButton.setFocus()