/usr/share/pyshared/etk/docking/dnd.py is in python-etk.docking 0.2-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 | # -*- coding: utf-8 -*-
# vim:sw=4:et:ai
# Copyright © 2010 etk.docking Contributors
#
# This file is part of etk.docking.
#
# etk.docking is free software: you can redistribute it and/or modify
# it under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# etk.docking is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public License
# along with etk.docking. If not, see <http://www.gnu.org/licenses/>.
from __future__ import absolute_import
from logging import getLogger
import gtk
import gtk.gdk as gdk
DRAG_TARGET_ITEM_LIST = ('x-etk-docking/item-list', gtk.TARGET_SAME_APP, 0)
class DockDragContext(object):
'''
As we can't reliably use drag_source_set to initiate a drag operation
(there's just to much information locked away in C structs - GtkDragSourceSite,
GtkDragSourceInfo, GtkDragDestSite, GtkDragDestInfo, ... - that are not
exposed to Python), we are sadly forced to mimic some of that default behavior.
This class is also used to store extra information about a drag operation
in progress not available in the C structs mentioned above.
'''
__slots__ = ['dragging', # are we dragging or not (bool)
'dragged_object', # object being dragged
'source_x', # x coordinate starting a potential drag
'source_y', # y coordinate starting a potential drag
'source_button', # the button the user pressed to start the drag
'offset_x', # cursor x offset relative to dragged object source_x
'offset_y'] # cursor y offset relative to dragged object source_y
def __init__(self):
self.reset()
def reset(self):
self.dragging = False
self.dragged_object = None
self.source_x = None
self.source_y = None
self.source_button = None
self.offset_x = None
self.offset_y = None
class Placeholder(gtk.DrawingArea):
__gtype_name__ = 'EtkDockPlaceholder'
def do_expose_event(self, expose):
a = self.allocation
c = self.window.cairo_create()
c.set_source_rgb(0, 0, 0)
c.set_line_width(1.0)
c.rectangle(0.5, 0.5, a.width - 1, a.height - 1)
#c.set_source_rgba(0, 0, 0, 0)
#c.fill()
c.stroke()
class PlaceHolderWindow(gtk.Window):
'''
The etk.dnd.PlaceHolderWindow is a gtk.Window that can highlight an area
on screen. When a PlaceHolderWindow has no child widget an undecorated
utility popup is shown drawing a transparent highlighting rectangle around
the desired area. The location and size of the highlight rectangle can
easily be updated with the move_resize method. The show and hide methods
do as they suggest.
When you add a child widget to the PlaceHolderWindow the utility popup is
automatically decorated (get's a title bar) and removes it's transparency.
This is used by the drag and drop implementation to mark a valid destination
for the drag and drop operation while dragging and as the container window
for teared off floating items.
'''
__gtype_name__ = 'EtkDockPlaceHolderWindow'
def __init__(self):
gtk.Window.__init__(self, gtk.WINDOW_POPUP)
self.set_decorated(False)
self.set_skip_taskbar_hint(True)
self.set_type_hint(gdk.WINDOW_TYPE_HINT_UTILITY)
#TODO: self.set_transient_for(???.get_toplevel())
# Initialize logging
self.log = getLogger('%s.%s' % (self.__gtype_name__, hex(id(self))))
# Internal housekeeping
self._gc = None
def _create_shape(self, width, height):
black = gdk.Color(red=0, green=0, blue=0, pixel=1)
white = gdk.Color(red=255, green=255, blue=255, pixel=0)
pm = gdk.Pixmap(self.window, width, height, 1)
gc = gdk.GC(pm)
gc.set_background(white)
gc.set_foreground(white)
pm.draw_rectangle(gc, True, 0, 0, width, height)
gc.set_foreground(black)
pm.draw_rectangle(gc, False, 0, 0, width - 1, height - 1)
pm.draw_rectangle(gc, False, 1, 1, width - 3, height - 3)
self.shape_combine_mask(pm, 0, 0)
############################################################################
# GtkWidget
############################################################################
def do_realize(self):
gtk.Window.do_realize(self)
self._gc = self.style.bg_gc[gtk.STATE_SELECTED]
def do_unrealize(self):
self._gc = None
gtk.Window.do_unrealize(self)
def do_size_allocate(self, allocation):
self.log.debug('%s' % allocation)
gtk.Window.do_size_allocate(self, allocation)
self._create_shape(allocation.width, allocation.height)
def do_expose_event(self, event):
self.log.debug('%s' % event)
gtk.Window.do_expose_event(self, event)
width, height = self.get_size()
self.window.draw_rectangle(self._gc, False, 0, 0, width-1, height-1)
self.window.draw_rectangle(self._gc, False, 1, 1, width-3, height-3)
return True
############################################################################
# GtkContainer
############################################################################
def do_add(self, widget):
self.set_decorated(True)
self.reset_shapes()
gtk.Window.add(self, widget)
############################################################################
# EtkPlaceHolderWindow
############################################################################
def move_resize(self, x, y, width, height):
self.log.debug('%s, %s, %s, %s' % (x, y, width, height))
self.move(x, y)
self.resize(width, height)
|