Configure: Switch to list of solver.

mesh
Pierre-Antoine Rouby 2023-03-16 15:39:56 +01:00
parent 45959732d5
commit aced2d7a5e
9 changed files with 817 additions and 345 deletions

View File

@ -14,13 +14,13 @@ class Config(object):
self.set_default_value() self.set_default_value()
def set_default_value(self): def set_default_value(self):
# Mage # Solvers
self.mage_path = "" self.solvers = []
self.mage_extract_path = ""
self.mailleur_path = "" # Mailleur
self.mailleur = ""
# Const # Const
self.manning = False
self.segment = 1000 self.segment = 1000
self.max_listing = 500000 self.max_listing = 500000

View File

@ -14,23 +14,83 @@ class AbstractSolver(object):
def __init__(self, name): def __init__(self, name):
super(AbstractSolver, self).__init__() super(AbstractSolver, self).__init__()
self.name = name self.current_process = None
self.status = STATUS.STOPED self.status = STATUS.STOPED
def nb_proc(self): # Informations
""" self._type = ""
Return the number of processor used by solver (usefull for self.name = name
multiple solver run on same time). self.description = ""
"""
return 1
def status(self): self.path_input = ""
self.path_solver = ""
self.path_output = ""
self.cmd_input = ""
self.cmd_solver = ""
self.cmd_output = ""
def __str__(self):
return f"{self.name} : {self._type} : {self.description}"
# Getter
def get_status(self):
return self.status return self.status
def get_type(self):
return self._type
def __getitem__(self, name):
ret = None
if name == "name":
ret = self.name
elif name == "description":
ret = self.description
elif name == "type":
ret = self._type
return ret
# Setter
def set_status(self, status): def set_status(self, status):
self.status = status self.status = status
def run(self): def set_name(self, name):
self.name = name
def set_description(self, description):
self.description = description
def set_input(self, path, cmd):
self.path_input = path
self.cmd_input = cmd
def set_solver(self, path, cmd):
self.path_solver = path
self.cmd_solver = cmd
def set_output(self, path, cmd):
self.path_output = path
self.cmd_output = cmd
# Run
def run_input_data_fomater(self):
if self.cmd_input == "":
return True
return False
def run_solver(self):
if self.cmd_solver == "":
return True
return False
def run_output_data_fomater(self, ):
if self.cmd_output == "":
return True
return False return False
def kill(self): def kill(self):

View File

@ -0,0 +1,11 @@
# -*- coding: utf-8 -*-
from solver.ASolver import (
AbstractSolver, STATUS
)
class GenericSolver(AbstractSolver):
def __init__(self, name):
super(GenericSolver, self).__init__(name)
self._type = "generic"

View File

