def __init__(self, *args):
		# Invoke parent init
		QTableView.__init__(self, *args)
		
		# Get a reference to the window object
		self.win = get_app().window
		
		# Get Model data
		self.clip_properties_model = PropertiesModel(self)
		
		# Keep track of mouse press start position to determine when to start drag
		self.selected = []
		self.selected_item = None

		# Setup header columns
		self.setModel(self.clip_properties_model.model)
		self.setSelectionBehavior(QAbstractItemView.SelectRows)
		self.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
		self.setWordWrap(True)

		# Get table header
		horizontal_header = self.horizontalHeader()
		horizontal_header.setSectionResizeMode(QHeaderView.Stretch)
		vertical_header = self.verticalHeader()
		vertical_header.setVisible(False)
		
		# Refresh view
		self.clip_properties_model.update_model()
		
		# Resize columns
		self.resizeColumnToContents(0)
		self.resizeColumnToContents(1)

		# Connect filter signals
		get_app().window.txtPropertyFilter.textChanged.connect(self.filter_changed)
 def __init__(self):
     super().__init__()
     self.setWindowTitle('Phone Book.')
     self.name = QLineEdit()
     self.number = QLineEdit()
     entry = QFormLayout()
     entry.addRow(QLabel('Name'), self.name)
     entry.addRow(QLabel('Number'), self.number)
     buttons = QHBoxLayout()
     button = QPushButton('&Add')
     button.clicked.connect(self._addEntry)
     buttons.addWidget(button)
     button = QPushButton('&Update')
     button.clicked.connect(self._updateEntry)
     buttons.addWidget(button)
     button = QPushButton('&Delete')
     button.clicked.connect(self._deleteEntry)
     buttons.addWidget(button)
     dataDisplay = QTableView()
     dataDisplay.setModel(PhoneDataModel())
     layout = QVBoxLayout()
     layout.addLayout(entry)
     layout.addLayout(buttons)
     layout.addWidget(dataDisplay)
     self.setLayout(layout)
     self.show()
class UdpLogReceiver(QWidget):
    """
        Log events generated by python logging objects.
    """
    def __init__(self, parent=None):
        super().__init__(parent)
        self._model = LogRecordModel()
        filter_model = QSortFilterProxyModel()
        filter_model.setSourceModel(self._model)
        filter_model.setFilterKeyColumn(3)

        self.msg_filter = QLineEdit()
        self.log_view = QTableView()
        self.log_view.setModel(filter_model)
        header = self.log_view.horizontalHeader()
        #header.setSectionResizeMode(header.Stretch)
        header.setStretchLastSection(True)
        self.status_label = QLabel()

        # Connect signals:
        self.msg_filter.textChanged.connect(filter_model.setFilterFixedString)
        # Make nice layout:
        layout = QVBoxLayout(self)
        layout.addWidget(self.msg_filter)
        layout.addWidget(self.log_view)
        layout.addWidget(self.status_label)

        # Attach udp server:
        self._udpServer = UdpHandler(self._model)
        self._model.stats_changed.connect(self.status_label.setText)
Exemple #4
0
 def __init__(self, parent):
     super(Table, self).__init__()
     self.parent = parent
     
     tablemodel = TableModel(self.parent.dictpar[self.parent.code]['vphi'], self)
     tableview = QTableView()
     tableview.setModel(tablemodel)
Exemple #5
0
    def __init__(self, tableName, parent=None):
        super(TableEditor, self).__init__(parent)

        self.model = QSqlTableModel(self)
        self.model.setTable(tableName)
        self.model.setEditStrategy(QSqlTableModel.OnManualSubmit)
        self.model.select()

        self.model.setHeaderData(0, Qt.Horizontal, "ID")
        self.model.setHeaderData(1, Qt.Horizontal, "First name")
        self.model.setHeaderData(2, Qt.Horizontal, "Last name")

        view = QTableView()
        view.setModel(self.model)

        submitButton = QPushButton("Submit")
        submitButton.setDefault(True)
        revertButton = QPushButton("&Revert")
        quitButton = QPushButton("Quit")

        buttonBox = QDialogButtonBox(Qt.Vertical)
        buttonBox.addButton(submitButton, QDialogButtonBox.ActionRole)
        buttonBox.addButton(revertButton, QDialogButtonBox.ActionRole)
        buttonBox.addButton(quitButton, QDialogButtonBox.RejectRole)

        submitButton.clicked.connect(self.submit)
        revertButton.clicked.connect(self.model.revertAll)
        quitButton.clicked.connect(self.close)

        mainLayout = QHBoxLayout()
        mainLayout.addWidget(view)
        mainLayout.addWidget(buttonBox)
        self.setLayout(mainLayout)

        self.setWindowTitle("Cached Table")
Exemple #6
0
class TestWidget(QWidget):
    def __init__(self):
        QWidget.__init__(self)
        vbox = QVBoxLayout(self)
        self.view = QTableView()
        self.model = Model(self.view)
        self.view.setModel(self.model)
        vbox.addWidget(self.view)
Exemple #7
0
    def __init__(self, parent):
        super().__init__(parent)
        self.logger = logging.getLogger(__name__)
        self.config = Configuration()
        self.filenames = []
        self.data = ""

        # left part of frame
        header_left = [_("Relative Path"), _("Name"), _("Size"), _("Date Modified")]
        self.file_model = FileTableModel(self, header_left, [])

        self.file_view = QTableView()
        self.file_view.setModel(self.file_model)
        self.file_view.setSortingEnabled(True)
        self.file_view.setAlternatingRowColors(True)
        self.file_view.setShowGrid(False)

        # adjustments
        self.file_view.verticalHeader().setDefaultSectionSize(22)
        # self.file_view.horizontalHeader().setDefaultSectionSize(self.file_view.width()/len(header))
        # self.file_view.horizontalHeader().setStretchLastSection(True)
        self.file_view.setSelectionMode(QAbstractItemView.SingleSelection)
        self.file_view.setSelectionBehavior(QAbstractItemView.SelectRows)

        self.file_view.doubleClicked.connect(self.file_view_doubleclicked)
        # self.file_view.clicked.connect(self.file_view_clicked)
        self.file_view.selectionModel().selectionChanged.connect(self.file_view_selection_changed)
        # self.file_view.setContextMenuPolicy(Qt.CustomContextMenu)
        # self.file_view.customContextMenuRequested.connect(self.file_view_context_menu_requested)

        # self.lb_nsfc = QLabel("")
        self.lb_path = QLabel("")
        self.lb_path.setFont(QFont("SansSerif", 10))

        self.pb_select = QPushButton(_("Select"))
        self.pb_select.clicked.connect(self.show_explorer)

        # right part of frame
        header_right = [_("Set Name"), _("Files"), _("New Files"), _("Update Files"), _("Unchanged Files")]
        self.overview_model = OverviewTableModel(self, header_right, [])
        self.overview = QTableView()
        self.overview.setModel(self.overview_model)
        self.overview.setAlternatingRowColors(True)
        self.overview.setShowGrid(False)

        self.overview.verticalHeader().setDefaultSectionSize(22)

        self.pb_publish = QPushButton(_("Publish"))
        self.pb_publish.clicked.connect(self.pb_publish_clicked)

        self.pb_zip = QPushButton(_("Create Zip"))
        self.pb_zip.clicked.connect(self.pb_zip_clicked)

        self.__init_ui__()
Exemple #8
0
 def setModel(self, model):
     QTableView.setModel(self, model)
     # The model needs to be set to set header stuff
     hheader = self.horizontalHeader()
     hheader.setHighlightSections(False)
     hheader.setStretchLastSection(False)
     hheader.resizeSection(0, 100)
     hheader.setSectionResizeMode(0, QHeaderView.Fixed)
     hheader.setSectionResizeMode(1, QHeaderView.Stretch)
     hheader.setSectionResizeMode(2, QHeaderView.Stretch)
     vheader = self.verticalHeader()
     vheader.setVisible(False)
     vheader.setDefaultSectionSize(18)
    def __init__(self, model, parent=None):
        QTableView.__init__(self, parent)

        # Custom delegates.
        self._checkBoxDelegate = CheckBoxDelegateQt()
        self._floatEditDelegate = FloatEditDelegateQt()
        self._dateTimeEditDelegates = []  # Each of these can have different formats.
        self._comboBoxDelegates = []  # Each of these can have different choices.
        self._pushButtonDelegates = []  # Each of these can have different text.
        self._fileDialogDelegate = FileDialogDelegateQt()

        # Set the model.
        self.setModel(model)
 def draw_table():
     tv = QTableView()
     tv.setMinimumSize(400, 400)
     tv.setShowGrid(False)
     vh = tv.verticalHeader()
     vh.setVisible(False)
     hh = tv.horizontalHeader()
     hh.setStretchLastSection(True)
     tv.setSortingEnabled(True)
     return tv
Exemple #11
0
    def setModel(self, model):
        QTableView.setModel(self._table, model)
        self._table.setSelectionModel(model._selectionModel)
        
        if model.rowCount() > 0:
            self.setCurrentIndex(self.PAGE_LISTVIEW)
        else:
            self.setCurrentIndex(self.PAGE_EMPTY)

        model.rowsInserted.connect(self._onRowsChanged)
        model.rowsRemoved.connect(self._onRowsChanged)
        self.model=model
        
        self._setListViewLook()
    def __init__(self, *args):
        # Invoke parent init
        QTableView.__init__(self, *args)

        # Get a reference to the window object
        self.win = get_app().window

        # Get Model data
        self.clip_properties_model = PropertiesModel(self)
        self.transition_model = TransitionsModel(self)
        self.files_model = FilesModel(self)

        # Keep track of mouse press start position to determine when to start drag
        self.selected = []
        self.selected_label = None
        self.selected_item = None
        self.new_value = None
        self.original_data = None

        # Setup header columns
        self.setModel(self.clip_properties_model.model)
        self.setSelectionBehavior(QAbstractItemView.SelectRows)
        self.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
        self.setWordWrap(True)

        # Set delegate
        delegate = PropertyDelegate()
        self.setItemDelegateForColumn(1, delegate)
        self.previous_x = -1

        # Get table header
        horizontal_header = self.horizontalHeader()
        horizontal_header.setSectionResizeMode(QHeaderView.Stretch)
        vertical_header = self.verticalHeader()
        vertical_header.setVisible(False)

        # Refresh view
        self.clip_properties_model.update_model()
        self.transition_model.update_model()
        self.files_model.update_model()

        # Resize columns
        self.resizeColumnToContents(0)
        self.resizeColumnToContents(1)

        # Connect filter signals
        get_app().window.txtPropertyFilter.textChanged.connect(self.filter_changed)
        get_app().window.InsertKeyframe.connect(self.Insert_Action_Triggered)
        self.doubleClicked.connect(self.doubleClickedCB)
        self.loadProperties.connect(self.select_item)
Exemple #13
0
class MyWin(QWidget):
    def __init__(self, mydb):
        super(MyWin, self).__init__()
        main_lt = QVBoxLayout()
        self.view = QTableView()
        main_lt.addWidget(self.view)
        self.view.setWindowTitle("Table Model (View 1)")
        self.view.setSelectionBehavior(QAbstractItemView.SelectRows)
        self.mydb = mydb

        button = QPushButton("Join")
        button.clicked.connect(self.merge)
        main_lt.addWidget(button)

        button = QPushButton("Exit")
        button.clicked.connect(lambda: exit())
        main_lt.addWidget(button)

        self.setLayout(main_lt)
        self.setWindowTitle('QT1')

    def set_model(self):
        self.view.setModel(self.mydb.get_model())

    def merge(self):
        ind_list = self.view.selectedIndexes()
        out = list(self.view.model().data(i) for i in ind_list)
        out = [out[i] for i in range(len(out)) if i % 2 == 0]
        if len(out) < 2:
            return
        self.mydb.merge(out)
        mb = QMessageBox()
        mb.setText('Merged %s' % str(out))
        mb.exec_()
        self.set_model()
Exemple #14
0
 def keyPressEvent(self, event):
     self.firstrelease = True
     event_check = int(event.key())
     # event = event.key
     self.keylist.append(event_check)
     # print(self.keylist)
     Key_Control = 16777249
     Shift_Control = 16777248
     if event.key() == (Qt.Key_F1):  # It should show if there action not activated
         self.parent.showHelpMenu()
         return
     if Key_Control not in self.keylist:  # or  Qt.Key_Shift not in self.keylist:
         # print('Choice 1')
         QTableView.keyPressEvent(self, event)
         return
Exemple #15
0
 def _setupUi(self):
     self.setWindowTitle(tr("Problems!"))
     self.resize(413, 323)
     self.verticalLayout = QVBoxLayout(self)
     self.label = QLabel(self)
     msg = tr("There were problems processing some (or all) of the files. The cause of "
         "these problems are described in the table below. Those files were not "
         "removed from your results.")
     self.label.setText(msg)
     self.label.setWordWrap(True)
     self.verticalLayout.addWidget(self.label)
     self.tableView = QTableView(self)
     self.tableView.setEditTriggers(QAbstractItemView.NoEditTriggers)
     self.tableView.setSelectionMode(QAbstractItemView.SingleSelection)
     self.tableView.setSelectionBehavior(QAbstractItemView.SelectRows)
     self.tableView.setShowGrid(False)
     self.tableView.horizontalHeader().setStretchLastSection(True)
     self.tableView.verticalHeader().setDefaultSectionSize(18)
     self.tableView.verticalHeader().setHighlightSections(False)
     self.verticalLayout.addWidget(self.tableView)
     self.horizontalLayout = QHBoxLayout()
     self.revealButton = QPushButton(self)
     self.revealButton.setText(tr("Reveal Selected"))
     self.horizontalLayout.addWidget(self.revealButton)
     spacerItem = QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum)
     self.horizontalLayout.addItem(spacerItem)
     self.closeButton = QPushButton(self)
     self.closeButton.setText(tr("Close"))
     self.closeButton.setDefault(True)
     self.horizontalLayout.addWidget(self.closeButton)
     self.verticalLayout.addLayout(self.horizontalLayout)
Exemple #16
0
    def __initWidgets(self):
        minimalSizePolicy = QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed)

        # List of subtitles
        subListDelegate = SubListItemDelegate()
        self._model = QStandardItemModel(0, 3, self)
        self._model.setHorizontalHeaderLabels([_("Begin"), _("End"), _("Subtitle")])
        self._subList = QTableView(self)
        self._subList.setModel(self._model)
        self._subList.setItemDelegateForColumn(0, subListDelegate)
        self._subList.setItemDelegateForColumn(1, subListDelegate)
        self._subList.horizontalHeader().setSectionResizeMode(2, QHeaderView.Stretch)

        self._searchBar = SearchBar(self)
        self._searchBar.hide()

        # Top toolbar
        toolbar = QHBoxLayout()
        toolbar.setAlignment(Qt.AlignLeft)
        #toolbar.addWidget(someWidget....)
        toolbar.addStretch(1)

        # Main layout
        grid = QGridLayout()
        grid.setSpacing(10)
        grid.setContentsMargins(0, 3, 0, 0)
        grid.addLayout(toolbar, 0, 0, 1, 1) # stretch to the right
        grid.addWidget(self._subList, 1, 0)
        grid.addWidget(self._searchBar, 2, 0)
        self.setLayout(grid)
Exemple #17
0
 def _uic(self):
     mainLayout = QVBoxLayout()
     self.setLayout(mainLayout)
     topLayout = QHBoxLayout()
     topLayout.setContentsMargins(0,0,0,0)
     mainLayout.addLayout(topLayout,0)
     # Lay out the refresh button and filter popup
     self.refresh = QPushButton(
         _TR('Button to reload all data in char panel',
             'Refresh')
         )
     topLayout.addWidget(self.refresh,0)
     topLayout.addStretch(1) # push filters to the right
     self.popup = QComboBox()
     # Set choices in popup, must match to the lambdas
     # defined in CharFilter.set_filter()
     self.popup.addItem(
         _TR('char panel: show all characters',
             'All')
     )
     self.popup.addItem(
         _TR('char panel: show non-ascii characters',
             'not 7-bit')
     )
     self.popup.addItem(
         _TR('char panel: show non-latin-1',
             'not Latin-1')
     )
     topLayout.addWidget(self.popup,0)
     # Set up the table view, the actual visible table
     self.view = QTableView()
     self.view.setCornerButtonEnabled(False)
     self.view.setWordWrap(False)
     self.view.setAlternatingRowColors(True)
     mainLayout.addWidget(self.view,1) # give it all the stretch
 def show_table(self, model):
     self.table = QTableView()
     self.table.setSizeAdjustPolicy(QAbstractScrollArea.AdjustToContents)
     self.model = model
     self.table.setWindowTitle("Books")
     self.table.setWindowIcon(QIcon(QPixmap('../images/icon.png')))
     self.table.setModel(model)
     self.table.show()
def createView(title, model):
    view = QTableView()
    view.setModel(model)
    view.setItemDelegate(QSqlRelationalDelegate(view))
    view.setWindowTitle(title)

    return view
 def show_clients_model(self, clients, is_maid=False):
     self.table = QTableView()
     self.table.setSizeAdjustPolicy(QAbstractScrollArea.AdjustToContents)
     self.model = ClientsModel(is_maid)
     self.model.set_clients(clients)
     self.table.setModel(self.model)
     self.table.setWindowTitle('Show Client')
     self.table.setWindowIcon(QIcon(QPixmap(':/images/hotel_icon.jpg')))
     self.table.show()
