Description: Always drop into the cell behind cursor Drop desktop items into the cell behind the cursor, regardless of the cursor position inside the cell. . Previously, if the cursor was in the right half of the cell, the item would be dropped into the next cell on the right, and a similar thing happened with the right bottom half. Author: Tsu Jan Origin: upstream Bug: https://github.com/lxqt/pcmanfm-qt/issues/728 Applied-Upstream: commit:a7898c9 Last-Update: 2018-07-14 --- a/pcmanfm/desktopwindow.cpp +++ b/pcmanfm/desktopwindow.cpp @@ -59,6 +59,7 @@ #include #include +#define WORK_AREA_MARGIN 12 // margin of the work area #define MIN_SLIDE_INTERVAL 5*60000 // 5 min #define MAX_SLIDE_INTERVAL (24*60+55)*60000 // 24 h and 55 min @@ -751,7 +752,7 @@ void DesktopWindow::removeBottomGap() { //qDebug() << "delegate:" << delegate->itemSize(); QSize cellMargins = getMargins(); int workAreaHeight = qApp->desktop()->availableGeometry(screenNum_).height() - - 24; // a 12-pix margin will be considered everywhere + - 2 * WORK_AREA_MARGIN; int cellHeight = itemSize.height() + listView_->spacing(); int iconNumber = workAreaHeight / cellHeight; int bottomGap = workAreaHeight % cellHeight; @@ -827,7 +828,7 @@ void DesktopWindow::relayoutItems() { screen = screenNum_; } QRect workArea = desktop->availableGeometry(screen); - workArea.adjust(12, 12, -12, -12); // add a 12 pixel margin to the work area + workArea.adjust(WORK_AREA_MARGIN, WORK_AREA_MARGIN, -WORK_AREA_MARGIN, -WORK_AREA_MARGIN); // qDebug() << "workArea" << screen << workArea; // FIXME: we use an internal class declared in a private header here, which is pretty bad. QPoint pos = workArea.topLeft(); @@ -902,7 +903,7 @@ void DesktopWindow::loadItemPositions() auto delegate = static_cast(listView_->itemDelegateForColumn(0)); auto grid = delegate->itemSize(); QRect workArea = qApp->desktop()->availableGeometry(screenNum_); - workArea.adjust(12, 12, -12, -12); + workArea.adjust(WORK_AREA_MARGIN, WORK_AREA_MARGIN, -WORK_AREA_MARGIN, -WORK_AREA_MARGIN); QString desktopDir = QStandardPaths::writableLocation(QStandardPaths::DesktopLocation); desktopDir += '/'; std::vector usedPos; @@ -1281,8 +1282,8 @@ void DesktopWindow::childDropEvent(QDrop auto delegate = static_cast(listView_->itemDelegateForColumn(0)); auto grid = delegate->itemSize(); QRect workArea = qApp->desktop()->availableGeometry(screenNum_); - workArea.adjust(12, 12, -12, -12); - QPoint pos = mapFromGlobal(e->pos()); + workArea.adjust(WORK_AREA_MARGIN, WORK_AREA_MARGIN, -WORK_AREA_MARGIN, -WORK_AREA_MARGIN); + QPoint pos = e->pos(); const QModelIndexList indexes = selectedIndexes(); for(const QModelIndex& indx : indexes) { if(auto file = proxyModel_->fileInfoFromIndex(indx)) { @@ -1305,9 +1306,9 @@ void DesktopWindow::childDropEvent(QDrop auto delegate = static_cast(listView_->itemDelegateForColumn(0)); auto grid = delegate->itemSize(); QRect workArea = qApp->desktop()->availableGeometry(screenNum_); - workArea.adjust(12, 12, -12, -12); + workArea.adjust(WORK_AREA_MARGIN, WORK_AREA_MARGIN, -WORK_AREA_MARGIN, -WORK_AREA_MARGIN); const QString desktopDir = XdgDir::readDesktopDir() + QString(QLatin1String("/")); - QPoint pos = mapFromGlobal(e->pos()); + QPoint pos = e->pos(); const QList urlList = mimeData->urls(); for(const QUrl& url : urlList) { QString name = url.fileName(); @@ -1352,12 +1353,10 @@ void DesktopWindow::stickToPosition(cons } void DesktopWindow::alignToGrid(QPoint& pos, const QPoint& topLeft, const QSize& grid, const int spacing) { - qreal w = qAbs((qreal)pos.x() - (qreal)topLeft.x()) - / (qreal)(grid.width() + spacing); - qreal h = qAbs((qreal)pos.y() - (qreal)topLeft.y()) - / (qreal)(grid.height() + spacing); - pos.setX(topLeft.x() + qRound(w) * (grid.width() + spacing)); - pos.setY(topLeft.y() + qRound(h) * (grid.height() + spacing)); + int w = qAbs(pos.x() - topLeft.x()) / (grid.width() + spacing); + int h = qAbs(pos.y() - topLeft.y()) / (grid.height() + spacing); + pos.setX(topLeft.x() + w * (grid.width() + spacing)); + pos.setY(topLeft.y() + h * (grid.height() + spacing)); } void DesktopWindow::closeEvent(QCloseEvent* event) {