@ -7,7 +7,7 @@ from PyQt5.QtWidgets import (
QMdiArea, QMdiSubWindow, QDialog, QMdiArea, QMdiSubWindow, QDialog,
QPushButton, QLineEdit, QCheckBox, QPushButton, QLineEdit, QCheckBox,
QTimeEdit, QSpinBox, QTextEdit, QTimeEdit, QSpinBox, QTextEdit,
QRadioButton, QRadioButton, QComboBox, QFileDialog,
) )
from PyQt5.QtCore import ( from PyQt5.QtCore import (
QTime, QTime,
@ -182,3 +182,43 @@ class ASubWindow(QDialog):
The status of radio button The status of radio button
""" """
return self.find(QRadioButton, name).isChecked() return self.find(QRadioButton, name).isChecked()
def combobox_add_item(self, name:str, item:str):
"""Add item in combo box
Args:
name: The combo box component name
item: The item to add
Returns:
Nothing
"""
self.find(QComboBox, name).addItem(item)
def set_combobox_text(self, name:str, item:str):
"""Set current text of combo box
Args:
name: The combo box component name
item: The item to add
Returns:
Nothing
"""
self.find(QComboBox, name).setCurrentText(item)
# Custom dialog
def file_dialog(self, select_file=True, callback=lambda x: None):
dialog = QFileDialog(self)
if select_file:
mode = QFileDialog.FileMode.ExistingFile
else:
mode = QFileDialog.FileMode.Directory
dialog.setFileMode(mode)
if dialog.exec_():
file_names = dialog.selectedFiles()
callback(file_names)

View File

@ -0,0 +1,76 @@
# -*- coding: utf-8 -*-
from view.ASubWindow import ASubWindow
from solver.GenericSolver import GenericSolver
from PyQt5.QtWidgets import (
QPushButton,
)
class ConfigureAddSolverWindow(ASubWindow):
def __init__(self, data=None, title="Configuration : Add Solver", parent=None):
super(ConfigureAddSolverWindow, self).__init__(
name=title, ui="ConfigureAddSolverDialog", parent=parent
)
self.ui.setWindowTitle(title)
# Combo box item
self.combobox_add_item("comboBox_solver", "Generic")
self.combobox_add_item("comboBox_solver", "Mage")
self.combobox_add_item("comboBox_solver", "Rubarbe")
# Data to return
self.data = data
if not self.data is None:
self.copy_data()
self.connect()
def copy_data(self):
self.set_combobox_text("comboBox_solver", self.data.get_type())
self.set_line_edit_text("lineEdit_name", self.data.name)
self.set_line_edit_text("lineEdit_description", self.data.description)
self.set_line_edit_text("lineEdit_input", self.data.path_input)
self.set_line_edit_text("lineEdit_input_cmd", self.data.cmd_input)
self.set_line_edit_text("lineEdit_solver", self.data.path_solver)
self.set_line_edit_text("lineEdit_solver_cmd", self.data.cmd_solver)
self.set_line_edit_text("lineEdit_output", self.data.path_output)
self.set_line_edit_text("lineEdit_output_cmd", self.data.cmd_output)
def connect(self):
# File button
buttons = {
"pushButton_input": (lambda: self.file_dialog(
select_file = True,
callback = lambda f: self.set_line_edit_text("lineEdit_input", f[0])
)),
"pushButton_solver": (lambda: self.file_dialog(
select_file = True,
callback = lambda f: self.set_line_edit_text("lineEdit_solver", f[0])
)),
"pushButton_output": (lambda: self.file_dialog(
select_file = True,
callback = lambda f: self.set_line_edit_text("lineEdit_output", f[0])
)),
}
for button in buttons:
self.find(QPushButton, button).clicked.connect(buttons[button])
def accept(self):
self.data = GenericSolver(self.get_line_edit_text("lineEdit_name"))
self.data.set_description(self.get_line_edit_text("lineEdit_description"))
self.data.set_input(
self.get_line_edit_text("lineEdit_input"),
self.get_line_edit_text("lineEdit_input_cmd")
)
self.data.set_solver(
self.get_line_edit_text("lineEdit_solver"),
self.get_line_edit_text("lineEdit_solver_cmd")
)
self.data.set_output(
self.get_line_edit_text("lineEdit_output"),
self.get_line_edit_text("lineEdit_output_cmd")
)
self.done(True)

View File

@ -2,12 +2,62 @@
from config import Config from config import Config
from view.ASubWindow import ASubWindow from view.ASubWindow import ASubWindow
from PyQt5.QtWidgets import ( from view.ListedSubWindow import ListedSubWindow
QDialogButtonBox, QPushButton, QLineEdit, from view.ConfigureAddSolverWindow import ConfigureAddSolverWindow
QFileDialog,
from PyQt5.QtCore import (
Qt, QVariant, QAbstractTableModel,
) )
class ConfigureWindow(ASubWindow): from PyQt5.QtWidgets import (
QDialogButtonBox, QPushButton, QLineEdit,
QFileDialog, QTableView,
)
class SolverTableModel(QAbstractTableModel):
def __init__(self, headers=[], rows=[]):
super(QAbstractTableModel, self).__init__()
self.rows = rows
self.headers = headers
def rowCount(self, parent):
# How many rows are there?
return len(self.rows)
def columnCount(self, parent):
# How many columns?
return len(self.headers)
def data(self, index, role):
if role != Qt.ItemDataRole.DisplayRole:
return QVariant()
return self.rows[index.row()][self.headers[index.column()]]
def headerData(self, section, orientation, role):
if role == Qt.ItemDataRole.DisplayRole and orientation == Qt.Orientation.Horizontal:
return self.headers[section]
if role == Qt.ItemDataRole.DisplayRole and orientation == Qt.Orientation.Vertical:
return section
return QVariant()
def removeRow(self, index):
del self.rows[index.row()]
self.layoutChanged.emit()
def add_solver(self, solver):
self.rows.append(solver)
self.layoutChanged.emit()
def change_solver(self, solver, index):
self.rows[index.row()] = solver
self.layoutChanged.emit()
class ConfigureWindow(ASubWindow, ListedSubWindow):
def __init__(self, conf=None, title="Configure", parent=None): def __init__(self, conf=None, title="Configure", parent=None):
super(ConfigureWindow, self).__init__(name=title, ui="ConfigureDialog", parent=parent) super(ConfigureWindow, self).__init__(name=title, ui="ConfigureDialog", parent=parent)
self.ui.setWindowTitle(title) self.ui.setWindowTitle(title)
@ -17,13 +67,17 @@ class ConfigureWindow(ASubWindow):
else: else:
self.conf = conf self.conf = conf
# MAGE # Solver
self.set_line_edit_text("lineEdit_exec_mage", self.conf.mage_path) self.solver_table_model = SolverTableModel(
self.set_line_edit_text("lineEdit_exec_mage_extract", self.conf.mage_extract_path) headers = ["name", "type", "description"],
self.set_line_edit_text("lineEdit_exec_mailleur", self.conf.mailleur_path) rows = conf.solvers.copy()
)
self.find(QTableView, "tableView_solver").setModel(self.solver_table_model)
# Mailleur
self.set_line_edit_text("lineEdit_mailleur", self.conf.mailleur)
# Const # Const
self.set_check_box("checkBox_manning", self.conf.manning)
self.set_line_edit_text("lineEdit_segment", str(self.conf.segment)) self.set_line_edit_text("lineEdit_segment", str(self.conf.segment))
self.set_line_edit_text("lineEdit_max_listing", str(self.conf.max_listing)) self.set_line_edit_text("lineEdit_max_listing", str(self.conf.max_listing))
@ -38,23 +92,34 @@ class ConfigureWindow(ASubWindow):
def connect(self): def connect(self):
# File button # File button
buttons = { buttons = {
"pushButton_exec_mage": lambda: self.file_dialog("exec_mage", True), "pushButton_solver_add": self.add_solver,
"pushButton_exec_mage_extract": lambda: self.file_dialog("exec_mage_extract", True), "pushButton_solver_del": self.remove_solver,
"pushButton_exec_mailleur": lambda: self.file_dialog("exec_mailleur", True), "pushButton_solver_edit": self.edit_solver,
"pushButton_backup_path": lambda: self.file_dialog("backup_path", False), "pushButton_backup_path": lambda: self.file_dialog(
select_file = False,
callback = lambda f: self.set_line_edit_text(
"lineEdit_backup_path", f[0]
)
),
"pushButton_mailleur" : lambda: self.file_dialog(
select_file = True,
callback = lambda f: self.set_line_edit_text(
"lineEdit_mailleur", f[0]
)
),
} }
for button in buttons: for button in buttons:
self.find(QPushButton, button).clicked.connect(buttons[button]) self.find(QPushButton, button).clicked.connect(buttons[button])
def accept(self): def accept(self):
# MAGE # Solvers
self.conf.mage_path = self.get_line_edit_text("lineEdit_exec_mage") self.conf.solvers = self.solver_table_model.rows.copy()
self.conf.mage_extract_path = self.get_line_edit_text("lineEdit_exec_mage_extract")
self.conf.mailleur_path = self.get_line_edit_text("lineEdit_exec_mailleur") # Mailleur
self.conf.mailleur = self.get_line_edit_text("lineEdit_mailleur")
# Const # Const
self.conf.manning = self.get_check_box("checkBox_manning")
self.conf.segment = self.get_line_edit_text("lineEdit_segment") self.conf.segment = self.get_line_edit_text("lineEdit_segment")
self.conf.max_listing = self.get_line_edit_text("lineEdit_max_listing") self.conf.max_listing = self.get_line_edit_text("lineEdit_max_listing")
@ -74,23 +139,22 @@ class ConfigureWindow(ASubWindow):
self.conf.save() self.conf.save()
self.close() self.close()
def file_dialog(self, line_edit, select_file): def edit_solver(self):
dialog = QFileDialog(self) indices = self.find(QTableView, "tableView_solver").selectionModel().selectedRows()
for index in indices:
self.edit_solver = ConfigureAddSolverWindow(
data=self.solver_table_model.rows[index.row()],
parent=self
)
if self.edit_solver.exec_():
self.solver_table_model.change_solver(self.edit_solver.data, index)
if select_file: def add_solver(self):
mode = QFileDialog.FileMode.ExistingFile dialog_solver = ConfigureAddSolverWindow(parent=self)
else: if dialog_solver.exec_():
mode = QFileDialog.FileMode.Directory self.solver_table_model.add_solver(dialog_solver.data)
dialog.setFileMode(mode) def remove_solver(self):
indices = self.find(QTableView, "tableView_solver").selectionModel().selectedRows()
if dialog.exec_(): for index in sorted(indices):
file_names = dialog.selectedFiles() self.solver_table_model.removeRow(index)
if len(file_names) != 1:
print("pas bien")
else:
if line_edit != "":
self.set_line_edit_text(
f"lineEdit_{line_edit}",
file_names[0]
)

View File

@ -238,7 +238,7 @@ class ApplicationWindow(QMainWindow, ListedSubWindow):
dialog.setFileMode(QFileDialog.FileMode.ExistingFile) dialog.setFileMode(QFileDialog.FileMode.ExistingFile)
dialog.setDefaultSuffix(".pkl") dialog.setDefaultSuffix(".pkl")
#dialog.setFilter(dialog.filter() | QtCore.QDir.Hidden) #dialog.setFilter(dialog.filter() | QtCore.QDir.Hidden)
dialog.setNameFilters(['PKL (*.pkl)']) dialog.setNameFilters(['PamHyr (*.pkl)'])
if dialog.exec_(): if dialog.exec_():
file_name = dialog.selectedFiles() file_name = dialog.selectedFiles()

View File

@ -0,0 +1,214 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>Dialog</class>
<widget class="QDialog" name="Dialog">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>741</width>
<height>289</height>
</rect>
</property>
<property name="windowTitle">
<string>Dialog</string>
</property>
<widget class="QWidget" name="">
<property name="geometry">
<rect>
<x>10</x>
<y>10</y>
<width>721</width>
<height>271</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<layout class="QGridLayout" name="gridLayout_2">
<item row="1" column="0">
<widget class="QLabel" name="label_2">
<property name="text">
<string>Name</string>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QLabel" name="label">
<property name="text">
<string>Type</string>
</property>
</widget>
</item>
<item row="0" column="1" colspan="2">
<layout class="QHBoxLayout" name="horizontalLayout_5">
<item>
<widget class="QComboBox" name="comboBox_solver"/>
</item>
</layout>
</item>
<item row="2" column="0" colspan="2">
<widget class="QLabel" name="label_3">
<property name="text">
<string>Description</string>
</property>
</widget>
</item>
<item row="1" column="1" colspan="2">
<widget class="QLineEdit" name="lineEdit_name"/>
</item>
<item row="2" column="2">
<widget class="QLineEdit" name="lineEdit_description"/>
</item>
</layout>
</item>
<item>
<layout class="QGridLayout" name="gridLayout">
<item row="5" column="0">
<widget class="QLabel" name="label_5">
<property name="text">
<string>Solver</string>
</property>
</widget>
</item>
<item row="5" column="1">
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="QLineEdit" name="lineEdit_solver"/>
</item>
<item>
<widget class="QPushButton" name="pushButton_solver">
<property name="text">
<string/>
</property>
<property name="icon">
<iconset>
<normaloff>ressources/open.png</normaloff>ressources/open.png</iconset>
</property>
</widget>
</item>
</layout>
</item>
<item row="5" column="2">
<widget class="QLineEdit" name="lineEdit_solver_cmd"/>
</item>
<item row="0" column="1">
<widget class="QLabel" name="label_7">
<property name="text">
<string>Path</string>
</property>
</widget>
</item>
<item row="6" column="0">
<widget class="QLabel" name="label_6">
<property name="text">
<string>Output formater</string>
</property>
</widget>
</item>
<item row="6" column="2">
<widget class="QLineEdit" name="lineEdit_output_cmd"/>
</item>
<item row="0" column="2">
<widget class="QLabel" name="label_8">
<property name="text">
<string>Command line</string>
</property>
</widget>
</item>
<item row="2" column="2">
<widget class="QLineEdit" name="lineEdit_input_cmd"/>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_4">
<property name="text">
<string>Input formater</string>
</property>
</widget>
</item>
<item row="2" column="1">
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QLineEdit" name="lineEdit_input"/>
</item>
<item>
<widget class="QPushButton" name="pushButton_input">
<property name="text">
<string/>
</property>
<property name="icon">
<iconset>
<normaloff>ressources/open.png</normaloff>ressources/open.png</iconset>
</property>
</widget>
</item>
</layout>
</item>
<item row="6" column="1">
<layout class="QHBoxLayout" name="horizontalLayout_3">
<item>
<widget class="QLineEdit" name="lineEdit_output"/>
</item>
<item>
<widget class="QPushButton" name="pushButton_output">
<property name="text">
<string/>
</property>
<property name="icon">
<iconset>
<normaloff>ressources/open.png</normaloff>ressources/open.png</iconset>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</item>
<item>
<widget class="QDialogButtonBox" name="buttonBox">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
</property>
</widget>
</item>
</layout>
</widget>
</widget>
<resources/>
<connections>
<connection>
<sender>buttonBox</sender>
<signal>accepted()</signal>
<receiver>Dialog</receiver>
<slot>accept()</slot>
<hints>
<hint type="sourcelabel">
<x>248</x>
<y>254</y>
</hint>
<hint type="destinationlabel">
<x>157</x>
<y>274</y>
</hint>
</hints>
</connection>
<connection>
<sender>buttonBox</sender>
<signal>rejected()</signal>
<receiver>Dialog</receiver>
<slot>reject()</slot>
<hints>
<hint type="sourcelabel">
<x>316</x>
<y>260</y>
</hint>
<hint type="destinationlabel">
<x>286</x>
<y>274</y>
</hint>
</hints>
</connection>
</connections>
</ui>

View File

@ -6,8 +6,8 @@
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>770</width> <width>658</width>
<height>351</height> <height>381</height>
</rect> </rect>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
@ -17,306 +17,313 @@
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>10</x> <x>10</x>
<y>20</y> <y>10</y>
<width>751</width> <width>641</width>
<height>321</height> <height>361</height>
</rect> </rect>
</property> </property>
<layout class="QVBoxLayout" name="verticalLayout_8"> <layout class="QVBoxLayout" name="verticalLayout">
<item> <item>
<layout class="QGridLayout" name="gridLayout"> <widget class="QTabWidget" name="tabWidget">
<item row="0" column="0"> <property name="currentIndex">
<widget class="QGroupBox" name="groupBox"> <number>0</number>
<property name="enabled"> </property>
<bool>true</bool> <property name="documentMode">
<bool>false</bool>
</property>
<property name="tabsClosable">
<bool>false</bool>
</property>
<property name="movable">
<bool>false</bool>
</property>
<property name="tabBarAutoHide">
<bool>false</bool>
</property>
<widget class="QWidget" name="tab_solvers">
<attribute name="title">
<string>Solvers</string>
</attribute>
<widget class="QWidget" name="layoutWidget">
<property name="geometry">
<rect>
<x>10</x>
<y>10</y>
<width>611</width>
<height>271</height>
</rect>
</property> </property>
<property name="title"> <layout class="QVBoxLayout" name="verticalLayout_2">
<string>Executable</string> <item>
</property> <layout class="QHBoxLayout" name="horizontalLayout_2">
<widget class="QWidget" name="layoutWidget"> <item>
<property name="geometry"> <widget class="QPushButton" name="pushButton_solver_add">
<rect> <property name="text">
<x>10</x> <string/>
<y>20</y> </property>
<width>351</width> <property name="icon">
<height>111</height> <iconset>
</rect> <normaloff>ressources/gtk_add.png</normaloff>ressources/gtk_add.png</iconset>
</property> </property>
<layout class="QHBoxLayout" name="horizontalLayout_2"> </widget>
<item> </item>
<layout class="QVBoxLayout" name="verticalLayout_4"> <item>
<item> <widget class="QPushButton" name="pushButton_solver_del">
<widget class="QLabel" name="label_4"> <property name="text">
<property name="text"> <string/>
<string>MAGE</string> </property>
</property> <property name="icon">
</widget> <iconset>
</item> <normaloff>ressources/gtk-remove.png</normaloff>ressources/gtk-remove.png</iconset>
<item> </property>
<widget class="QLabel" name="label_5"> </widget>
<property name="text"> </item>
<string>MAGE_Extraire</string> <item>
</property> <widget class="QPushButton" name="pushButton_solver_edit">
</widget> <property name="text">
</item> <string/>
<item> </property>
<widget class="QLabel" name="label_6"> <property name="icon">
<property name="text"> <iconset>
<string>Mailleur</string> <normaloff>ressources/edit.png</normaloff>ressources/edit.png</iconset>
</property> </property>
</widget> </widget>
</item> </item>
</layout> <item>
</item> <spacer name="horizontalSpacer">
<item> <property name="orientation">
<layout class="QVBoxLayout" name="verticalLayout_5"> <enum>Qt::Horizontal</enum>
<item> </property>
<layout class="QHBoxLayout" name="horizontalLayout_6"> <property name="sizeHint" stdset="0">
<item> <size>
<widget class="QLineEdit" name="lineEdit_exec_mage"/> <width>40</width>
</item> <height>20</height>
<item> </size>
<widget class="QPushButton" name="pushButton_exec_mage"> </property>
<property name="text"> </spacer>
<string/> </item>
</property> </layout>
<property name="icon"> </item>
<iconset> <item>
<normaloff>ressources/open.png</normaloff>ressources/open.png</iconset> <widget class="QTableView" name="tableView_solver">
</property> <property name="minimumSize">
</widget> <size>
</item> <width>0</width>
</layout> <height>156</height>
</item> </size>
<item> </property>
<layout class="QHBoxLayout" name="horizontalLayout_8"> </widget>
<item> </item>
<widget class="QLineEdit" name="lineEdit_exec_mage_extract"/> </layout>
</item>
<item>
<widget class="QPushButton" name="pushButton_exec_mage_extract">
<property name="text">
<string/>
</property>
<property name="icon">
<iconset>
<normaloff>ressources/open.png</normaloff>ressources/open.png</iconset>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_7">
<item>
<widget class="QLineEdit" name="lineEdit_exec_mailleur"/>
</item>
<item>
<widget class="QPushButton" name="pushButton_exec_mailleur">
<property name="text">
<string/>
</property>
<property name="icon">
<iconset>
<normaloff>ressources/open.png</normaloff>ressources/open.png</iconset>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</item>
</layout>
</widget>
</widget> </widget>
</item> </widget>
<item row="0" column="1" rowspan="2"> <widget class="QWidget" name="tab_mailleur">
<widget class="QGroupBox" name="groupBox_3"> <attribute name="title">
<property name="title"> <string>Mailleur</string>
<string>BackUp</string> </attribute>
<widget class="QWidget" name="">
<property name="geometry">
<rect>
<x>10</x>
<y>10</y>
<width>621</width>
<height>30</height>
</rect>
</property> </property>
<widget class="QWidget" name=""> <layout class="QHBoxLayout" name="horizontalLayout_5">
<property name="geometry"> <item>
<rect> <widget class="QLabel" name="label">
<x>10</x> <property name="text">
<y>20</y> <string>Mailleur path</string>
<width>343</width> </property>
<height>125</height> </widget>
</rect> </item>
</property> <item>
<layout class="QHBoxLayout" name="horizontalLayout_4"> <widget class="QLineEdit" name="lineEdit_mailleur"/>
<item> </item>
<layout class="QVBoxLayout" name="verticalLayout_7"> <item>
<item> <widget class="QPushButton" name="pushButton_mailleur">
<widget class="QLabel" name="label_7"> <property name="text">
<property name="text"> <string/>
<string>Sauvegarde automatique</string> </property>
</property> <property name="icon">
</widget> <iconset>
</item> <normaloff>ressources/open.png</normaloff>ressources/open.png</iconset>
<item> </property>
<widget class="QLabel" name="label_8"> </widget>
<property name="text"> </item>
<string>Chemin</string> </layout>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_9">
<property name="text">
<string>Frequence</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_10">
<property name="text">
<string>Max. archives</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QVBoxLayout" name="verticalLayout_6">
<item>
<widget class="QCheckBox" name="checkBox_backup">
<property name="text">
<string>Activé</string>
</property>
<property name="tristate">
<bool>false</bool>
</property>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_3">
<item>
<widget class="QLineEdit" name="lineEdit_backup_path"/>
</item>
<item>
<widget class="QPushButton" name="pushButton_backup_path">
<property name="text">
<string/>
</property>
<property name="icon">
<iconset>
<normaloff>ressources/open.png</normaloff>ressources/open.png</iconset>
</property>
</widget>
</item>
</layout>
</item>
<item>
<widget class="QTimeEdit" name="timeEdit_backup_frequence">
<property name="minimumTime">
<time>
<hour>0</hour>
<minute>1</minute>
<second>0</second>
</time>
</property>
<property name="displayFormat">
<string>HH:mm:ss</string>
</property>
<property name="timeSpec">
<enum>Qt::LocalTime</enum>
</property>
<property name="time">
<time>
<hour>0</hour>
<minute>5</minute>
<second>0</second>
</time>
</property>
</widget>
</item>
<item>
<widget class="QSpinBox" name="spinBox_backup_max">
<property name="minimum">
<number>1</number>
</property>
<property name="value">
<number>10</number>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
</widget> </widget>
</item> </widget>
<item row="1" column="0"> <widget class="QWidget" name="tab_constant">
<widget class="QGroupBox" name="groupBox_2"> <attribute name="title">
<property name="title"> <string>Constants</string>
<string>Constante numérique</string> </attribute>
<widget class="QWidget" name="layoutWidget_2">
<property name="geometry">
<rect>
<x>10</x>
<y>10</y>
<width>621</width>
<height>93</height>
</rect>
</property> </property>
<widget class="QWidget" name=""> <layout class="QHBoxLayout" name="horizontalLayout">
<property name="geometry"> <item>
<rect> <layout class="QVBoxLayout" name="verticalLayout_3">
<x>10</x> <item>
<y>30</y> <widget class="QLabel" name="label_2">
<width>268</width> <property name="text">
<height>93</height> <string>Nombre de segment</string>
</rect> </property>
</property> </widget>
<layout class="QHBoxLayout" name="horizontalLayout"> </item>
<item> <item>
<layout class="QVBoxLayout" name="verticalLayout_3"> <widget class="QLabel" name="label_3">
<item> <property name="text">
<widget class="QLabel" name="label"> <string>Taille max. du listing</string>
<property name="text"> </property>
<string>Frottement</string> </widget>
</property> </item>
</widget> </layout>
</item> </item>
<item> <item>
<widget class="QLabel" name="label_2"> <layout class="QVBoxLayout" name="verticalLayout_4">
<property name="text"> <item>
<string>Nombre de segment</string> <widget class="QLineEdit" name="lineEdit_segment">
</property> <property name="text">
</widget> <string>1000</string>
</item> </property>
<item> </widget>
<widget class="QLabel" name="label_3"> </item>
<property name="text"> <item>
<string>Taille max. du listing</string> <widget class="QLineEdit" name="lineEdit_max_listing">
</property> <property name="text">
</widget> <string>500000</string>
</item> </property>
</layout> </widget>
</item> </item>
<item> </layout>
<layout class="QVBoxLayout" name="verticalLayout"> </item>
<item> </layout>
<widget class="QCheckBox" name="checkBox_manning">
<property name="text">
<string>Manning</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="lineEdit_segment">
<property name="text">
<string>1000</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="lineEdit_max_listing">
<property name="text">
<string>500000</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
</widget> </widget>
</item> </widget>
</layout> <widget class="QWidget" name="tab">
<attribute name="title">
<string>Backup</string>
</attribute>
<widget class="QWidget" name="layoutWidget_3">
<property name="geometry">
<rect>
<x>10</x>
<y>10</y>
<width>611</width>
<height>125</height>
</rect>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_4">
<item>
<layout class="QVBoxLayout" name="verticalLayout_7">
<item>
<widget class="QLabel" name="label_7">
<property name="text">
<string>Sauvegarde automatique</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_8">
<property name="text">
<string>Chemin</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_9">
<property name="text">
<string>Frequence</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_10">
<property name="text">
<string>Max. archives</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QVBoxLayout" name="verticalLayout_6">
<item>
<widget class="QCheckBox" name="checkBox_backup">
<property name="text">
<string>Activé</string>
</property>
<property name="tristate">
<bool>false</bool>
</property>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_3">
<item>
<widget class="QLineEdit" name="lineEdit_backup_path"/>
</item>
<item>
<widget class="QPushButton" name="pushButton_backup_path">
<property name="text">
<string/>
</property>
<property name="icon">
<iconset>
<normaloff>ressources/open.png</normaloff>ressources/open.png</iconset>
</property>
</widget>
</item>
</layout>
</item>
<item>
<widget class="QTimeEdit" name="timeEdit_backup_frequence">
<property name="minimumTime">
<time>
<hour>0</hour>
<minute>1</minute>
<second>0</second>
</time>
</property>
<property name="displayFormat">
<string>HH:mm:ss</string>
</property>
<property name="timeSpec">
<enum>Qt::LocalTime</enum>
</property>
<property name="time">
<time>
<hour>0</hour>
<minute>5</minute>
<second>0</second>
</time>
</property>
</widget>
</item>
<item>
<widget class="QSpinBox" name="spinBox_backup_max">
<property name="minimum">
<number>1</number>
</property>
<property name="value">
<number>10</number>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
</widget>
</widget>
</item> </item>
<item> <item>
<widget class="QDialogButtonBox" name="buttonBox"> <widget class="QDialogButtonBox" name="buttonBox">