mirror of
				https://github.com/kovidgoyal/calibre.git
				synced 2025-11-04 03:27:00 -05:00 
			
		
		
		
	Fix #1888251 [Selecting multiple entries in menu editor only moves one](https://bugs.launchpad.net/calibre/+bug/1888251)
This commit is contained in:
		
							parent
							
								
									14ba9d1461
								
							
						
					
					
						commit
						68f624addd
					
				@ -6,8 +6,7 @@ __license__   = 'GPL v3'
 | 
				
			|||||||
__copyright__ = '2010, Kovid Goyal <kovid@kovidgoyal.net>'
 | 
					__copyright__ = '2010, Kovid Goyal <kovid@kovidgoyal.net>'
 | 
				
			||||||
__docformat__ = 'restructuredtext en'
 | 
					__docformat__ = 'restructuredtext en'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from PyQt5.Qt import QAbstractListModel, Qt, QIcon, \
 | 
					from PyQt5.Qt import QAbstractListModel, Qt, QIcon
 | 
				
			||||||
        QItemSelectionModel
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
from calibre import force_unicode
 | 
					from calibre import force_unicode
 | 
				
			||||||
from calibre.gui2.preferences.toolbar_ui import Ui_Form
 | 
					from calibre.gui2.preferences.toolbar_ui import Ui_Form
 | 
				
			||||||
@ -167,9 +166,7 @@ class CurrentModel(BaseModel):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    def move(self, idx, delta):
 | 
					    def move(self, idx, delta):
 | 
				
			||||||
        row = idx.row()
 | 
					        row = idx.row()
 | 
				
			||||||
        if row < 0 or row >= len(self._data):
 | 
					        nrow = (row + delta + len(self._data)) % len(self._data)
 | 
				
			||||||
            return
 | 
					 | 
				
			||||||
        nrow = row + delta
 | 
					 | 
				
			||||||
        if nrow < 0 or nrow >= len(self._data):
 | 
					        if nrow < 0 or nrow >= len(self._data):
 | 
				
			||||||
            return
 | 
					            return
 | 
				
			||||||
        t = self._data[row]
 | 
					        t = self._data[row]
 | 
				
			||||||
@ -180,6 +177,14 @@ class CurrentModel(BaseModel):
 | 
				
			|||||||
        self.dataChanged.emit(ni, ni)
 | 
					        self.dataChanged.emit(ni, ni)
 | 
				
			||||||
        return ni
 | 
					        return ni
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def move_many(self, indices, delta):
 | 
				
			||||||
 | 
					        indices = sorted(indices, key=lambda i: i.row(), reverse=delta > 0)
 | 
				
			||||||
 | 
					        ans = {}
 | 
				
			||||||
 | 
					        for idx in indices:
 | 
				
			||||||
 | 
					            ni = self.move(idx, delta)
 | 
				
			||||||
 | 
					            ans[idx.row()] = ni
 | 
				
			||||||
 | 
					        return ans
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def add(self, names):
 | 
					    def add(self, names):
 | 
				
			||||||
        actions = []
 | 
					        actions = []
 | 
				
			||||||
        reject = set()
 | 
					        reject = set()
 | 
				
			||||||
@ -330,15 +335,19 @@ class ConfigWidget(ConfigWidgetBase, Ui_Form):
 | 
				
			|||||||
                self.changed_signal.emit()
 | 
					                self.changed_signal.emit()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def move(self, delta, *args):
 | 
					    def move(self, delta, *args):
 | 
				
			||||||
        ci = self.current_actions.currentIndex()
 | 
					        sm = self.current_actions.selectionModel()
 | 
				
			||||||
        m = self.current_actions.model()
 | 
					        x = sm.selectedIndexes()
 | 
				
			||||||
        if ci.isValid():
 | 
					        if x and len(x):
 | 
				
			||||||
            ni = m.move(ci, delta)
 | 
					            i = sm.currentIndex().row()
 | 
				
			||||||
            if ni is not None:
 | 
					            m = self.current_actions.model()
 | 
				
			||||||
                self.current_actions.setCurrentIndex(ni)
 | 
					            idx_map = m.move_many(x, delta)
 | 
				
			||||||
                self.current_actions.selectionModel().select(ni,
 | 
					            newci = idx_map.get(i)
 | 
				
			||||||
                        QItemSelectionModel.ClearAndSelect)
 | 
					            if newci is not None:
 | 
				
			||||||
                self.changed_signal.emit()
 | 
					                sm.setCurrentIndex(newci, sm.ClearAndSelect)
 | 
				
			||||||
 | 
					            sm.clear()
 | 
				
			||||||
 | 
					            for idx in idx_map.values():
 | 
				
			||||||
 | 
					                sm.select(idx, sm.Select)
 | 
				
			||||||
 | 
					            self.changed_signal.emit()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def commit(self):
 | 
					    def commit(self):
 | 
				
			||||||
        # Ensure preferences are showing in either the toolbar or
 | 
					        # Ensure preferences are showing in either the toolbar or
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user