class viewTable(QDialog):   
    def __init__(self, parent=None):
        fileName = filedialog.askopenfilename()
        if fileName != '':
            k = fileName.rfind("/")
            self.parent = parent
            self.parent.statusbar.showMessage("Opening dataset...")
            QWidget.__init__(self,parent)
            self.setWindowFlags(Qt.Window)
            self.setObjectName("dialog1")
            self.setGeometry(100,100,400,400)
            self.setWindowTitle(fileName[k+1:])
            self.setWindowIcon(QIcon('NSlogo.png'))
            self.model = QStandardItemModel(self)
            
            with open(fileName, "r") as fileInput:
                for row in csv.reader(fileInput, delimiter='\t'):    
                    items = [
                        QStandardItem(field)
                        for field in row
                    ]
                    self.model.appendRow(items)
        
            self.tableView = QTableView(self)
            self.tableView.setModel(self.model)

            self.layoutVertical = QVBoxLayout(self)
            self.layoutVertical.addWidget(self.tableView)

            self.parent = parent

            self.showMaximized()
            self.show()
            
            self.parent.ui.logOutput.append("VIEWED:")
            print("VIEWED:")
            self.parent.ui.logOutput.append("      " + str(fileName.split('/')[-1]))
            print("      " + str(fileName.split('/')[-1]))

    def closeEvent(self, event):
        self.model.clear()
        self.parent.ui.logOutput.append("")
        self.parent.statusbar.showMessage("Welcome back!")
    def __init__(self, settings, directory, check_id_fct, annotations_path, parent=None):
        super().__init__(parent)
        # FIXME Delayed refactoring of check_id_fct and annotations_path.

        # Variables section.

        library_id = settings["libraryID"]
        library_type = settings["libraryType"]
        api_key = settings["apiKey"]
        self._zotero = ZoteroWrap(library_id, library_type, api_key, directory)

        # Widgets section.

        model = ZoteroTableModel(self._zotero, check_id_fct, annotations_path)
        model.load()

        proxy_model = QSortFilterProxyModel()
        proxy_model.setSourceModel(model)
        proxy_model.setDynamicSortFilter(True)
        proxy_model.setFilterCaseSensitivity(Qt.CaseInsensitive)
        proxy_model.setFilterKeyColumn(-1)  # NB: All columns.

        self.view = QTableView(self)
        self.view.setModel(proxy_model)
        self.view.setCornerButtonEnabled(False)
        self.view.setEditTriggers(QAbstractItemView.NoEditTriggers)
        self.view.setSelectionBehavior(QAbstractItemView.SelectRows)
        self.view.setSelectionMode(QAbstractItemView.SingleSelection)
        # NB: Triggers a call to sortByColumn() which sorts by the first column.
        self.view.setSortingEnabled(True)
        self.view.setWordWrap(False)
        self.view.verticalHeader().hide()

        self.filter_edit = FilterEdit(self.view)

        # NB: The thread does not begin executing until start() is called.
        self.refresh_thread = ZoteroRefreshThread(model, self)

        # Layouts section.

        header_layout = QFormLayout()
        header_layout.addRow("Filter:", self.filter_edit)
        header_layout.setFieldGrowthPolicy(QFormLayout.AllNonFixedFieldsGrow)
        utils.configure_form_layout(header_layout)

        main_layout = QVBoxLayout()
        main_layout.addLayout(header_layout)
        main_layout.addWidget(self.view)
        self.setLayout(main_layout)

        # Signals section.

        self.filter_edit.textChanged.connect(proxy_model.setFilterFixedString)
        self.refresh_thread.started.connect(self.refresh_started)
        self.refresh_thread.finished.connect(self.refresh_finished)
Exemple #23
0
 def fill_UI(self):
     """sets up the layout
     """
     self.table = QTableView()
     header = self.table.horizontalHeader()
     header.hide()
     header.setStretchLastSection(True)
     self.table.resizeColumnsToContents()
     self.table.setAlternatingRowColors(True)
     self.grid.addWidget(self.table, 1, 0)
     self.log.debug("\t=> Table created!")
Exemple #24
0
 def __init__(self, model):
     super(FreezeTableWidget, self).__init__()
     self.setModel(model)
     self.frozenTableView = QTableView(self)
     self.init()
     self.horizontalHeader().sectionResized.connect(self.updateSectionWidth)
     self.verticalHeader().sectionResized.connect(self.updateSectionHeight)
     self.frozenTableView.verticalScrollBar().valueChanged.connect(
         self.verticalScrollBar().setValue)
     self.verticalScrollBar().valueChanged.connect(
         self.frozenTableView.verticalScrollBar().setValue)
    def initUI(self):
        #statusReplaceModel
        statusReplaceModel=QStandardItemModel()
        statusReplaceModel.setColumnCount(3)
        statusReplaceModel.setHorizontalHeaderLabels(["Файл","Найти","Заменить","Объект","Статус замены"])
        #/statusReplaceModel
        StatusTable=QTableView(self)
        StatusTable.setModel(statusReplaceModel)
        StatusTable.setToolTip("Отчетная таблица")

        #mainLayout
        mainLayout = QVBoxLayout()
        mainLayout.setContentsMargins(0,0,0,0)
        mainLayout.addWidget(StatusTable)
        self.setLayout(mainLayout)
        #/mainLayout
        #self

        self.statusTable = StatusTable
        #/self
        StatusTable.doubleClicked.connect(self.openFile)
class WishlistForm(QDialog):
    def __init__(self):
        super(WishlistForm, self).__init__()
        self.initUI(self)

    def initUI(self, WishlistForm):
        layout = QGridLayout(self)

        self.show_wishlist_button = QPushButton("Show Wishlist")
        layout.addWidget(self.show_wishlist_button, 0, 1, 1, 2)

        self.setLayout(layout)
        self.show_wishlist_button.clicked.connect(self.
                                                  show_wishlist_button_click)
        self.layout().setSizeConstraint(QLayout.SetFixedSize)
        self.setWindowTitle("Wishlist")
        self.setWindowIcon(QIcon(QPixmap('../images/whish.png')))

    def show_table(self, model):
        self.table = QTableView()
        self.table.setSizeAdjustPolicy(QAbstractScrollArea.AdjustToContents)
        self.model = model
        self.table.setWindowTitle("Wishlist")
        self.table.setWindowIcon(QIcon(QPixmap('../images/icon.png')))
        self.table.setModel(model)
        self.table.show()

    def show_wishlist_button_click(self):
        text = 'Want Тo Read'
        books = select_by_status(text)

        if books == []:
            QMessageBox(QMessageBox.Information, "No results",
                        "There are no books in the wishlist!").exec_()
            return
        else:
            wishlist_model = BookModel()
            books = [Book(*book) for book in books]
            wishlist_model.set_books(books)
            self.show_table(wishlist_model)
Exemple #27
0
class InstanceVM(object):
    def __init__(self, model, parent, file_path):
        self.file_path = os.path.abspath(file_path)
        self.modified = False
        self.model = model
        self.table_vm = InstanceTableModel(model)
        self.table_vm.modified.connect(self.set_dirty)
        self.table_view = QTableView()
        self.table_view.show()
        self.table_view.closeEvent = self.close_handler
        self.table_view.setModel(self.table_vm)
        self.parent = parent
        self.sub_window = parent.mdi.addSubWindow(self.table_view)
        self.sub_window.instance = self
        self.sub_window.setAttribute(Qt.WA_DeleteOnClose)
        self.update_title()
        parent.instances.append(self)

    def set_dirty(self):
        self.set_modified(True)

    def set_modified(self, b):
        self.modified = b
        self.sub_window.setWindowModified(b)

    def update_title(self):
        self.sub_window.setWindowTitle(self.file_path + "[*]")

    def close_handler(self, ev):
        if self.modified:
            ret = QMessageBox().question(
                self.table_view, "Confirm",
                "close without saving?",
                QMessageBox.Yes | QMessageBox.No)
            if ret == QMessageBox.No:
                ev.ignore()
                return
        self.parent.remove_instance(self)
Exemple #28
0
class Gui:
    def __init__(self):
        # Init GuiBehavior()
        self.actions = GuiBehavior(self)
        self.app_name = '1Fichier Downloader v0.1.4'

        # Create App
        app = QApplication(sys.argv)
        app.setWindowIcon(QIcon(absp('ico.ico')))
        app.setStyle('Fusion')
        app.aboutToQuit.connect(self.actions.handle_exit)

        self.app = app

        # Create Windows
        self.main_win()
        self.add_links_win()
        self.settings_win()

        # Change App Theme to saved one (Palette)
        if self.actions.settings:
            if len(
                    self.actions.settings
            ) > 1:  # conditional in case the user is using an old settings file
                self.actions.change_theme(self.actions.settings[1])

        sys.exit(app.exec_())

    def main_win(self):
        # Define Main Window
        self.main = QMainWindow()
        self.main.setWindowTitle(self.app_name)
        widget = QWidget(self.main)
        self.main.setCentralWidget(widget)

        # Create Grid
        grid = QGridLayout()

        # Top Buttons
        download_btn = QPushButton(QIcon(absp('res/download.svg')),
                                   ' Add Link(s)')
        download_btn.clicked.connect(lambda: self.add_links.show())

        settings_btn = QPushButton(QIcon(absp('res/settings.svg')),
                                   ' Settings')
        settings_btn.clicked.connect(lambda: self.settings.show())

        # Table
        self.table = QTableView()
        headers = [
            'Name', 'Size', 'Status', 'Down Speed', 'Progress', 'Password'
        ]
        self.table.setSizeAdjustPolicy(
            QAbstractScrollArea.AdjustToContentsOnFirstShow)
        self.table.horizontalHeader().setStretchLastSection(True)
        self.table.setSelectionBehavior(QAbstractItemView.SelectRows)
        self.table.setSortingEnabled(True)
        self.table.verticalHeader().hide()

        self.table_model = QStandardItemModel()
        self.table_model.setHorizontalHeaderLabels(headers)
        self.table.setModel(self.table_model)

        # Append widgets to grid
        grid.addWidget(download_btn, 0, 0)
        grid.addWidget(settings_btn, 0, 1)
        grid.addWidget(self.table, 1, 0, 1, 2)

        # Bottom Buttons
        resume_btn = QPushButton(QIcon(absp('res/resume.svg')), ' Resume')
        resume_btn.clicked.connect(self.actions.resume_download)

        pause_btn = QPushButton(QIcon(absp('res/pause.svg')), ' Pause')
        pause_btn.clicked.connect(self.actions.pause_download)

        stop_btn = QPushButton(QIcon(absp('res/stop.svg')), ' Remove')
        stop_btn.clicked.connect(self.actions.stop_download)

        # Add buttons to Horizontal Layout
        hbox = QHBoxLayout()
        hbox.addWidget(resume_btn)
        hbox.addWidget(pause_btn)
        hbox.addWidget(stop_btn)

        self.main.setWindowFlags(self.main.windowFlags()
                                 & Qt.CustomizeWindowHint)

        grid.addLayout(hbox, 2, 0, 1, 2)
        widget.setLayout(grid)
        self.main.resize(670, 415)
        self.main.show()

    def add_links_win(self):
        # Define Add Links Win
        self.add_links = QMainWindow(self.main)
        self.add_links.setWindowTitle('Add Link(s)')
        widget = QWidget(self.add_links)
        self.add_links.setCentralWidget(widget)

        # Create Vertical Layout
        layout = QVBoxLayout()

        # Text Edit
        self.links = QPlainTextEdit()
        layout.addWidget(self.links)

        # Button
        add_btn = QPushButton('Add Link(s)')
        add_btn.clicked.connect(self.actions.add_links)
        layout.addWidget(add_btn)

        self.add_links.setMinimumSize(300, 200)
        widget.setLayout(layout)

    def settings_win(self):
        # Define Settings Win
        self.settings = QMainWindow(self.main)
        self.settings.setWindowTitle('Settings')

        # Create StackedWidget and Selection List
        self.stacked_settings = QStackedWidget()
        self.settings_list = QListWidget()
        self.settings_list.setFixedWidth(110)
        self.settings_list.addItems(['Main', 'About'])
        self.settings_list.clicked.connect(self.actions.select_settings)

        # Central Widget
        central_widget = QWidget()
        hbox = QHBoxLayout()
        hbox.addWidget(self.settings_list)
        hbox.addWidget(self.stacked_settings)
        central_widget.setLayout(hbox)
        self.settings.setCentralWidget(central_widget)
        '''
        Child widget
        Behavior Settings
        '''

        behavior_settings = QWidget()
        self.stacked_settings.addWidget(behavior_settings)

        # Main Layouts
        vbox = QVBoxLayout()
        vbox.setAlignment(Qt.AlignTop)
        form_layout = QFormLayout()

        # Change Directory
        dl_directory_label = QLabel('Download directory:')
        form_layout.addRow(dl_directory_label)

        dl_directory_btn = QPushButton('Select..')
        dl_directory_btn.clicked.connect(self.actions.set_dl_directory)

        self.dl_directory_input = QLineEdit()
        if self.actions.settings is not None:
            self.dl_directory_input.setText(self.actions.settings[0])
        self.dl_directory_input.setDisabled(True)

        form_layout.addRow(dl_directory_btn, self.dl_directory_input)

        # Bottom Buttons
        save_settings = QPushButton('Save')
        save_settings.clicked.connect(self.actions.save_settings)

        # Change theme
        theme_label = QLabel('Theme:')
        form_layout.addRow(theme_label)

        self.theme_select = QComboBox()
        self.theme_select.addItems(['Light', 'Dark'])
        self.theme_select.currentIndexChanged.connect(
            self.actions.change_theme)
        form_layout.addRow(self.theme_select)

        vbox.addLayout(form_layout)
        vbox.addStretch()
        vbox.addWidget(save_settings)
        behavior_settings.setLayout(vbox)
        '''
        Child widget
        About
        '''

        about_settings = QWidget()
        self.stacked_settings.addWidget(about_settings)

        about_layout = QGridLayout()
        about_layout.setAlignment(Qt.AlignCenter)

        logo = QLabel()
        logo.setPixmap(QPixmap(absp('res/zap.svg')))
        logo.setAlignment(Qt.AlignCenter)

        text = QLabel(self.app_name)
        text.setStyleSheet('font-weight: bold; color: #4256AD')

        github_btn = QPushButton(QIcon(absp('res/github.svg')), '')
        github_btn.setFixedWidth(32)
        github_btn.clicked.connect(
            lambda: webbrowser.open('https://github.com/manuGMG/1fichier-dl'))

        about_layout.addWidget(logo, 0, 0, 1, 0)
        about_layout.addWidget(github_btn, 1, 0)
        about_layout.addWidget(text, 1, 1)
        about_settings.setLayout(about_layout)
Exemple #29
0
    def main_win(self):
        # Define Main Window
        self.main = QMainWindow()
        self.main.setWindowTitle(self.app_name)
        widget = QWidget(self.main)
        self.main.setCentralWidget(widget)

        # Create Grid
        grid = QGridLayout()

        # Top Buttons
        download_btn = QPushButton(QIcon(absp('res/download.svg')),
                                   ' Add Link(s)')
        download_btn.clicked.connect(lambda: self.add_links.show())

        settings_btn = QPushButton(QIcon(absp('res/settings.svg')),
                                   ' Settings')
        settings_btn.clicked.connect(lambda: self.settings.show())

        # Table
        self.table = QTableView()
        headers = [
            'Name', 'Size', 'Status', 'Down Speed', 'Progress', 'Password'
        ]
        self.table.setSizeAdjustPolicy(
            QAbstractScrollArea.AdjustToContentsOnFirstShow)
        self.table.horizontalHeader().setStretchLastSection(True)
        self.table.setSelectionBehavior(QAbstractItemView.SelectRows)
        self.table.setSortingEnabled(True)
        self.table.verticalHeader().hide()

        self.table_model = QStandardItemModel()
        self.table_model.setHorizontalHeaderLabels(headers)
        self.table.setModel(self.table_model)

        # Append widgets to grid
        grid.addWidget(download_btn, 0, 0)
        grid.addWidget(settings_btn, 0, 1)
        grid.addWidget(self.table, 1, 0, 1, 2)

        # Bottom Buttons
        resume_btn = QPushButton(QIcon(absp('res/resume.svg')), ' Resume')
        resume_btn.clicked.connect(self.actions.resume_download)

        pause_btn = QPushButton(QIcon(absp('res/pause.svg')), ' Pause')
        pause_btn.clicked.connect(self.actions.pause_download)

        stop_btn = QPushButton(QIcon(absp('res/stop.svg')), ' Remove')
        stop_btn.clicked.connect(self.actions.stop_download)

        # Add buttons to Horizontal Layout
        hbox = QHBoxLayout()
        hbox.addWidget(resume_btn)
        hbox.addWidget(pause_btn)
        hbox.addWidget(stop_btn)

        self.main.setWindowFlags(self.main.windowFlags()
                                 & Qt.CustomizeWindowHint)

        grid.addLayout(hbox, 2, 0, 1, 2)
        widget.setLayout(grid)
        self.main.resize(670, 415)
        self.main.show()
Exemple #30
0
 def __init__(self, *args, **kwargs):
     QTableView.__init__(self, *args, **kwargs)
class MainWindow(QMainWindow):
    def __init__(self, *args, **kwargs):
        super(MainWindow, self).__init__(*args, **kwargs)

        self.setWindowTitle("View Table with SQL")

        container = QWidget()
        layout_search = QHBoxLayout()

        self.track = QLineEdit()
        self.track.setPlaceholderText("Track name...")
        self.track.textChanged.connect(self.update_query)

        self.composer = QLineEdit()
        self.composer.setPlaceholderText("Artist name...")
        self.composer.textChanged.connect(self.update_query)

        self.album = QLineEdit()
        self.album.setPlaceholderText("Album name...")
        self.album.textChanged.connect(self.update_query)

        layout_search.addWidget(self.track)
        layout_search.addWidget(self.composer)
        layout_search.addWidget(self.album)

        layout_view = QVBoxLayout()
        layout_view.addLayout(layout_search)

        self.table = QTableView()
        layout_view.addWidget(self.table)

        container.setLayout(layout_view)

        self.model = QSqlQueryModel()
        self.table.setModel(self.model)

        self.query = QSqlQuery(db=db)
        self.query.prepare(
            "SELECT Name, Composer, Album.Title FROM Track "
            "INNER JOIN Album ON Track.AlbumId=Album.AlbumId WHERE "
            "Track.Name LIKE '%' || :track_name || '%' AND "
            "Track.Composer LIKE '%' || :track_composer || '%' AND "
            "Album.Title LIKE '%' || :album_title || '%'"
        )

        self.update_query()

        self.setMinimumSize(QSize(1024, 640))
        self.setCentralWidget(container)

    def update_query(self, s=None):
        # Get the text values from the widgets
        track_name = self.track.text()
        track_composer = self.composer.text()
        album_title = self.album.text()

        self.query.bindValue(":track_name", track_name)
        self.query.bindValue(":track_composer", track_composer)
        self.query.bindValue(":album_title", album_title)

        self.query.exec_()
        self.model.setQuery(self.query)
Exemple #32
0
class ReferenceDataDlg(QDialog):
    def __init__(self, table, title, parent=None):
        super(ReferenceDataDlg, self).__init__(parent)

        self.model = QSqlTableModel(self)
        self.model.setTable(table)
        self.model.setSort(NAME, Qt.AscendingOrder)
        self.model.setHeaderData(ID, Qt.Horizontal, "ID")
        self.model.setHeaderData(NAME, Qt.Horizontal, "Name")
        self.model.setHeaderData(DESCRIPTION, Qt.Horizontal, "Description")
        self.model.select()

        self.view = QTableView()
        self.view.setModel(self.model)
        self.view.setSelectionMode(QTableView.SingleSelection)
        self.view.setSelectionBehavior(QTableView.SelectRows)
        self.view.setColumnHidden(ID, True)
        self.view.resizeColumnsToContents()
        addButton = QPushButton("&Add")
        deleteButton = QPushButton("&Delete")
        okButton = QPushButton("&OK")
        if not MAC:
            addButton.setFocusPolicy(Qt.NoFocus)
            deleteButton.setFocusPolicy(Qt.NoFocus)

        buttonLayout = QHBoxLayout()
        buttonLayout.addWidget(addButton)
        buttonLayout.addWidget(deleteButton)
        buttonLayout.addStretch()
        buttonLayout.addWidget(okButton)
        layout = QVBoxLayout()
        layout.addWidget(self.view)
        layout.addLayout(buttonLayout)
        self.setLayout(layout)

        addButton.clicked.connect(self.addRecord)
        deleteButton.clicked.connect(self.deleteRecord)
        okButton.clicked.connect(self.accept)

        self.setWindowTitle(
            "Asset Manager - Edit {0} Reference Data".format(title))

    def addRecord(self):
        row = self.model.rowCount()
        self.model.insertRow(row)
        index = self.model.index(row, NAME)
        self.view.setCurrentIndex(index)
        self.view.edit(index)

    def deleteRecord(self):
        index = self.view.currentIndex()
        if not index.isValid():
            return
        #QSqlDatabase.database().transaction()
        record = self.model.record(index.row())
        id = record.value(ID)
        table = self.model.tableName()
        query = QSqlQuery()
        if table == "actions":
            query.exec_("SELECT COUNT(*) FROM logs "
                        "WHERE actionid = {0}".format(id))
        elif table == "categories":
            query.exec_("SELECT COUNT(*) FROM assets "
                        "WHERE categoryid = {0}".format(id))
        count = 0
        if query.next():
            count = query.value(0)
        if count:
            QMessageBox.information(
                self, "Delete {0}".format(table),
                ("Cannot delete {0}<br>"
                 "from the {1} table because it is used by "
                 "{2} records").format(record.value(NAME), table, count))
            #QSqlDatabase.database().rollback()
            return
        self.model.removeRow(index.row())
        self.model.submitAll()
        self.model.select()
