You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
312 lines
9.4 KiB
312 lines
9.4 KiB
Index: kdesktop/KDesktopIface.h
|
|
===================================================================
|
|
--- kdesktop/KDesktopIface.h.orig
|
|
+++ kdesktop/KDesktopIface.h
|
|
@@ -107,6 +107,35 @@ k_dcop:
|
|
* space for desktop icons
|
|
*/
|
|
virtual void desktopIconsAreaChanged(const QRect &area, int screen) = 0;
|
|
+
|
|
+ /**
|
|
+ * Find the next free place for a not yet existing icon, so it fits
|
|
+ * in the user arrangement. Basicly prepare for icons to be moved in.
|
|
+ * It will try to find a place in the virtual grid near col,row
|
|
+ * where no other icon is.
|
|
+ *
|
|
+ * If you specify -1 for row or column, it will try to find the next
|
|
+ * free room where no other icon follows. E.g. if you specify column
|
|
+ * = -1 and row = 0, kdesktop will find the next vertical placement
|
|
+ * so that the icon appears at the end of the existing icons preferable
|
|
+ * in the first column. If the first column is full, it will find the
|
|
+ * next free room in the second column.
|
|
+ *
|
|
+ * If you specify both column and row, kdesktop won't care for aligning,
|
|
+ * or surrounding icons, but try to find the free place near the given
|
|
+ * grid place (e.g. specify 0,0 to find the nearest place in the left
|
|
+ * upper corner).
|
|
+ */
|
|
+ virtual QPoint findPlaceForIcon( int column, int row) = 0;
|
|
+
|
|
+ /// copy the desktop file in the Desktop and place it at x, y
|
|
+ virtual void addIcon(const QString &url, int x, int y) = 0;
|
|
+
|
|
+ /// same with specific destination
|
|
+ virtual void addIcon(const QString &url, const QString &dest, int x, int y) = 0;
|
|
+
|
|
+ /// remove the desktop file (either full path or relative)
|
|
+ virtual void removeIcon(const QString &dest) = 0;
|
|
};
|
|
|
|
#endif
|
|
Index: kdesktop/desktop.cc
|
|
===================================================================
|
|
--- kdesktop/desktop.cc.orig
|
|
+++ kdesktop/desktop.cc
|
|
@@ -32,6 +32,9 @@
|
|
#include <unistd.h>
|
|
#include <kcolordrag.h>
|
|
#include <kurldrag.h>
|
|
+#include <stdlib.h>
|
|
+#include <kio/job.h>
|
|
+#include <qfile.h>
|
|
|
|
#include <qdir.h>
|
|
#include <qevent.h>
|
|
@@ -58,6 +61,7 @@
|
|
#include <kglobalsettings.h>
|
|
#include <kpopupmenu.h>
|
|
#include <kapplication.h>
|
|
+#include <kdirlister.h>
|
|
// Create the equivalent of KAccelBase::connectItem
|
|
// and then remove this include and fix reconnects in initRoot() -- ellis
|
|
//#include <kaccelbase.h>
|
|
@@ -983,4 +987,47 @@ bool KDesktop::event(QEvent * e)
|
|
return QWidget::event(e);
|
|
}
|
|
|
|
+QPoint KDesktop::findPlaceForIcon( int column, int row )
|
|
+{
|
|
+ if (m_pIconView)
|
|
+ return m_pIconView->findPlaceForIcon(column, row);
|
|
+ else
|
|
+ return QPoint(-1, -1);
|
|
+}
|
|
+
|
|
+void KDesktop::addIcon(const QString & _url, int x, int y)
|
|
+{
|
|
+ addIcon( _url, KGlobalSettings::desktopPath(), x, y );
|
|
+}
|
|
+
|
|
+void KDesktop::addIcon(const QString & _url, const QString & _dest, int x, int y)
|
|
+{
|
|
+ QString filename = _url.mid(_url.findRev('/') + 1);
|
|
+
|
|
+ QValueList<KIO::CopyInfo> files;
|
|
+ KIO::CopyInfo i;
|
|
+ i.uSource = KURL::fromPathOrURL( _url );
|
|
+ i.uDest = KURL::fromPathOrURL( _dest );
|
|
+ i.uDest.addPath( filename );
|
|
+ files.append(i);
|
|
+ if (!QFile::exists(i.uDest.prettyURL().replace("file://",QString::null))) { m_pIconView->slotAboutToCreate( QPoint( x, y ), files );
|
|
+ KIO::copy( i.uSource, i.uDest, false ); }
|
|
+
|
|
+// m_pIconView->addFuturePosition(filename, x, y);
|
|
+ // qDebug("addIcon %s %s %d %d", _url.latin1(), _dest.latin1(), x, y);
|
|
+// system(QString("cp \"%1\" \"%2/%3\"").arg(KURL(_url).path()).arg(KURL(_dest).path()).arg(filename).latin1());
|
|
+// m_pIconView->update( _dest );
|
|
+}
|
|
+
|
|
+void KDesktop::removeIcon(const QString &_url)
|
|
+{
|
|
+ if (_url.at(0) != '/') {
|
|
+ qDebug("removeIcon with relative path not supported for now");
|
|
+ return;
|
|
+ }
|
|
+ unlink(KURL(_url).path().latin1());
|
|
+ QString dest = _url.left(_url.findRev('/') + 1);
|
|
+ m_pIconView->update( dest );
|
|
+}
|
|
+
|
|
#include "desktop.moc"
|
|
Index: kdesktop/desktop.h
|
|
===================================================================
|
|
--- kdesktop/desktop.h.orig
|
|
+++ kdesktop/desktop.h
|
|
@@ -164,6 +164,11 @@ protected:
|
|
virtual void setIconsEnabled( bool enable );
|
|
virtual bool event ( QEvent * e );
|
|
|
|
+ virtual QPoint findPlaceForIcon( int column, int row);
|
|
+ virtual void addIcon(const QString &url, int x, int y);
|
|
+ virtual void addIcon(const QString &url, const QString &dest, int x, int y);
|
|
+ virtual void removeIcon(const QString &url);
|
|
+
|
|
private slots:
|
|
void desktopResized();
|
|
|
|
Index: kdesktop/kdiconview.cc
|
|
===================================================================
|
|
--- kdesktop/kdiconview.cc.orig
|
|
+++ kdesktop/kdiconview.cc
|
|
@@ -962,6 +962,18 @@ void KDIconView::slotNewItems( const KFi
|
|
kdDebug(1214) << "KDIconView::slotNewItems count=" << entries.count() << endl;
|
|
KFileItemListIterator it(entries);
|
|
KFileIVI* fileIVI = 0L;
|
|
+
|
|
+ if (m_nextItemPos.isNull() && !m_dotDirectory) {
|
|
+ // Not found, we'll need to save the new pos
|
|
+ kdDebug(1214)<<"Neither a drop position stored nor m_dotDirectory set"<<endl;
|
|
+ m_dotDirectory = new KSimpleConfig( dotDirectoryPath(), true );
|
|
+ // recursion
|
|
+ slotNewItems( entries );
|
|
+ delete m_dotDirectory;
|
|
+ m_dotDirectory = 0;
|
|
+ return;
|
|
+ }
|
|
+
|
|
for (; it.current(); ++it)
|
|
{
|
|
KURL url = it.current()->url();
|
|
@@ -1026,15 +1038,6 @@ void KDIconView::slotNewItems( const KFi
|
|
kdDebug(1214)<<"Using saved position"<<endl;
|
|
}
|
|
}
|
|
- else
|
|
- {
|
|
- // Not found, we'll need to save the new pos
|
|
- kdDebug(1214)<<"slotNewItems(): New item without position information, try to find a sane location"<<endl;
|
|
-
|
|
- moveToFreePosition(fileIVI);
|
|
-
|
|
- m_bNeedSave = true;
|
|
- }
|
|
}
|
|
}
|
|
|
|
@@ -1638,6 +1641,98 @@ void KDIconView::moveToFreePosition(QIco
|
|
}
|
|
|
|
|
|
+QPoint KDIconView::findPlaceForIconCol( int column, int dx, int dy)
|
|
+{
|
|
+ if (column < 0)
|
|
+ return QPoint();
|
|
+
|
|
+ QRect rect;
|
|
+ rect.moveTopLeft( QPoint(column * dx, 0) );
|
|
+ rect.setWidth(dx);
|
|
+ rect.setHeight(dy);
|
|
+
|
|
+ if (rect.right() > viewport()->width())
|
|
+ return QPoint();
|
|
+
|
|
+ while ( rect.bottom() < viewport()->height() - spacing() )
|
|
+ {
|
|
+ if ( !isFreePosition(0,rect) )
|
|
+ rect.moveBy(0, rect.height());
|
|
+ else
|
|
+ return rect.topLeft();
|
|
+ }
|
|
+
|
|
+ return QPoint();
|
|
+}
|
|
+
|
|
+QPoint KDIconView::findPlaceForIconRow( int row, int dx, int dy )
|
|
+{
|
|
+ if (row < 0)
|
|
+ return QPoint();
|
|
+
|
|
+ QRect rect;
|
|
+ rect.moveTopLeft(QPoint(0, row * dy));
|
|
+ rect.setWidth(dx);
|
|
+ rect.setHeight(dy);
|
|
+
|
|
+ if (rect.bottom() > viewport()->height())
|
|
+ return QPoint();
|
|
+
|
|
+ while (rect.right() < viewport()->width() - spacing())
|
|
+ {
|
|
+ if (!isFreePosition(0,rect))
|
|
+ rect.moveBy(rect.width()+spacing(), 0);
|
|
+ else
|
|
+ return rect.topLeft();
|
|
+ }
|
|
+
|
|
+ return QPoint();
|
|
+}
|
|
+
|
|
+QPoint KDIconView::findPlaceForIcon( int column, int row)
|
|
+{
|
|
+ int dx = gridXValue(), dy = 0;
|
|
+ QIconViewItem *item = firstItem();
|
|
+ for ( ; item; item = item->nextItem() ) {
|
|
+ dx = QMAX( dx, item->width() );
|
|
+ dy = QMAX( dy, item->height() );
|
|
+ }
|
|
+
|
|
+ dx += spacing();
|
|
+ dy += spacing();
|
|
+
|
|
+ if (row == -1) {
|
|
+ int max_cols = viewport()->width() / dx;
|
|
+ int delta = 0;
|
|
+ QPoint res;
|
|
+ do {
|
|
+ delta++;
|
|
+ res = findPlaceForIconCol(column + (delta / 2) * (-2 * (delta % 2) + 1),
|
|
+ dx, dy);
|
|
+ if (delta / 2 > QMAX(max_cols - column, column))
|
|
+ return res;
|
|
+ } while (res.isNull());
|
|
+ return res;
|
|
+ }
|
|
+
|
|
+ if (column == -1) {
|
|
+ int max_rows = viewport()->height() / dy;
|
|
+ int delta = 0;
|
|
+ QPoint res;
|
|
+ do {
|
|
+ delta++;
|
|
+ res = findPlaceForIconRow(row + (delta / 2) * (-2 * (delta % 2) + 1),
|
|
+ dx, dy);
|
|
+ if (delta / 2 > QMAX(max_rows - row, row))
|
|
+ return res;
|
|
+ } while (res.isNull());
|
|
+ return res;
|
|
+ }
|
|
+
|
|
+ // very unlikely - if I may add that
|
|
+ return QPoint(0, 0);
|
|
+}
|
|
+
|
|
void KDIconView::saveIconPositions()
|
|
{
|
|
kdDebug(1214) << "KDIconView::saveIconPositions" << endl;
|
|
@@ -1665,4 +1760,11 @@ void KDIconView::saveIconPositions()
|
|
m_dotDirectory->sync();
|
|
}
|
|
|
|
+void KDIconView::update( const QString &_url )
|
|
+{
|
|
+ if (m_dirLister)
|
|
+ m_dirLister->updateDirectory( _url );
|
|
+}
|
|
+
|
|
+
|
|
#include "kdiconview.moc"
|
|
Index: kdesktop/kdiconview.h
|
|
===================================================================
|
|
--- kdesktop/kdiconview.h.orig
|
|
+++ kdesktop/kdiconview.h
|
|
@@ -73,6 +73,8 @@ public:
|
|
|
|
QStringList selectedURLs();
|
|
|
|
+ void update( const QString &url );
|
|
+
|
|
/**
|
|
* Save the icon positions
|
|
*/
|
|
@@ -103,6 +105,10 @@ public:
|
|
|
|
void startDirLister();
|
|
|
|
+ QPoint findPlaceForIconCol( int column, int dx, int dy );
|
|
+ QPoint findPlaceForIconRow( int row, int dx, int dy );
|
|
+ QPoint findPlaceForIcon( int column, int row );
|
|
+
|
|
protected slots:
|
|
|
|
// slots connected to the icon view
|
|
@@ -112,8 +118,9 @@ protected slots:
|
|
void slotMouseButtonClickedKDesktop(int _button, QIconViewItem* _item, const QPoint& _global);
|
|
void slotContextMenuRequested(QIconViewItem* _item, const QPoint& _global);
|
|
void slotEnableAction( const char * name, bool enabled );
|
|
+public slots:
|
|
void slotAboutToCreate(const QPoint &pos, const QValueList<KIO::CopyInfo> &files);
|
|
-
|
|
+protected slots:
|
|
void slotItemRenamed(QIconViewItem*, const QString &name);
|
|
|
|
// slots connected to the directory lister
|