Ejemplo n.º 1
0
class WindowController(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle(
            "Spongo - Projet M1 ISEN Yncréa Brest | Margaux DOUDET et Alexandre THOMAS"
        )
        self.setFixedSize(1280, 720)
        self.setWindowIcon(QIcon(":/img/spongo_icon.png"))

        self.stacked_widget = QStackedWidget()
        self.stacked_widget.setObjectName("page-container")
        self.setCentralWidget(self.stacked_widget)

        self._widgets = {
            "/menu": MenuController(),
            "/parameters": ParametersController(),
            "/analysis": AnalysisController(),
            "/history": HistoryController()
        }

        for w in self._widgets.values():
            self.stacked_widget.addWidget(w)
            w.changeWidget.connect(self._route)

        self._route("/menu")

        self.show()

    def closeEvent(self, event: QCloseEvent):
        ask_exit = self.stacked_widget.currentWidget().askExit()

        if ask_exit:
            event.accept()
        else:
            event.ignore()

    @Slot(str, object)
    def _route(self, route_name: str, parameters: object = None):
        next_widget = None

        for r, w in self._widgets.items():
            if r == route_name:
                next_widget = w
                break

        if next_widget is None:
            print("[WARNING] Unknown widget : %s" % str(next_widget))
            return

        current_widget = self.stacked_widget.currentWidget()
        current_widget.stop()

        self.stacked_widget.setCurrentWidget(next_widget)

        if route_name == "/analysis":
            next_widget.start(parameters[0], parameters[1])
        elif route_name == "/history":
            next_widget.start(parameters)
        else:
            next_widget.start()
Ejemplo n.º 2
0
class DatatypeSelector(QGroupBox):
    def __init__(self,
                 title: str,
                 datatype_to_widget,
                 parent: "QWidget" = None):
        super().__init__(title, parent)

        # Maps a datatype with its respective widget. The widget is optional
        self._datatype_to_widget = datatype_to_widget

        self._datatype_combobox = QComboBox()

        self._stacked_widgets = QStackedWidget()

        for (i, (name, datatype_factory)) in enumerate(
                DataTypeContainer.providers.items()):
            datatype_instance = datatype_factory()
            self._datatype_combobox.addItem(name, datatype_instance)

            if datatype_factory in self._datatype_to_widget:
                self._stacked_widgets.insertWidget(
                    i, self._datatype_to_widget[datatype_factory](
                        datatype_instance))

        self._main_layout = QVBoxLayout()
        self._main_layout.addWidget(self._datatype_combobox)
        self._main_layout.addWidget(self._stacked_widgets)

        self.setLayout(self._main_layout)

        self._datatype_combobox.currentIndexChanged[int].connect(
            self._change_active_widget)

    @property
    def selected_datatype(self):
        return self._datatype_combobox.currentData()

    def change_current_datatype(self, new_datatype_dict: dict):
        index = self._datatype_combobox.findText(new_datatype_dict["class"])

        if index != -1:
            self._datatype_combobox.setCurrentIndex(index)
            self._datatype_combobox.currentData().from_dict(new_datatype_dict)
            self._stacked_widgets.currentWidget().reload()

    def _change_active_widget(self, index):
        self._stacked_widgets.setCurrentIndex(index)

        # Hide the `stacked_widgets` when the current datatype doesn't needs to display
        # a widget
        if self._stacked_widgets.currentIndex() != index:
            self._stacked_widgets.setVisible(False)
        else:
            self._stacked_widgets.setVisible(True)

    def to_dict(self):
        return self.selected_datatype.to_dict()
Ejemplo n.º 3
0
class MainWindow(QMainWindow):
    def __init__(self):
        QMainWindow.__init__(self)
        self.setWindowTitle("Piano Manager")
        self.setFixedSize(800, 480)
        # self.showFullScreen()

        # Create Page Objects Here
        LogInPage = LogIn()
        SignUpPage = SignUp()
        InUsePage = InUse()

        # Connect pages to switch each others
        LogInPage.ui.ButtonRegister.clicked.connect(partial(
            self.switchPage, 1))
        LogInPage.ui.DButtonYes.clicked.connect(partial(self.switchPage, 2))
        SignUpPage.ui.buttonHome.clicked.connect(partial(self.switchPage, 0))
        InUsePage.ui.ButtonQuit.clicked.connect(partial(self.switchPage, 0))

        # Insert pages into QStackedWidget
        self.centralWidgets = QStackedWidget()
        self.centralWidgets.addWidget(LogInPage)  # index: 0
        self.centralWidgets.addWidget(SignUpPage)  # index: 1
        self.centralWidgets.addWidget(InUsePage)  # index: 2

        self.setCentralWidget(self.centralWidgets)

    def getCurWidget(self):
        return self.centralWidgets.currentWidget()

    def switchPage(self, idx):
        self.getCurWidget().clearPage()
        self.centralWidgets.setCurrentIndex(idx)
        self.getCurWidget().setPage()
Ejemplo n.º 4
0
class MainWindow(QWidget):
    widget_stack = None
    main_widget = None
    exercise_widget = None
    exercise_view_widget = None

    def __init__(self):
        QWidget.__init__(self)

        self.setup_window()

        self.widget_stack.setCurrentWidget(self.main_widget)

    def setup_window(self):
        self.widget_stack = QStackedWidget(self)
        self.main_widget = MainWidget()
        self.exercise_widget = ExerciseWidget()
        self.exercise_view_widget = ViewWidget()

        self.widget_stack.addWidget(self.main_widget)
        self.widget_stack.addWidget(self.exercise_widget)
        self.widget_stack.addWidget(self.exercise_view_widget)

        self.main_widget.start_exercise_file.connect(self.show_exercise_window)
        self.main_widget.open_exercise_file.connect(
            self.show_exercise_view_widget)
        self.exercise_view_widget.return_button.clicked.connect(
            self.show_main_widget)

    def resizeEvent(self, event):
        self.widget_stack.resize(self.size())

    @Slot()
    def show_main_widget(self):
        if self.widget_stack.currentWidget() == self.exercise_view_widget:
            self.exercise_view_widget.clear_widget()

        self.widget_stack.setCurrentWidget(self.main_widget)

    @Slot(str)
    def show_exercise_view_widget(self, file: str):
        self.widget_stack.setCurrentWidget(self.exercise_view_widget)
        self.exercise_view_widget.open_exercise_file(file)

    @Slot(str)
    def show_exercise_window(self, file: str):
        self.exercise_widget.set_file(file)
        self.exercise_widget.setup_exercise()
        self.exercise_widget.start()
        self.widget_stack.setCurrentWidget(self.exercise_widget)
Ejemplo n.º 5
0
class MainWindow(QMainWindow):
    def __init__(self):
        QMainWindow.__init__(self)
        self.setWindowTitle("음취헌 Piano Manager")
        self.setFixedSize(800, 480)

        page_in_use = InUse()
        page_log_in = LogIn()
        page_sign_up = SignUp()

        self.widget = QStackedWidget()
        self.widget.addWidget(page_log_in)  # index 0
        self.widget.addWidget(page_in_use)  # index 1
        self.widget.addWidget(page_sign_up)  # index 2
        self.setCentralWidget(self.widget)

        page_in_use.ui.button_quit.clicked.connect(partial(
            self.switch_page, 0))

        page_log_in.ui.button_register.clicked.connect(
            partial(self.switch_page, 2))
        page_log_in.ui.dialog_true.button_yes.clicked.connect(
            partial(self.switch_page, 1))

        page_sign_up.widget(4).ui.dialog_true.button_ok.clicked.connect(
            partial(self.switch_page, 0))
        for i in range(5):
            page_sign_up.widget(i).ui.button_home.clicked.connect(
                partial(self.switch_page, 0))

    def switch_page(self, idx):
        if idx == 1:
            self.widget.widget(1).set_page(self.widget.widget(0).get_contact())
            self.widget.currentWidget().clear_page()
            self.widget.setCurrentIndex(idx)
        else:
            self.widget.currentWidget().clear_page()
            self.widget.setCurrentIndex(idx)
            self.widget.currentWidget().set_page()
Ejemplo n.º 6
0
class ExifViewer(QMainWindow):
    WINDOW_SIZE = {'width': 900, 'height': 600}

    def __init__(self, parent=None):
        super().__init__(parent)
        self.qw_tree = None
        self.qw_stack = None
        self.tree_type_to_stack_idx = None
        self.exif_reader = None

        self.setWindowTitle("exif viewer")
        self.resize(self.WINDOW_SIZE['width'], self.WINDOW_SIZE['height'])

    def make_viewer(self, exif_reader):
        self.exif_reader = exif_reader
        ifds = self.exif_reader.get_exif()

        self.qw_tree = QTreeWidget(self)
        qt_util_init_tree(self.qw_tree, header_list=['ifd_name'])

        self.qw_stack = QStackedWidget(self)
        self.tree_type_to_stack_idx = {}
        for tree_item_type, (ifd_name, ifd) in enumerate(ifds.items()):
            # -----------------------
            # treeにifd nameを書き込んでroot_treeに登録する.
            # -----------------------
            qw_tree_item = QTreeWidgetItem(['{} ifd'.format(ifd_name), ''],
                                           type=tree_item_type)
            self.qw_tree.addTopLevelItem(qw_tree_item)

            # -----------------------
            # text_editにexif情報を書き込んでstacked_widgetに登録する.
            # -----------------------
            qw_text_edit = QTextEdit(self)
            qt_util_init_text_edit(qw_text_edit)
            qt_util_append_text_edit(qw_text_edit, None, head=True)
            for _, tag in ifd.items():
                qt_util_append_text_edit(qw_text_edit,
                                         tag,
                                         head=False,
                                         display_max_len=50)
            qt_util_reset_text_edit_cursor(qw_text_edit)

            idx = self.qw_stack.addWidget(qw_text_edit)
            self.tree_type_to_stack_idx[tree_item_type] = idx
        else:
            self.qw_tree.itemClicked.connect(self._tree_item_clicked)

        # -----------------------
        # widgetをlayoutに登録する.
        # -----------------------
        widgets = [self.qw_tree, self.qw_stack]
        self._make_layout(widgets)
        self._make_toolbar()

        self.show()  # widgetを表示する.

    def _make_toolbar(self):
        # action_to_text = QAction(QIcon(os.path.join('icon', 'text.png')), 'save', self)
        save_icon = QApplication.style().standardIcon(
            QStyle.SP_DialogSaveButton)
        save_action = QAction(icon=save_icon, text='save', parent=self)
        save_action.triggered.connect(self._save_text)

        exit_icon = QApplication.style().standardIcon(
            QStyle.SP_DialogCloseButton)
        exit_action = QAction(icon=exit_icon, text='exit', parent=self)
        exit_action.triggered.connect(self._quit)

        # ツールバー作成
        self.toolbar = self.addToolBar('tool bar')
        self.toolbar.setIconSize(QSize(35, 35))
        self.toolbar.setFixedHeight(35)
        self.toolbar.addAction(save_action)
        self.toolbar.addAction(exit_action)

    def _make_layout(self, widgets):
        qw_splitter = QSplitter(self)
        for widget in widgets:
            qw_splitter.addWidget(widget)
        qw_splitter.setSizes(
            [self.WINDOW_SIZE['width'] * 0.1, self.WINDOW_SIZE['width'] * 0.9])

        # layout = QHBoxLayout()
        # layout.addWidget(qw_splitter)
        # qw = QWidget()
        # qw.setLayout(layout)
        # self.setCentralWidget(qw)

        # self.setWindowFlags(Qt.WindowStaysOnTopHint) # 常に手前に表示する.

        # MainWindowのCentral領域にWidgetを設定
        self.setCentralWidget(qw_splitter)

    @Slot()
    def _tree_item_clicked(self, item, column):
        self.qw_stack.setCurrentIndex(self.tree_type_to_stack_idx[item.type()])
        current_text_edit = self.qw_stack.currentWidget()
        qt_util_reset_text_edit_cursor(current_text_edit)

    @Slot()
    def _save_text(self):
        filename = QFileDialog.getSaveFileName(self, '名前を付けて保存')
        out_path = filename[0]
        if out_path:
            self.exif_reader.save_log(out_path)

    @Slot()
    def _quit(self):
        qApp.quit()
Ejemplo n.º 7
0
# ---------------------------
# StackedWidgetに登録されたwidgetをwidgetのインスタンスで指定して表示する
# ---------------------------
import sys
from PySide2.QtWidgets import QApplication, QTextEdit, QStackedWidget

app = QApplication(sys.argv)

qw_text_edit_1 = QTextEdit()
qw_text_edit_1.append('1')

qw_text_edit_2 = QTextEdit()
qw_text_edit_2.append('2')

qw_stack = QStackedWidget()
qw_stack.addWidget(qw_text_edit_1)
qw_stack.addWidget(qw_text_edit_2)

# 表示するwidgetをwidgetのインスタンスで指定する
qw_stack.setCurrentWidget(qw_text_edit_2)
print(qw_stack.currentWidget())

qw_stack.show()

sys.exit(app.exec_())
Ejemplo n.º 8
0
class TTVSetsImporterWidget(QWidget):
    ttv_updated = Signal(TTVSets)

    def __init__(
        self,
        format_to_widget,
        parent: "QWidget" = None,
    ):
        super().__init__(parent)

        # Components
        self._ttv = None

        # Maps a  with its respective Widget
        self._format_to_widget = format_to_widget

        self._stacked_widgets = QStackedWidget()

        self._name_textbox = QLineEdit("Unnamed")

        self._formatter_selector = QComboBox()
        for (dataset_io_name,
             widget_factory) in self._format_to_widget.items():
            self._formatter_selector.addItem(
                dataset_io_name, getattr(DatasetIORegistry, dataset_io_name))
            self._stacked_widgets.addWidget(
                self._format_to_widget[dataset_io_name]())

        def horizontal_line():
            line = QFrame()
            line.setFrameShape(QFrame.HLine)
            line.setFrameShadow(QFrame.Sunken)
            line.setFixedHeight(2)
            line.setContentsMargins(0, 30, 0, 0)
            return line

        self._x_datatype_selector = DatatypeSelectorFactory(
            title="X (Input) Datatype")
        self._y_datatype_selector = DatatypeSelectorFactory(
            title="Y (Output) Datatype")

        datatypes_layout = QHBoxLayout()
        datatypes_layout.addWidget(self._x_datatype_selector)
        datatypes_layout.addWidget(self._y_datatype_selector)

        self._info_layout = QFormLayout()
        self._info_layout.addRow("Name", self._name_textbox)
        self._info_layout.addRow("Format", self._formatter_selector)

        self._main_layout = QVBoxLayout()
        self._main_layout.addLayout(self._info_layout)
        self._main_layout.addWidget(horizontal_line())
        self._main_layout.addWidget(self._stacked_widgets)
        self._main_layout.addWidget(horizontal_line())
        self._main_layout.addLayout(datatypes_layout)

        self._load_ttv_from_file_button = QPushButton("Load from file...")
        self._load_ttv_from_file_button.clicked.connect(
            self._load_ttv_from_file)

        self._update_ttv_button = QPushButton("Load TTV")
        self._update_ttv_button.clicked.connect(self._update_ttv)

        self._button_box = QDialogButtonBox()
        self._button_box.addButton(self._load_ttv_from_file_button,
                                   QDialogButtonBox.ResetRole)
        self._button_box.addButton(self._update_ttv_button,
                                   QDialogButtonBox.ApplyRole)

        self._main_layout.addWidget(self._button_box)

        self.setLayout(self._main_layout)

        self._formatter_selector.currentIndexChanged[int].connect(
            lambda i: self._stacked_widgets.setCurrentIndex(i))

    def get_ttv(self) -> "TTVSets":
        return self._ttv

    def _update_ttv(self):
        self._ttv = self._stacked_widgets.currentWidget().load_ttv(
            self._name_textbox.text(),
            self._x_datatype_selector.selected_datatype,
            self._y_datatype_selector.selected_datatype,
        )

        self.ttv_updated.emit(self._ttv)

    def _load_ttv_from_file(self):
        print("Loading from file...")

        description_file_path = QFileDialog.getOpenFileName(
            self, "Open TTV .json file")[0]

        if description_file_path:
            LOGGER.debug("Loading %s...", description_file_path)

            ttv_dir = os.path.dirname(description_file_path)
            ttv_description = TTVSetsIO.load_ttv_description(
                description_file_path)

            # Update name
            self._name_textbox.setText(ttv_description["name"])

            # Pick the new formatter
            formatter_idx = self._formatter_selector.findText(
                ttv_description["format"])

            if formatter_idx != -1:
                self._formatter_selector.setCurrentIndex(formatter_idx)
                self._selected_index_changed(formatter_idx)

            # TODO: Cover case when "train" is null
            self._x_datatype_selector.change_current_datatype(
                ttv_description["train"]["x_type"])
            self._y_datatype_selector.change_current_datatype(
                ttv_description["train"]["y_type"])

            self._stacked_widgets.currentWidget().update_widgets(
                ttv_dir, ttv_description)

            self._update_ttv()

        else:
            LOGGER.debug("Loading cancelled")

    def _selected_index_changed(self, index: int):
        self._stacked_widgets.setCurrentIndex(index)

    def sizeHint(self) -> "QSize":
        """Optimal size of the widget."""
        return QSize(450, 150)

    def __reduce__(self):
        return (
            TTVSetsImporterWidget,
            (self._ttv_sets_dialog, None),
        )
Ejemplo n.º 9
0
class Window(QMainWindow, WindowMenu, Plots):
    def __init__(self, parent=None):
        super(Window, self).__init__(parent)
        self.setWindowTitle("Leak Detection Evaluation Form")
        self.main_style_qss = "Eclippy.qss"
        self._main_widget = QWidget(self)
        self._main_layout = QVBoxLayout(self._main_widget)
        self._form_widget = QWidget(self)
        self._form_layout = QVBoxLayout(self._form_widget)
        self._database_widget = QWidget(self)
        self._database_layout = QVBoxLayout(self._database_widget)
        self._database_table_label = QLabel()
        self._database_table_label.setObjectName("dbtablelabel")
        self._database_table_label.setStyleSheet(
            'QLabel[objectName^="dbtablelabel"] {font-size: 12pt; font-weight: bold;}'
        )
        self._database_table_export_button = QPushButton("Export Table (CSV)")
        self._database_table_export_button.clicked.connect(
            self.exportDatabaseTable)
        database_table_export_row = QWidget()
        database_table_export_lay = QHBoxLayout(database_table_export_row)
        database_table_export_lay.setContentsMargins(0, 0, 0, 0)
        database_table_export_lay.addWidget(HorizontalFiller())
        database_table_export_lay.addWidget(self._database_table_export_button)

        self._database_layout.addWidget(self._database_table_label)
        self._database_table = DataTable(use_max_height=False)
        self._database_layout.addWidget(self._database_table)
        self._database_layout.addWidget(database_table_export_row)
        self._main_tabs = QTabWidget(self)
        self._main_layout.addWidget(self._main_tabs)
        self._main_tabs.addTab(self._form_widget, "Form")
        self._main_tabs.addTab(self._database_widget, "Database")

        snwa_logo = QPixmap("snwa_logo.png")
        self._logo = QLabel(self)
        self._logo.setPixmap(snwa_logo)
        search_row = QWidget(self)
        search_lay = QHBoxLayout(search_row)
        search_lay.addWidget(self._logo)

        self._search_toolbar = QToolBar(self)
        self._new_rec_button = QPushButton("Create New Record")
        self._new_rec_button.clicked.connect(self.createNewRecord)
        self._new_rec_button.setIcon(QIcon(QPixmap("plus.png")))

        self._search_toolbar.addWidget(self._new_rec_button)

        # Database
        DB_LOC = "LeakDetectionDatabase.db"
        self._database = SQLiteLib(DB_LOC)

        self.setTabs()
        Plots.__init__(self)

        self._data_table_label = QLabel("Client Table")
        self._data_table = DataTable(1, 1, self)

        search_bars = self.setSearchBars()
        search_bars.setContentsMargins(0, 0, 0, 0)
        search_lay.setContentsMargins(0, 0, 0, 0)
        search_lay.addWidget(search_bars)
        search_lay.addWidget(HorizontalFiller(self))
        self.readDataFromDatabase()

        self._ap_phase_widget = Client.AP_PHASE_ID.value
        self._address_widget = Client.ADDRESS.value
        self._main_tabs.currentChanged.connect(self.mainTabChange)
        self._ap_phase_widget.returnPressed.connect(
            self.checkApPhaseIDsInDatabase)

        # Layout -----------------------------------

        # Docks
        self._form_menu_dock = QDockWidget("Form Selections", self)
        self._form_menu_dock.setAllowedAreas(Qt.LeftDockWidgetArea
                                             | Qt.RightDockWidgetArea)
        self._form_menu_dock.setFeatures(self._form_menu_dock.features()
                                         & ~QDockWidget.DockWidgetClosable)
        self._form_menu_dock.setWidget(self._form_menu)
        self.addDockWidget(Qt.LeftDockWidgetArea, self._form_menu_dock)

        self._plot_menu_dock = QDockWidget(
            "Plotted Data (Double Click to Activate Chart)", self)
        self._plot_menu_dock.setAllowedAreas(Qt.LeftDockWidgetArea
                                             | Qt.RightDockWidgetArea)
        self._plot_menu_dock.setWidget(self._plot_menu)
        self.addDockWidget(Qt.RightDockWidgetArea, self._plot_menu_dock)

        WindowMenu.__init__(self)

        # Tabs
        form_area = QWidget(self)
        form_lay = QVBoxLayout(form_area)
        form_lay.addWidget(search_row)
        form_lay.addWidget(self._search_toolbar)
        form_lay.addWidget(BreakLine(self))
        form_lay.addWidget(self._tab_label)
        form_lay.addWidget(self._tabs)
        form_lay.addWidget(self._data_table_label)
        form_lay.addWidget(self._data_table)
        form_lay.setContentsMargins(0, 0, 0, 0)

        self._form_layout.addWidget(form_area)
        self.updateDataTable()

        self.setCentralWidget(self._main_widget)

    def closeEvent(self, event):
        for plot_name in self._plots:
            if self._plots[plot_name].isVisible():
                self._plots[plot_name].close()
        if self._search_window != None and self._search_window.isVisible():
            self._search_window.close()

    def setSearchBars(self):
        self._database.openDatabase()

        self._search_apPhase_combo = ExtendedComboBox(self)
        self._search_address_combo = ExtendedComboBox(self)
        search_data = getAddresses(
            self._database.getValuesFrom2Fields(Tables.CLIENT.name,
                                                Client.ADDRESS.name,
                                                Client.AP_PHASE_ID.name))
        self._search_ap_phase_ids = [value[1] for value in search_data]
        search_addresses = [value[0] for value in search_data]
        self._search_apPhase_combo.addItems(self._search_ap_phase_ids)
        self._search_address_combo.addItems(search_addresses)
        self._search_apPhase_combo.currentIndexChanged.connect(
            self.apPhaseComboChange)
        self._search_apPhase_combo.currentTextChanged.connect(
            self.newSearchApCombo)
        self._search_address_combo.currentIndexChanged.connect(
            self.addressComboChange)
        self._search_address_combo.currentTextChanged.connect(
            self.newSearchAdrCombo)
        self._new = False
        self._ap_phase_change = False
        self._address_change = False

        self._database.closeDatabase()

        bot_menu = QWidget(self)
        bot_menu_layout = QFormLayout(bot_menu)
        bot_menu.setStyleSheet("QLabel { font-weight: bold; }")
        bot_menu_layout.addRow("Search ApPhase ID:",
                               self._search_apPhase_combo)
        bot_menu_layout.addRow("Search Address:", self._search_address_combo)
        return bot_menu

    def setTabs(self):
        #self._tabs = QTabWidget(self)
        self._tab_label = QLabel("Client", self)
        self._tab_label.setObjectName("tablabel")
        self._tab_label.setStyleSheet(
            'QLabel[objectName^="tablabel"] {font-size: 12pt; font-weight: bold;}'
        )
        self._tabs = QStackedWidget(self)
        table_names = []
        for table in Tables:
            table_name = table.value.getTabName()
            table_names.append(table_name)
            table.value.setTab(self, self._database)
            table.value.setFormParent(self)

            #self._tabs.addTab(table.value, table_name)
            self._tabs.addWidget(table.value)
        self._form_menu = FormMenu(item_names=table_names, parent=self)
        self._form_menu.currentRowChanged.connect(self.selectMenuItemChange)

    def selectMenuItemChange(self, index):
        self._tabs.setCurrentIndex(index)
        text = self._form_menu.currentItem().text()
        self._tab_label.setText(text)
        self._data_table_label.setText(text + " Table")
        self.updateDataTable()
        self.updateDatabaseTable()

    def updateDataTable(self):
        self._data_table.setRowCount(0)
        self._data_table.setRowCount(1)
        data = self._tabs.currentWidget()

        fields = data.getFields()
        values = data.getValues()
        col_count = len(values)
        self._data_table.setColumnCount(col_count)
        for col, (field, value) in enumerate(zip(fields, values)):
            header = QTableWidgetItem(field)
            item = QTableWidgetItem(str(value))
            self._data_table.setHorizontalHeaderItem(col, header)
            self._data_table.setItem(0, col, item)

        #self._data_table.resizeColumnsToContents()
        self._data_table.verticalHeader().setStretchLastSection(True)

    def readDataFromDatabase(self):
        for table in Tables:
            table.value.readDataIntoForm(
                self._search_apPhase_combo.currentText())

    def setApPhaseChangeCheck(self, change):
        self._ap_phase_change = change
        for table in Tables:
            table.value._ap_phase_change = change

    def setAddressChangeCheck(self, change):
        self._address_change = change
        for table in Tables:
            table.value._address_change = change

    def setNewForTables(self, new_val):
        self._new = new_val
        for table in Tables:
            table.value._new = new_val

    def apPhaseComboChange(self):
        if not self._address_change:
            self.setApPhaseChangeCheck(True)
            self.clearForm()
            self.readDataFromDatabase()
            self._search_address_combo.setCurrentIndex(
                self._search_apPhase_combo.currentIndex())
            self.updateDataTable()
            self.setNewForTables(False)
            self.setApPhaseChangeCheck(False)

    def addressComboChange(self):
        if not self._ap_phase_change:
            self.setAddressChangeCheck(True)
            self.clearForm()
            self._search_apPhase_combo.setCurrentIndex(
                self._search_address_combo.currentIndex())
            self.readDataFromDatabase()
            self.updateDataTable()
            self.setNewForTables(False)
            self.setAddressChangeCheck(False)

    def newSearchApCombo(self):
        if not self._address_change and self._search_apPhase_combo.currentText(
        ) == "":
            self._ap_phase_change = True
            Tables.CLIENT.value._ap_phase_change = True
            self._search_address_combo.setCurrentText("")
            self._ap_phase_widget.setPlaceholderText("Enter new ApPhase ID...")
            self._address_widget.setPlaceholderText("Enter new Address...")
            Tables.CLIENT.value.clearValues()
            self.setNewForTables(True)
            Tables.CLIENT.value._ap_phase_change = False
            self._ap_phase_change = False

    def newSearchAdrCombo(self):
        if not self._ap_phase_change and self._search_address_combo.currentText(
        ) == "":
            self._address_change = True
            self._search_apPhase_combo.setCurrentText("")
            self._ap_phase_widget.setPlaceholderText("Enter new ApPhase ID...")
            self._address_widget.setPlaceholderText("Enter new Address...")
            self.setNewForTables(True)
            Tables.CLIENT.value.clearValues()
            self._address_change = False

    def updateSearchCombos(self):
        ap_phase_id = self._ap_phase_widget.text()
        search_data = getAddresses(
            self._database.getValuesFrom2Fields(Tables.CLIENT.name,
                                                Client.ADDRESS.name,
                                                Client.AP_PHASE_ID.name))
        search_ap_phase_ids = [value[1] for value in search_data]
        search_addresses = [value[0] for value in search_data]
        self._search_apPhase_combo.clear()
        self._search_address_combo.clear()
        self._search_apPhase_combo.addItems(search_ap_phase_ids)
        self._search_address_combo.addItems(search_addresses)
        index = self._search_apPhase_combo.findText(ap_phase_id)
        self._search_apPhase_combo.setCurrentIndex(index)

    def updateDatabaseTable(self):
        if self._main_tabs.currentIndex() == 1:
            table_name = self._tabs.currentWidget().getTableName()
            tab_name = self._tabs.currentWidget().getTabName()
            self._database_table_label.setText("Table: {tn} ({tbn})".format(
                tn=table_name, tbn=tab_name))
            self._database.openDatabase()
            data = self._database.readTable(table_name)
            self._database.closeDatabase()
            headers = getFieldNames(table_name)
            data_count = len(data)
            self._database_table.setRowCount(0)
            self._database_table.setColumnCount(len(headers))
            self._database_table.setRowCount(data_count)

            for col, header_text in enumerate(headers):
                header = QTableWidgetItem(header_text)
                self._database_table.setHorizontalHeaderItem(col, header)

            for row, data_row in enumerate(data):
                data_row = list(data_row)
                data_row.pop(0)
                for col, data_value in enumerate(data_row):
                    item = QTableWidgetItem(str(data_value))
                    self._database_table.setItem(row, col, item)

    def exportDatabaseTable(self):
        file_name = self.exportCSVDialog()
        temp_row = []
        headers = []
        for col in range(self._database_table.columnCount()):
            headers.append(
                self._database_table.horizontalHeaderItem(col).text())

        if file_name:
            with open(file_name, 'w', newline='') as n_f:
                writer = csv.writer(n_f)
                writer.writerow(headers)

                for row in range(self._database_table.rowCount()):
                    for col in range(self._database_table.columnCount()):
                        temp_row.append(
                            self._database_table.item(row, col).text())

                    writer.writerow(temp_row)
                    temp_row.clear()

    def exportCSVDialog(self):
        file_dialog = QFileDialog()
        file_name, ext = file_dialog.getSaveFileName(self, 'Export CSV File',
                                                     "", "CSV (*.csv)")
        return file_name

    def mainTabChange(self, index):
        if index == 1:
            self.updateDatabaseTable()

    def start(self):
        with open(self.main_style_qss, 'r') as main_qss:
            main_style = main_qss.read()
            app.setStyleSheet(main_style)
        self.showMaximized()
        sys.exit(app.exec_())