Exemple #33
0
 def event(self, event):
     return QTableView.event(self, event)
Exemple #34
0
class CreateUserView(ViewWidget):
    def __init__(self):
        super().__init__()
        self.v_layout = QVBoxLayout()
        self.model = CreateUserModel(self)
        self.controller = CreateUserController(self.model, self)
        self.init_gui()
        self.init_main_layout()
        self.table = QTableView()
        self.show_table()

    def show_table(self):
        self.table.setStyleSheet("selection-background-color: #0f5b8d;"
                                 "background-color: #505052;"
                                 "color: #f0f4f7;"
                                 "font-size:14px;"
                                 "gridline-color:#324148;"
                                 "text-align:center;")
        self.table.horizontalHeader().setStyleSheet("background-color:#3b3b3d")
        self.table.setModel(self.model)
        self.table.keyReleaseEvent = self.controller.key_input
        for i in range(4):
            self.table.setColumnWidth(i, 240)
        self.table.setModel(self.model)
        self.table.setEditTriggers(QAbstractItemView.DoubleClicked)
        self.v_layout.addWidget(self.table)

    def update_view(self):
        self.model.update()
        self.clear_layout()
        self.show_table()
class MainWindow(QMainWindow):
    """Класс - основное окно сервера."""
    def __init__(self, database, server, config):
        # Конструктор предка
        super().__init__()

        # База данных сервера
        self.database = database

        self.server_thread = server
        self.config = config

        # Ярлык выхода
        # self.exitAction = QAction('Выход', self)
        self.exitAction = QAction(QIcon(EXIT_IMG), 'Exit/Выход', self)
        self.exitAction.setShortcut('Ctrl+Q')
        self.exitAction.triggered.connect(qApp.quit)

        # Кнопка обновить список клиентов
        self.refresh_button = QAction('Обновить список', self)

        # Кнопка настроек сервера
        self.config_btn = QAction('Настройки сервера', self)

        # Кнопка регистрации пользователя
        self.register_btn = QAction('Регистрация пользователя', self)

        # Кнопка удаления пользователя
        self.remove_btn = QAction('Удаление пользователя', self)

        # Кнопка вывести историю сообщений
        self.show_history_button = QAction('История клиентов', self)

        # Статусбар
        self.statusBar()
        self.statusBar().showMessage('Server Working')

        # Тулбар
        self.toolbar = self.addToolBar('MainBar')
        self.toolbar.addAction(self.exitAction)
        self.toolbar.addAction(self.refresh_button)
        self.toolbar.addAction(self.show_history_button)
        self.toolbar.addAction(self.config_btn)
        self.toolbar.addAction(self.register_btn)
        self.toolbar.addAction(self.remove_btn)

        # Настройки геометрии основного окна
        # Поскольку работать с динамическими размерами мы не умеем, и мало
        # времени на изучение, размер окна фиксирован.
        self.setFixedSize(800, 600)
        self.setWindowTitle('Messaging Server alpha release')

        # Надпись о том, что ниже список подключённых клиентов
        self.label = QLabel('Список подключённых клиентов:', self)
        self.label.setFixedSize(240, 15)
        # self.label.move(10, 25)
        self.label.move(17, 38)

        # Окно со списком подключённых клиентов.
        self.active_clients_table = QTableView(self)
        # self.active_clients_table.move(10, 45)
        self.active_clients_table.move(10, 58)
        self.active_clients_table.setFixedSize(780, 400)

        # Таймер, обновляющий список клиентов 1 раз в секунду
        self.timer = QTimer()
        self.timer.timeout.connect(self.create_users_model)
        self.timer.start(1000)

        # Связываем кнопки с процедурами
        self.refresh_button.triggered.connect(self.create_users_model)
        self.show_history_button.triggered.connect(self.show_statistics)
        self.config_btn.triggered.connect(self.server_config)
        self.register_btn.triggered.connect(self.reg_user)
        self.remove_btn.triggered.connect(self.rem_user)

        # Последним параметром отображаем окно.
        self.show()

    def create_users_model(self):
        """Метод заполняющий таблицу активных пользователей."""
        list_users = self.database.active_users_list()
        list = QStandardItemModel()
        list.setHorizontalHeaderLabels(
            ['Имя Клиента', 'IP Адрес', 'Порт', 'Время подключения'])
        for row in list_users:
            user, ip, port, time = row
            user = QStandardItem(user)
            user.setEditable(False)
            ip = QStandardItem(ip)
            ip.setEditable(False)
            port = QStandardItem(str(port))
            port.setEditable(False)
            # Уберём милисекунды из строки времени, т.к. такая точность не
            # требуется.
            time = QStandardItem(str(time.replace(microsecond=0)))
            time.setEditable(False)
            list.appendRow([user, ip, port, time])
        self.active_clients_table.setModel(list)
        self.active_clients_table.resizeColumnsToContents()
        self.active_clients_table.resizeRowsToContents()

    def show_statistics(self):
        """Метод создающий окно со статистикой клиентов."""
        global stat_window
        stat_window = StatWindow(self.database)
        stat_window.show()

    def server_config(self):
        """Метод создающий окно с настройками сервера."""
        global config_window
        # Создаём окно и заносим в него текущие параметры
        config_window = ConfigWindow(self.config)

    def reg_user(self):
        """Метод создающий окно регистрации пользователя."""
        global reg_window
        reg_window = RegisterUser(self.database, self.server_thread)
        reg_window.show()

    def rem_user(self):
        """Метод создающий окно удаления пользователя."""
        global rem_window
        rem_window = DelUserDialog(self.database, self.server_thread)
        rem_window.show()
class ChannelPropertiesDialog(QDialog):
    def __init__(self, parent, info, title="Channel Properties"):
        super().__init__(parent)
        self.setWindowTitle(title)

        self.model = QStandardItemModel(info["nchan"], 4)
        self.model.setHorizontalHeaderLabels(["#", "Label", "Type", "Bad"])
        for index, ch in enumerate(info["chs"]):
            item = QStandardItem()
            item.setData(index, Qt.DisplayRole)
            item.setFlags(item.flags() & ~Qt.ItemIsEditable)
            self.model.setItem(index, 0, item)
            self.model.setItem(index, 1, QStandardItem(ch["ch_name"]))
            kind = channel_type(info, index).upper()
            self.model.setItem(index, 2, QStandardItem(str(kind)))
            bad = QStandardItem()
            bad.setData(ch["ch_name"] in info["bads"], Qt.UserRole)
            bad.setCheckable(True)
            bad.setEditable(False)
            checked = ch["ch_name"] in info["bads"]
            bad.setCheckState(Qt.Checked if checked else Qt.Unchecked)
            self.model.setItem(index, 3, bad)

        self.model.itemChanged.connect(bad_changed)
        self.proxymodel = MySortFilterProxyModel()
        self.proxymodel.setDynamicSortFilter(False)
        self.proxymodel.setSourceModel(self.model)

        self.view = QTableView()
        self.view.setModel(self.proxymodel)
        self.view.setItemDelegateForColumn(2, ComboBoxDelegate(self.view))
        self.view.setEditTriggers(QAbstractItemView.AllEditTriggers)
        self.view.verticalHeader().setVisible(False)
        self.view.horizontalHeader().setStretchLastSection(True)
        self.view.setShowGrid(False)
        self.view.setSelectionMode(QAbstractItemView.NoSelection)
        self.view.setSortingEnabled(True)
        self.view.sortByColumn(0, Qt.AscendingOrder)

        vbox = QVBoxLayout(self)
        vbox.addWidget(self.view)
        self.buttonbox = QDialogButtonBox(QDialogButtonBox.Ok
                                          | QDialogButtonBox.Cancel)
        vbox.addWidget(self.buttonbox)
        self.buttonbox.accepted.connect(self.accept)
        self.buttonbox.rejected.connect(self.reject)

        self.resize(500, 650)
        self.view.setColumnWidth(0, 75)
        self.view.setColumnWidth(1, 150)
        self.view.setColumnWidth(2, 90)
class ProposalsWidget(QWidget):
    """Widget that displays masternode budget proposals."""
    def __init__(self, dialog, model, parent=None):
        super(ProposalsWidget, self).__init__(parent)
        self.dialog = dialog
        self.manager = dialog.manager

        self.model = model
        self.proxy_model = QSortFilterProxyModel()
        self.proxy_model.setSourceModel(self.model)
        self.view = QTableView()
        self.view.setModel(self.proxy_model)
        self.view.setSortingEnabled(True)

        self.view.setSelectionMode(QAbstractItemView.SingleSelection)
        self.view.setSelectionBehavior(QAbstractItemView.SelectRows)

        header = self.view.horizontalHeader()
        header.setHighlightSections(False)
        header.setResizeMode(self.model.NAME, QHeaderView.ResizeToContents)
        header.setResizeMode(self.model.URL, QHeaderView.Stretch)
        header.setResizeMode(self.model.ADDRESS, QHeaderView.ResizeToContents)
        header.setResizeMode(self.model.TXID, QHeaderView.ResizeToContents)

        self.view.verticalHeader().setVisible(False)
        self.view.sortByColumn(self.model.NAME, Qt.AscendingOrder)
        self.view.selectionModel().selectionChanged.connect(self.on_view_selection_changed)

        self.editor = ProposalEditor(self)

        vbox = QVBoxLayout()
        vbox.setContentsMargins(0, 0, 0, 0)
        vbox.addWidget(QLabel(_('Proposals:')))
        vbox.addWidget(self.view)
        vbox.addWidget(self.editor)
        self.setLayout(vbox)

    def on_view_selection_changed(self, selected, deselected):
        """Update the data widget mapper."""
        idx = 0
        try:
            idx = selected.indexes()[0]
        except IndexError:
            pass
        self.editor.mapper.setCurrentIndex(idx.row())
