Merge lp:~mblayman/entertainer/fix-setup-for-2.6 into lp:entertainer/future

Proposed by Matt Layman
Status: Merged
Approved by: Paul Hummer
Approved revision: 411
Merged at revision: not available
Proposed branch: lp:~mblayman/entertainer/fix-setup-for-2.6
Merge into: lp:entertainer/future
Diff against target: None lines
To merge this branch: bzr merge lp:~mblayman/entertainer/fix-setup-for-2.6
Reviewer Review Type Date Requested Status
Paul Hummer Approve
Review via email: mp+10786@code.launchpad.net

Commit message

Entertainer conforms to the XDG directory specification.

To post a comment you must log in.
Revision history for this message
Matt Layman (mblayman) wrote :

This branch is dependent on one-dialog.

With this branch, Entertainer will fully comply its data usage with the XDG spec through the use of the xdg module.

I created a Resources class which is used only by Configuration. It was a was to abstract out the details of getting the proper directories and making sure they exist.

Where is a user's data from now on?
 * content.conf is in ~/.config/entertainer (xdg_config_home + 'entertainer')
 * databases and log files in ~/.cache/entertainer (xdg_cache_home + 'entertainer')
 * themes in ~/.local/share/entertainer (xdg_data_home + 'entertainer')

411. By Matt Layman

Fixed translation setup so that it doesn't install from a hardcoded path.

Revision history for this message
Paul Hummer (rockstar) wrote :

Awesome! Thanks for doing this.

review: Approve

Preview Diff

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

Subscribers

People subscribed via source and target branches