Merge lp:~mblayman/entertainer/working-sdist into lp:entertainer/future

Proposed by Matt Layman
Status: Merged
Approved by: Paul Hummer
Approved revision: 413
Merged at revision: not available
Proposed branch: lp:~mblayman/entertainer/working-sdist
Merge into: lp:entertainer/future
Diff against target: None lines
To merge this branch: bzr merge lp:~mblayman/entertainer/working-sdist
Reviewer Review Type Date Requested Status
Paul Hummer Approve
Review via email: mp+11261@code.launchpad.net
To post a comment you must log in.
Revision history for this message
Matt Layman (mblayman) wrote :

Dependent on fix-setup-for-2.6.

I found out that python setup.py sdist was broken. All sorts of stuff was missing from the source tarball that would be needed to install Entertainer from that tarball. I fixed it along with fixing a bug that I introduced when I moved themes out of cfg.

Revision history for this message
Paul Hummer (rockstar) :
review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'MANIFEST.in'
2--- MANIFEST.in 2008-10-05 17:11:31 +0000
3+++ MANIFEST.in 2009-09-05 13:58:02 +0000
4@@ -1,3 +1,10 @@
5 include entertainer*
6+include docs/COPYING docs/DEPENDENCIES
7+include docs/entertainer.1 docs/entertainer.desktop
8 recursive-include cfg *
9+recursive-include entertainerlib *
10+recursive-include icons *
11+recursive-include themes *
12+recursive-include tools *
13+global-exclude *pyc
14
15
16=== added file 'README'
17--- README 1970-01-01 00:00:00 +0000
18+++ README 2009-09-05 13:58:02 +0000
19@@ -0,0 +1,6 @@
20+To install Entertainer, run:
21+
22+python setup.py install
23+
24+For information on how to contribute, read docs/HACKING.
25+
26
27=== modified file 'cfg/content.conf'
28--- cfg/content.conf 2009-05-31 17:11:16 +0000
29+++ cfg/content.conf 2009-08-16 22:19:22 +0000
30@@ -1,26 +1,34 @@
31 # Copyright (c) 2009 Entertainer Developers - See COPYING - GPLv2
32-[Images]
33-folders =
34-display_hidden_files_folders = False
35+[Media]
36+download_lyrics = False
37+download_album_art = True
38+download_metadata = True
39+display_eject_in_menu = False
40+folders =
41
42 [Weather]
43 location = Bath,England
44 display_in_menu = True
45-metric_units = True
46-
47-[Music]
48-folders =
49-download_lyrics = False
50-download_album_art = True
51-
52-[Videos]
53-folders =
54-download_metadata = True
55
56 [RSS]
57-feeds = http://theironlion.net/feeds/blog;http://www.joshuascotton.com/main/archives/tag/entertainer/feed;http://laymanstermsdev.wordpress.com/feed
58+feeds = http://theironlion.net/blog/feed;http://www.joshuascotton.com/main/archives/tag/entertainer/feed;http://laymanstermsdev.wordpress.com/feed
59 fetch_interval = 15
60
61 [CD]
62 display_eject_in_menu = False
63
64+[Photographs]
65+slideshow_step = 5
66+
67+[General]
68+stage_width = 1366
69+stage_height = 768
70+show_effects = True
71+start_in_fullscreen = True
72+theme = Default
73+backend_port = 45054
74+history_size = 8
75+transition_effect = Slide
76+start_server_auto = True
77+display_icon = False
78+
79
80=== removed file 'cfg/preferences.conf'
81--- cfg/preferences.conf 2009-05-06 03:40:22 +0000
82+++ cfg/preferences.conf 1970-01-01 00:00:00 +0000
83@@ -1,16 +0,0 @@
84-# Copyright (c) 2009 Entertainer Developers - See COPYING - GPLv2
85-[Photographs]
86-slideshow_step = 5
87-
88-[General]
89-stage_width = 1366
90-stage_height = 768
91-show_effects = True
92-start_in_fullscreen = True
93-theme = Default
94-backend_port = 45054
95-history_size = 8
96-transition_effect = Slide
97-start_server_auto = True
98-display_icon = False
99-
100
101=== modified file 'docs/DEPENDENCIES'
102--- docs/DEPENDENCIES 2009-05-09 19:08:39 +0000
103+++ docs/DEPENDENCIES 2009-08-25 02:51:36 +0000
104@@ -14,3 +14,4 @@
105 python-pyvorbis
106 python-storm
107 python-twisted
108+python-xdg
109
110=== renamed file 'entertainer-content-manager' => 'entertainer-manager'
111--- entertainer-content-manager 2009-05-10 17:36:49 +0000
112+++ entertainer-manager 2009-08-23 01:01:18 +0000
113@@ -1,14 +1,14 @@
114 #!/usr/bin/env python
115 # Copyright (c) 2009 Entertainer Developers - See COPYING - GPLv2
116-'''Content Management executable'''
117+'''Manager executable'''
118
119 import gtk
120
121 from entertainerlib.client.translation_setup import TranslationSetup
122 TranslationSetup()
123
124-from entertainerlib.dialog import ContentManagementDialog
125-
126-
127-ContentManagementDialog(True)
128+from entertainerlib.dialog import ManagerDialog
129+
130+
131+ManagerDialog(True)
132 gtk.main()
133
134=== removed file 'entertainer-preferences'
135--- entertainer-preferences 2009-05-10 17:36:49 +0000
136+++ entertainer-preferences 1970-01-01 00:00:00 +0000
137@@ -1,14 +0,0 @@
138-#!/usr/bin/env python
139-# Copyright (c) 2009 Entertainer Developers - See COPYING - GPLv2
140-'''A preferences editing tool'''
141-
142-import gtk
143-
144-from entertainerlib.client.translation_setup import TranslationSetup
145-TranslationSetup()
146-
147-from entertainerlib.dialog import PreferencesDialog
148-
149-
150-PreferencesDialog(True)
151-gtk.main()
152
153=== modified file 'entertainerlib/backend/backend_server.py'
154--- entertainerlib/backend/backend_server.py 2009-05-10 17:36:49 +0000
155+++ entertainerlib/backend/backend_server.py 2009-08-23 01:16:18 +0000
156@@ -39,18 +39,13 @@
157 self.config = Configuration()
158 self.logger = Logger().getLogger('backend.BackendServer')
159 self.message_bus = MessageBus()
160- self._port = self.config.get_port()
161+ self._port = self.config.port
162
163 # Connection server - Thread that listens incoming socket connections
164 self.connection_server = None
165
166- # Config files
167- self.content_config = None
168- self.preferences = None
169-
170 self.scheduler = None
171 self.feed_manager = None
172- self.guide_updater = None
173 self.media_manager = None
174
175 # The order of the initialize method calls is significant! Don't change
176@@ -65,15 +60,13 @@
177 """Initialize configuration"""
178 cfg_dict = {
179 MessageType.CONTENT_CONF_UPDATED : MessagePriority.VERY_HIGH,
180- MessageType.PREFERENCES_CONF_UPDATED : MessagePriority.VERY_HIGH
181 }
182 self.message_bus.registerMessageHandler(self.config, cfg_dict)
183 self.logger.debug("Configuration intialized successfully")
184
185 def initialize_connection_server(self):
186 """Initialize connection server."""
187- self.connection_server = ConnectionServer(self._port,
188- self.message_bus)
189+ self.connection_server = ConnectionServer(self._port, self.message_bus)
190 # Start listening incoming connections
191 self.connection_server.start()
192
193@@ -81,7 +74,7 @@
194 """Initialize message scheduler."""
195 self.scheduler = MessageScheduler(self.message_bus)
196 self.scheduler.addMessage(Message(MessageType.UPDATE_FEEDS),
197- 60 * self.config.get_feed_fetch_interval())
198+ 60 * self.config.feed_fetch_interval)
199 self.logger.debug("Message scheduler intialized successfully")
200
201 def initialize_feed_manager(self):
202
203=== modified file 'entertainerlib/backend/components/feeds/feed_manager.py'
204--- entertainerlib/backend/components/feeds/feed_manager.py 2009-05-10 17:36:49 +0000
205+++ entertainerlib/backend/components/feeds/feed_manager.py 2009-08-16 23:01:49 +0000
206@@ -35,8 +35,7 @@
207 Update all feeds to cache in a new thread and after
208 that emit FEED_DB_UPDATED message to the messagebus.
209 """
210- fetch_thread = FeedFetcher(self.message_bus,
211- self.config.get_feeds())
212+ fetch_thread = FeedFetcher(self.message_bus, self.config.feeds)
213 fetch_thread.start()
214
215 def createFeedCacheDatabase(self):
216
217=== modified file 'entertainerlib/backend/components/mediacache/image_cache.py'
218--- entertainerlib/backend/components/mediacache/image_cache.py 2009-06-30 01:06:01 +0000
219+++ entertainerlib/backend/components/mediacache/image_cache.py 2009-08-16 18:51:06 +0000
220@@ -117,15 +117,13 @@
221 "Path doesn't exist: " + path)
222 else:
223 for root, dirs, files in os.walk(path):
224- if os.path.split(root)[-1][0] == "." and not \
225- self.config.display_hidden_files_folders():
226+ if os.path.split(root)[-1][0] == ".":
227 continue
228 if not self.isDirectoryInCache(root):
229 self._addAlbum(root)
230
231 for name in files:
232- if os.path.split(name)[-1][0] == "." and not \
233- self.config.display_hidden_files_folders():
234+ if os.path.split(name)[-1][0] == ".":
235 continue
236 if self.isSupportedFormat(name):
237 self.addFile(os.path.join(root, name))
238
239=== modified file 'entertainerlib/backend/components/mediacache/media_cache_manager.py'
240--- entertainerlib/backend/components/mediacache/media_cache_manager.py 2009-05-10 17:36:49 +0000
241+++ entertainerlib/backend/components/mediacache/media_cache_manager.py 2009-08-16 22:19:22 +0000
242@@ -23,11 +23,11 @@
243 self.logger = Logger().getLogger(
244 'backend.components.mediacache.MediaCacheManager')
245 self.config = Configuration()
246- self.video_folders = self.config.get_video_folders()
247+ self.video_folders = self.config.media_folders
248 self._index_videos(self.video_folders)
249- self.music_folders = self.config.get_music_folders()
250+ self.music_folders = self.config.media_folders
251 self._index_music(self.music_folders)
252- self.image_folders = self.config.get_image_folders()
253+ self.image_folders = self.config.media_folders
254 self._index_images(self.image_folders)
255
256 # Should we rebuild to detect files that were removed while backend was
257@@ -104,9 +104,9 @@
258 we need to index them. If folders are removed, we need to remove
259 them from the cache and also from FileSystemObeserver.
260 """
261- updated_video_folders = self.config.get_video_folders()
262- updated_music_folders = self.config.get_music_folders()
263- updated_image_folders = self.config.get_image_folders()
264+ updated_video_folders = self.config.media_folders
265+ updated_music_folders = self.config.media_folders
266+ updated_image_folders = self.config.media_folders
267
268 # Handle image folder changes
269 current_images = set(self.image_folders)
270
271=== modified file 'entertainerlib/backend/components/mediacache/music_cache.py'
272--- entertainerlib/backend/components/mediacache/music_cache.py 2009-05-10 17:36:49 +0000
273+++ entertainerlib/backend/components/mediacache/music_cache.py 2009-08-18 02:50:40 +0000
274@@ -433,7 +433,7 @@
275 album_art_file)
276 # Local not found -> try internet
277 else:
278- if self.config.download_album_art():
279+ if self.config.download_album_art:
280 if album != "Unknown album" and artist != "Unknown Artist":
281 loader_thread = AlbumArtDownloader(album, artist,
282 self.config.ALBUM_ART_DIR)
283
284=== modified file 'entertainerlib/backend/components/mediacache/video_cache.py'
285--- entertainerlib/backend/components/mediacache/video_cache.py 2009-05-10 17:36:49 +0000
286+++ entertainerlib/backend/components/mediacache/video_cache.py 2009-08-18 02:45:02 +0000
287@@ -243,7 +243,7 @@
288 VALUES (:fn)""",
289 { "fn" : filename } )
290 self.__db_conn.commit()
291- if self.config.download_video_metadata():
292+ if self.config.download_metadata:
293 self.__searchMetadata(filename)
294
295 def __searchMetadata(self, filename):
296
297=== modified file 'entertainerlib/backend/core/message_bus_proxy.py'
298--- entertainerlib/backend/core/message_bus_proxy.py 2009-05-10 17:36:49 +0000
299+++ entertainerlib/backend/core/message_bus_proxy.py 2009-08-16 22:03:14 +0000
300@@ -57,7 +57,7 @@
301 MessageHandler.
302 """
303 # Open socket
304- self.socket_to_server.connect(('localhost', self.config.get_port()))
305+ self.socket_to_server.connect(('localhost', self.config.port))
306
307 # Send client name
308 self.socket_to_server.sendall(self.client_name + "\n")
309
310=== modified file 'entertainerlib/backend/core/message_type_priority.py'
311--- entertainerlib/backend/core/message_type_priority.py 2009-05-10 17:36:49 +0000
312+++ entertainerlib/backend/core/message_type_priority.py 2009-08-23 01:16:18 +0000
313@@ -25,7 +25,7 @@
314 """
315
316 # Indicates that Preferences UI has been used to update preferences.
317- PREFERENCES_CONF_UPDATED = 0
318+ NOT_USED_7 = 0
319
320 # Indicates that Content Management UI has been used to update contents.
321 CONTENT_CONF_UPDATED = 1
322
323=== modified file 'entertainerlib/client/__init__.py'
324--- entertainerlib/client/__init__.py 2009-05-10 17:36:49 +0000
325+++ entertainerlib/client/__init__.py 2009-08-21 01:55:09 +0000
326@@ -27,7 +27,7 @@
327 clutter.threads_init()
328
329 config = Configuration()
330- if config.start_auto_server():
331+ if config.start_auto_server:
332 print "Entertainer backend starting..."
333 BackendServer()
334
335
336=== modified file 'entertainerlib/client/backend_connection.py'
337--- entertainerlib/client/backend_connection.py 2009-05-06 02:58:08 +0000
338+++ entertainerlib/client/backend_connection.py 2009-08-23 01:16:18 +0000
339@@ -16,7 +16,6 @@
340 """Initialize connection. Connects to backend."""
341 #messages = {
342 # MessageType.CONTENT_CONF_UPDATED : MessagePriority.NORMAL,
343- # MessageType.PREFERENCES_CONF_UPDATED : MessagePriority.NORMAL,
344 # MessageType.FEED_DB_UPDATED : MessagePriority.HIGH }
345 # XXX: rockstar - The messages above are the "real" messages, and I'm
346 # not sure why they are commented out. Anyone?
347@@ -48,8 +47,6 @@
348 """Handle received messages. (Implements MessageHandler interface)"""
349 if message.get_type() == MessageType.CONTENT_CONF_UPDATED:
350 pass
351- elif message.get_type() == MessageType.PREFERENCES_CONF_UPDATED:
352- pass
353 elif message.get_type() == MessageType.FEED_DB_UPDATED:
354 pass
355
356
357=== modified file 'entertainerlib/client/client.py'
358--- entertainerlib/client/client.py 2009-05-10 17:47:23 +0000
359+++ entertainerlib/client/client.py 2009-08-16 21:53:22 +0000
360@@ -50,7 +50,7 @@
361 feed_library, image_library, music_library, video_library,
362 self.quit_client)
363
364- if config.tray_icon_enabled():
365+ if config.tray_icon_enabled:
366 SystemTrayIcon(
367 self.quit_client, self.toggle_interface_visibility)
368
369
370=== modified file 'entertainerlib/client/medialibrary/videos.py'
371--- entertainerlib/client/medialibrary/videos.py 2009-05-10 17:36:49 +0000
372+++ entertainerlib/client/medialibrary/videos.py 2009-08-16 21:48:15 +0000
373@@ -220,12 +220,12 @@
374 else:
375 self.logger.error("Thumbnail does not exist for " + \
376 self.get_filename() + ", using default art instead")
377- return os.path.join(self.config.get_theme_path(),
378+ return os.path.join(self.config.theme_path,
379 "images/default_movie_art.png")
380 else:
381 self.logger.error("Thumbnail does not exist for " + \
382 self.get_filename() + ", using default art instead")
383- return os.path.join(self.config.get_theme_path(),
384+ return os.path.join(self.config.theme_path,
385 "images/default_movie_art.png")
386
387 def has_thumbnail(self):
388
389=== modified file 'entertainerlib/client/translation_setup.py'
390--- entertainerlib/client/translation_setup.py 2009-07-26 07:59:56 +0000
391+++ entertainerlib/client/translation_setup.py 2009-08-28 02:38:48 +0000
392@@ -6,33 +6,37 @@
393 import gettext
394 import gtk
395 import gtk.glade
396-
397-TRANSLATION_SOURCE = {
398- 'branch' : os.path.abspath(os.path.dirname(__file__) + '/../../locale'),
399- # Hardcoded path for a package install
400- 'package' : "/usr/share/locale"
401- }
402+from xdg import BaseDirectory
403
404 class TranslationSetup:
405 def __init__(self):
406+ '''Because of how early translation setup has to occur. This should be
407+ the only file outside of Configuration that imports xdg.'''
408+
409+ def install_locale(locale_dir):
410+ '''Install locale data from the provided directory.'''
411+ # This sets up the _ function
412+ gettext.install('entertainer', locale_dir)
413+
414+ # This sets up the glade translations
415+ gtk.glade.bindtextdomain('entertainer', locale_dir)
416+
417 # Find locale data from a dev branch if we can
418- if os.path.exists(TRANSLATION_SOURCE['branch']):
419- #This setups the _ function
420- gettext.install('entertainer', TRANSLATION_SOURCE['branch'])
421-
422- #This setups the glade translations
423- gtk.glade.bindtextdomain('entertainer',
424- TRANSLATION_SOURCE['branch'])
425- # Install locale data from the hardcoded package path
426- elif os.path.exists(TRANSLATION_SOURCE['package']):
427- #This setups the _ function
428- gettext.install('entertainer', TRANSLATION_SOURCE['package'])
429-
430- #This setups the glade translations
431- gtk.glade.bindtextdomain('entertainer',
432- TRANSLATION_SOURCE['package'])
433+ dev_locale = os.path.abspath(os.path.dirname(__file__) +
434+ '/../../locale')
435+ if os.path.exists(dev_locale):
436+ install_locale(dev_locale)
437+
438+ # Install locale data from the system location
439 else:
440- pass
441+ system_data_dirs = [data_dir for data_dir in
442+ BaseDirectory.xdg_data_dirs if not
443+ data_dir.startswith(BaseDirectory.xdg_data_home)]
444+ # Since we don't know for certain where the mo files were installed,
445+ # we try to install from both /usr/share and /usr/local/share.
446+ for data_dir in system_data_dirs:
447+ system_locale = os.path.join(data_dir, 'locale')
448+ install_locale(system_locale)
449
450- gtk.glade.textdomain ('entertainer')
451+ gtk.glade.textdomain('entertainer')
452
453
454=== modified file 'entertainerlib/configuration.py'
455--- entertainerlib/configuration.py 2009-07-07 01:28:42 +0000
456+++ entertainerlib/configuration.py 2009-08-27 03:18:41 +0000
457@@ -2,35 +2,20 @@
458 '''Configuration - Class represents Entertainer's configuration'''
459
460 import os
461-import sys
462 import shutil
463 import ConfigParser
464-from ConfigParser import ParsingError, NoSectionError, NoOptionError
465-
466+from ConfigParser import NoSectionError, NoOptionError
467+
468+from xdg import BaseDirectory
469+
470+from entertainerlib.backend.core.message_handler import MessageHandler
471 from entertainerlib.backend.core.message_type_priority import MessageType
472-from entertainerlib.backend.core.message_handler import MessageHandler
473 from entertainerlib.db.connection import Database
474-
475 from entertainerlib.gui.theme import Theme
476
477-SOURCE_CONFIG = {
478- 'branch' : os.path.abspath(os.path.dirname(__file__) + '/../cfg'),
479- # Hardcoded path for a package install
480- 'package' : "/usr/share/entertainer/cfg"
481- }
482-
483 class Configuration(MessageHandler):
484- """
485- Configuration of Entertainer
486-
487- This class is an interface to all configuration parameters. All components
488- of Entertainer should get configuration values through this class. Object
489- from this class reads current config files and returns values based on
490- those files. If there are missing lines or other errors in config file,
491- then object return default values defined in this class.
492- """
493-
494- CFG_DIR = os.path.expanduser("~/.config/entertainer")
495+ '''Interface to all configuration parameters. All components of Entertainer
496+ should get configuration values through this class.'''
497
498 _shared_state = {}
499
500@@ -41,52 +26,35 @@
501 if not self._shared_state or test_dir is not None:
502 # Set in a production mode or a test mode
503 if test_dir is None:
504- self.cfg_dir = self.CFG_DIR
505+ self.resources = Resources()
506 else:
507- self.cfg_dir = test_dir
508-
509- if not os.path.exists(os.path.expanduser(self.cfg_dir)):
510- self.create_cfg_dir()
511-
512- self.ENTERTAINER_LOG = os.path.join(self.cfg_dir,
513- u'entertainer.log')
514-
515- self.MEDIA_DB = Database(os.path.join(self.cfg_dir, 'cache/media'))
516-
517- self.FEED_DB = os.path.join(self.cfg_dir, 'cache/feed.db')
518- self.IMAGE_DB = os.path.join(self.cfg_dir, 'cache/image.db')
519- self.MUSIC_DB = os.path.join(self.cfg_dir, 'cache/music.db')
520- self.VIDEO_DB = os.path.join(self.cfg_dir, 'cache/video.db')
521-
522- self.THUMB_DIR = os.path.join(self.cfg_dir, 'cache', 'thumbnails')
523+ self.resources = Resources(config_testing_dir=test_dir)
524+
525+ self.cache_dir = self.resources.cache_dir
526+ self.config_dir = self.resources.config_dir
527+ self.data_dir = self.resources.data_dir
528+
529+ self.LOG = os.path.join(self.cache_dir, u'entertainer.log')
530+
531+ self.MEDIA_DB = Database(os.path.join(self.cache_dir, 'media'))
532+
533+ self.FEED_DB = os.path.join(self.cache_dir, 'feed.db')
534+ self.IMAGE_DB = os.path.join(self.cache_dir, 'image.db')
535+ self.MUSIC_DB = os.path.join(self.cache_dir, 'music.db')
536+ self.VIDEO_DB = os.path.join(self.cache_dir, 'video.db')
537+
538+ self.THUMB_DIR = os.path.join(self.cache_dir, 'thumbnails')
539 self.IMAGE_THUMB_DIR = os.path.join(self.THUMB_DIR, 'image')
540 self.VIDEO_THUMB_DIR = os.path.join(self.THUMB_DIR, 'video')
541- self.ALBUM_ART_DIR = os.path.join(self.cfg_dir, 'cache/album_art')
542- self.MOVIE_ART_DIR = os.path.join(self.cfg_dir, 'cache/movie_art')
543-
544- # Preferences file
545- self.preferences_conf = os.path.join(self.cfg_dir,
546- 'preferences.conf')
547-
548- # Content file
549- self.content_conf = os.path.join(self.cfg_dir, 'content.conf')
550-
551- self.content_config = ConfigParser.ConfigParser()
552- self.preferences = ConfigParser.ConfigParser()
553- try:
554- self.content_config.readfp(open(self.content_conf))
555- self.preferences.readfp(open(self.preferences_conf))
556- except ParsingError:
557- print("ParsingError with configuration file.")
558- sys.exit(1)
559- except IOError:
560- print("IOError: Couldn't read configuration file.")
561- sys.exit(1)
562-
563- self.theme = Theme(self.get_theme_path())
564-
565- self.stage_width = None
566- self.stage_height = None
567+ self.ALBUM_ART_DIR = os.path.join(self.cache_dir, 'album_art')
568+ self.MOVIE_ART_DIR = os.path.join(self.cache_dir, 'movie_art')
569+
570+ self.read_config_file()
571+
572+ self.theme = Theme(self.theme_path)
573+
574+ self._stage_width = None
575+ self._stage_height = None
576
577 # Network options specify the server type and extra options
578 self.network_options = {
579@@ -94,360 +62,157 @@
580 'host': 'localhost',
581 'port': 55545}
582
583- def create_cfg_dir(self):
584- '''Create a configuration directory and default config files.'''
585-
586- def create_cache_hierarchy(config_dir):
587- '''Create the directories needed for the cache'''
588- directories = [
589- 'cache',
590- 'cache/album_art',
591- 'cache/movie_art',
592- 'cache/thumbnails',
593- 'cache/thumbnails/image',
594- 'cache/thumbnails/video'
595- ]
596-
597- for directory in directories:
598- new_dir = os.path.join(config_dir, directory)
599- os.mkdir(new_dir)
600-
601- config_dir = self.get_cfg_dir()
602- try:
603- # Copy configuration data from a dev branch if we can
604- if os.path.exists(SOURCE_CONFIG['branch']):
605- shutil.copytree(SOURCE_CONFIG['branch'], config_dir)
606- create_cache_hierarchy(config_dir)
607- # Install configuration data from the hardcoded package path
608- elif os.path.exists(SOURCE_CONFIG['package']):
609- shutil.copytree(SOURCE_CONFIG['package'], config_dir)
610- create_cache_hierarchy(config_dir)
611- else:
612- print "Couldn't find configuration data. Execution aborted."
613- sys.exit(1)
614- except OSError:
615- print "Couldn't copy configuration data to %s. Execution aborted." \
616- % config_dir
617- sys.exit(1)
618+ def read_config_file(self):
619+ '''Read in the config file.'''
620+ self.content_conf = os.path.join(self.config_dir, 'content.conf')
621+ self.content = ConfigParser.ConfigParser()
622+ self.content.readfp(open(self.content_conf))
623
624 def update_configuration(self):
625- """
626- Read configuration files again and update this object.
627- """
628- try:
629- self.content_config.readfp(open(self.content_conf))
630- self.preferences.readfp(open(self.preferences_conf))
631- except ParsingError:
632- raise Exception("Syntax error in configuration file.")
633- except IOError:
634- raise IOError("Couldn't read config file.")
635+ '''Read configuration file again and update this object.'''
636+ self.content.readfp(open(self.content_conf))
637
638 def write_content_value(self, section, option, value):
639 """Write a new value to the content configuration file."""
640- try:
641- self.content_config.set(section, option, value)
642+
643+ def write_value(section, option, value):
644+ '''Actually write the value to the section and option.'''
645+ self.content.set(section, option, value)
646 cfg_file = file(self.content_conf, 'w')
647- self.content_config.write(cfg_file)
648+ self.content.write(cfg_file)
649+
650+ try:
651+ write_value(section, option, value)
652 except NoSectionError:
653- raise Exception("No Section to set in content.conf file")
654+ # Provide an upgrade path to additions of new sections.
655+ shutil.rmtree(self.config_dir)
656+ self.resources.create_configuration()
657+ self.read_config_file()
658+ write_value(section, option, value)
659 except NoOptionError:
660 raise Exception("No Option to set in content.conf file")
661
662- def write_preference_value(self, section, option, value):
663- """Write a new value to the preferences configuration file."""
664- try:
665- self.preferences.set(section, option, value)
666- cfg_file = file(self.preferences_conf, 'w')
667- self.preferences.write(cfg_file)
668- except NoSectionError:
669- raise Exception("No Section to set in preferences.conf file")
670- except NoOptionError:
671- raise Exception("No Option to set in preferences.conf file")
672-
673- def get_stage_width(self):
674- '''Get the stage width from the preferences'''
675- if self.stage_width:
676- return self.stage_width
677-
678- try:
679- self.stage_width = self.preferences.getint("General", "stage_width")
680- except (NoSectionError, NoOptionError):
681- self.stage_width = 1366 # Default
682-
683- return self.stage_width
684-
685- def set_stage_width(self, new_width):
686- '''Set the stage width for the in memory instance'''
687- self.stage_width = new_width
688-
689- def get_stage_height(self):
690- '''Get the stage height from the preferences'''
691- if self.stage_height:
692- return self.stage_height
693-
694- try:
695- self.stage_height = self.preferences.getint("General",
696- "stage_height")
697- except (NoSectionError, NoOptionError):
698- self.stage_height = 768 # Default
699-
700- return self.stage_height
701-
702- def set_stage_height(self, new_height):
703- '''Set the stage height for the in memory instance'''
704- self.stage_height = new_height
705-
706- def get_theme_path(self):
707- """
708- Get absolute path of the used theme.
709- @return: string (path)
710- """
711- theme_path = os.path.join(self.get_cfg_dir(), 'themes')
712- try:
713- theme = self.preferences.get("General", "theme")
714- except (NoSectionError, NoOptionError):
715- return os.path.join(theme_path, "Default")
716-
717- if os.path.exists(os.path.join(theme_path, theme)):
718- return os.path.join(theme_path, theme)
719- else:
720- return os.path.join(theme_path, "Default")
721-
722+ def _get_stage_width(self):
723+ '''stage_width property getter.'''
724+ if self._stage_width:
725+ return self._stage_width
726+
727+ self._stage_width = self.content.getint("General", "stage_width")
728+ return self._stage_width
729+
730+ def _set_stage_width(self, new_width):
731+ '''stage_width property setter.'''
732+ self._stage_width = new_width
733+
734+ stage_width = property(_get_stage_width, _set_stage_width)
735+
736+ def _get_stage_height(self):
737+ '''stage_height property getter.'''
738+ if self._stage_height:
739+ return self._stage_height
740+
741+ self._stage_height = self.content.getint("General", "stage_height")
742+ return self._stage_height
743+
744+ def _set_stage_height(self, new_height):
745+ '''stage_height property setter.'''
746+ self._stage_height = new_height
747+
748+ stage_height = property(_get_stage_height, _set_stage_height)
749+
750+ @property
751+ def theme_path(self):
752+ '''Path to the currently selected theme.'''
753+ theme_path = os.path.join(self.data_dir, 'themes')
754+ theme = self.content.get("General", "theme")
755+ return os.path.join(theme_path, theme)
756+
757+ @property
758 def tray_icon_enabled(self):
759- """
760- Display tray icon.
761- @return: boolean
762- """
763- try:
764- result = self.preferences.getboolean("General", "display_icon")
765- except (NoSectionError, NoOptionError):
766- return False
767- return result
768-
769- def get_feed_fetch_interval(self):
770- """
771- Get time interval (in minutes) for feed fetching.
772- @return: Integer
773- """
774- try:
775- result = self.content_config.getint("RSS", "fetch_interval")
776- except (NoSectionError, NoOptionError):
777- return 60 # Default is one hour
778- return result
779-
780- def get_port(self):
781- """
782- Get backend server's port number.
783- @return: Integer
784- """
785- try:
786- result = self.preferences.getint("General", "backend_port")
787- except (NoSectionError, NoOptionError):
788- return 45054 # Default port
789- return result
790-
791- def get_video_folders(self):
792- """
793- Get list of video folders
794- @return:String Array
795- """
796- try:
797- video_list = self.content_config.get("Videos", "folders")
798- result = self._is_valid_media_folder(video_list.split(';'))
799- except (NoSectionError, NoOptionError):
800- return []
801- return result
802-
803- def get_music_folders(self):
804- """
805- Get list of music folders
806- @return: String Array
807- """
808- try:
809- music_list = self.content_config.get("Music", "folders")
810- result = music_list.split(';')
811- except (NoSectionError, NoOptionError):
812- return []
813- return result
814-
815- def get_image_folders(self):
816- """
817- Get list of image folders
818- @return: String Array
819- """
820- try:
821- image_list = self.content_config.get("Images", "folders")
822- result = self._is_valid_media_folder(image_list.split(';'))
823- except (NoSectionError, NoOptionError):
824- return []
825- return result
826-
827- def get_feeds(self):
828- """
829- Get list of feeds.
830- @return: String Array
831- """
832- try:
833- rss_feeds = self.content_config.get("RSS", "feeds")
834- result = rss_feeds.split(';')
835- except (NoSectionError, NoOptionError):
836- return []
837- return result
838-
839- def get_weather_location(self):
840- """
841- Get list of weather location codes.
842- @return: List of strings
843- """
844- try:
845- location = self.content_config.get("Weather", "location")
846- except (NoSectionError, NoOptionError):
847- location = ''
848- return location
849-
850+ '''Boolean to indicate whether or not to show the tray icon.'''
851+ return self.content.getboolean("General", "display_icon")
852+
853+ @property
854+ def feed_fetch_interval(self):
855+ '''Time interval (in minutes) for feed fetching.'''
856+ return self.content.getint("RSS", "fetch_interval")
857+
858+ @property
859+ def port(self):
860+ '''Server's port number.'''
861+ return self.content.getint("General", "backend_port")
862+
863+ @property
864+ def media_folders(self):
865+ '''Return a list of folders for media.'''
866+ media = self.content.get("Media", "folders")
867+ return self._is_valid_media_folder(media.split(';'))
868+
869+ @property
870+ def feeds(self):
871+ '''List of feeds.'''
872+ rss_feeds = self.content.get("RSS", "feeds")
873+ return rss_feeds.split(';')
874+
875+ @property
876+ def weather_location(self):
877+ '''User's weather location.'''
878+ return self.content.get("Weather", "location")
879+
880+ @property
881 def display_weather_in_client(self):
882- """
883- Should we display weather in client
884- @return: Boolean
885- """
886- try:
887- result = self.content_config.getboolean("Weather",
888- "display_in_menu")
889- except (NoSectionError, NoOptionError):
890- return False
891- return result
892-
893- def display_cd_eject_in_client(self):
894- """
895- Should we display the cd eject button in client
896- @return: Boolean
897- """
898- try:
899- result = self.content_config.getboolean("CD",
900- "display_eject_in_menu")
901- except (NoSectionError, NoOptionError):
902- return False
903- return result
904-
905- def download_video_metadata(self):
906- """
907- Get True if video metadata should be downloaded, otherwise False
908- """
909- try:
910- result = self.content_config.getboolean("Videos",
911- "download_metadata")
912- except (NoSectionError, NoOptionError):
913- return False
914- return result
915-
916+ '''Boolean to tell if weather should be displayed.'''
917+ return self.content.getboolean("Weather", "display_in_menu")
918+
919+ @property
920+ def download_metadata(self):
921+ '''Boolean to tell if metadata should be downloaded.'''
922+ return self.content.getboolean("Media", "download_metadata")
923+
924+ @property
925 def download_album_art(self):
926- """
927- Download album art from the Internet.
928- @return: boolean
929- """
930- try:
931- result = self.content_config.getboolean("Music",
932- "download_album_art")
933- except (NoSectionError, NoOptionError):
934- return False
935- return result
936+ '''Boolean to tell if album art should be downloaded.'''
937+ return self.content.getboolean("Media", "download_album_art")
938
939+ @property
940 def download_lyrics(self):
941- """
942- Download song lyrics from the Internet.
943- @return: boolean
944- """
945- try:
946- result = self.content_config.getboolean("Music", "download_lyrics")
947- except (NoSectionError, NoOptionError):
948- return False
949- return result
950-
951- def display_hidden_files_folders(self):
952- """If True hidden files and folders will be added to image library."""
953- try:
954- result = self.content_config.getboolean("Images",
955- "display_hidden_files_folders")
956- except (NoSectionError, NoOptionError):
957- return False
958- return result
959-
960+ '''Boolean to tell if lyrics should be downloaded.'''
961+ return self.content.getboolean("Media", "download_lyrics")
962+
963+ @property
964 def show_effects(self):
965- """
966- Use animations on user interface.
967- @return: boolean
968- """
969- try:
970- result = self.preferences.getboolean("General", "show_effects")
971- except (NoSectionError, NoOptionError):
972- return False
973- return result
974+ '''Boolean to tell if effects should be shown.'''
975+ return self.content.getboolean("General", "show_effects")
976
977+ @property
978 def transition_effect(self):
979- """
980- Which transition effect should be used when switching screens.
981- @return: string (name of the effect)
982- """
983- try:
984- result = self.preferences.get("General", "transition_effect")
985- except (NoSectionError, NoOptionError):
986- return False
987- return result
988-
989- def get_theme_name(self):
990- """
991- Get the name of the current theme.
992- @return: string (theme name)
993- """
994- try:
995- result = self.preferences.get("General", "theme")
996- except (NoSectionError, NoOptionError):
997- result = "Default"
998- return result
999-
1000+ '''Internal name of the user's selected screen transition style.'''
1001+ return self.content.get("General", "transition_effect")
1002+
1003+ @property
1004+ def theme_name(self):
1005+ '''Name of the current theme.'''
1006+ return self.content.get("General", "theme")
1007+
1008+ @property
1009 def start_in_fullscreen(self):
1010 '''Boolean to determine whether to start in fullscreen mode or not.'''
1011- try:
1012- result = self.preferences.getboolean("General",
1013- "start_in_fullscreen")
1014- except (NoSectionError, NoOptionError):
1015- return True
1016- return result
1017+ return self.content.getboolean("General", "start_in_fullscreen")
1018
1019+ @property
1020 def start_auto_server(self):
1021- """
1022- Return True if backend server should auto start
1023- @return: boolean
1024- """
1025- try:
1026- result = self.preferences.getboolean("General",
1027- "start_server_auto")
1028- except (NoSectionError, NoOptionError):
1029- return False
1030- return result
1031+ '''Boolean to tell if the server should be auto started.'''
1032+ return self.content.getboolean("General", "start_server_auto")
1033
1034+ @property
1035 def history_size(self):
1036- """
1037- Get screen history size. This determines how many screen are kept in
1038- memory when scrolling.
1039- @return: Integer
1040- """
1041- try:
1042- result = self.preferences.getint("General", "history_size")
1043- except (NoSectionError, NoOptionError):
1044- return 10
1045- return result
1046+ '''Number of screens to hold in history.'''
1047+ return self.content.getint("General", "history_size")
1048
1049- def get_slideshow_step(self):
1050- """
1051- Get the slideshow step in seconds used by the photo slideshow
1052- @return: Integer
1053- """
1054- try:
1055- result = self.preferences.getint("Photographs", "slideshow_step")
1056- except (NoSectionError, NoOptionError):
1057- return 5
1058- return result
1059+ @property
1060+ def slideshow_step(self):
1061+ '''Amount of seconds before the slideshow steps to the next image.'''
1062+ return self.content.getint("Photographs", "slideshow_step")
1063
1064 # Implements MessageHandler interface
1065 def handleMessage(self, message):
1066@@ -457,26 +222,99 @@
1067 """
1068 if message.get_type() == MessageType.CONTENT_CONF_UPDATED:
1069 self.update_configuration()
1070- elif message.get_type() == MessageType.PREFERENCES_CONF_UPDATED:
1071- self.update_configuration()
1072-
1073- def get_cfg_dir(self):
1074- """
1075- Get the entertainer configuration dir.
1076- @return: strings
1077- """
1078- return self.cfg_dir
1079
1080 def _is_valid_media_folder(self, folder_list):
1081 """Return a folder list where eventual cache folders are removed"""
1082- cache_dir = os.path.join(self.get_cfg_dir(), 'cache')
1083 valid_folder_list = []
1084
1085 for folder in folder_list:
1086- common_prefix = os.path.commonprefix([cache_dir, folder])
1087- if common_prefix != cache_dir:
1088- # folder is not a subfolder of cache_dir we accept it
1089+ common_prefix = os.path.commonprefix([self.cache_dir, folder])
1090+ if common_prefix != self.cache_dir:
1091+ # if folder is not a subfolder of cache_dir, we accept it
1092 valid_folder_list.append(folder)
1093
1094 return valid_folder_list
1095
1096+
1097+class Resources(object):
1098+ '''A Wrapper for the XDG directories. Also handles creation of a new setup
1099+ if the Entertainer directories within the XDG directories are missing. This
1100+ class is meant solely to support Configuration and should NOT be publicly
1101+ used because of testing conflicts that would occur.'''
1102+
1103+ def __init__(self, resource='entertainer', config_testing_dir=None):
1104+ if config_testing_dir is None:
1105+ self.cache_dir = os.path.join(BaseDirectory.xdg_cache_home,
1106+ resource)
1107+ self.config_dir = os.path.join(BaseDirectory.xdg_config_home,
1108+ resource)
1109+ self.data_dir = os.path.join(BaseDirectory.xdg_data_home, resource)
1110+ else:
1111+ # Running in the test suite so don't create the XDG locations.
1112+ self.cache_dir = os.path.join(config_testing_dir, 'cache')
1113+ self.config_dir = os.path.join(config_testing_dir, 'config')
1114+ self.data_dir = os.path.join(config_testing_dir, 'data')
1115+
1116+ # Ensure that the directories exist.
1117+ if not os.path.exists(self.cache_dir):
1118+ self.create_cache_hierarchy()
1119+ if not os.path.exists(self.config_dir):
1120+ self.create_configuration()
1121+ if not os.path.exists(self.data_dir):
1122+ self.create_initial_data()
1123+
1124+ def create_cache_hierarchy(self):
1125+ '''Create the cache hierarchy that is assumed to exist.'''
1126+ os.makedirs(os.path.join(self.cache_dir, 'album_art'))
1127+ os.makedirs(os.path.join(self.cache_dir, 'movie_art'))
1128+ os.makedirs(os.path.join(self.cache_dir, 'thumbnails', 'image'))
1129+ os.makedirs(os.path.join(self.cache_dir, 'thumbnails', 'video'))
1130+
1131+ def create_configuration(self):
1132+ '''Create the user's configuration area and populate with the default
1133+ content configuration.'''
1134+
1135+ # Copy configuration data from a dev branch if we can
1136+ dev_config = os.path.abspath(os.path.dirname(__file__) + '/../cfg')
1137+ if os.path.exists(dev_config):
1138+ shutil.copytree(dev_config, self.config_dir)
1139+ return
1140+
1141+ # Must be a proper installation so install from the system location.
1142+ installed_config = os.path.join(self.installed_data_dir, 'cfg')
1143+ shutil.copytree(installed_config, self.config_dir)
1144+
1145+ def create_initial_data(self):
1146+ '''Create the initial data directory and populate with the default data
1147+ used by Entertainer.'''
1148+ os.mkdir(self.data_dir)
1149+
1150+ # Copy configuration data from a dev branch if we can
1151+ dev_config = os.path.abspath(os.path.dirname(__file__) + '/../themes')
1152+ if os.path.exists(dev_config):
1153+ shutil.copytree(dev_config, os.path.join(self.data_dir, 'themes'))
1154+ return
1155+
1156+ # Must be a proper installation so install from the system location.
1157+ themes_dir = os.path.join(self.installed_data_dir, 'themes')
1158+ shutil.copytree(themes_dir, os.path.join(self.data_dir, 'themes'))
1159+
1160+ @property
1161+ def installed_data_dir(self):
1162+ '''Since different distros decide on the install path differently, scan
1163+ through the system data directories to find where Entertainer was
1164+ installed.'''
1165+
1166+ # Get rid of the user's home data directory because we don't want it.
1167+ system_data_dirs = [data_dir for data_dir in BaseDirectory.xdg_data_dirs
1168+ if not data_dir.startswith(BaseDirectory.xdg_data_home)]
1169+
1170+ installed_data_dir = None
1171+ for directory in system_data_dirs:
1172+ possible_data_dir = os.path.join(directory, 'entertainer')
1173+ if os.path.exists(possible_data_dir):
1174+ installed_data_dir = possible_data_dir
1175+ break
1176+
1177+ return installed_data_dir
1178+
1179
1180=== modified file 'entertainerlib/dialog.py'
1181--- entertainerlib/dialog.py 2009-07-14 04:24:07 +0000
1182+++ entertainerlib/dialog.py 2009-08-27 03:18:41 +0000
1183@@ -22,7 +22,7 @@
1184 from entertainerlib.weather import Weather
1185
1186
1187-class ContentManagementDialog:
1188+class ManagerDialog:
1189 """
1190 This is a content management tool for Entertainer media center application.
1191 """
1192@@ -39,44 +39,38 @@
1193 """
1194 self.stand_alone = stand_alone
1195 self.config = Configuration()
1196+ self.themes = []
1197 self.weather = Weather()
1198
1199 # Load glade UI
1200- self.gladefile = os.path.join(self.GLADE_DIR,
1201- "entertainer-content-management.glade")
1202+ self.gladefile = os.path.join(self.GLADE_DIR, 'manager.glade')
1203 self.widgets = gtk.glade.XML(self.gladefile)
1204
1205 # Get content management dialog and bind signal callbacks
1206- self.dialog = self.widgets.get_widget("ContentManagementDialog")
1207+ self.dialog = self.widgets.get_widget("ManagerDialog")
1208 if (self.dialog):
1209 callback_dic = {
1210+ # Dialog-wide callbacks
1211 "on_button_open_list_clicked" :
1212 self.on_button_open_list_clicked,
1213 "on_close_button_clicked" : self.on_close_button_clicked,
1214- "on_button_remove_videos_clicked" :
1215- self.on_button_remove_videos_clicked,
1216- "on_button_add_videos_clicked" :
1217- self.on_button_add_videos_clicked,
1218- "on_button_edit_videos_clicked" :
1219- self.on_button_edit_videos_clicked,
1220+ "on_ManagerDialog_destroy" : self.on_dialog_closed,
1221+
1222+ # Media tab
1223+ "on_button_remove_media_clicked" :
1224+ self.on_button_remove_media_clicked,
1225+ "on_button_add_media_clicked" :
1226+ self.on_button_add_media_clicked,
1227+ "on_button_edit_media_clicked" :
1228+ self.on_button_edit_media_clicked,
1229 "on_checkbutton_video_metadata_toggled" :
1230 self.on_checkbutton_video_metadata_toggled,
1231- "on_button_add_music_clicked" :
1232- self.on_button_add_music_clicked,
1233- "on_button_remove_music_clicked" :
1234- self.on_button_remove_music_clicked,
1235- "on_button_edit_music_clicked" :
1236- self.on_button_edit_music_clicked,
1237 "on_lyrics_checkbox_toggled" : self.on_lyrics_checkbox_toggled,
1238 "on_art_checkbox_toggled" : self.on_art_checkbox_toggled,
1239- "on_button_add_images_clicked" :
1240- self.on_button_add_images_clicked,
1241- "on_button_remove_images_clicked" :
1242- self.on_button_remove_images_clicked,
1243- "on_button_edit_images_clicked" :
1244- self.on_button_edit_images_clicked,
1245- "on_hidden_files_folders_checkbox_toggled" :
1246- self.on_hidden_files_folders_checkbox_toggled,
1247+ "on_button_media_rebuild_clicked" :
1248+ self.on_button_media_rebuild_clicked,
1249+
1250+ # Feed tab
1251 "on_button_add_feed_clicked" :
1252 self.on_button_add_feed_clicked,
1253 "on_button_remove_feed_clicked" :
1254@@ -85,20 +79,15 @@
1255 self.on_button_edit_feed_clicked,
1256 "on_fetch_interval_spinbutton_value_changed" :
1257 self.on_fetch_interval_spinbutton_value_changed,
1258- "on_ContentManagementDialog_destroy" : self.on_dialog_closed,
1259 "on_url_dialog_delete_event" : self.on_url_dialog_delete_event,
1260 "on_url_dialog_ok_button_clicked" :
1261 self.on_url_dialog_ok_button_clicked,
1262 "on_url_dialog_cancel_button_clicked" :
1263 self.on_url_dialog_cancel_button_clicked,
1264- "on_button_video_rebuild_clicked" :
1265- self.on_button_video_rebuild_clicked,
1266- "on_button_music_rebuild_clicked" :
1267- self.on_button_music_rebuild_clicked,
1268- "on_button_image_rebuild_clicked" :
1269- self.on_button_image_rebuild_clicked,
1270 "on_button_feed_rebuild_clicked" :
1271 self.on_button_feed_rebuild_clicked,
1272+
1273+ # Weather tab
1274 "on_button_add_weather_clicked" :
1275 self.on_button_add_weather_clicked,
1276 "on_button_remove_weather_clicked" :
1277@@ -111,7 +100,31 @@
1278 self.on_location_cancel_button_clicked,
1279 "on_location_add_button_clicked" :
1280 self.on_location_add_button_clicked,
1281- "on_location_entry_activate" : self.on_location_entry_activate}
1282+ "on_location_entry_activate" : self.on_location_entry_activate,
1283+
1284+ # User Interface tab
1285+ "on_theme_list_cursor_changed" :
1286+ self.on_theme_list_cursor_changed,
1287+ "on_theme_add_button_clicked" :
1288+ self.on_theme_add_button_clicked,
1289+ "on_theme_remove_button_clicked" :
1290+ self.on_theme_remove_button_clicked,
1291+ "on_checkbutton_effects_toggled" :
1292+ self.on_checkbutton_effects_toggled,
1293+ "on_combobox_effects_changed" :
1294+ self.on_combobox_effects_changed,
1295+
1296+ # General tab
1297+ "on_checkbutton_fullscreen_toggled" :
1298+ self.on_checkbutton_fullscreen_toggled,
1299+ "on_checkbutton_autostart_toggled" :
1300+ self.on_checkbutton_autostart_toggled,
1301+ "on_checkbutton_systray_icon_toggled" :
1302+ self.on_checkbutton_systray_icon_toggled,
1303+ "on_spinbutton_slideshow_step_value_changed":
1304+ self.on_spinbutton_slideshow_step_value_changed
1305+ }
1306+
1307 self.widgets.signal_autoconnect(callback_dic)
1308
1309 # Initialize dialog widgets with correct values and show dialog
1310@@ -127,12 +140,10 @@
1311 column = gtk.TreeViewColumn(_("Location"), cell_renderer, text=0)
1312 result_list.append_column(column)
1313
1314-# Signal handlers
1315-
1316 def on_dialog_closed(self, widget):
1317 """Callback function for dialog's close button"""
1318 try:
1319- proxy = MessageBusProxy(client_name = "Content Management GUI")
1320+ proxy = MessageBusProxy(client_name = "Manager GUI")
1321 proxy.connectToMessageBus()
1322 proxy.sendMessage(Message(MessageType.CONTENT_CONF_UPDATED))
1323 proxy.disconnectFromMessageBus()
1324@@ -146,7 +157,6 @@
1325 error.run()
1326 error.destroy()
1327
1328-
1329 if(self.stand_alone):
1330 self.dialog.hide()
1331 self.dialog.destroy()
1332@@ -165,12 +175,12 @@
1333 self.dialog.hide()
1334 self.dialog.destroy()
1335
1336- def on_button_add_videos_clicked(self, widget):
1337+ def on_button_add_media_clicked(self, widget):
1338 """Opens add URL dialog. """
1339- widget = self.widgets.get_widget("treeview_videos")
1340+ widget = self.widgets.get_widget("treeview_media")
1341 model = widget.get_model()
1342 # Open "Select folder" dialog
1343- dialog = gtk.FileChooserDialog(_("Select video folder"), None,
1344+ dialog = gtk.FileChooserDialog(_("Select folder"), None,
1345 gtk.FILE_CHOOSER_ACTION_SELECT_FOLDER,
1346 (gtk.STOCK_CANCEL,gtk.RESPONSE_CANCEL,
1347 gtk.STOCK_OPEN,gtk.RESPONSE_OK),
1348@@ -179,25 +189,25 @@
1349 # If folder was selected we add it to model and update config file
1350 if(status == gtk.RESPONSE_OK):
1351 self.add_to_model_and_config(dialog.get_current_folder(), model,
1352- self.video_folders, "Videos")
1353+ self.media_folders, "Media")
1354 dialog.destroy()
1355
1356- def on_button_remove_videos_clicked(self, widget):
1357- """Remove currently selected folder from video folders"""
1358- widget = self.widgets.get_widget("treeview_videos")
1359+ def on_button_remove_media_clicked(self, widget):
1360+ """Remove currently selected folder from media folders"""
1361+ widget = self.widgets.get_widget("treeview_media")
1362 model = widget.get_model()
1363 selection = widget.get_selection().get_selected()
1364 if selection[1] == None:
1365 return
1366 rm_folder = model.get_value(selection[1], 0)
1367- self.video_folders.remove(rm_folder)
1368- str_folders = ";".join(self.video_folders)
1369- self.config.write_content_value("Videos", "folders", str_folders)
1370+ self.media_folders.remove(rm_folder)
1371+ str_folders = ";".join(self.media_folders)
1372+ self.config.write_content_value("Media", "folders", str_folders)
1373 model.remove(selection[1])
1374
1375- def on_button_edit_videos_clicked(self, widget):
1376+ def on_button_edit_media_clicked(self, widget):
1377 """Edit currently selected folder"""
1378- widget = self.widgets.get_widget("treeview_videos")
1379+ widget = self.widgets.get_widget("treeview_media")
1380 url_dialog = self.widgets.get_widget("url_dialog")
1381 url_entry = self.widgets.get_widget("url_entry")
1382 model = widget.get_model()
1383@@ -212,136 +222,36 @@
1384 # Update list model
1385 model.set_value(selection[1], 0, self.url)
1386 # Update configure file
1387- pos = self.video_folders.index(folder)
1388- self.video_folders.remove(folder)
1389- self.video_folders.insert(pos, self.url)
1390- str_folders = ";".join(self.video_folders)
1391- self.config.write_content_value("Videos", "folders",
1392+ pos = self.media_folders.index(folder)
1393+ self.media_folders.remove(folder)
1394+ self.media_folders.insert(pos, self.url)
1395+ str_folders = ";".join(self.media_folders)
1396+ self.config.write_content_value("Media", "folders",
1397 str_folders)
1398
1399+ def on_checkbutton_autostart_toggled(self, widget):
1400+ '''Server autostart checkbox toggled.'''
1401+ self.config.write_content_value("General", "start_server_auto",
1402+ widget.get_active())
1403+
1404+ def on_checkbutton_fullscreen_toggled(self, widget):
1405+ '''Start in fullscreen checkbox toggled.'''
1406+ self.config.write_content_value("General", "start_in_fullscreen",
1407+ widget.get_active())
1408+
1409+ def on_checkbutton_systray_icon_toggled(self, widget):
1410+ """System Tray Icon checkbox toggled"""
1411+ self.config.write_content_value("General", "display_icon",
1412+ widget.get_active())
1413+
1414 def on_checkbutton_video_metadata_toggled(self, widget):
1415 """
1416 Download video file metadata from internet
1417 @param widget: GTK-Widget
1418 """
1419- self.config.write_content_value("Videos", "download_metadata",
1420+ self.config.write_content_value("Media", "download_metadata",
1421 widget.get_active())
1422
1423- def on_button_add_music_clicked(self, widget):
1424- """
1425- Opens add URL dialog
1426- @param widget: GTK-Widget
1427- """
1428- widget = self.widgets.get_widget("treeview_music")
1429- model = widget.get_model()
1430- # Open "Select folder" dialog
1431- dialog = gtk.FileChooserDialog(_("Select music folder"), None,
1432- gtk.FILE_CHOOSER_ACTION_SELECT_FOLDER,
1433- (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_OPEN,
1434- gtk.RESPONSE_OK),
1435- None)
1436- status = dialog.run()
1437- # If folder was selected we add it to model and update config file
1438- if(status == gtk.RESPONSE_OK):
1439- self.add_to_model_and_config(dialog.get_current_folder(), model,
1440- self.music_folders, "Music")
1441- dialog.destroy()
1442-
1443- def on_button_remove_music_clicked(self, widget):
1444- """Remove currently selected folder from music folders"""
1445- widget = self.widgets.get_widget("treeview_music")
1446- model = widget.get_model()
1447- selection = widget.get_selection().get_selected()
1448- if selection[1] == None:
1449- return
1450- rm_folder = model.get_value(selection[1], 0)
1451- self.music_folders.remove(rm_folder)
1452- str_folders = ";".join(self.music_folders)
1453- self.config.write_content_value("Music", "folders", str_folders)
1454- model.remove(selection[1])
1455-
1456- def on_button_edit_music_clicked(self, widget):
1457- """Edit currently selected music folder"""
1458- widget = self.widgets.get_widget("treeview_music")
1459- url_dialog = self.widgets.get_widget("url_dialog")
1460- url_entry = self.widgets.get_widget("url_entry")
1461- model = widget.get_model()
1462- selection = widget.get_selection().get_selected()
1463- if selection[1] == None:
1464- return
1465- folder = model.get_value(selection[1], 0)
1466- url_entry.set_text(folder)
1467- url_dialog.set_title(_("Edit URL"))
1468- status = url_dialog.run()
1469- if status == gtk.RESPONSE_OK and os.path.exists(self.url):
1470- # Update list model
1471- model.set_value(selection[1], 0, self.url)
1472- # Update configure file
1473- pos = self.music_folders.index(folder)
1474- self.music_folders.remove(folder)
1475- self.music_folders.insert(pos, self.url)
1476- str_folders = ";".join(self.music_folders)
1477- self.config.write_content_value("Music", "folders", str_folders)
1478-
1479- def on_button_add_images_clicked(self, widget):
1480- """Opens add URL dialog. """
1481- widget = self.widgets.get_widget("treeview_images")
1482- model = widget.get_model()
1483- # Open "Select folder" dialog
1484- dialog = gtk.FileChooserDialog(_("Select image folder"), None,
1485- gtk.FILE_CHOOSER_ACTION_SELECT_FOLDER,
1486- (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_OPEN,
1487- gtk.RESPONSE_OK),
1488- None)
1489- status = dialog.run()
1490- # If folder was selected we add it to model and update config file
1491- if(status == gtk.RESPONSE_OK):
1492- self.add_to_model_and_config(dialog.get_current_folder(), model,
1493- self.image_folders, "Images")
1494- dialog.destroy()
1495-
1496- def on_button_remove_images_clicked(self, widget):
1497- """Remove currently selected folder from images folders"""
1498- widget = self.widgets.get_widget("treeview_images")
1499- model = widget.get_model()
1500- selection = widget.get_selection().get_selected()
1501- if selection[1] == None:
1502- return
1503- rm_folder = model.get_value(selection[1], 0)
1504- self.image_folders.remove(rm_folder)
1505- str_folders = ";".join(self.image_folders)
1506- self.config.write_content_value("Images", "folders", str_folders)
1507- model.remove(selection[1])
1508-
1509- def on_button_edit_images_clicked(self, widget):
1510- """Edit currently selected music folder"""
1511- widget = self.widgets.get_widget("treeview_images")
1512- url_dialog = self.widgets.get_widget("url_dialog")
1513- url_entry = self.widgets.get_widget("url_entry")
1514- model = widget.get_model()
1515- selection = widget.get_selection().get_selected()
1516- if selection[1] == None:
1517- return
1518- folder = model.get_value(selection[1], 0)
1519- url_entry.set_text(folder)
1520- url_dialog.set_title(_("Edit URL"))
1521- status = url_dialog.run()
1522- if status == gtk.RESPONSE_OK and os.path.exists(self.url):
1523- # Update list model
1524- model.set_value(selection[1], 0, self.url)
1525- # Update configure file
1526- pos = self.image_folders.index(folder)
1527- self.image_folders.remove(folder)
1528- self.image_folders.insert(pos, self.url)
1529- str_folders = ";".join(self.image_folders)
1530- self.config.write_content_value("Images", "folders",
1531- str_folders)
1532-
1533- def on_hidden_files_folders_checkbox_toggled(self, widget):
1534- """If True hidden files and folders will be added to image library."""
1535- self.config.write_content_value("Images",
1536- "display_hidden_files_folders", widget.get_active())
1537-
1538 def on_button_add_feed_clicked(self, widget):
1539 """Opens add feed dialog. """
1540 widget = self.widgets.get_widget("treeview_feeds")
1541@@ -405,12 +315,17 @@
1542 self.config.write_content_value("RSS", "fetch_interval",
1543 widget.get_value_as_int())
1544
1545+ def on_spinbutton_slideshow_step_value_changed(self, widget):
1546+ """Activation of slideshow effects"""
1547+ self.config.write_content_value("Photographs", "slideshow_step",
1548+ int(widget.get_value()))
1549+
1550 def on_lyrics_checkbox_toggled(self, widget):
1551- self.config.write_content_value("Music", "download_lyrics",
1552+ self.config.write_content_value("Media", "download_lyrics",
1553 widget.get_active())
1554
1555 def on_art_checkbox_toggled(self, widget):
1556- self.config.write_content_value("Music", "download_album_art",
1557+ self.config.write_content_value("Media", "download_album_art",
1558 widget.get_active())
1559
1560 def on_url_dialog_ok_button_clicked(self, widget):
1561@@ -555,14 +470,13 @@
1562 """
1563 self.on_location_find_button_clicked(widget)
1564
1565- def on_button_video_rebuild_clicked(self, widget):
1566- """
1567- Rebuild video cache requested
1568- @param widget: GTK-Widget
1569- """
1570+ def on_button_media_rebuild_clicked(self, widget):
1571+ '''Rebuild media cache requested.'''
1572 try:
1573- proxy = MessageBusProxy(client_name = "Content Management GUI")
1574+ proxy = MessageBusProxy(client_name = "Manager GUI")
1575 proxy.connectToMessageBus()
1576+ proxy.sendMessage(Message(MessageType.REBUILD_IMAGE_CACHE))
1577+ proxy.sendMessage(Message(MessageType.REBUILD_MUSIC_CACHE))
1578 proxy.sendMessage(Message(MessageType.REBUILD_VIDEO_CACHE))
1579 proxy.disconnectFromMessageBus()
1580 except socket.error:
1581@@ -575,46 +489,6 @@
1582 error.run()
1583 error.destroy()
1584
1585- def on_button_music_rebuild_clicked(self, widget):
1586- """
1587- Rebuild music cache requested
1588- @param widget: GTK-Widget
1589- """
1590- try:
1591- proxy = MessageBusProxy(client_name = "Content Management GUI")
1592- proxy.connectToMessageBus()
1593- proxy.sendMessage(Message(MessageType.REBUILD_MUSIC_CACHE))
1594- proxy.disconnectFromMessageBus()
1595- except socket.error:
1596- error = gtk.MessageDialog(
1597- None, gtk.DIALOG_MODAL,
1598- gtk.MESSAGE_ERROR, gtk.BUTTONS_OK, _(
1599- "Entertainer backend is not running. "
1600- "Cache cannot be rebuilt."
1601- ))
1602- error.run()
1603- error.destroy()
1604-
1605- def on_button_image_rebuild_clicked(self, widget):
1606- """
1607- Rebuild image cache requested
1608- @param widget: GTK-Widget
1609- """
1610- try:
1611- proxy = MessageBusProxy(client_name = "Content Management GUI")
1612- proxy.connectToMessageBus()
1613- proxy.sendMessage(Message(MessageType.REBUILD_IMAGE_CACHE))
1614- proxy.disconnectFromMessageBus()
1615- except socket.error:
1616- error = gtk.MessageDialog(
1617- None, gtk.DIALOG_MODAL,
1618- gtk.MESSAGE_ERROR, gtk.BUTTONS_OK, _(
1619- "Entertainer backend is not running. "
1620- "Cache cannot be rebuilt."
1621- ))
1622- error.run()
1623- error.destroy()
1624-
1625 def on_button_feed_rebuild_clicked(self, widget):
1626 """
1627 Rebuild feed cache requested
1628@@ -628,7 +502,7 @@
1629 #If user has ok'd the request send the message to the message bus
1630 if(status == gtk.RESPONSE_OK):
1631 try:
1632- proxy = MessageBusProxy(client_name = "Content Management GUI")
1633+ proxy = MessageBusProxy(client_name = "Manager GUI")
1634 proxy.connectToMessageBus()
1635 proxy.sendMessage(Message(MessageType.REBUILD_FEED_CACHE))
1636 proxy.disconnectFromMessageBus()
1637@@ -644,73 +518,141 @@
1638
1639 dialog.destroy()
1640
1641+ def on_theme_add_button_clicked(self, widget):
1642+ """Add theme button clicked"""
1643+ themelist = self.widgets.get_widget("theme_list")
1644+ model = themelist.get_model()
1645+ # Open "Select folder" dialog
1646+ dialog = gtk.FileChooserDialog(_("Select theme package file"),
1647+ None, gtk.FILE_CHOOSER_ACTION_OPEN, (gtk.STOCK_CANCEL,
1648+ gtk.RESPONSE_CANCEL, gtk.STOCK_OPEN, gtk.RESPONSE_OK), None)
1649+ file_filter = gtk.FileFilter()
1650+ file_filter.set_name(_("Theme package (tar.gz)"))
1651+ file_filter.add_pattern("*.tar.gz")
1652+ dialog.add_filter(file_filter)
1653+ status = dialog.run()
1654+
1655+ # If theme was selected with file chooser
1656+ if(status == gtk.RESPONSE_OK):
1657+ package = dialog.get_filename()
1658+ tar = tarfile.open(package, 'r:gz') # Open tar.gz package
1659+
1660+ # Make sure that package contains configuration file (is theme)
1661+ content = tar.getnames()
1662+ theme_name = None
1663+ is_theme = False
1664+ for element in content:
1665+ if element[-10:] == "theme.conf":
1666+ theme_name = element[:-11]
1667+ is_theme = True
1668+
1669+ # Install them
1670+ if is_theme:
1671+ tar.extractall(os.path.join(self.config.data_dir, 'themes'))
1672+ model.insert(len(model), [theme_name])
1673+ else:
1674+ error = gtk.MessageDialog(None, gtk.DIALOG_MODAL,
1675+ gtk.MESSAGE_ERROR, gtk.BUTTONS_OK, _("Invalid theme file!"))
1676+ error.run()
1677+ error.destroy()
1678+
1679+ dialog.destroy()
1680+
1681+ def on_theme_list_cursor_changed(self, widget):
1682+ """Executed when theme is changed in theme list. Update preview."""
1683+ # Get currently selected theme
1684+ themelist = self.widgets.get_widget("theme_list")
1685+ model = themelist.get_model()
1686+ selection = themelist.get_selection().get_selected()
1687+ name = model.get_value(selection[1], 0)
1688+ themedir = os.path.join(self.config.data_dir, 'themes', name)
1689+ theme = Theme(theme_path=themedir)
1690+
1691+ # Update preview
1692+ image = self.widgets.get_widget("theme_image")
1693+ image.set_from_file(os.path.join(themedir, "thumbnail.png"))
1694+ name = self.widgets.get_widget("name_label")
1695+ name.set_text(theme.getName())
1696+ author = self.widgets.get_widget("author_label")
1697+ author.set_text(theme.getAuthor())
1698+ license_label = self.widgets.get_widget("license_label")
1699+ license_label.set_text(theme.getLicence())
1700+ copyright_label = self.widgets.get_widget("copyright_label")
1701+ copyright_label.set_text(theme.getCopyright())
1702+ comment = self.widgets.get_widget("comment_label")
1703+ comment.set_text(theme.getComment())
1704+
1705+ self.config.write_content_value("General", "theme", name.get_text())
1706+
1707+ def on_theme_remove_button_clicked(self, widget):
1708+ """Remove theme button clicked"""
1709+ # Get currently selected theme
1710+ themelist = self.widgets.get_widget("theme_list")
1711+ model = themelist.get_model()
1712+ selection = themelist.get_selection().get_selected()
1713+ name = model.get_value(selection[1], 0)
1714+
1715+ confirm = gtk.MessageDialog(None,
1716+ gtk.DIALOG_MODAL, gtk.MESSAGE_QUESTION, gtk.BUTTONS_YES_NO,
1717+ _("Are you sure you want to delete\ntheme: %(name)s") % \
1718+ {'name': name})
1719+ status = confirm.run()
1720+ confirm.destroy()
1721+ if(status == gtk.RESPONSE_YES):
1722+ themedir = os.path.join(self.config.data_dir, 'themes', name)
1723+ shutil.rmtree(themedir)
1724+ model.remove(selection[1])
1725+ themelist.set_cursor(0)
1726+ self.themes.remove(name)
1727+
1728+ def on_checkbutton_effects_toggled(self, widget):
1729+ """Effect checkbox toggled"""
1730+ combobox = self.widgets.get_widget("combobox_effects")
1731+ combobox.set_sensitive(widget.get_active())
1732+ self.config.write_content_value("General", "show_effects",
1733+ widget.get_active())
1734+
1735+ def on_combobox_effects_changed(self, widget):
1736+ """User changed effect for screen transitions"""
1737+ text = widget.get_active_text()
1738+ if text == _("No effect"):
1739+ english_text = "No effect"
1740+ if text == _("Crossfade"):
1741+ english_text = "Crossfade"
1742+ if text == _("Zoom and fade"):
1743+ english_text = "Zoom and fade"
1744+ if text == _("Slide"):
1745+ english_text = "Slide"
1746+ self.config.write_content_value("General", "transition_effect",
1747+ english_text)
1748+
1749 def init_dialog_values_from_configure_file(self):
1750 """Read configuration and set dialog widget values with read values.
1751 """
1752 # == Videos ==
1753- videolist_widget = self.widgets.get_widget("treeview_videos")
1754- videostore = gtk.ListStore(str)
1755+ medialist_widget = self.widgets.get_widget("treeview_media")
1756+ mediastore = gtk.ListStore(str)
1757
1758 cell_renderer = gtk.CellRendererText()
1759 column = gtk.TreeViewColumn(_("Folders"), cell_renderer, text=0)
1760- videolist_widget.append_column(column)
1761+ medialist_widget.append_column(column)
1762
1763- self.video_folders = self.config.get_video_folders()
1764+ self.media_folders = self.config.media_folders
1765
1766 # Fill model with folders read from config file
1767- self.init_model(videostore, self.video_folders)
1768+ self.init_model(mediastore, self.media_folders)
1769
1770- videolist_widget.set_model(videostore)
1771+ medialist_widget.set_model(mediastore)
1772
1773 # Checkboxes
1774 metadata_checkbox = self.widgets.get_widget("video_metadata_checkbox")
1775- md_val = self.config.download_video_metadata()
1776- metadata_checkbox.set_active(md_val)
1777-
1778- # == Music ==
1779- musiclist_widget = self.widgets.get_widget("treeview_music")
1780- music_model = gtk.ListStore(str)
1781-
1782- music_cell = gtk.CellRendererText()
1783- music_column = gtk.TreeViewColumn(_("Folders"), music_cell, text=0)
1784- musiclist_widget.append_column(music_column)
1785-
1786- self.music_folders = self.config.get_music_folders()
1787-
1788- # Fill model with folders read from config file
1789- self.init_model(music_model, self.music_folders)
1790-
1791- musiclist_widget.set_model(music_model)
1792-
1793- # Checkboxes
1794+ metadata_checkbox.set_active(self.config.download_metadata)
1795+
1796 art_checkbox = self.widgets.get_widget("art_checkbox")
1797- art_val = self.config.download_album_art()
1798- art_checkbox.set_active(art_val)
1799+ art_checkbox.set_active(self.config.download_album_art)
1800
1801 lyrics_checkbox = self.widgets.get_widget("lyrics_checkbox")
1802- lyrics_val = self.config.download_lyrics()
1803- lyrics_checkbox.set_active(lyrics_val)
1804-
1805- # == Images ==
1806- imagelist_widget = self.widgets.get_widget("treeview_images")
1807- images_model = gtk.ListStore(str)
1808-
1809- img_cell = gtk.CellRendererText()
1810- img_column = gtk.TreeViewColumn(_("Folders"), img_cell, text=0)
1811- imagelist_widget.append_column(img_column)
1812-
1813- self.image_folders = self.config.get_image_folders()
1814-
1815- # Fill model with folders read from config file
1816- self.init_model(images_model, self.image_folders)
1817-
1818- imagelist_widget.set_model(images_model)
1819-
1820- # Checkboxes
1821- hidden_checkbox = self.widgets.get_widget(
1822- "hidden_files_folders_checkbox")
1823- hidden_val = self.config.display_hidden_files_folders()
1824- hidden_checkbox.set_active(hidden_val)
1825+ lyrics_checkbox.set_active(self.config.download_lyrics)
1826
1827 # == RSS-feeds ==
1828 feedlist_widget = self.widgets.get_widget("treeview_feeds")
1829@@ -720,7 +662,7 @@
1830 rss_column = gtk.TreeViewColumn(_("Feeds"), rss_cell, text=0)
1831 feedlist_widget.append_column(rss_column)
1832
1833- self.feeds = self.config.get_feeds()
1834+ self.feeds = self.config.feeds
1835
1836 # Fill model with folders read from config file
1837 for i in range(len(self.feeds)):
1838@@ -730,14 +672,14 @@
1839
1840 # Interval spinner
1841 interval_spinner = self.widgets.get_widget("fetch_interval_spinbutton")
1842- interval_val = self.config.get_feed_fetch_interval()
1843+ interval_val = self.config.feed_fetch_interval
1844 if interval_val < 15:
1845 interval_val = 15
1846 elif interval_val > 900:
1847 interval_val = 900
1848 interval_spinner.set_value(interval_val)
1849
1850- # == Weather location ==
1851+ # == Weather ==
1852 locationlist_widget = self.widgets.get_widget("treeview_locations")
1853 location_model = gtk.ListStore(str)
1854
1855@@ -745,17 +687,15 @@
1856 location_column = gtk.TreeViewColumn(_("Location"), loc_cell, text=0)
1857 locationlist_widget.append_column(location_column)
1858
1859- self.weather_location = self.config.get_weather_location()
1860+ self.weather_location = self.config.weather_location
1861
1862 # Fill model with location read from config file
1863 location_model.insert(0, [self.weather_location])
1864-
1865 locationlist_widget.set_model(location_model)
1866
1867- # Checkboxes
1868 weather_display_checkbox = self.widgets.get_widget(
1869 "weather_display_checkbox")
1870- display_val = self.config.display_weather_in_client()
1871+ display_val = self.config.display_weather_in_client
1872 weather_display_checkbox.set_active(display_val)
1873 if not display_val:
1874 self.widgets.get_widget("button_add_weather").set_sensitive(False)
1875@@ -763,6 +703,80 @@
1876 False)
1877 self.widgets.get_widget("treeview_locations").set_sensitive(False)
1878
1879+ # == User Interface ==
1880+ self.load_themes()
1881+ current_theme = self.config.theme_name
1882+
1883+ themelist_widget = self.widgets.get_widget("theme_list")
1884+ model = gtk.ListStore(str)
1885+
1886+ cell_renderer = gtk.CellRendererText()
1887+ column = gtk.TreeViewColumn("Themes", cell_renderer, text=0)
1888+ themelist_widget.append_column(column)
1889+
1890+ # Fill model with installed themes
1891+ for i in range(len(self.themes)):
1892+ model.insert(i, [self.themes[i]])
1893+
1894+ themelist_widget.set_model(model)
1895+
1896+ # Set current theme selected in theme list
1897+ index = model.get_iter_first()
1898+ unselected = True
1899+ index_counter = 0
1900+ while(unselected):
1901+ name = model.get_value(index, 0)
1902+ if name == current_theme:
1903+ unselected = False
1904+ themelist_widget.set_cursor(index_counter)
1905+ index = model.iter_next(index)
1906+ index_counter += 1
1907+
1908+ effect_checkbox = self.widgets.get_widget("checkbutton_effects")
1909+ effect_combobox = self.widgets.get_widget("combobox_effects")
1910+ if self.config.show_effects:
1911+ effect_checkbox.set_active(True)
1912+ effect_combobox.set_sensitive(True)
1913+ else:
1914+ effect_checkbox.set_active(False)
1915+ effect_combobox.set_sensitive(False)
1916+
1917+ # Set Effect Combobox value (Text values are set in glade file)
1918+ effect = self.config.transition_effect
1919+ if effect == "No effect":
1920+ effect_combobox.set_active(0)
1921+ if effect == "Crossfade":
1922+ effect_combobox.set_active(1)
1923+ if effect == "Zoom and fade":
1924+ effect_combobox.set_active(2)
1925+ if effect == "Slide":
1926+ effect_combobox.set_active(3)
1927+
1928+ # == General ==
1929+ checkbutton_fullscreen = self.widgets.get_widget(
1930+ "checkbutton_fullscreen")
1931+ if self.config.start_in_fullscreen:
1932+ checkbutton_fullscreen.set_active(True)
1933+ else:
1934+ checkbutton_fullscreen.set_active(False)
1935+
1936+ checkbutton_autostart = self.widgets.get_widget("checkbutton_autostart")
1937+ if self.config.start_auto_server:
1938+ checkbutton_autostart.set_active(True)
1939+ else:
1940+ checkbutton_autostart.set_active(False)
1941+
1942+ checkbutton_systray_icon = self.widgets.get_widget(
1943+ "checkbutton_systray_icon")
1944+ if self.config.tray_icon_enabled:
1945+ checkbutton_systray_icon.set_active(True)
1946+ else:
1947+ checkbutton_systray_icon.set_active(False)
1948+
1949+ spinbutton_slideshow_step = self.widgets.get_widget(
1950+ "spinbutton_slideshow_step")
1951+ spinbutton_slideshow_step.set_value(self.config.slideshow_step)
1952+
1953 def add_to_model_and_config(self, selected_folder, model, folders, kind):
1954 """
1955 Add selected_folder to the model and the folders list while updating
1956@@ -787,6 +801,14 @@
1957 if not str(items[i]).strip() == "":
1958 model.insert(i, [items[i]])
1959
1960+ def load_themes(self):
1961+ """Load themes"""
1962+ themes = os.listdir(os.path.join(self.config.data_dir, 'themes'))
1963+ for element in themes:
1964+ theme = os.path.join(self.config.data_dir, 'themes', element)
1965+ if os.path.isdir(theme):
1966+ self.themes.append(element)
1967+
1968
1969 class LogViewer:
1970 """
1971@@ -814,7 +836,7 @@
1972 gladefile = os.path.join(GLADE_DIR, "log_dialog.glade")
1973
1974 def __init__(self, stand_alone):
1975- self.logfile_entertainer = Configuration().ENTERTAINER_LOG
1976+ self.logfile_entertainer = Configuration().LOG
1977 self.logger = Logger().getLogger('utils.log_viewer')
1978
1979 self.__STAND_ALONE = stand_alone
1980@@ -1086,300 +1108,3 @@
1981 return True
1982
1983
1984-class PreferencesDialog:
1985- """This is a preferences editing tool for Entertainer media center."""
1986-
1987- # Glade file location
1988- GLADE_DIR = os.path.join(os.path.dirname(__file__), "glade")
1989-
1990- def __init__(self, stand_alone):
1991- """
1992- Initialize Preferenced dialog
1993- @param stand_alone: Is this dialog stand alone process or part of
1994- client
1995- """
1996- # Is this dialog running as a stand alone process
1997- self.STAND_ALONE = stand_alone
1998- self.themes = []
1999- self.config = Configuration()
2000-
2001- # Load glade UI
2002- self.gladefile = os.path.join(self.GLADE_DIR,
2003- "entertainer-preferences.glade")
2004- self.widgets = gtk.glade.XML(self.gladefile)
2005-
2006- # Get preferences dialog and bind signal callbacks
2007- self.pref_dialog = self.widgets.get_widget("PreferencesDialog")
2008- if (self.pref_dialog):
2009- callback_dic = {
2010- "on_close_button_clicked" : self.on_close_button_clicked,
2011- "on_PreferencesDialog_delete_event" : self.on_dialog_closed,
2012- "on_theme_list_cursor_changed" :
2013- self.on_theme_list_cursor_changed,
2014- "on_checkbutton_autostart_toggled" :
2015- self.on_checkbutton_autostart_toggled,
2016- "on_checkbutton_fullscreen_toggled" :
2017- self.on_checkbutton_fullscreen_toggled,
2018- "on_checkbutton_systray_icon_toggled" :
2019- self.on_checkbutton_systray_icon_toggled,
2020- "on_effect_checkbox_toggled" : self.on_effect_checkbox_toggled,
2021- "on_effect_combobox_changed" : self.on_effect_combobox_changed,
2022- "on_add_button_clicked" : self.on_add_button_clicked,
2023- "on_remove_button_clicked" : self.on_remove_button_clicked,
2024- "on_spinbutton_slideshow_step_value_changed":
2025- self.on_spinbutton_slideshow_step_value_changed
2026- }
2027- self.widgets.signal_autoconnect(callback_dic)
2028-
2029- # Initilize dialog widgets with correct values and show dialog
2030- self.init_dialog_values_from_configure_file()
2031- #self.pref_dialog.resize(500,400)
2032- self.pref_dialog.show()
2033-
2034- def load_themes(self):
2035- """Load themes"""
2036- themes = os.listdir(os.path.join(self.config.get_cfg_dir(), 'themes'))
2037- for element in themes:
2038- theme = os.path.join(self.config.get_cfg_dir(), 'themes', element)
2039- if os.path.isdir(theme):
2040- self.themes.append(element)
2041-
2042- def on_add_button_clicked(self, widget):
2043- """Add theme button clicked"""
2044- themelist = self.widgets.get_widget("theme_list")
2045- model = themelist.get_model()
2046- # Open "Select folder" dialog
2047- dialog = gtk.FileChooserDialog(_("Select theme package file"),
2048- None, gtk.FILE_CHOOSER_ACTION_OPEN, (gtk.STOCK_CANCEL,
2049- gtk.RESPONSE_CANCEL, gtk.STOCK_OPEN, gtk.RESPONSE_OK), None)
2050- file_filter = gtk.FileFilter()
2051- file_filter.set_name(_("Theme package (tar.gz)"))
2052- file_filter.add_pattern("*.tar.gz")
2053- dialog.add_filter(file_filter)
2054- status = dialog.run()
2055-
2056- # If theme was selected with file chooser
2057- if(status == gtk.RESPONSE_OK):
2058- package = dialog.get_filename()
2059- tar = tarfile.open(package, 'r:gz') # Open tar.gz package
2060-
2061- # Make sure that package contains configuration file (is theme)
2062- content = tar.getnames()
2063- theme_name = None
2064- is_theme = False
2065- for element in content:
2066- if element[-10:] == "theme.conf":
2067- theme_name = element[:-11]
2068- is_theme = True
2069-
2070- # Install them
2071- if is_theme:
2072- tar.extractall(os.path.join(self.config.get_cfg_dir(),
2073- 'themes'))
2074- model.insert(len(model), [theme_name])
2075- else:
2076- error = gtk.MessageDialog(None, gtk.DIALOG_MODAL,
2077- gtk.MESSAGE_ERROR, gtk.BUTTONS_OK, _("Invalid theme file!"))
2078- error.run()
2079- error.destroy()
2080-
2081- dialog.destroy()
2082-
2083- def on_remove_button_clicked(self, widget):
2084- """Remove theme button clicked"""
2085- # Get currently selected theme
2086- themelist = self.widgets.get_widget("theme_list")
2087- model = themelist.get_model()
2088- selection = themelist.get_selection().get_selected()
2089- name = model.get_value(selection[1], 0)
2090-
2091- confirm = gtk.MessageDialog(None,
2092- gtk.DIALOG_MODAL, gtk.MESSAGE_QUESTION, gtk.BUTTONS_YES_NO,
2093- _("Are you sure you want to delete\ntheme: %(name)s") % \
2094- {'name': name})
2095- status = confirm.run()
2096- confirm.destroy()
2097- if(status == gtk.RESPONSE_YES):
2098- themedir = os.path.join(self.config.get_cfg_dir(), 'themes', name)
2099- shutil.rmtree(themedir)
2100- model.remove(selection[1])
2101- themelist.set_cursor(0)
2102- self.themes.remove(name)
2103-
2104- def on_theme_list_cursor_changed(self, widget):
2105- """Executed when theme is changed in theme list. Update preview."""
2106- # Get currently selected theme
2107- themelist = self.widgets.get_widget("theme_list")
2108- model = themelist.get_model()
2109- selection = themelist.get_selection().get_selected()
2110- name = model.get_value(selection[1], 0)
2111- themedir = os.path.join(self.config.get_cfg_dir(), 'themes', name)
2112- theme = Theme(theme_path=themedir)
2113-
2114- # Update preview
2115- image = self.widgets.get_widget("theme_image")
2116- image.set_from_file(os.path.join(themedir, "thumbnail.png"))
2117- name = self.widgets.get_widget("name_label")
2118- name.set_text(theme.getName())
2119- author = self.widgets.get_widget("author_label")
2120- author.set_text(theme.getAuthor())
2121- licence = self.widgets.get_widget("licence_label")
2122- licence.set_text(theme.getLicence())
2123- copyright_label = self.widgets.get_widget("copyright_label")
2124- copyright_label.set_text(theme.getCopyright())
2125- comment = self.widgets.get_widget("comment_label")
2126- comment.set_text(theme.getComment())
2127-
2128- self.config.write_preference_value("General", "theme", name.get_text())
2129-
2130- def on_checkbutton_autostart_toggled(self, widget):
2131- """Server Autostart checkbox toggled"""
2132- self.config.write_preference_value("General", "start_server_auto",
2133- widget.get_active())
2134-
2135- def on_checkbutton_fullscreen_toggled(self, widget):
2136- """Start in fullscreen checkbox toggled"""
2137- self.config.write_preference_value("General", "start_in_fullscreen",
2138- widget.get_active())
2139-
2140- def on_checkbutton_systray_icon_toggled(self, widget):
2141- """System Tray Icon checkbox toggled"""
2142- self.config.write_preference_value("General", "display_icon",
2143- widget.get_active())
2144-
2145- def on_effect_checkbox_toggled(self, widget):
2146- """Effect checkbox toggled"""
2147- combobox = self.widgets.get_widget("effect_combobox")
2148- combobox.set_sensitive(widget.get_active())
2149- self.config.write_preference_value("General", "show_effects",
2150- widget.get_active())
2151-
2152- def on_effect_combobox_changed(self, widget):
2153- """User changed effect for screen transitions"""
2154- text = widget.get_active_text()
2155- if text == _("No effect"):
2156- english_text = "No effect"
2157- if text == _("Crossfade"):
2158- english_text = "Crossfade"
2159- if text == _("Zoom and fade"):
2160- english_text = "Zoom and fade"
2161- if text == _("Slide"):
2162- english_text = "Slide"
2163- self.config.write_preference_value("General", "transition_effect",
2164- english_text)
2165-
2166- def on_spinbutton_slideshow_step_value_changed(self, widget):
2167- """Activation of slideshow effects"""
2168- self.config.write_preference_value("Photographs", "slideshow_step",
2169- int(widget.get_value()))
2170-
2171- def on_dialog_closed(self, widget, after):
2172- """Callback function for dialog's close button"""
2173- self.close()
2174-
2175- def on_close_button_clicked(self, widget):
2176- """Callback function for dialog's close button"""
2177- self.close()
2178-
2179- def close(self):
2180- """Close Dialog"""
2181- try:
2182- proxy = MessageBusProxy(client_name = "Preferences GUI")
2183- proxy.connectToMessageBus()
2184- proxy.sendMessage(Message(MessageType.PREFERENCES_CONF_UPDATED))
2185- proxy.disconnectFromMessageBus()
2186- except socket.error:
2187- error = gtk.MessageDialog(
2188- None, gtk.DIALOG_MODAL,
2189- gtk.MESSAGE_WARNING, gtk.BUTTONS_OK, _(
2190- "Entertainer backend is not running. "
2191- "Config updates will happen on backend restart."
2192- ))
2193- error.run()
2194- error.destroy()
2195-
2196-
2197- if(self.STAND_ALONE):
2198- self.pref_dialog.hide()
2199- self.pref_dialog.destroy()
2200- gtk.main_quit()
2201- else:
2202- self.pref_dialog.hide()
2203- self.pref_dialog.destroy()
2204-
2205- def init_dialog_values_from_configure_file(self):
2206- """Read configure file and set dialog widget values with read values.
2207- """
2208- self.load_themes()
2209- current_theme = self.config.get_theme_name()
2210-
2211- themelist_widget = self.widgets.get_widget("theme_list")
2212- model = gtk.ListStore(str)
2213-
2214- cell_renderer = gtk.CellRendererText()
2215- column = gtk.TreeViewColumn("Themes", cell_renderer, text=0)
2216- themelist_widget.append_column(column)
2217-
2218- # Fill model with installed themes
2219- for i in range(len(self.themes)):
2220- model.insert(i, [self.themes[i]])
2221-
2222- themelist_widget.set_model(model)
2223-
2224- # Set current theme selected in theme list
2225- index = model.get_iter_first()
2226- unselected = True
2227- index_counter = 0
2228- while(unselected):
2229- name = model.get_value(index, 0)
2230- if name == current_theme:
2231- unselected = False
2232- themelist_widget.set_cursor(index_counter)
2233- index = model.iter_next(index)
2234- index_counter += 1
2235-
2236- # Checkboxes
2237- checkbutton_systray_icon = self.widgets.get_widget(
2238- "checkbutton_systray_icon")
2239- if self.config.tray_icon_enabled():
2240- checkbutton_systray_icon.set_active(True)
2241- else:
2242- checkbutton_systray_icon.set_active(False)
2243-
2244- checkbutton_autostart = self.widgets.get_widget("checkbutton_autostart")
2245- if self.config.start_auto_server():
2246- checkbutton_autostart.set_active(True)
2247- else:
2248- checkbutton_autostart.set_active(False)
2249-
2250- checkbutton_fullscreen = self.widgets.get_widget(
2251- "checkbutton_fullscreen")
2252- if self.config.start_in_fullscreen():
2253- checkbutton_fullscreen.set_active(True)
2254- else:
2255- checkbutton_fullscreen.set_active(False)
2256-
2257- effect_checkbox = self.widgets.get_widget("effect_checkbox")
2258- effect_combobox = self.widgets.get_widget("effect_combobox")
2259- if self.config.show_effects():
2260- effect_checkbox.set_active(True)
2261- effect_combobox.set_sensitive(True)
2262- else:
2263- effect_checkbox.set_active(False)
2264- effect_combobox.set_sensitive(False)
2265-
2266- spinbutton_slideshow_step = self.widgets.get_widget(
2267- "spinbutton_slideshow_step")
2268- spinbutton_slideshow_step.set_value(self.config.get_slideshow_step())
2269-
2270- # Set Effect Combobox value (Text values are set in glade file)
2271- effect = self.config.transition_effect()
2272- if effect == "No effect":
2273- effect_combobox.set_active(0)
2274- if effect == "Crossfade":
2275- effect_combobox.set_active(1)
2276- if effect == "Zoom and fade":
2277- effect_combobox.set_active(2)
2278- if effect == "Slide":
2279- effect_combobox.set_active(3)
2280-
2281
2282=== removed file 'entertainerlib/glade/entertainer-preferences.glade'
2283--- entertainerlib/glade/entertainer-preferences.glade 2009-03-08 22:29:55 +0000
2284+++ entertainerlib/glade/entertainer-preferences.glade 1970-01-01 00:00:00 +0000
2285@@ -1,1223 +0,0 @@
2286-<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*-->
2287-<!DOCTYPE glade-interface SYSTEM "http://glade.gnome.org/glade-2.0.dtd">
2288-
2289-<glade-interface>
2290-
2291-<widget class="GtkDialog" id="PreferencesDialog">
2292- <property name="border_width">5</property>
2293- <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
2294- <property name="title" translatable="yes">Preferences</property>
2295- <property name="type">GTK_WINDOW_TOPLEVEL</property>
2296- <property name="window_position">GTK_WIN_POS_CENTER</property>
2297- <property name="modal">True</property>
2298- <property name="resizable">True</property>
2299- <property name="destroy_with_parent">False</property>
2300- <property name="icon_name">gtk-preferences</property>
2301- <property name="decorated">True</property>
2302- <property name="skip_taskbar_hint">False</property>
2303- <property name="skip_pager_hint">False</property>
2304- <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property>
2305- <property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
2306- <property name="focus_on_map">True</property>
2307- <property name="urgency_hint">False</property>
2308- <property name="has_separator">False</property>
2309- <signal name="delete_event" handler="on_PreferencesDialog_delete_event"/>
2310-
2311- <child internal-child="vbox">
2312- <widget class="GtkVBox" id="dialog-vbox1">
2313- <property name="visible">True</property>
2314- <property name="homogeneous">False</property>
2315- <property name="spacing">2</property>
2316-
2317- <child internal-child="action_area">
2318- <widget class="GtkHButtonBox" id="dialog-action_area1">
2319- <property name="visible">True</property>
2320- <property name="layout_style">GTK_BUTTONBOX_END</property>
2321-
2322- <child>
2323- <widget class="GtkButton" id="close_button">
2324- <property name="visible">True</property>
2325- <property name="can_focus">True</property>
2326- <property name="label">gtk-close</property>
2327- <property name="use_stock">True</property>
2328- <property name="relief">GTK_RELIEF_NORMAL</property>
2329- <property name="focus_on_click">True</property>
2330- <property name="response_id">0</property>
2331- <signal name="clicked" handler="on_close_button_clicked"/>
2332- </widget>
2333- </child>
2334- </widget>
2335- <packing>
2336- <property name="padding">0</property>
2337- <property name="expand">False</property>
2338- <property name="fill">True</property>
2339- <property name="pack_type">GTK_PACK_END</property>
2340- </packing>
2341- </child>
2342-
2343- <child>
2344- <widget class="GtkNotebook" id="notebook1">
2345- <property name="visible">True</property>
2346- <property name="can_focus">True</property>
2347- <property name="show_tabs">True</property>
2348- <property name="show_border">True</property>
2349- <property name="tab_pos">GTK_POS_TOP</property>
2350- <property name="scrollable">False</property>
2351- <property name="enable_popup">False</property>
2352-
2353- <child>
2354- <widget class="GtkVBox" id="vbox4">
2355- <property name="visible">True</property>
2356- <property name="homogeneous">False</property>
2357- <property name="spacing">0</property>
2358-
2359- <child>
2360- <widget class="GtkFrame" id="frame3">
2361- <property name="border_width">5</property>
2362- <property name="visible">True</property>
2363- <property name="label_xalign">0</property>
2364- <property name="label_yalign">0.5</property>
2365- <property name="shadow_type">GTK_SHADOW_NONE</property>
2366-
2367- <child>
2368- <widget class="GtkAlignment" id="alignment3">
2369- <property name="visible">True</property>
2370- <property name="xalign">0.5</property>
2371- <property name="yalign">0.5</property>
2372- <property name="xscale">1</property>
2373- <property name="yscale">1</property>
2374- <property name="top_padding">0</property>
2375- <property name="bottom_padding">0</property>
2376- <property name="left_padding">12</property>
2377- <property name="right_padding">0</property>
2378-
2379- <child>
2380- <widget class="GtkVBox" id="vbox5">
2381- <property name="visible">True</property>
2382- <property name="homogeneous">False</property>
2383- <property name="spacing">0</property>
2384-
2385- <child>
2386- <widget class="GtkCheckButton" id="checkbutton_autostart">
2387- <property name="visible">True</property>
2388- <property name="can_focus">True</property>
2389- <property name="label" translatable="yes">Start server automatically</property>
2390- <property name="use_underline">True</property>
2391- <property name="relief">GTK_RELIEF_NORMAL</property>
2392- <property name="focus_on_click">True</property>
2393- <property name="active">False</property>
2394- <property name="inconsistent">False</property>
2395- <property name="draw_indicator">True</property>
2396- <signal name="toggled" handler="on_checkbutton_autostart_toggled"/>
2397- </widget>
2398- <packing>
2399- <property name="padding">0</property>
2400- <property name="expand">True</property>
2401- <property name="fill">True</property>
2402- </packing>
2403- </child>
2404-
2405- <child>
2406- <widget class="GtkCheckButton" id="checkbutton_systray_icon">
2407- <property name="visible">True</property>
2408- <property name="can_focus">True</property>
2409- <property name="label" translatable="yes">Display system tray icon in notification area</property>
2410- <property name="use_underline">True</property>
2411- <property name="relief">GTK_RELIEF_NORMAL</property>
2412- <property name="focus_on_click">True</property>
2413- <property name="active">False</property>
2414- <property name="inconsistent">False</property>
2415- <property name="draw_indicator">True</property>
2416- <signal name="toggled" handler="on_checkbutton_systray_icon_toggled"/>
2417- </widget>
2418- <packing>
2419- <property name="padding">0</property>
2420- <property name="expand">True</property>
2421- <property name="fill">True</property>
2422- </packing>
2423- </child>
2424-
2425- <child>
2426- <widget class="GtkCheckButton" id="checkbutton_fullscreen">
2427- <property name="visible">True</property>
2428- <property name="can_focus">True</property>
2429- <property name="label" translatable="yes">Start in fullscreen</property>
2430- <property name="use_underline">True</property>
2431- <property name="relief">GTK_RELIEF_NORMAL</property>
2432- <property name="focus_on_click">True</property>
2433- <property name="active">False</property>
2434- <property name="inconsistent">False</property>
2435- <property name="draw_indicator">True</property>
2436- <signal name="toggled" handler="on_checkbutton_fullscreen_toggled" last_modification_time="Sun, 08 Mar 2009 21:58:45 GMT"/>
2437- </widget>
2438- <packing>
2439- <property name="padding">0</property>
2440- <property name="expand">True</property>
2441- <property name="fill">True</property>
2442- </packing>
2443- </child>
2444- </widget>
2445- </child>
2446- </widget>
2447- </child>
2448-
2449- <child>
2450- <widget class="GtkLabel" id="label15">
2451- <property name="visible">True</property>
2452- <property name="label" translatable="yes">&lt;b&gt;Server settings&lt;/b&gt;</property>
2453- <property name="use_underline">False</property>
2454- <property name="use_markup">True</property>
2455- <property name="justify">GTK_JUSTIFY_LEFT</property>
2456- <property name="wrap">False</property>
2457- <property name="selectable">False</property>
2458- <property name="xalign">0.5</property>
2459- <property name="yalign">0.5</property>
2460- <property name="xpad">0</property>
2461- <property name="ypad">0</property>
2462- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
2463- <property name="width_chars">-1</property>
2464- <property name="single_line_mode">False</property>
2465- <property name="angle">0</property>
2466- </widget>
2467- <packing>
2468- <property name="type">label_item</property>
2469- </packing>
2470- </child>
2471- </widget>
2472- <packing>
2473- <property name="padding">5</property>
2474- <property name="expand">True</property>
2475- <property name="fill">True</property>
2476- </packing>
2477- </child>
2478-
2479- <child>
2480- <widget class="GtkFrame" id="frame4">
2481- <property name="border_width">5</property>
2482- <property name="label_xalign">0</property>
2483- <property name="label_yalign">0.5</property>
2484- <property name="shadow_type">GTK_SHADOW_NONE</property>
2485-
2486- <child>
2487- <widget class="GtkAlignment" id="alignment4">
2488- <property name="visible">True</property>
2489- <property name="xalign">0.5</property>
2490- <property name="yalign">0.5</property>
2491- <property name="xscale">1</property>
2492- <property name="yscale">1</property>
2493- <property name="top_padding">0</property>
2494- <property name="bottom_padding">0</property>
2495- <property name="left_padding">12</property>
2496- <property name="right_padding">0</property>
2497-
2498- <child>
2499- <widget class="GtkVBox" id="vbox6">
2500- <property name="visible">True</property>
2501- <property name="homogeneous">False</property>
2502- <property name="spacing">0</property>
2503-
2504- <child>
2505- <widget class="GtkHBox" id="hbox9">
2506- <property name="visible">True</property>
2507- <property name="homogeneous">False</property>
2508- <property name="spacing">0</property>
2509-
2510- <child>
2511- <widget class="GtkSpinButton" id="spinbutton1">
2512- <property name="visible">True</property>
2513- <property name="can_focus">True</property>
2514- <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
2515- <property name="climb_rate">1</property>
2516- <property name="digits">0</property>
2517- <property name="numeric">False</property>
2518- <property name="update_policy">GTK_UPDATE_ALWAYS</property>
2519- <property name="snap_to_ticks">False</property>
2520- <property name="wrap">False</property>
2521- <property name="adjustment">0 0 100 1 10 0</property>
2522- </widget>
2523- <packing>
2524- <property name="padding">0</property>
2525- <property name="expand">False</property>
2526- <property name="fill">True</property>
2527- </packing>
2528- </child>
2529-
2530- <child>
2531- <widget class="GtkLabel" id="label26">
2532- <property name="visible">True</property>
2533- <property name="label" translatable="yes">Screen history size</property>
2534- <property name="use_underline">False</property>
2535- <property name="use_markup">False</property>
2536- <property name="justify">GTK_JUSTIFY_LEFT</property>
2537- <property name="wrap">False</property>
2538- <property name="selectable">False</property>
2539- <property name="xalign">0.5</property>
2540- <property name="yalign">0.5</property>
2541- <property name="xpad">0</property>
2542- <property name="ypad">0</property>
2543- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
2544- <property name="width_chars">-1</property>
2545- <property name="single_line_mode">False</property>
2546- <property name="angle">0</property>
2547- </widget>
2548- <packing>
2549- <property name="padding">5</property>
2550- <property name="expand">False</property>
2551- <property name="fill">True</property>
2552- </packing>
2553- </child>
2554- </widget>
2555- <packing>
2556- <property name="padding">0</property>
2557- <property name="expand">True</property>
2558- <property name="fill">True</property>
2559- </packing>
2560- </child>
2561-
2562- <child>
2563- <placeholder/>
2564- </child>
2565-
2566- <child>
2567- <placeholder/>
2568- </child>
2569- </widget>
2570- </child>
2571- </widget>
2572- </child>
2573-
2574- <child>
2575- <widget class="GtkLabel" id="label16">
2576- <property name="visible">True</property>
2577- <property name="label" translatable="yes">&lt;b&gt;What comes here?&lt;/b&gt;</property>
2578- <property name="use_underline">False</property>
2579- <property name="use_markup">True</property>
2580- <property name="justify">GTK_JUSTIFY_LEFT</property>
2581- <property name="wrap">False</property>
2582- <property name="selectable">False</property>
2583- <property name="xalign">0.5</property>
2584- <property name="yalign">0.5</property>
2585- <property name="xpad">0</property>
2586- <property name="ypad">0</property>
2587- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
2588- <property name="width_chars">-1</property>
2589- <property name="single_line_mode">False</property>
2590- <property name="angle">0</property>
2591- </widget>
2592- <packing>
2593- <property name="type">label_item</property>
2594- </packing>
2595- </child>
2596- </widget>
2597- <packing>
2598- <property name="padding">5</property>
2599- <property name="expand">True</property>
2600- <property name="fill">True</property>
2601- </packing>
2602- </child>
2603- </widget>
2604- <packing>
2605- <property name="tab_expand">False</property>
2606- <property name="tab_fill">True</property>
2607- </packing>
2608- </child>
2609-
2610- <child>
2611- <widget class="GtkLabel" id="label1">
2612- <property name="visible">True</property>
2613- <property name="label" translatable="yes">General</property>
2614- <property name="use_underline">False</property>
2615- <property name="use_markup">False</property>
2616- <property name="justify">GTK_JUSTIFY_LEFT</property>
2617- <property name="wrap">False</property>
2618- <property name="selectable">False</property>
2619- <property name="xalign">0.5</property>
2620- <property name="yalign">0.5</property>
2621- <property name="xpad">0</property>
2622- <property name="ypad">0</property>
2623- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
2624- <property name="width_chars">-1</property>
2625- <property name="single_line_mode">False</property>
2626- <property name="angle">0</property>
2627- </widget>
2628- <packing>
2629- <property name="type">tab</property>
2630- </packing>
2631- </child>
2632-
2633- <child>
2634- <widget class="GtkVBox" id="vbox_user_interface">
2635- <property name="visible">True</property>
2636- <property name="homogeneous">False</property>
2637- <property name="spacing">0</property>
2638-
2639- <child>
2640- <widget class="GtkFrame" id="frame_effects">
2641- <property name="border_width">5</property>
2642- <property name="visible">True</property>
2643- <property name="label_xalign">0</property>
2644- <property name="label_yalign">0.5</property>
2645- <property name="shadow_type">GTK_SHADOW_NONE</property>
2646-
2647- <child>
2648- <widget class="GtkAlignment" id="alignment5">
2649- <property name="visible">True</property>
2650- <property name="xalign">0.5</property>
2651- <property name="yalign">0.5</property>
2652- <property name="xscale">1</property>
2653- <property name="yscale">1</property>
2654- <property name="top_padding">0</property>
2655- <property name="bottom_padding">0</property>
2656- <property name="left_padding">12</property>
2657- <property name="right_padding">0</property>
2658-
2659- <child>
2660- <widget class="GtkVBox" id="vbox7">
2661- <property name="visible">True</property>
2662- <property name="homogeneous">False</property>
2663- <property name="spacing">0</property>
2664-
2665- <child>
2666- <widget class="GtkCheckButton" id="effect_checkbox">
2667- <property name="visible">True</property>
2668- <property name="can_focus">True</property>
2669- <property name="label" translatable="yes">Show user interface effects</property>
2670- <property name="use_underline">True</property>
2671- <property name="relief">GTK_RELIEF_NORMAL</property>
2672- <property name="focus_on_click">True</property>
2673- <property name="active">False</property>
2674- <property name="inconsistent">False</property>
2675- <property name="draw_indicator">True</property>
2676- <signal name="toggled" handler="on_effect_checkbox_toggled"/>
2677- </widget>
2678- <packing>
2679- <property name="padding">5</property>
2680- <property name="expand">True</property>
2681- <property name="fill">True</property>
2682- </packing>
2683- </child>
2684-
2685- <child>
2686- <widget class="GtkHBox" id="hbox1">
2687- <property name="visible">True</property>
2688- <property name="homogeneous">False</property>
2689- <property name="spacing">0</property>
2690-
2691- <child>
2692- <widget class="GtkLabel" id="label19">
2693- <property name="visible">True</property>
2694- <property name="label" translatable="yes">Screen change effect</property>
2695- <property name="use_underline">False</property>
2696- <property name="use_markup">False</property>
2697- <property name="justify">GTK_JUSTIFY_LEFT</property>
2698- <property name="wrap">False</property>
2699- <property name="selectable">False</property>
2700- <property name="xalign">0</property>
2701- <property name="yalign">0.5</property>
2702- <property name="xpad">0</property>
2703- <property name="ypad">0</property>
2704- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
2705- <property name="width_chars">-1</property>
2706- <property name="single_line_mode">False</property>
2707- <property name="angle">0</property>
2708- </widget>
2709- <packing>
2710- <property name="padding">5</property>
2711- <property name="expand">False</property>
2712- <property name="fill">True</property>
2713- </packing>
2714- </child>
2715-
2716- <child>
2717- <widget class="GtkComboBox" id="effect_combobox">
2718- <property name="visible">True</property>
2719- <property name="items" translatable="yes">No effect
2720-Crossfade
2721-Zoom and fade
2722-Slide</property>
2723- <property name="add_tearoffs">False</property>
2724- <property name="focus_on_click">True</property>
2725- <signal name="changed" handler="on_effect_combobox_changed"/>
2726- </widget>
2727- <packing>
2728- <property name="padding">0</property>
2729- <property name="expand">True</property>
2730- <property name="fill">True</property>
2731- </packing>
2732- </child>
2733- </widget>
2734- <packing>
2735- <property name="padding">0</property>
2736- <property name="expand">True</property>
2737- <property name="fill">True</property>
2738- </packing>
2739- </child>
2740- </widget>
2741- </child>
2742- </widget>
2743- </child>
2744-
2745- <child>
2746- <widget class="GtkLabel" id="label17">
2747- <property name="visible">True</property>
2748- <property name="label" translatable="yes">&lt;b&gt;Effects&lt;/b&gt;</property>
2749- <property name="use_underline">False</property>
2750- <property name="use_markup">True</property>
2751- <property name="justify">GTK_JUSTIFY_LEFT</property>
2752- <property name="wrap">False</property>
2753- <property name="selectable">False</property>
2754- <property name="xalign">0.5</property>
2755- <property name="yalign">0.5</property>
2756- <property name="xpad">0</property>
2757- <property name="ypad">0</property>
2758- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
2759- <property name="width_chars">-1</property>
2760- <property name="single_line_mode">False</property>
2761- <property name="angle">0</property>
2762- </widget>
2763- <packing>
2764- <property name="type">label_item</property>
2765- </packing>
2766- </child>
2767- </widget>
2768- <packing>
2769- <property name="padding">5</property>
2770- <property name="expand">False</property>
2771- <property name="fill">True</property>
2772- </packing>
2773- </child>
2774-
2775- <child>
2776- <widget class="GtkFrame" id="frame_themes">
2777- <property name="border_width">5</property>
2778- <property name="visible">True</property>
2779- <property name="label_xalign">0</property>
2780- <property name="label_yalign">0.5</property>
2781- <property name="shadow_type">GTK_SHADOW_NONE</property>
2782-
2783- <child>
2784- <widget class="GtkAlignment" id="alignment6">
2785- <property name="visible">True</property>
2786- <property name="xalign">0.5</property>
2787- <property name="yalign">0.5</property>
2788- <property name="xscale">1</property>
2789- <property name="yscale">1</property>
2790- <property name="top_padding">0</property>
2791- <property name="bottom_padding">0</property>
2792- <property name="left_padding">12</property>
2793- <property name="right_padding">0</property>
2794-
2795- <child>
2796- <widget class="GtkHBox" id="hbox2">
2797- <property name="visible">True</property>
2798- <property name="homogeneous">False</property>
2799- <property name="spacing">0</property>
2800-
2801- <child>
2802- <widget class="GtkScrolledWindow" id="scrolledwindow1">
2803- <property name="visible">True</property>
2804- <property name="can_focus">True</property>
2805- <property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
2806- <property name="vscrollbar_policy">GTK_POLICY_ALWAYS</property>
2807- <property name="shadow_type">GTK_SHADOW_IN</property>
2808- <property name="window_placement">GTK_CORNER_TOP_LEFT</property>
2809-
2810- <child>
2811- <widget class="GtkTreeView" id="theme_list">
2812- <property name="visible">True</property>
2813- <property name="can_focus">True</property>
2814- <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
2815- <property name="headers_visible">False</property>
2816- <property name="rules_hint">False</property>
2817- <property name="reorderable">False</property>
2818- <property name="enable_search">False</property>
2819- <property name="fixed_height_mode">False</property>
2820- <property name="hover_selection">False</property>
2821- <property name="hover_expand">False</property>
2822- <signal name="cursor_changed" handler="on_theme_list_cursor_changed"/>
2823- </widget>
2824- </child>
2825- </widget>
2826- <packing>
2827- <property name="padding">0</property>
2828- <property name="expand">True</property>
2829- <property name="fill">True</property>
2830- </packing>
2831- </child>
2832-
2833- <child>
2834- <widget class="GtkVButtonBox" id="vbuttonbox1">
2835- <property name="visible">True</property>
2836- <property name="layout_style">GTK_BUTTONBOX_START</property>
2837- <property name="spacing">5</property>
2838-
2839- <child>
2840- <widget class="GtkButton" id="add_button">
2841- <property name="visible">True</property>
2842- <property name="can_focus">True</property>
2843- <property name="label">gtk-add</property>
2844- <property name="use_stock">True</property>
2845- <property name="relief">GTK_RELIEF_NORMAL</property>
2846- <property name="focus_on_click">True</property>
2847- <signal name="clicked" handler="on_add_button_clicked"/>
2848- </widget>
2849- </child>
2850-
2851- <child>
2852- <widget class="GtkButton" id="remove_button">
2853- <property name="visible">True</property>
2854- <property name="can_focus">True</property>
2855- <property name="label">gtk-remove</property>
2856- <property name="use_stock">True</property>
2857- <property name="relief">GTK_RELIEF_NORMAL</property>
2858- <property name="focus_on_click">True</property>
2859- <signal name="clicked" handler="on_remove_button_clicked"/>
2860- </widget>
2861- </child>
2862- </widget>
2863- <packing>
2864- <property name="padding">10</property>
2865- <property name="expand">False</property>
2866- <property name="fill">True</property>
2867- </packing>
2868- </child>
2869- </widget>
2870- </child>
2871- </widget>
2872- </child>
2873-
2874- <child>
2875- <widget class="GtkLabel" id="label18">
2876- <property name="visible">True</property>
2877- <property name="label" translatable="yes">&lt;b&gt;Themes&lt;/b&gt;</property>
2878- <property name="use_underline">False</property>
2879- <property name="use_markup">True</property>
2880- <property name="justify">GTK_JUSTIFY_LEFT</property>
2881- <property name="wrap">False</property>
2882- <property name="selectable">False</property>
2883- <property name="xalign">0.5</property>
2884- <property name="yalign">0.5</property>
2885- <property name="xpad">0</property>
2886- <property name="ypad">5</property>
2887- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
2888- <property name="width_chars">-1</property>
2889- <property name="single_line_mode">False</property>
2890- <property name="angle">0</property>
2891- </widget>
2892- <packing>
2893- <property name="type">label_item</property>
2894- </packing>
2895- </child>
2896- </widget>
2897- <packing>
2898- <property name="padding">5</property>
2899- <property name="expand">True</property>
2900- <property name="fill">True</property>
2901- </packing>
2902- </child>
2903-
2904- <child>
2905- <widget class="GtkFrame" id="frame_theme_information">
2906- <property name="border_width">5</property>
2907- <property name="visible">True</property>
2908- <property name="label_xalign">0</property>
2909- <property name="label_yalign">0.5</property>
2910- <property name="shadow_type">GTK_SHADOW_NONE</property>
2911-
2912- <child>
2913- <widget class="GtkAlignment" id="alignment7">
2914- <property name="visible">True</property>
2915- <property name="xalign">0.5</property>
2916- <property name="yalign">0.5</property>
2917- <property name="xscale">1</property>
2918- <property name="yscale">1</property>
2919- <property name="top_padding">0</property>
2920- <property name="bottom_padding">0</property>
2921- <property name="left_padding">12</property>
2922- <property name="right_padding">0</property>
2923-
2924- <child>
2925- <widget class="GtkHBox" id="hbox3">
2926- <property name="visible">True</property>
2927- <property name="homogeneous">False</property>
2928- <property name="spacing">0</property>
2929-
2930- <child>
2931- <widget class="GtkImage" id="theme_image">
2932- <property name="visible">True</property>
2933- <property name="stock">gtk-missing-image</property>
2934- <property name="icon_size">4</property>
2935- <property name="xalign">0.5</property>
2936- <property name="yalign">0.5</property>
2937- <property name="xpad">0</property>
2938- <property name="ypad">0</property>
2939- </widget>
2940- <packing>
2941- <property name="padding">0</property>
2942- <property name="expand">False</property>
2943- <property name="fill">False</property>
2944- </packing>
2945- </child>
2946-
2947- <child>
2948- <widget class="GtkVBox" id="vbox8">
2949- <property name="visible">True</property>
2950- <property name="homogeneous">False</property>
2951- <property name="spacing">0</property>
2952-
2953- <child>
2954- <widget class="GtkHBox" id="hbox4">
2955- <property name="visible">True</property>
2956- <property name="homogeneous">False</property>
2957- <property name="spacing">0</property>
2958-
2959- <child>
2960- <widget class="GtkLabel" id="label21">
2961- <property name="visible">True</property>
2962- <property name="label" translatable="yes">&lt;b&gt;Name:&lt;/b&gt;</property>
2963- <property name="use_underline">False</property>
2964- <property name="use_markup">True</property>
2965- <property name="justify">GTK_JUSTIFY_LEFT</property>
2966- <property name="wrap">False</property>
2967- <property name="selectable">False</property>
2968- <property name="xalign">0</property>
2969- <property name="yalign">0.5</property>
2970- <property name="xpad">0</property>
2971- <property name="ypad">5</property>
2972- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
2973- <property name="width_chars">-1</property>
2974- <property name="single_line_mode">False</property>
2975- <property name="angle">0</property>
2976- </widget>
2977- <packing>
2978- <property name="padding">5</property>
2979- <property name="expand">False</property>
2980- <property name="fill">True</property>
2981- </packing>
2982- </child>
2983-
2984- <child>
2985- <widget class="GtkLabel" id="name_label">
2986- <property name="visible">True</property>
2987- <property name="label" translatable="yes"></property>
2988- <property name="use_underline">False</property>
2989- <property name="use_markup">False</property>
2990- <property name="justify">GTK_JUSTIFY_LEFT</property>
2991- <property name="wrap">False</property>
2992- <property name="selectable">False</property>
2993- <property name="xalign">0</property>
2994- <property name="yalign">0.5</property>
2995- <property name="xpad">0</property>
2996- <property name="ypad">0</property>
2997- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
2998- <property name="width_chars">-1</property>
2999- <property name="single_line_mode">False</property>
3000- <property name="angle">0</property>
3001- </widget>
3002- <packing>
3003- <property name="padding">0</property>
3004- <property name="expand">True</property>
3005- <property name="fill">True</property>
3006- </packing>
3007- </child>
3008- </widget>
3009- <packing>
3010- <property name="padding">0</property>
3011- <property name="expand">True</property>
3012- <property name="fill">True</property>
3013- </packing>
3014- </child>
3015-
3016- <child>
3017- <widget class="GtkHBox" id="hbox5">
3018- <property name="visible">True</property>
3019- <property name="homogeneous">False</property>
3020- <property name="spacing">0</property>
3021-
3022- <child>
3023- <widget class="GtkLabel" id="label22">
3024- <property name="visible">True</property>
3025- <property name="label" translatable="yes">&lt;b&gt;Author:&lt;/b&gt;</property>
3026- <property name="use_underline">False</property>
3027- <property name="use_markup">True</property>
3028- <property name="justify">GTK_JUSTIFY_LEFT</property>
3029- <property name="wrap">False</property>
3030- <property name="selectable">False</property>
3031- <property name="xalign">0</property>
3032- <property name="yalign">0.5</property>
3033- <property name="xpad">0</property>
3034- <property name="ypad">5</property>
3035- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
3036- <property name="width_chars">-1</property>
3037- <property name="single_line_mode">False</property>
3038- <property name="angle">0</property>
3039- </widget>
3040- <packing>
3041- <property name="padding">5</property>
3042- <property name="expand">False</property>
3043- <property name="fill">True</property>
3044- </packing>
3045- </child>
3046-
3047- <child>
3048- <widget class="GtkLabel" id="author_label">
3049- <property name="visible">True</property>
3050- <property name="label" translatable="yes"></property>
3051- <property name="use_underline">False</property>
3052- <property name="use_markup">False</property>
3053- <property name="justify">GTK_JUSTIFY_LEFT</property>
3054- <property name="wrap">False</property>
3055- <property name="selectable">False</property>
3056- <property name="xalign">0</property>
3057- <property name="yalign">0.5</property>
3058- <property name="xpad">0</property>
3059- <property name="ypad">0</property>
3060- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
3061- <property name="width_chars">-1</property>
3062- <property name="single_line_mode">False</property>
3063- <property name="angle">0</property>
3064- </widget>
3065- <packing>
3066- <property name="padding">0</property>
3067- <property name="expand">True</property>
3068- <property name="fill">True</property>
3069- </packing>
3070- </child>
3071- </widget>
3072- <packing>
3073- <property name="padding">0</property>
3074- <property name="expand">True</property>
3075- <property name="fill">True</property>
3076- </packing>
3077- </child>
3078-
3079- <child>
3080- <widget class="GtkHBox" id="hbox6">
3081- <property name="visible">True</property>
3082- <property name="homogeneous">False</property>
3083- <property name="spacing">0</property>
3084-
3085- <child>
3086- <widget class="GtkLabel" id="label23">
3087- <property name="visible">True</property>
3088- <property name="label" translatable="yes">&lt;b&gt;Licence:&lt;/b&gt;</property>
3089- <property name="use_underline">False</property>
3090- <property name="use_markup">True</property>
3091- <property name="justify">GTK_JUSTIFY_LEFT</property>
3092- <property name="wrap">False</property>
3093- <property name="selectable">False</property>
3094- <property name="xalign">0</property>
3095- <property name="yalign">0.5</property>
3096- <property name="xpad">0</property>
3097- <property name="ypad">5</property>
3098- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
3099- <property name="width_chars">-1</property>
3100- <property name="single_line_mode">False</property>
3101- <property name="angle">0</property>
3102- </widget>
3103- <packing>
3104- <property name="padding">5</property>
3105- <property name="expand">False</property>
3106- <property name="fill">True</property>
3107- </packing>
3108- </child>
3109-
3110- <child>
3111- <widget class="GtkLabel" id="licence_label">
3112- <property name="visible">True</property>
3113- <property name="label" translatable="yes"></property>
3114- <property name="use_underline">False</property>
3115- <property name="use_markup">False</property>
3116- <property name="justify">GTK_JUSTIFY_LEFT</property>
3117- <property name="wrap">False</property>
3118- <property name="selectable">False</property>
3119- <property name="xalign">0</property>
3120- <property name="yalign">0.5</property>
3121- <property name="xpad">0</property>
3122- <property name="ypad">0</property>
3123- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
3124- <property name="width_chars">-1</property>
3125- <property name="single_line_mode">False</property>
3126- <property name="angle">0</property>
3127- </widget>
3128- <packing>
3129- <property name="padding">0</property>
3130- <property name="expand">True</property>
3131- <property name="fill">True</property>
3132- </packing>
3133- </child>
3134- </widget>
3135- <packing>
3136- <property name="padding">0</property>
3137- <property name="expand">True</property>
3138- <property name="fill">True</property>
3139- </packing>
3140- </child>
3141-
3142- <child>
3143- <widget class="GtkHBox" id="hbox8">
3144- <property name="visible">True</property>
3145- <property name="homogeneous">False</property>
3146- <property name="spacing">0</property>
3147-
3148- <child>
3149- <widget class="GtkLabel" id="label24">
3150- <property name="visible">True</property>
3151- <property name="label" translatable="yes">&lt;b&gt;Copyright:&lt;/b&gt;</property>
3152- <property name="use_underline">False</property>
3153- <property name="use_markup">True</property>
3154- <property name="justify">GTK_JUSTIFY_LEFT</property>
3155- <property name="wrap">False</property>
3156- <property name="selectable">False</property>
3157- <property name="xalign">0</property>
3158- <property name="yalign">0.5</property>
3159- <property name="xpad">0</property>
3160- <property name="ypad">5</property>
3161- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
3162- <property name="width_chars">-1</property>
3163- <property name="single_line_mode">False</property>
3164- <property name="angle">0</property>
3165- </widget>
3166- <packing>
3167- <property name="padding">5</property>
3168- <property name="expand">False</property>
3169- <property name="fill">True</property>
3170- </packing>
3171- </child>
3172-
3173- <child>
3174- <widget class="GtkLabel" id="copyright_label">
3175- <property name="visible">True</property>
3176- <property name="label" translatable="yes"></property>
3177- <property name="use_underline">False</property>
3178- <property name="use_markup">False</property>
3179- <property name="justify">GTK_JUSTIFY_LEFT</property>
3180- <property name="wrap">False</property>
3181- <property name="selectable">False</property>
3182- <property name="xalign">0</property>
3183- <property name="yalign">0.5</property>
3184- <property name="xpad">0</property>
3185- <property name="ypad">0</property>
3186- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
3187- <property name="width_chars">-1</property>
3188- <property name="single_line_mode">False</property>
3189- <property name="angle">0</property>
3190- </widget>
3191- <packing>
3192- <property name="padding">0</property>
3193- <property name="expand">True</property>
3194- <property name="fill">True</property>
3195- </packing>
3196- </child>
3197- </widget>
3198- <packing>
3199- <property name="padding">0</property>
3200- <property name="expand">True</property>
3201- <property name="fill">True</property>
3202- </packing>
3203- </child>
3204-
3205- <child>
3206- <widget class="GtkHBox" id="hbox7">
3207- <property name="visible">True</property>
3208- <property name="homogeneous">False</property>
3209- <property name="spacing">0</property>
3210-
3211- <child>
3212- <widget class="GtkLabel" id="label25">
3213- <property name="visible">True</property>
3214- <property name="label" translatable="yes">&lt;b&gt;Comment:&lt;/b&gt;</property>
3215- <property name="use_underline">False</property>
3216- <property name="use_markup">True</property>
3217- <property name="justify">GTK_JUSTIFY_LEFT</property>
3218- <property name="wrap">False</property>
3219- <property name="selectable">False</property>
3220- <property name="xalign">0</property>
3221- <property name="yalign">0.5</property>
3222- <property name="xpad">0</property>
3223- <property name="ypad">5</property>
3224- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
3225- <property name="width_chars">-1</property>
3226- <property name="single_line_mode">False</property>
3227- <property name="angle">0</property>
3228- </widget>
3229- <packing>
3230- <property name="padding">5</property>
3231- <property name="expand">False</property>
3232- <property name="fill">True</property>
3233- </packing>
3234- </child>
3235-
3236- <child>
3237- <widget class="GtkLabel" id="comment_label">
3238- <property name="visible">True</property>
3239- <property name="label" translatable="yes"></property>
3240- <property name="use_underline">False</property>
3241- <property name="use_markup">False</property>
3242- <property name="justify">GTK_JUSTIFY_LEFT</property>
3243- <property name="wrap">True</property>
3244- <property name="selectable">False</property>
3245- <property name="xalign">0</property>
3246- <property name="yalign">0.5</property>
3247- <property name="xpad">0</property>
3248- <property name="ypad">0</property>
3249- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
3250- <property name="width_chars">-1</property>
3251- <property name="single_line_mode">False</property>
3252- <property name="angle">0</property>
3253- </widget>
3254- <packing>
3255- <property name="padding">0</property>
3256- <property name="expand">True</property>
3257- <property name="fill">True</property>
3258- </packing>
3259- </child>
3260- </widget>
3261- <packing>
3262- <property name="padding">0</property>
3263- <property name="expand">True</property>
3264- <property name="fill">True</property>
3265- </packing>
3266- </child>
3267- </widget>
3268- <packing>
3269- <property name="padding">0</property>
3270- <property name="expand">True</property>
3271- <property name="fill">True</property>
3272- </packing>
3273- </child>
3274- </widget>
3275- </child>
3276- </widget>
3277- </child>
3278-
3279- <child>
3280- <widget class="GtkLabel" id="label20">
3281- <property name="visible">True</property>
3282- <property name="label" translatable="yes">&lt;b&gt;Theme information&lt;/b&gt;</property>
3283- <property name="use_underline">False</property>
3284- <property name="use_markup">True</property>
3285- <property name="justify">GTK_JUSTIFY_LEFT</property>
3286- <property name="wrap">False</property>
3287- <property name="selectable">False</property>
3288- <property name="xalign">0.5</property>
3289- <property name="yalign">0.5</property>
3290- <property name="xpad">0</property>
3291- <property name="ypad">5</property>
3292- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
3293- <property name="width_chars">-1</property>
3294- <property name="single_line_mode">False</property>
3295- <property name="angle">0</property>
3296- </widget>
3297- <packing>
3298- <property name="type">label_item</property>
3299- </packing>
3300- </child>
3301- </widget>
3302- <packing>
3303- <property name="padding">0</property>
3304- <property name="expand">False</property>
3305- <property name="fill">True</property>
3306- </packing>
3307- </child>
3308- </widget>
3309- <packing>
3310- <property name="tab_expand">False</property>
3311- <property name="tab_fill">True</property>
3312- </packing>
3313- </child>
3314-
3315- <child>
3316- <widget class="GtkLabel" id="label2">
3317- <property name="visible">True</property>
3318- <property name="label" translatable="yes">User interface</property>
3319- <property name="use_underline">False</property>
3320- <property name="use_markup">False</property>
3321- <property name="justify">GTK_JUSTIFY_LEFT</property>
3322- <property name="wrap">False</property>
3323- <property name="selectable">False</property>
3324- <property name="xalign">0.5</property>
3325- <property name="yalign">0.5</property>
3326- <property name="xpad">0</property>
3327- <property name="ypad">0</property>
3328- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
3329- <property name="width_chars">-1</property>
3330- <property name="single_line_mode">False</property>
3331- <property name="angle">0</property>
3332- </widget>
3333- <packing>
3334- <property name="type">tab</property>
3335- </packing>
3336- </child>
3337-
3338- <child>
3339- <widget class="GtkVBox" id="vbox_photographs">
3340- <property name="visible">True</property>
3341- <property name="homogeneous">False</property>
3342- <property name="spacing">0</property>
3343-
3344- <child>
3345- <widget class="GtkFrame" id="fphotographs">
3346- <property name="visible">True</property>
3347- <property name="label_xalign">0</property>
3348- <property name="label_yalign">0.5</property>
3349- <property name="shadow_type">GTK_SHADOW_NONE</property>
3350-
3351- <child>
3352- <widget class="GtkAlignment" id="aphotographs1">
3353- <property name="visible">True</property>
3354- <property name="xalign">0.5</property>
3355- <property name="yalign">0.5</property>
3356- <property name="xscale">1</property>
3357- <property name="yscale">1</property>
3358- <property name="top_padding">0</property>
3359- <property name="bottom_padding">0</property>
3360- <property name="left_padding">12</property>
3361- <property name="right_padding">0</property>
3362-
3363- <child>
3364- <widget class="GtkVBox" id="vbox10">
3365- <property name="visible">True</property>
3366- <property name="homogeneous">False</property>
3367- <property name="spacing">0</property>
3368-
3369- <child>
3370- <widget class="GtkHBox" id="hbphotographs">
3371- <property name="visible">True</property>
3372- <property name="homogeneous">False</property>
3373- <property name="spacing">0</property>
3374-
3375- <child>
3376- <widget class="GtkSpinButton" id="spinbutton_slideshow_step">
3377- <property name="visible">True</property>
3378- <property name="can_focus">True</property>
3379- <property name="climb_rate">1</property>
3380- <property name="digits">0</property>
3381- <property name="numeric">True</property>
3382- <property name="update_policy">GTK_UPDATE_ALWAYS</property>
3383- <property name="snap_to_ticks">True</property>
3384- <property name="wrap">False</property>
3385- <property name="adjustment">5 1 100 1 10 0</property>
3386- <signal name="value_changed" handler="on_spinbutton_slideshow_step_value_changed"/>
3387- </widget>
3388- <packing>
3389- <property name="padding">0</property>
3390- <property name="expand">True</property>
3391- <property name="fill">True</property>
3392- </packing>
3393- </child>
3394-
3395- <child>
3396- <widget class="GtkLabel" id="lslideshowstep">
3397- <property name="visible">True</property>
3398- <property name="label" translatable="yes">Slideshow step (in seconds)</property>
3399- <property name="use_underline">False</property>
3400- <property name="use_markup">False</property>
3401- <property name="justify">GTK_JUSTIFY_LEFT</property>
3402- <property name="wrap">False</property>
3403- <property name="selectable">False</property>
3404- <property name="xalign">0.5</property>
3405- <property name="yalign">0.5</property>
3406- <property name="xpad">0</property>
3407- <property name="ypad">0</property>
3408- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
3409- <property name="width_chars">-1</property>
3410- <property name="single_line_mode">False</property>
3411- <property name="angle">0</property>
3412- </widget>
3413- <packing>
3414- <property name="padding">0</property>
3415- <property name="expand">True</property>
3416- <property name="fill">True</property>
3417- </packing>
3418- </child>
3419- </widget>
3420- <packing>
3421- <property name="padding">0</property>
3422- <property name="expand">False</property>
3423- <property name="fill">True</property>
3424- </packing>
3425- </child>
3426- </widget>
3427- </child>
3428- </widget>
3429- </child>
3430-
3431- <child>
3432- <widget class="GtkLabel" id="lslideshow">
3433- <property name="visible">True</property>
3434- <property name="label" translatable="yes">&lt;b&gt;Slideshow&lt;/b&gt;</property>
3435- <property name="use_underline">False</property>
3436- <property name="use_markup">True</property>
3437- <property name="justify">GTK_JUSTIFY_LEFT</property>
3438- <property name="wrap">False</property>
3439- <property name="selectable">False</property>
3440- <property name="xalign">0.5</property>
3441- <property name="yalign">0.5</property>
3442- <property name="xpad">0</property>
3443- <property name="ypad">0</property>
3444- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
3445- <property name="width_chars">-1</property>
3446- <property name="single_line_mode">False</property>
3447- <property name="angle">0</property>
3448- </widget>
3449- <packing>
3450- <property name="type">label_item</property>
3451- </packing>
3452- </child>
3453- </widget>
3454- <packing>
3455- <property name="padding">5</property>
3456- <property name="expand">True</property>
3457- <property name="fill">True</property>
3458- </packing>
3459- </child>
3460-
3461- <child>
3462- <placeholder/>
3463- </child>
3464-
3465- <child>
3466- <placeholder/>
3467- </child>
3468- </widget>
3469- <packing>
3470- <property name="tab_expand">False</property>
3471- <property name="tab_fill">True</property>
3472- </packing>
3473- </child>
3474-
3475- <child>
3476- <widget class="GtkLabel" id="LPhotographs">
3477- <property name="visible">True</property>
3478- <property name="label" translatable="yes">Photographs</property>
3479- <property name="use_underline">False</property>
3480- <property name="use_markup">False</property>
3481- <property name="justify">GTK_JUSTIFY_LEFT</property>
3482- <property name="wrap">False</property>
3483- <property name="selectable">False</property>
3484- <property name="xalign">0.5</property>
3485- <property name="yalign">0.5</property>
3486- <property name="xpad">0</property>
3487- <property name="ypad">0</property>
3488- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
3489- <property name="width_chars">-1</property>
3490- <property name="single_line_mode">False</property>
3491- <property name="angle">0</property>
3492- </widget>
3493- <packing>
3494- <property name="type">tab</property>
3495- </packing>
3496- </child>
3497- </widget>
3498- <packing>
3499- <property name="padding">0</property>
3500- <property name="expand">True</property>
3501- <property name="fill">True</property>
3502- </packing>
3503- </child>
3504- </widget>
3505- </child>
3506-</widget>
3507-
3508-</glade-interface>
3509
3510=== renamed file 'entertainerlib/glade/entertainer-content-management.glade' => 'entertainerlib/glade/manager.glade'
3511--- entertainerlib/glade/entertainer-content-management.glade 2009-05-31 16:36:18 +0000
3512+++ entertainerlib/glade/manager.glade 2009-08-23 01:01:18 +0000
3513@@ -1,1481 +1,2170 @@
3514-<?xml version="1.0"?>
3515+<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*-->
3516+<!DOCTYPE glade-interface SYSTEM "http://glade.gnome.org/glade-2.0.dtd">
3517+
3518 <glade-interface>
3519- <!-- interface-requires gtk+ 2.16 -->
3520- <!-- interface-naming-policy toplevel-contextual -->
3521- <widget class="GtkDialog" id="ContentManagementDialog">
3522- <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
3523- <property name="border_width">5</property>
3524- <property name="title" translatable="yes">Content management</property>
3525- <property name="modal">True</property>
3526- <property name="window_position">center</property>
3527- <property name="icon_name">applications-multimedia</property>
3528- <property name="type_hint">dialog</property>
3529- <property name="has_separator">False</property>
3530- <signal name="destroy" handler="on_ContentManagementDialog_destroy"/>
3531- <child internal-child="vbox">
3532- <widget class="GtkVBox" id="dialog-layout">
3533- <property name="visible">True</property>
3534- <property name="spacing">2</property>
3535- <child>
3536- <widget class="GtkNotebook" id="tabs">
3537- <property name="visible">True</property>
3538- <property name="can_focus">True</property>
3539- <property name="has_focus">True</property>
3540- <property name="can_default">True</property>
3541- <property name="has_default">True</property>
3542- <child>
3543- <widget class="GtkVBox" id="vbox_videos">
3544- <property name="visible">True</property>
3545- <child>
3546- <widget class="GtkVBox" id="vbox1">
3547- <property name="visible">True</property>
3548- <child>
3549- <widget class="GtkFrame" id="frame_video_lib1">
3550- <property name="visible">True</property>
3551- <property name="border_width">5</property>
3552- <property name="label_xalign">0</property>
3553- <property name="shadow_type">none</property>
3554- <child>
3555- <widget class="GtkAlignment" id="alignment1">
3556- <property name="visible">True</property>
3557- <property name="left_padding">12</property>
3558- <child>
3559- <widget class="GtkVBox" id="vbox2">
3560- <property name="visible">True</property>
3561- <child>
3562- <widget class="GtkLabel" id="label_video_folder_tip1">
3563- <property name="visible">True</property>
3564- <property name="xalign">0</property>
3565- <property name="label" translatable="yes">Entertainer video library scans data from the listed folders.</property>
3566- <property name="single_line_mode">True</property>
3567- </widget>
3568- <packing>
3569- <property name="expand">False</property>
3570- <property name="padding">5</property>
3571- <property name="position">0</property>
3572- </packing>
3573- </child>
3574- <child>
3575- <widget class="GtkHBox" id="hbox2">
3576- <property name="visible">True</property>
3577- <child>
3578- <widget class="GtkScrolledWindow" id="scrolledwindow1">
3579- <property name="visible">True</property>
3580- <property name="can_focus">True</property>
3581- <property name="hscrollbar_policy">automatic</property>
3582- <property name="vscrollbar_policy">automatic</property>
3583- <property name="shadow_type">in</property>
3584- <child>
3585- <widget class="GtkTreeView" id="treeview_videos">
3586- <property name="visible">True</property>
3587- <property name="can_focus">True</property>
3588- <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
3589- <property name="enable_search">False</property>
3590- </widget>
3591- </child>
3592- </widget>
3593- <packing>
3594- <property name="position">0</property>
3595- </packing>
3596- </child>
3597- <child>
3598- <widget class="GtkVButtonBox" id="vbuttonbox1">
3599- <property name="visible">True</property>
3600- <property name="spacing">5</property>
3601- <property name="layout_style">start</property>
3602- <child>
3603- <widget class="GtkButton" id="button_add_videos">
3604- <property name="label">gtk-add</property>
3605- <property name="visible">True</property>
3606- <property name="can_focus">True</property>
3607- <property name="has_focus">True</property>
3608- <property name="can_default">True</property>
3609- <property name="has_default">True</property>
3610- <property name="receives_default">False</property>
3611- <property name="use_stock">True</property>
3612- <signal name="clicked" handler="on_button_add_videos_clicked"/>
3613- </widget>
3614- <packing>
3615- <property name="expand">False</property>
3616- <property name="fill">False</property>
3617- <property name="position">0</property>
3618- </packing>
3619- </child>
3620- <child>
3621- <widget class="GtkButton" id="button_remove_videos">
3622- <property name="label">gtk-remove</property>
3623- <property name="visible">True</property>
3624- <property name="can_focus">True</property>
3625- <property name="receives_default">False</property>
3626- <property name="use_stock">True</property>
3627- <signal name="clicked" handler="on_button_remove_videos_clicked"/>
3628- </widget>
3629- <packing>
3630- <property name="expand">False</property>
3631- <property name="fill">False</property>
3632- <property name="position">1</property>
3633- </packing>
3634- </child>
3635- <child>
3636- <widget class="GtkButton" id="button_edit_videos">
3637- <property name="label">gtk-edit</property>
3638- <property name="visible">True</property>
3639- <property name="can_focus">True</property>
3640- <property name="receives_default">False</property>
3641- <property name="use_stock">True</property>
3642- <signal name="clicked" handler="on_button_edit_videos_clicked"/>
3643- </widget>
3644- <packing>
3645- <property name="expand">False</property>
3646- <property name="fill">False</property>
3647- <property name="position">2</property>
3648- </packing>
3649- </child>
3650- </widget>
3651- <packing>
3652- <property name="expand">False</property>
3653- <property name="padding">5</property>
3654- <property name="position">1</property>
3655- </packing>
3656- </child>
3657- </widget>
3658- <packing>
3659- <property name="position">1</property>
3660- </packing>
3661- </child>
3662- </widget>
3663- </child>
3664- </widget>
3665- </child>
3666- <child>
3667- <widget class="GtkLabel" id="label_video_library1">
3668- <property name="visible">True</property>
3669- <property name="label" translatable="yes">&lt;b&gt;Video library&lt;/b&gt;</property>
3670- <property name="use_markup">True</property>
3671- </widget>
3672- <packing>
3673- <property name="type">label_item</property>
3674- </packing>
3675- </child>
3676- </widget>
3677- <packing>
3678- <property name="position">0</property>
3679- </packing>
3680- </child>
3681- <child>
3682- <widget class="GtkFrame" id="frame1">
3683- <property name="visible">True</property>
3684- <property name="label_xalign">0</property>
3685- <property name="shadow_type">none</property>
3686- <child>
3687- <widget class="GtkAlignment" id="alignment2">
3688- <property name="visible">True</property>
3689- <property name="left_padding">12</property>
3690- <child>
3691- <widget class="GtkCheckButton" id="video_metadata_checkbox">
3692- <property name="label" translatable="yes">Download movie and TV-series metadata</property>
3693- <property name="visible">True</property>
3694- <property name="can_focus">True</property>
3695- <property name="receives_default">False</property>
3696- <property name="use_underline">True</property>
3697- <property name="draw_indicator">True</property>
3698- <signal name="toggled" handler="on_checkbutton_video_metadata_toggled"/>
3699- </widget>
3700- </child>
3701- </widget>
3702- </child>
3703- <child>
3704- <widget class="GtkLabel" id="label2">
3705- <property name="visible">True</property>
3706- <property name="label" translatable="yes">&lt;b&gt;Video library settings&lt;/b&gt;</property>
3707- <property name="use_markup">True</property>
3708- </widget>
3709- <packing>
3710- <property name="type">label_item</property>
3711- </packing>
3712- </child>
3713- </widget>
3714- <packing>
3715- <property name="position">1</property>
3716- </packing>
3717- </child>
3718- </widget>
3719- <packing>
3720- <property name="position">0</property>
3721- </packing>
3722- </child>
3723- </widget>
3724- </child>
3725- <child>
3726- <widget class="GtkLabel" id="label_video3">
3727- <property name="visible">True</property>
3728- <property name="can_focus">True</property>
3729- <property name="has_focus">True</property>
3730- <property name="has_default">True</property>
3731- <property name="label" translatable="yes">Videos</property>
3732- </widget>
3733- <packing>
3734- <property name="tab_fill">False</property>
3735- <property name="type">tab</property>
3736- </packing>
3737- </child>
3738- <child>
3739- <widget class="GtkVBox" id="vbox_music">
3740- <property name="visible">True</property>
3741- <child>
3742- <widget class="GtkFrame" id="frame_music_folders3">
3743- <property name="visible">True</property>
3744- <property name="border_width">5</property>
3745- <property name="label_xalign">0</property>
3746- <property name="shadow_type">none</property>
3747- <child>
3748- <widget class="GtkAlignment" id="alignment9">
3749- <property name="visible">True</property>
3750- <property name="left_padding">12</property>
3751- <child>
3752- <widget class="GtkVBox" id="vbox12">
3753- <property name="visible">True</property>
3754- <child>
3755- <widget class="GtkLabel" id="label8">
3756- <property name="visible">True</property>
3757- <property name="xalign">0</property>
3758- <property name="label" translatable="yes">Entertainer music library scans data from the listed folders.</property>
3759- </widget>
3760- <packing>
3761- <property name="expand">False</property>
3762- <property name="padding">5</property>
3763- <property name="position">0</property>
3764- </packing>
3765- </child>
3766- <child>
3767- <widget class="GtkHBox" id="hbox12">
3768- <property name="visible">True</property>
3769- <child>
3770- <widget class="GtkScrolledWindow" id="scrolledwindow5">
3771- <property name="visible">True</property>
3772- <property name="can_focus">True</property>
3773- <property name="hscrollbar_policy">automatic</property>
3774- <property name="vscrollbar_policy">automatic</property>
3775- <property name="shadow_type">in</property>
3776- <child>
3777- <widget class="GtkTreeView" id="treeview_music">
3778- <property name="visible">True</property>
3779- <property name="can_focus">True</property>
3780- <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
3781- <property name="enable_search">False</property>
3782- </widget>
3783- </child>
3784- </widget>
3785- <packing>
3786- <property name="position">0</property>
3787- </packing>
3788- </child>
3789- <child>
3790- <widget class="GtkVButtonBox" id="vbuttonbox6">
3791- <property name="visible">True</property>
3792- <property name="spacing">5</property>
3793- <property name="layout_style">start</property>
3794- <child>
3795- <widget class="GtkButton" id="button_add_music">
3796- <property name="label">gtk-add</property>
3797- <property name="visible">True</property>
3798- <property name="can_focus">True</property>
3799- <property name="receives_default">False</property>
3800- <property name="use_stock">True</property>
3801- <signal name="clicked" handler="on_button_add_music_clicked"/>
3802- </widget>
3803- <packing>
3804- <property name="expand">False</property>
3805- <property name="fill">False</property>
3806- <property name="position">0</property>
3807- </packing>
3808- </child>
3809- <child>
3810- <widget class="GtkButton" id="button_remove_music">
3811- <property name="label">gtk-remove</property>
3812- <property name="visible">True</property>
3813- <property name="can_focus">True</property>
3814- <property name="receives_default">False</property>
3815- <property name="use_stock">True</property>
3816- <signal name="clicked" handler="on_button_remove_music_clicked"/>
3817- </widget>
3818- <packing>
3819- <property name="expand">False</property>
3820- <property name="fill">False</property>
3821- <property name="position">1</property>
3822- </packing>
3823- </child>
3824- <child>
3825- <widget class="GtkButton" id="button_edit_music">
3826- <property name="label">gtk-edit</property>
3827- <property name="visible">True</property>
3828- <property name="can_focus">True</property>
3829- <property name="receives_default">False</property>
3830- <property name="use_stock">True</property>
3831- <signal name="clicked" handler="on_button_edit_music_clicked"/>
3832- </widget>
3833- <packing>
3834- <property name="expand">False</property>
3835- <property name="fill">False</property>
3836- <property name="position">2</property>
3837- </packing>
3838- </child>
3839- </widget>
3840- <packing>
3841- <property name="expand">False</property>
3842- <property name="padding">5</property>
3843- <property name="position">1</property>
3844- </packing>
3845- </child>
3846- </widget>
3847- <packing>
3848- <property name="position">1</property>
3849- </packing>
3850- </child>
3851- </widget>
3852- </child>
3853- </widget>
3854- </child>
3855- <child>
3856- <widget class="GtkLabel" id="label_music_folders3">
3857- <property name="visible">True</property>
3858- <property name="label" translatable="yes">&lt;b&gt;Music library&lt;/b&gt;</property>
3859- <property name="use_markup">True</property>
3860- </widget>
3861- <packing>
3862- <property name="type">label_item</property>
3863- </packing>
3864- </child>
3865- </widget>
3866- <packing>
3867- <property name="position">0</property>
3868- </packing>
3869- </child>
3870- <child>
3871- <widget class="GtkFrame" id="frame_music_lib_settings3">
3872- <property name="visible">True</property>
3873- <property name="border_width">5</property>
3874- <property name="label_xalign">0</property>
3875- <property name="shadow_type">none</property>
3876- <child>
3877- <widget class="GtkAlignment" id="alignment10">
3878- <property name="visible">True</property>
3879- <property name="left_padding">12</property>
3880- <child>
3881- <widget class="GtkVBox" id="vbox13">
3882- <property name="visible">True</property>
3883- <property name="homogeneous">True</property>
3884- <child>
3885- <widget class="GtkCheckButton" id="art_checkbox">
3886- <property name="label" translatable="yes">Download album cover art</property>
3887- <property name="visible">True</property>
3888- <property name="can_focus">True</property>
3889- <property name="receives_default">False</property>
3890- <property name="use_underline">True</property>
3891- <property name="draw_indicator">True</property>
3892- <signal name="toggled" handler="on_art_checkbox_toggled"/>
3893- </widget>
3894- <packing>
3895- <property name="padding">5</property>
3896- <property name="position">0</property>
3897- </packing>
3898- </child>
3899- <child>
3900- <widget class="GtkCheckButton" id="lyrics_checkbox">
3901- <property name="label" translatable="yes">Download song lyrics</property>
3902- <property name="visible">True</property>
3903- <property name="can_focus">True</property>
3904- <property name="receives_default">False</property>
3905- <property name="use_underline">True</property>
3906- <property name="draw_indicator">True</property>
3907- <signal name="toggled" handler="on_lyrics_checkbox_toggled"/>
3908- </widget>
3909- <packing>
3910- <property name="padding">5</property>
3911- <property name="position">1</property>
3912- </packing>
3913- </child>
3914- </widget>
3915- </child>
3916- </widget>
3917- </child>
3918- <child>
3919- <widget class="GtkLabel" id="label9">
3920- <property name="visible">True</property>
3921- <property name="label" translatable="yes">&lt;b&gt;Music library settings&lt;/b&gt;</property>
3922- <property name="use_markup">True</property>
3923- </widget>
3924- <packing>
3925- <property name="type">label_item</property>
3926- </packing>
3927- </child>
3928- </widget>
3929- <packing>
3930- <property name="expand">False</property>
3931- <property name="position">1</property>
3932- </packing>
3933- </child>
3934- </widget>
3935- <packing>
3936- <property name="position">1</property>
3937- </packing>
3938- </child>
3939- <child>
3940- <widget class="GtkLabel" id="label10">
3941- <property name="visible">True</property>
3942- <property name="label" translatable="yes">Music</property>
3943- </widget>
3944- <packing>
3945- <property name="position">1</property>
3946- <property name="tab_fill">False</property>
3947- <property name="type">tab</property>
3948- </packing>
3949- </child>
3950- <child>
3951- <widget class="GtkVBox" id="vbox14">
3952- <property name="visible">True</property>
3953- <child>
3954- <widget class="GtkFrame" id="frame_image_folders3">
3955- <property name="visible">True</property>
3956- <property name="border_width">5</property>
3957- <property name="label_xalign">0</property>
3958- <property name="shadow_type">none</property>
3959- <child>
3960- <widget class="GtkAlignment" id="alignment11">
3961- <property name="visible">True</property>
3962- <property name="left_padding">12</property>
3963- <child>
3964- <widget class="GtkVBox" id="vbox15">
3965- <property name="visible">True</property>
3966- <child>
3967- <widget class="GtkLabel" id="label_music_tip3">
3968- <property name="visible">True</property>
3969- <property name="xalign">0</property>
3970- <property name="label" translatable="yes">Entertainer image library scans data from the listed folders.</property>
3971- </widget>
3972- <packing>
3973- <property name="expand">False</property>
3974- <property name="padding">5</property>
3975- <property name="position">0</property>
3976- </packing>
3977- </child>
3978- <child>
3979- <widget class="GtkHBox" id="hbox14">
3980- <property name="visible">True</property>
3981- <child>
3982- <widget class="GtkScrolledWindow" id="scrolledwindow6">
3983- <property name="visible">True</property>
3984- <property name="can_focus">True</property>
3985- <property name="hscrollbar_policy">automatic</property>
3986- <property name="vscrollbar_policy">automatic</property>
3987- <property name="shadow_type">in</property>
3988- <child>
3989- <widget class="GtkTreeView" id="treeview_images">
3990- <property name="visible">True</property>
3991- <property name="can_focus">True</property>
3992- <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
3993- <property name="enable_search">False</property>
3994- </widget>
3995- </child>
3996- </widget>
3997- <packing>
3998- <property name="position">0</property>
3999- </packing>
4000- </child>
4001- <child>
4002- <widget class="GtkVButtonBox" id="vbuttonbox7">
4003- <property name="visible">True</property>
4004- <property name="spacing">5</property>
4005- <property name="layout_style">start</property>
4006- <child>
4007- <widget class="GtkButton" id="button_add_images">
4008- <property name="label">gtk-add</property>
4009- <property name="visible">True</property>
4010- <property name="can_focus">True</property>
4011- <property name="receives_default">False</property>
4012- <property name="use_stock">True</property>
4013- <signal name="clicked" handler="on_button_add_images_clicked"/>
4014- </widget>
4015- <packing>
4016- <property name="expand">False</property>
4017- <property name="fill">False</property>
4018- <property name="position">0</property>
4019- </packing>
4020- </child>
4021- <child>
4022- <widget class="GtkButton" id="button_remove_images">
4023- <property name="label">gtk-remove</property>
4024- <property name="visible">True</property>
4025- <property name="can_focus">True</property>
4026- <property name="receives_default">False</property>
4027- <property name="use_stock">True</property>
4028- <signal name="clicked" handler="on_button_remove_images_clicked"/>
4029- </widget>
4030- <packing>
4031- <property name="expand">False</property>
4032- <property name="fill">False</property>
4033- <property name="position">1</property>
4034- </packing>
4035- </child>
4036- <child>
4037- <widget class="GtkButton" id="button_edit_images">
4038- <property name="label">gtk-edit</property>
4039- <property name="visible">True</property>
4040- <property name="can_focus">True</property>
4041- <property name="receives_default">False</property>
4042- <property name="use_stock">True</property>
4043- <signal name="clicked" handler="on_button_edit_images_clicked"/>
4044- </widget>
4045- <packing>
4046- <property name="expand">False</property>
4047- <property name="fill">False</property>
4048- <property name="position">2</property>
4049- </packing>
4050- </child>
4051- </widget>
4052- <packing>
4053- <property name="expand">False</property>
4054- <property name="padding">5</property>
4055- <property name="position">1</property>
4056- </packing>
4057- </child>
4058- </widget>
4059- <packing>
4060- <property name="position">1</property>
4061- </packing>
4062- </child>
4063- </widget>
4064- </child>
4065- </widget>
4066- </child>
4067- <child>
4068- <widget class="GtkLabel" id="label11">
4069- <property name="visible">True</property>
4070- <property name="label" translatable="yes">&lt;b&gt;Image library&lt;/b&gt;</property>
4071- <property name="use_markup">True</property>
4072- </widget>
4073- <packing>
4074- <property name="type">label_item</property>
4075- </packing>
4076- </child>
4077- </widget>
4078- <packing>
4079- <property name="position">0</property>
4080- </packing>
4081- </child>
4082- <child>
4083- <widget class="GtkFrame" id="frame_image_lib_settings3">
4084- <property name="visible">True</property>
4085- <property name="border_width">5</property>
4086- <property name="label_xalign">0</property>
4087- <property name="shadow_type">none</property>
4088- <child>
4089- <widget class="GtkAlignment" id="alignment12">
4090- <property name="visible">True</property>
4091- <property name="left_padding">12</property>
4092- <child>
4093- <widget class="GtkVBox" id="vbox16">
4094- <property name="visible">True</property>
4095- <child>
4096- <placeholder/>
4097- </child>
4098- <child>
4099- <widget class="GtkCheckButton" id="hidden_files_folders_checkbox">
4100- <property name="label" translatable="yes">Display hidden files and folders in image library</property>
4101- <property name="visible">True</property>
4102- <property name="can_focus">True</property>
4103- <property name="receives_default">False</property>
4104- <property name="use_underline">True</property>
4105- <property name="draw_indicator">True</property>
4106- <signal name="toggled" handler="on_hidden_files_folders_checkbox_toggled"/>
4107- </widget>
4108- <packing>
4109- <property name="padding">5</property>
4110- <property name="position">1</property>
4111- </packing>
4112- </child>
4113- </widget>
4114- </child>
4115- </widget>
4116- </child>
4117- <child>
4118- <widget class="GtkLabel" id="label_image_lib_settings3">
4119- <property name="visible">True</property>
4120- <property name="label" translatable="yes">&lt;b&gt;Image library settings&lt;/b&gt;</property>
4121- <property name="use_markup">True</property>
4122- </widget>
4123- <packing>
4124- <property name="type">label_item</property>
4125- </packing>
4126- </child>
4127- </widget>
4128- <packing>
4129- <property name="expand">False</property>
4130- <property name="position">1</property>
4131- </packing>
4132- </child>
4133- </widget>
4134- <packing>
4135- <property name="position">2</property>
4136- </packing>
4137- </child>
4138- <child>
4139- <widget class="GtkLabel" id="label_images3">
4140- <property name="visible">True</property>
4141- <property name="label" translatable="yes">Images</property>
4142- </widget>
4143- <packing>
4144- <property name="position">2</property>
4145- <property name="tab_fill">False</property>
4146- <property name="type">tab</property>
4147- </packing>
4148- </child>
4149- <child>
4150- <widget class="GtkVBox" id="vbox_feeds">
4151- <property name="visible">True</property>
4152- <child>
4153- <widget class="GtkFrame" id="frame_rss_feeds3">
4154- <property name="visible">True</property>
4155- <property name="border_width">5</property>
4156- <property name="label_xalign">0</property>
4157- <property name="shadow_type">none</property>
4158- <child>
4159- <widget class="GtkAlignment" id="alignment13">
4160- <property name="visible">True</property>
4161- <property name="left_padding">12</property>
4162- <child>
4163- <widget class="GtkVBox" id="vbox17">
4164- <property name="visible">True</property>
4165- <child>
4166- <widget class="GtkLabel" id="label_rss_tip3">
4167- <property name="visible">True</property>
4168- <property name="xalign">0</property>
4169- <property name="label" translatable="yes">Below is a list of RSS feeds that are displayd in Entertainer.</property>
4170- </widget>
4171- <packing>
4172- <property name="expand">False</property>
4173- <property name="padding">5</property>
4174- <property name="position">0</property>
4175- </packing>
4176- </child>
4177- <child>
4178- <widget class="GtkHBox" id="hbox16">
4179- <property name="visible">True</property>
4180- <child>
4181- <widget class="GtkScrolledWindow" id="scrolledwindow_rss3">
4182- <property name="visible">True</property>
4183- <property name="can_focus">True</property>
4184- <property name="hscrollbar_policy">automatic</property>
4185- <property name="vscrollbar_policy">automatic</property>
4186- <property name="shadow_type">in</property>
4187- <child>
4188- <widget class="GtkTreeView" id="treeview_feeds">
4189- <property name="visible">True</property>
4190- <property name="can_focus">True</property>
4191- <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
4192- <property name="enable_search">False</property>
4193- </widget>
4194- </child>
4195- </widget>
4196- <packing>
4197- <property name="position">0</property>
4198- </packing>
4199- </child>
4200- <child>
4201- <widget class="GtkVButtonBox" id="vbuttonbox8">
4202- <property name="visible">True</property>
4203- <property name="spacing">5</property>
4204- <property name="layout_style">start</property>
4205- <child>
4206- <widget class="GtkButton" id="button_add_feed">
4207- <property name="label">gtk-add</property>
4208- <property name="visible">True</property>
4209- <property name="can_focus">True</property>
4210- <property name="receives_default">False</property>
4211- <property name="tooltip" translatable="yes">Add RSS Feed</property>
4212- <property name="use_stock">True</property>
4213- <signal name="clicked" handler="on_button_add_feed_clicked"/>
4214- </widget>
4215- <packing>
4216- <property name="expand">False</property>
4217- <property name="fill">False</property>
4218- <property name="position">0</property>
4219- </packing>
4220- </child>
4221- <child>
4222- <widget class="GtkButton" id="button_remove_feed">
4223- <property name="label">gtk-remove</property>
4224- <property name="visible">True</property>
4225- <property name="can_focus">True</property>
4226- <property name="receives_default">False</property>
4227- <property name="tooltip" translatable="yes">Remove RSS Feed</property>
4228- <property name="use_stock">True</property>
4229- <signal name="clicked" handler="on_button_remove_feed_clicked"/>
4230- </widget>
4231- <packing>
4232- <property name="expand">False</property>
4233- <property name="fill">False</property>
4234- <property name="position">1</property>
4235- </packing>
4236- </child>
4237- <child>
4238- <widget class="GtkButton" id="button_edit_feed">
4239- <property name="label">gtk-edit</property>
4240- <property name="visible">True</property>
4241- <property name="can_focus">True</property>
4242- <property name="receives_default">False</property>
4243- <property name="tooltip" translatable="yes">Edit current item</property>
4244- <property name="use_stock">True</property>
4245- <signal name="clicked" handler="on_button_edit_feed_clicked"/>
4246- </widget>
4247- <packing>
4248- <property name="expand">False</property>
4249- <property name="fill">False</property>
4250- <property name="position">2</property>
4251- </packing>
4252- </child>
4253- <child>
4254- <widget class="GtkButton" id="button_open_list">
4255- <property name="label">gtk-open</property>
4256- <property name="visible">True</property>
4257- <property name="can_focus">True</property>
4258- <property name="receives_default">False</property>
4259- <property name="tooltip" translatable="yes">Add feeds from a datasource</property>
4260- <property name="use_stock">True</property>
4261- <signal name="clicked" handler="on_button_open_list_clicked"/>
4262- </widget>
4263- <packing>
4264- <property name="expand">False</property>
4265- <property name="fill">False</property>
4266- <property name="position">3</property>
4267- </packing>
4268- </child>
4269- </widget>
4270- <packing>
4271- <property name="expand">False</property>
4272- <property name="padding">5</property>
4273- <property name="position">1</property>
4274- </packing>
4275- </child>
4276- </widget>
4277- <packing>
4278- <property name="position">1</property>
4279- </packing>
4280- </child>
4281- </widget>
4282- </child>
4283- </widget>
4284- </child>
4285- <child>
4286- <widget class="GtkLabel" id="label_rss_sources3">
4287- <property name="visible">True</property>
4288- <property name="label" translatable="yes">&lt;b&gt;RSS feeds&lt;/b&gt;</property>
4289- <property name="use_markup">True</property>
4290- </widget>
4291- <packing>
4292- <property name="type">label_item</property>
4293- </packing>
4294- </child>
4295- </widget>
4296- <packing>
4297- <property name="position">0</property>
4298- </packing>
4299- </child>
4300- <child>
4301- <widget class="GtkFrame" id="frame_feed_settings3">
4302- <property name="visible">True</property>
4303- <property name="border_width">5</property>
4304- <property name="label_xalign">0</property>
4305- <property name="shadow_type">none</property>
4306- <child>
4307- <widget class="GtkAlignment" id="alignment14">
4308- <property name="visible">True</property>
4309- <property name="left_padding">12</property>
4310- <child>
4311- <widget class="GtkVBox" id="vbox18">
4312- <property name="visible">True</property>
4313- <child>
4314- <widget class="GtkHBox" id="hbox17">
4315- <property name="visible">True</property>
4316- <child>
4317- <widget class="GtkLabel" id="label12">
4318- <property name="visible">True</property>
4319- <property name="label" translatable="yes">Update all feeds every</property>
4320- </widget>
4321- <packing>
4322- <property name="expand">False</property>
4323- <property name="position">0</property>
4324- </packing>
4325- </child>
4326- <child>
4327- <widget class="GtkSpinButton" id="fetch_interval_spinbutton">
4328- <property name="visible">True</property>
4329- <property name="can_focus">True</property>
4330- <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
4331- <property name="adjustment">60 15 900 1 10 0</property>
4332- <property name="climb_rate">1</property>
4333- <property name="numeric">True</property>
4334- <signal name="value_changed" handler="on_fetch_interval_spinbutton_value_changed"/>
4335- </widget>
4336- <packing>
4337- <property name="expand">False</property>
4338- <property name="padding">5</property>
4339- <property name="position">1</property>
4340- </packing>
4341- </child>
4342- <child>
4343- <widget class="GtkLabel" id="label13">
4344- <property name="visible">True</property>
4345- <property name="label" translatable="yes">minutes.</property>
4346- </widget>
4347- <packing>
4348- <property name="expand">False</property>
4349- <property name="position">2</property>
4350- </packing>
4351- </child>
4352- </widget>
4353- <packing>
4354- <property name="expand">False</property>
4355- <property name="padding">10</property>
4356- <property name="position">0</property>
4357- </packing>
4358- </child>
4359- </widget>
4360- </child>
4361- </widget>
4362- </child>
4363- <child>
4364- <widget class="GtkLabel" id="label_rss_settings3">
4365- <property name="visible">True</property>
4366- <property name="label" translatable="yes">&lt;b&gt;Feed settings&lt;/b&gt;</property>
4367- <property name="use_markup">True</property>
4368- </widget>
4369- <packing>
4370- <property name="type">label_item</property>
4371- </packing>
4372- </child>
4373- </widget>
4374- <packing>
4375- <property name="expand">False</property>
4376- <property name="position">1</property>
4377- </packing>
4378- </child>
4379- </widget>
4380- <packing>
4381- <property name="position">3</property>
4382- </packing>
4383- </child>
4384- <child>
4385- <widget class="GtkLabel" id="label_rss3">
4386- <property name="visible">True</property>
4387- <property name="label" translatable="yes">RSS feeds</property>
4388- </widget>
4389- <packing>
4390- <property name="position">3</property>
4391- <property name="tab_fill">False</property>
4392- <property name="type">tab</property>
4393- </packing>
4394- </child>
4395- <child>
4396- <widget class="GtkVBox" id="vbox5">
4397- <property name="visible">True</property>
4398- <child>
4399- <widget class="GtkFrame" id="frame_video_lib3">
4400- <property name="visible">True</property>
4401- <property name="border_width">5</property>
4402- <property name="label_xalign">0</property>
4403- <property name="shadow_type">none</property>
4404- <child>
4405- <widget class="GtkAlignment" id="alignment5">
4406- <property name="visible">True</property>
4407- <property name="left_padding">12</property>
4408- <child>
4409- <widget class="GtkVBox" id="weather_location_list_area">
4410- <property name="visible">True</property>
4411- <child>
4412- <widget class="GtkLabel" id="label_weather_tip">
4413- <property name="visible">True</property>
4414- <property name="xalign">0</property>
4415- <property name="label" translatable="yes">Get weather conditions from the locations listed below.</property>
4416- <property name="single_line_mode">True</property>
4417- </widget>
4418- <packing>
4419- <property name="expand">False</property>
4420- <property name="padding">5</property>
4421- <property name="position">0</property>
4422- </packing>
4423- </child>
4424- <child>
4425- <widget class="GtkHBox" id="hbox4">
4426- <property name="visible">True</property>
4427- <child>
4428- <widget class="GtkScrolledWindow" id="scrolledwindow3">
4429- <property name="visible">True</property>
4430- <property name="can_focus">True</property>
4431- <property name="hscrollbar_policy">automatic</property>
4432- <property name="vscrollbar_policy">automatic</property>
4433- <property name="shadow_type">in</property>
4434- <child>
4435- <widget class="GtkTreeView" id="treeview_locations">
4436- <property name="visible">True</property>
4437- <property name="can_focus">True</property>
4438- <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
4439- <property name="enable_search">False</property>
4440- </widget>
4441- </child>
4442- </widget>
4443- <packing>
4444- <property name="position">0</property>
4445- </packing>
4446- </child>
4447- <child>
4448- <widget class="GtkVButtonBox" id="vbuttonbox3">
4449- <property name="visible">True</property>
4450- <property name="spacing">5</property>
4451- <property name="layout_style">start</property>
4452- <child>
4453- <widget class="GtkButton" id="button_add_weather">
4454- <property name="label">gtk-new</property>
4455- <property name="visible">True</property>
4456- <property name="can_focus">True</property>
4457- <property name="has_focus">True</property>
4458- <property name="can_default">True</property>
4459- <property name="has_default">True</property>
4460- <property name="receives_default">False</property>
4461- <property name="use_stock">True</property>
4462- <signal name="clicked" handler="on_button_add_weather_clicked"/>
4463- </widget>
4464- <packing>
4465- <property name="expand">False</property>
4466- <property name="fill">False</property>
4467- <property name="position">0</property>
4468- </packing>
4469- </child>
4470- <child>
4471- <widget class="GtkButton" id="button_remove_weather">
4472- <property name="label">gtk-clear</property>
4473- <property name="visible">True</property>
4474- <property name="can_focus">True</property>
4475- <property name="receives_default">False</property>
4476- <property name="use_stock">True</property>
4477- <signal name="clicked" handler="on_button_remove_weather_clicked"/>
4478- </widget>
4479- <packing>
4480- <property name="expand">False</property>
4481- <property name="fill">False</property>
4482- <property name="position">1</property>
4483- </packing>
4484- </child>
4485- </widget>
4486- <packing>
4487- <property name="expand">False</property>
4488- <property name="padding">5</property>
4489- <property name="position">1</property>
4490- </packing>
4491- </child>
4492- </widget>
4493- <packing>
4494- <property name="position">1</property>
4495- </packing>
4496- </child>
4497- </widget>
4498- </child>
4499- </widget>
4500- </child>
4501- <child>
4502- <widget class="GtkLabel" id="label_weather_options">
4503- <property name="visible">True</property>
4504- <property name="label" translatable="yes">&lt;b&gt;Weather locations&lt;/b&gt;</property>
4505- <property name="use_markup">True</property>
4506- </widget>
4507- <packing>
4508- <property name="type">label_item</property>
4509- </packing>
4510- </child>
4511- </widget>
4512- <packing>
4513- <property name="position">0</property>
4514- </packing>
4515- </child>
4516- <child>
4517- <widget class="GtkFrame" id="frame4">
4518- <property name="visible">True</property>
4519- <property name="label_xalign">0</property>
4520- <property name="shadow_type">none</property>
4521- <child>
4522- <widget class="GtkAlignment" id="alignment7">
4523- <property name="visible">True</property>
4524- <property name="left_padding">12</property>
4525- <child>
4526- <widget class="GtkVBox" id="vbox7">
4527- <property name="visible">True</property>
4528- <child>
4529- <widget class="GtkCheckButton" id="weather_display_checkbox">
4530- <property name="label" translatable="yes">Display weather option in main menu</property>
4531- <property name="visible">True</property>
4532- <property name="can_focus">True</property>
4533- <property name="receives_default">False</property>
4534- <property name="use_underline">True</property>
4535- <property name="active">True</property>
4536- <property name="draw_indicator">True</property>
4537- <signal name="toggled" handler="on_weather_display_checkbox_toggled"/>
4538- </widget>
4539- <packing>
4540- <property name="fill">False</property>
4541- <property name="position">0</property>
4542- </packing>
4543- </child>
4544- </widget>
4545- </child>
4546- </widget>
4547- </child>
4548- <child>
4549- <widget class="GtkLabel" id="label7">
4550- <property name="visible">True</property>
4551- <property name="label" translatable="yes">&lt;b&gt;Weather settings&lt;/b&gt;</property>
4552- <property name="use_markup">True</property>
4553- </widget>
4554- <packing>
4555- <property name="type">label_item</property>
4556- </packing>
4557- </child>
4558- </widget>
4559- <packing>
4560- <property name="position">1</property>
4561- </packing>
4562- </child>
4563- </widget>
4564- <packing>
4565- <property name="position">4</property>
4566- </packing>
4567- </child>
4568- <child>
4569- <widget class="GtkLabel" id="label_weather">
4570- <property name="visible">True</property>
4571- <property name="yalign">0.40999999642372131</property>
4572- <property name="label" translatable="yes">Weather</property>
4573- </widget>
4574- <packing>
4575- <property name="position">4</property>
4576- <property name="tab_fill">False</property>
4577- <property name="type">tab</property>
4578- </packing>
4579- </child>
4580- <child>
4581- <widget class="GtkFrame" id="frame2">
4582- <property name="visible">True</property>
4583- <property name="border_width">5</property>
4584- <property name="label_xalign">0</property>
4585- <property name="shadow_type">none</property>
4586- <child>
4587- <widget class="GtkAlignment" id="alignment3">
4588- <property name="visible">True</property>
4589- <property name="left_padding">12</property>
4590- <child>
4591- <widget class="GtkVBox" id="vbox3">
4592- <property name="visible">True</property>
4593- <child>
4594- <widget class="GtkLabel" id="label5">
4595- <property name="visible">True</property>
4596- <property name="xpad">7</property>
4597- <property name="ypad">7</property>
4598- <property name="label" translatable="yes">Rebuilding cache means that all data is removed and then
4599-folders are indexed again. This fixes broken media cache.</property>
4600- </widget>
4601- <packing>
4602- <property name="position">0</property>
4603- </packing>
4604- </child>
4605- <child>
4606- <widget class="GtkButton" id="button_video_rebuild">
4607- <property name="label" translatable="yes">Rebuild video cache</property>
4608- <property name="visible">True</property>
4609- <property name="can_focus">True</property>
4610- <property name="receives_default">False</property>
4611- <property name="border_width">5</property>
4612- <property name="use_underline">True</property>
4613- <signal name="clicked" handler="on_button_video_rebuild_clicked"/>
4614- </widget>
4615- <packing>
4616- <property name="position">1</property>
4617- </packing>
4618- </child>
4619- <child>
4620- <widget class="GtkButton" id="button_music_rebuild">
4621- <property name="label" translatable="yes">Rebuild music cache</property>
4622- <property name="visible">True</property>
4623- <property name="can_focus">True</property>
4624- <property name="receives_default">False</property>
4625- <property name="border_width">5</property>
4626- <property name="use_underline">True</property>
4627- <signal name="clicked" handler="on_button_music_rebuild_clicked"/>
4628- </widget>
4629- <packing>
4630- <property name="position">2</property>
4631- </packing>
4632- </child>
4633- <child>
4634- <widget class="GtkButton" id="button_image_rebuild">
4635- <property name="label" translatable="yes">Rebuild image cache</property>
4636- <property name="visible">True</property>
4637- <property name="can_focus">True</property>
4638- <property name="receives_default">False</property>
4639- <property name="border_width">5</property>
4640- <property name="use_underline">True</property>
4641- <signal name="clicked" handler="on_button_image_rebuild_clicked"/>
4642- </widget>
4643- <packing>
4644- <property name="position">3</property>
4645- </packing>
4646- </child>
4647- <child>
4648- <widget class="GtkButton" id="button_feed_rebuild">
4649- <property name="label" translatable="yes">Rebuild RSS-feed cache</property>
4650- <property name="visible">True</property>
4651- <property name="can_focus">True</property>
4652- <property name="receives_default">False</property>
4653- <property name="border_width">5</property>
4654- <property name="use_underline">True</property>
4655- <property name="focus_on_click">False</property>
4656- <signal name="clicked" handler="on_button_feed_rebuild_clicked"/>
4657- </widget>
4658- <packing>
4659- <property name="position">4</property>
4660- </packing>
4661- </child>
4662- </widget>
4663- </child>
4664- </widget>
4665- </child>
4666- <child>
4667- <widget class="GtkLabel" id="label4">
4668- <property name="visible">True</property>
4669- <property name="label" translatable="yes">&lt;b&gt;Media cache management&lt;/b&gt;</property>
4670- <property name="use_markup">True</property>
4671- </widget>
4672- <packing>
4673- <property name="type">label_item</property>
4674- </packing>
4675- </child>
4676- </widget>
4677- <packing>
4678- <property name="position">5</property>
4679- </packing>
4680- </child>
4681- <child>
4682- <widget class="GtkLabel" id="label3">
4683- <property name="visible">True</property>
4684- <property name="label" translatable="yes">Reset</property>
4685- </widget>
4686- <packing>
4687- <property name="position">5</property>
4688- <property name="tab_fill">False</property>
4689- <property name="type">tab</property>
4690- </packing>
4691- </child>
4692- </widget>
4693- <packing>
4694- <property name="position">1</property>
4695- </packing>
4696- </child>
4697- <child internal-child="action_area">
4698- <widget class="GtkHButtonBox" id="dialog-closebutton-area">
4699- <property name="visible">True</property>
4700- <property name="layout_style">end</property>
4701- <child>
4702- <widget class="GtkButton" id="close_button">
4703- <property name="label">gtk-close</property>
4704- <property name="visible">True</property>
4705- <property name="can_focus">True</property>
4706- <property name="receives_default">False</property>
4707- <property name="use_stock">True</property>
4708- <signal name="clicked" handler="on_close_button_clicked"/>
4709- </widget>
4710- <packing>
4711- <property name="expand">False</property>
4712- <property name="fill">False</property>
4713- <property name="position">0</property>
4714- </packing>
4715- </child>
4716- </widget>
4717- <packing>
4718- <property name="expand">False</property>
4719- <property name="pack_type">end</property>
4720- <property name="position">0</property>
4721- </packing>
4722- </child>
4723- </widget>
4724- </child>
4725- </widget>
4726- <widget class="GtkDialog" id="url_dialog">
4727- <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
4728- <property name="border_width">5</property>
4729- <property name="resizable">False</property>
4730- <property name="modal">True</property>
4731- <property name="window_position">center-on-parent</property>
4732- <property name="destroy_with_parent">True</property>
4733- <property name="icon_name">gtk-edit</property>
4734- <property name="type_hint">normal</property>
4735- <property name="skip_taskbar_hint">True</property>
4736- <property name="has_separator">False</property>
4737- <signal name="delete_event" handler="on_url_dialog_delete_event"/>
4738- <child internal-child="vbox">
4739- <widget class="GtkVBox" id="dialog-vbox2">
4740- <property name="visible">True</property>
4741- <property name="spacing">2</property>
4742- <child>
4743- <widget class="GtkHBox" id="hbox1">
4744- <property name="visible">True</property>
4745- <child>
4746- <widget class="GtkLabel" id="label1">
4747- <property name="visible">True</property>
4748- <property name="label" translatable="yes">URL:</property>
4749- </widget>
4750- <packing>
4751- <property name="expand">False</property>
4752- <property name="padding">5</property>
4753- <property name="position">0</property>
4754- </packing>
4755- </child>
4756- <child>
4757- <widget class="GtkEntry" id="url_entry">
4758- <property name="visible">True</property>
4759- <property name="can_focus">True</property>
4760- <property name="has_focus">True</property>
4761- <property name="can_default">True</property>
4762- <property name="has_default">True</property>
4763- <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
4764- </widget>
4765- <packing>
4766- <property name="position">1</property>
4767- </packing>
4768- </child>
4769- </widget>
4770- <packing>
4771- <property name="position">1</property>
4772- </packing>
4773- </child>
4774- <child internal-child="action_area">
4775- <widget class="GtkHButtonBox" id="dialog-action_area2">
4776- <property name="visible">True</property>
4777- <property name="layout_style">end</property>
4778- <child>
4779- <widget class="GtkButton" id="url_dialog_cancel_button">
4780- <property name="label">gtk-cancel</property>
4781- <property name="visible">True</property>
4782- <property name="can_focus">True</property>
4783- <property name="receives_default">False</property>
4784- <property name="use_stock">True</property>
4785- <signal name="clicked" handler="on_url_dialog_cancel_button_clicked"/>
4786- </widget>
4787- <packing>
4788- <property name="expand">False</property>
4789- <property name="fill">False</property>
4790- <property name="position">0</property>
4791- </packing>
4792- </child>
4793- <child>
4794- <widget class="GtkButton" id="url_dialog_ok_button">
4795- <property name="label">gtk-ok</property>
4796- <property name="visible">True</property>
4797- <property name="can_focus">True</property>
4798- <property name="receives_default">False</property>
4799- <property name="use_stock">True</property>
4800- <signal name="clicked" handler="on_url_dialog_ok_button_clicked"/>
4801- </widget>
4802- <packing>
4803- <property name="expand">False</property>
4804- <property name="fill">False</property>
4805- <property name="position">1</property>
4806- </packing>
4807- </child>
4808- </widget>
4809- <packing>
4810- <property name="expand">False</property>
4811- <property name="pack_type">end</property>
4812- <property name="position">0</property>
4813- </packing>
4814- </child>
4815- </widget>
4816- </child>
4817- </widget>
4818- <widget class="GtkDialog" id="weather_search_dialog">
4819- <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
4820- <property name="border_width">5</property>
4821- <property name="window_position">center-on-parent</property>
4822- <property name="type_hint">dialog</property>
4823- <property name="has_separator">False</property>
4824- <child internal-child="vbox">
4825- <widget class="GtkVBox" id="vbox20">
4826- <property name="visible">True</property>
4827- <property name="spacing">2</property>
4828- <child>
4829- <widget class="GtkVBox" id="vbox21">
4830- <property name="visible">True</property>
4831- <child>
4832- <widget class="GtkFrame" id="frame6">
4833- <property name="visible">True</property>
4834- <property name="label_xalign">0</property>
4835- <property name="shadow_type">none</property>
4836- <child>
4837- <widget class="GtkAlignment" id="alignment16">
4838- <property name="visible">True</property>
4839- <property name="top_padding">5</property>
4840- <property name="left_padding">12</property>
4841- <child>
4842- <widget class="GtkHBox" id="hbox18">
4843- <property name="visible">True</property>
4844- <child>
4845- <widget class="GtkLabel" id="label19">
4846- <property name="visible">True</property>
4847- <property name="label" translatable="yes">City:</property>
4848- </widget>
4849- <packing>
4850- <property name="expand">False</property>
4851- <property name="position">0</property>
4852- </packing>
4853- </child>
4854- <child>
4855- <widget class="GtkEntry" id="location_entry">
4856- <property name="visible">True</property>
4857- <property name="can_focus">True</property>
4858- <property name="has_focus">True</property>
4859- <property name="can_default">True</property>
4860- <property name="has_default">True</property>
4861- <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
4862- <signal name="activate" handler="on_location_entry_activate"/>
4863- </widget>
4864- <packing>
4865- <property name="padding">5</property>
4866- <property name="position">1</property>
4867- </packing>
4868- </child>
4869- <child>
4870- <widget class="GtkButton" id="location_find_button">
4871- <property name="label">gtk-find</property>
4872- <property name="visible">True</property>
4873- <property name="can_focus">True</property>
4874- <property name="receives_default">False</property>
4875- <property name="use_stock">True</property>
4876- <signal name="clicked" handler="on_location_find_button_clicked"/>
4877- </widget>
4878- <packing>
4879- <property name="padding">5</property>
4880- <property name="position">2</property>
4881- </packing>
4882- </child>
4883- </widget>
4884- </child>
4885- </widget>
4886- </child>
4887- <child>
4888- <widget class="GtkLabel" id="label20">
4889- <property name="visible">True</property>
4890- <property name="label" translatable="yes">&lt;b&gt;Search for location&lt;/b&gt;</property>
4891- <property name="use_markup">True</property>
4892- </widget>
4893- <packing>
4894- <property name="type">label_item</property>
4895- </packing>
4896- </child>
4897- </widget>
4898- <packing>
4899- <property name="expand">False</property>
4900- <property name="padding">5</property>
4901- <property name="position">0</property>
4902- </packing>
4903- </child>
4904- <child>
4905- <widget class="GtkFrame" id="frame7">
4906- <property name="visible">True</property>
4907- <property name="label_xalign">0</property>
4908- <property name="shadow_type">none</property>
4909- <child>
4910- <widget class="GtkAlignment" id="alignment17">
4911- <property name="visible">True</property>
4912- <property name="left_padding">12</property>
4913- <child>
4914- <widget class="GtkScrolledWindow" id="scrolledwindow7">
4915- <property name="visible">True</property>
4916- <property name="can_focus">True</property>
4917- <property name="border_width">5</property>
4918- <property name="hscrollbar_policy">never</property>
4919- <property name="vscrollbar_policy">automatic</property>
4920- <property name="shadow_type">etched-in</property>
4921- <child>
4922- <widget class="GtkTreeView" id="location_results_treeview">
4923- <property name="visible">True</property>
4924- <property name="can_focus">True</property>
4925- <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
4926- </widget>
4927- </child>
4928- </widget>
4929- </child>
4930- </widget>
4931- </child>
4932- <child>
4933- <widget class="GtkLabel" id="label21">
4934- <property name="visible">True</property>
4935- <property name="label" translatable="yes">&lt;b&gt;Search result&lt;/b&gt;</property>
4936- <property name="use_markup">True</property>
4937- </widget>
4938- <packing>
4939- <property name="type">label_item</property>
4940- </packing>
4941- </child>
4942- </widget>
4943- <packing>
4944- <property name="padding">5</property>
4945- <property name="position">1</property>
4946- </packing>
4947- </child>
4948- </widget>
4949- <packing>
4950- <property name="position">1</property>
4951- </packing>
4952- </child>
4953- <child internal-child="action_area">
4954- <widget class="GtkHButtonBox" id="hbuttonbox1">
4955- <property name="visible">True</property>
4956- <property name="layout_style">end</property>
4957- <child>
4958- <widget class="GtkButton" id="location_button_cancel">
4959- <property name="label">gtk-cancel</property>
4960- <property name="visible">True</property>
4961- <property name="can_focus">True</property>
4962- <property name="receives_default">False</property>
4963- <property name="use_stock">True</property>
4964- <signal name="clicked" handler="on_location_cancel_button_clicked"/>
4965- </widget>
4966- <packing>
4967- <property name="expand">False</property>
4968- <property name="fill">False</property>
4969- <property name="position">0</property>
4970- </packing>
4971- </child>
4972- <child>
4973- <widget class="GtkButton" id="location_add_button">
4974- <property name="label">gtk-add</property>
4975- <property name="visible">True</property>
4976- <property name="can_focus">True</property>
4977- <property name="receives_default">False</property>
4978- <property name="use_stock">True</property>
4979- <signal name="clicked" handler="on_location_add_button_clicked"/>
4980- </widget>
4981- <packing>
4982- <property name="expand">False</property>
4983- <property name="fill">False</property>
4984- <property name="position">1</property>
4985- </packing>
4986- </child>
4987- </widget>
4988- <packing>
4989- <property name="expand">False</property>
4990- <property name="pack_type">end</property>
4991- <property name="position">0</property>
4992- </packing>
4993- </child>
4994- </widget>
4995- </child>
4996- </widget>
4997+
4998+<widget class="GtkDialog" id="ManagerDialog">
4999+ <property name="border_width">5</property>
5000+ <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
The diff has been truncated for viewing.

Subscribers

People subscribed via source and target branches