Exemple #38
0
class comic_meta_data_editor(QDialog):
    configGroup = "ComicsProjectManagementTools"

    # Translatable genre dictionary that has it's translated entries added to the genrelist and from which the untranslated items are taken.
    acbfGenreList = {
        "science_fiction": str(i18n("Science Fiction")),
        "fantasy": str(i18n("Fantasy")),
        "adventure": str(i18n("Adventure")),
        "horror": str(i18n("Horror")),
        "mystery": str(i18n("Mystery")),
        "crime": str(i18n("Crime")),
        "military": str(i18n("Military")),
        "real_life": str(i18n("Real Life")),
        "superhero": str(i18n("Superhero")),
        "humor": str(i18n("Humor")),
        "western": str(i18n("Western")),
        "manga": str(i18n("Manga")),
        "politics": str(i18n("Politics")),
        "caricature": str(i18n("Caricature")),
        "sports": str(i18n("Sports")),
        "history": str(i18n("History")),
        "biography": str(i18n("Biography")),
        "education": str(i18n("Education")),
        "computer": str(i18n("Computer")),
        "religion": str(i18n("Religion")),
        "romance": str(i18n("Romance")),
        "children": str(i18n("Children")),
        "non-fiction": str(i18n("Non Fiction")),
        "adult": str(i18n("Adult")),
        "alternative": str(i18n("Alternative")),
        "other": str(i18n("Other"))
    }
    acbfAuthorRolesList = {
        "Writer": str(i18n("Writer")),
        "Adapter": str(i18n("Adapter")),
        "Artist": str(i18n("Artist")),
        "Penciller": str(i18n("Penciller")),
        "Inker": str(i18n("Inker")),
        "Colorist": str(i18n("Colorist")),
        "Letterer": str(i18n("Letterer")),
        "Cover Artist": str(i18n("Cover Artist")),
        "Photographer": str(i18n("Photographer")),
        "Editor": str(i18n("Editor")),
        "Assistant Editor": str(i18n("Assistant Editor")),
        "Translator": str(i18n("Translator")),
        "Other": str(i18n("Other"))
    }

    def __init__(self):
        super().__init__()
        # Get the keys for the autocompletion.
        self.genreKeysList = []
        self.characterKeysList = []
        self.ratingKeysList = {}
        self.formatKeysList = []
        self.otherKeysList = []
        self.authorRoleList = []
        for g in self.acbfGenreList.values():
            self.genreKeysList.append(g)
        for r in self.acbfAuthorRolesList.values():
            self.authorRoleList.append(r)
        mainP = Path(os.path.abspath(__file__)).parent
        self.get_auto_completion_keys(mainP)
        extraKeyP = Path(QDir.homePath()) / Application.readSetting(
            self.configGroup, "extraKeysLocation", str())
        self.get_auto_completion_keys(extraKeyP)

        # Setup the dialog.
        self.setLayout(QVBoxLayout())
        mainWidget = QTabWidget()
        self.layout().addWidget(mainWidget)
        self.setWindowTitle(i18n("Comic Metadata"))
        buttons = QDialogButtonBox(QDialogButtonBox.Ok
                                   | QDialogButtonBox.Cancel)
        self.layout().addWidget(buttons)
        buttons.accepted.connect(self.accept)
        buttons.rejected.connect(self.reject)

        # Title, concept, summary, genre, characters, format, rating, language, series, other keywords
        metadataPage = QWidget()
        mformLayout = QFormLayout()
        metadataPage.setLayout(mformLayout)

        self.lnTitle = QLineEdit()
        self.lnTitle.setToolTip(i18n("The proper title of the comic."))

        self.teSummary = QPlainTextEdit()
        self.teSummary.setToolTip(
            i18n("What will you tell others to entice them to read your comic?"
                 ))

        self.lnGenre = QLineEdit()
        genreCompletion = multi_entry_completer()
        genreCompletion.setModel(QStringListModel(self.genreKeysList))
        self.lnGenre.setCompleter(genreCompletion)
        genreCompletion.setCaseSensitivity(False)
        self.lnGenre.setToolTip(
            i18n(
                "The genre of the work. Prefilled values are from the ACBF, but you can fill in your own. Separate genres with commas. Try to limit the amount to about two or three"
            ))

        self.lnCharacters = QLineEdit()
        characterCompletion = multi_entry_completer()
        characterCompletion.setModel(QStringListModel(self.characterKeysList))
        characterCompletion.setCaseSensitivity(False)
        characterCompletion.setFilterMode(
            Qt.MatchContains
        )  # So that if there is a list of names with last names, people can type in a last name.
        self.lnCharacters.setCompleter(characterCompletion)
        self.lnCharacters.setToolTip(
            i18n(
                "The names of the characters that this comic revolves around. Comma-separated."
            ))

        self.lnFormat = QLineEdit()
        formatCompletion = multi_entry_completer()
        formatCompletion.setModel(QStringListModel(self.formatKeysList))
        formatCompletion.setCaseSensitivity(False)
        self.lnFormat.setCompleter(formatCompletion)

        ratingLayout = QHBoxLayout()
        self.cmbRatingSystem = QComboBox()
        self.cmbRatingSystem.addItems(self.ratingKeysList.keys())
        self.cmbRatingSystem.setEditable(True)
        self.cmbRating = QComboBox()
        self.cmbRating.setEditable(True)
        self.cmbRatingSystem.currentIndexChanged.connect(
            self.slot_refill_ratings)
        ratingLayout.addWidget(self.cmbRatingSystem)
        ratingLayout.addWidget(self.cmbRating)

        self.lnSeriesName = QLineEdit()
        self.lnSeriesName.setToolTip(
            i18n(
                "If this is part of a series, enter the name of the series and the number."
            ))
        self.spnSeriesNumber = QSpinBox()
        self.spnSeriesNumber.setPrefix("No. ")
        self.spnSeriesVol = QSpinBox()
        self.spnSeriesVol.setPrefix("Vol. ")
        seriesLayout = QHBoxLayout()
        seriesLayout.addWidget(self.lnSeriesName)
        seriesLayout.addWidget(self.spnSeriesVol)
        seriesLayout.addWidget(self.spnSeriesNumber)

        otherCompletion = multi_entry_completer()
        otherCompletion.setModel(QStringListModel(self.otherKeysList))
        otherCompletion.setCaseSensitivity(False)
        otherCompletion.setFilterMode(Qt.MatchContains)
        self.lnOtherKeywords = QLineEdit()
        self.lnOtherKeywords.setCompleter(otherCompletion)
        self.lnOtherKeywords.setToolTip(
            i18n(
                "Other keywords that don't fit in the previously mentioned sets. As always, comma-separated"
            ))

        self.cmbLanguage = language_combo_box()
        self.cmbReadingMode = QComboBox()
        self.cmbReadingMode.addItem(i18n("Left to Right"))
        self.cmbReadingMode.addItem(i18n("Right to Left"))

        self.cmbCoverPage = QComboBox()
        self.cmbCoverPage.setToolTip(
            i18n(
                "Which page is the cover page? This will be empty if there's no pages."
            ))

        mformLayout.addRow(i18n("Title:"), self.lnTitle)
        mformLayout.addRow(i18n("Cover Page:"), self.cmbCoverPage)
        mformLayout.addRow(i18n("Summary:"), self.teSummary)
        mformLayout.addRow(i18n("Language:"), self.cmbLanguage)
        mformLayout.addRow(i18n("Reading Direction:"), self.cmbReadingMode)
        mformLayout.addRow(i18n("Genre:"), self.lnGenre)
        mformLayout.addRow(i18n("Characters:"), self.lnCharacters)
        mformLayout.addRow(i18n("Format:"), self.lnFormat)
        mformLayout.addRow(i18n("Rating:"), ratingLayout)
        mformLayout.addRow(i18n("Series:"), seriesLayout)
        mformLayout.addRow(i18n("Other:"), self.lnOtherKeywords)

        mainWidget.addTab(metadataPage, i18n("Work"))

        # The page for the authors.
        authorPage = QWidget()
        authorPage.setLayout(QVBoxLayout())
        explanation = QLabel(
            i18n(
                "The following is a table of the authors that contributed to this comic. You can set their nickname, proper names (first, middle, last), Role (Penciller, Inker, etc), email and homepage."
            ))
        explanation.setWordWrap(True)
        self.authorModel = QStandardItemModel(0, 7)
        labels = [
            i18n("Nick Name"),
            i18n("Given Name"),
            i18n("Middle Name"),
            i18n("Family Name"),
            i18n("Role"),
            i18n("Email"),
            i18n("Homepage"),
            i18n("Language")
        ]
        self.authorModel.setHorizontalHeaderLabels(labels)
        self.authorTable = QTableView()
        self.authorTable.setModel(self.authorModel)
        self.authorTable.verticalHeader().setDragEnabled(True)
        self.authorTable.verticalHeader().setDropIndicatorShown(True)
        self.authorTable.verticalHeader().setSectionsMovable(True)
        self.authorTable.verticalHeader().sectionMoved.connect(
            self.slot_reset_author_row_visual)
        delegate = author_delegate()
        delegate.setCompleterData(self.authorRoleList, 4)
        delegate.setLanguageData(len(labels) - 1)
        self.authorTable.setItemDelegate(delegate)
        author_button_layout = QWidget()
        author_button_layout.setLayout(QHBoxLayout())
        btn_add_author = QPushButton(i18n("Add Author"))
        btn_add_author.clicked.connect(self.slot_add_author)
        btn_remove_author = QPushButton(i18n("Remove Author"))
        btn_remove_author.clicked.connect(self.slot_remove_author)
        author_button_layout.layout().addWidget(btn_add_author)
        author_button_layout.layout().addWidget(btn_remove_author)
        authorPage.layout().addWidget(explanation)
        authorPage.layout().addWidget(self.authorTable)
        authorPage.layout().addWidget(author_button_layout)
        mainWidget.addTab(authorPage, i18n("Authors"))

        # The page with publisher information.
        publisherPage = QWidget()
        publisherLayout = QFormLayout()
        publisherPage.setLayout(publisherLayout)
        self.publisherName = QLineEdit()
        self.publisherName.setToolTip(
            i18n(
                "The name of the company, group or person who is responsible for the final version the reader gets."
            ))
        publishDateLayout = QHBoxLayout()
        self.publishDate = QDateEdit()
        self.publishDate.setDisplayFormat(QLocale().system().dateFormat())
        currentDate = QPushButton(i18n("Set Today"))
        currentDate.setToolTip(
            i18n("Sets the publish date to the current date."))
        currentDate.clicked.connect(self.slot_set_date)
        publishDateLayout.addWidget(self.publishDate)
        publishDateLayout.addWidget(currentDate)
        self.publishCity = QLineEdit()
        self.publishCity.setToolTip(
            i18n(
                "Traditional publishers are always mentioned in source with the city they are located."
            ))
        self.isbn = QLineEdit()
        self.license = license_combo_box(
        )  # Maybe ought to make this a QLineEdit...
        self.license.setEditable(True)
        self.license.completer().setCompletionMode(QCompleter.PopupCompletion)
        publisherLayout.addRow(i18n("Name:"), self.publisherName)
        publisherLayout.addRow(i18n("City:"), self.publishCity)
        publisherLayout.addRow(i18n("Date:"), publishDateLayout)
        publisherLayout.addRow(i18n("ISBN:"), self.isbn)
        publisherLayout.addRow(i18n("License:"), self.license)

        mainWidget.addTab(publisherPage, i18n("Publisher"))

    """
    Ensure that the drag and drop of authors doesn't mess up the labels.
    """

    def slot_reset_author_row_visual(self):
        headerLabelList = []
        for i in range(self.authorTable.verticalHeader().count()):
            headerLabelList.append(str(i))
        for i in range(self.authorTable.verticalHeader().count()):
            logicalI = self.authorTable.verticalHeader().logicalIndex(i)
            headerLabelList[logicalI] = str(i + 1)
        self.authorModel.setVerticalHeaderLabels(headerLabelList)

    """
    Set the publish date to the current date.
    """

    def slot_set_date(self):
        self.publishDate.setDate(QDate().currentDate())

    """
    Append keys to autocompletion lists from the directory mainP.
    """

    def get_auto_completion_keys(self, mainP=Path()):
        genre = Path(mainP / "key_genre")
        characters = Path(mainP / "key_characters")
        rating = Path(mainP / "key_rating")
        format = Path(mainP / "key_format")
        keywords = Path(mainP / "key_other")
        authorRole = Path(mainP / "key_author_roles")
        if genre.exists():
            for t in list(genre.glob('**/*.txt')):
                file = open(str(t), "r", errors="replace")
                for l in file:
                    if str(l).strip("\n") not in self.genreKeysList:
                        self.genreKeysList.append(str(l).strip("\n"))
                file.close()
        if characters.exists():
            for t in list(characters.glob('**/*.txt')):
                file = open(str(t), "r", errors="replace")
                for l in file:
                    if str(l).strip("\n") not in self.characterKeysList:
                        self.characterKeysList.append(str(l).strip("\n"))
                file.close()
        if format.exists():
            for t in list(format.glob('**/*.txt')):
                file = open(str(t), "r", errors="replace")
                for l in file:
                    if str(l).strip("\n") not in self.formatKeysList:
                        self.formatKeysList.append(str(l).strip("\n"))
                file.close()
        if rating.exists():
            for t in list(rating.glob('**/*.csv')):
                file = open(str(t), "r", newline="", encoding="utf-8")
                ratings = csv.reader(file)
                title = os.path.basename(str(t))
                r = 0
                for row in ratings:
                    listItem = []
                    if r is 0:
                        title = row[1]
                    else:
                        listItem = self.ratingKeysList[title]
                        item = []
                        item.append(row[0])
                        item.append(row[1])
                        listItem.append(item)
                    self.ratingKeysList[title] = listItem
                    r += 1
                file.close()
        if keywords.exists():
            for t in list(keywords.glob('**/*.txt')):
                file = open(str(t), "r", errors="replace")
                for l in file:
                    if str(l).strip("\n") not in self.otherKeysList:
                        self.otherKeysList.append(str(l).strip("\n"))
                file.close()
        if authorRole.exists():
            for t in list(authorRole.glob('**/*.txt')):
                file = open(str(t), "r", errors="replace")
                for l in file:
                    if str(l).strip("\n") not in self.authorRoleList:
                        self.authorRoleList.append(str(l).strip("\n"))
                file.close()

    """
    Refill the ratings box.
    This is called whenever the rating system changes.
    """

    def slot_refill_ratings(self):
        if self.cmbRatingSystem.currentText() in self.ratingKeysList.keys():
            self.cmbRating.clear()
            model = QStandardItemModel()
            for i in self.ratingKeysList[self.cmbRatingSystem.currentText()]:
                item = QStandardItem()
                item.setText(i[0])
                item.setToolTip(i[1])
                model.appendRow(item)
            self.cmbRating.setModel(model)

    """
    Add an author with default values initialised.
    """

    def slot_add_author(self):
        listItems = []
        listItems.append(QStandardItem(i18n("Anon")))  # Nick name
        listItems.append(QStandardItem(i18n("John")))  # First name
        listItems.append(QStandardItem())  # Middle name
        listItems.append(QStandardItem(i18n("Doe")))  # Last name
        listItems.append(QStandardItem())  # role
        listItems.append(QStandardItem())  # email
        listItems.append(QStandardItem())  # homepage
        language = QLocale.system().name().split("_")[0]
        if language == "C":
            language = "en"
        listItems.append(QStandardItem(language))  # Language
        self.authorModel.appendRow(listItems)

    """
    Remove the selected author from the author list.
    """

    def slot_remove_author(self):
        self.authorModel.removeRow(self.authorTable.currentIndex().row())

    """
    Load the UI values from the config dictionary given.
    """

    def setConfig(self, config):

        if "title" in config.keys():
            self.lnTitle.setText(config["title"])
        self.teSummary.clear()
        if "pages" in config.keys():
            self.cmbCoverPage.clear()
            for page in config["pages"]:
                self.cmbCoverPage.addItem(page)
            if "cover" in config.keys():
                if config["cover"] in config["pages"]:
                    self.cmbCoverPage.setCurrentText(config["cover"])
        if "summary" in config.keys():
            self.teSummary.appendPlainText(config["summary"])
        if "genre" in config.keys():
            genreList = []
            for genre in config["genre"]:
                if genre in self.acbfGenreList.keys():
                    genreList.append(self.acbfGenreList[genre])
                else:
                    genreList.append(genre)
            self.lnGenre.setText(", ".join(genreList))
        if "characters" in config.keys():
            self.lnCharacters.setText(", ".join(config["characters"]))
        if "format" in config.keys():
            self.lnFormat.setText(", ".join(config["format"]))
        if "rating" in config.keys():
            self.cmbRating.setCurrentText(config["rating"])
        else:
            self.cmbRating.setCurrentText("")
        if "ratingSystem" in config.keys():
            self.cmbRatingSystem.setCurrentText(config["ratingSystem"])
        else:
            self.cmbRatingSystem.setCurrentText("")
        if "otherKeywords" in config.keys():
            self.lnOtherKeywords.setText(", ".join(config["otherKeywords"]))
        if "seriesName" in config.keys():
            self.lnSeriesName.setText(config["seriesName"])
        if "seriesVolume" in config.keys():
            self.spnSeriesVol.setValue(config["seriesVolume"])
        if "seriesNumber" in config.keys():
            self.spnSeriesNumber.setValue(config["seriesNumber"])
        if "language" in config.keys():
            code = config["language"]
            if "_" in code:
                code = code.split("_")[0]
            self.cmbLanguage.setEntryToCode(code)
        if "readingDirection" in config.keys():
            if config["readingDirection"] is "leftToRight":
                self.cmbReadingMode.setCurrentIndex(0)
            else:
                self.cmbReadingMode.setCurrentIndex(1)
        else:
            self.cmbReadingMode.setCurrentIndex(
                QLocale(
                    self.cmbLanguage.codeForCurrentEntry()).textDirection())
        if "publisherName" in config.keys():
            self.publisherName.setText(config["publisherName"])
        if "publisherCity" in config.keys():
            self.publishCity.setText(config["publisherCity"])
        if "publishingDate" in config.keys():
            self.publishDate.setDate(
                QDate.fromString(config["publishingDate"], Qt.ISODate))
        if "isbn-number" in config.keys():
            self.isbn.setText(config["isbn-number"])
        if "license" in config.keys():
            self.license.setCurrentText(config["license"])
        else:
            self.license.setCurrentText(
                ""
            )  # I would like to keep it ambiguous whether the artist has thought about the license or not.
        if "authorList" in config.keys():
            authorList = config["authorList"]
            for i in range(len(authorList)):
                author = authorList[i]
                if len(author.keys()) > 0:
                    listItems = []
                    authorNickName = QStandardItem()
                    if "nickname" in author.keys():
                        authorNickName.setText(author["nickname"])
                    listItems.append(authorNickName)
                    authorFirstName = QStandardItem()
                    if "first-name" in author.keys():
                        authorFirstName.setText(author["first-name"])
                    listItems.append(authorFirstName)
                    authorMiddleName = QStandardItem()
                    if "initials" in author.keys():
                        authorMiddleName.setText(author["initials"])
                    listItems.append(authorMiddleName)
                    authorLastName = QStandardItem()
                    if "last-name" in author.keys():
                        authorLastName.setText(author["last-name"])
                    listItems.append(authorLastName)
                    authorRole = QStandardItem()
                    if "role" in author.keys():
                        role = author["role"]
                        if author["role"] in self.acbfAuthorRolesList.keys():
                            role = self.acbfAuthorRolesList[author["role"]]
                        authorRole.setText(role)
                    listItems.append(authorRole)
                    authorEMail = QStandardItem()
                    if "email" in author.keys():
                        authorEMail.setText(author["email"])
                    listItems.append(authorEMail)
                    authorHomePage = QStandardItem()
                    if "homepage" in author.keys():
                        authorHomePage.setText(author["homepage"])
                    listItems.append(authorHomePage)
                    authorLanguage = QStandardItem()
                    if "language" in author.keys():
                        authorLanguage.setText(author["language"])
                        pass
                    listItems.append(authorLanguage)
                    self.authorModel.appendRow(listItems)
        else:
            self.slot_add_author()

    """
    Store the GUI values into the config dictionary given.
    
    @return the config diactionary filled with new values.
    """

    def getConfig(self, config):

        text = self.lnTitle.text()
        if len(text) > 0 and text.isspace() is False:
            config["title"] = text
        elif "title" in config.keys():
            config.pop("title")
        config["cover"] = self.cmbCoverPage.currentText()
        listkeys = self.lnGenre.text()
        if len(listkeys) > 0 and listkeys.isspace() is False:
            genreList = []
            for genre in self.lnGenre.text().split(", "):
                if genre in self.acbfGenreList.values():
                    i = list(self.acbfGenreList.values()).index(genre)
                    genreList.append(list(self.acbfGenreList.keys())[i])
                else:
                    genreList.append(genre)
            config["genre"] = genreList
        elif "genre" in config.keys():
            config.pop("genre")
        listkeys = self.lnCharacters.text()
        if len(listkeys) > 0 and listkeys.isspace() is False:
            config["characters"] = self.lnCharacters.text().split(", ")
        elif "characters" in config.keys():
            config.pop("characters")
        listkeys = self.lnFormat.text()
        if len(listkeys) > 0 and listkeys.isspace() is False:
            config["format"] = self.lnFormat.text().split(", ")
        elif "format" in config.keys():
            config.pop("format")
        config["ratingSystem"] = self.cmbRatingSystem.currentText()
        config["rating"] = self.cmbRating.currentText()
        listkeys = self.lnOtherKeywords.text()
        if len(listkeys) > 0 and listkeys.isspace() is False:
            config["otherKeywords"] = self.lnOtherKeywords.text().split(", ")
        elif "characters" in config.keys():
            config.pop("otherKeywords")
        text = self.teSummary.toPlainText()
        if len(text) > 0 and text.isspace() is False:
            config["summary"] = text
        elif "summary" in config.keys():
            config.pop("summary")
        if len(self.lnSeriesName.text()) > 0:
            config["seriesName"] = self.lnSeriesName.text()
            config["seriesNumber"] = self.spnSeriesNumber.value()
            if self.spnSeriesVol.value() > 0:
                config["seriesVolume"] = self.spnSeriesVol.value()
        config["language"] = str(self.cmbLanguage.codeForCurrentEntry())
        if self.cmbReadingMode is Qt.LeftToRight:
            config["readingDirection"] = "leftToRight"
        else:
            config["readingDirection"] = "rightToLeft"
        authorList = []
        for row in range(self.authorTable.verticalHeader().count()):
            logicalIndex = self.authorTable.verticalHeader().logicalIndex(row)
            listEntries = [
                "nickname", "first-name", "initials", "last-name", "role",
                "email", "homepage", "language"
            ]
            author = {}
            for i in range(len(listEntries)):
                entry = self.authorModel.data(
                    self.authorModel.index(logicalIndex, i))
                if entry is None:
                    entry = " "
                if entry.isspace() is False and len(entry) > 0:
                    if listEntries[i] == "role":
                        if entry in self.acbfAuthorRolesList.values():
                            entryI = list(
                                self.acbfAuthorRolesList.values()).index(entry)
                            entry = list(
                                self.acbfAuthorRolesList.keys())[entryI]
                    author[listEntries[i]] = entry
                elif listEntries[i] in author.keys():
                    author.pop(listEntries[i])
            authorList.append(author)
        config["authorList"] = authorList
        config["publisherName"] = self.publisherName.text()
        config["publisherCity"] = self.publishCity.text()
        config["publishingDate"] = self.publishDate.date().toString(Qt.ISODate)
        config["isbn-number"] = self.isbn.text()
        config["license"] = self.license.currentText()

        return config
Exemple #39
0
    def initUI(self):
        self.setWindowTitle(self.title)
        self.setGeometry(self.left, self.top, self.width, self.height)

        pasteBox = QHBoxLayout()
        self.textLine = QLineEdit()
        self.textLine.setToolTip('Current Director/selected File')
        self.pasteButton = QToolButton()
        self.pasteButton.setEnabled(False)
        self.pasteButton.setText('Paste')
        self.pasteButton.setToolTip(
            'Copy file from copy path to current directory/file')
        self.pasteButton.clicked.connect(self.paste)
        self.pasteButton.hide()
        pasteBox.addWidget(self.textLine)
        pasteBox.addWidget(self.pasteButton)

        self.copyBox = QFrame()
        hbox = QHBoxLayout()
        hbox.setContentsMargins(0, 0, 0, 0)
        self.copyLine = QLineEdit()
        self.copyLine.setToolTip('File path to copy from, when pasting')
        self.copyButton = QToolButton()
        self.copyButton.setText('Copy')
        self.copyButton.setToolTip('Record current file as copy path')
        self.copyButton.clicked.connect(self.recordCopyPath)
        hbox.addWidget(self.copyButton)
        hbox.addWidget(self.copyLine)
        self.copyBox.setLayout(hbox)
        self.copyBox.hide()

        self.model = QFileSystemModel()
        self.model.setRootPath(QDir.currentPath())
        self.model.setFilter(QDir.AllDirs | QDir.NoDot | QDir.Files)
        self.model.setNameFilterDisables(False)
        self.model.rootPathChanged.connect(self.folderChanged)

        self.list = QListView()
        self.list.setModel(self.model)
        self.list.resize(640, 480)
        self.list.clicked[QModelIndex].connect(self.listClicked)
        self.list.activated.connect(self._getPathActivated)
        self.list.setAlternatingRowColors(True)
        self.list.hide()

        self.table = QTableView()
        self.table.setModel(self.model)
        self.table.resize(640, 480)
        self.table.clicked[QModelIndex].connect(self.listClicked)
        self.table.activated.connect(self._getPathActivated)
        self.table.setAlternatingRowColors(True)

        header = self.table.horizontalHeader()
        header.setSectionResizeMode(0, QHeaderView.Stretch)
        header.setSectionResizeMode(1, QHeaderView.ResizeToContents)
        header.setSectionResizeMode(3, QHeaderView.ResizeToContents)
        header.swapSections(1, 3)
        header.setSortIndicator(1, Qt.AscendingOrder)
        self.table.setSortingEnabled(True)
        self.table.setColumnHidden(2, True)  # type
        self.table.verticalHeader().setVisible(False)  # row count header

        self.cb = QComboBox()
        self.cb.currentIndexChanged.connect(self.filterChanged)
        self.fillCombobox(INFO.PROGRAM_FILTERS_EXTENSIONS)
        self.cb.setMinimumHeight(30)
        self.cb.setSizePolicy(QSizePolicy(QSizePolicy.Fixed,
                                          QSizePolicy.Fixed))

        self.button2 = QToolButton()
        self.button2.setText('User')
        self.button2.setSizePolicy(
            QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed))
        self.button2.setMinimumSize(60, 30)
        self.button2.setToolTip(
            'Jump to User directory.\nLong press for Options.')
        self.button2.clicked.connect(self.onJumpClicked)

        self.button3 = QToolButton()
        self.button3.setText('Add Jump')
        self.button3.setSizePolicy(
            QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed))
        self.button3.setMinimumSize(60, 30)
        self.button3.setToolTip('Add current directory to jump button list')
        self.button3.clicked.connect(self.onActionClicked)

        self.settingMenu = QMenu(self)
        self.button2.setMenu(self.settingMenu)

        hbox = QHBoxLayout()
        hbox.addWidget(self.button2)
        hbox.addWidget(self.button3)
        hbox.insertStretch(2, stretch=0)
        hbox.addWidget(self.cb)

        windowLayout = QVBoxLayout()
        windowLayout.addLayout(pasteBox)
        windowLayout.addWidget(self.copyBox)
        windowLayout.addWidget(self.list)
        windowLayout.addWidget(self.table)
        windowLayout.addLayout(hbox)
        self.setLayout(windowLayout)
        self.show()
