PyGObject: перетаскивание с помощью панели инструментов - PullRequest
0 голосов
/ 21 февраля 2019

Мне удалось настроить перетаскивание из Gtk.ToolPalette, но только при установке Gtk.ToolButton.set_use_drag_window(True).Однако при нажатии на ToolButton, чтобы перетащить его, это не приводит к визуальному нажатию кнопки.Я понимаю, что это потому, что set_use_drag_window вызывает перехват всех событий (даже нажатий кнопок) как событие перетаскивания.

В документах говорится, что самый простой способ использовать перетаскивание с помощью Gtk.ToolPalette - вызывать Gtk.ToolPalette.add_drag_dest() с нужной палитрой источника перетаскивания и нужным виджетом цели перетаскивания.Это своего рода противоположность того, что мне нужно, в зависимости от сложности приложения с графическим интерфейсом, поскольку мне нужно настроить ToolPalette и затем добавить обратный вызов к источнику перетаскивания после создания DrawingArea.

Я унаследовализ Gtk.TooPalette, создала Gtk.ToolItemGroup для каждого раздела палитры, а затем я создаю кнопки:

def toolbox_button(self, action_name, stock_id):
    button = Gtk.ToolButton.new_from_stock(stock_id)
    button.action_name = action_name
    button.set_use_drag_window(True)

    # Enable Drag and Drop
    button.drag_source_set(
        Gdk.ModifierType.BUTTON1_MASK,
        self.DND_TARGETS,
        Gdk.DragAction.COPY | Gdk.DragAction.LINK,
    )
    button.drag_source_set_icon_stock(stock_id)
    button.connect("drag-data-get", self._button_drag_data_get)

    return button

В DrawingArea я затем делаю его перетаскиванием dest:

    view.drag_dest_set(
        Gtk.DestDefaults.MOTION,
        DiagramPage.VIEW_DND_TARGETS,
        Gdk.DragAction.MOVE | Gdk.DragAction.COPY | Gdk.DragAction.LINK,
    )

Есть ли способ заставить перетаскивать работать с ToolPalette, при этом позволяя кнопкам работать нормально?

1 Ответ

0 голосов
/ 30 марта 2019

Мой коллега покопался в исходном коде GTK и выяснил, что Gtk.ToggleToolButton на самом деле имеет дочернюю кнопку, которая в настоящее время не документирована.Перетаскивание работает, если вы установите источник перетаскивания на эту «внутреннюю кнопку».

def toolbox_button(action_name, stock_id, label, shortcut):
    button = Gtk.ToggleToolButton.new()
    button.set_icon_name(stock_id)
    button.action_name = action_name
    if label:
        button.set_tooltip_text("%s (%s)" % (label, shortcut))

    # Enable Drag and Drop
    inner_button = button.get_children()[0]
    inner_button.drag_source_set(
        Gdk.ModifierType.BUTTON1_MASK | Gdk.ModifierType.BUTTON3_MASK,
        self.DND_TARGETS,
        Gdk.DragAction.COPY | Gdk.DragAction.LINK,
    )
    inner_button.drag_source_set_icon_stock(stock_id)
    inner_button.connect(
        "drag-data-get", self._button_drag_data_get, action_name
    )

    return button
...