Skip to content

Commit 9a5cf8d

Browse files
committed
Merge pull request #183 from aoblet/millestone_v3
Millestone v3
2 parents e39e5c0 + 3e7fc4b commit 9a5cf8d

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

79 files changed

+480
-2414
lines changed

buttleofx/MainWindow.qml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import QtQuick.LocalStorage 2.0
1010
import "gui/graph/qml"
1111
import "gui/viewer/qml"
1212
import "gui/paramEditor/qml"
13-
import "gui/browser_v2/qml"
13+
import "gui/browser/qml"
1414
import "gui/plugin/qml"
1515
import "gui/shortcut/qml"
1616
import "gui/dialogs"
@@ -880,6 +880,8 @@ ApplicationWindow {
880880
onItemClicked: isSupported ? browser.fileWindow.onItemClickedSlot(pathImg) : 0
881881
onItemDoubleClicked: isSupported ? browser.fileWindow.onItemDoubleClickedSlot(absolutePath) : 0
882882
}
883+
884+
Component.onCompleted: browser.fileWindow.forceActiveFocus()
883885
}
884886

885887
Item {

buttleofx/gui/browser/__init__.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +0,0 @@
1-
# flake8: noqa
2-
from .fileModelBrowser import FileModelBrowser

buttleofx/gui/browser_v2/actions/actionInterface.py renamed to buttleofx/gui/browser/actions/actionInterface.py

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,12 @@ def __init__(self, browserItem):
1515
self._browserItem = browserItem
1616

1717
# required for abort processing
18-
self._abortFlag = False # if action have been aborted
19-
self._progress = 0.0 # progression of action between 0 and 1,will be used with Tuttle process in execute
18+
self._abortFlag = False # if action has been aborted
19+
self._progress = 0.0 # progression of action between 0 and 1 will be used with Tuttle process in execute
20+
self._failed = False
2021

2122
def __del__(self):
2223
logging.debug("Action destroyed")
23-
pass
2424

2525
def begin(self):
2626
if self._browserItem:
@@ -34,11 +34,12 @@ def abort(self):
3434
"""
3535
Process revert() if action processed
3636
"""
37-
if self._browserItem:
38-
self._abortFlag = True
39-
if self.isProcessed():
40-
self.revert()
41-
self._browserItem.notifyRemoveAction()
37+
if not self._browserItem or self._failed:
38+
return
39+
40+
self._abortFlag = True
41+
if self.isProcessed():
42+
self.revert()
4243

4344
def execute(self):
4445
raise NotImplementedError("ActionInterface::execute() must be implemented")
@@ -49,10 +50,17 @@ def revert(self):
4950
def process(self):
5051
if self._abortFlag:
5152
return
53+
5254
self.begin()
53-
self.execute()
55+
56+
try:
57+
self.execute()
58+
except Exception as e:
59+
print(str(e))
60+
self._failed = True
61+
5462
self.end()
55-
self._progress = 1
63+
self._progress = 0 if self._failed else 1
5664
self.progressChanged.emit()
5765

5866
def getBrowserItem(self):

buttleofx/gui/browser_v2/actions/actionManager.py renamed to buttleofx/gui/browser/actions/actionManager.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
from quickmamba.models import QObjectListModel
77

8-
from buttleofx.gui.browser_v2.actions.actionWorker import ActionWorker
8+
from buttleofx.gui.browser.actions.actionWorker import ActionWorker
99

1010

1111
class ActionManager(QtCore.QObject):

buttleofx/gui/browser_v2/actions/actionWrapper.py renamed to buttleofx/gui/browser/actions/actionWrapper.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ class ActionWrapper(QtCore.QObject):
77
"""
88
Expose useful data for qml such as nbActions and progression
99
"""
10-
# signals for qml
1110
nbProcessedChanged = QtCore.pyqtSignal()
1211
abortNotified = QtCore.pyqtSignal()
1312
progressChanged = QtCore.pyqtSignal()

buttleofx/gui/browser_v2/actions/browserAction.py renamed to buttleofx/gui/browser/actions/browserAction.py

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,13 @@
55

66
from pySequenceParser import sequenceParser
77

8-
from buttleofx.gui.browser_v2.actions.actionManager import globalActionManager
9-
from buttleofx.gui.browser_v2.actions.actionWrapper import ActionWrapper
10-
from buttleofx.gui.browser_v2.browserItem import BrowserItem
11-
from buttleofx.gui.browser_v2.actions.concreteActions.copy import Copy
12-
from buttleofx.gui.browser_v2.actions.concreteActions.move import Move
13-
from buttleofx.gui.browser_v2.actions.concreteActions.create import Create
14-
from buttleofx.gui.browser_v2.actions.concreteActions.delete import Delete
15-
from buttleofx.gui.browser_v2.browserModel import globalBrowserDialog, globalBrowser
8+
from buttleofx.gui.browser.actions.actionManager import globalActionManager
9+
from buttleofx.gui.browser.actions.actionWrapper import ActionWrapper
10+
from buttleofx.gui.browser.browserItem import BrowserItem
11+
from buttleofx.gui.browser.actions.concreteActions.copy import Copy
12+
from buttleofx.gui.browser.actions.concreteActions.move import Move
13+
from buttleofx.gui.browser.actions.concreteActions.create import Create
14+
from buttleofx.gui.browser.actions.concreteActions.delete import Delete
1615

1716

1817
class BrowserAction(QtCore.QObject):
@@ -40,11 +39,14 @@ def getCache(self):
4039

4140
@QtCore.pyqtSlot(QtCore.QObject)
4241
def pushToActionManager(self, actionWrapper=None):
42+
"""
43+
Will process the action automatically by pushing to actionManager
44+
"""
4345
if actionWrapper:
4446
globalActionManager.push(actionWrapper)
45-
else:
46-
if self._cacheActions:
47-
globalActionManager.push(self._cacheActions)
47+
return
48+
if self._cacheActions:
49+
globalActionManager.push(self._cacheActions)
4850

4951
@QtCore.pyqtSlot()
5052
def handleCopy(self):
@@ -75,6 +77,8 @@ def handlePaste(self, destination):
7577
for action in self._cacheActions.getActions():
7678
action.setDestinationPath(destination)
7779
self.pushToActionManager()
80+
self._cacheActions = None
81+
self.cacheChanged.emit()
7882

7983
@QtCore.pyqtSlot()
8084
def handleDelete(self):
@@ -96,8 +100,4 @@ def handleNew(self, typeItem):
96100
self.pushToActionManager(ActionWrapper([Create(parent, new)]))
97101

98102
# cache empty ?
99-
isCache = QtCore.pyqtProperty(bool, isEmptyCache, notify=cacheChanged)
100-
101-
102-
globalBrowserAction = BrowserAction(globalBrowser)
103-
globalBrowserActionDialog = BrowserAction(globalBrowserDialog)
103+
isCache = QtCore.pyqtProperty(bool, isEmptyCache, notify=cacheChanged)
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
import os
2+
import shutil
3+
import os.path as op
4+
5+
from buttleofx.gui.browser.actions.actionInterface import ActionInterface
6+
7+
8+
class Copy(ActionInterface):
9+
10+
def __init__(self, browserItem):
11+
ActionInterface.__init__(self, browserItem)
12+
self._srcPath = browserItem.getParentPath()
13+
self._destPath = ''
14+
self._framesPaths = [] # files sequences path copied
15+
self._successCopy = True
16+
17+
def setDestinationPath(self, newPath):
18+
if not op.isdir(newPath):
19+
raise TypeError
20+
self._destPath = newPath.strip()
21+
22+
def execute(self):
23+
browserItem = self._browserItem
24+
destPath = self._destPath
25+
26+
# avoid recurse copy
27+
if not op.exists(destPath) or browserItem.getPath() in destPath:
28+
self._failed = True
29+
print('%s already in %s: fail to copy' % (destPath, browserItem.getPath()))
30+
return
31+
32+
if browserItem.isFile():
33+
shutil.copy2(browserItem.getPath(), destPath)
34+
35+
elif browserItem.isFolder():
36+
shutil.copytree(browserItem.getPath(), op.join(destPath, browserItem.getName()))
37+
38+
elif browserItem.isSequence():
39+
seqParsed = browserItem.getSequence().getSequenceParsed()
40+
frames = seqParsed.getFramesIterable()
41+
42+
for f in frames:
43+
filename = seqParsed.getFilenameAt(f)
44+
filePath = op.join(browserItem.getParentPath(), filename)
45+
try:
46+
shutil.copy2(filePath, destPath)
47+
self._framesPaths.append(op.join(destPath, filename))
48+
except Exception as e:
49+
print(str(e))
50+
pass
51+
52+
def revert(self):
53+
browserItem = self.getBrowserItem()
54+
copiedPath = op.join(self._destPath, browserItem.getName())
55+
56+
if browserItem.isFile() and op.exists(copiedPath):
57+
os.remove(copiedPath)
58+
59+
if browserItem.isFolder() and op.exists(copiedPath):
60+
shutil.rmtree(copiedPath)
61+
62+
if browserItem.isSequence():
63+
for f in self._framesPaths:
64+
if op.exists(f):
65+
os.remove(f)

0 commit comments

Comments
 (0)