7 Module implementing the multi project browser. |
7 Module implementing the multi project browser. |
8 """ |
8 """ |
9 |
9 |
10 from __future__ import unicode_literals |
10 from __future__ import unicode_literals |
11 |
11 |
|
12 import os |
|
13 import glob |
|
14 |
12 from PyQt5.QtCore import Qt |
15 from PyQt5.QtCore import Qt |
13 from PyQt5.QtWidgets import QTreeWidget, QTreeWidgetItem, QDialog, QMenu |
16 from PyQt5.QtWidgets import QTreeWidget, QTreeWidgetItem, QDialog, QMenu |
14 |
17 |
15 from E5Gui.E5Application import e5App |
18 from E5Gui.E5Application import e5App |
|
19 from E5Gui import E5MessageBox |
16 |
20 |
17 import UI.PixmapCache |
21 import UI.PixmapCache |
18 |
22 |
19 |
23 |
|
24 # TODO: add action to copy a project on disk |
20 class MultiProjectBrowser(QTreeWidget): |
25 class MultiProjectBrowser(QTreeWidget): |
21 """ |
26 """ |
22 Class implementing the multi project browser. |
27 Class implementing the multi project browser. |
23 """ |
28 """ |
24 ProjectFileNameRole = Qt.UserRole |
29 ProjectFileNameRole = Qt.UserRole |
288 itm = self.currentItem() |
293 itm = self.currentItem() |
289 if itm is not None and itm.parent() is not None: |
294 if itm is not None and itm.parent() is not None: |
290 uid = itm.data(0, MultiProjectBrowser.ProjectUidRole) |
295 uid = itm.data(0, MultiProjectBrowser.ProjectUidRole) |
291 if uid: |
296 if uid: |
292 self.multiProject.removeProject(uid) |
297 self.multiProject.removeProject(uid) |
|
298 |
|
299 def __deleteProject(self): |
|
300 """ |
|
301 Private method to handle the Delete context menu entry. |
|
302 """ |
|
303 itm = self.currentItem() |
|
304 if itm is not None and itm.parent() is not None: |
|
305 projectFile = itm.data(0, MultiProjectBrowser.ProjectFileNameRole) |
|
306 projectPath = os.path.dirname(projectFile) |
|
307 |
|
308 if self.project.getProjectPath() == projectPath: |
|
309 E5MessageBox.warning( |
|
310 self, |
|
311 self.tr("Delete Project"), |
|
312 self.tr("""The current project cannot be deleted.""" |
|
313 """ Please close it first.""")) |
|
314 else: |
|
315 projectFiles = glob.glob(os.path.join(projectPath, "*.e4p")) |
|
316 if not projectFiles: |
|
317 # Oops, that should not happen; play it save |
|
318 res = False |
|
319 elif len(projectFiles) == 1: |
|
320 res = E5MessageBox.yesNo( |
|
321 self, |
|
322 self.tr("Delete Project"), |
|
323 self.tr("""<p>Shall the project <b>{0}</b> (Path:""" |
|
324 """ {1}) really be deleted?</p>""").format( |
|
325 itm.text(0), projectPath)) |
|
326 else: |
|
327 res = E5MessageBox.yesNo( |
|
328 self, |
|
329 self.tr("Delete Project"), |
|
330 self.tr("""<p>Shall the project <b>{0}</b> (Path:""" |
|
331 """ {1}) really be deleted?</p>""" |
|
332 """<p><b>Warning:</b> It contains <b>{2}</b>""" |
|
333 """ sub-projects.</p>""").format( |
|
334 itm.text(0), projectPath, len(projectFiles))) |
|
335 if res: |
|
336 for subprojectFile in projectFiles: |
|
337 # remove all sub-projects before deleting the directory |
|
338 if subprojectFile != projectFile: |
|
339 projectData = { |
|
340 'name': "", |
|
341 'file': subprojectFile, |
|
342 'master': False, |
|
343 'description': "", |
|
344 'category': "", |
|
345 'uid': "", |
|
346 } |
|
347 pitm = self.__findProjectItem(projectData) |
|
348 if pitm: |
|
349 uid = pitm.data( |
|
350 0, MultiProjectBrowser.ProjectUidRole) |
|
351 if uid: |
|
352 self.multiProject.removeProject(uid) |
|
353 |
|
354 uid = itm.data(0, MultiProjectBrowser.ProjectUidRole) |
|
355 if uid: |
|
356 self.multiProject.deleteProject(uid) |
293 |
357 |
294 def __showProjectProperties(self): |
358 def __showProjectProperties(self): |
295 """ |
359 """ |
296 Private method to show the data of a project entry. |
360 Private method to show the data of a project entry. |
297 """ |
361 """ |
320 |
384 |
321 def __addNewProject(self): |
385 def __addNewProject(self): |
322 """ |
386 """ |
323 Private method to add a new project entry. |
387 Private method to add a new project entry. |
324 """ |
388 """ |
325 self.multiProject.addNewProject() |
389 itm = self.currentItem() |
|
390 if itm is not None: |
|
391 if itm.parent() is None: |
|
392 # current item is a category item |
|
393 category = itm.text(0) |
|
394 else: |
|
395 category = itm.parent().text(0) |
|
396 else: |
|
397 category = "" |
|
398 self.multiProject.addNewProject(category=category) |
326 |
399 |
327 def __createPopupMenu(self): |
400 def __createPopupMenu(self): |
328 """ |
401 """ |
329 Private method to create the popup menu. |
402 Private method to create the popup menu. |
330 """ |
403 """ |
331 self.__menu = QMenu(self) |
404 self.__menu = QMenu(self) |
332 self.__menu.addAction(self.tr("Open"), self.__openItem) |
405 self.__menu.addAction(self.tr("Open"), self.__openItem) |
333 self.__menu.addAction(self.tr("Remove"), self.__removeProject) |
406 self.__menu.addAction(self.tr("Remove from Multi Project"), |
|
407 self.__removeProject) |
|
408 self.__menu.addAction(self.tr("Delete from Disk"), |
|
409 self.__deleteProject) |
334 self.__menu.addAction(self.tr("Properties"), |
410 self.__menu.addAction(self.tr("Properties"), |
335 self.__showProjectProperties) |
411 self.__showProjectProperties) |
336 self.__menu.addSeparator() |
412 self.__menu.addSeparator() |
337 self.__menu.addAction(self.tr("Add Project..."), |
413 self.__menu.addAction(self.tr("Add Project..."), |
338 self.__addNewProject) |
414 self.__addNewProject) |