Exemple #40
0
class FileManager(QWidget, _HalWidgetBase):
    def __init__(self, parent=None):
        super(FileManager, self).__init__(parent)
        self.title = 'Qtvcp File System View'
        self.left = 10
        self.top = 10
        self.width = 640
        self.height = 480
        self._last = 0

        if INFO.PROGRAM_PREFIX is not None:
            self.user_path = os.path.expanduser(INFO.PROGRAM_PREFIX)
        else:
            self.user_path = (os.path.join(os.path.expanduser('~'),
                                           'linuxcnc/nc_files'))
        user = os.path.split(os.path.expanduser('~'))[-1]
        self.media_path = (os.path.join('/media', user))
        temp = [('User', self.user_path), ('Media', self.media_path)]
        self._jumpList = OrderedDict(temp)
        self.currentPath = None
        self.currentFolder = None
        self.PREFS_ = None
        self.initUI()

    def initUI(self):
        self.setWindowTitle(self.title)
        self.setGeometry(self.left, self.top, self.width, self.height)

        pasteBox = QHBoxLayout()
        self.textLine = QLineEdit()
        self.textLine.setToolTip('Current Director/selected File')
        self.pasteButton = QToolButton()
        self.pasteButton.setEnabled(False)
        self.pasteButton.setText('Paste')
        self.pasteButton.setToolTip(
            'Copy file from copy path to current directory/file')
        self.pasteButton.clicked.connect(self.paste)
        self.pasteButton.hide()
        pasteBox.addWidget(self.textLine)
        pasteBox.addWidget(self.pasteButton)

        self.copyBox = QFrame()
        hbox = QHBoxLayout()
        hbox.setContentsMargins(0, 0, 0, 0)
        self.copyLine = QLineEdit()
        self.copyLine.setToolTip('File path to copy from, when pasting')
        self.copyButton = QToolButton()
        self.copyButton.setText('Copy')
        self.copyButton.setToolTip('Record current file as copy path')
        self.copyButton.clicked.connect(self.recordCopyPath)
        hbox.addWidget(self.copyButton)
        hbox.addWidget(self.copyLine)
        self.copyBox.setLayout(hbox)
        self.copyBox.hide()

        self.model = QFileSystemModel()
        self.model.setRootPath(QDir.currentPath())
        self.model.setFilter(QDir.AllDirs | QDir.NoDot | QDir.Files)
        self.model.setNameFilterDisables(False)
        self.model.rootPathChanged.connect(self.folderChanged)

        self.list = QListView()
        self.list.setModel(self.model)
        self.list.resize(640, 480)
        self.list.clicked[QModelIndex].connect(self.listClicked)
        self.list.activated.connect(self._getPathActivated)
        self.list.setAlternatingRowColors(True)
        self.list.hide()

        self.table = QTableView()
        self.table.setModel(self.model)
        self.table.resize(640, 480)
        self.table.clicked[QModelIndex].connect(self.listClicked)
        self.table.activated.connect(self._getPathActivated)
        self.table.setAlternatingRowColors(True)

        header = self.table.horizontalHeader()
        header.setSectionResizeMode(0, QHeaderView.Stretch)
        header.setSectionResizeMode(1, QHeaderView.ResizeToContents)
        header.setSectionResizeMode(3, QHeaderView.ResizeToContents)
        header.swapSections(1, 3)
        header.setSortIndicator(1, Qt.AscendingOrder)
        self.table.setSortingEnabled(True)
        self.table.setColumnHidden(2, True)  # type
        self.table.verticalHeader().setVisible(False)  # row count header

        self.cb = QComboBox()
        self.cb.currentIndexChanged.connect(self.filterChanged)
        self.fillCombobox(INFO.PROGRAM_FILTERS_EXTENSIONS)
        self.cb.setMinimumHeight(30)
        self.cb.setSizePolicy(QSizePolicy(QSizePolicy.Fixed,
                                          QSizePolicy.Fixed))

        self.button2 = QToolButton()
        self.button2.setText('User')
        self.button2.setSizePolicy(
            QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed))
        self.button2.setMinimumSize(60, 30)
        self.button2.setToolTip(
            'Jump to User directory.\nLong press for Options.')
        self.button2.clicked.connect(self.onJumpClicked)

        self.button3 = QToolButton()
        self.button3.setText('Add Jump')
        self.button3.setSizePolicy(
            QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed))
        self.button3.setMinimumSize(60, 30)
        self.button3.setToolTip('Add current directory to jump button list')
        self.button3.clicked.connect(self.onActionClicked)

        self.settingMenu = QMenu(self)
        self.button2.setMenu(self.settingMenu)

        hbox = QHBoxLayout()
        hbox.addWidget(self.button2)
        hbox.addWidget(self.button3)
        hbox.insertStretch(2, stretch=0)
        hbox.addWidget(self.cb)

        windowLayout = QVBoxLayout()
        windowLayout.addLayout(pasteBox)
        windowLayout.addWidget(self.copyBox)
        windowLayout.addWidget(self.list)
        windowLayout.addWidget(self.table)
        windowLayout.addLayout(hbox)
        self.setLayout(windowLayout)
        self.show()

    def _hal_init(self):
        if self.PREFS_:
            last_path = self.PREFS_.getpref('last_loaded_directory',
                                            self.user_path, str,
                                            'BOOK_KEEPING')
            LOG.debug("lAST FILE PATH: {}".format(last_path))
            if not last_path == '':
                self.updateDirectoryView(last_path)
            else:
                self.updateDirectoryView(self.user_path)

            # get all the saved jumplist paths
            temp = self.PREFS_.getall('FILEMANAGER_JUMPLIST')
            self._jumpList.update(temp)

        else:
            LOG.debug("lAST FILE PATH: {}".format(self.user_path))
            self.updateDirectoryView(self.user_path)

        # install jump paths into toolbutton menu
        for i in self._jumpList:
            self.addAction(i)

    #########################
    # callbacks
    #########################

    # add shown text and hidden filter data from the INI
    def fillCombobox(self, data):
        for i in data:
            self.cb.addItem(i[0], i[1])

    def folderChanged(self, data):
        data = os.path.normpath(data)
        self.currentFolder = data
        self.textLine.setText(data)

    def updateDirectoryView(self, path, quiet=False):
        if os.path.exists(path):
            self.list.setRootIndex(self.model.setRootPath(path))
            self.table.setRootIndex(self.model.setRootPath(path))
        else:
            LOG.debug(
                "Set directory view error - no such path {}".format(path))
            if not quiet:
                STATUS.emit(
                    'error', LOW_ERROR,
                    "File Manager error - No such path: {}".format(path))

    # retrieve selected filter (it's held as QT.userData)
    def filterChanged(self, index):
        userdata = self.cb.itemData(index)
        self.model.setNameFilters(userdata)

    def listClicked(self, index):
        # the signal passes the index of the clicked item
        dir_path = os.path.normpath(self.model.filePath(index))
        if self.model.fileInfo(index).isFile():
            self.currentPath = dir_path
            self.textLine.setText(self.currentPath)
            return
        root_index = self.model.setRootPath(dir_path)
        self.list.setRootIndex(root_index)
        self.table.setRootIndex(root_index)

    def onUserClicked(self):
        self.showUserDir()

    def onMediaClicked(self):
        self.showMediaDir()

    # jump directly to a saved path shown on the button
    def onJumpClicked(self):
        data = self.button2.text()
        if data.upper() == 'MEDIA':
            self.showMediaDir()
        elif data.upper() == 'USER':
            self.showUserDir()
        else:
            temp = self._jumpList.get(data)
            if temp is not None:
                self.updateDirectoryView(temp)
            else:
                STATUS.emit('error', linuxcnc.OPERATOR_ERROR,
                            'file jumopath: {} not valid'.format(data))
                log.debug('file jumopath: {} not valid'.format(data))

    # jump directly to a saved path from the menu
    def jumpTriggered(self, data):
        if data.upper() == 'MEDIA':
            self.button2.setText('{}'.format(data))
            self.button2.setToolTip(
                'Jump to Media directory.\nLong press for Options.')
            self.showMediaDir()
        elif data.upper() == 'USER':
            self.button2.setText('{}'.format(data))
            self.button2.setToolTip(
                'Jump to User directory.\nLong press for Options.')
            self.showUserDir()
        else:
            self.button2.setText('{}'.format(data))
            self.button2.setToolTip('Jump to directory:\n{}'.format(
                self._jumpList.get(data)))
            self.updateDirectoryView(self._jumpList.get(data))

    # add a jump list path
    def onActionClicked(self):
        i = self.currentFolder
        try:
            self._jumpList[i] = i
        except Exception as e:
            print(e)
        button = QAction(QIcon.fromTheme('user-home'), i, self)
        # weird lambda i=i to work around 'function closure'
        button.triggered.connect(lambda state, i=i: self.jumpTriggered(i))
        self.settingMenu.addAction(button)

    # get current selection and update the path
    # then if the path is good load it into linuxcnc
    # record it in the preference file if available
    def _getPathActivated(self):
        if self.list.isVisible():
            row = self.list.selectionModel().currentIndex()
        else:
            row = self.table.selectionModel().currentIndex()
            self.listClicked(row)

        fname = self.currentPath
        if fname is None:
            return
        if fname:
            self.load(fname)

    def recordCopyPath(self):
        data, isFile = self.getCurrentSelected()
        if isFile:
            self.copyLine.setText(os.path.normpath(data))
            self.pasteButton.setEnabled(True)
        else:
            self.copyLine.setText('')
            self.pasteButton.setEnabled(False)
            STATUS.emit('error', OPERATOR_ERROR,
                        'Can only copy a file, not a folder')

    def paste(self):
        res = self.copyFile(self.copyLine.text(), self.textLine.text())
        if res:
            self.copyLine.setText('')
            self.pasteButton.setEnabled(False)

    ########################
    # helper functions
    ########################

    def addAction(self, i):
        axisButton = QAction(QIcon.fromTheme('user-home'), i, self)
        # weird lambda i=i to work around 'function closure'
        axisButton.triggered.connect(lambda state, i=i: self.jumpTriggered(i))
        self.settingMenu.addAction(axisButton)

    def showList(self, state=True):
        if state:
            self.table.hide()
            self.list.show()
        else:
            self.table.show()
            self.list.hide()

    def showTable(self, state=True):
        self.showList(not state)

    def showCopyControls(self, state):
        if state:
            self.copyBox.show()
            self.pasteButton.show()
        else:
            self.copyBox.hide()
            self.pasteButton.hide()

    def showMediaDir(self, quiet=False):
        self.updateDirectoryView(self.media_path, quiet)

    def showUserDir(self, quiet=False):
        self.updateDirectoryView(self.user_path, quiet)

    def copyFile(self, s, d):
        try:
            shutil.copy(s, d)
            return True
        except Exception as e:
            LOG.error("Copy file error: {}".format(e))
            STATUS.emit('error', OPERATOR_ERROR,
                        "Copy file error: {}".format(e))
            return False

    @pyqtSlot(float)
    @pyqtSlot(int)
    def scroll(self, data):
        if data > self._last:
            self.up()
        elif data < self._last:
            self.down()
        self._last = data

    # moves the selection up
    # used with MPG scrolling
    def up(self):
        self.select_row('up')

    # moves the selection down
    # used with MPG scrolling
    def down(self):
        self.select_row('down')

    def select_row(self, style='down'):
        style = style.lower()
        if self.list.isVisible():
            i = self.list.rootIndex()
            selectionModel = self.list.selectionModel()
        else:
            i = self.table.rootIndex()
            selectionModel = self.table.selectionModel()

        row = selectionModel.currentIndex().row()
        self.rows = self.model.rowCount(i)

        if style == 'last':
            row = self.rows
        elif style == 'up':
            if row > 0:
                row -= 1
            else:
                row = 0
        elif style == 'down':
            if row < self.rows - 1:
                row += 1
            else:
                row = self.rows - 1
        else:
            return
        top = self.model.index(row, 0, i)
        selectionModel.setCurrentIndex(
            top, QItemSelectionModel.Select | QItemSelectionModel.Rows)
        selection = QItemSelection(top, top)
        selectionModel.clearSelection()
        selectionModel.select(selection, QItemSelectionModel.Select)

    # returns the current highlighted (selected) path as well as
    # whether it's a file or not.
    def getCurrentSelected(self):
        if self.list.isVisible():
            selectionModel = self.list.selectionModel()
        else:
            selectionModel = self.table.selectionModel()
        index = selectionModel.currentIndex()
        dir_path = os.path.normpath(self.model.filePath(index))
        if self.model.fileInfo(index).isFile():
            return (dir_path, True)
        else:
            return (dir_path, False)

    # This can be class patched to do something else
    def load(self, fname=None):
        try:
            if fname is None:
                self._getPathActivated()
                return
            self.recordBookKeeping()
            ACTION.OPEN_PROGRAM(fname)
            STATUS.emit('update-machine-log', 'Loaded: ' + fname, 'TIME')
        except Exception as e:
            LOG.error("Load file error: {}".format(e))
            STATUS.emit('error', NML_ERROR, "Load file error: {}".format(e))

    # This can be class patched to do something else
    def recordBookKeeping(self):
        fname = self.currentPath
        if fname is None:
            return
        if self.PREFS_:
            self.PREFS_.putpref('last_loaded_directory', self.model.rootPath(),
                                str, 'BOOK_KEEPING')
            self.PREFS_.putpref('RecentPath_0', fname, str, 'BOOK_KEEPING')

    # when qtvcp closes this gets called
    # record jump list paths
    def closing_cleanup__(self):
        if self.PREFS_:
            for i, key in enumerate(self._jumpList):
                if i in (0, 1):
                    continue
                self.PREFS_.putpref(key, self._jumpList.get(key), str,
                                    'FILEMANAGER_JUMPLIST')
Exemple #41
0
class MainWindow(QMainWindow):
    dominion_url = "https://dominion.games/"

    def __init__(self):
        super(MainWindow, self).__init__()
        self.desktop = QDesktopWidget()
        self.setWindowTitle("Dominion Battle Station")
        self.setWindowIcon(QIcon("media/favicon.ico"))
        self.setGeometry(self.desktop.screenGeometry(1))
        self.showMaximized()

        self.initUI()

        self.listening = False

    def initUI(self):
        self.mainwidget = QWidget(self)
        self.setCentralWidget(self.mainwidget)

        self.leftframe = QFrame(self.mainwidget)
        self.leftframe.setFrameStyle(QFrame.Box)
        self.rightframe = QFrame(self.mainwidget)
        self.mainhbox = QHBoxLayout()
        self.mainhbox.addWidget(self.leftframe)
        self.mainhbox.addWidget(self.rightframe)

        self.p1frame = QFrame(parent=self.leftframe)
        # self.p1frame.setStyle(QFrame.Panel)
        # self.p1frame.setFrameStyle(QFrame.Panel)
        self.p1tableview = QTableView(self.p1frame)

        self.p2frame = QGroupBox("Player 2", parent=self.leftframe)
        # self.p2frame.setFrameStyle(QFrame.Panel)
        # self.p2tableview = QTableView(self.p2frame)

        self.leftframevbox = QVBoxLayout()
        self.leftframevbox.addWidget(self.p1frame)
        self.leftframevbox.addWidget(self.p2frame)

        self.leftframe.setLayout(self.leftframevbox)

        self.mainwidget.setLayout(self.mainhbox)

        self.toolbar = self.addToolBar("Connect")

        start_browser = QAction(QIcon("media/favicon.ico"), "start", self)
        listener_status = QAction(
            QIcon(self.style().standardIcon(QStyle.SP_DialogNoButton)),
            "listen", self)
        self.autologin = QCheckBox("Auto-Login")

        start_browser.triggered.connect(self.start_webdriver)
        listener_status.triggered.connect(self.start_listener)

        self.toolbar.addAction(start_browser)
        self.toolbar.addWidget(self.autologin)
        self.toolbar.addAction(listener_status)

        self.show()

    def wait_for_presence_of_element(self, name, by, waittime=10):
        try:
            return WebDriverWait(self.webdriver, waittime).until(
                EC.presence_of_element_located((getattr(By, by), name)))
        except:
            print("Konnte Element nicht finden: ", name)

    def start_webdriver(self):
        self.webdriver = webdriver.Firefox()
        self.scraper = DominionScraper(self.webdriver)
        self.scraper.createtable.connect(self.createTable)
        self.webdriver.get(MainWindow.dominion_url)
        if self.autologin.isChecked():
            print("trying autologin")
            username_input = self.wait_for_presence_of_element(
                "username-input", "ID")
            username_input.clear()
            username_input.send_keys("schlafi")
            passwd_input = self.wait_for_presence_of_element(
                "password", "NAME")
            passwd_input.clear()
            passwd_input.send_keys("ganxta89")
            passwd_input.submit()

    def start_listener(self):
        if self.browser:
            self.listening = True
            # self.ListenThread.start()
        else:
            QMessageBox.critical(
                self, "Kein Webdriver",
                "Starte zuerst den Webdriver bevor du den Listener aktivierst",
                QMessageBox.Ok)

    # @pyqtSlot(int)
    # def update_label(self, text):
    #     self.testlabel.setText(str(text))

    @pyqtSlot(name="createTable")
    def createTable(self):
        print("trying to create table")
        self.p1tablemodle = PandasTable(
            self.scraper.game.getPlayerByName("schlafi").deck.cardcountTable)
        self.p1tableview.setModel(self.p1tablemodle)
Exemple #42
0
#
#     hb = QHBoxLayout()
#     hb.addWidget(ui)
#     # hb.addWidget(bot)
#
#     dia.setLayout(hb)
#     dia.show()
#     but = Button()
#     but.show()
#     # bot.show()
#     sys.exit(app.exec_())
#
if __name__ == '__main__':
    app = QApplication(sys.argv)
    app.setStyle("fusion")
    tab = QTableView()
    sti = QStandardItemModel()
    lista = []
    lista.append(QStandardItem())
    for i in range(3):
        lista.append(QStandardItem(str(i)))
    sti.appendRow(lista)
    tab.setModel(sti)
    # wid = QWidget()
    wid = ComplexLabel(tab)
    # vbox = QVBoxLayout()
    # vbox.addWidget(QLabel('hello'))
    # labIcon = QLabel()
    # icon = QIcon('sunny.ico')
    # icon2 = QIcon('iconSpese.ico')
    # icon.pixmap(QSize(64, 64))
