-
Notifications
You must be signed in to change notification settings - Fork 0
/
windowpile.py
118 lines (86 loc) · 3.22 KB
/
windowpile.py
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
"""Module contains WindowPile class - a brainy group of ManagedWindows, and
affiliated exceptions."""
# Standard imports
# none yet
# Third party imports
#import gtk
#import wnck
# Internal imports
from managedwindow import WindowNotManagedError
class PileError(Exception):
"""Base class for Pile-related exceptions."""
def __init__(self, msg):
Exception.__init__(self, msg)
class AlreadyPiledError(PileError):
"""Exception raised when attempting to add a window to a pile that has
been registered to another pile."""
def __init__(self, new_pile, window):
self.new_pile = new_pile
self.window = window
self.current_pile = window.pile
self.window_name = window.name
PileError.__init__(self, "Window: '" + self.window_name + "', Pile: '"
+ self.current_pile + "', Attempted new pile: '" +
self.new_pile + "'")
class NotYetPiledError(PileError):
"""Exception raised when attempting to reassign a window to a pile when
that window isn't yet assigned to a pile."""
def __init__(self, new_pile, window):
self.new_pile = new_pile
self.window = window
self.window_name = window.name
PileError.__init__(self, "Window: '" + self.window_name +
"', Attempted new pile: '" + self.new_pile + "'")
class NotMyChildError(PileError):
"""Exception raised when a pile is asked to handle signals or manipulate
its data regarding a window that it isn't responsible for."""
def __init__(self, wrong_pile, window):
self.wrong_pile = wrong_pile
self.window = window
self.window_name = window.name
self.actual_window_pile = window.pile
PileError.__init__(self, "Window: '" + self.window_name +
"', Attempted Pile: '" + wrong_pile + "', Actual pile: '" +
self.actual_window_pile + "'")
class WindowPile:
"""An collection of 0 or more ManagedWindows, manipulated as a group."""
def __init__(self, managedwindows=None):
self.mngd_windows = set()
if managedwindows != None:
# connect each of the given ManagedWindows to this pile.
for window in managedwindows:
self.add(window)
def add(self, window):
"""Add a window, not already assigned to a pile, to this pile."""
if window == None:
return
if not hasattr(window, "pile"):
raise WindowNotManagedError(window)
if not window.pile == None:
raise AlreadyPiledError(self, window)
window.register_pile(self)
self.mngd_windows.add(window)
def reassign(self, window):
"""Reassign a window already assigned to another pile to this pile."""
if not hasattr(window, "pile"):
raise WindowNotManagedError(window)
if window.pile == None:
raise NotYetPiledError(self, window)
window.pile.remove(window)
self.add(window)
def remove(self, window):
"""Remove a window from this pile, and unassign the window."""
if not hasattr(window, "pile"):
raise WindowNotManagedError(window)
if window.pile != self:
raise NotMyChildError(self, window)
if window not in self.mngd_windows:
raise NotMyChildError(self, window)
window.pile = None
self.mngd_windows.remove(window)
def update_child_icon(self, window):
"""Callback called by child window upon noticing its icon changed."""
pass
def update_child_name(self, window):
"""Callback called by child window upon noticing its name changed."""
pass