RefactoringRope/HistoryDialog.py

Sun, 30 Jan 2011 19:19:40 +0100

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Sun, 30 Jan 2011 19:19:40 +0100
changeset 20
83b71483e198
parent 19
32dd7dbf3e8e
child 35
79e19b499675
permissions
-rw-r--r--

Made the code PEP-8 compliant.

# -*- coding: utf-8 -*-

# Copyright (c) 2011 Detlev Offenbach <detlev@die-offenbachs.de>
#

"""
Module implementing the History dialog.
"""

from PyQt4.QtCore import Qt, pyqtSlot
from PyQt4.QtGui import QDialogButtonBox, QListWidgetItem, QMessageBox, \
    QApplication

from E5Gui.E5Application import e5App

from PreviewDialogBase import PreviewDialogBase
from ProgressHandle import ProgressHandle

import Utilities


class HistoryDialog(PreviewDialogBase):
    """
    Class implementing the History dialog.
    """
    ChangeIDRole = Qt.UserRole
    
    def __init__(self, refactoring, changes, isUndo, parent=None):
        """
        Constructor
        
        @param refactoring reference to the main refactoring object
            (Refactoring)
        @param changes list of ChangeSet objects
            (list of rope.base.change.ChangeSet)
        @param isUndo flag indicating an undo history dialog (boolean)
        @param parent reference to the parent widget (QWidget)
        """
        PreviewDialogBase.__init__(self, parent)
        
        self.__refactoring = refactoring
        self.__isUndo = isUndo
        
        if self.__isUndo:
            self.__actionButton = self.buttonBox.addButton(
                self.trUtf8("&Undo"),
                QDialogButtonBox.AcceptRole)
            self.description.setText(self.trUtf8("Undoable Changes"))
            title = self.trUtf8("Undo History")
        else:
            self.__actionButton = self.buttonBox.addButton(
                self.trUtf8("&Redo"),
                QDialogButtonBox.AcceptRole)
            self.description.setText(self.trUtf8("Redoable Changes"))
            title = self.trUtf8("Redo History")
        self.buttonBox.addButton(QDialogButtonBox.Close)
        self.setWindowTitle(title)
        
        # populate the list
        self.__changes = {}
        for change in changes:
            self.__changes[id(change)] = change
            itm = QListWidgetItem(str(change), self.changesList)
            itm.setData(HistoryDialog.ChangeIDRole, id(change))
        if self.changesList.count() > 0:
            self.changesList.item(0).setSelected(True)
    
    @pyqtSlot(QListWidgetItem, QListWidgetItem)
    def on_changesList_currentItemChanged(self, current, previous):
        """
        Private slot called when a change is selected.
        
        @param current reference to the new current item (QListWidgetItem)
        @param previous reference to the old current item (QListWidgetItem)
        """
        if current is None:
            return
        
        self.previewEdit.clear()
        id = current.data(HistoryDialog.ChangeIDRole)
        change = self.__changes[id]
        for line in change.get_description().splitlines(True):
            try:
                format = self.formats[line[0]]
            except (IndexError, KeyError):
                format = self.formats[' ']
            self._appendText(line, format)
    
    def accept(self):
        """
        Public slot to undo the selected set of changes.
        """
        id = self.changesList.currentItem()\
                 .data(HistoryDialog.ChangeIDRole)
        change = self.__changes[id]
        
        if self.__isUndo:
            res = QMessageBox.question(None,
                self.trUtf8("Undo refactorings"),
                self.trUtf8("""Shall all refactorings up to <b>{0}</b>"""
                            """ be undone?""")\
                    .format(Utilities.html_encode(str(change))),
                QMessageBox.StandardButtons(\
                    QMessageBox.No | \
                    QMessageBox.Yes),
                QMessageBox.No)
        else:
            res = QMessageBox.question(None,
                self.trUtf8("Redo refactorings"),
                self.trUtf8("""Shall all refactorings up to <b>{0}</b>"""
                    """ be redone?""")\
                    .format(Utilities.html_encode(str(change))),
                QMessageBox.StandardButtons(\
                    QMessageBox.No | \
                    QMessageBox.Yes),
                QMessageBox.No)
        if res == QMessageBox.Yes:
            if not self.__refactoring.confirmAllBuffersSaved():
                return
            
            handle = ProgressHandle(change.description, False, self)
            handle.show()
            QApplication.processEvents()
            if self.__isUndo:
                self.__refactoring.getProject().history.undo(
                    change, task_handle=handle)
            else:
                self.__refactoring.getProject().history.redo(
                    change, task_handle=handle)
            handle.reset()
            
            self.__refactoring.refreshEditors(change)
            p = e5App().getObject("Project")
            if p.isDirty():
                p.saveProject()
            
            PreviewDialogBase.accept(self)
        else:
            self.reject()

eric ide

mercurial