summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar mkaay <mkaay@mkaay.de> 2010-05-01 22:13:59 +0200
committerGravatar mkaay <mkaay@mkaay.de> 2010-05-01 22:13:59 +0200
commit1cbd4effe10fbaa18a938975d54048f8e1c1f700 (patch)
tree47085cd606d540c11cca584ce56954d6ac77e1b0
parentgui captcha fix (diff)
downloadpyload-1cbd4effe10fbaa18a938975d54048f8e1c1f700.tar.xz
moved gui to http://bitbucket.org/mkaay/pyload-gui
-rw-r--r--locale/de/LC_MESSAGES/pyLoadGui.mobin3141 -> 0 bytes
-rw-r--r--locale/en/LC_MESSAGES/pyLoadGui.mobin375 -> 0 bytes
-rw-r--r--locale/es/LC_MESSAGES/pyLoadGui.mobin375 -> 0 bytes
-rw-r--r--locale/fi/LC_MESSAGES/pyLoadGui.mobin375 -> 0 bytes
-rw-r--r--locale/fr/LC_MESSAGES/pyLoadGui.mobin375 -> 0 bytes
-rw-r--r--locale/it/LC_MESSAGES/pyLoadGui.mobin375 -> 0 bytes
-rw-r--r--locale/nl/LC_MESSAGES/pyLoadGui.mobin3103 -> 0 bytes
-rw-r--r--locale/pl/LC_MESSAGES/pyLoadGui.mobin3147 -> 0 bytes
-rw-r--r--locale/ro/LC_MESSAGES/pyLoadGui.mobin375 -> 0 bytes
-rw-r--r--locale/ru/LC_MESSAGES/pyLoadGui.mobin375 -> 0 bytes
-rw-r--r--locale/tr/LC_MESSAGES/pyLoadGui.mobin375 -> 0 bytes
-rw-r--r--module/config/gui_default.xml13
-rw-r--r--module/gui/CaptchaDock.py85
-rw-r--r--module/gui/Collector.py307
-rw-r--r--module/gui/ConnectionManager.py249
-rw-r--r--module/gui/LinkDock.py54
-rw-r--r--module/gui/MainWindow.py428
-rw-r--r--module/gui/PWInputWindow.py47
-rw-r--r--module/gui/PackageDock.py76
-rw-r--r--module/gui/Queue.py424
-rw-r--r--module/gui/XMLParser.py71
-rw-r--r--module/gui/__init__.py1
-rw-r--r--module/gui/connector.py454
-rwxr-xr-xpyLoadGui.py630
24 files changed, 0 insertions, 2839 deletions
diff --git a/locale/de/LC_MESSAGES/pyLoadGui.mo b/locale/de/LC_MESSAGES/pyLoadGui.mo
deleted file mode 100644
index 7fca76598..000000000
--- a/locale/de/LC_MESSAGES/pyLoadGui.mo
+++ /dev/null
Binary files differ
diff --git a/locale/en/LC_MESSAGES/pyLoadGui.mo b/locale/en/LC_MESSAGES/pyLoadGui.mo
deleted file mode 100644
index 1ae24953f..000000000
--- a/locale/en/LC_MESSAGES/pyLoadGui.mo
+++ /dev/null
Binary files differ
diff --git a/locale/es/LC_MESSAGES/pyLoadGui.mo b/locale/es/LC_MESSAGES/pyLoadGui.mo
deleted file mode 100644
index 1ae24953f..000000000
--- a/locale/es/LC_MESSAGES/pyLoadGui.mo
+++ /dev/null
Binary files differ
diff --git a/locale/fi/LC_MESSAGES/pyLoadGui.mo b/locale/fi/LC_MESSAGES/pyLoadGui.mo
deleted file mode 100644
index 1ae24953f..000000000
--- a/locale/fi/LC_MESSAGES/pyLoadGui.mo
+++ /dev/null
Binary files differ
diff --git a/locale/fr/LC_MESSAGES/pyLoadGui.mo b/locale/fr/LC_MESSAGES/pyLoadGui.mo
deleted file mode 100644
index 1ae24953f..000000000
--- a/locale/fr/LC_MESSAGES/pyLoadGui.mo
+++ /dev/null
Binary files differ
diff --git a/locale/it/LC_MESSAGES/pyLoadGui.mo b/locale/it/LC_MESSAGES/pyLoadGui.mo
deleted file mode 100644
index 1ae24953f..000000000
--- a/locale/it/LC_MESSAGES/pyLoadGui.mo
+++ /dev/null
Binary files differ
diff --git a/locale/nl/LC_MESSAGES/pyLoadGui.mo b/locale/nl/LC_MESSAGES/pyLoadGui.mo
deleted file mode 100644
index 94df0f64b..000000000
--- a/locale/nl/LC_MESSAGES/pyLoadGui.mo
+++ /dev/null
Binary files differ
diff --git a/locale/pl/LC_MESSAGES/pyLoadGui.mo b/locale/pl/LC_MESSAGES/pyLoadGui.mo
deleted file mode 100644
index 7d1745301..000000000
--- a/locale/pl/LC_MESSAGES/pyLoadGui.mo
+++ /dev/null
Binary files differ
diff --git a/locale/ro/LC_MESSAGES/pyLoadGui.mo b/locale/ro/LC_MESSAGES/pyLoadGui.mo
deleted file mode 100644
index 1ae24953f..000000000
--- a/locale/ro/LC_MESSAGES/pyLoadGui.mo
+++ /dev/null
Binary files differ
diff --git a/locale/ru/LC_MESSAGES/pyLoadGui.mo b/locale/ru/LC_MESSAGES/pyLoadGui.mo
deleted file mode 100644
index 1ae24953f..000000000
--- a/locale/ru/LC_MESSAGES/pyLoadGui.mo
+++ /dev/null
Binary files differ
diff --git a/locale/tr/LC_MESSAGES/pyLoadGui.mo b/locale/tr/LC_MESSAGES/pyLoadGui.mo
deleted file mode 100644
index 1ae24953f..000000000
--- a/locale/tr/LC_MESSAGES/pyLoadGui.mo
+++ /dev/null
Binary files differ
diff --git a/module/config/gui_default.xml b/module/config/gui_default.xml
deleted file mode 100644
index 1faed776f..000000000
--- a/module/config/gui_default.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-<?xml version="1.0" ?>
-<root>
- <connections>
- <connection default="True" type="local" id="33965310e19b4a869112c43b39a16440">
- <name>Local</name>
- </connection>
- </connections>
- <mainWindow>
- <state></state>
- <geometry></geometry>
- </mainWindow>
- <language>en</language>
-</root>
diff --git a/module/gui/CaptchaDock.py b/module/gui/CaptchaDock.py
deleted file mode 100644
index 4f3c9efd0..000000000
--- a/module/gui/CaptchaDock.py
+++ /dev/null
@@ -1,85 +0,0 @@
-# -*- coding: utf-8 -*-
-
-"""
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 3 of the License,
- or (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- See the GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, see <http://www.gnu.org/licenses/>.
-
- @author: mkaay
-"""
-
-from PyQt4.QtCore import *
-from PyQt4.QtGui import *
-
-class CaptchaDock(QDockWidget):
- def __init__(self):
- QDockWidget.__init__(self, _("Captcha"))
- self.setObjectName("Captcha Dock")
- self.widget = CaptchaDockWidget(self)
- self.setWidget(self.widget)
- self.setAllowedAreas(Qt.BottomDockWidgetArea)
- self.setFeatures(QDockWidget.NoDockWidgetFeatures)
- self.hide()
- self.processing = False
- self.currentID = None
- self.connect(self, SIGNAL("setTask"), self.setTask)
-
- def isFree(self):
- return not self.processing
-
- def setTask(self, tid, img, imgType):
- self.processing = True
- data = QByteArray(img)
- self.currentID = tid
- self.widget.emit(SIGNAL("setImage"), data)
- self.widget.input.setText("")
- self.show()
-
-class CaptchaDockWidget(QWidget):
- def __init__(self, dock):
- QWidget.__init__(self)
- self.dock = dock
- self.setLayout(QHBoxLayout())
- layout = self.layout()
-
- imgLabel = QLabel()
- captchaInput = QLineEdit()
- okayButton = QPushButton(_("OK"))
- cancelButton = QPushButton(_("Cancel"))
-
- layout.addStretch()
- layout.addWidget(imgLabel)
- layout.addWidget(captchaInput)
- layout.addWidget(okayButton)
- layout.addWidget(cancelButton)
- layout.addStretch()
-
- self.input = captchaInput
-
- self.connect(okayButton, SIGNAL("clicked()"), self.slotSubmit)
- self.connect(captchaInput, SIGNAL("returnPressed()"), self.slotSubmit)
- self.connect(self, SIGNAL("setImage"), self.setImg)
- self.connect(self, SIGNAL("setPixmap(const QPixmap &)"), imgLabel, SLOT("setPixmap(const QPixmap &)"))
-
- def setImg(self, data):
- pixmap = QPixmap()
- pixmap.loadFromData(data)
- self.emit(SIGNAL("setPixmap(const QPixmap &)"), pixmap)
-
- def slotSubmit(self):
- text = self.input.text()
- tid = self.dock.currentID
- self.dock.currentID = None
- self.dock.emit(SIGNAL("done"), tid, str(text))
- self.dock.hide()
- self.dock.processing = False
-
diff --git a/module/gui/Collector.py b/module/gui/Collector.py
deleted file mode 100644
index 6fce9d49e..000000000
--- a/module/gui/Collector.py
+++ /dev/null
@@ -1,307 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 3 of the License,
- or (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- See the GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, see <http://www.gnu.org/licenses/>.
-
- @author: mkaay
-"""
-
-from PyQt4.QtCore import *
-from PyQt4.QtGui import *
-
-from module.gui.Queue import ItemIterator
-
-class PackageCollector(QObject):
- def __init__(self, view, connector):
- QObject.__init__(self)
- self.view = view
- self.connector = connector
- self.collector = []
- self.rootItem = self.view.invisibleRootItem()
- self.mutex = QMutex()
- item = self.PackageCollectorPack(self)
- item.setPackData({"id":"fixed"})
- item.setData(0, Qt.DisplayRole, QVariant("Single Links"))
- item.setFlags(Qt.ItemIsEnabled | Qt.ItemIsSelectable)
- self.rootItem.addChild(item)
- self.linkCollector = item
-
- def fullReload(self):
- locker = QMutexLocker(self.mutex)
- self.clearAll()
- packs = self.connector.getPackageCollector()
- for data in packs:
- pack = self.PackageCollectorPack(self)
- pack.setPackData(data)
- files = self.connector.getPackageFiles(data["id"])
- for fid in files:
- info = self.connector.getLinkInfo(fid)
- child = self.PackageCollectorFile(self, pack)
- child.setFileData(info)
- pack.addPackChild(fid, child)
- self.addPack(data["id"], pack)
-
- def addEvent(self, event):
- if event[0] == "reload":
- self.fullReload()
- elif event[0] == "remove":
- self.removeEvent(event)
- elif event[0] == "insert":
- self.insertEvent(event)
- elif event[0] == "update":
- self.updateEvent(event)
-
- def removeEvent(self, event):
- if event[2] == "file":
- for pack in ItemIterator(self.rootItem):
- for k, child in enumerate(pack.getChildren()):
- if child.getFileData()["id"] == event[3]:
- pack.removeChild(child)
- break
- else:
- for k, pack in enumerate(ItemIterator(self.rootItem)):
- if pack.getPackData()["id"] == event[3]:
- pack.clearAll()
- self.rootItem.removeChild(pack)
- break
-
- def insertEvent(self, event):
- if event[2] == "file":
- info = self.connector.getLinkInfo(event[3])
- for pack in ItemIterator(self.rootItem):
- if pack.getPackData()["id"] == info["package"]:
- child = self.PackageCollectorFile(self, pack)
- child.setFileData(info)
- pack.addPackChild(info["id"], child)
- break
- else:
- data = self.connector.getPackageInfo(event[3])
- pack = self.PackageCollectorPack(self)
- pack.setPackData(data)
- self.addPack(data["id"], pack)
- files = self.connector.getPackageFiles(data["id"])
- for fid in files:
- info = self.connector.getLinkInfo(fid)
- child = self.PackageCollectorFile(self, pack)
- child.setFileData(info)
- pack.addPackChild(fid, child)
- self.addPack(data["id"], pack)
-
- def updateEvent(self, event):
- if event[2] == "file":
- info = self.connector.getLinkInfo(event[3])
- if not info:
- return
- for pack in ItemIterator(self.rootItem):
- if pack.getPackData()["id"] == info["package"]:
- child = pack.getChild(event[3])
- child.setFileData(info)
- pack.addPackChild(info["id"], child)
- else:
- data = self.connector.getPackageInfo(event[3])
- pack = self.getPack(event[3])
- pack.setPackData(data)
- files = self.connector.getPackageFiles(data["id"])
- for fid in files:
- info = self.connector.getLinkInfo(fid)
- child = pack.getChild(fid)
- if not child:
- child = self.PackageCollectorFile(self, pack)
- child.setFileData(info)
- pack.addPackChild(fid, child)
- self.addPack(data["id"], pack)
-
- def addPack(self, pid, newPack):
- pos = None
- try:
- for pack in ItemIterator(self.rootItem):
- if pack.getPackData()["id"] == pid:
- pos = self.rootItem.indexOfChild(pack)
- break
- if pos == None:
- raise Exception()
- item = self.rootItem.child(pos)
- item.setPackData(newPack.getPackData())
- except:
- self.rootItem.insertChild(self.rootItem.childCount()-1, newPack)
- item = newPack
- item.setData(0, Qt.DisplayRole, QVariant(item.getPackData()["package_name"]))
- item.setData(0, Qt.UserRole, QVariant(pid))
- item.setFlags(Qt.ItemIsSelectable | Qt.ItemIsEnabled | Qt.ItemIsDropEnabled | Qt.ItemIsEditable)
-
- def getPack(self, pid):
- for k, pack in enumerate(ItemIterator(self.rootItem)):
- if pack.getPackData()["id"] == pid:
- return pack
- return None
-
- def clearAll(self):
- for k, pack in enumerate(ItemIterator(self.rootItem)):
- if not pack.getPackData()["id"] == "fixed":
- pack.clearAll()
- self.rootItem.removeChild(pack)
-
- class PackageCollectorPack(QTreeWidgetItem):
- def __init__(self, collector):
- QTreeWidgetItem.__init__(self)
- self.collector = collector
- self._data = {}
-
- def addPackChild(self, cid, newChild):
- pos = None
- try:
- for child in ItemIterator(self):
- if child.getData()["id"] == cid:
- pos = self.indexOfChild(child)
- break
- if pos == None:
- raise Exception()
- item = self.child(pos)
- item.setFileData(newChild.getFileData())
- except:
- self.addChild(newChild)
- item = newChild
- item.setData(0, Qt.DisplayRole, QVariant(item.getFileData()["filename"]))
- item.setData(0, Qt.UserRole, QVariant(cid))
- item.setFlags(Qt.ItemIsSelectable | Qt.ItemIsEnabled | Qt.ItemIsDragEnabled)
-
- def setPackData(self, data):
- self._data = data
-
- def getPackData(self):
- return self._data
-
- def getChildren(self):
- ret = []
- for item in ItemIterator(self):
- ret.append(item)
- return ret
-
- def getChild(self, cid):
- for item in ItemIterator(self):
- if item.getFileData()["id"] == cid:
- return item
- return None
-
- def clearAll(self):
- for c in ItemIterator(self):
- self.removeChild(c)
-
- class PackageCollectorFile(QTreeWidgetItem):
- def __init__(self, collector, pack):
- QTreeWidgetItem.__init__(self)
- self.collector = collector
- self.pack = pack
- self._data = {}
- self.wait_since = None
-
- def getFileData(self):
- return self._data
-
- def setFileData(self, data):
- self._data = data
-
- def getPack(self):
- return self.pack
-
-class LinkCollector(QObject):
- def __init__(self, view, root, connector):
- QObject.__init__(self)
- self.view = view
- self.connector = connector
- self.rootItem = root
- self.mutex = QMutex()
-
- def fullReload(self):
- locker = QMutexLocker(self.mutex)
- self.clearAll()
- ids = self.connector.getLinkCollector()
- for fid in ids:
- data = self.connector.getLinkInfo(fid)
- file = self.LinkCollectorFile(self)
- file.setFileData(data)
- self.addFile(fid, file)
-
- def addEvent(self, event):
- if event[0] == "reload":
- self.fullReload()
- elif event[0] == "remove":
- self.removeEvent(event)
- elif event[0] == "insert":
- self.insertEvent(event)
- elif event[0] == "update":
- self.updateEvent(event)
-
- def removeEvent(self, event):
- if event[2] == "file":
- for k, file in enumerate(ItemIterator(self.rootItem)):
- if file.getFileData()["id"] == event[3]:
- self.rootItem.removeChild(file)
- break
-
- def insertEvent(self, event):
- if event[2] == "file":
- data = self.connector.getLinkInfo(event[3])
- file = self.LinkCollectorFile(self)
- file.setFileData(data)
- self.addFile(event[3], file)
-
- def updateEvent(self, event):
- if event[2] == "file":
- data = self.connector.getLinkInfo(event[3])
- if not data:
- return
- file = getFile(event[3])
- file.setFileData(data)
- self.addFile(event[3], file)
-
- def addFile(self, pid, newFile):
- pos = None
- try:
- for pack in ItemIterator(self.rootItem):
- if file.getFileData()["id"] == pid:
- pos = self.rootItem.indexOfChild(file)
- break
- if pos == None:
- raise Exception()
- item = self.rootItem.child(pos)
- item.setFileData(newFile.getPackData())
- except:
- self.rootItem.addChild(newFile)
- item = newFile
- item.setData(0, Qt.DisplayRole, QVariant(newFile.getFileData()["filename"]))
- item.setData(0, Qt.UserRole, QVariant(pid))
- flags = Qt.ItemIsSelectable | Qt.ItemIsDragEnabled | Qt.ItemIsEnabled
- item.setFlags(flags)
-
- def getFile(self, pid):
- for file in ItemIterator(self.rootItem):
- if file.getFileData()["id"] == pid:
- return file
- return None
-
- def clearAll(self):
- for k, file in enumerate(ItemIterator(self.rootItem)):
- self.rootItem.removeChild(file)
-
- class LinkCollectorFile(QTreeWidgetItem):
- def __init__(self, collector):
- QTreeWidgetItem.__init__(self)
- self.collector = collector
- self._data = {}
-
- def getFileData(self):
- return self._data
-
- def setFileData(self, data):
- self._data = data
diff --git a/module/gui/ConnectionManager.py b/module/gui/ConnectionManager.py
deleted file mode 100644
index 47d287967..000000000
--- a/module/gui/ConnectionManager.py
+++ /dev/null
@@ -1,249 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 3 of the License,
- or (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- See the GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, see <http://www.gnu.org/licenses/>.
-
- @author: mkaay
-"""
-
-from PyQt4.QtCore import *
-from PyQt4.QtGui import *
-
-from uuid import uuid4 as uuid
-
-class ConnectionManager(QWidget):
- def __init__(self):
- QWidget.__init__(self)
-
- mainLayout = QHBoxLayout()
- buttonLayout = QVBoxLayout()
-
- connList = QListWidget()
-
- new = QPushButton(_("New"))
- edit = QPushButton(_("Edit"))
- remove = QPushButton(_("Remove"))
- connect = QPushButton(_("Connect"))
-
- mainLayout.addWidget(connList)
- mainLayout.addLayout(buttonLayout)
-
- buttonLayout.addWidget(new)
- buttonLayout.addWidget(edit)
- buttonLayout.addWidget(remove)
- buttonLayout.addStretch()
- buttonLayout.addWidget(connect)
-
- self.setLayout(mainLayout)
-
- self.new = new
- self.connectb = connect
- self.remove = remove
- self.editb = edit
- self.connList = connList
- self.edit = self.EditWindow()
- self.connectSignals()
-
- self.defaultStates = {}
-
- def connectSignals(self):
- self.connect(self, SIGNAL("setConnections"), self.setConnections)
- self.connect(self.new, SIGNAL("clicked()"), self.slotNew)
- self.connect(self.editb, SIGNAL("clicked()"), self.slotEdit)
- self.connect(self.remove, SIGNAL("clicked()"), self.slotRemove)
- self.connect(self.connectb, SIGNAL("clicked()"), self.slotConnect)
- self.connect(self.edit, SIGNAL("save"), self.slotSave)
- self.connect(self.connList, SIGNAL("itemDoubleClicked(QListWidgetItem *)"), self.slotItemDoubleClicked)
-
- def setConnections(self, connections):
- self.connList.clear()
- for conn in connections:
- item = QListWidgetItem()
- item.setData(Qt.DisplayRole, QVariant(conn["name"]))
- item.setData(Qt.UserRole, QVariant(conn))
- self.connList.addItem(item)
- if conn["default"]:
- item.setData(Qt.DisplayRole, QVariant(_("%s (Default)") % conn["name"]))
- self.connList.setCurrentItem(item)
-
- def slotNew(self):
- data = {"id":uuid().hex, "type":"remote", "default":False, "name":"", "host":"", "ssl":False, "port":"7227", "user":"admin"}
- self.edit.setData(data)
- self.edit.show()
-
- def slotEdit(self):
- item = self.connList.currentItem()
- data = item.data(Qt.UserRole).toPyObject()
- data = self.cleanDict(data)
- self.edit.setData(data)
- self.edit.show()
-
- def slotRemove(self):
- item = self.connList.currentItem()
- data = item.data(Qt.UserRole).toPyObject()
- data = self.cleanDict(data)
- self.emit(SIGNAL("removeConnection"), data)
-
- def slotConnect(self):
- item = self.connList.currentItem()
- data = item.data(Qt.UserRole).toPyObject()
- data = self.cleanDict(data)
- self.emit(SIGNAL("connect"), data)
-
- def cleanDict(self, data):
- tmp = {}
- for k, d in data.items():
- tmp[str(k)] = d
- return tmp
-
- def slotSave(self, data):
- self.emit(SIGNAL("saveConnection"), data)
-
- def slotItemDoubleClicked(self, defaultItem):
- data = defaultItem.data(Qt.UserRole).toPyObject()
- self.setDefault(data, True)
- did = self.cleanDict(data)["id"]
- allItems = self.connList.findItems("*", Qt.MatchWildcard)
- count = self.connList.count()
- for i in range(count):
- item = self.connList.item(i)
- data = item.data(Qt.UserRole).toPyObject()
- if self.cleanDict(data)["id"] == did:
- continue
- self.setDefault(data, False)
-
- def setDefault(self, data, state):
- data = self.cleanDict(data)
- self.edit.setData(data)
- data = self.edit.getData()
- data["default"] = state
- self.edit.emit(SIGNAL("save"), data)
-
- class EditWindow(QWidget):
- def __init__(self):
- QWidget.__init__(self)
-
- grid = QGridLayout()
-
- nameLabel = QLabel(_("Name:"))
- hostLabel = QLabel(_("Host:"))
- sslLabel = QLabel(_("SSL:"))
- localLabel = QLabel(_("Local:"))
- userLabel = QLabel(_("User:"))
- portLabel = QLabel(_("Port:"))
-
- name = QLineEdit()
- host = QLineEdit()
- ssl = QCheckBox()
- local = QCheckBox()
- user = QLineEdit()
- port = QSpinBox()
- port.setRange(1,10000)
-
- save = QPushButton(_("Save"))
- cancel = QPushButton(_("Cancel"))
-
- grid.addWidget(nameLabel, 0, 0)
- grid.addWidget(name, 0, 1)
- grid.addWidget(localLabel, 1, 0)
- grid.addWidget(local, 1, 1)
- grid.addWidget(hostLabel, 2, 0)
- grid.addWidget(host, 2, 1)
- grid.addWidget(sslLabel, 4, 0)
- grid.addWidget(ssl, 4, 1)
- grid.addWidget(userLabel, 5, 0)
- grid.addWidget(user, 5, 1)
- grid.addWidget(portLabel, 3, 0)
- grid.addWidget(port, 3, 1)
- grid.addWidget(cancel, 6, 0)
- grid.addWidget(save, 6, 1)
-
- self.setLayout(grid)
- self.controls = {}
- self.controls["name"] = name
- self.controls["host"] = host
- self.controls["ssl"] = ssl
- self.controls["local"] = local
- self.controls["user"] = user
- self.controls["port"] = port
- self.controls["save"] = save
- self.controls["cancel"] = cancel
-
- self.connect(cancel, SIGNAL("clicked()"), self.hide)
- self.connect(save, SIGNAL("clicked()"), self.slotDone)
- self.connect(local, SIGNAL("stateChanged(int)"), self.slotLocalChanged)
-
- self.id = None
- self.default = None
-
- def setData(self, data):
- self.id = data["id"]
- self.default = data["default"]
- self.controls["name"].setText(data["name"])
- if data["type"] == "local":
- data["local"] = True
- else:
- data["local"] = False
- self.controls["local"].setChecked(data["local"])
- if not data["local"]:
- self.controls["ssl"].setChecked(data["ssl"])
- self.controls["user"].setText(data["user"])
- self.controls["port"].setValue(int(data["port"]))
- self.controls["host"].setText(data["host"])
- self.controls["ssl"].setDisabled(False)
- self.controls["user"].setDisabled(False)
- self.controls["port"].setDisabled(False)
- self.controls["host"].setDisabled(False)
- else:
- self.controls["ssl"].setChecked(False)
- self.controls["user"].setText("")
- self.controls["port"].setValue(1)
- self.controls["host"].setText("")
- self.controls["ssl"].setDisabled(True)
- self.controls["user"].setDisabled(True)
- self.controls["port"].setDisabled(True)
- self.controls["host"].setDisabled(True)
-
- def slotLocalChanged(self, val):
- if val == 2:
- self.controls["ssl"].setDisabled(True)
- self.controls["user"].setDisabled(True)
- self.controls["port"].setDisabled(True)
- self.controls["host"].setDisabled(True)
- elif val == 0:
- self.controls["ssl"].setDisabled(False)
- self.controls["user"].setDisabled(False)
- self.controls["port"].setDisabled(False)
- self.controls["host"].setDisabled(False)
-
- def getData(self):
- d = {}
- d["id"] = self.id
- d["default"] = self.default
- d["name"] = self.controls["name"].text()
- d["local"] = self.controls["local"].isChecked()
- d["ssl"] = str(self.controls["ssl"].isChecked())
- d["user"] = self.controls["user"].text()
- d["host"] = self.controls["host"].text()
- d["port"] = self.controls["port"].value()
- if d["local"]:
- d["type"] = "local"
- else:
- d["type"] = "remote"
- return d
-
- def slotDone(self):
- data = self.getData()
- self.hide()
- self.emit(SIGNAL("save"), data)
-
diff --git a/module/gui/LinkDock.py b/module/gui/LinkDock.py
deleted file mode 100644
index 99429d04b..000000000
--- a/module/gui/LinkDock.py
+++ /dev/null
@@ -1,54 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 3 of the License,
- or (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- See the GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, see <http://www.gnu.org/licenses/>.
-
- @author: mkaay
-"""
-
-from PyQt4.QtCore import *
-from PyQt4.QtGui import *
-
-class NewLinkDock(QDockWidget):
- def __init__(self):
- QDockWidget.__init__(self, "New Links")
- self.setObjectName("New Links Dock")
- self.widget = NewLinkWindow(self)
- self.setWidget(self.widget)
- self.setAllowedAreas(Qt.RightDockWidgetArea|Qt.LeftDockWidgetArea)
- self.hide()
-
- def slotDone(self):
- text = str(self.widget.box.toPlainText())
- lines = text.splitlines()
- self.emit(SIGNAL("done"), lines)
- self.widget.box.clear()
- self.hide()
-
-class NewLinkWindow(QWidget):
- def __init__(self, dock):
- QWidget.__init__(self)
- self.dock = dock
- self.setLayout(QVBoxLayout())
- layout = self.layout()
-
- boxLabel = QLabel("Paste URLs here:")
- self.box = QTextEdit()
-
- save = QPushButton("Add")
-
- layout.addWidget(boxLabel)
- layout.addWidget(self.box)
- layout.addWidget(save)
-
- self.connect(save, SIGNAL("clicked()"), self.dock.slotDone)
diff --git a/module/gui/MainWindow.py b/module/gui/MainWindow.py
deleted file mode 100644
index 16a409f64..000000000
--- a/module/gui/MainWindow.py
+++ /dev/null
@@ -1,428 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 3 of the License,
- or (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- See the GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, see <http://www.gnu.org/licenses/>.
-
- @author: mkaay
-"""
-
-from PyQt4.QtCore import *
-from PyQt4.QtGui import *
-
-from module.gui.PackageDock import *
-from module.gui.LinkDock import *
-from module.gui.CaptchaDock import CaptchaDock
-
-class MainWindow(QMainWindow):
- def __init__(self):
- """
- set up main window
- """
- QMainWindow.__init__(self)
- #window stuff
- self.setWindowTitle(_("pyLoad Client"))
- self.setWindowIcon(QIcon("icons/logo.png"))
- self.resize(850,500)
-
- #layout version
- self.version = 2
-
- #init docks
- self.newPackDock = NewPackageDock()
- self.addDockWidget(Qt.RightDockWidgetArea, self.newPackDock)
- self.newLinkDock = NewLinkDock()
- self.addDockWidget(Qt.RightDockWidgetArea, self.newLinkDock)
- self.connect(self.newLinkDock, SIGNAL("done"), self.slotAddLinks)
- self.connect(self.newPackDock, SIGNAL("done"), self.slotAddPackage)
- self.captchaDock = CaptchaDock()
- self.addDockWidget(Qt.BottomDockWidgetArea, self.captchaDock)
-
- #central widget, layout
- self.masterlayout = QVBoxLayout()
- lw = QWidget()
- lw.setLayout(self.masterlayout)
- self.setCentralWidget(lw)
-
- #set menubar and statusbar
- self.menubar = self.menuBar()
- self.statusbar = self.statusBar()
- self.connect(self.statusbar, SIGNAL("showMsg"), self.statusbar.showMessage)
- self.serverStatus = QLabel(_("Status: Not Connected"))
- self.statusbar.addPermanentWidget(self.serverStatus)
-
- #menu
- self.menus = {}
- self.menus["file"] = self.menubar.addMenu(_("File"))
- self.menus["connections"] = self.menubar.addMenu(_("Connections"))
-
- #menu actions
- self.mactions = {}
- self.mactions["exit"] = QAction(_("Exit"), self.menus["file"])
- self.mactions["manager"] = QAction(_("Connection manager"), self.menus["connections"])
-
- #add menu actions
- self.menus["file"].addAction(self.mactions["exit"])
- self.menus["connections"].addAction(self.mactions["manager"])
-
- #toolbar
- self.actions = {}
- self.init_toolbar()
-
- #tabs
- self.tabw = QTabWidget()
- self.tabs = {}
- self.tabs["queue"] = {"w":QWidget()}
- self.tabs["collector"] = {"w":QWidget()}
- self.tabs["settings"] = {"w":QWidget()}
- self.tabs["log"] = {"w":QWidget()}
- self.tabw.addTab(self.tabs["queue"]["w"], _("Queue"))
- self.tabw.addTab(self.tabs["collector"]["w"], _("Collector"))
- self.tabw.addTab(self.tabs["settings"]["w"], _("Settings"))
- self.tabw.addTab(self.tabs["log"]["w"], _("Log"))
- self.tabw.setTabEnabled(2, False)
-
- #init tabs
- self.init_tabs()
-
- #context menus
- self.init_context()
-
- #layout
- self.masterlayout.addWidget(self.tabw)
-
- #signals..
- self.connect(self.mactions["manager"], SIGNAL("triggered()"), self.slotShowConnector)
- self.connect(self.mactions["exit"], SIGNAL("triggered()"), self.close)
-
- self.connect(self.tabs["queue"]["view"], SIGNAL('customContextMenuRequested(const QPoint &)'), self.slotQueueContextMenu)
- self.connect(self.tabs["collector"]["package_view"], SIGNAL('customContextMenuRequested(const QPoint &)'), self.slotCollectorContextMenu)
- self.connect(self.tabs["collector"]["package_view"].itemDelegate(), SIGNAL("closeEditor(QWidget *, QAbstractItemDelegate::EndEditHint)"), self.slotCloseItemEditor)
-
- self.lastAddedID = None
-
- def init_toolbar(self):
- """
- create toolbar
- """
- self.toolbar = self.addToolBar(_("Main Toolbar"))
- self.toolbar.setObjectName("Main Toolbar")
- self.toolbar.setIconSize(QSize(40,40))
- self.actions["toggle_status"] = self.toolbar.addAction(_("Toggle Pause/Resume"))
- pricon = QIcon()
- pricon.addFile("icons/gui/toolbar_start.png", QSize(), QIcon.Normal, QIcon.Off)
- pricon.addFile("icons/gui/toolbar_pause.png", QSize(), QIcon.Normal, QIcon.On)
- self.actions["toggle_status"].setIcon(pricon)
- self.actions["toggle_status"].setCheckable(True)
- self.actions["status_stop"] = self.toolbar.addAction(QIcon("icons/gui/toolbar_stop.png"), _("Stop"))
- self.toolbar.addSeparator()
- self.actions["add"] = self.toolbar.addAction(QIcon("icons/gui/toolbar_add.png"), _("Add"))
- self.toolbar.addSeparator()
- self.actions["clipboard"] = self.toolbar.addAction(QIcon("icons/gui/clipboard.png"), _("Check Clipboard"))
- self.actions["clipboard"].setCheckable(True)
-
- self.connect(self.actions["toggle_status"], SIGNAL("toggled(bool)"), self.slotToggleStatus)
- self.connect(self.actions["clipboard"], SIGNAL("toggled(bool)"), self.slotToggleClipboard)
- self.connect(self.actions["status_stop"], SIGNAL("triggered()"), self.slotStatusStop)
- self.addMenu = QMenu()
- packageAction = self.addMenu.addAction(_("Package"))
- linkAction = self.addMenu.addAction(_("Links"))
- containerAction = self.addMenu.addAction(_("Container"))
- self.connect(self.actions["add"], SIGNAL("triggered()"), self.slotAdd)
- self.connect(packageAction, SIGNAL("triggered()"), self.slotShowAddPackage)
- self.connect(linkAction, SIGNAL("triggered()"), self.slotShowAddLinks)
- self.connect(containerAction, SIGNAL("triggered()"), self.slotShowAddContainer)
-
- def init_tabs(self):
- """
- create tabs
- """
- #queue
- self.tabs["queue"]["l"] = QGridLayout()
- self.tabs["queue"]["w"].setLayout(self.tabs["queue"]["l"])
- self.tabs["queue"]["view"] = QTreeWidget()
- self.tabs["queue"]["l"].addWidget(self.tabs["queue"]["view"])
-
- #collector
- groupPackage = QGroupBox(_("Packages"))
- groupPackage.setLayout(QVBoxLayout())
- toQueue = QPushButton(_("Push selected packages to queue"))
- self.tabs["collector"]["l"] = QGridLayout()
- self.tabs["collector"]["w"].setLayout(self.tabs["collector"]["l"])
- self.tabs["collector"]["package_view"] = QTreeWidget()
- groupPackage.layout().addWidget(self.tabs["collector"]["package_view"])
- groupPackage.layout().addWidget(toQueue)
- self.tabs["collector"]["l"].addWidget(groupPackage, 0, 0)
- self.connect(toQueue, SIGNAL("clicked()"), self.slotPushPackageToQueue)
- self.tabs["collector"]["package_view"].setContextMenuPolicy(Qt.CustomContextMenu)
- self.tabs["queue"]["view"].setContextMenuPolicy(Qt.CustomContextMenu)
-
- #settings
- self.tabs["settings"]["l"] = QGridLayout()
- self.tabs["settings"]["w"].setLayout(self.tabs["settings"]["l"])
-
- #log
- self.tabs["log"]["l"] = QGridLayout()
- self.tabs["log"]["w"].setLayout(self.tabs["log"]["l"])
- self.tabs["log"]["text"] = QTextEdit()
- self.tabs["log"]["text"].logOffset = 0
- self.tabs["log"]["text"].setReadOnly(True)
- self.connect(self.tabs["log"]["text"], SIGNAL("append(QString)"), self.tabs["log"]["text"].append)
- self.tabs["log"]["l"].addWidget(self.tabs["log"]["text"])
-
- def init_context(self):
- """
- create context menus
- """
- self.activeMenu = None
- #queue
- self.queueContext = QMenu()
- self.queueContext.buttons = {}
- self.queueContext.item = (None, None)
- self.queueContext.buttons["remove"] = QAction(QIcon("icons/gui/remove_small.png"), _("Remove"), self.queueContext)
- self.queueContext.buttons["restart"] = QAction(QIcon("icons/gui/refresh_small.png"), _("Restart"), self.queueContext)
- self.queueContext.buttons["pull"] = QAction(QIcon("icons/gui/pull_small.png"), _("Pull out"), self.queueContext)
- self.queueContext.addAction(self.queueContext.buttons["pull"])
- self.queueContext.addAction(self.queueContext.buttons["remove"])
- self.queueContext.addAction(self.queueContext.buttons["restart"])
- self.connect(self.queueContext.buttons["remove"], SIGNAL("triggered()"), self.slotRemoveDownload)
- self.connect(self.queueContext.buttons["restart"], SIGNAL("triggered()"), self.slotRestartDownload)
- self.connect(self.queueContext.buttons["pull"], SIGNAL("triggered()"), self.slotPullOutPackage)
-
- #collector
- self.collectorContext = QMenu()
- self.collectorContext.buttons = {}
- self.collectorContext.item = (None, None)
- self.collectorContext.buttons["remove"] = QAction(QIcon("icons/gui/remove_small.png"), _("Remove"), self.collectorContext)
- self.collectorContext.buttons["push"] = QAction(QIcon("icons/gui/push_small.png"), _("Push to queue"), self.collectorContext)
- self.collectorContext.buttons["edit"] = QAction(QIcon("icons/gui/edit_small.png"), _("Edit Name"), self.collectorContext)
- self.collectorContext.addAction(self.collectorContext.buttons["push"])
- self.collectorContext.addAction(self.collectorContext.buttons["edit"])
- self.collectorContext.addAction(self.collectorContext.buttons["remove"])
- self.connect(self.collectorContext.buttons["remove"], SIGNAL("triggered()"), self.slotRemoveDownload)
- self.connect(self.collectorContext.buttons["push"], SIGNAL("triggered()"), self.slotPushPackageToQueue)
- self.connect(self.collectorContext.buttons["edit"], SIGNAL("triggered()"), self.slotEditPackage)
-
- def slotToggleStatus(self, status):
- """
- pause/start toggle (toolbar)
- """
- self.emit(SIGNAL("setDownloadStatus"), status)
-
- def slotStatusStop(self):
- """
- stop button (toolbar)
- """
- self.emit(SIGNAL("stopAllDownloads"))
-
- def slotAdd(self):
- """
- add button (toolbar)
- show context menu (choice: links/package)
- """
- self.addMenu.exec_(QCursor.pos())
-
- def slotShowAddPackage(self):
- """
- action from add-menu
- show new-package dock
- """
- self.tabw.setCurrentIndex(1)
- self.newPackDock.show()
-
- def slotShowAddLinks(self):
- """
- action from add-menu
- show new-links dock
- """
- self.tabw.setCurrentIndex(1)
- self.newLinkDock.show()
-
- def slotShowConnector(self):
- """
- connectionmanager action triggered
- let main to the stuff
- """
- self.emit(SIGNAL("connector"))
-
- def slotAddLinks(self, links):
- """
- new links
- let main to the stuff
- """
- self.emit(SIGNAL("addLinks"), links)
-
- def slotAddPackage(self, name, ids):
- """
- new package
- let main to the stuff
- """
- self.emit(SIGNAL("addPackage"), name, ids)
-
- def slotShowAddContainer(self):
- """
- action from add-menu
- show file selector, emit upload
- """
- typeStr = ";;".join([
- _("All Container Types (%s)") % "*.dlc *.ccf *.rsdf *.txt",
- _("DLC (%s)") % "*.dlc",
- _("CCF (%s)") % "*.ccf",
- _("RSDF (%s)") % "*.rsdf",
- _("Text Files (%s)") % "*.txt"
- ])
- fileNames = QFileDialog.getOpenFileNames(self, _("Open container"), "", typeStr)
- for name in fileNames:
- self.emit(SIGNAL("addContainer"), str(name))
-
- def slotPushPackageToQueue(self):
- """
- push collector pack to queue
- get child ids
- let main to the rest
- """
- items = self.tabs["collector"]["package_view"].selectedItems()
- for item in items:
- try:
- item.getFileData()
- id = item.parent().getPackData()["id"]
- pack = item.parent()
- except:
- id = item.getPackData()["id"]
- pack = item
- if id == "fixed":
- ids = []
- for child in pack.getChildren():
- ids.append(child.getFileData()["id"])
- self.emit(SIGNAL("addPackage"), _("Single Links"), ids)
- id = self.lastAddedID
- self.emit(SIGNAL("pushPackageToQueue"), id)
-
- def saveWindow(self):
- """
- get window state/geometry
- pass data to main
- """
- state_raw = self.saveState(self.version)
- geo_raw = self.saveGeometry()
-
- state = str(state_raw.toBase64())
- geo = str(geo_raw.toBase64())
-
- self.emit(SIGNAL("saveMainWindow"), state, geo)
-
- def closeEvent(self, event):
- """
- somebody wants to close me!
- let me first save my state
- """
- self.saveWindow()
- event.accept()
-
- def restoreWindow(self, state, geo):
- """
- restore window state/geometry
- """
- state = QByteArray(state)
- geo = QByteArray(geo)
-
- state_raw = QByteArray.fromBase64(state)
- geo_raw = QByteArray.fromBase64(geo)
-
- self.restoreState(state_raw, self.version)
- self.restoreGeometry(geo_raw)
-
- def slotQueueContextMenu(self, pos):
- """
- custom context menu in queue view requested
- """
- globalPos = self.tabs["queue"]["view"].mapToGlobal(pos)
- i = self.tabs["queue"]["view"].itemAt(pos)
- if not i:
- return
- i.setSelected(True)
- self.queueContext.item = (i.data(0, Qt.UserRole).toPyObject(), i.parent() == None)
- menuPos = QCursor.pos()
- menuPos.setX(menuPos.x()+2)
- self.activeMenu = self.queueContext
- if hasattr(i, "getPackData"):
- self.queueContext.buttons["pull"].setVisible(True)
- else:
- self.queueContext.buttons["pull"].setVisible(False)
- self.queueContext.exec_(menuPos)
-
- def slotCollectorContextMenu(self, pos):
- """
- custom context menu in package collector view requested
- """
- globalPos = self.tabs["collector"]["package_view"].mapToGlobal(pos)
- i = self.tabs["collector"]["package_view"].itemAt(pos)
- if not i:
- return
- i.setSelected(True)
- self.collectorContext.item = (i.data(0, Qt.UserRole).toPyObject(), i.parent() == None)
- menuPos = QCursor.pos()
- menuPos.setX(menuPos.x()+2)
- self.activeMenu = self.collectorContext
- if hasattr(i, "getPackData"):
- self.collectorContext.buttons["edit"].setVisible(True)
- else:
- self.collectorContext.buttons["edit"].setVisible(False)
- self.collectorContext.exec_(menuPos)
-
- def slotLinkCollectorContextMenu(self, pos):
- """
- custom context menu in link collector view requested
- """
- pass
-
- def slotRestartDownload(self):
- """
- restart download action is triggered
- """
- id, isTopLevel = self.queueContext.item
- if not id == None:
- self.emit(SIGNAL("restartDownload"), id, isTopLevel)
-
- def slotRemoveDownload(self):
- """
- remove download action is triggered
- """
- id, isTopLevel = self.activeMenu.item
- if not id == None:
- self.emit(SIGNAL("removeDownload"), id, isTopLevel)
-
- def slotToggleClipboard(self, status):
- """
- check clipboard (toolbar)
- """
- self.emit(SIGNAL("setClipboardStatus"), status)
-
- def slotEditPackage(self):
- item = self.tabs["collector"]["package_view"].currentItem()
- pid = self.tabs["collector"]["package_view"].currentItem().data(0, Qt.UserRole).toPyObject()
- self.emit(SIGNAL("pauseItemUpdate"), pid, True)
- self.tabs["collector"]["package_view"].editItem(item, 0)
-
- def slotCloseItemEditor(self, editor, hint):
- pid = self.tabs["collector"]["package_view"].currentItem().data(0, Qt.UserRole).toPyObject()
- self.emit(SIGNAL("changePackageName"), pid, editor.text())
- self.emit(SIGNAL("pauseItemUpdate"), pid, False)
-
- def slotPullOutPackage(self):
- """
- pull package out of the queue
- """
- id, isTopLevel = self.activeMenu.item
- if not id == None:
- self.emit(SIGNAL("pullOutPackage"), id, isTopLevel)
-
diff --git a/module/gui/PWInputWindow.py b/module/gui/PWInputWindow.py
deleted file mode 100644
index e2b82e384..000000000
--- a/module/gui/PWInputWindow.py
+++ /dev/null
@@ -1,47 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 3 of the License,
- or (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- See the GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, see <http://www.gnu.org/licenses/>.
-
- @author: mkaay
-"""
-
-from PyQt4.QtCore import *
-from PyQt4.QtGui import *
-
-class PWInputWindow(QWidget):
- def __init__(self):
- QWidget.__init__(self)
- self.input = QLineEdit()
- self.input.setEchoMode(QLineEdit.Password)
- label = QLabel(_("Password:"))
- ok = QPushButton(_("OK"))
- cancel = QPushButton(_("Cancel"))
- grid = QGridLayout()
- grid.addWidget(label, 0, 0, 1, 2)
- grid.addWidget(self.input, 1, 0, 1, 2)
- grid.addWidget(cancel, 2, 0)
- grid.addWidget(ok, 2, 1)
- self.setLayout(grid)
-
- self.connect(ok, SIGNAL("clicked()"), self.slotOK)
- self.connect(cancel, SIGNAL("clicked()"), self.slotCancel)
- self.connect(self.input, SIGNAL("returnPressed()"), self.slotOK)
-
- def slotOK(self):
- self.hide()
- self.emit(SIGNAL("ok"), self.input.text())
-
- def slotCancel(self):
- self.hide()
- self.emit(SIGNAL("cancel"))
diff --git a/module/gui/PackageDock.py b/module/gui/PackageDock.py
deleted file mode 100644
index fec5466c2..000000000
--- a/module/gui/PackageDock.py
+++ /dev/null
@@ -1,76 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 3 of the License,
- or (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- See the GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, see <http://www.gnu.org/licenses/>.
-
- @author: mkaay
-"""
-
-from PyQt4.QtCore import *
-from PyQt4.QtGui import *
-
-class NewPackageDock(QDockWidget):
- def __init__(self):
- QDockWidget.__init__(self, _("New Package"))
- self.setObjectName("New Package Dock")
- self.widget = NewPackageWindow(self)
- self.setWidget(self.widget)
- self.setAllowedAreas(Qt.RightDockWidgetArea|Qt.LeftDockWidgetArea)
- self.hide()
-
- def slotDone(self):
- view = self.widget.view
- count = view.topLevelItemCount()
- ids = []
- for i in range(count):
- item = view.topLevelItem(i)
- if item:
- ids.append(item.data(0, Qt.UserRole).toInt()[0])
- self.emit(SIGNAL("done"), self.widget.nameInput.text(), ids)
- view.clear()
- self.hide()
-
-class NewPackageWindow(QWidget):
- def __init__(self, dock):
- QWidget.__init__(self)
- self.dock = dock
- self.setLayout(QGridLayout())
- layout = self.layout()
-
- nameLabel = QLabel(_("Name"))
- nameInput = QLineEdit()
-
- linksLabel = QLabel(_("Links in this Package"))
- linkView = QTreeWidget()
- linkView.setSelectionBehavior(QAbstractItemView.SelectRows)
- linkView.setSelectionMode(QAbstractItemView.ExtendedSelection)
- linkView.setColumnCount(1)
- linkView.setHeaderLabels(["Name"])
- linkView.setDragEnabled(True)
- linkView.setDragDropMode(QAbstractItemView.DragDrop)
- linkView.setDropIndicatorShown(True)
- linkView.setAcceptDrops(True)
- linkView.setDragDropOverwriteMode(True)
-
- self.view = linkView
- self.nameInput = nameInput
-
- save = QPushButton(_("Create"))
-
- layout.addWidget(nameLabel, 0, 0)
- layout.addWidget(nameInput, 0, 1)
- layout.addWidget(linksLabel, 1, 0, 1, 2)
- layout.addWidget(linkView, 2, 0, 1, 2)
- layout.addWidget(save, 3, 0, 1, 2)
-
- self.connect(save, SIGNAL("clicked()"), self.dock.slotDone)
diff --git a/module/gui/Queue.py b/module/gui/Queue.py
deleted file mode 100644
index 509f5a537..000000000
--- a/module/gui/Queue.py
+++ /dev/null
@@ -1,424 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 3 of the License,
- or (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- See the GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, see <http://www.gnu.org/licenses/>.
-
- @author: mkaay
-"""
-
-from PyQt4.QtCore import *
-from PyQt4.QtGui import *
-
-from time import sleep, time
-
-class Queue(QObject):
- def __init__(self, view, connector):
- QObject.__init__(self)
- self.view = view
- self.connector = connector
- self.statusMap = {
- "finished": 0,
- "queued": 1,
- "checking": 2,
- "waiting": 3,
- "reconnected": 4,
- "starting": 5,
- "failed": 6,
- "aborted": 7,
- "decrypting": 8,
- "downloading": 9
- }
- self.statusMapReverse = dict((v,k) for k, v in self.statusMap.iteritems())
- self.interval = 1
- self.wait_dict = {}
- self.rootItem = self.view.invisibleRootItem()
- self.mutex = QMutex()
- self.updater = self.QueueUpdater(self.interval)
- self.connect(self.updater, SIGNAL("update()"), self.update)
-
- class QueueUpdater(QThread):
- def __init__(self, interval):
- QThread.__init__(self)
- self.interval = interval
- self.running = True
-
- def run(self):
- while self.running:
- self.emit(SIGNAL("update()"))
- self.sleep(self.interval)
-
- def start(self):
- self.updater.start()
-
- def wait(self):
- self.updater.wait()
-
- def stop(self):
- self.updater.running = False
-
- def update(self):
- locker = QMutexLocker(self.mutex)
- downloading_raw = self.connector.getDownloadQueue()
- downloading = {}
- for d in downloading_raw:
- did = d["id"]
- del d["id"]
- del d["name"]
- del d["status"]
- downloading[did] = d
- for pack in ItemIterator(self.rootItem):
- for child in pack.getChildren():
- info = child.getFileData()
- try:
- info["downloading"] = downloading[info["id"]]
- except:
- info["downloading"] = None
- child.setFileData(info)
- pack.addPackChild(info["id"], child)
- self.addPack(pack.getPackData()["id"], pack)
-
- def fullReload(self):
- self.clearAll()
- packs = self.connector.getPackageQueue()
- for data in packs:
- pack = self.QueuePack(self)
- pack.setPackData(data["data"])
- files = data["children"]
- for fdata in files:
- child = self.QueueFile(self, pack)
- if not fdata["status_type"]:
- fdata["status_type"] = "queued"
- child.setFileData(fdata)
- pack.addPackChild(fdata["id"], child)
- self.addPack(data["data"]["id"], pack)
-
- def addEvent(self, event):
- locker = QMutexLocker(self.mutex)
- if event[0] == "reload":
- self.fullReload()
- elif event[0] == "remove":
- self.removeEvent(event)
- elif event[0] == "insert":
- self.insertEvent(event)
- elif event[0] == "update":
- self.updateEvent(event)
-
- def removeEvent(self, event):
- if event[2] == "file":
- for pack in ItemIterator(self.rootItem):
- for k, child in enumerate(pack.getChildren()):
- if child.getFileData()["id"] == event[3]:
- pack.removeChild(child)
- break
- else:
- for k, pack in enumerate(ItemIterator(self.rootItem)):
- if pack.getPackData()["id"] == event[3]:
- pack.clearAll()
- self.rootItem.removeChild(pack)
- break
-
- def insertEvent(self, event):
- if event[2] == "file":
- info = self.connector.getLinkInfo(event[3])
- for pack in ItemIterator(self.rootItem):
- if pack.getPackData()["id"] == info["package"]:
- child = self.QueueFile(self, pack)
- child.setFileData(info)
- pack.addPackChild(info["id"], child)
- break
- else:
- data = self.connector.getPackageInfo(event[3])
- pack = self.QueuePack(self)
- pack.setPackData(data)
- self.addPack(data["id"], pack)
- files = self.connector.getPackageFiles(data["id"])
- for fid in files:
- info = self.connector.getLinkInfo(fid)
- child = self.QueueFile(self, pack)
- if not info["status_type"]:
- info["status_type"] = "queued"
- child.setFileData(info)
- pack.addPackChild(fid, child)
- self.addPack(data["id"], pack)
-
- def updateEvent(self, event):
- if event[2] == "file":
- info = self.connector.getLinkInfo(event[3])
- if not info:
- return
- for pack in ItemIterator(self.rootItem):
- if pack.getPackData()["id"] == info["package"]:
- child = pack.getChild(event[3])
- if not info["status_type"]:
- info["status_type"] = "queued"
- child.setFileData(info)
- pack.addPackChild(info["id"], child)
- else:
- data = self.connector.getPackageInfo(event[3])
- pack = self.getPack(event[3])
- pack.setPackData(data)
- files = self.connector.getPackageFiles(data["id"])
- for fid in files:
- info = self.connector.getLinkInfo(fid)
- child = pack.getChild(fid)
- if not child:
- child = self.QueueFile(self, pack)
- if not info["status_type"]:
- info["status_type"] = "queued"
- child.setFileData(info)
- pack.addPackChild(fid, child)
- self.addPack(data["id"], pack)
-
- def addPack(self, pid, newPack):
- pos = None
- try:
- for pack in QueueIterator(self.rootItem):
- if pack.getPackData()["id"] == pid:
- pos = self.rootItem.indexOfChild(pack)
- break
- if pos == None:
- raise Exception()
- item = self.rootItem.child(pos)
- item.setPackData(newPack.getPackData())
- except:
- self.rootItem.addChild(newPack)
- item = newPack
- item.setData(0, Qt.DisplayRole, QVariant(item.getPackData()["package_name"]))
- status = -1
- speed = self.getSpeed(item)
- plugins = []
- for child in item.getChildren():
- data = child.getFileData()
- if self.statusMap.has_key(data["status_type"]) and self.statusMap[data["status_type"]] > status:
- status = self.statusMap[data["status_type"]]
- if not data["plugin"] in plugins:
- plugins.append(data["plugin"])
- if status >= 0:
- if speed == None or self.statusMapReverse[status] == "starting" or self.statusMapReverse[status] == "decrypting":
- statustxt = self.statusMapReverse[status]
- else:
- statustxt = "%s (%s KB/s)" % (self.statusMapReverse[status], speed)
- item.setData(2, Qt.DisplayRole, QVariant(statustxt))
- item.setData(1, Qt.DisplayRole, QVariant(", ".join(plugins)))
- item.setData(0, Qt.UserRole, QVariant(pid))
- item.setData(3, Qt.UserRole, QVariant(item))
-
- def getPack(self, pid):
- for k, pack in enumerate(ItemIterator(self.rootItem)):
- if pack.getPackData()["id"] == pid:
- return pack
- return None
-
- def clearAll(self):
- for pack in ItemIterator(self.rootItem):
- pack.clearAll()
- self.rootItem.removeChild(pack)
-
- def getWaitingProgress(self, q):
- locker = QMutexLocker(self.mutex)
- if isinstance(q, self.QueueFile):
- data = q.getFileData()
- if data["status_type"] == "waiting" and data["downloading"]:
- until = float(data["downloading"]["wait_until"])
- try:
- since, until_old = self.wait_dict[data["id"]]
- if not until == until_old:
- raise Exception
- except:
- since = time()
- self.wait_dict[data["id"]] = since, until
- since = float(since)
- max_wait = float(until-since)
- rest = int(until-time())
- res = 100/max_wait
- perc = rest*res
- return perc, rest
- return None
-
- def getProgress(self, q):
- locker = QMutexLocker(self.mutex)
- if isinstance(q, self.QueueFile):
- data = q.getFileData()
- if data["downloading"]:
- return int(data["downloading"]["percent"])
- if data["status_type"] == "finished" or \
- data["status_type"] == "failed" or \
- data["status_type"] == "aborted":
- return 100
- elif isinstance(q, self.QueuePack):
- children = q.getChildren()
- count = len(children)
- perc_sum = 0
- for child in children:
- val = 0
- data = child.getFileData()
- if data["downloading"]:
- val = int(data["downloading"]["percent"])
- elif data["status_type"] == "finished" or \
- data["status_type"] == "failed" or \
- data["status_type"] == "aborted":
- val = 100
- perc_sum += val
- if count == 0:
- return 0
- return perc_sum/count
- return 0
-
- def getSpeed(self, q):
- if isinstance(q, self.QueueFile):
- data = q.getFileData()
- if data["downloading"]:
- return int(data["downloading"]["speed"])
- elif isinstance(q, self.QueuePack):
- children = q.getChildren()
- count = len(children)
- speed_sum = 0
- all_waiting = True
- running = False
- for child in children:
- val = 0
- data = child.getFileData()
- if data["downloading"]:
- if not data["status_type"] == "waiting":
- all_waiting = False
- val = int(data["downloading"]["speed"])
- running = True
- speed_sum += val
- if count == 0 or not running or all_waiting:
- return None
- return speed_sum
- return None
-
- class QueuePack(QTreeWidgetItem):
- def __init__(self, queue):
- QTreeWidgetItem.__init__(self)
- self.queue = queue
- self._data = {}
-
- def addPackChild(self, cid, newChild):
- pos = None
- try:
- for child in ItemIterator(self):
- if child.getData()["id"] == cid:
- pos = self.indexOfChild(child)
- break
- if pos == None:
- raise Exception()
- item = self.child(pos)
- item.setFileData(newChild.getFileData())
- except:
- self.addChild(newChild)
- item = newChild
- speed = self.queue.getSpeed(item)
- if speed == None or item.getFileData()["status_type"] == "starting" or item.getFileData()["status_type"] == "decrypting":
- status = item.getFileData()["status_type"]
- else:
- status = "%s (%s KB/s)" % (item.getFileData()["status_type"], speed)
- item.setData(0, Qt.DisplayRole, QVariant(item.getFileData()["filename"]))
- item.setData(2, Qt.DisplayRole, QVariant(status))
- item.setData(1, Qt.DisplayRole, QVariant(item.getFileData()["plugin"]))
- item.setData(0, Qt.UserRole, QVariant(cid))
- item.setData(3, Qt.UserRole, QVariant(item))
-
- def setPackData(self, data):
- self._data = data
-
- def getPackData(self):
- return self._data
-
- def getChildren(self):
- ret = []
- for item in ItemIterator(self):
- ret.append(item)
- return ret
-
- def getChild(self, cid):
- for item in ItemIterator(self):
- if item.getFileData()["id"] == cid:
- return item
- return None
-
- def clearAll(self):
- for c in ItemIterator(self):
- self.removeChild(c)
-
- class QueueFile(QTreeWidgetItem):
- def __init__(self, queue, pack):
- QTreeWidgetItem.__init__(self)
- self.queue = queue
- self.pack = pack
- self._data = {}
- self.wait_since = None
-
- def getFileData(self):
- return self._data
-
- def setFileData(self, data):
- self._data = data
-
- def getPack(self):
- return self.pack
-
-class QueueProgressBarDelegate(QItemDelegate):
- def __init__(self, parent, queue):
- QItemDelegate.__init__(self, parent)
- self.queue = queue
-
- def paint(self, painter, option, index):
- if index.column() == 3:
- qe = index.data(Qt.UserRole).toPyObject()
- w = self.queue.getWaitingProgress(qe)
- wait = None
- if w:
- progress = w[0]
- wait = w[1]
- else:
- progress = self.queue.getProgress(qe)
- opts = QStyleOptionProgressBarV2()
- opts.maximum = 100
- opts.minimum = 0
- opts.progress = progress
- opts.rect = option.rect
- opts.rect.setRight(option.rect.right()-1)
- opts.rect.setHeight(option.rect.height()-1)
- opts.textVisible = True
- opts.textAlignment = Qt.AlignCenter
- if not wait == None:
- opts.text = QString("waiting %d seconds" % (wait,))
- else:
- opts.text = QString.number(opts.progress) + "%"
- QApplication.style().drawControl(QStyle.CE_ProgressBar, opts, painter)
- return
- QItemDelegate.paint(self, painter, option, index)
-
-class ItemIterator():
- def __init__(self, item):
- self.item = item
- self.current = -1
-
- def __iadd__(self, val):
- self.current += val
-
- def value(self):
- return self.item.child(self.current)
-
- def next(self):
- self.__iadd__(1)
- value = self.value()
- if value:
- return self.value()
- else:
- raise StopIteration
-
- def __iter__(self):
- return self
diff --git a/module/gui/XMLParser.py b/module/gui/XMLParser.py
deleted file mode 100644
index 5e3b7bf65..000000000
--- a/module/gui/XMLParser.py
+++ /dev/null
@@ -1,71 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 3 of the License,
- or (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- See the GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, see <http://www.gnu.org/licenses/>.
-
- @author: mkaay
-"""
-from __future__ import with_statement
-
-from PyQt4.QtCore import *
-from PyQt4.QtGui import *
-from PyQt4.QtXml import *
-
-import os
-
-class XMLParser():
- def __init__(self, data, dfile=""):
- self.mutex = QMutex()
- self.mutex.lock()
- self.xml = QDomDocument()
- self.file = data
- self.dfile = dfile
- self.mutex.unlock()
- self.loadData()
- self.root = self.xml.documentElement()
-
- def loadData(self):
- self.mutex.lock()
- f = self.file
- if not os.path.exists(f):
- f = self.dfile
- with open(f, 'r') as fh:
- content = fh.read()
- self.xml.setContent(content)
- self.mutex.unlock()
-
- def saveData(self):
- self.mutex.lock()
- content = self.xml.toString()
- with open(self.file, 'w') as fh:
- fh.write(content)
- self.mutex.unlock()
- return content
-
- def parseNode(self, node, ret_type="list"):
- if ret_type == "dict":
- childNodes = {}
- else:
- childNodes = []
- child = node.firstChild()
- while True:
- n = child.toElement()
- if n.isNull():
- break
- else:
- if ret_type == "dict":
- childNodes[str(n.tagName())] = n
- else:
- childNodes.append(n)
- child = child.nextSibling()
- return childNodes
diff --git a/module/gui/__init__.py b/module/gui/__init__.py
deleted file mode 100644
index 8d1c8b69c..000000000
--- a/module/gui/__init__.py
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/module/gui/connector.py b/module/gui/connector.py
deleted file mode 100644
index fba133cc5..000000000
--- a/module/gui/connector.py
+++ /dev/null
@@ -1,454 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 3 of the License,
- or (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- See the GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, see <http://www.gnu.org/licenses/>.
-
- @author: mkaay
-"""
-
-SERVER_VERSION = "0.3.2"
-
-from time import sleep
-from uuid import uuid4 as uuid
-
-from PyQt4.QtCore import *
-from PyQt4.QtGui import *
-
-from xmlrpclib import ServerProxy
-
-class connector(QThread):
- def __init__(self):
- """
- init thread
- """
- QThread.__init__(self)
- self.mutex = QMutex()
- self.running = True
- self.proxy = None
- self.addr = None
- self.connectionID = None
- self.errorQueue = []
- self.connect(self, SIGNAL("proxy_error"), self._proxyError)
-
- def setAddr(self, addr):
- """
- set new address
- """
- self.mutex.lock()
- self.addr = addr
- self.mutex.unlock()
-
- def run(self):
- """
- start thread
- (called from thread.start())
- """
- self.canConnect()
- while self.running:
- sleep(1)
- self.getError()
-
- def canConnect(self):
- return self.connectProxy(self.addr)
-
- def stop(self):
- """
- stop thread
- """
- self.running = False
-
- def connectProxy(self, addr):
- """
- connect to remote server
- """
- self.proxy = ServerProxy(addr, allow_none=True)
- try:
- server_version = self.proxy.get_server_version()
- self.connectionID = uuid().hex
- except:
- return False
- if not server_version == SERVER_VERSION:
- self.emit(SIGNAL("error_box"), "server is version %s client accepts version %s" % (server_version, SERVER_VERSION))
- return False
- return True
-
- def _proxyError(self, func, e):
- """
- formats proxy error msg
- """
- msg = "proxy error in '%s':\n%s" % (func, e)
- self.errorQueue.append(msg)
-
- def getError(self):
- self.mutex.lock()
- if len(self.errorQueue) > 0:
- err = self.errorQueue.pop()
- print err
- self.emit(SIGNAL("error_box"), err)
- self.mutex.unlock()
-
- def getLinkCollector(self):
- """
- grab links from collector and return the ids
- """
- self.mutex.lock()
- try:
- return self.proxy.get_collector_files()
- except Exception, e:
- self.emit(SIGNAL("proxy_error"), "getLinkCollector", e)
- finally:
- self.mutex.unlock()
-
- def getPackageCollector(self):
- """
- grab packages from collector and return the data
- """
- self.mutex.lock()
- try:
- return self.proxy.get_collector_packages()
- except Exception, e:
- self.emit(SIGNAL("proxy_error"), "getPackageCollector", e)
- finally:
- self.mutex.unlock()
-
- def getLinkInfo(self, id):
- """
- grab file info for the given id and return it
- """
- self.mutex.lock()
- try:
- info = self.proxy.get_file_info(id)
- info["downloading"] = None
- return info
- except Exception, e:
- #self.emit(SIGNAL("proxy_error"), "getLinkInfo", e)
- return None
- finally:
- self.mutex.unlock()
-
- def getPackageInfo(self, id):
- """
- grab package info for the given id and return it
- """
- self.mutex.lock()
- try:
- return self.proxy.get_package_data(id)
- except Exception, e:
- self.emit(SIGNAL("proxy_error"), "getPackageInfo", e)
- finally:
- self.mutex.unlock()
-
- def getPackageQueue(self):
- """
- grab queue return the data
- """
- self.mutex.lock()
- try:
- return self.proxy.get_full_queue()
- except Exception, e:
- self.emit(SIGNAL("proxy_error"), "getPackageQueue", e)
- finally:
- self.mutex.unlock()
-
- def getPackageFiles(self, id):
- """
- grab package files and return ids
- """
- self.mutex.lock()
- try:
- return self.proxy.get_package_files(id)
- except Exception, e:
- self.emit(SIGNAL("proxy_error"), "getPackageFiles", e)
- finally:
- self.mutex.unlock()
-
- def getDownloadQueue(self):
- """
- grab files that are currently downloading and return info
- """
- self.mutex.lock()
- try:
- return self.proxy.status_downloads()
- except Exception, e:
- self.emit(SIGNAL("proxy_error"), "getDownloadQueue", e)
- finally:
- self.mutex.unlock()
-
- def getServerStatus(self):
- """
- return server status
- """
- self.mutex.lock()
- try:
- return self.proxy.status_server()
- except Exception, e:
- self.emit(SIGNAL("proxy_error"), "getServerStatus", e)
- finally:
- self.mutex.unlock()
-
- def addURLs(self, links):
- """
- add links to collector
- """
- self.mutex.lock()
- try:
- self.proxy.add_urls(links)
- except Exception, e:
- self.emit(SIGNAL("proxy_error"), "addURLs", e)
- finally:
- self.mutex.unlock()
-
- def togglePause(self):
- """
- toogle pause
- """
- self.mutex.lock()
- try:
- return self.proxy.toggle_pause()
- except Exception, e:
- self.emit(SIGNAL("proxy_error"), "togglePause", e)
- finally:
- self.mutex.unlock()
-
- def setPause(self, pause):
- """
- set pause
- """
- self.mutex.lock()
- try:
- if pause:
- self.proxy.pause_server()
- else:
- self.proxy.unpause_server()
- except Exception, e:
- self.emit(SIGNAL("proxy_error"), "setPause", e)
- finally:
- self.mutex.unlock()
-
- def newPackage(self, name):
- """
- create a new package and return id
- """
- self.mutex.lock()
- try:
- return self.proxy.new_package(name)
- except Exception, e:
- self.emit(SIGNAL("proxy_error"), "newPackage", e)
- finally:
- self.mutex.unlock()
-
- def addFileToPackage(self, fileid, packid):
- """
- add a file from collector to package
- """
- self.mutex.lock()
- try:
- self.proxy.move_file_2_package(fileid, packid)
- except Exception, e:
- self.emit(SIGNAL("proxy_error"), "addFileToPackage", e)
- finally:
- self.mutex.unlock()
-
- def pushPackageToQueue(self, packid):
- """
- push a package to queue
- """
- self.mutex.lock()
- try:
- self.proxy.push_package_2_queue(packid)
- except Exception, e:
- self.emit(SIGNAL("proxy_error"), "pushPackageToQueue", e)
- finally:
- self.mutex.unlock()
-
- def restartPackage(self, packid):
- """
- restart a package
- """
- self.mutex.lock()
- try:
- self.proxy.restart_package(packid)
- except Exception, e:
- self.emit(SIGNAL("proxy_error"), "restartPackage", e)
- finally:
- self.mutex.unlock()
-
- def restartFile(self, fileid):
- """
- restart a file
- """
- self.mutex.lock()
- try:
- self.proxy.restart_file(fileid)
- except Exception, e:
- self.emit(SIGNAL("proxy_error"), "restartFile", e)
- finally:
- self.mutex.unlock()
-
- def removePackage(self, packid):
- """
- remove a package
- """
- self.mutex.lock()
- try:
- self.proxy.del_packages([packid,])
- except Exception, e:
- self.emit(SIGNAL("proxy_error"), "removePackage", e)
- finally:
- self.mutex.unlock()
-
- def removeFile(self, fileid):
- """
- remove a file
- """
- self.mutex.lock()
- try:
- self.proxy.del_links([fileid,])
- except Exception, e:
- self.emit(SIGNAL("proxy_error"), "removeFile", e)
- finally:
- self.mutex.unlock()
-
- def uploadContainer(self, filename, type, content):
- """
- upload a container
- """
- self.mutex.lock()
- try:
- self.proxy.upload_container(filename, type, content)
- except Exception, e:
- self.emit(SIGNAL("proxy_error"), "uploadContainer", e)
- finally:
- self.mutex.unlock()
-
- def getLog(self, offset):
- """
- get log
- """
- self.mutex.lock()
- try:
- return self.proxy.get_log(offset)
- except Exception, e:
- self.emit(SIGNAL("proxy_error"), "getLog", e)
- finally:
- self.mutex.unlock()
-
- def stopAllDownloads(self):
- """
- get log
- """
- self.mutex.lock()
- try:
- self.proxy.pause_server()
- self.proxy.stop_downloads()
- except Exception, e:
- self.emit(SIGNAL("proxy_error"), "stopAllDownloads", e)
- finally:
- self.mutex.unlock()
-
- def updateAvailable(self):
- """
- update available
- """
- self.mutex.lock()
- try:
- return self.proxy.update_available()
- except Exception, e:
- self.emit(SIGNAL("proxy_error"), "updateAvailable", e)
- finally:
- self.mutex.unlock()
-
- def setPackageName(self, pid, name):
- """
- set new package name
- """
- self.mutex.lock()
- try:
- return self.proxy.set_package_name(pid, name)
- except Exception, e:
- self.emit(SIGNAL("proxy_error"), "setPackageName", e)
- finally:
- self.mutex.unlock()
-
- def pullOutPackage(self, pid):
- """
- pull out package
- """
- self.mutex.lock()
- try:
- return self.proxy.pull_out_package(pid)
- except Exception, e:
- self.emit(SIGNAL("proxy_error"), "pullOutPackage", e)
- finally:
- self.mutex.unlock()
-
- def captchaWaiting(self):
- """
- is the a captcha waiting?
- """
- self.mutex.lock()
- try:
- return self.proxy.is_captcha_waiting()
- except Exception, e:
- self.emit(SIGNAL("proxy_error"), "captchaWaiting", e)
- finally:
- self.mutex.unlock()
-
- def getCaptcha(self):
- """
- get captcha
- """
- self.mutex.lock()
- try:
- return self.proxy.get_captcha_task()
- except Exception, e:
- self.emit(SIGNAL("proxy_error"), "getCaptcha", e)
- finally:
- self.mutex.unlock()
-
- def setCaptchaResult(self, cid, result):
- """
- get captcha
- """
- self.mutex.lock()
- try:
- return self.proxy.set_captcha_result(cid, result)
- except Exception, e:
- self.emit(SIGNAL("proxy_error"), "setCaptchaResult", e)
- finally:
- self.mutex.unlock()
-
- def getCaptchaStatus(self, cid):
- """
- get captcha status
- """
- self.mutex.lock()
- try:
- return self.proxy.get_task_status(cid)
- except Exception, e:
- self.emit(SIGNAL("proxy_error"), "getCaptchaStatus", e)
- finally:
- self.mutex.unlock()
-
- def getEvents(self):
- """
- get events
- """
- self.mutex.lock()
- try:
- return self.proxy.get_events(self.connectionID)
- except Exception, e:
- self.emit(SIGNAL("proxy_error"), "getEvents", e)
- finally:
- self.mutex.unlock()
-
diff --git a/pyLoadGui.py b/pyLoadGui.py
deleted file mode 100755
index 1ceb9f1a7..000000000
--- a/pyLoadGui.py
+++ /dev/null
@@ -1,630 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-
-"""
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 3 of the License,
- or (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- See the GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, see <http://www.gnu.org/licenses/>.
-
- @author: mkaay
- @version: v0.3.1
-"""
-
-import sys
-
-from time import sleep
-
-from PyQt4.QtCore import *
-from PyQt4.QtGui import *
-
-from uuid import uuid4 as uuid
-import re
-import gettext
-from os.path import basename, dirname, join
-
-from module.gui.ConnectionManager import *
-from module.gui.connector import *
-from module.gui.MainWindow import *
-from module.gui.PWInputWindow import *
-from module.gui.Queue import *
-from module.gui.Collector import *
-from module.gui.XMLParser import *
-
-class main(QObject):
- def __init__(self):
- """
- main setup
- """
- QObject.__init__(self)
- self.app = QApplication(sys.argv)
- self.init(True)
-
- def init(self, first=False):
- """
- set main things up
- """
- self.parser = XMLParser("module/config/gui.xml", "module/config/gui_default.xml")
- lang = self.parser.xml.elementsByTagName("language").item(0).toElement().text()
- if not lang:
- parser = XMLParser("module/config/gui_default.xml")
- lang = parser.xml.elementsByTagName("language").item(0).toElement().text()
-
- translation = gettext.translation("pyLoadGui", join(dirname(__file__), "locale"), languages=[str(lang)])
- translation.install(unicode=(True if sys.stdout.encoding.lower().startswith("utf") else False))
-
- self.mainWindow = MainWindow()
- self.pwWindow = PWInputWindow()
- self.connWindow = ConnectionManager()
- self.connector = connector()
- self.mainloop = self.Loop(self)
- self.connectSignals()
-
- self.checkClipboard = False
- default = self.refreshConnections()
- self.connData = None
- self.captchaProcessing = False
- if not first:
- self.connWindow.show()
- else:
- self.connWindow.edit.setData(default)
- data = self.connWindow.edit.getData()
- self.slotConnect(data)
-
- def startMain(self):
- """
- start all refresh threads and show main window
- """
- if not self.connector.canConnect():
- self.init()
- return
- self.connector.start()
- sleep(1)
- self.restoreMainWindow()
- self.mainWindow.show()
- self.initQueue()
- self.initPackageCollector()
- self.initLinkCollector()
- self.mainloop.start()
- self.clipboard = self.app.clipboard()
- self.connect(self.clipboard, SIGNAL('dataChanged()'), self.slotClipboardChange)
- self.mainWindow.actions["clipboard"].setChecked(self.checkClipboard)
-
- def stopMain(self):
- """
- stop all refresh threads and hide main window
- """
- self.disconnect(self.clipboard, SIGNAL('dataChanged()'), self.slotClipboardChange)
- self.mainloop.stop()
- self.connector.stop()
- self.mainWindow.saveWindow()
- self.mainWindow.hide()
- self.queue.stop()
- self.mainloop.wait()
- self.connector.wait()
- self.queue.wait()
-
- def connectSignals(self):
- """
- signal and slot stuff, yay!
- """
- self.connect(self.connector, SIGNAL("error_box"), self.slotErrorBox)
- self.connect(self.connWindow, SIGNAL("saveConnection"), self.slotSaveConnection)
- self.connect(self.connWindow, SIGNAL("removeConnection"), self.slotRemoveConnection)
- self.connect(self.connWindow, SIGNAL("connect"), self.slotConnect)
- self.connect(self.pwWindow, SIGNAL("ok"), self.slotPasswordTyped)
- self.connect(self.pwWindow, SIGNAL("cancel"), self.quit)
- self.connect(self.mainWindow, SIGNAL("connector"), self.slotShowConnector)
- self.connect(self.mainWindow, SIGNAL("addLinks"), self.slotAddLinks)
- self.connect(self.mainWindow, SIGNAL("addPackage"), self.slotAddPackage)
- self.connect(self.mainWindow, SIGNAL("setDownloadStatus"), self.slotSetDownloadStatus)
- self.connect(self.mainWindow, SIGNAL("saveMainWindow"), self.slotSaveMainWindow)
- self.connect(self.mainWindow, SIGNAL("pushPackageToQueue"), self.slotPushPackageToQueue)
- self.connect(self.mainWindow, SIGNAL("restartDownload"), self.slotRestartDownload)
- self.connect(self.mainWindow, SIGNAL("removeDownload"), self.slotRemoveDownload)
- self.connect(self.mainWindow, SIGNAL("addContainer"), self.slotAddContainer)
- self.connect(self.mainWindow, SIGNAL("stopAllDownloads"), self.slotStopAllDownloads)
- self.connect(self.mainWindow, SIGNAL("setClipboardStatus"), self.slotSetClipboardStatus)
- self.connect(self.mainWindow, SIGNAL("changePackageName"), self.slotChangePackageName)
- self.connect(self.mainWindow, SIGNAL("pullOutPackage"), self.slotPullOutPackage)
- self.connect(self.mainWindow.captchaDock, SIGNAL("done"), self.slotCaptchaDone)
-
- def slotShowConnector(self):
- """
- emitted from main window (menu)
- hide the main window and show connection manager
- (to switch to other core)
- """
- self.stopMain()
- self.init()
-
- def quit(self):
- """
- quit gui
- """
- self.app.quit()
-
- def loop(self):
- """
- start application loop
- """
- sys.exit(self.app.exec_())
-
- def slotErrorBox(self, msg):
- """
- display a nice error box
- """
- msgb = QMessageBox(QMessageBox.Warning, "Error", msg)
- msgb.exec_()
-
- def initPackageCollector(self):
- """
- init the package collector view
- * columns
- * selection
- * refresh thread
- * drag'n'drop
- """
- view = self.mainWindow.tabs["collector"]["package_view"]
- view.setColumnCount(1)
- view.setHeaderLabels(["Name"])
- view.setSelectionBehavior(QAbstractItemView.SelectRows)
- view.setSelectionMode(QAbstractItemView.ExtendedSelection)
- def dropEvent(klass, event):
- event.setDropAction(Qt.CopyAction)
- event.accept()
- view = event.source()
- if view == klass:
- items = view.selectedItems()
- for item in items:
- if not hasattr(item.parent(), "getPackData"):
- continue
- target = view.itemAt(event.pos())
- if not hasattr(target, "getPackData"):
- target = target.parent()
- klass.emit(SIGNAL("droppedToPack"), target.getPackData()["id"], item.getFileData()["id"])
- event.accept()
- return
- items = view.selectedItems()
- for item in items:
- row = view.indexOfTopLevelItem(item)
- view.takeTopLevelItem(row)
- def dragEvent(klass, event):
- view = event.source()
- #dragOkay = False
- #items = view.selectedItems()
- #for item in items:
- # if hasattr(item, "_data"):
- # if item._data["id"] == "fixed" or item.parent()._data["id"] == "fixed":
- # dragOkay = True
- # else:
- # dragOkay = True
- #if dragOkay:
- event.accept()
- #else:
- # event.ignore()
- view.dropEvent = dropEvent
- view.dragEnterEvent = dragEvent
- view.setDragEnabled(True)
- view.setDragDropMode(QAbstractItemView.DragDrop)
- view.setDropIndicatorShown(True)
- view.setDragDropOverwriteMode(True)
- self.connect(view, SIGNAL("droppedToPack"), self.slotAddFileToPackage)
- self.packageCollector = PackageCollector(view, self.connector)
-
- def initLinkCollector(self):
- """
- init the link collector
- * refresh thread
- """
- self.linkCollector = LinkCollector(self.mainWindow.tabs["collector"]["package_view"], self.packageCollector.linkCollector, self.connector)
-
- def initQueue(self):
- """
- init the queue view
- * columns
- * refresh thread
- * progressbar
- """
- view = self.mainWindow.tabs["queue"]["view"]
- view.setColumnCount(4)
- view.setHeaderLabels([_("Name"), _("Plugin"), _("Status"), _("Progress")])
- view.setColumnWidth(0, 300)
- view.setColumnWidth(1, 100)
- view.setColumnWidth(2, 200)
- view.setColumnWidth(3, 100)
- self.queue = Queue(view, self.connector)
- delegate = QueueProgressBarDelegate(view, self.queue)
- view.setItemDelegateForColumn(3, delegate)
- self.queue.start()
-
- def refreshServerStatus(self):
- """
- refresh server status and overall speed in the status bar
- """
- status = self.connector.getServerStatus()
- if status["pause"]:
- status["status"] = _("Paused")
- else:
- status["status"] = _("Running")
- status["speed"] = int(status["speed"])
- text = _("Status: %(status)s | Speed: %(speed)s kb/s") % status
- self.mainWindow.actions["toggle_status"].setChecked(not status["pause"])
- self.mainWindow.serverStatus.setText(text)
-
- def refreshLog(self):
- """
- update log window
- """
- offset = self.mainWindow.tabs["log"]["text"].logOffset
- lines = self.connector.getLog(offset)
- if not lines:
- return
- self.mainWindow.tabs["log"]["text"].logOffset += len(lines)
- for line in lines:
- self.mainWindow.tabs["log"]["text"].emit(SIGNAL("append(QString)"), line)
- cursor = self.mainWindow.tabs["log"]["text"].textCursor()
- cursor.movePosition(QTextCursor.End, QTextCursor.MoveAnchor)
- self.mainWindow.tabs["log"]["text"].setTextCursor(cursor)
-
- def updateAvailable(self):
- """
- update notification
- """
- status = self.connector.updateAvailable()
- if status:
- self.mainWindow.statusbar.emit(SIGNAL("showMsg"), _("Update Available"))
- else:
- self.mainWindow.statusbar.emit(SIGNAL("showMsg"), "")
-
- def getConnections(self):
- """
- parse all connections in the config file
- """
- connectionsNode = self.parser.xml.elementsByTagName("connections").item(0)
- if connectionsNode.isNull():
- raise Exception("null")
- connections = self.parser.parseNode(connectionsNode)
- ret = []
- for conn in connections:
- data = {}
- data["type"] = conn.attribute("type", "remote")
- data["default"] = conn.attribute("default", "False")
- data["id"] = conn.attribute("id", uuid().hex)
- if data["default"] == "True":
- data["default"] = True
- else:
- data["default"] = False
- subs = self.parser.parseNode(conn, "dict")
- if not subs.has_key("name"):
- data["name"] = _("Unnamed")
- else:
- data["name"] = subs["name"].text()
- if data["type"] == "remote":
- if not subs.has_key("server"):
- continue
- else:
- data["host"] = subs["server"].text()
- data["ssl"] = subs["server"].attribute("ssl", "False")
- if data["ssl"] == "True":
- data["ssl"] = True
- else:
- data["ssl"] = False
- data["user"] = subs["server"].attribute("user", "admin")
- data["port"] = int(subs["server"].attribute("port", "7227"))
- ret.append(data)
- return ret
-
- def slotSaveConnection(self, data):
- """
- save connection to config file
- """
- connectionsNode = self.parser.xml.elementsByTagName("connections").item(0)
- if connectionsNode.isNull():
- raise Exception("null")
- connections = self.parser.parseNode(connectionsNode)
- connNode = self.parser.xml.createElement("connection")
- connNode.setAttribute("default", str(data["default"]))
- connNode.setAttribute("type", data["type"])
- connNode.setAttribute("id", data["id"])
- nameNode = self.parser.xml.createElement("name")
- nameText = self.parser.xml.createTextNode(data["name"])
- nameNode.appendChild(nameText)
- connNode.appendChild(nameNode)
- if data["type"] == "remote":
- serverNode = self.parser.xml.createElement("server")
- serverNode.setAttribute("ssl", data["ssl"])
- serverNode.setAttribute("user", data["user"])
- serverNode.setAttribute("port", data["port"])
- hostText = self.parser.xml.createTextNode(data["host"])
- serverNode.appendChild(hostText)
- connNode.appendChild(serverNode)
- found = False
- for c in connections:
- cid = c.attribute("id", "None")
- if str(cid) == str(data["id"]):
- found = c
- break
- if found:
- connectionsNode.replaceChild(connNode, found)
- else:
- connectionsNode.appendChild(connNode)
- self.parser.saveData()
- self.refreshConnections()
-
- def slotRemoveConnection(self, data):
- """
- remove connection from config file
- """
- connectionsNode = self.parser.xml.elementsByTagName("connections").item(0)
- if connectionsNode.isNull():
- raise Exception("null")
- connections = self.parser.parseNode(connectionsNode)
- found = False
- for c in connections:
- cid = c.attribute("id", "None")
- if str(cid) == str(data["id"]):
- found = c
- break
- if found:
- connectionsNode.removeChild(found)
- self.parser.saveData()
- self.refreshConnections()
-
- def slotConnect(self, data):
- """
- slot: connect button in connectionmanager
- show password window if remote connection or start connecting
- """
- self.connWindow.hide()
- self.connData = data
- if data["type"] == "local":
- self.slotPasswordTyped("")
- else:
- self.pwWindow.show()
-
- def slotPasswordTyped(self, pw):
- """
- connect to a core
- if connection is local, parse the core config file for data
- set up connector, show main window
- """
- data = self.connData
- data["password"] = pw
- if not data["type"] == "remote":
- coreparser = XMLParser("module/config/core.xml", "module/config/core_default.xml")
- sections = coreparser.parseNode(coreparser.root, "dict")
- conf = coreparser.parseNode(sections["remote"], "dict")
- ssl = coreparser.parseNode(sections["ssl"], "dict")
- data["port"] = conf["port"].text()
- data["user"] = conf["username"].text()
- data["password"] = conf["password"].text()
- data["host"] = "127.0.0.1"
- if str(ssl["activated"].text()).lower() == "true":
- data["ssl"] = True
- else:
- data["ssl"] = False
- if data["ssl"]:
- data["ssl"] = "s"
- else:
- data["ssl"] = ""
- server_url = "http%(ssl)s://%(user)s:%(password)s@%(host)s:%(port)s/" % data
- self.connector.setAddr(str(server_url))
- self.startMain()
-
- def refreshConnections(self):
- """
- reload connetions and display them
- """
- self.parser.loadData()
- conns = self.getConnections()
- self.connWindow.emit(SIGNAL("setConnections"), conns)
- for conn in conns:
- if conn["default"]:
- return conn
- return None
-
- def slotAddLinks(self, links):
- """
- emitted from main window
- add urls to the collector
- """
- self.connector.addURLs(links)
-
- def slotSetDownloadStatus(self, status):
- """
- toolbar start/pause slot
- """
- self.connector.setPause(not status)
-
- def slotAddPackage(self, name, ids):
- """
- emitted from main window
- add package to the collector
- """
- packid = self.connector.newPackage(str(name))
- for fileid in ids:
- self.connector.addFileToPackage(fileid, packid)
- self.mainWindow.lastAddedID = packid
-
- def slotAddFileToPackage(self, pid, fid):
- """
- emitted from collector view after a drop action
- """
- self.connector.addFileToPackage(fid, pid)
-
- def slotAddContainer(self, path):
- """
- emitted from main window
- add container
- """
- filename = basename(path)
- type = "".join(filename.split(".")[-1])
- fh = open(path, "r")
- content = fh.read()
- fh.close()
- self.connector.uploadContainer(filename, type, content)
-
- def slotSaveMainWindow(self, state, geo):
- """
- save the window geometry and toolbar/dock position to config file
- """
- mainWindowNode = self.parser.xml.elementsByTagName("mainWindow").item(0)
- if mainWindowNode.isNull():
- mainWindowNode = self.parser.xml.createElement("mainWindow")
- self.parser.root.appendChild(mainWindowNode)
- stateNode = mainWindowNode.toElement().elementsByTagName("state").item(0)
- geoNode = mainWindowNode.toElement().elementsByTagName("geometry").item(0)
- newStateNode = self.parser.xml.createTextNode(state)
- newGeoNode = self.parser.xml.createTextNode(geo)
-
- stateNode.removeChild(stateNode.firstChild())
- geoNode.removeChild(geoNode.firstChild())
- stateNode.appendChild(newStateNode)
- geoNode.appendChild(newGeoNode)
-
- self.parser.saveData()
-
- def restoreMainWindow(self):
- """
- load and restore main window geometry and toolbar/dock position from config
- """
- mainWindowNode = self.parser.xml.elementsByTagName("mainWindow").item(0)
- if mainWindowNode.isNull():
- return
- nodes = self.parser.parseNode(mainWindowNode, "dict")
-
- state = str(nodes["state"].text())
- geo = str(nodes["geometry"].text())
-
- self.mainWindow.restoreWindow(state, geo)
- self.mainWindow.captchaDock.hide()
-
- def slotPushPackageToQueue(self, id):
- """
- emitted from main window
- push the collector package to queue
- """
- self.connector.pushPackageToQueue(id)
-
- def slotRestartDownload(self, id, isPack):
- """
- emitted from main window
- restart download
- """
- if isPack:
- self.connector.restartPackage(id)
- else:
- self.connector.restartFile(id)
-
- def slotRemoveDownload(self, id, isPack):
- """
- emitted from main window
- remove download
- """
- if isPack:
- self.connector.removePackage(id)
- else:
- self.connector.removeFile(id)
-
- def slotStopAllDownloads(self):
- """
- emitted from main window
- stop all running downloads
- """
- self.connector.stopAllDownloads()
-
- def slotClipboardChange(self):
- """
- called if clipboard changes
- """
- if self.checkClipboard:
- text = self.clipboard.text()
- pattern = re.compile(r"(http|https)://[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,5}(([0-9]{1,5})?/.*)?")
- matches = pattern.finditer(text)
- for match in matches:
- self.slotAddLinks([str(match.group(0))])
-
- def slotSetClipboardStatus(self, status):
- """
- set clipboard checking
- """
- self.checkClipboard = status
-
- def slotChangePackageName(self, pid, name):
- """
- package name edit finished
- """
- self.connector.setPackageName(pid, str(name))
-
- def slotPullOutPackage(self, pid, isPack):
- """
- pull package out of the queue
- """
- if isPack:
- self.connector.pullOutPackage(pid)
-
- def checkCaptcha(self):
- if self.connector.captchaWaiting() and self.mainWindow.captchaDock.isFree():
- cid, img, imgType = self.connector.getCaptcha()
- self.mainWindow.captchaDock.emit(SIGNAL("setTask"), cid, str(img), imgType)
- elif not self.mainWindow.captchaDock.isFree():
- status = self.connector.getCaptchaStatus(self.mainWindow.captchaDock.currentID)
- if not (status == "user" or status == "shared-user"):
- self.mainWindow.captchaDock.hide()
- self.mainWindow.captchaDock.processing = False
- self.mainWindow.captchaDock.currentID = None
-
- def slotCaptchaDone(self, cid, result):
- self.connector.setCaptchaResult(str(cid), str(result))
-
- def pullEvents(self):
- events = self.connector.getEvents()
- for event in events:
- if event[1] == "queue":
- self.queue.addEvent(event)
- elif event[1] == "packages":
- self.packageCollector.addEvent(event)
- elif event[1] == "collector":
- self.linkCollector.addEvent(event)
-
- class Loop(QThread):
- """
- main loop (not application loop)
- """
-
- def __init__(self, parent):
- QThread.__init__(self)
- self.parent = parent
- self.running = True
-
- def run(self):
- while self.running:
- sleep(1)
- self.update()
-
- def update(self):
- """
- methods to call
- """
- self.parent.refreshServerStatus()
- self.parent.refreshLog()
- self.parent.updateAvailable()
- self.parent.checkCaptcha()
- self.parent.pullEvents()
-
- def stop(self):
- self.running = False
-
-if __name__ == "__main__":
- app = main()
- app.loop()
-