class PopupCompleter(QFrame): def __init__(self): QFrame.__init__(self, None, Qt.FramelessWindowHint | Qt.ToolTip) vbox = QVBoxLayout(self) vbox.setContentsMargins(0, 0, 0, 0) vbox.setSpacing(0) self.listWidget = QListWidget() self.listWidget.setMinimumHeight(350) vbox.addWidget(self.listWidget) self.listWidget.currentItemChanged.connect(self._repaint_items) def _repaint_items(self, current, previous): if current is not None: widget = self.listWidget.itemWidget(current) if widget is not None: widget.set_selected() if previous is not None: widget = self.listWidget.itemWidget(previous) if widget is not None: widget.set_not_selected() def reload(self, model): """Reload the data of the Popup Completer, and restart the state.""" self.listWidget.clear() self.add_help() for item in model: self.listWidget.addItem(item[0]) self.listWidget.setItemWidget(item[0], item[1]) self.listWidget.setCurrentRow(8) def clear(self): """Remove all the items of the list (deleted), and reload the help.""" self.listWidget.clear() def refresh(self, model, has_text=True): """Refresh the list when the user search for some word.""" self.listWidget.clear() if not has_text: self.add_help() for item in model: self.listWidget.addItem(item[0]) self.listWidget.setItemWidget(item[0], item[1]) if model: self.listWidget.setCurrentItem(model[0][0]) else: self.add_no_found() def fetch_more(self, model): """Add more items to the list on user scroll.""" for item in model: self.listWidget.addItem(item[0]) self.listWidget.setItemWidget(item[0], item[1]) def add_no_found(self): """Load no results found message""" noFoundItem = self._create_help_item(resources.IMAGES['delete'], translations.TR_NO_RESULTS) self.listWidget.addItem(noFoundItem) def add_help(self): #Load help fileItem = self._create_help_item(resources.IMAGES['locate-file'], translations.TR_ONLY_FILES) self.listWidget.addItem(fileItem) classItem = self._create_help_item(resources.IMAGES['locate-class'], translations.TR_ONLY_CLASSES) self.listWidget.addItem(classItem) methodItem = self._create_help_item( resources.IMAGES['locate-function'], translations.TR_ONLY_METHODS) self.listWidget.addItem(methodItem) attributeItem = self._create_help_item( resources.IMAGES['locate-attributes'], translations.TR_ONLY_ATRIBUTES) self.listWidget.addItem(attributeItem) thisFileItem = self._create_help_item( resources.IMAGES['locate-on-this-file'], translations.TR_ONLY_CLASSES_METHODS) self.listWidget.addItem(thisFileItem) tabsItem = self._create_help_item(resources.IMAGES['locate-tab'], translations.TR_ONLY_CURRENT_TABS) self.listWidget.addItem(tabsItem) lineItem = self._create_help_item(resources.IMAGES['locate-line'], translations.TR_GO_TO_LINE) self.listWidget.addItem(lineItem) nonPythonItem = self._create_help_item( resources.IMAGES['locate-nonpython'], translations.TR_ONLY_NON_PYTHON) self.listWidget.addItem(nonPythonItem) def _create_help_item(self, image, text): Item = QListWidgetItem(QIcon(image), text) font = Item.font() font.setBold(True) Item.setSizeHint(QSize(20, 30)) Item.setBackground(QBrush(Qt.lightGray)) Item.setForeground(QBrush(Qt.black)) Item.setFont(font) return Item
class PopupCompleter(QFrame): def __init__(self): QFrame.__init__(self, None, Qt.FramelessWindowHint | Qt.ToolTip) vbox = QVBoxLayout(self) vbox.setContentsMargins(0, 0, 0, 0) vbox.setSpacing(0) self.listWidget = QListWidget() self.listWidget.setMinimumHeight(350) vbox.addWidget(self.listWidget) self.listWidget.currentItemChanged.connect(self._repaint_items) def _repaint_items(self, current, previous): if current is not None: widget = self.listWidget.itemWidget(current) if widget is not None: widget.set_selected() if previous is not None: widget = self.listWidget.itemWidget(previous) if widget is not None: widget.set_not_selected() def reload(self, model): """Reload the data of the Popup Completer, and restart the state.""" self.listWidget.clear() self.add_help() for item in model: self.listWidget.addItem(item[0]) self.listWidget.setItemWidget(item[0], item[1]) self.listWidget.setCurrentRow(8) def clear(self): """Remove all the items of the list (deleted), and reload the help.""" self.listWidget.clear() def refresh(self, model, has_text=True): """Refresh the list when the user search for some word.""" self.listWidget.clear() if not has_text: self.add_help() for item in model: self.listWidget.addItem(item[0]) self.listWidget.setItemWidget(item[0], item[1]) if model: self.listWidget.setCurrentItem(model[0][0]) def fetch_more(self, model): """Add more items to the list on user scroll.""" for item in model: self.listWidget.addItem(item[0]) self.listWidget.setItemWidget(item[0], item[1]) def add_help(self): #Load help fileItem = QListWidgetItem(QIcon(resources.IMAGES['locate-file']), '@\t(Filter only by Files)') font = fileItem.font() font.setBold(True) fileItem.setSizeHint(QSize(20, 30)) fileItem.setBackground(QBrush(Qt.lightGray)) fileItem.setForeground(QBrush(Qt.black)) fileItem.setFont(font) self.listWidget.addItem(fileItem) classItem = QListWidgetItem(QIcon(resources.IMAGES['locate-class']), '<\t(Filter only by Classes)') self.listWidget.addItem(classItem) classItem.setSizeHint(QSize(20, 30)) classItem.setBackground(QBrush(Qt.lightGray)) classItem.setForeground(QBrush(Qt.black)) classItem.setFont(font) methodItem = QListWidgetItem( QIcon(resources.IMAGES['locate-function']), '>\t(Filter only by Methods)') self.listWidget.addItem(methodItem) methodItem.setSizeHint(QSize(20, 30)) methodItem.setBackground(QBrush(Qt.lightGray)) methodItem.setForeground(QBrush(Qt.black)) methodItem.setFont(font) attributeItem = QListWidgetItem( QIcon(resources.IMAGES['locate-attributes']), '-\t(Filter only by Attributes)') self.listWidget.addItem(attributeItem) attributeItem.setSizeHint(QSize(20, 30)) attributeItem.setBackground(QBrush(Qt.lightGray)) attributeItem.setForeground(QBrush(Qt.black)) attributeItem.setFont(font) thisFileItem = QListWidgetItem( QIcon(resources.IMAGES['locate-on-this-file']), '.\t(Filter only by Classes and Methods in this File)') font = thisFileItem.font() font.setBold(True) thisFileItem.setSizeHint(QSize(20, 30)) thisFileItem.setBackground(QBrush(Qt.lightGray)) thisFileItem.setForeground(QBrush(Qt.black)) thisFileItem.setFont(font) self.listWidget.addItem(thisFileItem) tabsItem = QListWidgetItem(QIcon(resources.IMAGES['locate-tab']), '/\t(Filter only by the current Tabs)') font = tabsItem.font() font.setBold(True) tabsItem.setSizeHint(QSize(20, 30)) tabsItem.setBackground(QBrush(Qt.lightGray)) tabsItem.setForeground(QBrush(Qt.black)) tabsItem.setFont(font) self.listWidget.addItem(tabsItem) lineItem = QListWidgetItem(QIcon(resources.IMAGES['locate-line']), ':\t(Go to Line)') font = lineItem.font() font.setBold(True) lineItem.setSizeHint(QSize(20, 30)) lineItem.setBackground(QBrush(Qt.lightGray)) lineItem.setForeground(QBrush(Qt.black)) lineItem.setFont(font) self.listWidget.addItem(lineItem) nonPythonItem = QListWidgetItem( QIcon(resources.IMAGES['locate-nonpython']), '!\t(Filter only by Non Python Files)') self.listWidget.addItem(nonPythonItem) nonPythonItem.setSizeHint(QSize(20, 30)) nonPythonItem.setBackground(QBrush(Qt.lightGray)) nonPythonItem.setForeground(QBrush(Qt.black)) nonPythonItem.setFont(font)
class PopupCompleter(QFrame): def __init__(self): QFrame.__init__(self, None, Qt.FramelessWindowHint | Qt.ToolTip) vbox = QVBoxLayout(self) vbox.setContentsMargins(0, 0, 0, 0) vbox.setSpacing(0) self.listWidget = QListWidget() self.listWidget.setMinimumHeight(350) vbox.addWidget(self.listWidget) self.listWidget.currentItemChanged.connect(self._repaint_items) def _repaint_items(self, current, previous): if current is not None: widget = self.listWidget.itemWidget(current) if widget is not None: widget.set_selected() if previous is not None: widget = self.listWidget.itemWidget(previous) if widget is not None: widget.set_not_selected() def reload(self, model): """Reload the data of the Popup Completer, and restart the state.""" self.listWidget.clear() self.add_help() for item in model: self.listWidget.addItem(item[0]) self.listWidget.setItemWidget(item[0], item[1]) self.listWidget.setCurrentRow(8) def clear(self): """Remove all the items of the list (deleted), and reload the help.""" self.listWidget.clear() def refresh(self, model, has_text=True): """Refresh the list when the user search for some word.""" self.listWidget.clear() if not has_text: self.add_help() for item in model: self.listWidget.addItem(item[0]) self.listWidget.setItemWidget(item[0], item[1]) if model: self.listWidget.setCurrentItem(model[0][0]) def fetch_more(self, model): """Add more items to the list on user scroll.""" for item in model: self.listWidget.addItem(item[0]) self.listWidget.setItemWidget(item[0], item[1]) def add_help(self): #Load help fileItem = QListWidgetItem( QIcon(resources.IMAGES['locate-file']), '@\t(Filter only by Files)') font = fileItem.font() font.setBold(True) fileItem.setSizeHint(QSize(20, 30)) fileItem.setBackground(QBrush(Qt.lightGray)) fileItem.setForeground(QBrush(Qt.black)) fileItem.setFont(font) self.listWidget.addItem(fileItem) classItem = QListWidgetItem( QIcon(resources.IMAGES['locate-class']), '<\t(Filter only by Classes)') self.listWidget.addItem(classItem) classItem.setSizeHint(QSize(20, 30)) classItem.setBackground(QBrush(Qt.lightGray)) classItem.setForeground(QBrush(Qt.black)) classItem.setFont(font) methodItem = QListWidgetItem( QIcon(resources.IMAGES['locate-function']), '>\t(Filter only by Methods)') self.listWidget.addItem(methodItem) methodItem.setSizeHint(QSize(20, 30)) methodItem.setBackground(QBrush(Qt.lightGray)) methodItem.setForeground(QBrush(Qt.black)) methodItem.setFont(font) attributeItem = QListWidgetItem( QIcon(resources.IMAGES['locate-attributes']), '-\t(Filter only by Attributes)') self.listWidget.addItem(attributeItem) attributeItem.setSizeHint(QSize(20, 30)) attributeItem.setBackground(QBrush(Qt.lightGray)) attributeItem.setForeground(QBrush(Qt.black)) attributeItem.setFont(font) thisFileItem = QListWidgetItem( QIcon(resources.IMAGES['locate-on-this-file']), '.\t(Filter only by Classes and Methods in this File)') font = thisFileItem.font() font.setBold(True) thisFileItem.setSizeHint(QSize(20, 30)) thisFileItem.setBackground(QBrush(Qt.lightGray)) thisFileItem.setForeground(QBrush(Qt.black)) thisFileItem.setFont(font) self.listWidget.addItem(thisFileItem) tabsItem = QListWidgetItem( QIcon(resources.IMAGES['locate-tab']), '/\t(Filter only by the current Tabs)') font = tabsItem.font() font.setBold(True) tabsItem.setSizeHint(QSize(20, 30)) tabsItem.setBackground(QBrush(Qt.lightGray)) tabsItem.setForeground(QBrush(Qt.black)) tabsItem.setFont(font) self.listWidget.addItem(tabsItem) lineItem = QListWidgetItem( QIcon(resources.IMAGES['locate-line']), ':\t(Go to Line)') font = lineItem.font() font.setBold(True) lineItem.setSizeHint(QSize(20, 30)) lineItem.setBackground(QBrush(Qt.lightGray)) lineItem.setForeground(QBrush(Qt.black)) lineItem.setFont(font) self.listWidget.addItem(lineItem) nonPythonItem = QListWidgetItem( QIcon(resources.IMAGES['locate-nonpython']), '!\t(Filter only by Non Python Files)') self.listWidget.addItem(nonPythonItem) nonPythonItem.setSizeHint(QSize(20, 30)) nonPythonItem.setBackground(QBrush(Qt.lightGray)) nonPythonItem.setForeground(QBrush(Qt.black)) nonPythonItem.setFont(font)
class GitStatus(QDialog): def __init__(self, plugin, git, path): QDialog.__init__(self) self.git = git self.plugin = plugin self.setWindowTitle('Git status') layout = QGridLayout(self) branches = self.git.branch(unicode(path)) self.s_branches = QListWidget() if len(branches) > 0: self.s_branches.addItems(branches[1:]) self.actual_branch = QLabel("<h2>{0}</h2>".format(branches[0])) else: self.actual_branch = QLabel() branch = QLabel("<h2>Branches</h2>") change_branch = QPushButton("Change to") merge_branches = QPushButton("Merge branch") H = QHBoxLayout() delete_branch = QPushButton("Delete branch") add_branch = QPushButton("Add branch") H.addWidget(add_branch) H.addWidget(delete_branch) self.lists = [] no_staged = QLabel("<h2>No staged</h2>") untracked_files = QLabel("Untracked files") self.untracked_files = QListWidget() self.lists.append(self.untracked_files) modified_files = QLabel("Modified files") self.modified_files = QListWidget() self.lists.append(self.modified_files) deleted_files = QLabel("Deleted files") self.deleted_files = QListWidget() self.lists.append(self.deleted_files) staged = QLabel("<h2>Staged</h2>") added_files = QLabel("Added files") self.added_files = QListWidget() self.lists.append(self.added_files) s_modified_files = QLabel("Modified files") self.s_modified_files = QListWidget() self.lists.append(self.s_modified_files) s_deleted_files = QLabel("Deleted files") self.s_deleted_files = QListWidget() self.lists.append(self.s_deleted_files) layout.addWidget(self.actual_branch, 0, 0, Qt.AlignHCenter) layout.addWidget(change_branch, 1, 0) layout.addWidget(merge_branches, 2, 0) layout.addWidget(no_staged, 3, 0) layout.addWidget(untracked_files, 4, 0) layout.addWidget(self.untracked_files, 5, 0) layout.addWidget(modified_files, 6, 0) layout.addWidget(self.modified_files, 7, 0) layout.addWidget(deleted_files, 8, 0) layout.addWidget(self.deleted_files, 9, 0) layout.addWidget(branch, 0, 1) layout.addWidget(self.s_branches, 1, 1) layout.addLayout(H, 2, 1) layout.addWidget(staged, 3, 1) layout.addWidget(added_files, 4, 1) layout.addWidget(self.added_files, 5, 1) layout.addWidget(s_modified_files, 6, 1) layout.addWidget(self.s_modified_files, 7, 1) layout.addWidget(s_deleted_files, 8, 1) layout.addWidget(self.s_deleted_files, 9, 1) self.fill(self.git.no_staged["?"], self.untracked_files) self.fill(self.git.no_staged["M"], self.modified_files) self.fill(self.git.no_staged["D"], self.deleted_files) self.fill(self.git.staged["A"], self.added_files) self.fill(self.git.staged["M"], self.s_modified_files) self.fill(self.git.staged["D"], self.s_deleted_files) self.staged_b = QPushButton('Stage files', self) self.unstage_b = QPushButton("Unstage files", self) self.commit_b = QPushButton('Commit files', self) self.uncommit_b = QPushButton("Uncommit files", self) layout.addWidget(self.staged_b, 10, 0) layout.addWidget(self.unstage_b, 11, 0) layout.addWidget(self.commit_b, 10, 1) layout.addWidget(self.uncommit_b, 11, 1) self.setLayout(layout) self.connect(self.staged_b, SIGNAL('clicked()'), self.add) self.connect(self.unstage_b, SIGNAL('clicked()'), self.unstage) self.connect(self.commit_b, SIGNAL('clicked()'), self.commit) self.connect(self.uncommit_b, SIGNAL('clicked()'), self.uncommit) self.connect(change_branch, SIGNAL("clicked()"), self.change_branch) self.connect(add_branch, SIGNAL("clicked()"), self.add_branch) self.connect(delete_branch, SIGNAL("clicked()"), self.delete_branch) self.connect(merge_branches, SIGNAL("clicked()"), self.merge_branches) def fill(self, a_list, widget_list): for x in a_list: item = QListWidgetItem() widget_list.addItem(item) check_box = QCheckBox(x) widget_list.setItemWidget(item, check_box) def add(self): path = self.plugin.editor.get_project_owner() for pos in reversed(xrange(self.untracked_files.count())): item = self.untracked_files.item(pos) widget = self.untracked_files.itemWidget(item) text = widget.text() if widget.isChecked(): self.git.add(path, text) self.untracked_files.removeItemWidget(item) self.untracked_files.takeItem(pos) item = QListWidgetItem() self.added_files.addItem(item) check_box = QCheckBox(text) self.added_files.setItemWidget(item, check_box) for pos in reversed(xrange(self.modified_files.count())): item = self.modified_files.item(pos) widget = self.modified_files.itemWidget(item) text = widget.text() if widget.isChecked(): self.git.add(path, widget.text()) self.modified_files.removeItemWidget(item) self.modified_files.takeItem(pos) item = QListWidgetItem() self.s_modified_files.addItem(item) check_box = QCheckBox(text) self.s_modified_files.setItemWidget(item, check_box) for pos in reversed(xrange(self.deleted_files.count())): item = self.deleted_files.item(pos) widget = self.deleted_files.itemWidget(item) text = widget.text() if widget.isChecked(): self.git.add(path, widget.text()) self.deleted_files.removeItemWidget(item) self.deleted_files.takeItem(pos) item = QListWidgetItem() self.s_deleted_files.addItem(item) check_box = QCheckBox(text) self.s_deleted_files.setItemWidget(item, check_box) def unstage(self): path = self.plugin.editor.get_project_owner() for pos in reversed(xrange(self.untracked_files.count())): item = self.untracked_files.item(pos) widget = self.untracked_files.itemWidget(item) if widget.isChecked(): self.git.unstage(path, widget.text()) self.untracked_files.removeItemWidget(item) self.untracked_files.takeItem(pos) for pos in reversed(xrange(self.modified_files.count())): item = self.modified_files.item(pos) widget = self.modified_files.itemWidget(item) if widget.isChecked(): self.git.unstage(path, widget.text()) self.modified_files.removeItemWidget(item) self.modified_files.takeItem(pos) for pos in reversed(xrange(self.deleted_files.count())): item = self.deleted_files.item(pos) widget = self.deleted_files.itemWidget(item) if widget.isChecked(): self.git.unstage(path, widget.text()) self.deleted_files.removeItemWidget(item) self.deleted_files.takeItem(pos) def commit(self): msg = QInputDialog.getText(self, "Commit message", "Commit Message:") if msg[1] == False: return(0) path = self.plugin.editor.get_project_owner() for pos in reversed(xrange(self.added_files.count())): item = self.added_files.item(pos) widget = self.added_files.itemWidget(item) if widget.isChecked(): self.git.commit(path, str(widget.text()), msg[0]) self.added_files.removeItemWidget(item) self.added_files.takeItem(pos) for pos in reversed(xrange(self.s_modified_files.count())): item = self.s_modified_files.item(pos) widget = self.s_modified_files.itemWidget(item) if widget.isChecked(): self.git.commit(path, widget.text(), msg[0]) self.s_modified_files.removeItemWidget(item) self.s_modified_files.takeItem(pos) for pos in reversed(xrange(self.s_deleted_files.count())): item = self.s_deleted_files.item(pos) widget = self.s_deleted_files.itemWidget(item) if widget.isChecked(): self.git.commit(path, widget.text(), msg[0]) self.s_deleted_files.takeItem(pos) self.s_deleted_files.removeItemWidget(item) def uncommit(self): path = self.plugin.editor.get_project_owner() for pos in reversed(xrange(self.added_files.count())): item = self.added_files.item(pos) widget = self.added_files.itemWidget(item) text = widget.text() if widget.isChecked(): self.git.uncommit(path, str(widget.text())) self.added_files.removeItemWidget(item) self.added_files.takeItem(pos) item = QListWidgetItem() self.untracked_files.addItem(item) check_box = QCheckBox(text) self.untracked_files.setItemWidget(item, check_box) for pos in reversed(xrange(self.s_modified_files.count())): item = self.s_modified_files.item(pos) widget = self.s_modified_files.itemWidget(item) text = widget.text() if widget.isChecked(): self.git.uncommit(path, widget.text()) self.s_modified_files.removeItemWidget(item) self.s_modified_files.takeItem(pos) item = QListWidgetItem() self.modified_files.addItem(item) check_box = QCheckBox(text) self.modified_files.setItemWidget(item, check_box) for pos in reversed(xrange(self.s_deleted_files.count())): item = self.s_deleted_files.item(pos) widget = self.s_deleted_files.itemWidget(item) text = widget.text() if widget.isChecked(): self.git.uncommit(path, widget.text()) self.s_deleted_files.removeItemWidget(item) self.s_deleted_files.takeItem(pos) item = QListWidgetItem() self.deleted_files.addItem(item) check_box = QCheckBox(text) self.deleted_files.setItemWidget(item, check_box) def change_branch(self): path = self.plugin.editor.get_project_owner() item = self.s_branches.currentItem() if item and not self.something(): text = item.text() self.git.change_branch(path, text) self.s_branches.clear() self.s_branches.addItems(self.git.branch(unicode(path))[1:]) self.actual_branch.setText("<h2>{0}<h2>".format(text)) if self.something(): v = QMessageBox() v.setText("Error: you have unsaved changes") v.setIcon(v.Warning) v.exec_() def add_branch(self): path = self.plugin.editor.get_project_owner() msg = QInputDialog.getText(self, "New branch", "Branch Name:") if msg[1] == False: return(0) self.git.add_branch(path, msg[0]) self.s_branches.clear() self.s_branches.addItems(self.git.branch(unicode(path))[1:]) def delete_branch(self): path = self.plugin.editor.get_project_owner() item = self.s_branches.currentItem() if item: text = str(item.text()) call = self.git.delete_branch(path, text) if not call: self.s_branches.clear() self.s_branches.addItems(self.git.branch(unicode(path))[1:]) else: m = QMessageBox() m.setText("<h2>" + call + "</h2>") m.setInformativeText("Force deletion?") m.setStandardButtons(QMessageBox.Ok | QMessageBox.Cancel) m.setDefaultButton(QMessageBox.Cancel) c = m.exec_() if c == QMessageBox.Ok: self.git.force_delete_branch(path, text) self.s_branches.clear() self.s_branches.addItems(self.git.branch(unicode(path))[1:]) def merge_branches(self): path = self.plugin.editor.get_project_owner() item = self.s_branches.currentItem() if item: text = str(item.text()) call = self.git.merge_branches(path, text) if call: m = QMessageBox() m.setText(call) m.setInformativeText("Unknown") m.setIcon(m.Critical) m.exec_() def something(self): for x in self.lists: if x.count() > 0: return True return False
class GitStatus(QDialog): def __init__(self, plugin, git, path): QDialog.__init__(self) self.git = git self.plugin = plugin self.setWindowTitle('Git status') layout = QGridLayout(self) branches = self.git.branch(unicode(path)) self.s_branches = QListWidget() if len(branches) > 0: self.s_branches.addItems(branches[1:]) self.actual_branch = QLabel("<h2>{0}</h2>".format(branches[0])) else: self.actual_branch = QLabel() branch = QLabel("<h2>Branches</h2>") change_branch = QPushButton("Change to") merge_branches = QPushButton("Merge branch") H = QHBoxLayout() delete_branch = QPushButton("Delete branch") add_branch = QPushButton("Add branch") H.addWidget(add_branch) H.addWidget(delete_branch) self.lists = [] no_staged = QLabel("<h2>No staged</h2>") untracked_files = QLabel("Untracked files") self.untracked_files = QListWidget() self.lists.append(self.untracked_files) modified_files = QLabel("Modified files") self.modified_files = QListWidget() self.lists.append(self.modified_files) deleted_files = QLabel("Deleted files") self.deleted_files = QListWidget() self.lists.append(self.deleted_files) staged = QLabel("<h2>Staged</h2>") added_files = QLabel("Added files") self.added_files = QListWidget() self.lists.append(self.added_files) s_modified_files = QLabel("Modified files") self.s_modified_files = QListWidget() self.lists.append(self.s_modified_files) s_deleted_files = QLabel("Deleted files") self.s_deleted_files = QListWidget() self.lists.append(self.s_deleted_files) layout.addWidget(self.actual_branch, 0, 0, Qt.AlignHCenter) layout.addWidget(change_branch, 1, 0) layout.addWidget(merge_branches, 2, 0) layout.addWidget(no_staged, 3, 0) layout.addWidget(untracked_files, 4, 0) layout.addWidget(self.untracked_files, 5, 0) layout.addWidget(modified_files, 6, 0) layout.addWidget(self.modified_files, 7, 0) layout.addWidget(deleted_files, 8, 0) layout.addWidget(self.deleted_files, 9, 0) layout.addWidget(branch, 0, 1) layout.addWidget(self.s_branches, 1, 1) layout.addLayout(H, 2, 1) layout.addWidget(staged, 3, 1) layout.addWidget(added_files, 4, 1) layout.addWidget(self.added_files, 5, 1) layout.addWidget(s_modified_files, 6, 1) layout.addWidget(self.s_modified_files, 7, 1) layout.addWidget(s_deleted_files, 8, 1) layout.addWidget(self.s_deleted_files, 9, 1) self.fill(self.git.no_staged["?"], self.untracked_files) self.fill(self.git.no_staged["M"], self.modified_files) self.fill(self.git.no_staged["D"], self.deleted_files) self.fill(self.git.staged["A"], self.added_files) self.fill(self.git.staged["M"], self.s_modified_files) self.fill(self.git.staged["D"], self.s_deleted_files) self.staged_b = QPushButton('Stage files', self) self.unstage_b = QPushButton("Unstage files", self) self.commit_b = QPushButton('Commit files', self) self.uncommit_b = QPushButton("Uncommit files", self) layout.addWidget(self.staged_b, 10, 0) layout.addWidget(self.unstage_b, 11, 0) layout.addWidget(self.commit_b, 10, 1) layout.addWidget(self.uncommit_b, 11, 1) self.setLayout(layout) self.connect(self.staged_b, SIGNAL('clicked()'), self.add) self.connect(self.unstage_b, SIGNAL('clicked()'), self.unstage) self.connect(self.commit_b, SIGNAL('clicked()'), self.commit) self.connect(self.uncommit_b, SIGNAL('clicked()'), self.uncommit) self.connect(change_branch, SIGNAL("clicked()"), self.change_branch) self.connect(add_branch, SIGNAL("clicked()"), self.add_branch) self.connect(delete_branch, SIGNAL("clicked()"), self.delete_branch) self.connect(merge_branches, SIGNAL("clicked()"), self.merge_branches) def fill(self, a_list, widget_list): for x in a_list: item = QListWidgetItem() widget_list.addItem(item) check_box = QCheckBox(x) widget_list.setItemWidget(item, check_box) def add(self): path = self.plugin.editor.get_project_owner() for pos in reversed(xrange(self.untracked_files.count())): item = self.untracked_files.item(pos) widget = self.untracked_files.itemWidget(item) text = widget.text() if widget.isChecked(): self.git.add(path, text) self.untracked_files.removeItemWidget(item) self.untracked_files.takeItem(pos) item = QListWidgetItem() self.added_files.addItem(item) check_box = QCheckBox(text) self.added_files.setItemWidget(item, check_box) for pos in reversed(xrange(self.modified_files.count())): item = self.modified_files.item(pos) widget = self.modified_files.itemWidget(item) text = widget.text() if widget.isChecked(): self.git.add(path, widget.text()) self.modified_files.removeItemWidget(item) self.modified_files.takeItem(pos) item = QListWidgetItem() self.s_modified_files.addItem(item) check_box = QCheckBox(text) self.s_modified_files.setItemWidget(item, check_box) for pos in reversed(xrange(self.deleted_files.count())): item = self.deleted_files.item(pos) widget = self.deleted_files.itemWidget(item) text = widget.text() if widget.isChecked(): self.git.add(path, widget.text()) self.deleted_files.removeItemWidget(item) self.deleted_files.takeItem(pos) item = QListWidgetItem() self.s_deleted_files.addItem(item) check_box = QCheckBox(text) self.s_deleted_files.setItemWidget(item, check_box) def unstage(self): path = self.plugin.editor.get_project_owner() for pos in reversed(xrange(self.untracked_files.count())): item = self.untracked_files.item(pos) widget = self.untracked_files.itemWidget(item) if widget.isChecked(): self.git.unstage(path, widget.text()) self.untracked_files.removeItemWidget(item) self.untracked_files.takeItem(pos) for pos in reversed(xrange(self.modified_files.count())): item = self.modified_files.item(pos) widget = self.modified_files.itemWidget(item) if widget.isChecked(): self.git.unstage(path, widget.text()) self.modified_files.removeItemWidget(item) self.modified_files.takeItem(pos) for pos in reversed(xrange(self.deleted_files.count())): item = self.deleted_files.item(pos) widget = self.deleted_files.itemWidget(item) if widget.isChecked(): self.git.unstage(path, widget.text()) self.deleted_files.removeItemWidget(item) self.deleted_files.takeItem(pos) def commit(self): msg = QInputDialog.getText(self, "Commit message", "Commit Message:") if msg[1] == False: return (0) path = self.plugin.editor.get_project_owner() for pos in reversed(xrange(self.added_files.count())): item = self.added_files.item(pos) widget = self.added_files.itemWidget(item) if widget.isChecked(): self.git.commit(path, str(widget.text()), msg[0]) self.added_files.removeItemWidget(item) self.added_files.takeItem(pos) for pos in reversed(xrange(self.s_modified_files.count())): item = self.s_modified_files.item(pos) widget = self.s_modified_files.itemWidget(item) if widget.isChecked(): self.git.commit(path, widget.text(), msg[0]) self.s_modified_files.removeItemWidget(item) self.s_modified_files.takeItem(pos) for pos in reversed(xrange(self.s_deleted_files.count())): item = self.s_deleted_files.item(pos) widget = self.s_deleted_files.itemWidget(item) if widget.isChecked(): self.git.commit(path, widget.text(), msg[0]) self.s_deleted_files.takeItem(pos) self.s_deleted_files.removeItemWidget(item) def uncommit(self): path = self.plugin.editor.get_project_owner() for pos in reversed(xrange(self.added_files.count())): item = self.added_files.item(pos) widget = self.added_files.itemWidget(item) text = widget.text() if widget.isChecked(): self.git.uncommit(path, str(widget.text())) self.added_files.removeItemWidget(item) self.added_files.takeItem(pos) item = QListWidgetItem() self.untracked_files.addItem(item) check_box = QCheckBox(text) self.untracked_files.setItemWidget(item, check_box) for pos in reversed(xrange(self.s_modified_files.count())): item = self.s_modified_files.item(pos) widget = self.s_modified_files.itemWidget(item) text = widget.text() if widget.isChecked(): self.git.uncommit(path, widget.text()) self.s_modified_files.removeItemWidget(item) self.s_modified_files.takeItem(pos) item = QListWidgetItem() self.modified_files.addItem(item) check_box = QCheckBox(text) self.modified_files.setItemWidget(item, check_box) for pos in reversed(xrange(self.s_deleted_files.count())): item = self.s_deleted_files.item(pos) widget = self.s_deleted_files.itemWidget(item) text = widget.text() if widget.isChecked(): self.git.uncommit(path, widget.text()) self.s_deleted_files.removeItemWidget(item) self.s_deleted_files.takeItem(pos) item = QListWidgetItem() self.deleted_files.addItem(item) check_box = QCheckBox(text) self.deleted_files.setItemWidget(item, check_box) def change_branch(self): path = self.plugin.editor.get_project_owner() item = self.s_branches.currentItem() if item and not self.something(): text = item.text() self.git.change_branch(path, text) self.s_branches.clear() self.s_branches.addItems(self.git.branch(unicode(path))[1:]) self.actual_branch.setText("<h2>{0}<h2>".format(text)) if self.something(): v = QMessageBox() v.setText("Error: you have unsaved changes") v.setIcon(v.Warning) v.exec_() def add_branch(self): path = self.plugin.editor.get_project_owner() msg = QInputDialog.getText(self, "New branch", "Branch Name:") if msg[1] == False: return (0) self.git.add_branch(path, msg[0]) self.s_branches.clear() self.s_branches.addItems(self.git.branch(unicode(path))[1:]) def delete_branch(self): path = self.plugin.editor.get_project_owner() item = self.s_branches.currentItem() if item: text = str(item.text()) call = self.git.delete_branch(path, text) if not call: self.s_branches.clear() self.s_branches.addItems(self.git.branch(unicode(path))[1:]) else: m = QMessageBox() m.setText("<h2>" + call + "</h2>") m.setInformativeText("Force deletion?") m.setStandardButtons(QMessageBox.Ok | QMessageBox.Cancel) m.setDefaultButton(QMessageBox.Cancel) c = m.exec_() if c == QMessageBox.Ok: self.git.force_delete_branch(path, text) self.s_branches.clear() self.s_branches.addItems( self.git.branch(unicode(path))[1:]) def merge_branches(self): path = self.plugin.editor.get_project_owner() item = self.s_branches.currentItem() if item: text = str(item.text()) call = self.git.merge_branches(path, text) if call: m = QMessageBox() m.setText(call) m.setInformativeText("Unknown") m.setIcon(m.Critical) m.exec_() def something(self): for x in self.lists: if x.count() > 0: return True return False