Exemple #43
0
    def __init__(self):
        super().__init__()
        # Get the keys for the autocompletion.
        self.genreKeysList = []
        self.characterKeysList = []
        self.ratingKeysList = {}
        self.formatKeysList = []
        self.otherKeysList = []
        self.authorRoleList = []
        for g in self.acbfGenreList.values():
            self.genreKeysList.append(g)
        for r in self.acbfAuthorRolesList.values():
            self.authorRoleList.append(r)
        mainP = Path(os.path.abspath(__file__)).parent
        self.get_auto_completion_keys(mainP)
        extraKeyP = Path(QDir.homePath()) / Application.readSetting(
            self.configGroup, "extraKeysLocation", str())
        self.get_auto_completion_keys(extraKeyP)

        # Setup the dialog.
        self.setLayout(QVBoxLayout())
        mainWidget = QTabWidget()
        self.layout().addWidget(mainWidget)
        self.setWindowTitle(i18n("Comic Metadata"))
        buttons = QDialogButtonBox(QDialogButtonBox.Ok
                                   | QDialogButtonBox.Cancel)
        self.layout().addWidget(buttons)
        buttons.accepted.connect(self.accept)
        buttons.rejected.connect(self.reject)

        # Title, concept, summary, genre, characters, format, rating, language, series, other keywords
        metadataPage = QWidget()
        mformLayout = QFormLayout()
        metadataPage.setLayout(mformLayout)

        self.lnTitle = QLineEdit()
        self.lnTitle.setToolTip(i18n("The proper title of the comic."))

        self.teSummary = QPlainTextEdit()
        self.teSummary.setToolTip(
            i18n("What will you tell others to entice them to read your comic?"
                 ))

        self.lnGenre = QLineEdit()
        genreCompletion = multi_entry_completer()
        genreCompletion.setModel(QStringListModel(self.genreKeysList))
        self.lnGenre.setCompleter(genreCompletion)
        genreCompletion.setCaseSensitivity(False)
        self.lnGenre.setToolTip(
            i18n(
                "The genre of the work. Prefilled values are from the ACBF, but you can fill in your own. Separate genres with commas. Try to limit the amount to about two or three"
            ))

        self.lnCharacters = QLineEdit()
        characterCompletion = multi_entry_completer()
        characterCompletion.setModel(QStringListModel(self.characterKeysList))
        characterCompletion.setCaseSensitivity(False)
        characterCompletion.setFilterMode(
            Qt.MatchContains
        )  # So that if there is a list of names with last names, people can type in a last name.
        self.lnCharacters.setCompleter(characterCompletion)
        self.lnCharacters.setToolTip(
            i18n(
                "The names of the characters that this comic revolves around. Comma-separated."
            ))

        self.lnFormat = QLineEdit()
        formatCompletion = multi_entry_completer()
        formatCompletion.setModel(QStringListModel(self.formatKeysList))
        formatCompletion.setCaseSensitivity(False)
        self.lnFormat.setCompleter(formatCompletion)

        ratingLayout = QHBoxLayout()
        self.cmbRatingSystem = QComboBox()
        self.cmbRatingSystem.addItems(self.ratingKeysList.keys())
        self.cmbRatingSystem.setEditable(True)
        self.cmbRating = QComboBox()
        self.cmbRating.setEditable(True)
        self.cmbRatingSystem.currentIndexChanged.connect(
            self.slot_refill_ratings)
        ratingLayout.addWidget(self.cmbRatingSystem)
        ratingLayout.addWidget(self.cmbRating)

        self.lnSeriesName = QLineEdit()
        self.lnSeriesName.setToolTip(
            i18n(
                "If this is part of a series, enter the name of the series and the number."
            ))
        self.spnSeriesNumber = QSpinBox()
        self.spnSeriesNumber.setPrefix("No. ")
        self.spnSeriesVol = QSpinBox()
        self.spnSeriesVol.setPrefix("Vol. ")
        seriesLayout = QHBoxLayout()
        seriesLayout.addWidget(self.lnSeriesName)
        seriesLayout.addWidget(self.spnSeriesVol)
        seriesLayout.addWidget(self.spnSeriesNumber)

        otherCompletion = multi_entry_completer()
        otherCompletion.setModel(QStringListModel(self.otherKeysList))
        otherCompletion.setCaseSensitivity(False)
        otherCompletion.setFilterMode(Qt.MatchContains)
        self.lnOtherKeywords = QLineEdit()
        self.lnOtherKeywords.setCompleter(otherCompletion)
        self.lnOtherKeywords.setToolTip(
            i18n(
                "Other keywords that don't fit in the previously mentioned sets. As always, comma-separated"
            ))

        self.cmbLanguage = language_combo_box()
        self.cmbReadingMode = QComboBox()
        self.cmbReadingMode.addItem(i18n("Left to Right"))
        self.cmbReadingMode.addItem(i18n("Right to Left"))

        self.cmbCoverPage = QComboBox()
        self.cmbCoverPage.setToolTip(
            i18n(
                "Which page is the cover page? This will be empty if there's no pages."
            ))

        mformLayout.addRow(i18n("Title:"), self.lnTitle)
        mformLayout.addRow(i18n("Cover Page:"), self.cmbCoverPage)
        mformLayout.addRow(i18n("Summary:"), self.teSummary)
        mformLayout.addRow(i18n("Language:"), self.cmbLanguage)
        mformLayout.addRow(i18n("Reading Direction:"), self.cmbReadingMode)
        mformLayout.addRow(i18n("Genre:"), self.lnGenre)
        mformLayout.addRow(i18n("Characters:"), self.lnCharacters)
        mformLayout.addRow(i18n("Format:"), self.lnFormat)
        mformLayout.addRow(i18n("Rating:"), ratingLayout)
        mformLayout.addRow(i18n("Series:"), seriesLayout)
        mformLayout.addRow(i18n("Other:"), self.lnOtherKeywords)

        mainWidget.addTab(metadataPage, i18n("Work"))

        # The page for the authors.
        authorPage = QWidget()
        authorPage.setLayout(QVBoxLayout())
        explanation = QLabel(
            i18n(
                "The following is a table of the authors that contributed to this comic. You can set their nickname, proper names (first, middle, last), Role (Penciller, Inker, etc), email and homepage."
            ))
        explanation.setWordWrap(True)
        self.authorModel = QStandardItemModel(0, 7)
        labels = [
            i18n("Nick Name"),
            i18n("Given Name"),
            i18n("Middle Name"),
            i18n("Family Name"),
            i18n("Role"),
            i18n("Email"),
            i18n("Homepage"),
            i18n("Language")
        ]
        self.authorModel.setHorizontalHeaderLabels(labels)
        self.authorTable = QTableView()
        self.authorTable.setModel(self.authorModel)
        self.authorTable.verticalHeader().setDragEnabled(True)
        self.authorTable.verticalHeader().setDropIndicatorShown(True)
        self.authorTable.verticalHeader().setSectionsMovable(True)
        self.authorTable.verticalHeader().sectionMoved.connect(
            self.slot_reset_author_row_visual)
        delegate = author_delegate()
        delegate.setCompleterData(self.authorRoleList, 4)
        delegate.setLanguageData(len(labels) - 1)
        self.authorTable.setItemDelegate(delegate)
        author_button_layout = QWidget()
        author_button_layout.setLayout(QHBoxLayout())
        btn_add_author = QPushButton(i18n("Add Author"))
        btn_add_author.clicked.connect(self.slot_add_author)
        btn_remove_author = QPushButton(i18n("Remove Author"))
        btn_remove_author.clicked.connect(self.slot_remove_author)
        author_button_layout.layout().addWidget(btn_add_author)
        author_button_layout.layout().addWidget(btn_remove_author)
        authorPage.layout().addWidget(explanation)
        authorPage.layout().addWidget(self.authorTable)
        authorPage.layout().addWidget(author_button_layout)
        mainWidget.addTab(authorPage, i18n("Authors"))

        # The page with publisher information.
        publisherPage = QWidget()
        publisherLayout = QFormLayout()
        publisherPage.setLayout(publisherLayout)
        self.publisherName = QLineEdit()
        self.publisherName.setToolTip(
            i18n(
                "The name of the company, group or person who is responsible for the final version the reader gets."
            ))
        publishDateLayout = QHBoxLayout()
        self.publishDate = QDateEdit()
        self.publishDate.setDisplayFormat(QLocale().system().dateFormat())
        currentDate = QPushButton(i18n("Set Today"))
        currentDate.setToolTip(
            i18n("Sets the publish date to the current date."))
        currentDate.clicked.connect(self.slot_set_date)
        publishDateLayout.addWidget(self.publishDate)
        publishDateLayout.addWidget(currentDate)
        self.publishCity = QLineEdit()
        self.publishCity.setToolTip(
            i18n(
                "Traditional publishers are always mentioned in source with the city they are located."
            ))
        self.isbn = QLineEdit()
        self.license = license_combo_box(
        )  # Maybe ought to make this a QLineEdit...
        self.license.setEditable(True)
        self.license.completer().setCompletionMode(QCompleter.PopupCompletion)
        publisherLayout.addRow(i18n("Name:"), self.publisherName)
        publisherLayout.addRow(i18n("City:"), self.publishCity)
        publisherLayout.addRow(i18n("Date:"), publishDateLayout)
        publisherLayout.addRow(i18n("ISBN:"), self.isbn)
        publisherLayout.addRow(i18n("License:"), self.license)

        mainWidget.addTab(publisherPage, i18n("Publisher"))
    def __init__(self, database, server, config):
        # Конструктор предка
        super().__init__()

        # База данных сервера
        self.database = database

        self.server_thread = server
        self.config = config

        # Ярлык выхода
        # self.exitAction = QAction('Выход', self)
        self.exitAction = QAction(QIcon(EXIT_IMG), 'Exit/Выход', self)
        self.exitAction.setShortcut('Ctrl+Q')
        self.exitAction.triggered.connect(qApp.quit)

        # Кнопка обновить список клиентов
        self.refresh_button = QAction('Обновить список', self)

        # Кнопка настроек сервера
        self.config_btn = QAction('Настройки сервера', self)

        # Кнопка регистрации пользователя
        self.register_btn = QAction('Регистрация пользователя', self)

        # Кнопка удаления пользователя
        self.remove_btn = QAction('Удаление пользователя', self)

        # Кнопка вывести историю сообщений
        self.show_history_button = QAction('История клиентов', self)

        # Статусбар
        self.statusBar()
        self.statusBar().showMessage('Server Working')

        # Тулбар
        self.toolbar = self.addToolBar('MainBar')
        self.toolbar.addAction(self.exitAction)
        self.toolbar.addAction(self.refresh_button)
        self.toolbar.addAction(self.show_history_button)
        self.toolbar.addAction(self.config_btn)
        self.toolbar.addAction(self.register_btn)
        self.toolbar.addAction(self.remove_btn)

        # Настройки геометрии основного окна
        # Поскольку работать с динамическими размерами мы не умеем, и мало
        # времени на изучение, размер окна фиксирован.
        self.setFixedSize(800, 600)
        self.setWindowTitle('Messaging Server alpha release')

        # Надпись о том, что ниже список подключённых клиентов
        self.label = QLabel('Список подключённых клиентов:', self)
        self.label.setFixedSize(240, 15)
        # self.label.move(10, 25)
        self.label.move(17, 38)

        # Окно со списком подключённых клиентов.
        self.active_clients_table = QTableView(self)
        # self.active_clients_table.move(10, 45)
        self.active_clients_table.move(10, 58)
        self.active_clients_table.setFixedSize(780, 400)

        # Таймер, обновляющий список клиентов 1 раз в секунду
        self.timer = QTimer()
        self.timer.timeout.connect(self.create_users_model)
        self.timer.start(1000)

        # Связываем кнопки с процедурами
        self.refresh_button.triggered.connect(self.create_users_model)
        self.show_history_button.triggered.connect(self.show_statistics)
        self.config_btn.triggered.connect(self.server_config)
        self.register_btn.triggered.connect(self.reg_user)
        self.remove_btn.triggered.connect(self.rem_user)

        # Последним параметром отображаем окно.
        self.show()
Exemple #45
0
 def keyPressEvent(self, event):
     if event.key() == Qt.Key_F5:
         self.resizeRowsToContents()
         self._top_rowid = self.indexAt(self.rect().topLeft()).row()
         self._bottom_rowid = self.indexAt(self.rect().bottomRight()).row()
     elif event.key() == Qt.Key_D and event.modifiers(
     ) & Qt.ControlModifier and self.currentIndex():
         rowId = self.currentIndex().row()
         r = [
             self.model().item(rowId, colId).text()
             for colId in [1, 2, 4, 5, 6, 8, 13, 14]
         ]
         cb = QApplication.clipboard()
         cb.clear(mode=cb.Clipboard)
         cb.setText(chr(9).join(r), mode=cb.Clipboard)
     elif (
             event.key() == Qt.Key_C or event.key() == Qt.Key_S
     ) and event.modifiers() & Qt.ControlModifier and self.currentIndex():
         try:
             rowId = self.currentIndex().row()
             beerId = int(self.model().item(rowId, 0).text())
             if beerId in self.beerImages:
                 status = []
                 if self.model().item(rowId, 6).text() != bytes(
                     [110, 111, 32, 115, 99, 111, 114, 101]).decode():
                     status.append(self.model().item(rowId, 6).text())
                 if self.model().item(rowId, 8).text() != bytes(
                     [110, 111, 32, 115, 99, 111, 114, 101]).decode():
                     status.append(self.model().item(rowId, 8).text())
                 if self.model().item(rowId, 8).text() == self.model().item(
                         rowId, 6).text():
                     if self.model().item(rowId, 6).text() != bytes(
                         [110, 111, 32, 115, 99, 111, 114, 101]).decode():
                         status = [self.model().item(rowId, 8).text()]
                 r = [
                     self.model().item(rowId, 1).text(),
                     self.model().item(rowId, 2).text(),
                     chr(32).join([
                         bytes([65, 66, 86, 32, 123, 125, 32, 37]).decode().
                         format(self.model().item(rowId, 4).text()),
                     ] + status),
                     chr(32).join([
                         self.model().item(rowId, 13).text(),
                         chr(40),
                         self.model().item(rowId, 5).text(),
                         chr(41)
                     ]),
                 ]
                 pixmap = self._pixmap(
                     open(self.beerImages[beerId][0],
                          ReadWriteFile.READ_BINARY).read(), None)
                 height = pixmap.size().height()
                 width = pixmap.size().width()
                 p = QPixmap(width, height + 12 * len(r))
                 height = p.size().height()
                 width = p.size().width()
                 with QPainter(p) as painter:
                     painter.drawPixmap(0, 12 * len(r), pixmap)
                     brush = QBrush(QColor(0, 0, 0, 255))
                     painter.fillRect(0, 0,
                                      p.size().width() - 2, 12 * len(r),
                                      brush)
                     font = QFont()
                     font.setFamily(bytes([65, 114, 105, 97, 108]).decode())
                     font.setBold(True)
                     font.setPixelSize(10)
                     painter.setFont(font)
                     pen = QPen()
                     pen.setColor(QColor(255, 255, 0, 255))
                     painter.setPen(pen)
                     for i, info in enumerate(r, 1):
                         painter.drawText(QPoint(2, i * 10), info)
                 if event.key() == Qt.Key_C:
                     QApplication.clipboard().clear()
                     QApplication.clipboard().setPixmap(p)
                 else:
                     fileName, _ = QFileDialog.getSaveFileName(
                         self,
                         bytes(
                             [83, 97, 118, 101, 32, 73, 109, 97, 103,
                              101]).decode(), str(beerId),
                         bytes([
                             73, 109, 97, 103, 101, 32, 40, 42, 46, 106,
                             112, 103, 41
                         ]).decode())
                     print(fileName)
                     p.save(fileName, bytes([74, 80, 71]).decode())
         except Exception as err:
             print(err)
     return QTableView.keyPressEvent(self, event)
Exemple #46
0
    def __init__(self):
        super(MainForm, self).__init__()

        self.assetModel = QSqlRelationalTableModel(self)
        self.assetModel.setTable("assets")
        self.assetModel.setRelation(CATEGORYID,
                                    QSqlRelation("categories", "id", "name"))
        self.assetModel.setSort(ROOM, Qt.AscendingOrder)
        self.assetModel.setHeaderData(ID, Qt.Horizontal, "ID")
        self.assetModel.setHeaderData(NAME, Qt.Horizontal, "Name")
        self.assetModel.setHeaderData(CATEGORYID, Qt.Horizontal, "Category")
        self.assetModel.setHeaderData(ROOM, Qt.Horizontal, "Room")
        self.assetModel.select()

        self.assetView = QTableView()
        self.assetView.setModel(self.assetModel)
        self.assetView.setItemDelegate(AssetDelegate(self))
        self.assetView.setSelectionMode(QTableView.SingleSelection)
        self.assetView.setSelectionBehavior(QTableView.SelectRows)
        self.assetView.setColumnHidden(ID, True)
        self.assetView.resizeColumnsToContents()
        assetLabel = QLabel("A&ssets")
        assetLabel.setBuddy(self.assetView)

        self.logModel = QSqlRelationalTableModel(self)
        self.logModel.setTable("logs")
        self.logModel.setRelation(ACTIONID,
                                  QSqlRelation("actions", "id", "name"))
        self.logModel.setSort(DATE, Qt.AscendingOrder)
        self.logModel.setHeaderData(DATE, Qt.Horizontal, "Date")
        self.logModel.setHeaderData(ACTIONID, Qt.Horizontal, "Action")
        self.logModel.select()

        self.logView = QTableView()
        self.logView.setModel(self.logModel)
        self.logView.setItemDelegate(LogDelegate(self))
        self.logView.setSelectionMode(QTableView.SingleSelection)
        self.logView.setSelectionBehavior(QTableView.SelectRows)
        self.logView.setColumnHidden(ID, True)
        self.logView.setColumnHidden(ASSETID, True)
        self.logView.resizeColumnsToContents()
        self.logView.horizontalHeader().setStretchLastSection(True)
        logLabel = QLabel("&Logs")
        logLabel.setBuddy(self.logView)

        addAssetButton = QPushButton("&Add Asset")
        deleteAssetButton = QPushButton("&Delete Asset")
        addActionButton = QPushButton("Add A&ction")
        deleteActionButton = QPushButton("Delete Ac&tion")
        editActionsButton = QPushButton("&Edit Actions...")
        editCategoriesButton = QPushButton("Ed&it Categories...")
        quitButton = QPushButton("&Quit")
        for button in (addAssetButton, deleteAssetButton, addActionButton,
                       deleteActionButton, editActionsButton,
                       editCategoriesButton, quitButton):
            if MAC:
                button.setDefault(False)
                button.setAutoDefault(False)
            else:
                button.setFocusPolicy(Qt.NoFocus)

        dataLayout = QVBoxLayout()
        dataLayout.addWidget(assetLabel)
        dataLayout.addWidget(self.assetView, 1)
        dataLayout.addWidget(logLabel)
        dataLayout.addWidget(self.logView)
        buttonLayout = QVBoxLayout()
        buttonLayout.addWidget(addAssetButton)
        buttonLayout.addWidget(deleteAssetButton)
        buttonLayout.addWidget(addActionButton)
        buttonLayout.addWidget(deleteActionButton)
        buttonLayout.addWidget(editActionsButton)
        buttonLayout.addWidget(editCategoriesButton)
        buttonLayout.addStretch()
        buttonLayout.addWidget(quitButton)
        layout = QHBoxLayout()
        layout.addLayout(dataLayout, 1)
        layout.addLayout(buttonLayout)
        self.setLayout(layout)

        #self.connect(self.assetView.selectionModel(),
        #SIGNAL(("currentRowChanged(QModelIndex,QModelIndex)")),
        #self.assetChanged)
        self.assetView.selectionModel().currentRowChanged.connect(
            self.assetChanged)
        addAssetButton.clicked.connect(self.addAsset)
        deleteAssetButton.clicked.connect(self.deleteAsset)
        addActionButton.clicked.connect(self.addAction)
        deleteActionButton.clicked.connect(self.deleteAction)
        editActionsButton.clicked.connect(self.editActions)
        editCategoriesButton.clicked.connect(self.editCategories)
        quitButton.clicked.connect(self.done)

        self.assetChanged(self.assetView.currentIndex())
        self.setMinimumWidth(650)
        self.setWindowTitle("Asset Manager")
