def __init__(self, parent=None): global client super(CharacterSelect, self).__init__(parent) self.setWindowTitle("Select A Character") # Character Portrait # Character Sprite # Name # Current zone # Money self.charbuttons = {} for char in client.characters: button = QPushButton() button.setText(char) button.setIcon(QIcon.fromTheme('applications-games')) func = functools.partial(self.select_character, char=char) button.clicked.connect(func) self.charbuttons[char] = button layout = QVBoxLayout() for w in self.charbuttons.values(): layout.addWidget(w) self.setLayout(layout) self.character_chosen.connect(qtclient.choose_char)
def initUI(self): # Create container for action buttons self.actionContainer = ButtonContainer() self.parameterModel = ParameterModel() self.parameterView = ParameterListView() self.parameterView.setAttribute(Qt.WA_MacShowFocusRect, False) self.parameterView.setRootIsDecorated(False) self.parameterView.setModel(self.parameterModel) # Create a main layout (vertical) for this widget self.layout = QVBoxLayout() self.layout.setSpacing(0) self.layout.setContentsMargins(0, 0, 0, 0) self.layout.addWidget(self.parameterView) self.layout.addWidget(self.actionContainer) self.setLayout(self.layout) # Add a button to the container addButton = QPushButton() addButton.setIcon(QIcon(AppVars.imagePath() + "AddButton.png")) addButton.clicked.connect(self.addButtonClicked) self.actionContainer.addButton(addButton) removeButton = QPushButton() removeButton.setIcon(QIcon(AppVars.imagePath() + "RemoveButton.png")) removeButton.clicked.connect(self.removeButtonClicked) self.actionContainer.addButton(removeButton)
def __init__(self, parent=None): global client super(CharacterSelect, self).__init__(parent) self.setWindowTitle("Select A Character") # Character Portrait # Character Sprite # Name # Current zone # Money self.charbuttons = {} for char in client.characters: button = QPushButton() button.setText(char) button.setIcon(QIcon.fromTheme('applications-games')) func = functools.partial(self.select_character, char=char) button.clicked.connect(func) self.charbuttons[char] = button layout = QVBoxLayout() for w in self.charbuttons.values(): layout.addWidget(w) self.setLayout(layout) self.character_chosen.connect(qtclient.choose_char)
def __init__(self): super(TransformationHistoryWidget, self).__init__() self.actionContainer = ButtonContainer() self.transformationModel = TransformationModel() self.transformationView = TransformationListView() self.transformationView.setRootIsDecorated(False) self.transformationView.setModel(self.transformationModel) self.transformationView.setAttribute(Qt.WA_MacShowFocusRect, False) self.transformationView.clicked.connect(self.clickedTransformation) self._transformCount = 0 layout = QVBoxLayout() layout.setSpacing(0) layout.setAlignment(Qt.AlignTop) layout.addWidget(self.transformationView) layout.addWidget(self.actionContainer) self.setLayout(layout) removeButton = QPushButton() removeButton.setIcon(QIcon(AppVars.imagePath() + "RemoveButton.png")) removeButton.clicked.connect(self.removeButtonClicked) removeButton.setToolTip("Remove the last transformation") self.actionContainer.addButton(removeButton)
def __init__(self): super(TransformationHistoryWidget, self).__init__() self.actionContainer = ButtonContainer() self.transformationModel = TransformationModel() self.transformationView = TransformationListView() self.transformationView.setRootIsDecorated(False) self.transformationView.setModel(self.transformationModel) self.transformationView.setAttribute(Qt.WA_MacShowFocusRect, False) self.transformationView.clicked.connect(self.clickedTransformation) self._transformCount = 0 layout = QVBoxLayout() layout.setSpacing(0) layout.setAlignment(Qt.AlignTop) layout.addWidget(self.transformationView) layout.addWidget(self.actionContainer) self.setLayout(layout) removeButton = QPushButton() removeButton.setIcon(QIcon(AppVars.imagePath() + "RemoveButton.png")) removeButton.clicked.connect(self.removeButtonClicked) removeButton.setToolTip("Remove the last transformation") self.actionContainer.addButton(removeButton)
def _initUI(self): # Variables self._widgets = {} tbl_model = self._LimitTableModel() # Widgets self._cb_limit = QComboBox() self._cb_limit.setModel(self._LimitComboBoxModel()) btn_limit_add = QPushButton() btn_limit_add.setIcon(getIcon("list-add")) self._tbl_limit = QTableView() self._tbl_limit.setModel(tbl_model) self._tbl_limit.setItemDelegate(self._LimitTableDelegate()) header = self._tbl_limit.horizontalHeader() header.setResizeMode(QHeaderView.Stretch) header.hide() policy = self._tbl_limit.sizePolicy() policy.setVerticalStretch(True) self._tbl_limit.setSizePolicy(policy) tlb_limit = QToolBar() spacer = QWidget() spacer.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) tlb_limit.addWidget(spacer) act_remove = tlb_limit.addAction(getIcon("list-remove"), "Remove limit") act_clear = tlb_limit.addAction(getIcon("edit-clear"), "Clear") # Layouts layout = _ExpandableOptionsWizardPage._initUI(self) sublayout = QHBoxLayout() sublayout.addWidget(self._cb_limit, 1) sublayout.addWidget(btn_limit_add) layout.addRow("Select", sublayout) layout.addRow(self._tbl_limit) layout.addRow(tlb_limit) # Signals btn_limit_add.released.connect(self._onLimitAdd) act_remove.triggered.connect(self._onLimitRemove) act_clear.triggered.connect(self._onLimitClear) self._tbl_limit.doubleClicked.connect(self._onLimitDoubleClicked) tbl_model.dataChanged.connect(self.valueChanged) tbl_model.rowsInserted.connect(self.valueChanged) tbl_model.rowsRemoved.connect(self.valueChanged) return layout
def __init__(self, parent=None): super().__init__(parent) layout = QVBoxLayout(self) for size in (16, 22, 32, 64): icon = QIcon( ':/icons/custom-theme/places/{}/folder-important.svg'.format( size ) ) button = QPushButton(self) button.setIconSize(QSize(size, size)) button.setIcon(QIcon.fromTheme('folder-important', icon)) layout.addWidget(button)
def __add_button(self, object_name, icon_path, func, tooltip): """ Add simple button to UI """ button = QPushButton() button.setObjectName(object_name) button.setIcon(QIcon(QPixmap(icon_path))) button.setFixedSize(QSize(self.BUTTON_SIZE, self.BUTTON_SIZE)) button.setIconSize(QSize(self.BUTTON_SIZE, self.BUTTON_SIZE)) button.clicked.connect(func) button.setToolTip(tooltip) self.layout.addWidget(button) self.buttons[object_name] = button
def __init__(self, presenter, parent=None): super(MainView, self).__init__(presenter, parent=parent) self.setLayout(QGridLayout()) addEffects = QPushButton(self) addEffects.isWordWrap = False addEffects.setFlat(True) addEffects.setCursor(Qt.PointingHandCursor) addEffects.setStyleSheet("QPushButton{outline:0; border-radius: 0px}") addEffects.setIcon(QPixmap("gui\\Add-Effects.png")) addEffects.setIconSize(QSize(300, 50)) self.layout().addWidget(addEffects, 0, 0, 1, 1) self.setMinimumSize(QSize(640, 480)) addEffects.clicked.connect(self.addEffectsClicked)
def initUI(self): self.grid = QGridLayout() self.setLayout(self.grid) teamnames = json_reader.readJSON('teams.json') i = 0 j = 0 for team in teamnames: tbutton = QPushButton(team['name']) team_pic = QPixmap("%s.jpg"%team['name']) tbutton.setIcon(QIcon(team_pic)) tbutton.setIconSize(team_pic.rect().size()) tbutton.clicked.connect(lambda t=team: self.chooseTeam(t)) self.grid.addWidget(tbutton, i % 10, j) i += 1 j = j + 1 if i % 10 == 0 else j # this is the dumb
def _initUI(self): # Widgets self._cb_model_type = QComboBox() self._cb_model_type.setModel(self._ModelTypeComboBoxModel()) self._cb_model = QComboBox() self._cb_model.setModel(self._ModelComboBoxModel()) self._cb_model.setMaxVisibleItems(10) btn_model_add = QPushButton() btn_model_add.setIcon(getIcon("list-add")) self._tbl_model = ModelTableWidget() tlb_model = QToolBar() spacer = QWidget() spacer.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) tlb_model.addWidget(spacer) act_remove = tlb_model.addAction(getIcon("list-remove"), "Remove model") act_clear = tlb_model.addAction(getIcon("edit-clear"), "Clear") # Layouts layout = _ExpandableOptionsWizardPage._initUI(self) sublayout = QHBoxLayout() sublayout.addWidget(self._cb_model_type, 1) sublayout.addWidget(self._cb_model, 1) sublayout.addWidget(btn_model_add) layout.addRow("Select", sublayout) layout.addRow(self._tbl_model) layout.addRow(tlb_model) # Signals btn_model_add.released.connect(self._onModelAdd) act_remove.triggered.connect(self._onModelRemove) act_clear.triggered.connect(self._onModelClear) self._cb_model_type.currentIndexChanged.connect(self._onModelTypeChanged) self._tbl_model.dataChanged.connect(self.valueChanged) return layout
class ToolBar(QWidget): def __init__(self, parent=None): super(ToolBar, self).__init__(parent) self.setContentsMargins(0, 0, 0, 0) self.setLayout(QHBoxLayout()) iconButtonPolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed) iconButtonPolicy.setHorizontalStretch(0) iconButtonPolicy.setVerticalStretch(0) # -- przycisk wysłania -- self.sendButton = QPushButton(u"&Send", self) self.sendButton.setObjectName("sendButton") self.sendButton.setIcon(pea_app().send_icon) sendSizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed) self.sendButton.setSizePolicy(sendSizePolicy) self.layout().addWidget(self.sendButton) self.layout().addStretch() # -- przycisk dodawania self.addButton = QtGui.QPushButton(self) self.addButton.setObjectName("addButton") self.addButton.setSizePolicy(iconButtonPolicy) self.addButton.setIcon(pea_app().add_icon) self.layout().addWidget(self.addButton) # -- przycisk do dat self.datesButton = QtGui.QPushButton(self) self.datesButton.setCheckable(True) self.datesButton.setObjectName("datesButton") self.datesButton.setSizePolicy(iconButtonPolicy) self.datesButton.setIcon(pea_app().calendar_icon) self.layout().addWidget(self.datesButton) # -- przycisk zamykania self.closeButton = QtGui.QPushButton(self) self.closeButton.setObjectName("closeButton") self.closeButton.setSizePolicy(iconButtonPolicy) self.closeButton.setIcon(pea_app().close_icon) self.layout().addWidget(self.closeButton)
class SystemStatus(QWidget): def __init__(self, controller, parent=None): super(SystemStatus, self).__init__(parent) self.controller = controller self.status = Status.UNKNOWN layout = QVBoxLayout() self.icon = QPushButton(self) self.icon.setFlat(True) self.icon.setIcon(QPixmap(":icons/status-unknown")) self.icon.setIconSize(QSize(32, 32)) layout.addWidget(self.icon) self.icon.clicked.connect(self.showStatusPopup) self.setLayout(layout) timer = QTimer(self) timer.timeout.connect(self.checkStatus) timer.start(10000) # Ten seconds self.checkStatus() def checkStatus(self): # NB We deliberately don't use handlePyroErrors here' try: v = self.controller.getVersion() self.status = Status.OK self.status.message = "Status OK, controller version {}".format(v) except PyroError as e: self.status = Status.BAD self.status.message = str(e) self.icon.setIcon(QPixmap(self.status.icon)) def showStatusPopup(self): msgBox = QMessageBox( self.status.boxIcon, "System status", '<span style="color: white;">' + self.status.message + '</span>' ) msgBox.exec_()
def __init__(self): super(TransformationHistoryWidget, self).__init__() self.actionContainer = ButtonContainer() self.transformationModel = TransformationModel() self.transformationView = TransformationListView() self.transformationView.setRootIsDecorated(False) self.transformationView.setModel(self.transformationModel) layout = QVBoxLayout() layout.setSpacing(0) layout.setAlignment(Qt.AlignTop) layout.addWidget(self.transformationView) layout.addWidget(self.actionContainer) self.setLayout(layout) removeButton = QPushButton() removeButton.setIcon(QIcon(AppVars.imagePath() + "RemoveButton.png")) removeButton.clicked.connect(self.removeButtonClicked) self.actionContainer.addButton(removeButton)
class SystemStatus(QWidget): def __init__(self, controller, parent=None): super(SystemStatus, self).__init__(parent) self.controller = controller self.status = Status.UNKNOWN layout = QVBoxLayout() self.icon = QPushButton(self) self.icon.setFlat(True) self.icon.setIcon(QPixmap(":icons/status-unknown")) self.icon.setIconSize(QSize(32, 32)) layout.addWidget(self.icon) self.icon.clicked.connect(self.showStatusPopup) self.setLayout(layout) timer = QTimer(self) timer.timeout.connect(self.checkStatus) timer.start(10000) # Ten seconds self.checkStatus() def checkStatus(self): # NB We deliberately don't use handlePyroErrors here' try: v = self.controller.getVersion() self.status = Status.OK self.status.message = "Status OK, controller version {}".format(v) except PyroError as e: self.status = Status.BAD self.status.message = str(e) self.icon.setIcon(QPixmap(self.status.icon)) def showStatusPopup(self): msgBox = QMessageBox( self.status.boxIcon, "System status", '<span style="color: white;">' + self.status.message + '</span>') msgBox.exec_()
class MTTFilterFileDialog(QDialog): def __init__(self, define_path='', define_type=None): super(MTTFilterFileDialog, self).__init__(get_maya_window()) self.supported_node_type = sorted([ node_type for (node_type, nice, attr) in MTTSettings.SUPPORTED_TYPE ]) self.defined_path = (define_path if os.path.isdir(define_path) or define_path == SOURCEIMAGES_TAG else None) self.defined_type = (define_type if define_type in self.supported_node_type else None) self.path_edit = None self.filter_reset_btn = None self.filter_line = None self.parent_folder_btn = None self.files_model = None self.files_list = None self.bookmark_list = None self.bookmark_list_sel_model = None self.types = None # move window to cursor position win_geo = MTTSettings.value('FilterFileDialog/windowGeometry', QRect(0, 0, 400, 300)) self.setGeometry(win_geo) mouse_pos = QCursor.pos() mouse_pos.setX(mouse_pos.x() - (win_geo.width() * 0.5)) self.move(mouse_pos) self.__create_ui() self.filter_line.setFocus() self.on_change_root_path(self.defined_path or SOURCEIMAGES_TAG) def __create_ui(self): """ Create main UI """ self.setWindowTitle(CREATE_NODE_TITLE) # remove window decoration if path and type is set if self.defined_path and self.defined_type: self.setWindowFlags(Qt.FramelessWindowHint | Qt.Popup) main_layout = QVBoxLayout(self) main_layout.setSpacing(1) main_layout.setContentsMargins(2, 2, 2, 2) # content layout content_layout = QVBoxLayout() self.files_model = QFileSystemModel() self.files_model.setNameFilterDisables(False) self.files_list = MTTFileList() self.files_list.setAlternatingRowColors(True) self.files_list.setSelectionMode(QAbstractItemView.ExtendedSelection) self.files_list.selectionValidated.connect(self.do_validate_selection) self.files_list.goToParentDirectory.connect(self.on_go_up_parent) self.files_list.doubleClicked.connect(self.on_double_click) self.files_list.setModel(self.files_model) buttons_layout = QHBoxLayout() content_layout.addLayout(self.__create_filter_ui()) content_layout.addWidget(self.files_list) content_layout.addLayout(buttons_layout) self.files_list.filter_line = self.filter_line if not self.defined_path: # path line path_layout = QHBoxLayout() # bookmark button bookmark_btn = QPushButton('') bookmark_btn.setFlat(True) bookmark_btn.setIcon(QIcon(':/addBookmark.png')) bookmark_btn.setToolTip('Bookmark this Folder') bookmark_btn.setStatusTip('Bookmark this Folder') bookmark_btn.clicked.connect(self.on_add_bookmark) # path line edit self.path_edit = QLineEdit() self.path_edit.editingFinished.connect(self.on_enter_path) # parent folder button self.parent_folder_btn = QPushButton('') self.parent_folder_btn.setFlat(True) self.parent_folder_btn.setIcon( QIcon(':/SP_FileDialogToParent.png')) self.parent_folder_btn.setToolTip('Parent Directory') self.parent_folder_btn.setStatusTip('Parent Directory') self.parent_folder_btn.clicked.connect(self.on_go_up_parent) # browse button browse_btn = QPushButton('') browse_btn.setFlat(True) browse_btn.setIcon(QIcon(':/navButtonBrowse.png')) browse_btn.setToolTip('Browse Directory') browse_btn.setStatusTip('Browse Directory') browse_btn.clicked.connect(self.on_browse) # parent widget and layout path_layout.addWidget(bookmark_btn) path_layout.addWidget(self.path_edit) path_layout.addWidget(self.parent_folder_btn) path_layout.addWidget(browse_btn) main_layout.addLayout(path_layout) # bookmark list bookmark_parent_layout = QHBoxLayout() bookmark_frame = QFrame() bookmark_frame.setFixedWidth(120) bookmark_layout = QVBoxLayout() bookmark_layout.setSpacing(1) bookmark_layout.setContentsMargins(2, 2, 2, 2) bookmark_frame.setLayout(bookmark_layout) bookmark_frame.setFrameStyle(QFrame.Sunken) bookmark_frame.setFrameShape(QFrame.StyledPanel) self.bookmark_list = MTTBookmarkList() self.bookmark_list.bookmarkDeleted.connect(self.do_delete_bookmark) self.bookmark_list.setAlternatingRowColors(True) self.bookmark_list.dragEnabled() self.bookmark_list.setAcceptDrops(True) self.bookmark_list.setDropIndicatorShown(True) self.bookmark_list.setDragDropMode(QListView.InternalMove) self.bookmark_list_sel_model = self.bookmark_list.selectionModel() self.bookmark_list_sel_model.selectionChanged.connect( self.on_select_bookmark) bookmark_layout.addWidget(self.bookmark_list) bookmark_parent_layout.addWidget(bookmark_frame) bookmark_parent_layout.addLayout(content_layout) main_layout.addLayout(bookmark_parent_layout) self.do_populate_bookmarks() else: main_layout.addLayout(content_layout) if not self.defined_type: # type layout self.types = QComboBox() self.types.addItems(self.supported_node_type) self.types.currentIndexChanged.connect(self.on_node_type_changed) if cmds.optionVar(exists='MTT_lastNodeType'): last = cmds.optionVar(query='MTT_lastNodeType') if last in self.supported_node_type: self.types.setCurrentIndex( self.supported_node_type.index(last)) buttons_layout.addWidget(self.types) if not self.defined_path or not self.defined_type: create_btn = QPushButton('C&reate') create_btn.clicked.connect(self.accept) cancel_btn = QPushButton('&Cancel') cancel_btn.clicked.connect(self.reject) buttons_layout.addStretch() buttons_layout.addWidget(create_btn) buttons_layout.addWidget(cancel_btn) def __create_filter_ui(self): """ Create filter widgets """ filter_layout = QHBoxLayout() filter_layout.setSpacing(1) filter_layout.setContentsMargins(0, 0, 0, 0) self.filter_reset_btn = QPushButton() icon = QIcon(':/filtersOff.png') self.filter_reset_btn.setIcon(icon) self.filter_reset_btn.setIconSize(QSize(22, 22)) self.filter_reset_btn.setFixedSize(24, 24) self.filter_reset_btn.setToolTip('Reset filter') self.filter_reset_btn.setFlat(True) self.filter_reset_btn.clicked.connect( partial(self.on_filter_set_text, '')) self.filter_line = QLineEdit() self.filter_line.setPlaceholderText('Enter filter string here') self.filter_line.textChanged.connect(self.on_filter_change_text) completer = QCompleter(self) completer.setCaseSensitivity(Qt.CaseInsensitive) completer.setModel(QStringListModel([], self)) self.filter_line.setCompleter(completer) filter_layout.addWidget(self.filter_reset_btn) filter_layout.addWidget(self.filter_line) return filter_layout def on_filter_set_text(self, text=''): """ Set text in filter field """ self.filter_line.setText(text) def on_filter_change_text(self, text): """ Apply filter string """ if len(text): icon = QIcon(':/filtersOn.png') self.filter_reset_btn.setIcon(icon) else: icon = QIcon(':/filtersOff.png') self.filter_reset_btn.setIcon(icon) self.files_model.setNameFilters([ '*%s*' % item.strip() for item in text.split(',') if item.strip() ]) def on_node_type_changed(self, index): cmds.optionVar( sv=['MTT_lastNodeType', self.supported_node_type[index]]) def on_double_click(self, index): current_item = self.files_model.filePath(index) if os.path.isdir(current_item): self.on_change_root_path(current_item) elif os.path.isfile(current_item): self.accept() def on_change_root_path(self, current_path): if current_path == SOURCEIMAGES_TAG: current_path = os.path.join( cmds.workspace(query=True, rootDirectory=True), cmds.workspace(fileRuleEntry='sourceImages')) self.files_model.setRootPath(current_path) self.files_list.setRootIndex(self.files_model.index(current_path)) if self.path_edit: self.path_edit.setText(current_path) if self.parent_folder_btn: current_dir = QDir(current_path) self.parent_folder_btn.setEnabled(current_dir.cdUp()) def on_go_up_parent(self): current_path = QDir(self.files_model.rootPath()) current_path.cdUp() self.on_change_root_path(current_path.absolutePath()) def on_enter_path(self): new_path = self.path_edit.text() if os.path.isdir(new_path): self.on_change_root_path(new_path) else: self.path_edit.setText(self.files_model.rootPath()) def on_browse(self): current_path = self.files_model.rootPath() file_dialog = QFileDialog(self, 'Select a Folder', current_path) file_dialog.setFileMode(QFileDialog.Directory) file_dialog.setOption(QFileDialog.ShowDirsOnly) if file_dialog.exec_(): self.on_change_root_path(file_dialog.selectedFiles()[0]) def on_select_bookmark(self, selected, deselected): current_item = selected.indexes() if current_item: self.on_change_root_path( self.bookmark_list.selectedItems()[0].root_path) def on_add_bookmark(self): current_path = self.files_model.rootPath() self.on_add_bookmark_item( '%s|%s' % (os.path.basename(current_path), current_path)) def on_add_bookmark_item(self, item): if item == '': return current_item = MTTBookmarkItem() current_item.add_raw_data(item) current_item.setSizeHint(QSize(40, 25)) current_item.setFlags(Qt.ItemIsEnabled | Qt.ItemIsEditable | Qt.ItemIsSelectable | Qt.ItemIsDragEnabled) self.bookmark_list.addItem(current_item) def do_delete_bookmark(self): current_item = self.bookmark_list.selectedItems() if current_item: item_row = self.bookmark_list.row(current_item[0]) self.bookmark_list.takeItem(item_row) del current_item[0] def do_save_bookmark(self): if not self.bookmark_list: return row_count = self.bookmark_list.count() ordered_list = list() for i in range(row_count): item = self.bookmark_list.item(i) name = item.text().replace(',', '_').replace('|', '_') path = item.root_path if name != 'sourceimages': ordered_list.append('%s|%s' % (name, path)) MTTSettings.set_value('FilterFileDialog/bookmarks', ','.join(ordered_list)) def do_populate_bookmarks(self): bookmarks = ['sourceimages|%s' % SOURCEIMAGES_TAG] bookmarks.extend( MTTSettings.value('FilterFileDialog/bookmarks').split(',')) for bm in bookmarks: self.on_add_bookmark_item(bm) def do_validate_selection(self): selection = self.files_list.selectedIndexes() if len(selection) == 1: current_path = self.files_model.filePath(selection[0]) if os.path.isdir(current_path): self.on_change_root_path(current_path) return self.accept() def get_selected_files(self): selected_items = list() for item_index in self.files_list.selectedIndexes(): current_path = self.files_model.filePath(item_index) if os.path.isfile(current_path): selected_items.append(current_path) return selected_items def get_node_type(self): return self.types.currentText() if self.types else self.defined_type def closeEvent(self, event): MTTSettings.set_value('FilterFileDialog/windowGeometry', self.geometry()) self.do_save_bookmark() self.deleteLater() event.accept()
def __create_ui(self): """ Create main UI """ self.setWindowTitle(CREATE_NODE_TITLE) # remove window decoration if path and type is set if self.defined_path and self.defined_type: self.setWindowFlags(Qt.FramelessWindowHint | Qt.Popup) main_layout = QVBoxLayout(self) main_layout.setSpacing(1) main_layout.setContentsMargins(2, 2, 2, 2) # content layout content_layout = QVBoxLayout() self.files_model = QFileSystemModel() self.files_model.setNameFilterDisables(False) self.files_list = MTTFileList() self.files_list.setAlternatingRowColors(True) self.files_list.setSelectionMode(QAbstractItemView.ExtendedSelection) self.files_list.selectionValidated.connect(self.do_validate_selection) self.files_list.goToParentDirectory.connect(self.on_go_up_parent) self.files_list.doubleClicked.connect(self.on_double_click) self.files_list.setModel(self.files_model) buttons_layout = QHBoxLayout() content_layout.addLayout(self.__create_filter_ui()) content_layout.addWidget(self.files_list) content_layout.addLayout(buttons_layout) self.files_list.filter_line = self.filter_line if not self.defined_path: # path line path_layout = QHBoxLayout() # bookmark button bookmark_btn = QPushButton('') bookmark_btn.setFlat(True) bookmark_btn.setIcon(QIcon(':/addBookmark.png')) bookmark_btn.setToolTip('Bookmark this Folder') bookmark_btn.setStatusTip('Bookmark this Folder') bookmark_btn.clicked.connect(self.on_add_bookmark) # path line edit self.path_edit = QLineEdit() self.path_edit.editingFinished.connect(self.on_enter_path) # parent folder button self.parent_folder_btn = QPushButton('') self.parent_folder_btn.setFlat(True) self.parent_folder_btn.setIcon( QIcon(':/SP_FileDialogToParent.png')) self.parent_folder_btn.setToolTip('Parent Directory') self.parent_folder_btn.setStatusTip('Parent Directory') self.parent_folder_btn.clicked.connect(self.on_go_up_parent) # browse button browse_btn = QPushButton('') browse_btn.setFlat(True) browse_btn.setIcon(QIcon(':/navButtonBrowse.png')) browse_btn.setToolTip('Browse Directory') browse_btn.setStatusTip('Browse Directory') browse_btn.clicked.connect(self.on_browse) # parent widget and layout path_layout.addWidget(bookmark_btn) path_layout.addWidget(self.path_edit) path_layout.addWidget(self.parent_folder_btn) path_layout.addWidget(browse_btn) main_layout.addLayout(path_layout) # bookmark list bookmark_parent_layout = QHBoxLayout() bookmark_frame = QFrame() bookmark_frame.setFixedWidth(120) bookmark_layout = QVBoxLayout() bookmark_layout.setSpacing(1) bookmark_layout.setContentsMargins(2, 2, 2, 2) bookmark_frame.setLayout(bookmark_layout) bookmark_frame.setFrameStyle(QFrame.Sunken) bookmark_frame.setFrameShape(QFrame.StyledPanel) self.bookmark_list = MTTBookmarkList() self.bookmark_list.bookmarkDeleted.connect(self.do_delete_bookmark) self.bookmark_list.setAlternatingRowColors(True) self.bookmark_list.dragEnabled() self.bookmark_list.setAcceptDrops(True) self.bookmark_list.setDropIndicatorShown(True) self.bookmark_list.setDragDropMode(QListView.InternalMove) self.bookmark_list_sel_model = self.bookmark_list.selectionModel() self.bookmark_list_sel_model.selectionChanged.connect( self.on_select_bookmark) bookmark_layout.addWidget(self.bookmark_list) bookmark_parent_layout.addWidget(bookmark_frame) bookmark_parent_layout.addLayout(content_layout) main_layout.addLayout(bookmark_parent_layout) self.do_populate_bookmarks() else: main_layout.addLayout(content_layout) if not self.defined_type: # type layout self.types = QComboBox() self.types.addItems(self.supported_node_type) self.types.currentIndexChanged.connect(self.on_node_type_changed) if cmds.optionVar(exists='MTT_lastNodeType'): last = cmds.optionVar(query='MTT_lastNodeType') if last in self.supported_node_type: self.types.setCurrentIndex( self.supported_node_type.index(last)) buttons_layout.addWidget(self.types) if not self.defined_path or not self.defined_type: create_btn = QPushButton('C&reate') create_btn.clicked.connect(self.accept) cancel_btn = QPushButton('&Cancel') cancel_btn.clicked.connect(self.reject) buttons_layout.addStretch() buttons_layout.addWidget(create_btn) buttons_layout.addWidget(cancel_btn)
class SettingsWindow(QDialog): def __init__(self, parent): super(self.__class__, self).__init__(parent) self.parent = parent self.lib = libserial.InitApp(self) if self.parent.receive is not None: self.boolean_config_is_ok = True else: self.boolean_config_is_ok = False self.config_parser = ConfigParser.ConfigParser() self.config_parser.read("config/profiles/profiles.ini") self.settings_parser = ConfigParser.ConfigParser() self.settings_parser.read('config/settings.ini') self.setWindowTitle(SERIAL_CHAT_SETTINGS_TITLE) self.button_box_dialog = QDialogButtonBox(QDialogButtonBox.Cancel | QDialogButtonBox.Ok) self.button_box_dialog.button(QDialogButtonBox.Ok).setText(CONNECT) self.button_box_dialog.button(QDialogButtonBox.Cancel).setText(CANCEL) self.button_box_dialog.accepted.connect(self.accept) self.accepted.connect(self.apply_setting_changes) self.button_box_dialog.rejected.connect(self.reject) self.serial_dropdown = QComboBox() self.lib.init__serial() self.serial_values = self.lib.get_serials() for serials in self.serial_values: self.serial_dropdown.addItem(serials) if self.parent.serial_port is not None: self.serial_dropdown.setCurrentIndex( self.serial_dropdown.findText(self.parent.serial_port.name)) self.profiles_combobox = QComboBox() self.profiles_combobox.addItem("None") if self.parent.choosen_profile == "Custom": self.profiles_combobox.addItem("Custom") for profile in self.config_parser.sections(): self.profiles_combobox.addItem(profile) if self.parent.custom_settings: self.profiles_combobox.setCurrentIndex( self.profiles_combobox.findText('Custom')) elif self.parent.choosen_profile != 'None': self.profiles_combobox.setCurrentIndex( self.profiles_combobox.findText(self.parent.choosen_profile)) else: self.profiles_combobox.setCurrentIndex( self.profiles_combobox.findText('None')) self.profiles_combobox.currentIndexChanged.connect( self.change_custom_settings_on_profile) self.custom_settings_checkbox = QCheckBox() self.custom_settings_checkbox.stateChanged.connect( self.custom_settings_enable_disable) self.interval_time_lineedit = QLineEdit(str(self.parent.interval_time)) self.interval_time_lineedit.editingFinished.connect( self.check_if_digit) self.interval_time_lineedit.setDisabled(True) self.serial_speed_combobox = QComboBox() for sp in serial_speeds: self.serial_speed_combobox.addItem(str(sp)) if self.boolean_config_is_ok: self.serial_speed_combobox.setCurrentIndex( self.serial_speed_combobox.findText( str(self.parent.serial_port.baudrate))) else: self.serial_speed_combobox.setCurrentIndex( self.serial_speed_combobox.findText('9600')) self.serial_speed_combobox.setDisabled(True) self.databits_combobox = QComboBox() for db in bytesize_values: self.databits_combobox.addItem(str(db)) if self.boolean_config_is_ok: self.databits_combobox.setCurrentIndex( self.databits_combobox.findText( str(self.parent.serial_port.bytesize))) else: self.databits_combobox.setCurrentIndex( self.databits_combobox.findText('8')) self.databits_combobox.setDisabled(True) self.stopbits_combobox = QComboBox() for sb in stop_values: self.stopbits_combobox.addItem(str(sb)) if self.boolean_config_is_ok: sb = str(self.parent.serial_port.stopbits).replace('.', ',') self.stopbits_combobox.setCurrentIndex( self.stopbits_combobox.findText(str(sb))) else: self.stopbits_combobox.setCurrentIndex( self.stopbits_combobox.findText('1')) self.stopbits_combobox.setDisabled(True) self.parity_combobox = QComboBox() for par in parity_values: self.parity_combobox.addItem(str(par)) if self.boolean_config_is_ok: table = {'O': 'Odd', 'E': 'Even', 'N': 'None'} xxx = [ item for key, item in table.items() if self.parent.serial_port.parity == key ] self.parity_combobox.setCurrentIndex(parity_values.index(xxx[0])) else: self.parity_combobox.setCurrentIndex( self.parity_combobox.findText("None")) self.parity_combobox.setDisabled(True) self.flowcontrol_combobox = QComboBox() for fc in flow_control_values: self.flowcontrol_combobox.addItem(str(fc)) if self.boolean_config_is_ok: if self.parent.serial_port.xonxoff: self.flowcontrol_combobox.setCurrentIndex( self.flowcontrol_combobox.findText("XON/XOFF")) elif self.parent.serial_port.rtscts: self.flowcontrol_combobox.setCurrentIndex( self.flowcontrol_combobox.findText("RTS/CTS")) else: self.flowcontrol_combobox.setCurrentIndex( self.flowcontrol_combobox.findText("None")) else: self.flowcontrol_combobox.setCurrentIndex( self.flowcontrol_combobox.findText("None")) self.flowcontrol_combobox.setDisabled(True) self.nickname_lineedit = QLineEdit() if self.settings_parser.has_option('default', 'nickname'): nickname = self.settings_parser.get('default', 'nickname') if type(nickname) == str: nickname = nickname.decode('utf-8') self.nickname_lineedit.setText( self.settings_parser.get('default', 'nickname')) else: if self.parent.nickname is None: self.nickname_lineedit.setText("Guest_" + MD5.new( str(datetime.datetime.now())).digest().encode('hex')[:5]) else: self.nickname_lineedit.setText(self.parent.nickname) self.save_folder_editline = QLineEdit(self.parent.default_save_folder) self.save_folder_editline.editingFinished.connect( self.check_if_folder_exists) if self.settings_parser.has_option('default', 'default_save_folder'): folder = self.settings_parser.get('default', 'default_save_folder') if type(folder) == str: folder = folder.decode('utf-8') self.save_folder_editline.setText(folder) self.check_if_folder_exists() self.dir_browser_button = QPushButton() self.dir_browser_button.setIcon(QIcon(icons_folder + 'folder.png')) self.dir_browser_button.clicked.connect(self.choose_save_dir) self.horizontal_box_hboxlayout = QHBoxLayout() self.horizontal_box_hboxlayout.addWidget(self.save_folder_editline) self.horizontal_box_hboxlayout.addWidget(self.dir_browser_button) self.horizontal_box_container_widget = QWidget() self.horizontal_box_container_widget.setLayout( self.horizontal_box_hboxlayout) self.enable_ACP127 = QCheckBox() self.enable_ACP127.stateChanged.connect( self.enable_functionality_ACP127) if self.parent.acp127: self.enable_ACP127.setChecked(True) self.encryption_password_lineedit = QLineEdit() self.enable_encryption_checkbox = QCheckBox() self.enable_encryption_checkbox.stateChanged.connect( self.enable_functionality_encryption) if self.parent.isEncryptionEnabled: self.enable_encryption_checkbox.setChecked(True) self.encryption_password_lineedit.setEchoMode( QLineEdit.EchoMode.PasswordEchoOnEdit) if self.parent.encryption_key is not None: self.encryption_password_lineedit.setText( self.parent.encryption_key) if self.enable_encryption_checkbox.isChecked(): self.encryption_password_lineedit.setDisabled(False) else: self.encryption_password_lineedit.setDisabled(True) self.grid_form_layout = QFormLayout() self.grid_form_layout.addRow(FORMLAYOUT_SERIAL_TITLE + ":", self.serial_dropdown) self.grid_form_layout.addRow(FORMLAYOUT_PROFILE_TITLE + ":", self.profiles_combobox) self.grid_form_layout.addRow(FORMLAYOUT_CUSTOM_SERIAL_SETTINGS_TITLE, self.custom_settings_checkbox) self.grid_form_layout.addRow(FORMLAYOUT_INTERVAL_TIME_TITLE + ":", self.interval_time_lineedit) self.grid_form_layout.addRow(FORMLAYOUT_SERIAL_SPEED_TITLE + "(baud):", self.serial_speed_combobox) self.grid_form_layout.addRow(FORMLAYOUT_DATA_BITS_TITLE + ":", self.databits_combobox) self.grid_form_layout.addRow(FORMLAYOUT_STOP_BITS_TITLE + ":", self.stopbits_combobox) self.grid_form_layout.addRow(FORMLAYOUT_PARITY_TITLE + ":", self.parity_combobox) self.grid_form_layout.addRow(FORMLAYOUT_FLOWCONTROL_TITLE + ":", self.flowcontrol_combobox) self.grid_form_layout.addRow( FORMLAYOUT_ENABLE_ACP127_TITLE + " ACP-127", self.enable_ACP127) self.grid_form_layout.addRow(FORMLAYOUT_ENABLE_ENCRYPTION_TITLE, self.enable_encryption_checkbox) self.grid_form_layout.addRow(FORMLAYOUT_ENCRYPTION_KEY_TITLE, self.encryption_password_lineedit) self.grid_form_layout.addRow(FORMLAYOUT_NICKNAME_TITLE + ":", self.nickname_lineedit) self.grid_form_layout.addRow(FORMLAYOUT_SAVE_FOLDER_FILE_TITLE + ":", self.horizontal_box_container_widget) self.grid_form_layout.addRow("", self.button_box_dialog) self.setLayout(self.grid_form_layout) self.show() def enable_functionality_encryption(self): if self.enable_encryption_checkbox.isChecked(): self.encryption_password_lineedit.setDisabled(False) else: self.encryption_password_lineedit.setDisabled(True) def check_if_folder_exists(self): if not os.path.isdir(self.save_folder_editline.text()): msgBox = QMessageBox(icon=QMessageBox.Warning, text=ERROR_NO_DIR_MESSAGE) msgBox.setWindowTitle(ERROR_NO_DIR_TITLE) msgBox.exec_() self.save_folder_editline.setText(self.parent.default_save_folder) def check_if_digit(self): try: int(self.interval_time_lineedit.text()) except: msgBox = QMessageBox(icon=QMessageBox.Warning, text=ERROR_NO_INT_MESSAGE) msgBox.setWindowTitle(ERROR_NO_INT_TITLE) msgBox.exec_() self.interval_time_lineedit.setText(str(self.parent.interval_time)) def choose_save_dir(self): fname = QFileDialog(self, FILEBROWSER_SAVE_FOLDER_TITLE) fname.setFileMode(QFileDialog.Directory) looking_label = QFileDialog.DialogLabel(QFileDialog.LookIn) filename_label = QFileDialog.DialogLabel(QFileDialog.FileName) filetype_label = QFileDialog.DialogLabel(QFileDialog.FileType) fname.setLabelText(looking_label, FILEBROWSER_SAVE_FOLDER_LOOKIN) fname.setLabelText(filename_label, FILEBROWSER_SAVE_FOLDER_FOLDERNAME) fname.setLabelText(filetype_label, FILEBROWSER_SAVE_FOLDER_FOLDERTYPE) fname.setOption(QFileDialog.ShowDirsOnly) if fname.exec_(): filename = fname.selectedFiles()[0] self.save_folder_editline.setText(filename) def enable_functionality_ACP127(self): if self.enable_ACP127.isChecked(): self.parent.acp127 = True else: self.parent.acp127 = False def apply_setting_changes(self): res = None self.parent.custom_settings_enable_disable = self.custom_settings_checkbox.isChecked( ) self.parent.choosen_profile = self.profiles_combobox.currentText() if self.parent.custom_settings_enable_disable: self.parent.choosen_profile = "Custom" if self.enable_encryption_checkbox.isChecked(): self.parent.isEncryptionEnabled = True self.parent.encryption_key = self.encryption_password_lineedit.text( ) else: self.parent.isEncryptionEnabled = False self.parent.encryption_key = None if self.nickname_lineedit.text() != "": nick = self.nickname_lineedit.text().rstrip() nick = nick.replace(" ", "_") self.parent.nickname = nick if self.save_folder_editline.text() != "": if os.path.isdir(self.save_folder_editline.text()): self.parent.default_save_folder = self.save_folder_editline.text( ) self.parent.interval_time = int(self.interval_time_lineedit.text()) if self.flowcontrol_combobox.currentText() == "XON/XOFF": x_control = True else: x_control = False if self.flowcontrol_combobox.currentText() == "RTS/CTS": r_control = True else: r_control = False if self.parent.receive is None: res = self.lib.set_serial( port=self.serial_dropdown.currentText(), baudrate=self.serial_speed_combobox.currentText(), bytesize=self.databits_combobox.currentText(), stopbits=self.stopbits_combobox.currentText(), parity=self.parity_combobox.currentText(), xonxoff=x_control, rtscts=r_control) else: self.parent.receive.loop_run = False self.parent.receive.wait() self.parent.receive = None res = self.lib.set_serial( port=self.serial_dropdown.currentText(), baudrate=self.serial_speed_combobox.currentText(), bytesize=self.databits_combobox.currentText(), stopbits=self.stopbits_combobox.currentText(), parity=self.parity_combobox.currentText(), xonxoff=x_control, rtscts=r_control) if type(res) == OSError: self.parent.status_bar_widget.showMessage(str(res), 5000) msgBox = QMessageBox(icon=QMessageBox.Critical, text=str(res)) msgBox.setWindowTitle(ERROR_INTERFACE_TITLE) msgBox.exec_() if type(res) is not None and type(res) != OSError: self.parent.serial_port = res self.parent.start_threads() self.parent.status_bar_widget.showMessage( MSG_SERIAL_INT_STARTED % self.parent.serial_port.port) def change_custom_settings_on_profile(self): if self.profiles_combobox.currentText() != 'None': section = self.profiles_combobox.currentText() self.interval_time_lineedit.setText( self.config_parser.get(section, "interval")) self.serial_speed_combobox.setCurrentIndex( self.serial_speed_combobox.findText( self.config_parser.get(section, "serialspeed"))) self.databits_combobox.setCurrentIndex( self.databits_combobox.findText( self.config_parser.get(section, "bytesize"))) self.stopbits_combobox.setCurrentIndex( self.stopbits_combobox.findText( self.config_parser.get(section, "stopbits"))) self.parity_combobox.setCurrentIndex( self.parity_combobox.findText( self.config_parser.get(section, "parity"))) if self.config_parser.get(section, "xonxoff") == 'True': self.flowcontrol_combobox.setCurrentIndex( self.flowcontrol_combobox.findText("XON/XOFF")) elif self.config_parser.get(section, "rtscts") == 'True': self.flowcontrol_combobox.setCurrentIndex( self.flowcontrol_combobox.findText("RTS/CTS")) else: self.flowcontrol_combobox.setCurrentIndex( self.flowcontrol_combobox.findText("None")) if self.config_parser.get(section, "acp127") == "True": self.enable_ACP127.setChecked(True) else: self.enable_ACP127.setChecked(False) elif self.profiles_combobox.currentText() == "None": self.serial_speed_combobox.setCurrentIndex( self.serial_speed_combobox.findText('9600')) self.interval_time_lineedit.setText(str(self.parent.intervaltime)) self.databits_combobox.setCurrentIndex( self.databits_combobox.findText('8')) self.stopbits_combobox.setCurrentIndex( self.stopbits_combobox.findText('1')) self.parity_combobox.setCurrentIndex( self.parity_combobox.findText('None')) self.flowcontrol_combobox.setCurrentIndex( self.flowcontrol_combobox.findText('None')) self.enable_ACP127.setChecked(False) def custom_settings_enable_disable(self): if self.custom_settings_checkbox.isChecked(): self.interval_time_lineedit.setDisabled(False) self.serial_speed_combobox.setDisabled(False) self.databits_combobox.setDisabled(False) self.stopbits_combobox.setDisabled(False) self.parity_combobox.setDisabled(False) self.flowcontrol_combobox.setDisabled(False) else: self.interval_time_lineedit.setDisabled(True) self.serial_speed_combobox.setDisabled(True) self.databits_combobox.setDisabled(True) self.stopbits_combobox.setDisabled(True) self.parity_combobox.setDisabled(True) self.flowcontrol_combobox.setDisabled(True)
class LoginForm(QDialog): logged_in = Signal() def __init__(self, parent=None): super(LoginForm, self).__init__(parent) self.setWindowTitle("Login") self.status_icon = QIcon.fromTheme("user-offline") self.setWindowIcon(self.status_icon) self.server_status = QLabel() self.server_status.setAlignment(Qt.AlignCenter) self.server_status.setPixmap(self.status_icon.pixmap(64)) self.username = QLineEdit("Username") self.password = QLineEdit("Password") self.password.setEchoMode(QLineEdit.Password) self.login_button = QPushButton("Getting server status...") self.login_button.setEnabled(False) self.login_button.clicked.connect(self.login) self.login_button.setIcon(self.status_icon) self.ping_timer = QTimer(self) self.connect(self.ping_timer, SIGNAL("timeout()"), self.is_server_up) self.ping_timer.start(1000) layout = QVBoxLayout() for w in (self.server_status, self.username, self.password, self.login_button): layout.addWidget(w) self.setLayout(layout) self.logged_in.connect(qtclient.login) def is_server_up(self): '''Tests to see if the authentication server is up.''' global client from requests.exceptions import ConnectionError try: if client.ping(): self.login_button.setEnabled(True) self.login_button.setText("Login!") self.status_icon = QIcon.fromTheme("user-online") except (ConnectionError): # We can only wait until the server comes back up. self.login_button.setEnabled(False) self.login_button.setText("Server is offline. :(") self.status_icon = QIcon.fromTheme("user-offline") self.setWindowIcon(self.status_icon) self.server_status.setPixmap(self.status_icon.pixmap(64)) self.login_button.setIcon(self.status_icon) def login(self): # TODO: This could be an exception if login failed. Catch it. login_result = client.authenticate(self.username.text(), self.password.text()) if login_result: # We logged in, so show the character select dialog self.logged_in.emit() # Once its shown, mark this dialog as accepted (And by extension, close it.) self.accept()
def __init__(self, user, parent): super(UserDetailsWindow, self).__init__(parent) self.user = user self.centralWidget = QWidget() self.setCentralWidget(self.centralWidget) layout = QVBoxLayout() layout.setSpacing(0) layout.setContentsMargins(11, 11, 11, 11) self.centralWidget.setLayout(layout) self.container = QWidget() self.scrollArea = QScrollArea() self.scrollArea.setWidget(self.container) self.scrollArea.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff) layout.addWidget(self.scrollArea) self.scrollArea.setWidgetResizable(True) gridLayout = QGridLayout() self.container.setLayout(gridLayout) firstName = user['user']['firstName'] name = firstName if 'lastName' in user['user']: name += " " + user['user']['lastName'] self.setWindowTitle(name) photo_label = QLabel() photo = QImage(foursquare.image(self.user['user']['photo'])) photo_label.setPixmap(QPixmap(photo)) i = 0 gridLayout.addWidget(UserProfile(user), i, 0, 1, 2) ### checkin button if user['user']['relationship'] != "self": i += 1 self.shoutText = QLineEdit(self) self.shoutText.setPlaceholderText("Shout something") gridLayout.addWidget(self.shoutText, i, 0) checkinButton = QPushButton("Check-in with " + firstName) self.connect(checkinButton, SIGNAL("clicked()"), self.checkin) gridLayout.addWidget(checkinButton, i, 1) # TODO! #if user['user']['relationship'] == "friend": # i += 1 # gridLayout.addWidget(QLabel("TODO: Unfriend"), i, 0, 1, 2) elif user['user']['relationship'] == "self": i += 1 gridLayout.addWidget(QLabel("It's you!"), i, 0, 1, 2) if user['user']['id'] == "17270875": i += 1 gridLayout.addWidget(QLabel("<b>This is the UberSquare developer!</b>"), i, 0, 1, 2) i += 1 checkins = user['user']['checkins']['count'] gridLayout.addWidget(QLabel(str(checkins) + " checkins"), i, 0) i += 1 badges = user['user']['badges']['count'] gridLayout.addWidget(QLabel(str(badges) + " badges"), i, 0) i += 1 mayorships = user['user']['mayorships']['count'] if mayorships > 0: mayorshipsButton = QPushButton(str(mayorships) + " mayorships") mayorshipsButton.setIcon(QIcon(foursquare.image("https://foursquare.com/img/points/mayor.png"))) self.connect(mayorshipsButton, SIGNAL("clicked()"), self.mayorships_pushed) gridLayout.addWidget(mayorshipsButton, i, 0, 1, 2) else: gridLayout.addWidget(QLabel("No mayorships"), i, 0) i += 1 # TODO! #gridLayout.addWidget(QPushButton("TODO: See places " + firstName + " has been to."), i, 0, 1, 2) #i += 1 update_user_button = QPushButton("Refresh user details") update_user_button.setIcon(QIcon.fromTheme("general_refresh")) self.connect(update_user_button, SIGNAL("clicked()"), self.__update) gridLayout.addWidget(update_user_button, i, 0, 1, 2) showUser = Signal() self.connect(self, SIGNAL("showUser()"), self.__showUser)
class UsbResetter(QWidget): def __init__(self): super(UsbResetter, self).__init__() self.P = UR_thread() self.thr_counter = 0 self.Looping = None self.Hidden = None self.Fhidden = None self.s_error = "QStatusBar{color:red;font-weight:1000;}" self.s_loop = "QStatusBar{color:black;font-weight:1000;}" self.s_norm = "QStatusBar{color:blue;font-style:italic;" self.s_norm += "font-weight:500;}" favicon = r_path("images/favicon.png") logo = r_path("images/logo.png") if name == 'nt': favicon = r_path("images\\favicon.png") logo = r_path("images\\logo.png") self.favicon = QIcon(favicon) self.plogo = logo self.logo = QIcon(logo) self.setStyle() mlayout = QVBoxLayout() self.setAbout(mlayout) self.setUlist(mlayout) self.setCboxs(mlayout) self.setReset(mlayout) self.setLoop(mlayout) self.setSb(mlayout) # functionalities self.set_list() self.rootWarn() # initiation self.activateWindow() self.setLayout(mlayout) self.show() def setSb(self, m): self.statusbar = QStatusBar() m.addWidget(self.statusbar) def setStyle(self): self.setMaximumWidth(350) self.setMinimumWidth(350) self.setMaximumHeight(340) self.setMinimumHeight(340) self.setWindowTitle("usb-resetter 1.0") self.setWindowIcon(self.favicon) self.show() def setAbout(self, m): self.pushButton = QPushButton() self.icon1 = QIcon() self.icon1.addPixmap(QPixmap(self.plogo), QIcon.Normal, QIcon.Off) self.pushButton.setIcon(self.icon1) self.pushButton.setIconSize(QSize(300, 100)) self.pushButton.clicked.connect(self.show_about) m.addWidget(self.pushButton) def setUlist(self, m): self.comboBox = QComboBox() m.addWidget(self.comboBox) def setCboxs(self, m): ml = QVBoxLayout() fl = QHBoxLayout() self.checkBox_2 = QCheckBox("Audio") self.checkBox_3 = QCheckBox("Mass storage") self.checkBox_2.setToolTip("Filter by audio devices") self.checkBox_3.setToolTip("Filter by mass storage devices") fl.addWidget(self.checkBox_2) fl.addWidget(self.checkBox_3) ml.addLayout(fl) sl = QHBoxLayout() self.checkBox_4 = QCheckBox("Network") self.checkBox_4.setToolTip("Filter by network devices") self.checkBox_5 = QCheckBox("Human interface") self.checkBox_5.setToolTip("Filter by Keyboard, mouse, joystick ..etc") sl.addWidget(self.checkBox_4) sl.addWidget(self.checkBox_5) ml.addLayout(sl) self.checkBox_2.clicked.connect(self.set_list) self.checkBox_3.clicked.connect(self.set_list) self.checkBox_4.clicked.connect(self.set_list) self.checkBox_5.clicked.connect(self.set_list) m.addLayout(ml) def setReset(self, m): self.pushButton_2 = QPushButton("Reset it") font = QFont() font.setPointSize(17) font.setWeight(75) font.setBold(True) self.pushButton_2.setFont(font) self.pushButton_2.clicked.connect(self.setbut_reset) m.addWidget(self.pushButton_2) def setLoop(self, m): ml = QHBoxLayout() self.checkBox = QCheckBox("Looping") self.checkBox.setToolTip("To repeat resetting for specified duration") self.lineEdit = QLineEdit() self.lineEdit.setToolTip("Duration in-which the resetting is done") self.pushButton_3 = QPushButton("Stop") self.pushButton_3.setToolTip("Stop looping") ml.addWidget(self.checkBox) ml.addWidget(self.lineEdit) ml.addWidget(self.pushButton_3) self.pushButton_3.setEnabled(False) self.lineEdit.setEnabled(False) self.lineEdit.setPlaceholderText("duration in seconds") self.checkBox.clicked.connect(self.loop_status) self.pushButton_3.clicked.connect(self.in_loop) m.addLayout(ml) # Functionalities def show_about(self): Amsg = "<center>All credit reserved to the author of " Amsg += "usb-resetter version 1.0" Amsg += ", This work is a free, open-source project licensed " Amsg += " under Mozilla Public License version 2.0 . <br><br>" Amsg += " visit us for more infos and how-tos :<br> " Amsg += "<b><a href='https://usb-resetter.github.io/'> " Amsg += "https://usb-resetter.github.io/ </a> </b></center>" Amsgb = "About usb-resetter" v = QMessageBox.about(self, Amsgb, Amsg) v = str(v) return v def closeEvent(self, event=None): if self.Hidden is None: response = QMessageBox.question( self, "Hide or close", "Do you want to hide the application ?", QMessageBox.Yes, QMessageBox.No) if response == QMessageBox.Yes: if event is not None: event.ignore() self.Hidden = True self.hide() elif response == QMessageBox.No: if event is not None: event.accept() return self.exitEvent() else: return False else: return self.exitEvent() def exitEvent(self): if self.P.isRunning(): response = QMessageBox.question( self, "Making sure", "Sure, you want to exit while looping ?", QMessageBox.Yes, QMessageBox.No) if response == QMessageBox.Yes: self.P.stop() exit(0) else: return False else: exit(0) def get_list(self): ol = [] if self.checkBox_2.isChecked(): ol.append(1) if self.checkBox_3.isChecked(): ol.append(8) if self.checkBox_4.isChecked(): ol.append(2) if self.checkBox_5.isChecked(): ol.append(3) if len(ol) >= 1: return listd(ol, True) else: return listd(None, True) def set_list(self): self.comboBox.clear() its = self.get_list() if len(its) >= 1: self.comboBox.addItems(its) self.pushButton_2.setEnabled(True) self.checkBox.setEnabled(True) else: self.pushButton_2.setEnabled(False) self.checkBox.setEnabled(False) self.lineEdit.setEnabled(False) self.pushButton_3.setEnabled(False) def setbut_reset(self): t = self.comboBox.currentText() if self.Looping is None: if resetit(t): self.statusbar.setStyleSheet(self.s_norm) self.statusbar.showMessage( "# Done: usb device got reset") return True self.statusbar.setStyleSheet(self.s_error) if name != 'nt': self.statusbar.showMessage( "# Error: maybe you need sudo permissions") else: self.statusbar.showMessage( "# Error: maybe you need to add device to libusb") return False else: tl = self.lineEdit.text() self.statusbar.setStyleSheet(self.s_error) if len(tl) == 0: self.statusbar.showMessage( "# Error: you must enter duration for looping") return False try: self.thr_counter += 1 tl = int(tl) if tl < 2: self.statusbar.showMessage( "# Error: the least allowed value is 2") return False self.P = UR_thread(t, tl, self.thr_counter) self.P.start() self.P.somesignal.connect(self.handleStatusMessage) self.P.setTerminationEnabled(True) self.in_loop(False) except: self.statusbar.showMessage( "# Error: only valid integers allowed") return False def loop_status(self): if self.Looping: self.Looping = None self.lineEdit.setEnabled(False) self.pushButton_3.setEnabled(False) else: self.Looping = True self.lineEdit.setEnabled(True) return True def in_loop(self, stop=True): if stop: if self.P.isRunning(): self.P.stop() self.pushButton_3.setEnabled(False) self.pushButton_2.setEnabled(True) self.checkBox.setEnabled(True) if self.checkBox.isChecked(): self.lineEdit.setEnabled(True) self.checkBox_2.setEnabled(True) self.checkBox_3.setEnabled(True) self.checkBox_4.setEnabled(True) self.checkBox_5.setEnabled(True) self.comboBox.setEnabled(True) else: self.pushButton_3.setEnabled(True) self.pushButton_2.setEnabled(False) self.checkBox.setEnabled(False) self.lineEdit.setEnabled(False) self.checkBox_2.setEnabled(False) self.checkBox_3.setEnabled(False) self.checkBox_4.setEnabled(False) self.checkBox_5.setEnabled(False) self.comboBox.setEnabled(False) return True def rootWarn(self): if platform[:len(platform) - 1] == "linux": from os import getuid if getuid() != 0: self.statusbar.setStyleSheet(self.s_error) self.statusbar.showMessage( "# Error: you must use sudo on Linux") @Slot(object) def handleStatusMessage(self, message): self.statusbar.setStyleSheet(self.s_loop) if message[:7] == '# Error': self.in_loop() self.statusbar.setStyleSheet(self.s_error) self.statusbar.showMessage(message)
class LabelImage(QLabel): _pixmap = None _image = None _hide_icons = False _icon_size = 28 download_started = Signal() download_ended = Signal() button_download_clicked = Signal() def __init__(self, parent=None): QLabel.__init__(self, parent) self.setText(self.tr("<u>can't obtain picture</u>")) self.lblLoadProcess = QLabel("...", self) self.lblLoadProcess.setMovie(QMovie(":/loading.gif")) self.lblLoadProcess.setAlignment(Qt.AlignCenter) self.lblLoadProcess.hide() self.btnDownload = QPushButton("", self) self.btnDownload.setIcon(QIcon(":/folder.png")) self.btnDownload.setIconSize(QSize(self._icon_size, self._icon_size)) self.btnDownload.setFlat(True) self.btnDownload.clicked.connect(self.save_image) self.btnDownload.clicked.connect(self.button_download_clicked) self.download_ended.connect(self.check_image) self.download_ended.connect(self.lblLoadProcess.hide) self.download_ended.connect(self.btnDownload.show) self.download_ended.connect(self.end_load_anim) self.download_started.connect(self.start_load_anim) self.download_started.connect(self.btnDownload.hide) self.download_started.connect(self.lblLoadProcess.show) # self.destroyed.connect(self.on_destroyed) def start_load_anim(self): self.lblLoadProcess.movie().start() def end_load_anim(self): self.lblLoadProcess.movie().stop() @property def save_path(self): return os.path.join(config.save_dir, self._image.celeb.full_name, self._image.name) def save_image_thread_callback(self): self.download_started.emit() b = self._image.full_image_bytes path = self.save_path if not os.path.exists(os.path.dirname(path)): os.makedirs(os.path.dirname(path)) img = Image.open(BytesIO(b)) img.save(self.save_path) # f = open(path, 'w') # f.write(b) # f.close() try: self.download_ended.emit() except RuntimeError as e: log.debug(sys.exc_traceback) log.debug(sys.exc_info()) def save_image(self): thread = Thread(target=self.save_image_thread_callback) thread.start() def check_image(self): if self._image: if os.path.exists(self.save_path): self.btnDownload.setIcon(QIcon(":/check.png")) return True self.btnDownload.setIcon(QIcon(":/folder.png")) return False def __setProp(self): if self._pixmap: QLabel.setPixmap(self, self._pixmap.scaled( self.width(), self.height(), Qt.KeepAspectRatio, Qt.SmoothTransformation)) else: QLabel.setPixmap(self, QPixmap()) @property def image(self): return self._image @image.setter def image(self, image): assert isinstance(image, ThePlaceImage) self._image = image path = os.path.abspath(image.icon_cache_path).replace('\\', '/') self.check_image() self.setPixmap(QPixmap(path)) def setPixmap(self, px): self._pixmap = px self.__setProp() self.btnDownload.setVisible(not self.hide_icons and px is not None) def resizeEvent(self, *args, **kwargs): super(LabelImage, self).resizeEvent(*args, **kwargs) self.__setProp() self.btnDownload.move(self.width() - self.btnDownload.width() - 3, self.height() - self.btnDownload.height() - 2) self.lblLoadProcess.setGeometry(self.btnDownload.geometry()) @property def hide_icons(self): return self._hide_icons @hide_icons.setter def hide_icons(self, value): self._hide_icons = value self.btnDownload.setVisible(not self.hide_icons)
class NewWindow(QWidget): def __init__(self, app=None): super(NewWindow, self).__init__() self.app = app glo = QVBoxLayout(self) icp = r_path(solve_path('static/images/favicon.png')) # need to used objective message boxs instead of functions to set font self.Arial = QFont("", 12, QFont.Bold) self.Arials = QFont("", 10, QFont.Bold) # Language support variable self.Language = 'en' self.Runningo = False icon = QIcon(icp) self.SelfIinit(icon) self.center() self.langsList(glo) self.set_Abutton(icp, glo) self.Lists(glo) self.Flabel(glo) self.set_button(glo) self.setLayout(glo) mip = self.slchange() self.P = rwser(mip[1].split(',')[1], mip[0], self.app) self.activateWindow() self.show() def SelfIinit(self, icon): self.setWindowTitle('Free Queue Manager ' + version) self.setGeometry(300, 300, 200, 150) self.setMinimumWidth(500) self.setMaximumWidth(500) self.setMinimumHeight(400) self.setMaximumHeight(400) # Setting Icon self.setWindowIcon(icon) QToolTip.setFont(self.Arials) def Flabel(self, glo): fontt = self.Arial self.ic1 = QIcon(r_path(solve_path('static/images/pause.png'))) self.l = QLabel('Icond', self) self.ic1 = self.ic1.pixmap(70, 70, QIcon.Active, QIcon.On) self.l.setPixmap(self.ic1) self.l.setAlignment(Qt.AlignCenter | Qt.AlignHCenter) self.l.setFont(fontt) self.t = QLabel('Texted', self) self.t.setText(self.getTrans('11')) self.t.setOpenExternalLinks(True) self.t.setAlignment(Qt.AlignCenter | Qt.AlignHCenter) self.t.setFont(fontt) self.t.setToolTip(self.getTrans('9')) self.l.setToolTip(self.getTrans('9')) glo.addStretch() glo.addWidget(self.l) glo.addWidget(self.t) glo.addStretch() def langsList(self, glo): self.langs = { # languages to be displayed in select 'en': 'English', 'ar': 'Arabic', 'fr': 'French', 'it': 'Italian', 'es': 'Spanish' } self.langs_list = QComboBox() self.langs_list.addItems(list(self.langs.values())) self.langs_list.setCurrentIndex(1) self.langs_list.setToolTip(self.getTrans('1')) self.langs_list.currentIndexChanged.connect(self.langChange) glo.addWidget(self.langs_list) def langChange (self): self.language = list(self.langs.keys())[self.langs_list.currentIndex()] self.langs_list.setToolTip(self.getTrans('1')) self.Amsgb = self.getTrans('2') self.abutton.setToolTip( self.getTrans('2') ) self.mbutton.setText(self.getTrans('3')) self.mbutton.setToolTip(self.getTrans('4')) self.mbutton2.setText(self.getTrans('5')) self.mbutton2.setToolTip(self.getTrans('6')) self.sl.setToolTip( self.getTrans('7') ) self.sl2.setToolTip(self.getTrans('8')) self.t.setToolTip(self.getTrans('9')) self.l.setToolTip(self.getTrans('9')) if self.Runningo: pp = self.slchange() addr = self.getTrans('10') addr += u"<a href='http://" addr += pp[1].split(',')[1] + u":" + pp[0] addr += u"'> http://" + pp[1].split(',')[1] + u":" + pp[0] addr += u"</a>" self.t.setText(addr) else: self.t.setText(self.getTrans('11')) def getTrans(self, index): lang = list(self.langs.keys())[self.langs_list.currentIndex()] try: return LANGUAGES[lang][index] except Exception: return None def Lists(self, glo): ips = self.get_ips() self.sl = QComboBox() self.sl.addItems(ips) self.sl.setToolTip(self.getTrans('7')) self.sl2 = QComboBox() self.get_ports() self.sl2.setToolTip('8') self.sl.currentIndexChanged.connect(self.get_ports) glo.addWidget(self.sl) glo.addWidget(self.sl2) def get_ports(self, nauto=True): d_ports = ['5000', '8080', '3000', '80', '9931'] m_ports = [] while len(m_ports) < 10: mip = self.slchange() for p in d_ports: s = socket(AF_INET, SOCK_STREAM) try: s.bind((mip[1].split(',')[1], int(p))) s.close() m_ports.append(p) except: s.close() d_ports.remove(p) s = socket(AF_INET, SOCK_STREAM) p = randint(1000, 9999) try: s.bind((mip[1].split(',')[1], p)) s.close() m_ports.append(str(p)) except: s.close() if len(m_ports) >= 10: break self.sl2.clear() self.sl2.addItems(m_ports) def slchange(self): return [self.sl2.currentText(), self.sl.currentText()] def set_button(self, glo): hlayout = QHBoxLayout() self.mbutton = QPushButton('Start', self) self.mbutton.clicked.connect(self.s_server) self.mbutton.setFont(self.Arials) self.mbutton.setIcon(QPixmap(r_path(solve_path('static/images/play.png')))) self.mbutton2 = QPushButton('Stop', self) self.mbutton2.clicked.connect(self.st_server) self.mbutton2.setIcon(QPixmap(r_path(solve_path('static/images/pause.png')))) self.mbutton.setToolTip(self.getTrans('4')) self.mbutton2.setToolTip(self.getTrans('6')) self.mbutton2.setEnabled(False) self.mbutton2.setFont(self.Arials) hlayout.addWidget(self.mbutton) hlayout.addWidget(self.mbutton2) glo.addLayout(hlayout) def s_server(self): mip = self.slchange() self.P = rwser(mip[1].split(',')[1], mip[0], self.app) self.P.setTerminationEnabled(True) if not self.P.isRunning(): try: self.pport = mip[0] self.mbutton.setEnabled(False) self.mbutton2.setEnabled(True) self.sl.setEnabled(False) self.sl2.setEnabled(False) self.ic1 = QIcon(r_path(solve_path('static/images/play.png'))) self.ic1 = self.ic1.pixmap(70, 70, QIcon.Active, QIcon.On) self.l.setPixmap(self.ic1) pp = self.slchange() addr = self.getTrans('10') addr += "<a href='http://" addr += pp[1].split(',')[1] + ":" + pp[0] addr += "'> http://" + pp[1].split(',')[1] + ":" + pp[0] addr += "</a>" self.t.setText(addr) self.t.setFont(self.Arial) self.P.start() self.Runningo = True except: self.eout() else: self.eout() def st_server(self): if self.P.isRunning(): try: if self.P.isRunning: self.P.stop() self.mbutton.setEnabled(True) self.mbutton2.setEnabled(False) self.sl.setEnabled(True) self.sl2.setEnabled(True) self.t.setText(self.getTrans('11')) # removing the last used port to avoid termination error cind = self.sl2.currentIndex() self.sl2.removeItem(cind) self.get_ports() self.Runningo = False except: self.eout() else: self.eout() def set_Abutton(self, icon, glo): def show_about(nself): Amsg = u" <center> " Amsg += self.getTrans('12') + version + u" " Amsg += self.getTrans('13') Amsg += self.getTrans('14') Amsg += self.getTrans('15') Amsg += u"<br> <b><a href='https://fqms.github.io/'>" Amsg += u"https://fqms.github.io </a> </b></center>" Amsgb = self.getTrans('2') return QMessageBox.about( self, Amsgb, Amsg) self.abutton = QPushButton('', self) self.abutton.setIcon(QPixmap(icon)) self.abutton.setIconSize(QSize(150, 70)) self.abutton.setToolTip(self.getTrans('2')) self.abutton.clicked.connect(partial(show_about, self)) glo.addWidget(self.abutton) def closeEvent(self, event=None): if self.Runningo: response = self.msgApp( self.getTrans('16'), self.getTrans('17')) if response == 'y': if event is not None: event.accept() if self.P.isRunning(): self.P.stop() sys.exit(0) else: if event is not None: event.ignore() else: if event is not None: event.accept() if self.P.isRunning(): self.P.stop() sys.exit(0) def msgApp(self, title, msg): uinfo = QMessageBox.question(self, title, msg, QMessageBox.Yes | QMessageBox.No) if uinfo == QMessageBox.Yes: return 'y' if uinfo == QMessageBox.No: return 'n' def eout(self): if self.P.isRunning(): self.P.stop() msgg = u"<center>" msgg += self.getTrans('18') msgg += self.getTrans('19') msgg += u"<br><b><a href='https://fqms.github.io/'> " msgg += u"https://fqms.github.io </a></b> </center>" mm = QMessageBox.critical( self, self.getTrans('20'), msgg, QMessageBox.Ok) def center(self): qrect = self.frameGeometry() cp = QDesktopWidget().availableGeometry().center() qrect.moveCenter(cp) self.move(qrect.topLeft()) def get_ips(self): il = [] for i in interfaces(): try: if os.name != 'nt': inf = i + " ," else: inf = ' ,' inf += ifaddresses(i)[2][0].get('addr') il.append(inf) except: pass return il
class NewWindow(QWidget): def __init__(self, app=None): super(NewWindow, self).__init__() self.app = app glo = QVBoxLayout(self) if os.name == 'nt': icp = r_path('static\\images\\favicon.png') else: icp = r_path('static/images/favicon.png') # need to used objective message boxs instead of functions to set font self.Arial = QFont("", 15, QFont.Bold) self.Arials = QFont("", 10, QFont.Bold) # Language support varibels used by translate func self.Arabic = None self.Runningo = False icon = QIcon(icp) self.SelfIinit(icon) self.center() self.Llists(glo) self.set_Abutton(icp, glo) self.Lists(glo) self.Flabel(glo) self.set_button(glo) self.setLayout(glo) mip = self.slchange() self.P = rwser(mip[1].split(',')[1], mip[0], self.app) self.activateWindow() self.show() def SelfIinit(self, icon): self.setWindowTitle('Free Queue Manager ' + version) self.setGeometry(300, 300, 200, 150) self.setMinimumWidth(500) self.setMaximumWidth(500) self.setMinimumHeight(400) self.setMaximumHeight(400) # Setting Icon self.setWindowIcon(icon) QToolTip.setFont(self.Arials) def Flabel(self, glo): fontt = self.Arial if os.name == 'nt': self.ic1 = QIcon(r_path('static\\images\\pause.png')) else: self.ic1 = QIcon(r_path('static/images/pause.png')) self.l = QLabel('Icond', self) self.ic1 = self.ic1.pixmap(70, 70, QIcon.Active, QIcon.On) self.l.setPixmap(self.ic1) self.l.setAlignment(Qt.AlignCenter | Qt.AlignHCenter) self.l.setFont(fontt) self.t = QLabel('Texted', self) self.t.setText("Server is <u> Not running </u> <br>") self.t.setOpenExternalLinks(True) self.t.setAlignment(Qt.AlignCenter | Qt.AlignHCenter) self.t.setFont(fontt) self.t.setToolTip('Status of the server') self.l.setToolTip('Status of the server') glo.addStretch() glo.addWidget(self.l) glo.addWidget(self.t) glo.addStretch() def Lists(self, glo): ips = self.get_ips() self.sl = QComboBox() self.sl.addItems(ips) self.sl.setToolTip( 'Select network interface with ip, so the server runs on it') self.sl2 = QComboBox() self.get_ports() self.sl2.setToolTip('Select a port, so server runs through it') self.sl.currentIndexChanged.connect(self.get_ports) glo.addWidget(self.sl) glo.addWidget(self.sl2) def get_ports(self, nauto=True): d_ports = ['5000', '8080', '3000', '80', '9931'] m_ports = [] while len(m_ports) < 10: mip = self.slchange() for p in d_ports: s = socket(AF_INET, SOCK_STREAM) try: s.bind((mip[1].split(',')[1], int(p))) s.close() m_ports.append(p) except: s.close() d_ports.remove(p) s = socket(AF_INET, SOCK_STREAM) p = randint(1000, 9999) try: s.bind((mip[1].split(',')[1], p)) s.close() m_ports.append(str(p)) except: s.close() if len(m_ports) >= 10: break self.sl2.clear() self.sl2.addItems(m_ports) def Llists(self, glo): hlayout = QHBoxLayout() self.lebutton = QPushButton('English', self) self.lebutton.setToolTip('Change language to English') self.lebutton.setEnabled(False) self.lebutton.setFont(self.Arials) self.labutton = QPushButton('Arabic', self) self.labutton.setFont(self.Arials) if os.name == 'nt': self.lebutton.setIcon( QPixmap(r_path('static\\images\\english.png'))) self.labutton.setIcon(QPixmap( r_path('static\\images\\arabic.png'))) else: self.lebutton.setIcon(QPixmap(r_path('static/images/english.png'))) self.labutton.setIcon(QPixmap(r_path('static/images/arabic.png'))) self.labutton.setToolTip('Change language to Arabic') self.labutton.setEnabled(True) self.lebutton.clicked.connect(partial(self.translate, ar=False)) self.labutton.clicked.connect(self.translate) hlayout.addWidget(self.lebutton) hlayout.addWidget(self.labutton) glo.addLayout(hlayout) def slchange(self): return [self.sl2.currentText(), self.sl.currentText()] def set_button(self, glo): hlayout = QHBoxLayout() self.mbutton = QPushButton('Start', self) self.mbutton.clicked.connect(self.s_server) self.mbutton.setFont(self.Arials) if os.name == 'nt': self.mbutton.setIcon(QPixmap(r_path('static\\images\\play.png'))) else: self.mbutton.setIcon(QPixmap(r_path('static/images/play.png'))) self.mbutton2 = QPushButton('Stop', self) self.mbutton2.clicked.connect(self.st_server) if os.name == 'nt': self.mbutton2.setIcon(QPixmap(r_path('static\\images\\pause.png'))) else: self.mbutton2.setIcon(QPixmap(r_path('static/images/pause.png'))) self.mbutton.setToolTip('Start the server') self.mbutton2.setToolTip('Stop the server') self.mbutton2.setEnabled(False) self.mbutton2.setFont(self.Arials) hlayout.addWidget(self.mbutton) hlayout.addWidget(self.mbutton2) glo.addLayout(hlayout) def s_server(self): mip = self.slchange() self.P = rwser(mip[1].split(',')[1], mip[0], self.app) self.P.setTerminationEnabled(True) if not self.P.isRunning(): try: self.pport = mip[0] self.mbutton.setEnabled(False) self.mbutton2.setEnabled(True) self.sl.setEnabled(False) self.sl2.setEnabled(False) if os.name == 'nt': self.ic1 = QIcon(r_path('static\\images\\play.png')) else: self.ic1 = QIcon(r_path('static/images/play.png')) self.ic1 = self.ic1.pixmap(70, 70, QIcon.Active, QIcon.On) self.l.setPixmap(self.ic1) if self.Arabic is None: pp = self.slchange() addr = "Server is <u>Running</u> <br>" addr += " On : <a href='http://" addr += pp[1].split(',')[1] + ":" + pp[0] addr += "'> http://" + pp[1].split(',')[1] + ":" + pp[0] addr += "</a>" self.t.setText(addr) self.t.setFont(self.Arial) else: pp = self.slchange() addr = u"الخدمة <u>مشغــلة</u> و تبث على : <br>" addr += u"<a href='http://" addr += pp[1].split(',')[1] + u":" + pp[0] addr += u"'> http://" + pp[1].split(',')[1] + u":" + pp[0] addr += u"</a>" self.t.setText(addr) self.t.setFont(self.Arial) self.P.start() self.Runningo = True except: self.eout() else: self.eout() def st_server(self): if self.P.isRunning(): try: if self.P.isRunning: self.P.stop() self.mbutton.setEnabled(True) self.mbutton2.setEnabled(False) self.sl.setEnabled(True) self.sl2.setEnabled(True) if self.Arabic is None: self.t.setText("Server is <u> Not running </u> <br>") else: self.t.setText(u"الــخـدمة <u>متــوقفــة</u><br>") # removing the last used port to avoid termination error cind = self.sl2.currentIndex() self.sl2.removeItem(cind) self.get_ports() self.Runningo = False except: self.eout() else: self.eout() def set_Abutton(self, icon, glo): def show_about(nself): if nself.Arabic is None: Amsg = "<center>All credit reserved to the author of FQM " Amsg += " version " + version Amsg += ", This work is a free, open-source project licensed " Amsg += " under Mozilla Public License version 2.0 . <br><br>" Amsg += " visit us for more infos and how-tos :<br> " Amsg += "<b><a href='https://fqms.github.io/'> " Amsg += "https://fqms.github.io/ </a> </b></center>" Amsgb = "About FQM" else: Amsg = u" <center> " Amsg += u" إدارة الحشود الحر النسخة " + version + u" " Amsg += u"حقوق نشر هذا البرنامج محفوظة و تخضع " Amsg += u" لرخصة البرامج الحرة و مفتوحة المصدر " Amsg += u" Mozilla Public License version 2.0 . " Amsg += u"<br><br> " Amsg += u"للمزيد من المعلومات و الشروحات , قم بزيارة :" Amsg += u"<br> <b><a href='https://fqms.github.io/'>" Amsg += u"https://fqms.github.io </a> </b></center>" Amsgb = u"عن النظام" return QMessageBox.about(self, Amsgb, Amsg) self.abutton = QPushButton('', self) self.abutton.setIcon(QPixmap(icon)) self.abutton.setIconSize(QSize(150, 70)) self.abutton.setToolTip('About FQM') self.abutton.clicked.connect(partial(show_about, self)) glo.addWidget(self.abutton) def closeEvent(self, event=None): if self.Runningo: if self.Arabic is None: response = self.msgApp( "Exiting while running", "Are you really sure, you want to exit ?") else: response = self.msgApp( u"تأكيد الخروج", u"تريد بالفعل , الخروج و إيقاف البرنامج ؟") if response == 'y': if event is not None: event.accept() if self.P.isRunning(): self.P.stop() sys.exit(0) else: if event is not None: event.ignore() else: if event is not None: event.accept() if self.P.isRunning(): self.P.stop() sys.exit(0) def msgApp(self, title, msg): uinfo = QMessageBox.question(self, title, msg, QMessageBox.Yes | QMessageBox.No) if uinfo == QMessageBox.Yes: return 'y' if uinfo == QMessageBox.No: return 'n' def eout(self): if self.P.isRunning(): self.P.stop() if self.Arabic is None: msgg = "<center>" msgg += " Opps, a critical error has occurred, we will be " msgg += " grateful if you can help fixing it, by reporting to us " msgg += " at : <br><br> " msgg += "<b><a href='https://fqms.github.io/'> " msgg += "https://fqms.github.io/ </a></b> </center>" mm = QMessageBox.critical(self, "Critical Error", msgg, QMessageBox.Ok) else: msgg = u"<center>" msgg += u"حدث خطأ فادح في تشغيل النظام , سنكون شاكرين لك إن " msgg += u"قمت بتبليغنا عنه , ليتم إصلاحه في أقرب وقت " msgg += u"<br>" msgg += u"<br><b><a href='https://fqms.github.io/'> " msgg += u"https://fqms.github.io </a></b> </center>" mm = QMessageBox.critical(self, u"خطأ في التشغيل", msgg, QMessageBox.Ok) def center(self): qrect = self.frameGeometry() cp = QDesktopWidget().availableGeometry().center() qrect.moveCenter(cp) self.move(qrect.topLeft()) def get_ips(self): il = [] for i in interfaces(): try: if os.name != 'nt': inf = i + " ," else: inf = ' ,' inf += ifaddresses(i)[2][0].get('addr') il.append(inf) except: pass return il def translate(self, ar=True): if ar: self.Arabic = "arabic" self.labutton.setEnabled(False) self.labutton.setText(u"العربية") self.labutton.setToolTip(u"تغير اللغة إلى العربية") self.lebutton.setText(u"الإنجليزية") self.lebutton.setToolTip(u"تغير اللغة إلى الإنجليزية") self.lebutton.setEnabled(True) self.Amsgb = u"عن النظام" self.abutton.setToolTip(u"عن النظام") self.mbutton.setText(u"تشغــيل") self.mbutton.setToolTip(u"تشغيل الخدمة") self.mbutton2.setText(u"إيــقاف") self.mbutton2.setToolTip(u"إيقاف الخدمة") self.sl.setToolTip(u"إختار عنوان IP ليتم بث الخدمة عليه") self.sl2.setToolTip(u"إختار منفذ ليتم بث الخدمة من خلاله") self.t.setToolTip(u"حالة الخدمة ") self.l.setToolTip(u"حالة الخدمة ") if self.Runningo: pp = self.slchange() addr = u"الخدمة <u>مشغــلة</u> و تبث على : <br>" addr += u"<a href='http://" addr += pp[1].split(',')[1] + u":" + pp[0] addr += u"'> http://" + pp[1].split(',')[1] + u":" + pp[0] addr += u"</a>" self.t.setText(addr) else: self.t.setText(u"الــخـدمة <u>متــوقفــة</u><br>") else: self.Arabic = None self.lebutton.setEnabled(False) self.lebutton.setText("English") self.lebutton.setToolTip('Change language to English') self.labutton.setEnabled(True) self.labutton.setText("Arabic") self.labutton.setToolTip('Change language to Arabic') self.Amsgb = "About FQM" self.abutton.setToolTip('About FQM') self.mbutton.setText("Start") self.mbutton.setToolTip("Start the server") self.mbutton2.setText("Stop") self.mbutton2.setToolTip("Stop the server") self.sl.setToolTip( 'Select network interface with ip, so the server runs on it') self.sl2.setToolTip('Select a port, so server runs through it') self.t.setToolTip('Status of the server') self.l.setToolTip('Status of the server') if self.Runningo: pp = self.slchange() addr = "Server is <u>Running</u> <br>" addr += " On : <a href='http://" addr += pp[1].split(',')[1] + ":" + pp[0] addr += "'> http://" + pp[1].split(',')[1] + ":" + pp[0] addr += "</a>" self.t.setText(addr) else: self.t.setText("Server is <u> Not running </u> <br>")
class RadioApp(QWidget): def __init__(self): super().__init__() self.edit = False self.left_dock_create() self.middle_dock_create() self.right_dock_create() self.slotans_create() self.box = QHBoxLayout() self.box.addLayout(self.volbalayout) self.box.addLayout(self.middlelayout) self.box.addLayout(self.rightlayout) self.mainlayout = QVBoxLayout() self.mainlayout.addLayout(self.box) self.setLayout(self.mainlayout) def left_dock_create(self): self.statlabel = QLabel("RSSI: --") self.logolabel = QLabel() self.logolabel.setPixmap( QPixmap(os.path.join(script_path, "../assets/logo.png"))) self.statlabel.setFont(QFont("DejaVu Sans", 12)) self.btnvolba = [] for i in range(1, 5): self.btnvolba.append(QPushButton("Voľba {}".format(i))) self.presetaddbtn = QPushButton() self.presetaddbtn.setIcon(QIcon(QPixmap("../assets/add.png"))) self.volbalayout = QVBoxLayout() self.volbalayout.addWidget(self.logolabel) self.volbalayout.addWidget(self.statlabel) for btn in self.btnvolba: self.volbalayout.addWidget(btn) self.volbalayout.addWidget(self.presetaddbtn) def middle_dock_create(self): self.frekv = QLabel() self.frekv.setFont(QFont("DejaVu Sans", 26)) self.write_frekv() self.btnstepleft = QPushButton("<") self.btnseekdown = QPushButton("<<") self.btnseekup = QPushButton(">>") self.btnstepright = QPushButton(">") self.laybtnmv = QHBoxLayout() self.laybtnmv.addWidget(self.btnseekdown) self.laybtnmv.addWidget(self.btnstepleft) self.laybtnmv.addWidget(self.btnstepright) self.laybtnmv.addWidget(self.btnseekup) self.labelrdsdt = QLabel("RDS") self.labelrdsdt.setFont(QFont("DejaVu Sans", 12)) self.frekvlayout = QHBoxLayout() self.frekvlayout.addWidget(self.frekv) self.frekvlayout.setAlignment(Qt.AlignCenter) self.middlelayout = QVBoxLayout() self.middlelayout.addLayout(self.frekvlayout) self.middlelayout.addLayout(self.laybtnmv) self.middlelayout.addWidget(self.labelrdsdt) def right_dock_create(self): self.btnonoff = QPushButton("Reset") self.slidvol = QSlider(Qt.Vertical) self.slidvol.setMinimum(0) self.slidvol.setMaximum(100) self.slidvol.setValue(50) self.labspeaker = QLabel() self.labspeaker.setPixmap( QPixmap(os.path.join(script_path, "../assets/speaker.png"))) self.sndvolumelabel = QLabel() self.rightlayout = QVBoxLayout() self.rightlayout.addWidget(self.btnonoff) self.rightlayout.addWidget(self.slidvol) self.rightlayout.addWidget(self.sndvolumelabel) self.rightlayout.addWidget(self.labspeaker) def slotans_create(self): self.slidvol.valueChanged.connect(self.set_radiovolume) self.btnstepleft.clicked.connect(lambda: self.step_frekv("d")) self.btnstepright.clicked.connect(lambda: self.step_frekv("u")) self.btnseekdown.clicked.connect(lambda: self.set_seek("d")) self.btnseekup.clicked.connect(lambda: self.set_seek("u")) self.presetaddbtn.clicked.connect(self.preset_editmode) self.btnonoff.clicked.connect(self.reset_radio) for btn in self.btnvolba: btn.clicked.connect(self.preset_choose) self.timerrssi = QTimer() self.timerrssi.timeout.connect(self.write_stats) self.timerrssi.start(3000) # ms def reset_radio(self): dev_radio.shutdown() dev_radio.poweron() def preset_editmode(self): if self.edit == True: # Chceme sa vrátiť do normálneho režimu -> zvrátime editačný for btn in self.btnvolba: btn.setStyleSheet("") btn.clicked.disconnect() btn.clicked.connect(self.preset_choose) else: # Vstupujeme do editačného režimu for btn in self.btnvolba: btn.setStyleSheet("background-color: #30f030;") btn.clicked.disconnect() btn.clicked.connect(self.preset_set) self.edit = not self.edit def preset_set(self): button = self.sender() if isinstance(button, QPushButton): button.setText("{:.2f}".format(dev_radio.getfrequency() / 100)) self.preset_editmode() def preset_choose(self): button = self.sender() if isinstance(button, QPushButton): try: frekv = int(float(button.text()) * 100) except ValueError: return dev_radio.setfrequency(frekv) self.write_frekv() def preset_save(self): with open("preset.txt", mode="w") as fw: for btn in self.btnvolba: try: fw.write("{},".format(int(float(btn.text()) * 100))) except ValueError: fw.write(" ,") def preset_restore(self): try: fr = open("preset.txt", mode="r") pres_list = fr.read().split(",") except FileNotFoundError: return fr.close() if len(pres_list) - 1 < len(self.btnvolba): print("Chyba: Zoznam predvolieb je krátky") return for i, btn in enumerate(self.btnvolba): try: btn.setText("{:.2f}".format(int(pres_list[i]) / 100)) except ValueError: continue def set_seek(self, direction): if direction == "u": dev_radio.seekup() elif direction == "d": dev_radio.seekdown() self.write_frekv() def step_frekv(self, direction): curr_frekv = dev_radio.getfrequency() if direction == "u": curr_frekv += 10 if curr_frekv > dev_radio.freqhigh: curr_frekv = dev_radio.freqlow elif direction == "d": curr_frekv -= 10 if curr_frekv < dev_radio.freqlow: curr_frekv = dev_radio.freqhigh dev_radio.setfrequency(curr_frekv) self.write_frekv() def write_frekv(self): self.frekv.setText("<b>{:.2f} MHz</b>".format( dev_radio.getfrequency() / 100)) def write_stats(self): self.statlabel.setText("<b>RSSI: {}</b>".format(dev_radio.getrssi())) def set_radiovolume(self): vol_percent = self.slidvol.value() self.sndvolumelabel.setText("{}%".format(vol_percent)) new_volume = int(map_range(vol_percent, 0, 100, 0, 15)) dev_radio.setvolume(new_volume) def rds_psshow(self, station): print("Stanica: {}".format(station)) def rds_txtshow(self, text): print("Text: {}".format(text)) def rds_tmshow(self, hodiny, minuty): print("{}:{}".format(hodiny, minuty))
class HomeWidget(QWidget): def __init__(self, parent=None): QWidget.__init__(self, parent) self.__parent = parent self.setWindowTitle("Home") self.logo = QLabel() self.logo.setPixmap("Resources/iiitk.png") self.bttnAddEmployee = QPushButton("Add Employee") self.bttnAddEmployee.setIcon(QIcon(QPixmap("Resources/add_user.png"))) self.bttnAddEmployee.setIconSize(QSize(64, 64)) self.bttnAddEmployee.clicked.connect( lambda: self.gotoPage("Add Employee")) self.bttnEditEmp = QPushButton("Edit Employee") self.bttnEditEmp.setIcon(QIcon(QPixmap("Resources/edit_user.png"))) self.bttnEditEmp.setIconSize(QSize(64, 64)) self.bttnEditEmp.clicked.connect( lambda: self.gotoPage("Edit Employee")) self.bttnDelEmp = QPushButton("Delete Employee") self.bttnDelEmp.setIcon(QIcon(QPixmap("Resources/delete_user.png"))) self.bttnDelEmp.setIconSize(QSize(64, 64)) self.bttnDelEmp.clicked.connect(lambda: self.gotoPage("Del Employee")) self.bttnShowEmp = QPushButton("Show Employee") self.bttnShowEmp.setIcon(QIcon(QPixmap("Resources/show_user.png"))) self.bttnShowEmp.setIconSize(QSize(64, 64)) self.bttnShowEmp.clicked.connect( lambda: self.gotoPage("Show Employee")) self.bttnAddDesignation = QPushButton("Add Designation") self.bttnAddDesignation.setIcon( QIcon(QPixmap("Resources/add_designation.png"))) self.bttnAddDesignation.setIconSize(QSize(64, 64)) self.bttnAddDesignation.clicked.connect( lambda: self.gotoPage("Add Designation")) self.bttnEditDesg = QPushButton("Edit Designation") self.bttnEditDesg.setIcon( QIcon(QPixmap("Resources/edit_designation.png"))) self.bttnEditDesg.setIconSize(QSize(64, 64)) self.bttnDelDesg = QPushButton("Delete Designation") self.bttnDelDesg.setIcon( QIcon(QPixmap("Resources/delete_designation.png"))) self.bttnDelDesg.setIconSize(QSize(64, 64)) self.bttnShowDesg = QPushButton("Show Designations") self.bttnShowDesg.setIcon( QIcon(QPixmap("Resources/show_designation.png"))) self.bttnShowDesg.setIconSize(QSize(64, 64)) self.bttnShowDesg.clicked.connect( lambda: self.gotoPage("Show Designation")) self.bttnCalcSalary = QPushButton("Generate Payslip") self.bttnCalcSalary.setIcon(QIcon(QPixmap("Resources/rupee.png"))) self.bttnCalcSalary.setIconSize(QSize(60, 60)) self.bttnCalcSalary.clicked.connect( lambda: self.gotoPage("Calc Salary")) self.bttnSettings = QPushButton("Settings") self.bttnSettings.setIcon( QIcon(QPixmap("Resources/icons8-settings-96.png"))) self.bttnSettings.setIconSize(QSize(55, 55)) self.setupUI() def gotoPage(self, name): if self.__parent is not None: self.__parent.gotoPage(name) def setupUI(self): layout = QVBoxLayout() layout.setAlignment(Qt.AlignHCenter) self.setContentsMargins(20, 10, 20, 5) banner = QHBoxLayout() banner.addWidget(self.logo) bannerText = QVBoxLayout() text = QLabel("Salary Management System") text.setStyleSheet("font-size: 30px;") bannerText.addWidget(text) bannerText.setAlignment(text, Qt.AlignBottom) text2 = QLabel("Indian Institute of Information Technology Kalyani") text2.setStyleSheet("font-size: 20px;") bannerText.addWidget(text2) bannerText.setAlignment(text2, Qt.AlignTop) banner.addLayout(bannerText) banner.addStretch() layout.addLayout(banner) layout.addSpacing(30) bttnList = [ self.bttnAddDesignation, self.bttnDelDesg, self.bttnEditDesg, self.bttnShowDesg, self.bttnShowEmp, self.bttnEditEmp, self.bttnAddEmployee, self.bttnDelEmp, self.bttnSettings, self.bttnCalcSalary ] for bttn in bttnList: bttn.setObjectName("HomeBttn") bttn.setIconSize(QSize(55, 55)) employeeGroup = QGroupBox("Employee") employeeGroupLayout = QVBoxLayout() employeeGroupLayout.addWidget(self.bttnAddEmployee) employeeGroupLayout.addWidget(self.bttnEditEmp) employeeGroupLayout.addWidget(self.bttnDelEmp) employeeGroupLayout.addWidget(self.bttnShowEmp) employeeGroup.setLayout(employeeGroupLayout) designationGroup = QGroupBox("Designation") designationGroupLayout = QVBoxLayout() designationGroupLayout.addWidget(self.bttnAddDesignation) designationGroupLayout.addWidget(self.bttnEditDesg) designationGroupLayout.addWidget(self.bttnDelDesg) designationGroupLayout.addWidget(self.bttnShowDesg) designationGroup.setLayout(designationGroupLayout) groups = QHBoxLayout() groups.addWidget(employeeGroup) groups.addWidget(designationGroup) otherBttns = QGroupBox() otherBttnsLayout = QVBoxLayout() otherBttnsLayout.addWidget(self.bttnCalcSalary) otherBttnsLayout.addWidget(self.bttnSettings) otherBttnsLayout.addStretch() otherBttns.setLayout(otherBttnsLayout) groups.addWidget(otherBttns) groups.addStretch() layout.addLayout(groups) layout.addStretch() version = QLabel(version_text) layout.addWidget(version) centerLayout = QHBoxLayout() centerLayout.addStretch() centerLayout.addLayout(layout) centerLayout.addStretch() self.setLayout(centerLayout)
class LoginForm(QDialog): logged_in = Signal() def __init__(self, parent=None): super(LoginForm, self).__init__(parent) self.setWindowTitle("Login") self.status_icon = QIcon.fromTheme("user-offline") self.setWindowIcon(self.status_icon) self.server_status = QLabel() self.server_status.setAlignment(Qt.AlignCenter) self.server_status.setPixmap(self.status_icon.pixmap(64)) self.username = QLineEdit("Username") self.password = QLineEdit("Password") self.password.setEchoMode(QLineEdit.Password) self.login_button = QPushButton("Getting server status...") self.login_button.setEnabled(False) self.login_button.clicked.connect(self.login) self.login_button.setIcon(self.status_icon) self.ping_timer = QTimer(self) self.connect(self.ping_timer, SIGNAL("timeout()"), self.is_server_up) self.ping_timer.start(1000) layout = QVBoxLayout() for w in (self.server_status, self.username, self.password, self.login_button): layout.addWidget(w) self.setLayout(layout) self.logged_in.connect(qtclient.login) def is_server_up(self): '''Tests to see if the authentication server is up.''' global client from requests.exceptions import ConnectionError try: if client.ping(): self.login_button.setEnabled(True) self.login_button.setText("Login!") self.status_icon = QIcon.fromTheme("user-online") except(ConnectionError): # We can only wait until the server comes back up. self.login_button.setEnabled(False) self.login_button.setText("Server is offline. :(") self.status_icon = QIcon.fromTheme("user-offline") self.setWindowIcon(self.status_icon) self.server_status.setPixmap(self.status_icon.pixmap(64)) self.login_button.setIcon(self.status_icon) def login(self): # TODO: This could be an exception if login failed. Catch it. login_result = client.authenticate(self.username.text(), self.password.text()) if login_result: # We logged in, so show the character select dialog self.logged_in.emit() # Once its shown, mark this dialog as accepted (And by extension, close it.) self.accept()
class CC_window(QWidget): def __init__(self): super(CC_window, self).__init__() self.version = '0.2' glo = QVBoxLayout(self) self.Runningo = None self.Looping = None self.P = CC_thread() if name == 'nt': ficon = r_path('images\\favicon.png') licon = r_path('images\\logo.png') else: ficon = r_path('images/favicon.png') licon = r_path('images/logo.png') self.tf = QFont("", 13, QFont.Bold) self.sf = QFont("", 10, QFont.Bold) self.SelfIinit(QIcon(ficon)) self.center() self.a_btn(licon, glo) self.ss_btns(glo) self.i_list(glo) self.cl_btn(glo) self.l_btns(glo) self.f_btns(glo) self.ds_bar(glo) self.setLayout(glo) self.activateWindow() self.show() def SelfIinit(self, icon): self.setWindowTitle('chrome-cut ' + self.version) self.setGeometry(300, 300, 200, 150) self.setMinimumWidth(600) self.setMaximumWidth(600) self.setMinimumHeight(500) self.setMaximumHeight(500) # Setting Icon self.setWindowIcon(icon) QToolTip.setFont(self.sf) def msgApp(self, title, msg): uinfo = QMessageBox.question(self, title, msg, QMessageBox.Yes | QMessageBox.No) if uinfo == QMessageBox.Yes: return 'y' if uinfo == QMessageBox.No: return 'n' def closeEvent(self, event=None): if self.P.isRunning(): response = self.msgApp("Making sure", "Sure, you want to exit while looping ?") if response == 'y': if event is not None: event.accept() self.P.stop() exit(0) else: if event is not None: event.ignore() else: if event is not None: event.accept() exit(0) def center(self): qrect = self.frameGeometry() cp = QDesktopWidget().availableGeometry().center() qrect.moveCenter(cp) self.move(qrect.topLeft()) def a_btn(self, icon, glo): def show_about(): Amsg = "<center>All credit reserved to the author of chrome-cut " Amsg += " version " + self.version Amsg += ", This work is a free, open-source project licensed " Amsg += " under Mozilla Public License version 2.0 . <br><br>" Amsg += " visit us for more infos and how-tos :<br> " Amsg += "<b><a href='https://github.io/mrf345/chrome-cut'> " Amsg += "https://github.io/mrf345/chrome-cut </a> </b></center>" Amsgb = "About chrome-cut" return QMessageBox.about(self, Amsgb, Amsg) self.abutton = QPushButton('', self) self.abutton.setIcon(QPixmap(icon)) self.abutton.setIconSize(QSize(500, 100)) self.abutton.setToolTip('About chrome-cut') self.abutton.clicked.connect(show_about) glo.addWidget(self.abutton) def ss_btns(self, glo): self.lebutton = QPushButton('Scan IP address', self) self.lebutton.setToolTip( 'Insert and check if a specific IP is a valid chrome cast') self.lebutton.setFont(self.tf) self.lebutton.clicked.connect(self.sip_input) glo.addWidget(self.lebutton) def sip_input(self): self.lebutton.setEnabled(False) self.s_bar.setStyleSheet(self.s_norm) self.s_bar.showMessage('> Checking out the IP ..') msg = "<center>Enter suspected IP to check : <br><i><u>Usually it is " msg += "on 192.168.what_have_you.188</i></center>" text, okPressed = QInputDialog.getText(self, "Scan IP", msg) if okPressed and text != '': self.setCursor(Qt.BusyCursor) ch = is_ccast(text) if ch: self.il_add([text]) self.unsetCursor() self.lebutton.setEnabled(True) return True else: self.s_bar.setStyleSheet(self.s_error) self.s_bar.showMessage( '! Error: inserted IP is not chrome cast device') self.unsetCursor() self.lebutton.setEnabled(True) return True self.s_bar.clearMessage() self.lebutton.setEnabled(True) return True def i_list(self, glo): self.ci_list = QListWidget() self.ci_list.setToolTip("List of discovered devices") self.ci_list.setEnabled(False) self.setFont(self.sf) glo.addWidget(self.ci_list) def cl_btn(self, glo): self.cle_btn = QPushButton('Clear devices list') self.cle_btn.setToolTip("Remove all devices from the list") self.cle_btn.setFont(self.sf) self.cle_btn.setEnabled(False) self.cle_btn.clicked.connect(self.il_add) glo.addWidget(self.cle_btn) def l_btns(self, glo): hlayout = QHBoxLayout() self.llo = QCheckBox("Looping") self.llo.setToolTip( 'Automate repeating the smae command on the smae device selected ') self.llo.setEnabled(False) self.nlo = QLineEdit() self.nlo.setPlaceholderText("duration in seconds. Default is 10") self.nlo.setEnabled(False) self.nlo.setToolTip("Duration of sleep after each loop") self.lbtn = QPushButton('Stop') self.lbtn.setEnabled(False) self.lbtn.setFont(self.tf) self.llo.setFont(self.sf) self.lbtn.setToolTip("stop on-going command or loop") self.llo.toggled.connect(self.loped) self.lbtn.clicked.connect(partial(self.inloop_state, out=True)) hlayout.addWidget(self.llo) hlayout.addWidget(self.nlo) hlayout.addWidget(self.lbtn) glo.addLayout(hlayout) def loped(self): if self.Looping: self.Looping = None self.llo.setChecked(False) self.nlo.setEnabled(False) else: self.Looping = True self.llo.setChecked(True) self.nlo.setEnabled(True) return True def f_btns(self, glo): hlayout = QHBoxLayout() self.ksbutton = QPushButton('Kill stream', self) self.ksbutton.setToolTip('Kill whetever been streamed') self.ksbutton.setFont(self.tf) self.ksbutton.clicked.connect(self.k_act) self.sbutton = QPushButton('Stream', self) self.sbutton.setFont(self.tf) self.sbutton.setToolTip('Stream a youtube video') self.fbutton = QPushButton('Factory reset', self) self.fbutton.setFont(self.tf) self.fbutton.setToolTip('Factory reset the device') self.fbutton.clicked.connect(self.fr_act) self.sbutton.clicked.connect(self.yv_input) self.ksbutton.setEnabled(False) self.sbutton.setEnabled(False) self.fbutton.setEnabled(False) hlayout.addWidget(self.ksbutton) hlayout.addWidget(self.sbutton) hlayout.addWidget(self.fbutton) glo.addLayout(hlayout) def ch_dur(th=None, dur=10): if len(dur) >= 1: try: dur = int(dur) except: dur = None if dur is None or not isinstance(dur, int): self.s_bar.setStyleSheet(self.s_error) self.s_bar.showMessage( '! Error: wrong duration entery, only integers') return None else: dur = 10 return dur def k_act(self): if self.ci_list.count() >= 1: cr = self.ci_list.currentRow() if cr is None or cr <= 0: cr = 0 ip = self.ci_list.item(cr).text() if self.Looping is not None: dur = self.ch_dur(self.nlo.text()) if dur is None: return True self.P = CC_thread(cancel_app, dur, ip) self.P.start() self.P.somesignal.connect(self.handleStatusMessage) self.P.setTerminationEnabled(True) self.inloop_state() return True else: ch = cancel_app(ip) if ch is None: self.s_bar.setStyleSheet(self.s_error) self.s_bar.showMessage('! Error: failed to kill stream ..') else: self.s_bar.setStyleSheet(self.s_norm) self.s_bar.showMessage('# Stream got killed ') else: self.s_bar.setStyleSheet(self.s_error) self.s_bar.showMessage('! Error: No items selected from the list') self.eout() return True def fr_act(self): if self.ci_list.count() >= 1: cr = self.ci_list.currentRow() if cr is None or cr <= 0: cr = 0 ip = self.ci_list.item(cr).text() if self.Looping is not None: dur = self.ch_dur(self.nlo.text()) if dur is None: return True self.P = CC_thread(reset_cc, dur, ip) self.P.start() self.P.somesignal.connect(self.handleStatusMessage) self.P.setTerminationEnabled(True) self.inloop_state() return True else: ch = reset_cc(ip) if ch is None: self.s_bar.setStyleSheet(self.s_error) self.s_bar.showMessage( '! Error: failed to factory reset ..') else: self.s_bar.setStyleSheet(self.s_norm) self.s_bar.showMessage('# Got factory reseted ') else: self.s_bar.setStyleSheet(self.s_error) self.s_bar.showMessage('! Error: No items selected from the list') self.eout() return True def y_act(self, link=None): if self.ci_list.count() >= 1: cr = self.ci_list.currentRow() if cr is None or cr <= 0: cr = 0 ip = self.ci_list.item(cr).text() if self.Looping is not None: dur = self.ch_dur(self.nlo.text()) if dur is None: return True self.P = CC_thread(send_app, dur, ip, link) self.P.start() self.P.somesignal.connect(self.handleStatusMessage) self.P.setTerminationEnabled(True) self.inloop_state() return True else: ch = reset_cc(ip) if ch is None: self.s_bar.setStyleSheet(self.s_error) self.s_bar.showMessage('! Error: failed to stream link ..') else: self.s_bar.setStyleSheet(self.s_norm) self.s_bar.showMessage('# Streamed the link ') else: self.s_bar.setStyleSheet(self.s_error) self.s_bar.showMessage('! Error: No items selected from the list') self.eout() return True def yv_input(self): text, okPressed = QInputDialog.getText( self, "Stream youtube", "Enter youtube video link to be streamed :") if okPressed and text != '': ntext = text.split('?') if len(ntext) <= 1: self.s_bar.setStyleSheet(self.s_error) self.s_bar.showMessage('! Error: Invalid youtube linkd ') return False ntext = ntext[1] if ntext != '' and len(ntext) > 1 and "youtube" in text: self.y_act(ntext) return True else: self.s_bar.setStyleSheet(self.s_error) self.s_bar.showMessage('! Error: Invalid youtube linkd ') return False @Slot(object) def handleStatusMessage(self, message): self.s_bar.setStyleSheet(self.s_loop) self.s_bar.showMessage(message) def il_add(self, items=[]): if len(items) >= 1: self.s_bar.setStyleSheet(self.s_norm) for i in items: fitem = self.ci_list.findItems(i, Qt.MatchExactly) if len(fitem) >= 1: self.s_bar.setStyleSheet(self.s_error) self.s_bar.showMessage( '! Error: Device exists in the list') else: self.s_bar.setStyleSheet(self.s_norm) self.ci_list.addItem(i) self.s_bar.showMessage('# Device was found and added') if not self.P.isRunning(): self.cle_btn.setEnabled(True) self.ci_list.setEnabled(True) self.llo.setEnabled(True) self.nlo.setEnabled(True) self.ksbutton.setEnabled(True) self.sbutton.setEnabled(True) self.fbutton.setEnabled(True) else: self.s_bar.setStyleSheet(self.s_norm) self.s_bar.showMessage('# Cleard devices list') self.ci_list.clear() self.cle_btn.setEnabled(False) self.ci_list.setEnabled(False) self.ksbutton.setEnabled(False) self.llo.setEnabled(False) self.nlo.setEnabled(False) self.sbutton.setEnabled(False) self.fbutton.setEnabled(False) return True def inloop_state(self, out=False): if not out: self.lbtn.setEnabled(True) self.cle_btn.setEnabled(False) self.ci_list.setEnabled(False) self.ksbutton.setEnabled(False) self.llo.setEnabled(False) self.nlo.setEnabled(False) self.sbutton.setEnabled(False) self.fbutton.setEnabled(False) else: if self.P.isRunning(): self.P.stop() self.lbtn.setEnabled(False) self.cle_btn.setEnabled(True) self.ci_list.setEnabled(True) self.ksbutton.setEnabled(True) self.llo.setEnabled(True) self.nlo.setEnabled(True) self.sbutton.setEnabled(True) self.fbutton.setEnabled(True) self.s_bar.clearMessage() return True def ds_bar(self, glo): self.s_bar = QStatusBar() self.s_error = "QStatusBar{color:red;font-weight:1000;}" self.s_loop = "QStatusBar{color:black;font-weight:1000;}" self.s_norm = "QStatusBar{color:blue;font-style:italic;" self.s_norm += "font-weight:500;}" self.s_bar.setStyleSheet(self.s_norm) glo.addWidget(self.s_bar) def eout(self): msgg = "<center>" msgg += " Opps, a critical error has occurred, we will be " msgg += " grateful if you can help fixing it, by reporting to us " msgg += " at : <br><br> " msgg += "<b><a href='https://github.io/mrf345/chrome-cut'> " msgg += "https://github.io/mrf345/chrome-cut </a></b> </center>" mm = QMessageBox.critical(self, "Critical Error", msgg, QMessageBox.Ok) exit(0)
class Note(QtGui.QWidget): def __init__(self, message, mainGui, parent=None): super(Note, self).__init__(parent) self.mainGui = mainGui self.NOTE_WIDTH = 240 self.NOTE_HEIGHT = 240 self.setFixedSize(self.NOTE_WIDTH, self.NOTE_HEIGHT) self.setObjectName("note") self.drag = False # czy karteczka jest w trakcie przenoszenia? self.dragPos = QPoint() # pozycja rozpoczecia przenoszenia assert message self.setWindowFlags(Qt.FramelessWindowHint) self.setWindowTitle("Note") # FIXME # -- główne layouty -- self.globalVLayout = QtGui.QVBoxLayout(self) self.globalVLayout.setObjectName("globalVLayout") self.upperHLayout = QtGui.QHBoxLayout() self.upperHLayout.setObjectName("upperHLayout") self.globalVLayout.addLayout(self.upperHLayout) self.fromToForm = QtGui.QFormLayout() self.upperHLayout.addLayout(self.fromToForm) # -- layout z nadawcą i adresatami -- self.fromToForm.setSizeConstraint(QtGui.QLayout.SetFixedSize) self.fromToForm.setFieldGrowthPolicy(QtGui.QFormLayout.ExpandingFieldsGrow) self.fromToForm.setObjectName("fromToForm") self.fromLabel = QtGui.QLabel("From:", self) self.fromLabel.setObjectName("fromLabel") self.fromToForm.setWidget(0, QtGui.QFormLayout.LabelRole, self.fromLabel) self.fromToFormUpRight = QtGui.QHBoxLayout() self.fromToForm.setLayout(0, QtGui.QFormLayout.FieldRole, self.fromToFormUpRight) self.toLabel = QtGui.QLabel("To:", self) self.toLabel.setObjectName("toLabel") self.fromToForm.setWidget(1, QtGui.QFormLayout.LabelRole, self.toLabel) self.fromToFormDownRight = QtGui.QHBoxLayout() self.fromToForm.setLayout(1, QtGui.QFormLayout.FieldRole, self.fromToFormDownRight) # -- przyciski funkcyjne -- iconButtonPolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed) iconButtonPolicy.setHorizontalStretch(0) iconButtonPolicy.setVerticalStretch(0) # -- przycisk wysłania -- self.sendButton = QPushButton(u"&Send") self.sendButton.setObjectName("sendButton") self.sendButton.setIcon(pea_app().send_icon) sendSizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed) self.sendButton.setSizePolicy(sendSizePolicy) # -- przycisk dodawania self.addButton = QtGui.QPushButton(self) self.addButton.setObjectName("addButton") self.addButton.setSizePolicy(iconButtonPolicy) self.addButton.setIcon(pea_app().add_icon) self.sendButton.clicked.connect(self.sendMessage) # -- przycisk do dat self.datesButton = QtGui.QPushButton(self) self.datesButton.setCheckable(True) self.datesButton.setObjectName("datesButton") self.datesButton.setSizePolicy(iconButtonPolicy) self.datesButton.setIcon(pea_app().calendar_icon) # -- przycisk zamykania self.closeButton = QtGui.QPushButton(self) self.closeButton.setObjectName("closeButton") self.closeButton.setSizePolicy(iconButtonPolicy) self.closeButton.setIcon(pea_app().close_icon) # --- górny prawy --- self.senderUserEntry = QtGui.QLabel('') self.senderUserEntry.setObjectName("senderUserEntry") self.fromToFormUpRight.addWidget(self.senderUserEntry) self.fromToFormUpRight.addStretch() self.fromToFormUpRight.addWidget(self.sendButton) self.fromToFormUpRight.addWidget(self.datesButton) self.fromToFormUpRight.addWidget(self.closeButton) # --- # --- dolny prawy --- self.recipientsBox = QtGui.QLabel() self.fromToFormDownRight.addWidget(self.recipientsBox) self.fromToFormDownRight.addStretch() self.fromToFormDownRight.addWidget(self.addButton) # --- # -- linia oddzielająca nagłówek od treści self.line = QtGui.QFrame(self) self.line.setFrameShape(QtGui.QFrame.HLine) self.line.setFrameShadow(QtGui.QFrame.Sunken) self.line.setObjectName("line") self.globalVLayout.addWidget(self.line) # -- DATES -- # TODO: zmniejszyć czcionkę? self.datesForm = QtGui.QFormLayout() self.datesForm.setObjectName("datesForm") self.dateLabel = QtGui.QLabel("Date:", self) self.dateLabel.setObjectName("dateLabel") self.datesForm.setWidget(0, QtGui.QFormLayout.LabelRole, self.dateLabel) self.validLabel = QtGui.QLabel("Valid till:", self) self.validLabel.setObjectName("validLabel") self.datesForm.setWidget(1, QtGui.QFormLayout.LabelRole, self.validLabel) self.dateData = QtGui.QLabel(self) self.dateData.setObjectName("dateData") self.datesForm.setWidget(0, QtGui.QFormLayout.FieldRole, self.dateData) self.validData = QtGui.QLabel(self) self.validData.setObjectName("validData") self.datesForm.setWidget(1, QtGui.QFormLayout.FieldRole, self.validData) self.datesWidget = QtGui.QWidget() self.datesWidget.setLayout(self.datesForm) self.globalVLayout.addWidget(self.datesWidget) # -- obsługa chowania dat self.datesWidget.hide() self.datesButton.toggled.connect(self.toggleDatesWidget) # TODO: # -- obsługa dodawania adresata self.addButton.clicked.connect(self.selectRecipients) # -- pole treści self.noteContent = QtGui.QTextBrowser(self) self.noteContent.setEnabled(True) self.noteContent.setFrameShape(QtGui.QFrame.NoFrame) self.noteContent.setFrameShadow(QtGui.QFrame.Plain) self.noteContent.setReadOnly(True) self.noteContent.setObjectName("noteContent") self.globalVLayout.addWidget(self.noteContent) # -- obsługa zamykania self.closeButton.setShortcut(QtGui.QApplication.translate("note", "Ctrl+Q", None, QtGui.QApplication.UnicodeUTF8)) self.closeButton.clicked.connect(self.closeNote) # -- przyszłe okno wyboru adresatów self.selectRecipentsWindow = None # -- ustawienie treści self.setMessage(message) def setRecipients(self, recipients): '''Ustawia listę nadawców Argument recipients: lista str [odbiorca1, odbiorca2, ...]''' self.recipients_ = recipients rec_join = ', '.join(recipients) self.recipientsBox.setText(trunc_str(rec_join, 21)) self.recipientsBox.setToolTip(rec_join) def setSender(self, sender): '''Ustawia wysyłającego Argument sender: str nadawca''' self.sender_ = sender def mousePressEvent(self, event): self.raise_() if event.button() == Qt.LeftButton: self.drag = True self.dragPos = event.globalPos() - self.pos() def mouseReleaseEvent(self, event): self.drag = False def mouseMoveEvent(self, event): if self.drag: self.move(event.globalPos() - self.dragPos) def updateMessageState(self): s = self.__message__.state send_button = False if s == MsgState.GUI: self.noteContent.setReadOnly(False) send_button = True self.addButton.show() elif s == MsgState.TO_SEND: send_button = True self.addButton.setDisabled(True) self.sendButton.setDisabled(True) self.noteContent.setReadOnly(True) elif s == MsgState.DELETED: self.close() else: self.sendButton.hide() self.addButton.hide() self.noteContent.setReadOnly(True) if send_button: self.sendButton.show() self.senderUserEntry.setText(trunc_str(self.sender(), 6)) else: self.senderUserEntry.setText(trunc_str(self.sender(), 16)) self.senderUserEntry.setToolTip(self.sender()) def setMessageState(self, state): self.__message__.state = state self.updateMessageState() def setMessage(self, message): assert message self.__message__ = message self.setSender(message.sender) self.setRecipients(message.recipients) self.dateData.setText(message.create_date.strftime(DATETIME_FORMAT)) self.validData.setText(message.expire_date.strftime(DATETIME_FORMAT)) self.noteContent.setHtml(message.content) self.updateMessageState() def sendMessage(self): # tylko dla całkiem nowych wiadomości (w sumie tylko powinny być) if self.__message__.state == MsgState.GUI: self.__message__.content = self.noteContent.toPlainText() self.__message__.sender = self.sender() self.__message__.recipients = self.recipients() self.setMessageState(MsgState.TO_SEND) self.mainGui.client.addMsg(self.__message__) self.mainGui.updateNotes() def getMessage(self): return self.__message__ def sender(self): return self.sender_ def recipients(self): '''Zwraca listę str adresatów''' return self.recipients_ def knownUsers(self): '''Zwraca listę znanych użytkowników''' return self.mainGui.knownUsers() def addKnownUser(self, username): self.mainGui.addKnownUser(username) @Slot() def closeNote(self): '''Dla przycisku zamykania - tylko ustawia stan DELETED. Reszta działań jest obsługiwana przez zmianę stanu''' self.setMessageState(MsgState.DELETED) # TODO: do tego można zrobić inną metodę przesyłającą tylko nowy stan... self.mainGui.client.modMsg(self.__message__) @Slot() def toggleDatesWidget(self, visibility): '''Dla widgetu z datami - przełączanie widoczności''' if visibility: self.datesWidget.show() else: self.datesWidget.hide() @Slot() def selectRecipients(self): if not self.selectRecipentsWindow: self.selectRecipentsWindow = SelectRecipientsWindow(self) self.selectRecipentsWindow.show()
class MainWindow(QMainWindow): def __init__(self): """ Constructor Function """ super(MainWindow, self).__init__() self.initGUI() self.mysignal = FooConnection() self.mysignal.foosignal.connect(self.updateGui) def initGUI(self): self.setWindowTitle("Enrollee") self.setGeometry(200, 400, 200, 200) self.center() self.setLayout() self.show() def center(self): """ Function to center the application """ qRect = self.frameGeometry() centerPoint = QDesktopWidget().availableGeometry().center() # First move the rectangle qRect.moveCenter(centerPoint) # move my window to the moved rectangle. self.move(qRect.topLeft()) @Slot() def updateGui(self): interface = "wlan1" self.rebootButton.setIcon(self.happyDuckIcon) self.myStatusBar.showMessage("Waiting for DHCP address.") p = subprocess.Popen(["/sbin/dhclient", interface], shell=False, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) res, err = p.communicate() self.myStatusBar.showMessage("Done!") def run_cmd(self, cmd): p = subprocess.Popen(cmd, shell=False, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) res, err = p.communicate() return res.split('\n')[1] def checkFiles(self): print("checking") if not filecmp.cmp("wpa_supplicant.conf", "wpa_supplicant.conf.orig"): self.mysignal.foosignal.emit("onboarded") else: self.thread = Timer(5, self.checkFiles) self.thread.start() def reboot(self): shutil.copyfile("wpa_supplicant.conf.orig", "wpa_supplicant.conf") os.system("sudo reboot") def setLayout(self): self.myStatusBar = QStatusBar() self.setStatusBar(self.myStatusBar) self.duckIcon = QIcon("duck.jpeg") self.happyDuckIcon = QIcon("happy-duck.jpeg") qWidget = QWidget() gridLayout = QGridLayout(qWidget) row = 0 self.setCentralWidget(qWidget) row = row + 1 self.rebootButton = QPushButton("Click to reset") #self.rebootButton.setIcon(QIcon("duck.jpeg")) self.rebootButton.setIconSize(QSize(200, 200)) gridLayout.addWidget(self.rebootButton, row, 0) self.rebootButton.clicked.connect(self.reboot) if filecmp.cmp("wpa_supplicant.conf", "wpa_supplicant.conf.orig"): self.myStatusBar.showMessage("Waiting to onboard.") self.rebootButton.setIcon(self.duckIcon) self.thread = Timer(5, self.checkFiles) self.thread.start() else: self.rebootButton.setIcon(self.happyDuckIcon) self.myStatusBar.showMessage("waiting for DHCP address") interface = "wlan1" p = subprocess.Popen(["/sbin/dhclient", interface], shell=False, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) res, err = p.communicate()
def __create_ui(self): """ Create main UI """ self.setWindowTitle(CREATE_NODE_TITLE) # remove window decoration if path and type is set if self.defined_path and self.defined_type: self.setWindowFlags(Qt.FramelessWindowHint | Qt.Popup) main_layout = QVBoxLayout(self) main_layout.setSpacing(1) main_layout.setContentsMargins(2, 2, 2, 2) # content layout content_layout = QVBoxLayout() self.files_model = QFileSystemModel() self.files_model.setNameFilterDisables(False) self.files_list = MTTFileList() self.files_list.setAlternatingRowColors(True) self.files_list.setSelectionMode(QAbstractItemView.ExtendedSelection) self.files_list.selectionValidated.connect(self.do_validate_selection) self.files_list.goToParentDirectory.connect(self.on_go_up_parent) self.files_list.doubleClicked.connect(self.on_double_click) self.files_list.setModel(self.files_model) buttons_layout = QHBoxLayout() content_layout.addLayout(self.__create_filter_ui()) content_layout.addWidget(self.files_list) content_layout.addLayout(buttons_layout) self.files_list.filter_line = self.filter_line if not self.defined_path: # path line path_layout = QHBoxLayout() # bookmark button bookmark_btn = QPushButton('') bookmark_btn.setFlat(True) bookmark_btn.setIcon(QIcon(':/addBookmark.png')) bookmark_btn.setToolTip('Bookmark this Folder') bookmark_btn.setStatusTip('Bookmark this Folder') bookmark_btn.clicked.connect(self.on_add_bookmark) # path line edit self.path_edit = QLineEdit() self.path_edit.editingFinished.connect(self.on_enter_path) # parent folder button self.parent_folder_btn = QPushButton('') self.parent_folder_btn.setFlat(True) self.parent_folder_btn.setIcon(QIcon(':/SP_FileDialogToParent.png')) self.parent_folder_btn.setToolTip('Parent Directory') self.parent_folder_btn.setStatusTip('Parent Directory') self.parent_folder_btn.clicked.connect(self.on_go_up_parent) # browse button browse_btn = QPushButton('') browse_btn.setFlat(True) browse_btn.setIcon(QIcon(':/navButtonBrowse.png')) browse_btn.setToolTip('Browse Directory') browse_btn.setStatusTip('Browse Directory') browse_btn.clicked.connect(self.on_browse) # parent widget and layout path_layout.addWidget(bookmark_btn) path_layout.addWidget(self.path_edit) path_layout.addWidget(self.parent_folder_btn) path_layout.addWidget(browse_btn) main_layout.addLayout(path_layout) # bookmark list bookmark_parent_layout = QHBoxLayout() bookmark_frame = QFrame() bookmark_frame.setFixedWidth(120) bookmark_layout = QVBoxLayout() bookmark_layout.setSpacing(1) bookmark_layout.setContentsMargins(2, 2, 2, 2) bookmark_frame.setLayout(bookmark_layout) bookmark_frame.setFrameStyle(QFrame.Sunken) bookmark_frame.setFrameShape(QFrame.StyledPanel) self.bookmark_list = MTTBookmarkList() self.bookmark_list.bookmarkDeleted.connect(self.do_delete_bookmark) self.bookmark_list.setAlternatingRowColors(True) self.bookmark_list.dragEnabled() self.bookmark_list.setAcceptDrops(True) self.bookmark_list.setDropIndicatorShown(True) self.bookmark_list.setDragDropMode(QListView.InternalMove) self.bookmark_list_sel_model = self.bookmark_list.selectionModel() self.bookmark_list_sel_model.selectionChanged.connect( self.on_select_bookmark) bookmark_layout.addWidget(self.bookmark_list) bookmark_parent_layout.addWidget(bookmark_frame) bookmark_parent_layout.addLayout(content_layout) main_layout.addLayout(bookmark_parent_layout) self.do_populate_bookmarks() else: main_layout.addLayout(content_layout) if not self.defined_type: # type layout self.types = QComboBox() self.types.addItems(self.supported_node_type) self.types.currentIndexChanged.connect(self.on_node_type_changed) if cmds.optionVar(exists='MTT_lastNodeType'): last = cmds.optionVar(query='MTT_lastNodeType') if last in self.supported_node_type: self.types.setCurrentIndex( self.supported_node_type.index(last)) buttons_layout.addWidget(self.types) if not self.defined_path or not self.defined_type: create_btn = QPushButton('C&reate') create_btn.clicked.connect(self.accept) cancel_btn = QPushButton('&Cancel') cancel_btn.clicked.connect(self.reject) buttons_layout.addStretch() buttons_layout.addWidget(create_btn) buttons_layout.addWidget(cancel_btn)
app = QApplication([]) mainWindow = QMainWindow() mainWindow.setUnifiedTitleAndToolBarOnMac(True) toolbar = mainWindow.addToolBar("Main") toolbar.setMovable(False) dirPath = os.path.dirname(__file__) basePath = os.path.join(dirPath, "../../resources/images/") icon = QIcon(basePath + "UserTransformButton.png") toolButtonLeft1 = CreateFlatButton(QAction(icon, "Left", mainWindow)) toolButtonLeft2 = CreateFlatButton(QAction(icon, "2nd left", mainWindow)) toolButtonRight = CreateFlatButton(QAction(icon, "Right", mainWindow)) toolButtonCenter = QPushButton() toolButtonCenter.setIcon(QIcon(basePath + "LandmarkTransformButton.png")) toolButtonCenter.setText("Center") toolButtonCenter.setMinimumWidth(200) barWidget = ToolbarWidget() barWidget.addLeftItem(toolButtonLeft1) barWidget.addLeftItem(toolButtonLeft2) barWidget.addCenterItem(toolButtonCenter) barWidget.addRightItem(toolButtonRight) toolbar.addWidget(barWidget) layout = QVBoxLayout() layout.setSpacing(0) layout.setContentsMargins(0, 0, 0, 0) layout.setAlignment(Qt.AlignVCenter | Qt.AlignHCenter)
def __init__(self, store): super(ItemSelector, self).__init__() self.setWindowTitle('Select Item Checkpoint') self.store = store items = self.store.get('/item') layout = QGridLayout() self.setLayout(layout) self.item_buttons = {} width = 5 label = QLabel('Selected Item') label.setAlignment(Qt.AlignHCenter) label.setStyleSheet('font-weight: bold;') layout.addWidget(label, 0, 0, 1, width) for (i, item) in enumerate(sorted(items)): parts = items[item]['name'].split(' ') + ['({})'.format(items[item]['location'])] lines = [''] for part in parts: if len(lines[-1]) > 10: lines.append('') lines[-1] += ' ' + part button = QPushButton('\n'.join([line.strip() for line in lines])) icon = QIcon(items[item].get('thumbnail', '')) if not icon.isNull(): button.setIcon(icon) button.setIconSize(QSize(64, 64)) button.setCheckable(True) button.clicked.connect(_call(self.select_item, item)) self.item_buttons[item] = button layout.addWidget(button, i // width + 1, i % width) self.select_item(self.store.get('/robot/selected_item')) self.box_buttons = {} label = QLabel('Selected Box') label.setAlignment(Qt.AlignHCenter) label.setStyleSheet('font-weight: bold;') layout.addWidget(label, 0, width + 1) for (i, box) in enumerate(sorted(self.store.get('/order'))): button = QPushButton(box) button.setCheckable(True) button.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Preferred) button.clicked.connect(_call(self.select_box, box)) self.box_buttons[box] = button layout.addWidget(button, i + 1, width + 1) self.select_box(self.store.get('/robot/selected_box')) self.bin_buttons = {} label = QLabel('Selected Bin') label.setAlignment(Qt.AlignHCenter) label.setStyleSheet('font-weight: bold;') layout.addWidget(label, 0, width + 2) for (i, bin) in enumerate(sorted(self.store.get('/shelf/bin'))): button = QPushButton(bin) button.setCheckable(True) button.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Preferred) button.clicked.connect(_call(self.select_bin, bin)) self.bin_buttons[bin] = button layout.addWidget(button, i + 1, width + 2) self.select_bin(self.store.get('/robot/selected_bin'))
class DeviceWidget(QGroupBox): PROGRAM_SIGNAL = 0 INFO_SIGNAL = 1 program = Signal(str) show_info = Signal(str) reset = Signal(str) def __init__(self, device): super(DeviceWidget, self).__init__(None) self.device = device self.label = None self.initUI() # label for generic keyplus device def setup_keyplus_label(self): try: self.device.open() settingsInfo = protocol.get_device_info(self.device) firmwareInfo = protocol.get_firmware_info(self.device) self.device.close() except TimeoutError as err: # Incase opening the device fails raise Exception("Error Opening Device: {} | {}:{}".format( self.device.path, self.device.vendor_id, self.device.product_id), file=sys.stderr) if settingsInfo.crc == settingsInfo.computed_crc: build_time_str = protocol.timestamp_to_str(settingsInfo.timestamp) self.label = QLabel('{} | {} | Firmware v{}.{}.{}\n' 'Device id: {}\n' 'Serial number: {}\n' 'Last time updated: {}'.format( self.device.manufacturer_string, self.device.product_string, firmwareInfo.version_major, firmwareInfo.version_minor, firmwareInfo.version_patch, settingsInfo.id, self.device.serial_number, build_time_str)) else: # CRC doesn't match if settingsInfo.is_empty: self.label = QLabel('??? | ??? | Firmware v{}.{}.{}\n' 'Warning: Empty settings!\n' 'Serial number: {}\n'.format( firmwareInfo.version_major, firmwareInfo.version_minor, firmwareInfo.version_patch, self.device.serial_number, )) else: # corrupt settings in the flash build_time_str = protocol.timestamp_to_str( settingsInfo.timestamp) self.label = QLabel('??? | ??? | Firmware v{}.{}.{}\n' 'WARNING: Settings are uninitialized\n' 'Serial number: {}\n'.format( firmwareInfo.version_major, firmwareInfo.version_minor, firmwareInfo.version_patch, self.device.serial_number, )) # xusb_boot bootloader device def setup_xusb_bootloader_label(self): try: self.device.open() bootloader_info = xusb_boot.get_boot_info(self.device) self.device.close() except TimeoutError as err: # Incase opening the device fails raise Exception("Error Opening Device: {} | {}:{}".format( self.device.path, self.device.vendor_id, self.device.product_id), file=sys.stderr) self.label = QLabel( '{} | {} | Bootloader v{}.{}\n' 'MCU: {}\n' 'Flash size: {}\n' 'Serial number: {}\n'.format( self.device.manufacturer_string, self.device.product_string, bootloader_info.version_major, bootloader_info.version_minor, bootloader_info.mcu_string, bootloader_info.flash_size, self.device.serial_number)) # nrf24lu1p def setup_nrf24lu1p_label(self): # try: # self.device.open() # bootloader_info = xusb_boot.get_boot_info(self.device) # self.device.close() # except TimeoutError as err: # # Incase opening the device fails # raise Exception ("Error Opening Device: {} | {}:{}" # .format( # self.device.path, # self.device.vendor_id, # self.device.product_id # ), # file=sys.stderr # ) self.label = QLabel('nRF24LU1+ Bootloader v{}.{}\n' 'MCU: nRF24LU1+\n'.format( 0, 0, self.device.manufacturer_string, self.device.product_string, )) def initUI(self): programIcon = QIcon('img/download.png') infoIcon = QIcon('img/info.png') if is_keyplus_device(self.device): self.setup_keyplus_label() elif is_xusb_bootloader_device(self.device): self.setup_xusb_bootloader_label() elif is_nrf24lu1p_bootloader_device(self.device): self.setup_nrf24lu1p_label() else: raise Exception("Unsupported USB device {}:{}".format( self.device.vendor_id, self.device.product_id)) if self.label == None: return self.label.setTextInteractionFlags(Qt.TextSelectableByMouse) self.label.setStyleSheet(""" QLabel { background: #FFF; border: 1px solid; padding: 2px; font: 11pt; } """) self.label.setFixedHeight(90) self.label.setMinimumWidth(390) self.programButton = QPushButton(' Program') self.programButton.setIcon(programIcon) self.programButton.clicked.connect(self.programSignal) if is_bootloader_device(self.device): self.secondaryButton = QPushButton('Reset') self.secondaryButton.clicked.connect(self.resetSignal) else: self.secondaryButton = QPushButton('Info') self.secondaryButton.setIcon(infoIcon) self.secondaryButton.clicked.connect(self.infoSignal) self.layout = QGridLayout() self.layout.addWidget(self.label, 0, 0, 2, 1) self.layout.addWidget(self.programButton, 0, 1) self.layout.addWidget(self.secondaryButton, 1, 1) self.setLayout(self.layout) self.setMaximumHeight(150) self.setContentsMargins(0, 0, 0, 0) self.setStyleSheet(""" QGroupBox { border: 1px solid #CCC; } """) def infoSignal(self): self.show_info.emit(self.device.path) def resetSignal(self): self.reset.emit(self.device.path) def programSignal(self): self.program.emit(self.device.path) def sizeHint(self): return QSize(560, 0)
def __init__(self, parent): super(TipOfTheDayDialog, self).__init__(parent) """ Default class constructor. :param `parent`: Pointer to a parent widget instance. :type `parent`: `QWidget`_ """ ## qDebug("TipOfTheDayDialog constructor") self.mainWin = parent self.setAttribute(Qt.WA_DeleteOnClose) self.setWizardStyle(QWizard.ModernStyle) self.setMinimumSize(550, 400) ## self.setOption(QWizard.HaveHelpButton, True) page = QWizardPage(self) self.imgBanner = ImageWidget(self.mainWin.gImgDir, self.mainWin.gIconDir, self) # Read in the tips.txt file. # fileOpen = open(self.mainWin.gAppDir + os.sep + 'tips.txt') # tips = fileOpen.read() # fileOpen.close() # self.tipsList = [tip for tip in tips.split('\n') if tip] # remove the blank lines also. self.tipsList = [tip for tip in TIPS_TXT.split('\n') if tip] # remove the blank lines also. # Make sure we don't cause an IndexError. # DEV-We might be adding tips to the txt at runtime. The easy way to add and check tips. if int(self.mainWin.settings_general_current_tip) >= len(self.tipsList): self.mainWin.settings_general_current_tip = 0 self.labelTipOfTheDay = QLabel(self) self.labelTipOfTheDay.setText(self.tipsList[int(self.mainWin.settings_general_current_tip)]) self.labelTipOfTheDay.setWordWrap(True) # Forget about a standardish QCheckBox, real powerusers keep the lights on! self.lightswitch = LightSwitchWidget(self.mainWin.gImgDir, self.mainWin, self) self.showOnStartupLabel = QLabel(self) self.showOnStartupLabel.setText(self.tr('Show tips on startup')) layout = QVBoxLayout(self) hblayout = QHBoxLayout() hblayout2 = QHBoxLayout() hblayout.addStretch(1) hblayout.addWidget(self.imgBanner) hblayout.addStretch(1) layout.addLayout(hblayout) layout.addStrut(1) layout.addSpacerItem(QSpacerItem(0, 5)) layout.addWidget(self.labelTipOfTheDay) layout.addStretch(1) hblayout2.addWidget(self.lightswitch) hblayout2.addWidget(self.showOnStartupLabel) hblayout2.addStretch(1) self.showOnStartupLabel.setAlignment(Qt.AlignBottom) layout.addLayout(hblayout2) page.setLayout(layout) self.addPage(page) self.setWindowTitle(self.tr('Tip of the Day')) buttonPrevious = QPushButton(self) buttonPrevious.setText(self.tr('&Previous')) buttonPrevious.setIcon(QIcon(self.mainWin.gIconDir + os.sep + 'undo.png')) buttonPrevious.setIconSize(QSize(24, 24)) buttonNext = QPushButton(self) buttonNext.setText(self.tr('&Next')) buttonNext.setIcon(QIcon(self.mainWin.gIconDir + os.sep + 'redo.png')) buttonNext.setIconSize(QSize(24, 24)) buttonClose = QPushButton(self) buttonClose.setText(self.tr('&Close')) buttonClose.setIcon(QIcon(self.mainWin.gIconDir + os.sep + 'windowclose.png')) buttonClose.setIconSize(QSize(24, 24)) self.setButton(QWizard.CustomButton1, buttonPrevious) self.setButton(QWizard.CustomButton2, buttonNext) self.setButton(QWizard.CustomButton3, buttonClose) self.setOption(QWizard.HaveCustomButton1, True) self.setOption(QWizard.HaveCustomButton2, True) self.setOption(QWizard.HaveCustomButton3, True) self.customButtonClicked.connect(self.buttonTipOfTheDayClicked) listTipOfTheDayButtons = [QWizard.Stretch, QWizard.CustomButton1, QWizard.CustomButton2, QWizard.CustomButton3] self.setButtonLayout(listTipOfTheDayButtons) self.DoSetWhatsThis()
def SetLayout(self): qWidget = QWidget() gridLayout = QGridLayout(qWidget) row = 0 self.setCentralWidget(qWidget) row += 1 ssidLabel = QLabel("SSID: ") self.ssId = QLineEdit() self.ssId.setText("ZodiacWX_24GHz") gridLayout.addWidget(ssidLabel, row, 0) gridLayout.addWidget(self.ssId, row, 1) row += 1 passwordLabel = QLabel("Password: "******"66666666") gridLayout.addWidget(passwordLabel, row, 0) gridLayout.addWidget(self.password, row, 1) row += 1 mudServerLabel = QLabel("MUD Server") self.mudServerAddress = QLineEdit() self.mudServerAddress.setText("203.0.113.7") #self.uploadMudUrlCheckbox = QCheckBox() #self.uploadMudUrlCheckbox.setToolTip(QToolTip("Send MUD URL to MUD Server?")) gridLayout.addWidget(mudServerLabel, row, 0) gridLayout.addWidget(self.mudServerAddress, row, 1) row += 1 dppUriLabel = QLabel("DPP URI: ") self.dppUri = QLineEdit() scanPushButton = QPushButton("Scan", self) scanPushButton.clicked.connect(self.doScanQrCode) readQrCodePushButton = QPushButton("Select", self) readQrCodePushButton.clicked.connect(self.doSelectQrCodeImage) gridLayout.addWidget(dppUriLabel, row, 0) gridLayout.addWidget(self.dppUri, row, 1) gridLayout.addWidget(readQrCodePushButton, row, 2) gridLayout.addWidget(scanPushButton, row, 3) row += 1 caCertLabel = QLabel("CA Cert") self.caCertPath = QLineEdit() self.caCertPath.setText( os.environ.get("PROJECT_HOME") + "/testcerts/ca/certs/root.cert.pem") certPathButton = QPushButton("Select") certPathButton.clicked.connect(self.doSelectCaCertPath) gridLayout.addWidget(caCertLabel, row, 0) gridLayout.addWidget(self.caCertPath, row, 1) gridLayout.addWidget(certPathButton, row, 2) row += 1 onboardButton = QPushButton("Onboard Supplicant", self) onboardButton.setIcon(QIcon("duck.png")) onboardButton.setIconSize(QSize(100, 100)) onboardButton.clicked.connect(self.doOnboard) viewCertButton = QPushButton("View CA Certificate", self) viewCertButton.clicked.connect(self.doViewCertificate) viewDevCertButton = QPushButton("View Device Certificate", self) viewDevCertButton.clicked.connect(self.doViewDeviceCertificate) outputCommand = QPushButton("Show Command") outputCommand.clicked.connect(self.doViewCommand) quitButton = QPushButton("Quit") quitButton.clicked.connect(self.doQuit) gridLayout.addWidget(onboardButton, row, 0) gridLayout.addWidget(viewCertButton, row, 1) gridLayout.addWidget(viewDevCertButton, row, 2) gridLayout.addWidget(outputCommand, row, 3) gridLayout.addWidget(quitButton, row, 4) self.myStatusBar = QStatusBar() self.setStatusBar(self.myStatusBar) self.myStatusBar.showMessage( "Note: start wpa_supplicant using start_wpas.sh")
class PathEditor(QWidget): """ Custom widget with LineEdit and a Button to browse file """ editingFinished = Signal() def __init__(self, parent=None, index=None): super(PathEditor, self).__init__(parent) self.parent = parent self.index = index self.open_dialog_visible = False self.setFocusPolicy(Qt.StrongFocus) editor_layout = QHBoxLayout() editor_layout.setContentsMargins(0, 0, 0, 0) editor_layout.setSpacing(0) self.line_edit = LineEditor(self) editor_layout.addWidget(self.line_edit) self.button = QPushButton('') self.button.setIcon(QIcon(':/editor_folder')) self.button.setFixedSize(18, 17) self.button.setToolTip('Select a texture') self.button.setStatusTip('Select a texture') self.button.clicked.connect(self.select_file) editor_layout.addWidget(self.button) self.setFocusProxy(self.line_edit) self.setLayout(editor_layout) def setText(self, text): """ Set line edit text :param text: (string) text... """ self.line_edit.setText(text) def text(self): """ return line edit text """ return self.line_edit.text() def select_file(self): """ Maya Open Dialog to select file texture """ self.open_dialog_visible = True if MTTSettings.value('browserFirstStart'): image_dir = cmds.optionVar(query='MTT_browserStartFolder') else: image_dir = cmds.workspace(query=True, rootDirectory=True) + cmds.workspace( fileRuleEntry='sourceImages') MTTSettings.set_value('browserFirstStart', True) file_path = cmds.fileDialog2(fileMode=1, startingDirectory=image_dir, caption='Select a texture', okCaption='Select') if file_path: new_path = file_path[0] cmds.optionVar( sv=['MTT_browserStartFolder', os.path.dirname(new_path)]) if MTTSettings.value('forceRelativePath'): new_path = convert_to_relative_path(new_path) # relative_path = workspace(projectPath=new_path) # if relative_path != new_path: # new_path = '/%s' % relative_path self.line_edit.setText(new_path) self.open_dialog_visible = False self.close() self.editingFinished.emit() cmds.showWindow(WINDOW_NAME)
app = QApplication([]) mainWindow = QMainWindow() mainWindow.setUnifiedTitleAndToolBarOnMac(True) toolbar = mainWindow.addToolBar("Main") toolbar.setMovable(False) dirPath = os.path.dirname(__file__) basePath = os.path.join(dirPath, "../../resources/images/") icon = QIcon(basePath + "UserTransformButton.png") toolButtonLeft1 = CreateFlatButton(QAction(icon, "Left", mainWindow)) toolButtonLeft2 = CreateFlatButton(QAction(icon, "2nd left", mainWindow)) toolButtonRight = CreateFlatButton(QAction(icon, "Right", mainWindow)) toolButtonCenter = QPushButton() toolButtonCenter.setIcon(QIcon(basePath + "LandmarkTransformButton.png")) toolButtonCenter.setText("Center") toolButtonCenter.setMinimumWidth(200) barWidget = ToolbarWidget() barWidget.addLeftItem(toolButtonLeft1) barWidget.addLeftItem(toolButtonLeft2) barWidget.addCenterItem(toolButtonCenter) barWidget.addRightItem(toolButtonRight) toolbar.addWidget(barWidget) layout = QVBoxLayout() layout.setSpacing(0) layout.setContentsMargins(0, 0, 0, 0) layout.setAlignment(Qt.AlignVCenter | Qt.AlignHCenter)
class NodeLister(QFrame): def __init__(self): super(NodeLister, self).__init__() self.setWindowTitle('Node Lister') self._btn_refresh = QPushButton('Refresh') self._btn_expand = QPushButton('Expand/Collapse') self._tree = NodeTree() self._ledit_search = QLineEdit() self._expand_state = False self._setup_ui() self._set_connections() def _expand_toggle(self): self._expand_state = not self._expand_state if self._expand_state: self._tree.expandAll() else: self._tree.collapseAll() def _filter_list(self): search_strings = str(self._ledit_search.text()).split() proxy = self._tree.model() model = proxy.sourceModel() show_rows = list() node_rows = list() rows = model.get_rows() class_rows = filter(lambda x: type(x) == ClassRow, rows) for class_row in class_rows: node_rows.extend(class_row.get_node_rows()) for row in class_rows + node_rows: item = row.first_item() index = model.indexFromItem(item) proxy_index = proxy.mapFromSource(index) self._tree.setRowHidden(proxy_index.row(), proxy_index.parent(), False) if search_strings: for search_item in search_strings: for row in node_rows: if search_item.strip().lower() in row.get_item('Node').text().lower(): show_rows.append(row) self._tree.expandAll() self._expand_state = True show_class_rows = list(set(map(lambda x: x.get_parent_class_row(), show_rows))) for row in node_rows: if row not in show_rows: item = row.first_item() index = model.indexFromItem(item) proxy_index = proxy.mapFromSource(index) self._tree.setRowHidden(proxy_index.row(), proxy_index.parent(), True) for row in class_rows: if row not in show_class_rows: item = row.first_item() index = model.indexFromItem(item) proxy_index = proxy.mapFromSource(index) self._tree.setRowHidden(proxy_index.row(), proxy_index.parent(), True) else: self._tree.collapseAll() self._expand_state = False def _refresh(self): model = self._tree.model().sourceModel() nodes = nuke.allNodes() node_dict = {} for node in nodes: if node.Class() not in node_dict.keys(): node_dict[node.Class()] = [] node_dict[node.Class()].append(node) model.clear_rows() model.populate(node_dict) def _set_connections(self): self._btn_refresh.released.connect(self._refresh) self._ledit_search.textChanged.connect(self._filter_list) self._btn_expand.released.connect(self._expand_toggle) def _setup_ui(self): self._btn_refresh.setIcon(QIcon(':qrc/images/Refresh.png')) self._btn_refresh.setToolTip('Populate tree with nodes') self._btn_expand.setToolTip('Toggle expanding and collapsing the tree') self._ledit_search.setToolTip('Search by node name') lyt_refresh = QHBoxLayout() lyt_refresh.addWidget(self._btn_refresh) lyt_refresh.addWidget(self._btn_expand) lyt_search = QHBoxLayout() lbl_search = QLabel('Name Search') lyt_search.addWidget(lbl_search) lyt_search.addWidget(self._ledit_search) lyt_main = QVBoxLayout() lyt_main.addLayout(lyt_refresh) lyt_main.addWidget(self._tree) lyt_main.addLayout(lyt_search) self.setLayout(lyt_main)
class PathEditor(QWidget): """ Custom widget with LineEdit and a Button to browse file """ editingFinished = Signal() def __init__(self, parent=None, index=None): super(PathEditor, self).__init__(parent) self.parent = parent self.index = index self.open_dialog_visible = False self.setFocusPolicy(Qt.StrongFocus) editor_layout = QHBoxLayout() editor_layout.setContentsMargins(0, 0, 0, 0) editor_layout.setSpacing(0) self.line_edit = LineEditor(self) editor_layout.addWidget(self.line_edit) self.button = QPushButton('') self.button.setIcon(QIcon(':/editor_folder')) self.button.setFixedSize(18, 17) self.button.setToolTip('Select a texture') self.button.setStatusTip('Select a texture') self.button.clicked.connect(self.select_file) editor_layout.addWidget(self.button) self.setFocusProxy(self.line_edit) self.setLayout(editor_layout) def setText(self, text): """ Set line edit text :param text: (string) text... """ self.line_edit.setText(text) def text(self): """ return line edit text """ return self.line_edit.text() def select_file(self): """ Maya Open Dialog to select file texture """ self.open_dialog_visible = True if MTTSettings.value('browserFirstStart'): image_dir = cmds.optionVar(query='MTT_browserStartFolder') else: image_dir = cmds.workspace(query=True, rootDirectory=True) + cmds.workspace( fileRuleEntry='sourceImages') MTTSettings.set_value('browserFirstStart', True) file_path = cmds.fileDialog2(fileMode=1, startingDirectory=image_dir, caption='Select a texture', okCaption='Select') if file_path: new_path = file_path[0] cmds.optionVar( sv=['MTT_browserStartFolder', os.path.dirname(new_path)]) if MTTSettings.value('forceRelativePath'): new_path = convert_to_relative_path(new_path) # relative_path = workspace(projectPath=new_path) # if relative_path != new_path: # new_path = '/%s' % relative_path self.line_edit.setText(new_path) self.open_dialog_visible = False self.close() self.editingFinished.emit() cmds.showWindow(WINDOW_NAME)
class BookEditForm(QScrollArea, Ui_BookForm): """ Interface for book edit """ column = { 'id':0, 'barcode':1, 'title':2, 'author':3, 's_author':4, 'publisher':5, 'year':6, 'price':7, 'description':8, 'stock':9, 'image':10, 'availability':11 } IMG_SIZE = (150, 150) def __init__(self, record_id, parent=None): super(BookEditForm, self).__init__(parent) self.setupUi(self) # had to subclass this spinbox to support return grabbing self.edYear = ReturnKeySpinBox(self) self.edYearHolder.addWidget(self.edYear) # configuring id's for radio group self.radioAvailability.setId(self.rdSell,0) self.radioAvailability.setId(self.rdRent,1) self.radioAvailability.setId(self.rdInactive,2) # overlaying a clean button over the image (couldn't do it in designer) self.btnCleanImage = QPushButton() self.btnCleanImage.setIcon(QIcon(":icons/clean.png")) self.btnCleanImage.setFixedWidth(35) self.btnCleanImage.clicked.connect(self.clear_image) self.btnCleanImage.setVisible(False) clean_img_layout = QVBoxLayout(self.edImage) clean_img_layout.addWidget(self.btnCleanImage) clean_img_layout.setAlignment(Qt.AlignTop | Qt.AlignLeft) clean_img_layout.setContentsMargins(2,2,0,0) self._access = statics.access_level # for currency formatting self._locale = QLocale() self._record_id = record_id # had to hardcode these, wouldn't work otherwise: self.contentsLayout.setAlignment(self.groupBox, QtCore.Qt.AlignTop) self.contentsLayout.setAlignment(self.groupBox_2, QtCore.Qt.AlignTop) self.log = logging.getLogger('BookEditForm') self._subject_list = [] self._removed_subjects = [] self._added_subjects = [] self.setup_model() self.fill_form() self.setup_fields() self._old_data = self.extract_input(text_only=True) # flag to indicate whether there were changes to the fields self._dirty = False # user did input an image self._image_set = False # image changed during edit self._image_changed = False def is_dirty(self): return self._dirty def setup_fields(self): """ setting up validators and stuff """ # validators # forcing uppercasing on these fields self.edTitle.setValidator(UppercaseValidator()) self.edAuthor.setValidator(UppercaseValidator()) self.edSAuthor.setValidator(UppercaseValidator()) self.edPublisher.setValidator(UppercaseValidator()) self.edPrice.setValidator(CurrencyValidator(self.edPrice)) self.edBarcode.setValidator(NumericValidator()) self.edYear.setMinimum(1900) self.edYear.setMaximum(date.today().year) self.edYear.setValue(date.today().year) # fixing tab order self.setTabOrder(self.edPublisher, self.edYear) self.setTabOrder(self.edYear, self.edPrice) # connecting return key to tab lineEditList = self.findChildren(QLineEdit) for lineEdit in lineEditList: # had some problem with C++ originated objects if lineEdit.objectName() not in ['qt_spinbox_lineedit', 'edSubject']: lineEdit.returnPressed.connect(lineEdit.focusNextChild) # detect changes on line edits lineEdit.textChanged.connect(self.check_changes) # different behaviour for these self.edBarcode.textChanged.connect(self.check_barcode) self.edSubject.returnPressed.connect(self.on_btnAddSubject_clicked) # completers config_completer(self.edSubject, self._subject_model, "name") config_completer(self.edAuthor, self._author_model, "name") config_completer(self.edSAuthor, self._s_author_model, "name") config_completer(self.edPublisher, self._publisher_model, "name") # making image clickable clickable(self.edImage).connect(self.handle_image) def fill_form(self): # retrieving book info self.edBarcode.setText(self._record.value("barcode")) self.edTitle.setText(self._record.value("title")) self.edYear.setValue(self._record.value("year")) self.edDescription.setPlainText(self._record.value("description")) self.radioAvailability.button(self._record.value("availability")).setChecked(True) # retrieving image ba = QByteArray(self._record.value("image")) if ba: self._image_set = True img = qbytearray_to_qimage(ba) self.set_image(img, clean_visible=True) # currency # TODO: ARRUMAR self.edPrice.setText(self._locale.toString(self._record.value("price"), 'f', 2).replace('.','')) # qcompleter fields self.edAuthor.setText(self._get_name_from_id("author", self._record.value("author_id"))) self.edSAuthor.setText(self._get_name_from_id("s_author", self._record.value("s_author_id"))) self.edPublisher.setText(self._get_name_from_id("publisher", self._record.value("publisher_id"))) # retrieving subjects for subj_record in self._subj_records: self.add_subject([subj_record.value("id"),subj_record.value("name")]) # clearing changes self._added_subjects[:] = [] self.refresh_tableSubjects() def clear_image(self): img = QImage(":icons/no_image.png") self.set_image(img, clean_visible=False) if self._image_set: self._image_set = False self._image_changed = True def handle_image(self): image_path = QFileDialog.getOpenFileName(self, "Escolha uma imagem", os.getenv("HOME"), "Imagens (*.png, *.jpg *.bmp)")[0] if os.path.exists(image_path): self.set_image(QImage(image_path), clean_visible=True) self._image_set = True self._image_changed = True def set_image(self, img, clean_visible=False): pix = QPixmap.fromImage(img) pix = pix.scaled(self.IMG_SIZE[0], self.IMG_SIZE[1], Qt.KeepAspectRatio) self.edImage.setPixmap(pix) self.edImage.setScaledContents(True) self.btnCleanImage.setVisible(clean_visible) def check_changes(self, txt): # getting sender info sender = self.sender().objectName().split('ed')[1].lower() if sender != 'subject' and self._old_data[sender] != txt: self._dirty = True def check_barcode(self, txt): if len(txt) == self.edBarcode.maxLength(): self.edBarcode.focusNextChild() def extract_input(self, text_only=False): data = {} data['barcode'] = self.edBarcode.text() data['title'] = self.edTitle.text() # completer fields for c_field, line_edit in [("author", self.edAuthor), ("s_author", self.edSAuthor), ("publisher", self.edPublisher)]: if not text_only: data[c_field] = self._get_cfield_value(c_field, line_edit.text()) else: data[c_field] = line_edit.text() data['year'] = self.edYear.value() data['price'] = self._locale.toDouble(self.edPrice.text())[0] data['description'] = self.edDescription.toPlainText() if not text_only and self._image_changed and self._image_set: data['image'] = qpixmap_to_qbytearray(self.edImage.pixmap()) data['availability'] = self.radioAvailability.checkedId() return data def setup_model(self): db = Db_Instance("edit_book").get_instance() if not db.open(): self.log.error(db.lastError().text()) message = unicode("Erro de conexão\n\n""Banco de dados indisponível".decode('utf-8')) QMessageBox.critical(self, unicode("Seareiros - Edição de Livro".decode('utf-8')), message) else: # book self._model = QSqlRelationalTableModel(self, db=db) self._model.setTable("book") self._model.setFilter("id = " + str(self._record_id)) # self._model.setRelation(self.column["author"], QSqlRelation("author", "id", "name")) # self._model.setRelation(self.column["s_author"], QSqlRelation("s_author", "id", "name")) # self._model.setRelation(self.column["publisher"], QSqlRelation("publisher", "id", "name")) self._model.select() self._record = self._model.record(0) # models for setting up qcompleters: # book_in_subject self._book_in_subj_model = QSqlTableModel(self, db=db) self._book_in_subj_model.setTable("book_in_subject") # subject self._subject_model = QSqlTableModel(self, db=db) self._subject_model.setTable("subject") self._subject_model.select() # author self._author_model = QSqlTableModel(self, db=db) self._author_model.setTable("author") self._author_model.select() # s_author self._s_author_model = QSqlTableModel(self, db=db) self._s_author_model.setTable("s_author") self._s_author_model.select() # publisher self._publisher_model = QSqlTableModel(self, db=db) self._publisher_model.setTable("publisher") self._publisher_model.select() # retrieving current subjects, should probably place this elsewhere but it's related to models self._subject_records = [] sql_statement = """SELECT id, name FROM subject s, book_in_subject b_s WHERE s.id = b_s.subject_id AND b_s.book_id = %s """ % str(self._record_id) read_only_subject_model = QSqlQueryModel() read_only_subject_model.setQuery(sql_statement, db) # checking query validity if not read_only_subject_model.lastError().isValid(): self._subj_records = iterate_model(read_only_subject_model) def update_data(self): data = self.extract_input() # checking fields that aren't inserted yet for val, model in [('author', self._author_model), ('s_author', self._s_author_model), ('publisher', self._publisher_model)]: if isinstance(data[val], unicode): # needs to be inserted model.insertRow(0) model.setData(model.index(0,1), data[val]) data[val] = submit_and_get_id(self, model, self.log) if not data[val]: # won't proceed if this fails return False for key,val in data.items(): self._model.setData(self._model.index(0, self.column[key]), val) if 'image' not in data and self._image_changed: # user cleared the image ok = self._model.setData(self._model.index(0, self.column['image']), None) print ok # try to commit changes if not self._model.submitAll(): self.log.error(self._model.lastError().text()) message = unicode("Erro de transação\n\n""Não foi possível salvar no banco de dados".decode('utf-8')) QMessageBox.critical(self, "Seareiros - Edição de Livro", message) return False else: # updating subjects error = False # added subjects for subj in self._added_subjects: # the list has the format [id, text] for existing subjects or [None, text] otherwise if not subj[0]: # need to insert the subject before associating it with the book self._subject_model.insertRow(0) self._subject_model.setData(self._subject_model.index(0,1), subj[1]) subj[0] = submit_and_get_id(self, self._subject_model, self.log) if not subj[0]: error = True break # have a valid record id for the subject to be associated self._book_in_subj_model.insertRow(0) self._book_in_subj_model.setData(self._book_in_subj_model.index(0,0), self._record_id) self._book_in_subj_model.setData(self._book_in_subj_model.index(0,1), subj[0]) ok = self._book_in_subj_model.submitAll() if not ok: error = True self.log.error(self._book_in_subj_model.setLastError().text()) break # removed subjects for removed_id in self._removed_subjects: self._book_in_subj_model.setFilter("book_id = %s AND subject_id = %s" % (str(self._record_id),str(removed_id))) self._book_in_subj_model.select() self._book_in_subj_model.removeRow(0) if self._book_in_subj_model.lastError().isValid(): error = True self.log.error(self._book_in_subj_model.lastError().text()) break if not error: message = unicode("Sucesso!\n\n""O livro foi atualizado com êxito no banco de dados".decode('utf-8')) QMessageBox.information(self, unicode("Seareiros - Edição de Livro".decode('utf-8')), message) else: message = unicode("Erro\n\n""Associado alterado, " "porém ocorreu um problema ao salvar suas atividades".decode('utf-8')) QMessageBox.warning(self, unicode("Seareiros - Edição de Livro".decode('utf-8')), message) # if I don't set this flag here it'll trigger a warning for altering data on the form self._dirty = False return True def _get_id_from_name(self, table, name): db = Db_Instance(table + "_fetch_" + name + "_id").get_instance() if not db.open(): return None else: query = QSqlQuery(db) query.prepare("SELECT id FROM %s WHERE name = :name" % table) query.bindValue(":name", name) query.exec_() if query.next(): return query.record().value("id") else: return None def _get_name_from_id(self, table, id): db = Db_Instance(table + "_fetch_" + str(id) + "_name").get_instance() if not db.open(): return None else: query = QSqlQuery(db) query.prepare("SELECT name FROM %s WHERE id = :id" % table) query.bindValue(":name", id) query.exec_() if query.next(): return query.record().value("name") else: return None @QtCore.Slot() def on_btnAddSubject_clicked(self): txt = self.edSubject.text() if txt != '': id = self._get_id_from_name('subject', self.edSubject.text()) if id: # known register data = [id, txt] else: # new data data = [None, txt] not_a_duplicate = self.add_subject(data) if not_a_duplicate: self.refresh_tableSubjects() self.edSubject.clear() self.edSubject.setFocus() @QtCore.Slot() def on_btnCleanSubjects_clicked(self): self.clear_table() self.edSubject.setFocus() def clear_table(self): # can't directly change activity_list here itens = [i for i in self._subject_list] for item in itens: self.remove_subject(item) self._added_subjects[:] = [] def add_subject(self, data): """ adds a subject to the list except for duplicates """ if data in self._subject_list: return False else: if self.is_in_del_queue(data[0]): self._removed_subjects.remove(data[0]) else: self._added_subjects.append(data) self._subject_list.append(data) # sorts by name self._subject_list.sort(key=operator.itemgetter(1)) return True def refresh_tableSubjects(self): if len(self._subject_list) > 0: self.tableSubjects.setColumnCount(len(self._subject_list[0])+1) col_labels = ["", "Nome", ""] self.tableSubjects.setHorizontalHeaderLabels(col_labels) self.tableSubjects.setColumnHidden(0, True) else: self.tableSubjects.setColumnCount(0) self.tableSubjects.setRowCount(len(self._subject_list)) for i, row in enumerate(self._subject_list): for j, col in enumerate(row): item = QTableWidgetItem(col) self.tableSubjects.setItem(i, j, item) # icon to remove rows individually remove_icon = QIcon(":icons/conn_failed.png") remove_btn = QPushButton(remove_icon, "") remove_btn.clicked.connect(partial(self.remove_subject, subject=row)) self.tableSubjects.setCellWidget(i, len(row), remove_btn) self.tableSubjects.resizeColumnsToContents() self.tableSubjects.horizontalHeader().setResizeMode(1, QHeaderView.Stretch) def is_in_del_queue(self, id): return id in self._removed_subjects def is_in_add_queue(self, data): return data in self._added_subjects def remove_subject(self, subject): # remove a row based on its value self._subject_list.remove(subject) if self.is_in_add_queue(subject): # unqueue previously added activity self._added_subjects.remove(subject) else: id = subject[0] if id: self._removed_subjects.append(id) self.refresh_tableSubjects() def _get_cfield_value(self, c_field, text): if text == '': return None id = self._get_id_from_name(c_field, text) if id: return id else: return text
class MTTFilterFileDialog(QDialog): def __init__(self, define_path='', define_type=None): super(MTTFilterFileDialog, self).__init__(get_maya_window()) self.supported_node_type = sorted( [node_type for (node_type, nice, attr) in MTTSettings.SUPPORTED_TYPE]) self.defined_path = ( define_path if os.path.isdir(define_path) or define_path == SOURCEIMAGES_TAG else None) self.defined_type = ( define_type if define_type in self.supported_node_type else None) self.path_edit = None self.filter_reset_btn = None self.filter_line = None self.parent_folder_btn = None self.files_model = None self.files_list = None self.bookmark_list = None self.bookmark_list_sel_model = None self.types = None # move window to cursor position win_geo = MTTSettings.value( 'FilterFileDialog/windowGeometry', QRect(0, 0, 400, 300)) self.setGeometry(win_geo) mouse_pos = QCursor.pos() mouse_pos.setX(mouse_pos.x() - (win_geo.width() * 0.5)) self.move(mouse_pos) self.__create_ui() self.filter_line.setFocus() self.on_change_root_path(self.defined_path or SOURCEIMAGES_TAG) def __create_ui(self): """ Create main UI """ self.setWindowTitle(CREATE_NODE_TITLE) # remove window decoration if path and type is set if self.defined_path and self.defined_type: self.setWindowFlags(Qt.FramelessWindowHint | Qt.Popup) main_layout = QVBoxLayout(self) main_layout.setSpacing(1) main_layout.setContentsMargins(2, 2, 2, 2) # content layout content_layout = QVBoxLayout() self.files_model = QFileSystemModel() self.files_model.setNameFilterDisables(False) self.files_list = MTTFileList() self.files_list.setAlternatingRowColors(True) self.files_list.setSelectionMode(QAbstractItemView.ExtendedSelection) self.files_list.selectionValidated.connect(self.do_validate_selection) self.files_list.goToParentDirectory.connect(self.on_go_up_parent) self.files_list.doubleClicked.connect(self.on_double_click) self.files_list.setModel(self.files_model) buttons_layout = QHBoxLayout() content_layout.addLayout(self.__create_filter_ui()) content_layout.addWidget(self.files_list) content_layout.addLayout(buttons_layout) self.files_list.filter_line = self.filter_line if not self.defined_path: # path line path_layout = QHBoxLayout() # bookmark button bookmark_btn = QPushButton('') bookmark_btn.setFlat(True) bookmark_btn.setIcon(QIcon(':/addBookmark.png')) bookmark_btn.setToolTip('Bookmark this Folder') bookmark_btn.setStatusTip('Bookmark this Folder') bookmark_btn.clicked.connect(self.on_add_bookmark) # path line edit self.path_edit = QLineEdit() self.path_edit.editingFinished.connect(self.on_enter_path) # parent folder button self.parent_folder_btn = QPushButton('') self.parent_folder_btn.setFlat(True) self.parent_folder_btn.setIcon(QIcon(':/SP_FileDialogToParent.png')) self.parent_folder_btn.setToolTip('Parent Directory') self.parent_folder_btn.setStatusTip('Parent Directory') self.parent_folder_btn.clicked.connect(self.on_go_up_parent) # browse button browse_btn = QPushButton('') browse_btn.setFlat(True) browse_btn.setIcon(QIcon(':/navButtonBrowse.png')) browse_btn.setToolTip('Browse Directory') browse_btn.setStatusTip('Browse Directory') browse_btn.clicked.connect(self.on_browse) # parent widget and layout path_layout.addWidget(bookmark_btn) path_layout.addWidget(self.path_edit) path_layout.addWidget(self.parent_folder_btn) path_layout.addWidget(browse_btn) main_layout.addLayout(path_layout) # bookmark list bookmark_parent_layout = QHBoxLayout() bookmark_frame = QFrame() bookmark_frame.setFixedWidth(120) bookmark_layout = QVBoxLayout() bookmark_layout.setSpacing(1) bookmark_layout.setContentsMargins(2, 2, 2, 2) bookmark_frame.setLayout(bookmark_layout) bookmark_frame.setFrameStyle(QFrame.Sunken) bookmark_frame.setFrameShape(QFrame.StyledPanel) self.bookmark_list = MTTBookmarkList() self.bookmark_list.bookmarkDeleted.connect(self.do_delete_bookmark) self.bookmark_list.setAlternatingRowColors(True) self.bookmark_list.dragEnabled() self.bookmark_list.setAcceptDrops(True) self.bookmark_list.setDropIndicatorShown(True) self.bookmark_list.setDragDropMode(QListView.InternalMove) self.bookmark_list_sel_model = self.bookmark_list.selectionModel() self.bookmark_list_sel_model.selectionChanged.connect( self.on_select_bookmark) bookmark_layout.addWidget(self.bookmark_list) bookmark_parent_layout.addWidget(bookmark_frame) bookmark_parent_layout.addLayout(content_layout) main_layout.addLayout(bookmark_parent_layout) self.do_populate_bookmarks() else: main_layout.addLayout(content_layout) if not self.defined_type: # type layout self.types = QComboBox() self.types.addItems(self.supported_node_type) self.types.currentIndexChanged.connect(self.on_node_type_changed) if cmds.optionVar(exists='MTT_lastNodeType'): last = cmds.optionVar(query='MTT_lastNodeType') if last in self.supported_node_type: self.types.setCurrentIndex( self.supported_node_type.index(last)) buttons_layout.addWidget(self.types) if not self.defined_path or not self.defined_type: create_btn = QPushButton('C&reate') create_btn.clicked.connect(self.accept) cancel_btn = QPushButton('&Cancel') cancel_btn.clicked.connect(self.reject) buttons_layout.addStretch() buttons_layout.addWidget(create_btn) buttons_layout.addWidget(cancel_btn) def __create_filter_ui(self): """ Create filter widgets """ filter_layout = QHBoxLayout() filter_layout.setSpacing(1) filter_layout.setContentsMargins(0, 0, 0, 0) self.filter_reset_btn = QPushButton() icon = QIcon(':/filtersOff.png') self.filter_reset_btn.setIcon(icon) self.filter_reset_btn.setIconSize(QSize(22, 22)) self.filter_reset_btn.setFixedSize(24, 24) self.filter_reset_btn.setToolTip('Reset filter') self.filter_reset_btn.setFlat(True) self.filter_reset_btn.clicked.connect( partial(self.on_filter_set_text, '')) self.filter_line = QLineEdit() self.filter_line.setPlaceholderText('Enter filter string here') self.filter_line.textChanged.connect(self.on_filter_change_text) completer = QCompleter(self) completer.setCaseSensitivity(Qt.CaseInsensitive) completer.setModel(QStringListModel([], self)) self.filter_line.setCompleter(completer) filter_layout.addWidget(self.filter_reset_btn) filter_layout.addWidget(self.filter_line) return filter_layout def on_filter_set_text(self, text=''): """ Set text in filter field """ self.filter_line.setText(text) def on_filter_change_text(self, text): """ Apply filter string """ if len(text): icon = QIcon(':/filtersOn.png') self.filter_reset_btn.setIcon(icon) else: icon = QIcon(':/filtersOff.png') self.filter_reset_btn.setIcon(icon) self.files_model.setNameFilters( ['*%s*' % item.strip() for item in text.split(',') if item.strip()]) def on_node_type_changed(self, index): cmds.optionVar(sv=['MTT_lastNodeType', self.supported_node_type[index]]) def on_double_click(self, index): current_item = self.files_model.filePath(index) if os.path.isdir(current_item): self.on_change_root_path(current_item) elif os.path.isfile(current_item): self.accept() def on_change_root_path(self, current_path): if current_path == SOURCEIMAGES_TAG: current_path = os.path.join( cmds.workspace(query=True, rootDirectory=True), cmds.workspace(fileRuleEntry='sourceImages') ) self.files_model.setRootPath(current_path) self.files_list.setRootIndex(self.files_model.index(current_path)) if self.path_edit: self.path_edit.setText(current_path) if self.parent_folder_btn: current_dir = QDir(current_path) self.parent_folder_btn.setEnabled(current_dir.cdUp()) def on_go_up_parent(self): current_path = QDir(self.files_model.rootPath()) current_path.cdUp() self.on_change_root_path(current_path.absolutePath()) def on_enter_path(self): new_path = self.path_edit.text() if os.path.isdir(new_path): self.on_change_root_path(new_path) else: self.path_edit.setText(self.files_model.rootPath()) def on_browse(self): current_path = self.files_model.rootPath() file_dialog = QFileDialog(self, 'Select a Folder', current_path) file_dialog.setFileMode(QFileDialog.Directory) file_dialog.setOption(QFileDialog.ShowDirsOnly) if file_dialog.exec_(): self.on_change_root_path(file_dialog.selectedFiles()[0]) def on_select_bookmark(self, selected, deselected): current_item = selected.indexes() if current_item: self.on_change_root_path( self.bookmark_list.selectedItems()[0].root_path) def on_add_bookmark(self): current_path = self.files_model.rootPath() self.on_add_bookmark_item( '%s|%s' % (os.path.basename(current_path), current_path)) def on_add_bookmark_item(self, item): if item == '': return current_item = MTTBookmarkItem() current_item.add_raw_data(item) current_item.setSizeHint(QSize(40, 25)) current_item.setFlags( Qt.ItemIsEnabled | Qt.ItemIsEditable | Qt.ItemIsSelectable | Qt.ItemIsDragEnabled ) self.bookmark_list.addItem(current_item) def do_delete_bookmark(self): current_item = self.bookmark_list.selectedItems() if current_item: item_row = self.bookmark_list.row(current_item[0]) self.bookmark_list.takeItem(item_row) del current_item[0] def do_save_bookmark(self): if not self.bookmark_list: return row_count = self.bookmark_list.count() ordered_list = list() for i in range(row_count): item = self.bookmark_list.item(i) name = item.text().replace(',', '_').replace('|', '_') path = item.root_path if name != 'sourceimages': ordered_list.append('%s|%s' % (name, path)) MTTSettings.set_value( 'FilterFileDialog/bookmarks', ','.join(ordered_list)) def do_populate_bookmarks(self): bookmarks = ['sourceimages|%s' % SOURCEIMAGES_TAG] bookmarks.extend( MTTSettings.value('FilterFileDialog/bookmarks').split(',')) for bm in bookmarks: self.on_add_bookmark_item(bm) def do_validate_selection(self): selection = self.files_list.selectedIndexes() if len(selection) == 1: current_path = self.files_model.filePath(selection[0]) if os.path.isdir(current_path): self.on_change_root_path(current_path) return self.accept() def get_selected_files(self): selected_items = list() for item_index in self.files_list.selectedIndexes(): current_path = self.files_model.filePath(item_index) if os.path.isfile(current_path): selected_items.append(current_path) return selected_items def get_node_type(self): return self.types.currentText() if self.types else self.defined_type def closeEvent(self, event): MTTSettings.set_value( 'FilterFileDialog/windowGeometry', self.geometry()) self.do_save_bookmark() self.deleteLater() event.accept()
class BookAddForm(QScrollArea, Ui_BookForm): """ Interface for book input """ column = { "barcode": 1, "title": 2, "author": 3, "s_author": 4, "publisher": 5, "year": 6, "price": 7, "description": 8, "stock": 9, "image": 10, "availability": 11, } IMG_SIZE = (150, 150) def __init__(self, parent=None): super(BookAddForm, self).__init__(parent) self.setupUi(self) # had to subclass this spinbox to support return grabbing self.edYear = ReturnKeySpinBox(self) self.edYearHolder.addWidget(self.edYear) # configuring id's for radio group self.radioAvailability.setId(self.rdSell, 0) self.radioAvailability.setId(self.rdRent, 1) self.radioAvailability.setId(self.rdInactive, 2) self._access = statics.access_level # for currency formatting self._locale = QLocale() # had to hardcode these, wouldn't work otherwise: self.contentsLayout.setAlignment(self.groupBox, QtCore.Qt.AlignTop) self.contentsLayout.setAlignment(self.groupBox_2, QtCore.Qt.AlignTop) self.log = logging.getLogger("BookForm") self.setup_model() self.setup_fields() self._subject_list = [] # flag to indicate whether there were changes to the fields self._dirty = False # for use in selection docks, indicates a saved record self._book_id = None # user did input an image self._image_set = False # overlaying a clean button over the image (couldn't do it in designer) self.btnCleanImage = QPushButton() self.btnCleanImage.setIcon(QIcon(":icons/clean.png")) self.btnCleanImage.setFixedWidth(35) self.btnCleanImage.clicked.connect(self.clear_image) self.btnCleanImage.setVisible(False) clean_img_layout = QVBoxLayout(self.edImage) clean_img_layout.addWidget(self.btnCleanImage) clean_img_layout.setAlignment(Qt.AlignTop | Qt.AlignLeft) clean_img_layout.setContentsMargins(2, 2, 0, 0) def is_dirty(self): return self._dirty def setup_model(self): db = Db_Instance("form_book").get_instance() if not db.open(): self.log.error(db.lastError().text()) message = unicode("Erro de conexão\n\n" "Banco de dados indisponível".decode("utf-8")) QMessageBox.critical(self, "Seareiros - Cadastro de Livro", message) else: # book self._model = QSqlTableModel(self, db=db) self._model.setTable("book") # subject self._subject_model = QSqlTableModel(self, db=db) self._subject_model.setTable("subject") self._subject_model.select() # author self._author_model = QSqlTableModel(self, db=db) self._author_model.setTable("author") self._author_model.select() # sauthor self._s_author_model = QSqlTableModel(self, db=db) self._s_author_model.setTable("s_author") self._s_author_model.select() # publisher self._publisher_model = QSqlTableModel(self, db=db) self._publisher_model.setTable("publisher") self._publisher_model.select() # book subjects self._book_in_subj_model = QSqlTableModel(self, db=db) self._book_in_subj_model.setTable("book_in_subject") def setup_fields(self): """ setting up validators and stuff """ # validators # forcing uppercasing on these fields self.edTitle.setValidator(UppercaseValidator()) self.edAuthor.setValidator(UppercaseValidator()) self.edSAuthor.setValidator(UppercaseValidator()) self.edPublisher.setValidator(UppercaseValidator()) self.edPrice.setValidator(CurrencyValidator(self.edPrice)) self.edBarcode.setValidator(NumericValidator()) self.edYear.setMinimum(1900) self.edYear.setMaximum(date.today().year) self.edYear.setValue(date.today().year) # fixing tab order self.setTabOrder(self.edPublisher, self.edYear) self.setTabOrder(self.edYear, self.edPrice) # connecting return key to tab lineEditList = self.findChildren(QLineEdit) for lineEdit in lineEditList: # had some problem with C++ originated objects if lineEdit.objectName() not in ["qt_spinbox_lineedit", "edSubject"]: lineEdit.returnPressed.connect(lineEdit.focusNextChild) # detect changes on line edits lineEdit.textChanged.connect(self.check_changes) # different behaviour for these self.edBarcode.textChanged.connect(self.check_barcode) self.edSubject.returnPressed.connect(self.on_btnAddSubject_clicked) # completers config_completer(self.edSubject, self._subject_model, "name") config_completer(self.edAuthor, self._author_model, "name") config_completer(self.edSAuthor, self._s_author_model, "name") config_completer(self.edPublisher, self._publisher_model, "name") # making image clickable clickable(self.edImage).connect(self.handle_image) def clear_image(self): img = QImage(":icons/no_image.png") self.set_image(img) self._image_set = False self.btnCleanImage.setVisible(False) def handle_image(self): image_path = QFileDialog.getOpenFileName( self, "Escolha uma imagem", os.getenv("HOME"), "Imagens (*.png, *.jpg *.bmp)" )[0] if os.path.exists(image_path): self.set_image(QImage(image_path)) self._image_set = True self.btnCleanImage.setVisible(True) def set_image(self, img): pix = QPixmap.fromImage(img) pix = pix.scaled(self.IMG_SIZE[0], self.IMG_SIZE[1], Qt.KeepAspectRatio) self.edImage.setPixmap(pix) self.edImage.setScaledContents(True) def check_changes(self, txt): if txt != "": self._dirty = True def check_barcode(self, txt): if len(txt) == self.edBarcode.maxLength(): self.edBarcode.focusNextChild() def _get_id_from_name(self, table, name): db = Db_Instance(table + "_fetch_" + name + "_id").get_instance() if not db.open(): return None else: query = QSqlQuery(db) query.prepare("SELECT id FROM %s WHERE name = :name" % table) query.bindValue(":name", name) query.exec_() if query.next(): return query.record().value("id") else: return None def submit_data(self): data = self.extract_input() # checking fields that aren't inserted yet for val, model in [ ("author", self._author_model), ("s_author", self._s_author_model), ("publisher", self._publisher_model), ]: if isinstance(data[val], unicode): # needs to be inserted model.insertRow(0) model.setData(model.index(0, 1), data[val]) data[val] = submit_and_get_id(self, model, self.log) if not data[val]: # won't proceed if this fails return False # filling a book row self._model.insertRow(0) for key, val in data.items(): self._model.setData(self._model.index(0, self.column[key]), val) book_id = submit_and_get_id(self, self._model, self.log) if book_id: # for use in selection docks self.setBookId(book_id) # book sucessfully added, now associating related subjects subjects, new_subjects = self.extract_subjects_input() for subj in new_subjects: self._subject_model.insertRow(0) self._subject_model.setData(self._subject_model.index(0, 1), subj) id = submit_and_get_id(self, self._subject_model, self.log) if not id: # issue saving new subject return False subjects.append(int(id)) # associating book and it's subjects error = False for subj_id in subjects: self._book_in_subj_model.insertRow(0) self._book_in_subj_model.setData(self._book_in_subj_model.index(0, 0), book_id) self._book_in_subj_model.setData(self._book_in_subj_model.index(0, 1), subj_id) ok = self._book_in_subj_model.submitAll() if not ok: error = True break if error: self.log.error(self._book_in_subj_model.lastError.text()) message = unicode( "Erro\n\n" "Livro cadastrado, porém ocorreu um problema ao" " salvar os temas a que está associado".decode("utf-8") ) QMessageBox.warning(self, "Seareiros - Cadastro de Livro", message) return False else: message = unicode("Sucesso!\n\n" "O livro foi salvo com êxito no banco de dados".decode("utf-8")) QMessageBox.information(self, "Seareiros - Cadastro de Livro", message) return True # failed to insert a row return False def setBookId(self, id): self._book_id = id def get_added_record(self): db = Db_Instance("added_book_record").get_instance() if db.open() and self._book_id: query = QSqlQuery(db) query.prepare("SELECT * FROM book WHERE id = :id") query.bindValue(":id", self._book_id) query.exec_() if query.next(): return query.record() else: return None else: return None def clear(self): self._dirty = False lineEditList = self.findChildren(QLineEdit) for lineEdit in lineEditList: lineEdit.clear() self.clear_table() self.clear_image() self.edBarcode.setFocus() @QtCore.Slot() def on_btnAddSubject_clicked(self): txt = self.edSubject.text() if txt != "": id = self._get_id_from_name("subject", self.edSubject.text()) if id: # known register data = [id, txt] else: # new data data = [None, txt] not_a_duplicate = self.add_subject(data) if not_a_duplicate: self.refresh_tableSubjects() self.edSubject.clear() self.edSubject.setFocus() @QtCore.Slot() def on_btnCleanSubjects_clicked(self): self.clear_table() self.edSubject.setFocus() def clear_table(self): self._subject_list = [] self.tableSubjects.clear() self.refresh_tableSubjects() def add_subject(self, data): """ adds a subject to the list except for duplicates """ if data in self._subject_list: return False else: self._subject_list.append(data) # sorts by name self._subject_list.sort(key=operator.itemgetter(1)) return True def refresh_tableSubjects(self): if len(self._subject_list) > 0: self.tableSubjects.setColumnCount(len(self._subject_list[0]) + 1) col_labels = ["", "Nome", ""] self.tableSubjects.setHorizontalHeaderLabels(col_labels) self.tableSubjects.setColumnHidden(0, True) else: self.tableSubjects.setColumnCount(0) self.tableSubjects.setRowCount(len(self._subject_list)) for i, row in enumerate(self._subject_list): for j, col in enumerate(row): item = QTableWidgetItem(col) self.tableSubjects.setItem(i, j, item) # icon to remove rows individually remove_icon = QIcon(":icons/conn_failed.png") remove_btn = QPushButton(remove_icon, "") remove_btn.clicked.connect(partial(self.remove_subject, subject=row)) self.tableSubjects.setCellWidget(i, len(row), remove_btn) self.tableSubjects.resizeColumnsToContents() self.tableSubjects.horizontalHeader().setResizeMode(1, QHeaderView.Stretch) def remove_subject(self, subject): # remove a row based on its value self._subject_list.remove(subject) self.refresh_tableSubjects() def extract_input(self): data = {} data["barcode"] = self.edBarcode.text() data["title"] = self.edTitle.text() # completer fields for c_field, line_edit in [ ("author", self.edAuthor), ("s_author", self.edSAuthor), ("publisher", self.edPublisher), ]: data[c_field] = self._get_cfield_value(c_field, line_edit.text()) data["year"] = self.edYear.value() data["price"] = self._locale.toDouble(self.edPrice.text())[0] data["description"] = self.edDescription.toPlainText() if self._image_set: data["image"] = qpixmap_to_qbytearray(self.edImage.pixmap()) data["availability"] = self.radioAvailability.checkedId() return data def _get_cfield_value(self, c_field, text): if text == "": return None id = self._get_id_from_name(c_field, text) if id: return id else: return text def extract_subjects_input(self): # grab id of selected activities subjects = [] new_subjects = [] for subj in self._subject_list: if subj[0]: # selected from previously added subjects subjects.append(subj[0]) else: # new subject new_subjects.append(subj[1]) return (subjects, new_subjects)