1
0
mirror of https://github.com/borg-qt/borg-qt.git synced 2024-06-29 12:30:47 +02:00
borg-qt/borg_qt/main_window.py
2019-02-02 11:27:38 +01:00

124 lines
4.2 KiB
Python

import os
import sys
from PyQt5 import uic
from PyQt5.QtCore import QCoreApplication
from PyQt5.QtWidgets import QMainWindow, QFileSystemModel
from config import Config
from helper import BorgException, show_error, convert_size
import borg_interface as borg
class MainWindow(QMainWindow):
"""The main window of the application. It provides the various functions to
control BorgBackup."""
def __init__(self, *args, **kwargs):
super(MainWindow, self).__init__(*args, **kwargs)
QCoreApplication.setApplicationName("borg-qt")
# Load the UI file to get the dialogs layout.
dir_path = os.path.dirname(os.path.realpath(__file__))
ui_path = os.path.join(dir_path + '/static/UI/MainWindow.ui')
uic.loadUi(ui_path, self)
# Set the window title after the UI has been loaded. Otherwise it gets
# overwritten.
self.setWindowTitle("Borg-Qt")
# Create a Config object for storing the configuration.
self.config = Config()
# File tree
model = QFileSystemModel()
# model.setRootPath('/')
model.setRootPath(os.getenv('HOME'))
self.treeview_files.setModel(model)
self.treeview_files.expandAll()
self.treeview_files.setIndentation(20)
self.treeview_files.setColumnHidden(1, True)
self.treeview_files.setColumnHidden(2, True)
self.treeview_files.setColumnHidden(3, True)
# return the clicking on an item in the tree
self.treeview_files.clicked.connect(self.get_selected_path)
self.list_archive.setSortingEnabled(True)
# Connecting actions and buttons.
self.action_settings.triggered.connect(self.show_settings)
self.action_backup.triggered.connect(self.create_backup)
def start(self):
"""This method is intendet to be used only once at the application
start. It reads the configuration file and sets the required
environment variables."""
try:
self.config.read()
self.config._set_environment_variables()
self._update_archives()
self._update_repository_stats()
except BorgException as e:
show_error(e)
sys.exit(1)
def show_settings(self):
"""Display the settings dialog."""
self.config.set_form_values()
self.config.exec_()
def get_selected_path(self, signal):
"""returns the path of the item selected in the file tree."""
self.src_path = self.treeview_files.model().filePath(signal)
def _check_path(self):
message = ("Please select a file or directory "
"before creating a backup.")
if not hasattr(self, 'src_path'):
raise BorgException(message)
def create_backup(self):
"""Creates a backup of the selected item in the treeview."""
try:
self._check_path()
borg.backup([self.src_path], excludes=self.config.excludes,
prefix=self.config.prefix)
self.update_archives()
self.update_repository_stats()
except BorgException as e:
show_error(e)
def _update_archives(self):
"""Lists all the archive names in the UI."""
self.list_archive.clear()
archive_names = []
for archive in borg.get_archives():
archive_names.append(archive['name'])
self.list_archive.addItems(archive_names)
def update_archives(self):
"""Lists all the archive names in the UI."""
try:
self._update_archives()
except BorgException as e:
show_error(e)
def _update_repository_stats(self):
stats = borg.get_repository_stats()
self.label_repo_original_size.setText(
"Original Size: "
+ convert_size(stats['total_size']))
self.label_repo_compressed_size.setText(
"Compressed Size: "
+ convert_size(stats['total_csize']))
self.label_repo_deduplicated_size.setText(
"Deduplicated Size: "
+ convert_size(stats['unique_csize']))
def update_repository_stats(self):
try:
self._update_repository_stats()
except BorgException as e:
show_error(e)