Exemple #47
0
 def __init__(self, parent=None):
     QTableView.__init__(self, parent)
Exemple #48
0
class MainForm(QDialog):
    def __init__(self):
        super(MainForm, self).__init__()

        self.assetModel = QSqlRelationalTableModel(self)
        self.assetModel.setTable("assets")
        self.assetModel.setRelation(CATEGORYID,
                                    QSqlRelation("categories", "id", "name"))
        self.assetModel.setSort(ROOM, Qt.AscendingOrder)
        self.assetModel.setHeaderData(ID, Qt.Horizontal, "ID")
        self.assetModel.setHeaderData(NAME, Qt.Horizontal, "Name")
        self.assetModel.setHeaderData(CATEGORYID, Qt.Horizontal, "Category")
        self.assetModel.setHeaderData(ROOM, Qt.Horizontal, "Room")
        self.assetModel.select()

        self.assetView = QTableView()
        self.assetView.setModel(self.assetModel)
        self.assetView.setItemDelegate(AssetDelegate(self))
        self.assetView.setSelectionMode(QTableView.SingleSelection)
        self.assetView.setSelectionBehavior(QTableView.SelectRows)
        self.assetView.setColumnHidden(ID, True)
        self.assetView.resizeColumnsToContents()
        assetLabel = QLabel("A&ssets")
        assetLabel.setBuddy(self.assetView)

        self.logModel = QSqlRelationalTableModel(self)
        self.logModel.setTable("logs")
        self.logModel.setRelation(ACTIONID,
                                  QSqlRelation("actions", "id", "name"))
        self.logModel.setSort(DATE, Qt.AscendingOrder)
        self.logModel.setHeaderData(DATE, Qt.Horizontal, "Date")
        self.logModel.setHeaderData(ACTIONID, Qt.Horizontal, "Action")
        self.logModel.select()

        self.logView = QTableView()
        self.logView.setModel(self.logModel)
        self.logView.setItemDelegate(LogDelegate(self))
        self.logView.setSelectionMode(QTableView.SingleSelection)
        self.logView.setSelectionBehavior(QTableView.SelectRows)
        self.logView.setColumnHidden(ID, True)
        self.logView.setColumnHidden(ASSETID, True)
        self.logView.resizeColumnsToContents()
        self.logView.horizontalHeader().setStretchLastSection(True)
        logLabel = QLabel("&Logs")
        logLabel.setBuddy(self.logView)

        addAssetButton = QPushButton("&Add Asset")
        deleteAssetButton = QPushButton("&Delete Asset")
        addActionButton = QPushButton("Add A&ction")
        deleteActionButton = QPushButton("Delete Ac&tion")
        editActionsButton = QPushButton("&Edit Actions...")
        editCategoriesButton = QPushButton("Ed&it Categories...")
        quitButton = QPushButton("&Quit")
        for button in (addAssetButton, deleteAssetButton, addActionButton,
                       deleteActionButton, editActionsButton,
                       editCategoriesButton, quitButton):
            if MAC:
                button.setDefault(False)
                button.setAutoDefault(False)
            else:
                button.setFocusPolicy(Qt.NoFocus)

        dataLayout = QVBoxLayout()
        dataLayout.addWidget(assetLabel)
        dataLayout.addWidget(self.assetView, 1)
        dataLayout.addWidget(logLabel)
        dataLayout.addWidget(self.logView)
        buttonLayout = QVBoxLayout()
        buttonLayout.addWidget(addAssetButton)
        buttonLayout.addWidget(deleteAssetButton)
        buttonLayout.addWidget(addActionButton)
        buttonLayout.addWidget(deleteActionButton)
        buttonLayout.addWidget(editActionsButton)
        buttonLayout.addWidget(editCategoriesButton)
        buttonLayout.addStretch()
        buttonLayout.addWidget(quitButton)
        layout = QHBoxLayout()
        layout.addLayout(dataLayout, 1)
        layout.addLayout(buttonLayout)
        self.setLayout(layout)

        #self.connect(self.assetView.selectionModel(),
        #SIGNAL(("currentRowChanged(QModelIndex,QModelIndex)")),
        #self.assetChanged)
        self.assetView.selectionModel().currentRowChanged.connect(
            self.assetChanged)
        addAssetButton.clicked.connect(self.addAsset)
        deleteAssetButton.clicked.connect(self.deleteAsset)
        addActionButton.clicked.connect(self.addAction)
        deleteActionButton.clicked.connect(self.deleteAction)
        editActionsButton.clicked.connect(self.editActions)
        editCategoriesButton.clicked.connect(self.editCategories)
        quitButton.clicked.connect(self.done)

        self.assetChanged(self.assetView.currentIndex())
        self.setMinimumWidth(650)
        self.setWindowTitle("Asset Manager")

    def done(self, result=1):
        query = QSqlQuery()
        query.exec_("DELETE FROM logs WHERE logs.assetid NOT IN"
                    "(SELECT id FROM assets)")
        QDialog.done(self, 1)

    def assetChanged(self, index):
        if index.isValid():
            record = self.assetModel.record(index.row())
            #print(index.row())
            id = record.value("id")
            self.logModel.setFilter("assetid = {0}".format(id))
        else:
            self.logModel.setFilter("assetid = -1")
        #self.logModel.reset() # workaround for Qt <= 4.3.3/SQLite bug
        #self.logModel.beginResetModel()
        self.logModel.select()
        self.logView.horizontalHeader().setVisible(
            self.logModel.rowCount() > 0)
        if PYQT_VERSION_STR < "4.1.0":
            self.logView.setColumnHidden(ID, True)
            self.logView.setColumnHidden(ASSETID, True)
        #self.logModel.endResetModel()

    def addAsset(self):
        row = (self.assetView.currentIndex().row()
               if self.assetView.currentIndex().isValid() else 0)

        QSqlDatabase.database().transaction()
        self.assetModel.insertRow(row)
        index = self.assetModel.index(row, NAME)
        self.assetView.setCurrentIndex(index)

        assetid = 1
        query = QSqlQuery()
        query.exec_("SELECT MAX(id) FROM assets")
        if query.next():
            assetid = query.value(0)
        query.prepare("INSERT INTO logs (assetid, date, actionid) "
                      "VALUES (:assetid, :date, :actionid)")
        query.bindValue(":assetid", assetid + 1)
        query.bindValue(":date", QDate.currentDate())
        query.bindValue(":actionid", ACQUIRED)
        query.exec_()
        QSqlDatabase.database().commit()
        #self.logModel.select()
        self.assetView.edit(index)

    def deleteAsset(self):
        index = self.assetView.currentIndex()
        if not index.isValid():
            return
        QSqlDatabase.database().transaction()
        record = self.assetModel.record(index.row())
        assetid = record.value(ID)
        logrecords = 1
        query = QSqlQuery(
            "SELECT COUNT(*) FROM logs WHERE assetid = {0}".format(assetid))
        if query.next():
            logrecords = query.value(0)
        msg = ("<font color=red>Delete</font><br><b>{0}</b>"
               "<br>from room {1}").format(record.value(NAME),
                                           record.value(ROOM))
        if logrecords > 1:
            msg += (", along with {0} log records".format(logrecords))
        msg += "?"
        if (QMessageBox.question(self, "Delete Asset", msg, QMessageBox.Yes
                                 | QMessageBox.No) == QMessageBox.No):
            QSqlDatabase.database().rollback()
            return
        #query.exec_("DELETE FROM logs WHERE assetid = {0}"
        #             .format(assetid))

        #use model API
        self.logModel.setFilter("assetid={0}".format(assetid))
        self.logModel.select()
        if self.logModel.rowCount() > 0:
            self.logModel.removeRows(0, self.logModel.rowCount())
            self.logModel.submitAll()

        self.assetModel.removeRow(index.row())
        self.assetModel.submitAll()
        QSqlDatabase.database().commit()
        self.assetModel.select()
        self.assetChanged(self.assetView.currentIndex())

    def addAction(self):
        index = self.assetView.currentIndex()
        if not index.isValid():
            return
        QSqlDatabase.database().transaction()
        record = self.assetModel.record(index.row())
        assetid = record.value(ID)

        row = self.logModel.rowCount()
        self.logModel.insertRow(row)
        self.logModel.setData(self.logModel.index(row, ASSETID), assetid)
        self.logModel.setData(self.logModel.index(row, DATE),
                              QDate.currentDate())
        QSqlDatabase.database().commit()
        index = self.logModel.index(row, ACTIONID)
        self.logView.setCurrentIndex(index)
        self.logView.edit(index)

    def deleteAction(self):
        index = self.logView.currentIndex()
        if not index.isValid():
            return
        record = self.logModel.record(index.row())
        action = record.value(ACTIONID)
        if action == "Acquired":
            QMessageBox.information(
                self, "Delete Log",
                "The 'Acquired' log record cannot be deleted.<br>"
                "You could delete the entire asset instead.")
            return
        when = str(record.value(DATE))
        if (QMessageBox.question(self, "Delete Log",
                                 "Delete log<br>{0} {1}?".format(when, action),
                                 QMessageBox.Yes
                                 | QMessageBox.No) == QMessageBox.No):
            return
        self.logModel.removeRow(index.row())
        self.logModel.submitAll()
        self.logModel.select()

    def editActions(self):
        form = ReferenceDataDlg("actions", "Action", self)
        form.exec_()

    def editCategories(self):
        form = ReferenceDataDlg("categories", "Category", self)
        form.exec_()
Exemple #49
0
class ResultFormatManager(QDialog):
    apply_done = pyqtSignal()

    def __init__(self, data: list):
        super().__init__()
        self.setStyleSheet(open('stylesheet/default.qss').read())
        # self.setWindowFlag(Qt.WindowMinimizeButtonHint, True)
        self.setAttribute(Qt.WA_QuitOnClose)
        self.data_json = data
        self.data_json.append("")

        layout = QVBoxLayout()
        self.setLayout(layout)

        self.table = QTableView()
        self.model = QStandardItemModel()
        self.model.setHorizontalHeaderLabels(['Object name'])
        self.model.itemChanged.connect(self.data_change)
        self.table.setModel(self.model)
        self.import_data(self.data_json)
        header = self.table.horizontalHeader()
        header.setSectionResizeMode(0, QtWidgets.QHeaderView.Stretch)

        apply = QPushButton()
        apply.setText("Apply")
        apply.pressed.connect(self.apply)
        cancel = QPushButton()
        cancel.setText("Cancel")
        cancel.pressed.connect(self.cancel)

        bar = QHBoxLayout()
        bar.addStretch()
        bar.addWidget(cancel, alignment=Qt.AlignRight)
        bar.addWidget(apply, alignment=Qt.AlignRight)

        layout.addWidget(self.table)
        layout.addLayout(bar)

    def import_data(self, data_list):
        row = self.model.invisibleRootItem()
        for data in data_list:
            item1 = QStandardItem()
            item1.setText(data)
            item1.setData(data)
            item1.setEditable(True)
            row.appendRow(item1)

    def cancel(self):
        self.close()

    def data_change(self, arg: QStandardItem):
        data = arg.data()
        text = arg.text()

        if data != "" or text != "":
            index = self.data_json.index(data)
            self.data_json.insert(index, text)
        if data != "" and text != "":
            self.data_json.remove(data)

        self.model.clear()
        self.model.setHorizontalHeaderLabels(['Object name'])
        header = self.table.horizontalHeader()
        header.setSectionResizeMode(0, QtWidgets.QHeaderView.Stretch)
        self.import_data(self.data_json)

    def apply(self):
        self.apply_done.emit()
        self.accept()

    def data(self):
        return self.data_json

    def set_data(self, data: list):
        self.data_json = data
Exemple #50
0
class EventTab(QWidget):
    """
    Widget which represents tab for editing events.
    """

    save_clicked_signal = pyqtSignal()

    def __init__(self, db: DbModel):
        super(EventTab, self).__init__()
        self.__manager = EventManager(db)
        self.__manager.model.select()
        self.__create_view()
        self.setLayout(self.__layout)

    def __create_view(self):
        self.__view = QTableView()
        self.__view.setModel(self.__manager.model)
        self.__view.setSelectionMode(QAbstractItemView.NoSelection)
        self.__layout = QVBoxLayout()
        self.__layout.addWidget(self.__view)
        self.__layout.addLayout(self.__create_buttons())
        self.__set_columns_delegate()
        self.__set_columns_checkbox([
            Resources.EventManager_Column_IsCyclic_Index,
            Resources.EventManager_Column_IsActive_Index
        ])
        self.__set_columns_visible()
        self.__set_columns_width()
        self.__set_columns_title()

    def __set_columns_delegate(self):
        self.__delegate_start_date = ItemDelegateDateEdit()
        self.__delegate_number = ItemDelegateSpinBoxEdit(1)
        self.__delegate_days = ItemDelegateSpinBoxEdit()
        self.__delegate_months = ItemDelegateSpinBoxEdit()
        self.__view.setItemDelegateForColumn(2, self.__delegate_start_date)
        self.__view.setItemDelegateForColumn(4, self.__delegate_number)
        self.__view.setItemDelegateForColumn(5, self.__delegate_days)
        self.__view.setItemDelegateForColumn(6, self.__delegate_months)

    def __set_columns_checkbox(self, column_list: list):
        for column in column_list:
            for row in range(self.__manager.model.rowCount()):
                self.__set_column_checkbox(row, column)

    def __set_column_checkbox(self, row: int, column: int):
        index = self.__manager.model.index(row, column)
        check_box = CheckBoxEdit(None)
        check_box.set_property(Resources.EventTab_Property_Row, QVariant(row))
        check_box.set_property(Resources.EventTab_Property_Column,
                               QVariant(column))
        check_box.state_changed.connect(self.__checkbox_clicked)
        check_box.checked = bool(index.data())
        self.__view.setIndexWidget(index, check_box)

    def __create_buttons(self):
        self.__add_button = self.__create_button(
            Resources.EventTab_BUTTON_NAME_Add, self.__add_clicked)
        self.__delete_button = self.__create_button(
            Resources.EventTab_BUTTON_NAME_Delete, self.__delete_clicked)
        self.__save_button = self.__create_button(
            Resources.EventTab_BUTTON_NAME_Save, self.__save_clicked)

        layout = QHBoxLayout()
        layout.addWidget(self.__add_button)
        layout.addWidget(self.__delete_button)
        layout.addStretch(1)
        layout.addWidget(self.__save_button)

        return layout

    def __create_button(self, name: str, fun: object):
        button = QPushButton(self)
        button.setText(name)
        button.clicked.connect(fun)

        return button

    def __set_columns_visible(self):
        for key, value in Resources.EventTab_Columns_Visible.items():
            self.__view.setColumnHidden(key, not value)

    def __set_columns_width(self):
        for key, value in Resources.EventTab_Columns_Width.items():
            self.__view.setColumnWidth(key, value)

    def __set_columns_title(self):
        for key, value in Resources.EventTab_Columns_Names.items():
            self.__manager.set_header_title(key, value)

    def __checkbox_clicked(self, state: int):
        del state
        sender = self.sender()
        row = int(sender.property(Resources.EventTab_Property_Row))
        column = int(sender.property(Resources.EventTab_Property_Column))
        index = self.__manager.model.index(row, column)
        self.__manager.model.setData(index, sender.isChecked())

    def __add_clicked(self):
        index = self.__manager.insert_row()
        self.__set_column_checkbox(
            index, Resources.EventManager_Column_IsCyclic_Index)
        self.__set_column_checkbox(
            index, Resources.EventManager_Column_IsActive_Index)

    def __delete_clicked(self):
        reply = QMessageBox.warning(self,
                                    Resources.EventTab_BUTTON_NAME_Delete,
                                    Resources.EventTab_Delete_Message,
                                    QMessageBox.Yes | QMessageBox.No,
                                    QMessageBox.Yes)
        if reply == QMessageBox.No:
            return

        selected_indexes = self.__view.selectedIndexes()
        self.__manager.remove_rows(selected_indexes)

    def __save_clicked(self):
        self.__manager.save()
        self.__set_columns_checkbox([
            Resources.EventManager_Column_IsCyclic_Index,
            Resources.EventManager_Column_IsActive_Index
        ])
        self.save_clicked_signal.emit()
        Tools.write_verbose_class_name(self, "Save clicked")
