Rewrite list view movement key handlers in file management mode

This resolves Bug 1961
pull/16/head
Timothy Pearson 10 years ago
parent 5c1caefb49
commit 4ffab32f5f

@ -2,6 +2,7 @@
Copyright (C) 2000 Reginald Stadlbauer <reggie@kde.org> Copyright (C) 2000 Reginald Stadlbauer <reggie@kde.org>
Copyright (C) 2000,2003 Charles Samuels <charles@kde.org> Copyright (C) 2000,2003 Charles Samuels <charles@kde.org>
Copyright (C) 2000 Peter Putzer Copyright (C) 2000 Peter Putzer
Copyright (C) 2014 Timothy Pearson <kb9vqf@pearsoncomputing.net>
This library is free software; you can redistribute it and/or This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public modify it under the terms of the GNU Library General Public
@ -94,6 +95,7 @@ public:
tabRename(true), tabRename(true),
sortColumn(0), sortColumn(0),
selectionDirection(0), selectionDirection(0),
selectionRegion(0),
tooltipColumn (0), tooltipColumn (0),
selectionMode (Single), selectionMode (Single),
contextMenuKey (TDEGlobalSettings::contextMenuKey()), contextMenuKey (TDEGlobalSettings::contextMenuKey()),
@ -103,7 +105,8 @@ public:
paintCurrent (0), paintCurrent (0),
paintBelow (0), paintBelow (0),
painting (false), painting (false),
shadeSortColumn(TDEGlobalSettings::shadeSortColumn()) shadeSortColumn(TDEGlobalSettings::shadeSortColumn()),
initialFileManagerItem(0)
{ {
renameable.append(0); renameable.append(0);
connect(editor, TQT_SIGNAL(done(TQListViewItem*,int)), listview, TQT_SLOT(doneEditing(TQListViewItem*,int))); connect(editor, TQT_SIGNAL(done(TQListViewItem*,int)), listview, TQT_SLOT(doneEditing(TQListViewItem*,int)));
@ -156,6 +159,7 @@ public:
//+1 means downwards (y increases, -1 means upwards, 0 means not selected), aleXXX //+1 means downwards (y increases, -1 means upwards, 0 means not selected), aleXXX
int selectionDirection; int selectionDirection;
int selectionRegion;
int tooltipColumn; int tooltipColumn;
SelectionModeExt selectionMode; SelectionModeExt selectionMode;
@ -175,6 +179,8 @@ public:
bool shadeSortColumn:1; bool shadeSortColumn:1;
TQColor alternateBackground; TQColor alternateBackground;
TQListViewItem *initialFileManagerItem;
}; };
@ -1545,332 +1551,478 @@ bool TDEListView::automaticSelection() const
void TDEListView::fileManagerKeyPressEvent (TQKeyEvent* e) void TDEListView::fileManagerKeyPressEvent (TQKeyEvent* e)
{ {
//don't care whether it's on the keypad or not //don't care whether it's on the keypad or not
int e_state=(e->state() & ~Keypad); int e_state=(e->state() & ~Keypad);
int oldSelectionDirection(d->selectionDirection); // Handle non-control keypresses
if ((e->key()!=Key_Shift) && (e->key()!=Key_Control)
&& (e->key()!=Key_Meta) && (e->key()!=Key_Alt)) {
if ((e_state==ShiftButton) && (!d->wasShiftEvent) && (!d->selectedBySimpleMove)) {
selectAll(false);
d->selectionRegion = 0;
d->initialFileManagerItem = NULL;
}
d->selectionDirection=0;
d->wasShiftEvent = (e_state == ShiftButton);
}
if ((e->key()!=Key_Shift) && (e->key()!=Key_Control) //d->wasShiftEvent = (e_state == ShiftButton);
&& (e->key()!=Key_Meta) && (e->key()!=Key_Alt))
{
if ((e_state==ShiftButton) && (!d->wasShiftEvent) && (!d->selectedBySimpleMove))
selectAll(false);
d->selectionDirection=0;
d->wasShiftEvent = (e_state == ShiftButton);
};
//d->wasShiftEvent = (e_state == ShiftButton);
TQListViewItem* item = currentItem();
if (!item) return;
TQListViewItem* repaintItem1 = item;
TQListViewItem* repaintItem2 = 0L;
TQListViewItem* visItem = 0L;
TQListViewItem* nextItem = 0L;
int items = 0;
bool shiftOrCtrl((e_state==ControlButton) || (e_state==ShiftButton));
int selectedItems(0);
for (TQListViewItem *tmpItem=firstChild(); tmpItem; tmpItem=tmpItem->nextSibling())
if (tmpItem->isSelected()) selectedItems++;
if (((!selectedItems) || ((selectedItems==1) && (d->selectedUsingMouse)))
&& (e_state==Qt::NoButton)
&& ((e->key()==Key_Down)
|| (e->key()==Key_Up)
|| (e->key()==Key_Next)
|| (e->key()==Key_Prior)
|| (e->key()==Key_Home)
|| (e->key()==Key_End)))
{
d->selectedBySimpleMove=true;
d->selectedUsingMouse=false;
}
else if (selectedItems>1)
d->selectedBySimpleMove=false;
bool emitSelectionChanged(false); TQListViewItem* item = currentItem();
if (!item) {
return;
}
switch (e->key()) TQListViewItem* repaintItem1 = item;
{ TQListViewItem* repaintItem2 = 0L;
case Key_Escape: TQListViewItem* visItem = 0L;
selectAll(false);
emitSelectionChanged=true;
break;
case Key_Space:
//toggle selection of current item
if (d->selectedBySimpleMove)
d->selectedBySimpleMove=false;
item->setSelected(!item->isSelected());
emitSelectionChanged=true;
break;
case Key_Insert:
//toggle selection of current item and move to the next item
if (d->selectedBySimpleMove)
{
d->selectedBySimpleMove=false;
if (!item->isSelected()) item->setSelected(true);
}
else
{
item->setSelected(!item->isSelected());
};
nextItem=item->itemBelow(); TQListViewItem* nextItem = 0L;
int items = 0;
if (nextItem) bool shiftOrCtrl((e_state==ControlButton) || (e_state==ShiftButton));
{ int selectedItems(0);
repaintItem2=nextItem; for (TQListViewItem *tmpItem=firstChild(); tmpItem; tmpItem=tmpItem->nextSibling()) {
visItem=nextItem; if (tmpItem->isSelected()) selectedItems++;
setCurrentItem(nextItem); }
};
d->selectionDirection=1;
emitSelectionChanged=true;
break;
case Key_Down:
nextItem=item->itemBelow();
//toggle selection of current item and move to the next item
if (shiftOrCtrl)
{
d->selectionDirection=1;
if (d->selectedBySimpleMove)
d->selectedBySimpleMove=false;
else
{
if (oldSelectionDirection!=-1)
{
item->setSelected(!item->isSelected());
emitSelectionChanged=true;
};
};
}
else if ((d->selectedBySimpleMove) && (nextItem))
{
item->setSelected(false);
emitSelectionChanged=true;
};
if (nextItem) if (((!selectedItems) || ((selectedItems==1) && (d->selectedUsingMouse)))
{ && (e_state==Qt::NoButton)
if (d->selectedBySimpleMove) && ((e->key()==Key_Down)
nextItem->setSelected(true); || (e->key()==Key_Up)
repaintItem2=nextItem; || (e->key()==Key_Next)
visItem=nextItem; || (e->key()==Key_Prior)
setCurrentItem(nextItem); || (e->key()==Key_Home)
}; || (e->key()==Key_End))) {
break; d->selectedBySimpleMove=true;
d->selectedUsingMouse=false;
case Key_Up: }
nextItem=item->itemAbove(); else if (selectedItems>1) {
d->selectionDirection=-1; d->selectedBySimpleMove=false;
//move to the prev. item and toggle selection of this one }
// => No, can't select the last item, with this. For symmetry, let's
// toggle selection and THEN move up, just like we do in down (David)
if (shiftOrCtrl)
{
if (d->selectedBySimpleMove)
d->selectedBySimpleMove=false;
else
{
if (oldSelectionDirection!=1)
{
item->setSelected(!item->isSelected());
emitSelectionChanged=true;
};
}
}
else if ((d->selectedBySimpleMove) && (nextItem))
{
item->setSelected(false);
emitSelectionChanged=true;
};
if (nextItem) bool emitSelectionChanged(false);
{
if (d->selectedBySimpleMove)
nextItem->setSelected(true);
repaintItem2=nextItem;
visItem=nextItem;
setCurrentItem(nextItem);
};
break;
case Key_End:
//move to the last item and toggle selection of all items inbetween
nextItem=item;
if (d->selectedBySimpleMove)
item->setSelected(false);
if (shiftOrCtrl)
d->selectedBySimpleMove=false;
while(nextItem)
{
if (shiftOrCtrl)
nextItem->setSelected(!nextItem->isSelected());
if (!nextItem->itemBelow())
{
if (d->selectedBySimpleMove)
nextItem->setSelected(true);
repaintItem2=nextItem;
visItem=nextItem;
setCurrentItem(nextItem);
}
nextItem=nextItem->itemBelow();
}
emitSelectionChanged=true;
break;
case Key_Home:
// move to the first item and toggle selection of all items inbetween
nextItem = firstChild();
visItem = nextItem;
repaintItem2 = visItem;
if (d->selectedBySimpleMove)
item->setSelected(false);
if (shiftOrCtrl)
{
d->selectedBySimpleMove=false;
while ( nextItem != item ) switch (e->key()) {
{ case Key_Escape:
nextItem->setSelected( !nextItem->isSelected() ); selectAll(false);
nextItem = nextItem->itemBelow(); emitSelectionChanged=true;
} break;
item->setSelected( !item->isSelected() );
}
setCurrentItem( firstChild() );
emitSelectionChanged=true;
break;
case Key_Next:
items=visibleHeight()/item->height();
nextItem=item;
if (d->selectedBySimpleMove)
item->setSelected(false);
if (shiftOrCtrl)
{
d->selectedBySimpleMove=false;
d->selectionDirection=1;
};
for (int i=0; i<items; i++) case Key_Space:
{ //toggle selection of current item
if (shiftOrCtrl) if (d->selectedBySimpleMove) {
nextItem->setSelected(!nextItem->isSelected()); d->selectedBySimpleMove=false;
//the end }
if ((i==items-1) || (!nextItem->itemBelow())) item->setSelected(!item->isSelected());
emitSelectionChanged=true;
break;
case Key_Insert:
//toggle selection of current item and move to the next item
if (d->selectedBySimpleMove) {
d->selectedBySimpleMove=false;
if (!item->isSelected()) item->setSelected(true);
}
else {
item->setSelected(!item->isSelected());
}
{ nextItem=item->itemBelow();
if (shiftOrCtrl)
nextItem->setSelected(!nextItem->isSelected());
if (d->selectedBySimpleMove)
nextItem->setSelected(true);
ensureItemVisible(nextItem);
setCurrentItem(nextItem);
update();
if ((shiftOrCtrl) || (d->selectedBySimpleMove))
{
emit selectionChanged();
}
return;
}
nextItem=nextItem->itemBelow();
}
break;
case Key_Prior:
items=visibleHeight()/item->height();
nextItem=item;
if (d->selectedBySimpleMove)
item->setSelected(false);
if (shiftOrCtrl)
{
d->selectionDirection=-1;
d->selectedBySimpleMove=false;
};
for (int i=0; i<items; i++) if (nextItem) {
{ repaintItem2=nextItem;
if ((nextItem!=item) &&(shiftOrCtrl)) visItem=nextItem;
nextItem->setSelected(!nextItem->isSelected()); setCurrentItem(nextItem);
//the end }
if ((i==items-1) || (!nextItem->itemAbove())) d->selectionDirection=1;
emitSelectionChanged=true;
break;
case Key_Down:
nextItem=item->itemBelow();
if (shiftOrCtrl) {
d->selectionDirection=1;
d->selectedBySimpleMove=false;
if (!d->initialFileManagerItem) {
d->initialFileManagerItem = item;
item->setSelected(true);
if (nextItem) {
nextItem->setSelected(true);
}
emitSelectionChanged=true;
d->selectionRegion=1;
}
else {
if (item == d->initialFileManagerItem) {
item->setSelected(true);
if (nextItem) {
nextItem->setSelected(true);
}
emitSelectionChanged=true;
d->selectionRegion=1;
}
else {
if (d->selectionRegion == 1) {
if (nextItem) {
nextItem->setSelected(true);
}
emitSelectionChanged=true;
}
else if (d->selectionRegion == -1) {
item->setSelected(false);
emitSelectionChanged=true;
}
}
}
}
else if ((d->selectedBySimpleMove) && (nextItem)) {
item->setSelected(false);
emitSelectionChanged=true;
}
{ if (nextItem) {
if (d->selectedBySimpleMove) if (d->selectedBySimpleMove) {
nextItem->setSelected(true); nextItem->setSelected(true);
ensureItemVisible(nextItem); }
setCurrentItem(nextItem); repaintItem2=nextItem;
update(); visItem=nextItem;
if ((shiftOrCtrl) || (d->selectedBySimpleMove)) setCurrentItem(nextItem);
{ }
emit selectionChanged(); break;
}
return; case Key_Up:
} nextItem=item->itemAbove();
nextItem=nextItem->itemAbove(); if (shiftOrCtrl) {
} d->selectionDirection=-1;
break; d->selectedBySimpleMove=false;
if (!d->initialFileManagerItem) {
case Key_Minus: d->initialFileManagerItem = item;
if ( item->isOpen() ) item->setSelected(true);
setOpen( item, false ); if (nextItem) {
break; nextItem->setSelected(true);
case Key_Plus: }
if ( !item->isOpen() && (item->isExpandable() || item->childCount()) ) emitSelectionChanged=true;
setOpen( item, true ); d->selectionRegion=-1;
break; }
default: else {
bool realKey = ((e->key()!=Key_Shift) && (e->key()!=Key_Control) if (item == d->initialFileManagerItem) {
&& (e->key()!=Key_Meta) && (e->key()!=Key_Alt)); item->setSelected(true);
if (nextItem) {
bool selectCurrentItem = (d->selectedBySimpleMove) && (item->isSelected()); nextItem->setSelected(true);
if (realKey && selectCurrentItem) }
item->setSelected(false); emitSelectionChanged=true;
//this is mainly for the "goto filename beginning with pressed char" feature (aleXXX) d->selectionRegion=-1;
TQListView::SelectionMode oldSelectionMode = selectionMode(); }
setSelectionMode (TQListView::Multi); else {
TQListView::keyPressEvent (e); if (d->selectionRegion == -1) {
setSelectionMode (oldSelectionMode); if (nextItem) {
if (realKey && selectCurrentItem) nextItem->setSelected(true);
{ }
currentItem()->setSelected(true); emitSelectionChanged=true;
emitSelectionChanged=true; }
} else if (d->selectionRegion == 1) {
repaintItem2=currentItem(); item->setSelected(false);
if (realKey) emitSelectionChanged=true;
visItem=currentItem(); }
break; }
} }
}
else if ((d->selectedBySimpleMove) && (nextItem)) {
item->setSelected(false);
emitSelectionChanged=true;
}
if (visItem) if (nextItem) {
ensureItemVisible(visItem); if (d->selectedBySimpleMove) {
nextItem->setSelected(true);
}
repaintItem2=nextItem;
visItem=nextItem;
setCurrentItem(nextItem);
}
break;
TQRect ir; case Key_End:
if (repaintItem1) // move to the last item and toggle selection of all items in-between
ir = ir.unite( itemRect(repaintItem1) ); nextItem=item;
if (repaintItem2) if (d->selectedBySimpleMove) {
ir = ir.unite( itemRect(repaintItem2) ); item->setSelected(false);
}
if (shiftOrCtrl) {
d->selectedBySimpleMove=false;
}
if ( !ir.isEmpty() ) while (nextItem) {
{ // rectangle to be repainted if (shiftOrCtrl) {
if ( ir.x() < 0 ) if (!d->initialFileManagerItem) {
ir.moveBy( -ir.x(), 0 ); d->initialFileManagerItem = nextItem;
viewport()->repaint( ir, false ); nextItem->setSelected(true);
} emitSelectionChanged=true;
/*if (repaintItem1) d->selectionRegion=1;
repaintItem1->repaint(); }
if (repaintItem2) else {
repaintItem2->repaint();*/ if (nextItem == d->initialFileManagerItem) {
update(); nextItem->setSelected(true);
if (emitSelectionChanged) emitSelectionChanged=true;
emit selectionChanged(); d->selectionRegion=1;
}
else {
if (d->selectionRegion == 1) {
nextItem->setSelected(true);
emitSelectionChanged=true;
}
else if (d->selectionRegion == -1) {
nextItem->setSelected(false);
emitSelectionChanged=true;
}
}
}
}
if (!nextItem->itemBelow()) {
if (d->selectedBySimpleMove) {
nextItem->setSelected(true);
}
repaintItem2=nextItem;
visItem=nextItem;
setCurrentItem(nextItem);
}
nextItem=nextItem->itemBelow();
}
emitSelectionChanged=true;
break;
case Key_Home:
// move to the first item and toggle selection of all items in-between
nextItem=item;
if (d->selectedBySimpleMove) {
item->setSelected(false);
}
if (shiftOrCtrl) {
d->selectedBySimpleMove=false;
}
while (nextItem) {
if (shiftOrCtrl) {
if (!d->initialFileManagerItem) {
d->initialFileManagerItem = nextItem;
nextItem->setSelected(true);
emitSelectionChanged=true;
d->selectionRegion=-1;
}
else {
if (nextItem == d->initialFileManagerItem) {
nextItem->setSelected(true);
emitSelectionChanged=true;
d->selectionRegion=-1;
}
else {
if (d->selectionRegion == -1) {
nextItem->setSelected(true);
emitSelectionChanged=true;
}
else if (d->selectionRegion == 1) {
nextItem->setSelected(false);
emitSelectionChanged=true;
}
}
}
}
if (!nextItem->itemAbove()) {
if (d->selectedBySimpleMove) {
nextItem->setSelected(true);
}
repaintItem2=nextItem;
visItem=nextItem;
setCurrentItem(nextItem);
}
nextItem=nextItem->itemAbove();
}
emitSelectionChanged=true;
break;
case Key_Next:
items=visibleHeight()/item->height();
nextItem=item;
if (d->selectedBySimpleMove) {
item->setSelected(false);
}
if (shiftOrCtrl) {
d->selectedBySimpleMove=false;
d->selectionDirection=1;
}
for (int i=0; i<items; i++) {
if (shiftOrCtrl) {
if (!d->initialFileManagerItem) {
d->initialFileManagerItem = nextItem;
nextItem->setSelected(true);
emitSelectionChanged=true;
d->selectionRegion=1;
}
else {
if (nextItem == d->initialFileManagerItem) {
nextItem->setSelected(true);
emitSelectionChanged=true;
d->selectionRegion=1;
}
else {
if (d->selectionRegion == 1) {
nextItem->setSelected(true);
emitSelectionChanged=true;
}
else if (d->selectionRegion == -1) {
if (i==items-1) {
nextItem->setSelected(true);
}
else {
nextItem->setSelected(false);
}
emitSelectionChanged=true;
}
}
}
}
// last item
if ((i==items-1) || (!nextItem->itemBelow())) {
if (d->selectedBySimpleMove) {
nextItem->setSelected(true);
}
ensureItemVisible(nextItem);
setCurrentItem(nextItem);
update();
if ((shiftOrCtrl) || (d->selectedBySimpleMove)) {
emit selectionChanged();
}
return;
}
nextItem=nextItem->itemBelow();
}
break;
case Key_Prior:
items=visibleHeight()/item->height();
nextItem=item;
if (d->selectedBySimpleMove) {
item->setSelected(false);
}
if (shiftOrCtrl) {
d->selectionDirection=-1;
d->selectedBySimpleMove=false;
}
for (int i=0; i<items; i++) {
if (shiftOrCtrl) {
if (!d->initialFileManagerItem) {
d->initialFileManagerItem = nextItem;
nextItem->setSelected(true);
emitSelectionChanged=true;
d->selectionRegion=-1;
}
else {
if (nextItem == d->initialFileManagerItem) {
nextItem->setSelected(true);
emitSelectionChanged=true;
d->selectionRegion=-1;
}
else {
if (d->selectionRegion == -1) {
nextItem->setSelected(true);
emitSelectionChanged=true;
}
else if (d->selectionRegion == 1) {
if (i==items-1) {
nextItem->setSelected(true);
}
else {
nextItem->setSelected(false);
}
emitSelectionChanged=true;
}
}
}
}
// last item
if ((i==items-1) || (!nextItem->itemAbove())) {
if (d->selectedBySimpleMove) {
nextItem->setSelected(true);
}
ensureItemVisible(nextItem);
setCurrentItem(nextItem);
update();
if ((shiftOrCtrl) || (d->selectedBySimpleMove)) {
emit selectionChanged();
}
return;
}
nextItem=nextItem->itemAbove();
}
break;
case Key_Minus:
if ( item->isOpen() ) {
setOpen( item, false );
}
break;
case Key_Plus:
if ( !item->isOpen() && (item->isExpandable() || item->childCount()) ) {
setOpen( item, true );
}
break;
default:
bool realKey = ((e->key()!=Key_Shift) && (e->key()!=Key_Control)
&& (e->key()!=Key_Meta) && (e->key()!=Key_Alt));
bool selectCurrentItem = (d->selectedBySimpleMove) && (item->isSelected());
if (realKey && selectCurrentItem) {
item->setSelected(false);
}
//this is mainly for the "goto filename beginning with pressed char" feature (aleXXX)
TQListView::SelectionMode oldSelectionMode = selectionMode();
setSelectionMode (TQListView::Multi);
TQListView::keyPressEvent (e);
setSelectionMode (oldSelectionMode);
if (realKey && selectCurrentItem) {
currentItem()->setSelected(true);
emitSelectionChanged=true;
}
repaintItem2=currentItem();
if (realKey) {
visItem=currentItem();
}
break;
}
if (visItem) {
ensureItemVisible(visItem);
}
TQRect ir;
if (repaintItem1) {
ir = ir.unite( itemRect(repaintItem1) );
}
if (repaintItem2) {
ir = ir.unite( itemRect(repaintItem2) );
}
if ( !ir.isEmpty() ) {
// rectangle to be repainted
if ( ir.x() < 0 ) {
ir.moveBy( -ir.x(), 0 );
}
viewport()->repaint( ir, false );
}
/*if (repaintItem1) {
repaintItem1->repaint();
}
if (repaintItem2) {
repaintItem2->repaint();
}*/
update();
if (emitSelectionChanged) {
emit selectionChanged();
}
} }
void TDEListView::setSelectionModeExt (SelectionModeExt mode) void TDEListView::setSelectionModeExt (SelectionModeExt mode)

Loading…
Cancel
Save