Russian Qt Forum

Qt => Общие вопросы => Тема начата: Авварон от Январь 07, 2010, 19:48



Название: драг & дроп наружу приложения
Отправлено: Авварон от Январь 07, 2010, 19:48
Дано - архив с файлами. Нужно - отследить конец драга наружу приложения (допустим в эксплорер) и в этот момент произвести разархивацию файлов. Под виндой так работает винрар, под маком - вмваре, под линуксом - арк. Ковыряние сорцов арка мало чего дало, ибо не для средних умов.


Название: Re: драг & дроп наружу приложения
Отправлено: Rcus от Январь 07, 2010, 20:59
Как раз в арке то все просто
Код
C++ (Qt)
   //prepare the dbus-based drag/drop mimedata
   QMimeData *data = new QMimeData();
   data->setData("application/x-kde-dndextract",
                 QDBusConnection::sessionBus().baseService().toUtf8()
                );
 
Соответственно в сервисе есть объект /DndExtract который соответствует интерфейсу org.kde.DndExtract


Название: Re: драг & дроп наружу приложения
Отправлено: Авварон от Январь 07, 2010, 21:11
и что это делает? там еще дальше
Код:
    if (!noFallback)
        kiolist.populateMimeData(data);
    return data;
где вроде как запихиваются урлки... разъясни поподробней нафиг тут dbus


Название: Re: драг & дроп наружу приложения
Отправлено: Rcus от Январь 07, 2010, 21:27
Ну а для ответа на этот вопрос нужно apt-get source dolphin и погрепать на наличие dndextract
Код
C++ (Qt)
void DragAndDropHelper::dropUrls(const KFileItem& destItem,
                                const KUrl& destPath,
                                QDropEvent* event,
                                QWidget* widget)
{
   const bool dropToItem = !destItem.isNull() && (destItem.isDir() || destItem.isDesktopFile());
   const KUrl destination = dropToItem ? destItem.url() : destPath;
 
   const QMimeData* mimeData = event->mimeData();
   if (mimeData->hasFormat("application/x-kde-dndextract")) {
       QString remoteDBusClient = mimeData->data("application/x-kde-dndextract");
       QDBusMessage message = QDBusMessage::createMethodCall(remoteDBusClient, "/DndExtract",
                                                             "org.kde.DndExtract", "extractSelectedFilesTo");
       message.setArguments(QVariantList() << destination.path());
       QDBusConnection::sessionBus().call(message);
   } else {
       const KUrl::List urls = KUrl::List::fromMimeData(event->mimeData());
       const int urlsCount = urls.count();
       if (urlsCount == 0) {
           // TODO: handle dropping of other data
       } else if ((urlsCount == 1) && (urls.first() == destination)) {
           emit errorMessage(i18nc("@info:status", "A folder cannot be dropped into itself"));
       } else if (dropToItem) {
           KonqOperations::doDrop(destItem, destination, event, widget);
       } else {
           KonqOperations::doDrop(KFileItem(), destination, event, widget);
       }
   }
}
 


Название: Re: драг & дроп наружу приложения
Отправлено: Авварон от Январь 07, 2010, 21:30
а как же дроп в конкерор и боже упаси наутилус?


Название: Re: драг & дроп наружу приложения
Отправлено: Rcus от Январь 07, 2010, 21:54
Наутилус? (поставил - никак) Конк скорее всего через KIO прогоняет URL - в нем достаточно информации: формат архива в схеме и полный путь к архиву и файлу в архиве.


Название: Re: драг & дроп наружу приложения
Отправлено: Авварон от Январь 07, 2010, 22:16
мда, таки разработчики KDE криворуки:( ну хоошо, проблему-то как решать? все равно мне нужны винда и мак...


Название: Re: драг & дроп наружу приложения
Отправлено: Rcus от Январь 07, 2010, 22:33
Таки не надо инсинуаций, в каких X11 средах с этим лучше? KDE и Gnome только недавно договорились о едином программном интерфейсе для уведомлений...
Дальше я копать не буду, на самом деле реализация DnD совсем далеко от моего рабочего профиля, а тут мне просто интересно было почитать исходники.


Название: Re: драг & дроп наружу приложения
Отправлено: Авварон от Январь 10, 2010, 14:49
ап... любители винапи, где вы?:)


Название: Re: драг & дроп наружу приложения
Отправлено: Tonal от Январь 13, 2010, 08:27
В винде при операциях с клипбоардом можно не отдавать данные сразу. Тогда как только они кому-то понадобятся, тебе прилетит сообщение:
http://msdn.microsoft.com/en-us/library/ms649016%28VS.85%29.aspx
http://msdn.microsoft.com/en-us/library/ms649051%28VS.85%29.aspx
http://msdn.microsoft.com/en-us/library/ms649016%28VS.85%29.aspx#_win32_Processing_the_WM_RENDERFORMAT_and_WM_RENDERALLFORMATS_Messages

А в случае тащибросая работа идёт с набором комовских классов. За данные отвечает IDataObject (http://msdn.microsoft.com/en-us/library/ms688421%28VS.85%29.aspx), за процесс IDropSource (http://msdn.microsoft.com/en-us/library/ms690071%28VS.85%29.aspx) и IDropTarget (http://msdn.microsoft.com/en-us/library/ms679679%28VS.85%29.aspx).
Описание самого процесса для файлов: Transferring Shell Objects with Drag-and-Drop and the Clipboard (http://msdn.microsoft.com/en-us/library/bb776905%28VS.85%29.aspx)


Название: Re: драг & дроп наружу приложения
Отправлено: Авварон от Январь 13, 2010, 17:23
ага, спасибо, учитаюсь:) Если что непонятно, спрошу)
теперь под макось бы:)