Exemple #51
0
class MainWindow(QMainWindow):
    def __init__(self, system):
        super(MainWindow, self).__init__()

        self.system = system
        fileMenu = QMenu("&Menu", self)
        dbinitAction = fileMenu.addAction("사용자 정보 초기화")
        quitAction = fileMenu.addAction("E&xit")
        quitAction.setShortcut("Ctrl+Q")

        self.menuBar().addMenu(fileMenu)
        self.statusBar()

        dbinitAction.triggered.connect(self.ClickAction_dbinit)
        quitAction.triggered.connect(QApplication.instance().quit)

        self.setupModel()
        self.setupViews()
        self.readDB()

        self.setWindowTitle("PyStudy 학습진도창")
        self.resize(870, 550)

    def setupModel(self):
        self.model = QStandardItemModel(3, 2, self)
        self.model.setHeaderData(0, Qt.Horizontal, "목록")
        self.model.setHeaderData(1, Qt.Horizontal, "읽기여부")
        self.model2 = QStandardItemModel(3, 2, self)
        self.model2.setHeaderData(0, Qt.Horizontal, "학습여부")
        self.model2.setHeaderData(1, Qt.Horizontal, "개수")

    def setupViews(self):
        splitter = QSplitter()
        self.table = QTableView()
        self.pieChart = PieView()

        splitter.addWidget(self.pieChart)
        splitter.addWidget(self.table)
        splitter.setStretchFactor(0, 0)
        splitter.setStretchFactor(1, 0)

        self.table.setModel(self.model)
        self.pieChart.setModel(self.model2)

        self.selectionModel = QItemSelectionModel(self.model2)
        self.table.setSelectionModel(self.selectionModel)

        #self.pieChart.setSelectionModel(self.selectionModel)

        #table.setColumnWidth(0,100)
        self.setCentralWidget(splitter)
        self.table.doubleClicked.connect(self.ClickAction_table)

    def readDB(self):

        con = sqlite3.connect("mystudy.db")
        cur = con.cursor()
        cur.execute("select subject, readcheck from study;")
        self.model.removeRows(0, self.model.rowCount(QModelIndex()),
                              QModelIndex())
        self.model2.removeRows(0, self.model2.rowCount(QModelIndex()),
                               QModelIndex())
        row = 0
        for line in cur:
            if line[1] == 1:
                result = "○"
            else:
                result = "X"
            self.model.insertRows(row, 1, QModelIndex())
            self.model.setData(self.model.index(row, 0, QModelIndex()),
                               line[0])
            self.model.setData(self.model.index(row, 1, QModelIndex()), result)
            self.model.setData(self.model.index(row, 1, QModelIndex()),
                               QVariant(Qt.AlignCenter), Qt.TextAlignmentRole)
            row += 1
        cur.execute("select count() from study ;")
        for line in cur:
            self.studyTotal = line[0]
        cur.execute("select count() from study where readcheck=1;")
        for line in cur:
            self.studyRead = line[0]
        #print("총 개수 " ,self.studyTotal ," 학습한개수", self.studyRead )
        con.close()
        row = 0
        self.model2.insertRows(row, 1, QModelIndex())
        self.model2.setData(self.model2.index(row, 0, QModelIndex()), "학습")
        self.model2.setData(self.model2.index(row, 1, QModelIndex()),
                            float(self.studyRead))
        self.model2.setData(self.model2.index(row, 0, QModelIndex()),
                            QColor("#99e600"), Qt.DecorationRole)
        row = 1
        self.model2.insertRows(row, 1, QModelIndex())
        self.model2.setData(self.model2.index(row, 0, QModelIndex()), "미학습")
        self.model2.setData(self.model2.index(row, 1, QModelIndex()),
                            float(self.studyTotal - self.studyRead))
        self.model2.setData(self.model2.index(row, 0, QModelIndex()),
                            QColor("#8080b3"), Qt.DecorationRole)

        self.table.setSelectionBehavior(QAbstractItemView.SelectRows)
        self.table.setSelectionMode(QAbstractItemView.SingleSelection)
        self.table.setDragEnabled(False)
        self.table.horizontalHeader().setStretchLastSection(True)
        self.table.setEditTriggers(QAbstractItemView.NoEditTriggers)
        self.table.resizeRowsToContents()
        self.table.resizeColumnsToContents()
        self.table.setColumnWidth(0, 350)
        #self.statusBar().showMessage("Loaded %s" % path, 2000)
    def ClickAction_table(self, index):
        #self.system
        #index.data()
        #self.table.selectedIndexes()[0].data()
        tempstr = self.table.selectedIndexes()[0].data().split()
        filepath = r"PyStudy_web\\example\\기본예제\\" + tempstr[0] + ".html"
        selectedRowKey = self.table.selectedIndexes()[0].row(
        ) + 1  #mysql 테이블 줄수 차이
        #print("click test ",selectedRowKey )
        con = sqlite3.connect("mystudy.db")
        cur = con.cursor()
        cur.execute("update 'study' set 'readcheck'=1 where key=" +
                    str(selectedRowKey) + ";")
        con.commit()
        con.close()
        self.setupViews()
        self.readDB()

        self.system.sendMessage("/학습창 열기 " + filepath)

    def ClickAction_dbinit(self, index):
        con = sqlite3.connect("mystudy.db")
        cur = con.cursor()
        cur.execute("update 'study' set 'readcheck'=0 ;")
        con.commit()
        con.close()
        self.setupViews()
        self.readDB()
Exemple #52
0
        editor.setValue(value)

    def setModelData(self, editor, model, index):
        value = editor.value()
        model.setData(index, value, Qt.EditRole)

    def updateEditorGeometry(self, editor, option, index):
        editor.setGeometry(option.rect)


if __name__ == '__main__':
    app = QApplication(sys.argv)

    data = MyData()

    table_view = QTableView()
    my_model = MyModel(data)
    table_view.setModel(my_model)

    delegate = MyDelegate()
    table_view.setItemDelegate(delegate)

    table_view.show()

    # The mainloop of the application. The event handling starts from this point.
    # The exec_() method has an underscore. It is because the exec is a Python keyword. And thus, exec_() was used instead.
    exit_code = app.exec_()

    # The sys.exit() method ensures a clean exit.
    # The environment will be informed, how the application ended.
    sys.exit(exit_code)
Exemple #53
0
 def __getTopRow(self, tableView: QTableView) -> DictTableRow:
     model = tableView.model()
     if model.rowCount() > 0:
         index = model.index(0, 0)
         return model.itemFromIndex(index).dictTableRow()
     return None
Exemple #54
0
        self._data = data

    def rowCount(self, parent=None):
        return self._data.shape[0]

    def columnCount(self, parnet=None):
        return self._data.shape[1]

    def data(self, index, role=Qt.DisplayRole):
        if index.isValid():
            if role == Qt.DisplayRole:
                return str(self._data.iloc[index.row(), index.column()])
        return None

    def headerData(self, col, orientation, role):
        if orientation == Qt.Horizontal and role == Qt.DisplayRole:
            return self._data.columns[col]
        return None

if __name__ == '__main__':
    app = QApplication(sys.argv)
    model = pandasModel(df)
    view = QTableView()
    view.setModel(model)
    view.resize(800, 600)
    df = df.append(pd.Series([2.3,596,99],name="d"))
    model = pandasModel(df)
    view = QTableView()
    view.setModel(model)
    view.show()
    sys.exit(app.exec_())
Exemple #55
0
class Widget(QWidget):
    def __init__(self, parent=None):
        QWidget.__init__(self, parent)

        self.setGeometry(100, 150, 1200, 600)

        self.Columns = '*'
        self.font = None
        self.HeaderList = None
        self.left_padding = 0
        self.right_padding = 0
        self.search_field_spacing = 5

        self.createDB()
        self.getHeaders()

        layout = QVBoxLayout(self)

        buttons_layout = QHBoxLayout()
        show_plant_view = QPushButton('Plant photo with details')
        font_button = QPushButton('Font')
        buttons_layout.addWidget(show_plant_view)
        buttons_layout.addWidget(font_button)

        layout.addLayout(buttons_layout)

        show_plant_view.clicked.connect(self._show_photo_view)
        font_button.clicked.connect(self.font_dialog)

        self.model = MySqlModel(self.HeaderList)
        self.SearchQuery = "select {} from {}".format(self.Columns, _DB_TABLE)
        self.model.setQuery(self.SearchQuery, self.DB)

        self.view = QTableView(self)
        self.view.setMinimumHeight(325)
        self.font = self.view.property('font')
        self.view.setModel(self.model)

        self.view.setColumnHidden(self.model.image_column, True)
        self.view.setColumnHidden(self.model.info_column, True)

        horizontal_header = self.view.horizontalHeader()
        for i in range(len(horizontal_header)):
            horizontal_header.setSectionResizeMode(i, QHeaderView.Stretch)

        self.search_layout = QHBoxLayout()
        self.search_layout.insertSpacing(0, self.left_padding)
        self.SearchFieldsGrid = QGridLayout()
        self.makeSearchFieldsGrid()
        self.search_layout.addLayout(self.SearchFieldsGrid)
        self.search_layout.insertSpacing(-1, self.right_padding)
        layout.addLayout(self.search_layout)

        #self.view.horizontalHeader().setStretchLastSection(True)
        #self.view.resizeColumnsToContents()
        #self.view.horizontalHeader().ResizeMode(QHeaderView.Interactive)

        layout.addWidget(self.view)

        self.view.resizeRowsToContents()
        self.view_vertical_header = self.view.verticalHeader()
        self.view_vertical_header.geometriesChanged.connect(
            self._align_search_layout)

    def createDB(self):
        # binding to an existing database

        self.DB = QtSql.QSqlDatabase.addDatabase('QSQLITE')

        self.DB.setDatabaseName(_PATH_TO_DB)
        self.DB.open()

    def getHeaders(self):
        # getting a list of Headers
        self.query = QtSql.QSqlQuery(db=self.DB)
        self.query.exec_("PRAGMA table_info({})".format(_DB_TABLE))

        # filling the list of headings
        self.HeaderList = []
        while self.query.next():
            self.HeaderList.append(self.query.value(1))

        # create a query parameter dictionary
        self.paramsDict = {x: ['', '', ''] for x in self.HeaderList}
        self.paramsDict[''] = ["{} {} '%{}%'", '', '']

    def makeSearchFieldsGrid(self):
        self.SearchFieldsGrid.setSpacing(self.search_field_spacing)

        self.clearLayout(self.SearchFieldsGrid)

        self.cb = QCheckBox(self)
        self.cb.stateChanged.connect(self.changeQuery)
        self.SearchFieldsGrid.addWidget(self.cb, 1, 0)

        n = len(self.HeaderList)
        qwidth = [self.view.columnWidth(i) for i in range(n)]
        self.qles = [None for i in range(n)]

        for i in range(n):
            self.qles[i] = QLineEdit(self)
            self.qles[i].setObjectName(self.HeaderList[i])
            self.qles[i].textChanged[str].connect(self.setSearchQuery)
            label = QLabel(self.HeaderList[i])

            self.SearchFieldsGrid.addWidget(label,
                                            0,
                                            i + 1,
                                            alignment=Qt.AlignCenter)
            self.SearchFieldsGrid.addWidget(self.qles[i], 1, i + 1)

    def clearLayout(self, layout):
        while layout.count():
            child = layout.takeAt(0)
            if child.widget() is not None:
                child.widget().deleteLater()
            elif child.layout() is not None:
                clearLayout(child.layout())

    # remembering the status of the switch after pressing and updating the table
    def changeQuery(self, state):

        self.state = state
        self.setSearchQuery('')

    def setSearchQuery(self, text):
        # switch handling
        try:
            if self.state == Qt.Checked:
                self.paramsDict[''] = [
                    "{0} {1} '% {2}%' or {0} {1} '{2}%'", '', ''
                ]
            else:
                self.paramsDict[''] = ["{} {} '%{}%'", '', '']
        except:
            self.paramsDict[''] = ["{} {} '%{}%'", '', '']
        # processing of more and less characters
        if text != '':
            if text[0] == '<':
                matching = '<'
                queryString = "{} {} {}"
                text = text[1:]
            elif text[0] == '>':
                matching = '>'
                queryString = "{} {} {}"
                text = text[1:]
            else:
                queryString = self.paramsDict[''][0]
                matching = 'like'
        else:
            queryString, matching, text = self.paramsDict['']

        # filling in the query parameters dictionary
        self.paramsDict[self.sender().objectName()] = [
            queryString, matching, text
        ]
        paramList = []
        # assembling query parameters into a list
        for name, value in self.paramsDict.items():
            if len(value) == 3:
                queryString, matching, text = value
                if queryString.find('%') != -1:
                    queryString = self.paramsDict[''][0]
                if text != '':
                    paramList.append(queryString.format(name, matching, text))

        # assembling query parameters into a string
        if len(paramList) == 0:
            params = ''
        elif len(paramList) == 1:
            params = 'where {}'.format(paramList[0])
        else:
            params = 'where {}'.format(" and ".join(paramList))
        # assembling the query and updating the table according to it

        self.Columns = '*' if self.Columns == '' else self.Columns
        self.searchQuery = "select {} from {} {}".format(
            self.Columns, _DB_TABLE, params)
        self.model.setQuery(self.searchQuery, self.DB)

        self.view.resizeRowsToContents()

        #header = self.view.horizontalHeader()
        #for i in range(len(header)):
        #header.setSectionResizeMode(i, QHeaderView.Stretch)

    def font_dialog(self):

        self.font, valid = QFontDialog.getFont(self.font)
        if valid:
            self.view.setFont(self.font)
            self.view.resizeRowsToContents()
            for i in self.qles:
                i.setFont(self.font)

    def _align_search_layout(self):
        vertical_header_width = self.view_vertical_header.width()
        checkbox_width = self.cb.width()
        self.left_padding = vertical_header_width - checkbox_width - self.search_field_spacing
        vertical_scrollbar_width = self.view.verticalScrollBar().width()
        self.right_padding = vertical_scrollbar_width

        left_spacer = self.search_layout.itemAt(0)
        left_spacer.changeSize(self.left_padding, 10)

        right_spacer = self.search_layout.itemAt(2)
        right_spacer.changeSize(self.right_padding, 10)

        self.search_layout.invalidate()

    def _show_photo_view(self):
        #image_data = _get_image_paths_names(self.model)
        viewer = PhotoViewe(self.model, self)
        viewer.show()
Exemple #56
0
    def __init__(self, parent=None):
        QWidget.__init__(self, parent)

        self.setGeometry(100, 150, 1200, 600)

        self.Columns = '*'
        self.font = None
        self.HeaderList = None
        self.left_padding = 0
        self.right_padding = 0
        self.search_field_spacing = 5

        self.createDB()
        self.getHeaders()

        layout = QVBoxLayout(self)

        buttons_layout = QHBoxLayout()
        show_plant_view = QPushButton('Plant photo with details')
        font_button = QPushButton('Font')
        buttons_layout.addWidget(show_plant_view)
        buttons_layout.addWidget(font_button)

        layout.addLayout(buttons_layout)

        show_plant_view.clicked.connect(self._show_photo_view)
        font_button.clicked.connect(self.font_dialog)

        self.model = MySqlModel(self.HeaderList)
        self.SearchQuery = "select {} from {}".format(self.Columns, _DB_TABLE)
        self.model.setQuery(self.SearchQuery, self.DB)

        self.view = QTableView(self)
        self.view.setMinimumHeight(325)
        self.font = self.view.property('font')
        self.view.setModel(self.model)

        self.view.setColumnHidden(self.model.image_column, True)
        self.view.setColumnHidden(self.model.info_column, True)

        horizontal_header = self.view.horizontalHeader()
        for i in range(len(horizontal_header)):
            horizontal_header.setSectionResizeMode(i, QHeaderView.Stretch)

        self.search_layout = QHBoxLayout()
        self.search_layout.insertSpacing(0, self.left_padding)
        self.SearchFieldsGrid = QGridLayout()
        self.makeSearchFieldsGrid()
        self.search_layout.addLayout(self.SearchFieldsGrid)
        self.search_layout.insertSpacing(-1, self.right_padding)
        layout.addLayout(self.search_layout)

        #self.view.horizontalHeader().setStretchLastSection(True)
        #self.view.resizeColumnsToContents()
        #self.view.horizontalHeader().ResizeMode(QHeaderView.Interactive)

        layout.addWidget(self.view)

        self.view.resizeRowsToContents()
        self.view_vertical_header = self.view.verticalHeader()
        self.view_vertical_header.geometriesChanged.connect(
            self._align_search_layout)
Exemple #57
0
 def __init__(self, data_list, header, *args):
     QWidget.__init__(
         self,
         *args,
     )
     self.setGeometry(100, 50, 1800, 900)
     self.setWindowTitle('Artikelen bestellijst')
     self.setWindowIcon(QIcon('./images/logos/logo.jpg'))
     self.setWindowFlags(self.windowFlags() | Qt.WindowSystemMenuHint
                         | Qt.WindowMinMaxButtonsHint)
     table_model = MyTableModel(self, data_list, header)
     table_view = QTableView()
     table_view.setModel(table_model)
     font = QFont("Arial", 10)
     table_view.setFont(font)
     table_view.resizeColumnsToContents()
     table_view.setSelectionBehavior(QTableView.SelectRows)
     table_view.setItemDelegateForColumn(10, showImage(self))
     table_view.setColumnWidth(10, 100)
     table_view.verticalHeader().setDefaultSectionSize(75)
     table_view.clicked.connect(showArtikel)
     layout = QVBoxLayout(self)
     layout.addWidget(table_view)
     self.setLayout(layout)
Exemple #58
-1
    def __init__(self,parent=None):
        QWidget.__init__(self,parent)

        self.setWindowTitle('View')
        dirModel=QDirModel()
        lay=QGridLayout(self)
        lv=QListView()
        lay.addWidget(lv,0,0)
        lv.setModel(dirModel)

        lvi=QListView()
        lay.addWidget(lvi,0,1)
        lvi.setViewMode(QListView.IconMode)
        lvi.setModel(dirModel)

        trv=QTreeView()
        lay.addWidget(trv,1,0)
        trv.setModel(dirModel)

        tav=QTableView()
        tav.setModel(dirModel)
        lay.addWidget(tav,1,1)

        cwdIndex=dirModel.index(QDir.currentPath())
        lv.setRootIndex(cwdIndex)
        lvi.setRootIndex(cwdIndex)
        trv.setRootIndex(cwdIndex)
        tav.setRootIndex(cwdIndex)
Exemple #59
-1
def createView(title, model):
    global offset, views

    view = QTableView()
    views.append(view)
    view.setModel(model)
    view.setWindowTitle(title)
    view.move(100 + offset, 100 + offset)
    offset += 20
    view.show()
Exemple #60
-2
    def initUI(self):
        self.resize(800, 600)

        centralWidget = QWidget(self)
        grid = QGridLayout(centralWidget)
        grid.setSpacing(10)

        self.listOfDiscipline = QComboBox(centralWidget)
        grid.addWidget(self.listOfDiscipline, 0, 0, 1, 1)

        textIn = QLabel(centralWidget)
        textIn.setText('Входные компетенции')
        grid.addWidget(textIn, 1, 0, 1, 1)

        self.tableIn = QTableView(centralWidget)
        grid.addWidget(self.tableIn, 2, 0, 1, 1)

        textOut = QLabel(centralWidget)
        textOut.setText('Выходные компетенции')
        grid.addWidget(textOut, 3, 0, 1, 1)

        self.tableOut = QTableView(centralWidget)
        grid.addWidget(self.tableOut, 4, 0, 1, 1)

        self.setCentralWidget(centralWidget)

        openFile = QAction('Открыть базу данных', self)
        openFile.setShortcut('Ctrl+O')
        openFile.setStatusTip('Открыть базу данных комптенций')
        openFile.triggered.connect(self.MainFunc)

        exitWindow = QAction('Выход', self)
        exitWindow.setStatusTip('Завершение программы')
        exitWindow.triggered.connect(self.close)

        saveFile_one = QAction('Сохранить дисциплину', self)
        saveFile_one.setShortcut('Ctrl+S')
        saveFile_one.setStatusTip('Сохранить одну дисциплину в формате xlsx')
        saveFile_one.triggered.connect(self.save_one)

        saveFile_all = QAction('Сохранить все дисциплины', self)
        saveFile_all.setShortcut('Ctrl+A')
        saveFile_all.setStatusTip('Сохранить все дисциплины в формате xlsx')
        saveFile_all.triggered.connect(self.save_all)

        menubar = self.menuBar()
        fileMenu = menubar.addMenu('&Файл')
        fileMenu.addAction(openFile)
        fileSaveMenu = fileMenu.addMenu('&Дисциплины')
        fileSaveMenu.addAction(saveFile_one)
        fileSaveMenu.addAction(saveFile_all)
        fileMenu.addAction(fileSaveMenu.menuAction())
        fileMenu.addSeparator()
        fileMenu.addAction(exitWindow)

        self.nameFileOpen = ''

        self.statusBar()
        self.setWindowTitle('Формирование компетенций')
        self.show()