vorta/src/vorta/views/source_tab.py

90 lines
3.8 KiB
Python
Raw Normal View History

from PyQt5 import uic
from ..models import SourceFileModel, BackupProfileMixin
from ..utils import get_asset, choose_file_dialog
from PyQt5.QtWidgets import QApplication, QMessageBox
import os
2018-10-27 17:24:34 +00:00
uifile = get_asset('UI/sourcetab.ui')
2018-10-27 17:24:34 +00:00
SourceUI, SourceBase = uic.loadUiType(uifile)
class SourceTab(SourceBase, SourceUI, BackupProfileMixin):
2018-10-27 17:24:34 +00:00
def __init__(self, parent=None):
super().__init__(parent)
self.setupUi(parent)
self.sourceAddFolder.clicked.connect(lambda: self.source_add(want_folder=True))
self.sourceAddFile.clicked.connect(lambda: self.source_add(want_folder=False))
2018-10-27 17:24:34 +00:00
self.sourceRemove.clicked.connect(self.source_remove)
self.paste.clicked.connect(self.paste_text)
self.excludePatternsField.textChanged.connect(self.save_exclude_patterns)
self.excludeIfPresentField.textChanged.connect(self.save_exclude_if_present)
self.populate_from_profile()
2018-10-27 17:24:34 +00:00
def populate_from_profile(self):
profile = self.profile()
self.excludePatternsField.textChanged.disconnect()
self.excludeIfPresentField.textChanged.disconnect()
self.sourceFilesWidget.clear()
self.excludePatternsField.clear()
self.excludeIfPresentField.clear()
for source in SourceFileModel.select().where(SourceFileModel.profile == profile):
self.sourceFilesWidget.addItem(source.dir)
2018-10-28 09:35:25 +00:00
self.excludePatternsField.appendPlainText(profile.exclude_patterns)
self.excludeIfPresentField.appendPlainText(profile.exclude_if_present)
2018-10-28 09:35:25 +00:00
self.excludePatternsField.textChanged.connect(self.save_exclude_patterns)
self.excludeIfPresentField.textChanged.connect(self.save_exclude_if_present)
def source_add(self, want_folder):
def receive():
dirs = dialog.selectedFiles()
for dir in dirs:
new_source, created = SourceFileModel.get_or_create(dir=dir, profile=self.profile())
if created:
self.sourceFilesWidget.addItem(dir)
new_source.save()
msg = self.tr("Choose directory to back up") if want_folder else self.tr("Choose file(s) to back up")
dialog = choose_file_dialog(self, msg, want_folder=want_folder)
dialog.open(receive)
2018-10-27 17:24:34 +00:00
def source_remove(self):
indexes = self.sourceFilesWidget.selectionModel().selectedIndexes()
# sort indexes, starting with lowest
indexes.sort()
# remove each selected entry, starting with highest index (otherways, higher indexes become invalid)
for index in reversed(indexes):
item = self.sourceFilesWidget.takeItem(index.row())
db_item = SourceFileModel.get(dir=item.text())
db_item.delete_instance()
2018-10-28 09:35:25 +00:00
def save_exclude_patterns(self):
profile = self.profile()
profile.exclude_patterns = self.excludePatternsField.toPlainText()
profile.save()
2018-10-28 09:35:25 +00:00
def save_exclude_if_present(self):
profile = self.profile()
profile.exclude_if_present = self.excludeIfPresentField.toPlainText()
profile.save()
def paste_text(self):
sources = QApplication.clipboard().text().splitlines()
invalidSources = ""
for source in sources:
if len(source) > 0: # Ignore empty newlines
if not os.path.exists(source):
invalidSources = invalidSources + "\n" + source
else:
new_source, created = SourceFileModel.get_or_create(dir=source, profile=self.profile())
if created:
self.sourceFilesWidget.addItem(source)
new_source.save()
if len(invalidSources) != 0: # Check if any invalid paths
msg = QMessageBox()
msg.setText("Some of your sources are invalid:" + invalidSources)
msg.exec()