You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
BunnySync/job_list_widget.py

176 lines
7.4 KiB
Python

from PyQt5.QtWidgets import QWidget, QVBoxLayout, QHBoxLayout, QLabel, QLineEdit, QPushButton, QListWidget, QListWidgetItem
from PyQt5.QtGui import QColor
from PyQt5.QtCore import Qt
from job_item import JobItem
from database import add_job_to_db, get_jobs_from_db, update_job_in_db, delete_job_from_db
class JobListWidget(QWidget):
def __init__(self, parent=None):
super().__init__(parent)
self.setup_ui()
self.load_jobs_from_db()
def setup_ui(self):
layout = QVBoxLayout()
self.setLayout(layout)
job_info_widget = QWidget()
job_info_layout = QVBoxLayout()
job_info_widget.setLayout(job_info_layout)
name_layout = QHBoxLayout()
name_label = QLabel("Job Name:")
name_label.setFixedSize(150, 35)
name_label.setObjectName('jobset')
name_label.setAlignment(Qt.AlignCenter)
name_layout.addWidget(name_label)
self.job_name_edit = QLineEdit()
name_layout.addWidget(self.job_name_edit)
folder1_layout = QHBoxLayout()
folder1_label = QLabel("Folder 1:")
folder1_label.setFixedSize(150, 35)
folder1_label.setObjectName('jobset')
folder1_label.setAlignment(Qt.AlignCenter)
folder1_layout.addWidget(folder1_label)
self.folder1_edit = QLineEdit()
folder1_layout.addWidget(self.folder1_edit)
folder2_layout = QHBoxLayout()
folder2_label = QLabel("Folder 2:")
folder2_label.setFixedSize(150, 35)
folder2_label.setObjectName('jobset')
folder2_label.setAlignment(Qt.AlignCenter)
folder2_layout.addWidget(folder2_label)
self.folder2_edit = QLineEdit()
folder2_layout.addWidget(self.folder2_edit)
interval_layout = QHBoxLayout()
interval_label = QLabel("Interval:")
interval_label.setFixedSize(150, 35)
interval_label.setObjectName('jobset')
interval_label.setAlignment(Qt.AlignCenter)
interval_layout.addWidget(interval_label)
self.interval_edit = QLineEdit()
interval_layout.addWidget(self.interval_edit)
buttons_layout = QHBoxLayout()
self.new_button = QPushButton("New")
self.new_button.clicked.connect(self.new_job)
buttons_layout.addWidget(self.new_button)
self.add_apply_button = QPushButton("Add")
self.add_apply_button.clicked.connect(self.add_job)
buttons_layout.addWidget(self.add_apply_button)
self.apply_button = QPushButton("Apply")
self.apply_button.clicked.connect(self.apply_job)
buttons_layout.addWidget(self.apply_button)
job_info_layout.addLayout(name_layout)
job_info_layout.addLayout(folder1_layout)
job_info_layout.addLayout(folder2_layout)
job_info_layout.addLayout(interval_layout)
job_info_layout.addLayout(buttons_layout)
layout.addWidget(job_info_widget)
self.job_list = QListWidget()
self.job_list.itemClicked.connect(self.show_job_info)
layout.addWidget(self.job_list)
def new_job(self):
self.job_name_edit.clear()
self.folder1_edit.clear()
self.folder2_edit.clear()
self.interval_edit.clear()
self.window().add_log('Clicked \'New Job\' !', QColor('yellow'), QColor('green'))
def add_job(self):
name = self.job_name_edit.text()
folder1 = self.folder1_edit.text()
folder2 = self.folder2_edit.text()
interval = self.interval_edit.text()
if name and folder1 and folder2 and interval:
# Check if job name already exists
if name == 'jobs' or name == 'logs' or name == 'sqlite_sequence':
self.window().add_log(f"Job with name '{name}' can not create.", QColor('white'), QColor('red'))
return
if any(self.job_list.itemWidget(self.job_list.item(i)).name == name for i in range(self.job_list.count())):
self.window().add_log(f"Job with name '{name}' already exists.", QColor('white'), QColor('red'))
return
job_item = JobItem(name, folder1, folder2, int(interval))
list_item = QListWidgetItem(self.job_list)
list_item.setSizeHint(job_item.sizeHint())
self.job_list.addItem(list_item)
self.job_list.setItemWidget(list_item, job_item)
self.job_list.setCurrentItem(list_item)
job_item.delete_button.clicked.connect(lambda checked, item=list_item: self.delete_job(item))
add_job_to_db(name, folder1, folder2, int(interval))
self.window().add_log(f'Clicked \'Add Job\' - ({job_item.name}) !', QColor('yellow'), QColor('green'))
def delete_job(self, list_item):
job_item = self.job_list.itemWidget(list_item)
if job_item.thread.is_running:
job_item.thread.stop()
self.job_list.takeItem(self.job_list.row(list_item))
delete_job_from_db(job_item.name)
self.window().add_log(f'Clicked \'delete Job\' - ({job_item.name}) !', QColor('red'), QColor('green'))
def show_job_info(self, item):
job_item = self.job_list.itemWidget(item)
self.job_name_edit.setText(job_item.name)
self.folder1_edit.setText(job_item.folder1)
self.folder2_edit.setText(job_item.folder2)
self.interval_edit.setText(str(job_item.interval))
def apply_job(self):
self.selected_item = self.job_list.selectedItems()[0]
if self.selected_item:
job_item = self.job_list.itemWidget(self.selected_item)
old_name = job_item.name
new_name = self.job_name_edit.text()
folder1 = self.folder1_edit.text()
folder2 = self.folder2_edit.text()
interval = self.interval_edit.text()
if new_name and folder1 and folder2 and interval:
# Check if new job name already exists in other jobs
item_cnt = self.job_list.count()
if old_name != new_name and any(self.job_list.itemWidget(self.job_list.item(i)).name == new_name for i in range(item_cnt)):
self.window().add_log(f"Job with name '{old_name}' already exists.", QColor('white'), QColor('red'))
return
# Update the database
update_job_in_db(old_name, new_name, folder1, folder2, int(interval))
# Update the job item
# job_item.name = new_name
# job_item.folder1 = folder1
# job_item.folder2 = folder2
# job_item.interval = int(interval)
# job_item.name_label.setText(new_name)
job_item = JobItem(new_name, folder1, folder2, int(interval))
job_item.delete_button.clicked.connect(lambda checked, item=self.selected_item: self.delete_job(item))
self.job_list.setItemWidget(self.selected_item, job_item)
self.window().add_log(f'Clicked \'Apply Job\' - ({job_item.name}) !', QColor('yellow'), QColor('green'))
def load_jobs_from_db(self):
jobs = get_jobs_from_db()
for job in jobs:
job_item = JobItem(job['name'], job['folder1'], job['folder2'], job['interval'])
list_item = QListWidgetItem(self.job_list)
list_item.setSizeHint(job_item.sizeHint())
self.job_list.addItem(list_item)
self.job_list.setItemWidget(list_item, job_item)
job_item.delete_button.clicked.connect(lambda checked, item=list_item: self.delete_job(item))