ab270358c0f3c9fa4533325a28dfdf915c492b8d
[mafwsubrenderer] / qmafw-gst-subtitles-renderer / applet / subtitleswidget.cpp
1 /*
2  *  Subtitles control panel applet.
3  *  Copyright (C) 2011 Roman Moravcik
4  *
5  *  encodings structure imported from totem-subtitle-encoding.c
6  *  Copyright (C) 2001-2006 Bastien Nocera <hadess@hadess.net>
7  *
8  *  Based on Battery applet from meegotouch-controlpanelapplets
9  *  Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
10  *
11  *  This program is free software; you can redistribute it and/or modify
12  *  it under the terms of the GNU General Public License as published by
13  *  the Free Software Foundation; either version 2 of the License, or
14  *  (at your option) any later version.
15  *
16  *  This program is distributed in the hope that it will be useful,
17  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
18  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19  *  GNU General Public License for more details.
20  *
21  *  You should have received a copy of the GNU General Public License
22  *  along with this program; if not, write to the Free Software
23  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
24  */
25
26 #include "subtitleswidget.h"
27
28 #include <QGraphicsLinearLayout>
29
30 #include <MLayout>
31 #include <MSeparator>
32 #include <MContainer>
33
34 #include <MWidgetCreator>
35 M_REGISTER_WIDGET_NO_CREATE (SubtitlesWidget);
36
37 #include <pango/pango-font.h>
38
39 const QString RENDERER_PLUGIN_CONFIG_FILE = "/usr/share/qmafw/mafw-gst-renderer-plugin.conf";
40
41 typedef enum
42 {
43     FONT_STYLE_REGULAR,
44     FONT_STYLE_ITALIC,
45     FONT_STYLE_BOLD,
46     FONT_STYLE_ITALIC_BOLD,
47     FONT_STYLE_LAST,
48 } FontStyleIndex;
49
50 typedef struct {
51     int index;
52     const QString name;
53 } FontStyle;
54
55 static FontStyle font_styles[] = {
56     {FONT_STYLE_REGULAR,        qtTrId ("Regular")},
57     {FONT_STYLE_ITALIC,         qtTrId ("Italic")},
58     {FONT_STYLE_BOLD,           qtTrId ("Bold")},
59     {FONT_STYLE_ITALIC_BOLD,    qtTrId ("Italic Bold")},
60 };
61
62 static const int font_sizes[] =
63 {
64   10, 12, 14, 16, 18, 20, 22, 24, 26, 28, -1
65 };
66
67 typedef enum
68 {
69     SUBTITLE_ENCODING_ISO_8859_6,
70     SUBTITLE_ENCODING_IBM_864,
71     SUBTITLE_ENCODING_MAC_ARABIC,
72     SUBTITLE_ENCODING_WINDOWS_1256,
73
74     SUBTITLE_ENCODING_ARMSCII_8,
75
76     SUBTITLE_ENCODING_ISO_8859_4,
77     SUBTITLE_ENCODING_ISO_8859_13,
78     SUBTITLE_ENCODING_WINDOWS_1257,
79
80     SUBTITLE_ENCODING_ISO_8859_14,
81
82     SUBTITLE_ENCODING_ISO_8859_2,
83     SUBTITLE_ENCODING_IBM_852,
84     SUBTITLE_ENCODING_MAC_CE,
85     SUBTITLE_ENCODING_WINDOWS_1250,
86
87     SUBTITLE_ENCODING_GB18030,
88     SUBTITLE_ENCODING_GB2312,
89     SUBTITLE_ENCODING_GBK,
90     SUBTITLE_ENCODING_HZ,
91
92     SUBTITLE_ENCODING_BIG5,
93     SUBTITLE_ENCODING_BIG5_HKSCS,
94     SUBTITLE_ENCODING_EUC_TW,
95
96     SUBTITLE_ENCODING_MAC_CROATIAN,
97
98     SUBTITLE_ENCODING_ISO_8859_5,
99     SUBTITLE_ENCODING_IBM_855,
100     SUBTITLE_ENCODING_ISO_IR_111,
101     SUBTITLE_ENCODING_KOI8_R,
102     SUBTITLE_ENCODING_MAC_CYRILLIC,
103     SUBTITLE_ENCODING_WINDOWS_1251,
104
105     SUBTITLE_ENCODING_CP_866,
106
107     SUBTITLE_ENCODING_MAC_UKRAINIAN,
108     SUBTITLE_ENCODING_KOI8_U,
109
110     SUBTITLE_ENCODING_GEOSTD8,
111
112     SUBTITLE_ENCODING_ISO_8859_7,
113     SUBTITLE_ENCODING_MAC_GREEK,
114     SUBTITLE_ENCODING_WINDOWS_1253,
115
116     SUBTITLE_ENCODING_MAC_GUJARATI,
117
118     SUBTITLE_ENCODING_MAC_GURMUKHI,
119
120     SUBTITLE_ENCODING_ISO_8859_8_I,
121     SUBTITLE_ENCODING_IBM_862,
122     SUBTITLE_ENCODING_MAC_HEBREW,
123     SUBTITLE_ENCODING_WINDOWS_1255,
124
125     SUBTITLE_ENCODING_ISO_8859_8,
126
127     SUBTITLE_ENCODING_MAC_DEVANAGARI,
128
129     SUBTITLE_ENCODING_MAC_ICELANDIC,
130
131     SUBTITLE_ENCODING_EUC_JP,
132     SUBTITLE_ENCODING_ISO_2022_JP,
133     SUBTITLE_ENCODING_SHIFT_JIS,
134
135     SUBTITLE_ENCODING_EUC_KR,
136     SUBTITLE_ENCODING_ISO_2022_KR,
137     SUBTITLE_ENCODING_JOHAB,
138     SUBTITLE_ENCODING_UHC,
139
140     SUBTITLE_ENCODING_ISO_8859_10,
141
142     SUBTITLE_ENCODING_MAC_FARSI,
143
144     SUBTITLE_ENCODING_ISO_8859_16,
145     SUBTITLE_ENCODING_MAC_ROMANIAN,
146
147     SUBTITLE_ENCODING_ISO_8859_3,
148
149     SUBTITLE_ENCODING_TIS_620,
150
151     SUBTITLE_ENCODING_ISO_8859_9,
152     SUBTITLE_ENCODING_IBM_857,
153     SUBTITLE_ENCODING_MAC_TURKISH,
154     SUBTITLE_ENCODING_WINDOWS_1254,
155
156     SUBTITLE_ENCODING_UTF_7,
157     SUBTITLE_ENCODING_UTF_8,
158     SUBTITLE_ENCODING_UTF_16,
159     SUBTITLE_ENCODING_UCS_2,
160     SUBTITLE_ENCODING_UCS_4,
161
162     SUBTITLE_ENCODING_ISO_8859_1,
163     SUBTITLE_ENCODING_ISO_8859_15,
164     SUBTITLE_ENCODING_IBM_850,
165     SUBTITLE_ENCODING_MAC_ROMAN,
166     SUBTITLE_ENCODING_WINDOWS_1252,
167
168     SUBTITLE_ENCODING_TCVN,
169     SUBTITLE_ENCODING_VISCII,
170     SUBTITLE_ENCODING_WINDOWS_1258,
171
172     SUBTITLE_ENCODING_CURRENT_LOCALE,
173
174     SUBTITLE_ENCODING_LAST
175 } SubtitleEncodingIndex;
176
177 typedef struct {
178     int index;
179     const QString charset;
180     const QString name;
181 } SubtitleEncoding;
182
183 static SubtitleEncoding encodings[] = {
184     {SUBTITLE_ENCODING_ISO_8859_6,      "ISO-8859-6",           qtTrId ("Arabic")},
185     {SUBTITLE_ENCODING_IBM_864,         "IBM864",               qtTrId ("Arabic")},
186     {SUBTITLE_ENCODING_MAC_ARABIC,      "MAC_ARABIC",           qtTrId ("Arabic")},
187     {SUBTITLE_ENCODING_WINDOWS_1256,    "WINDOWS-1256",         qtTrId ("Arabic")},
188
189     {SUBTITLE_ENCODING_ARMSCII_8,       "ARMSCII-8",            qtTrId ("Armenian")},
190
191     {SUBTITLE_ENCODING_ISO_8859_4,      "ISO-8859-4",           qtTrId ("Baltic")},
192     {SUBTITLE_ENCODING_ISO_8859_13,     "ISO-8859-13",          qtTrId ("Baltic")},
193     {SUBTITLE_ENCODING_WINDOWS_1257,    "WINDOWS-1257",         qtTrId ("Baltic")},
194
195     {SUBTITLE_ENCODING_ISO_8859_14,     "ISO-8859-14",          qtTrId ("Celtic")},
196
197     {SUBTITLE_ENCODING_ISO_8859_2,      "ISO-8859-2",           qtTrId ("Central European")},
198     {SUBTITLE_ENCODING_IBM_852,         "IBM852",               qtTrId ("Central European")},
199     {SUBTITLE_ENCODING_MAC_CE,          "MAC_CE",               qtTrId ("Central European")},
200     {SUBTITLE_ENCODING_WINDOWS_1250,    "WINDOWS-1250",         qtTrId ("Central European")},
201
202     {SUBTITLE_ENCODING_GB18030,         "GB18030",              qtTrId ("Chinese Simplified")},
203     {SUBTITLE_ENCODING_GB2312,          "GB2312",               qtTrId ("Chinese Simplified")},
204     {SUBTITLE_ENCODING_GBK,             "GBK",                  qtTrId ("Chinese Simplified")},
205     {SUBTITLE_ENCODING_HZ,              "HZ",                   qtTrId ("Chinese Simplified")},
206
207     {SUBTITLE_ENCODING_BIG5,            "BIG5",                 qtTrId ("Chinese Traditional")},
208     {SUBTITLE_ENCODING_BIG5_HKSCS,      "BIG5-HKSCS",           qtTrId ("Chinese Traditional")},
209     {SUBTITLE_ENCODING_EUC_TW,          "EUC-TW",               qtTrId ("Chinese Traditional")},
210
211     {SUBTITLE_ENCODING_MAC_CROATIAN,    "MAC_CROATIAN",         qtTrId ("Croatian")},
212
213     {SUBTITLE_ENCODING_ISO_8859_5,      "ISO-8859-5",           qtTrId ("Cyrillic")},
214     {SUBTITLE_ENCODING_IBM_855,         "IBM855",               qtTrId ("Cyrillic")},
215     {SUBTITLE_ENCODING_ISO_IR_111,      "ISO-IR-111",           qtTrId ("Cyrillic")},
216     {SUBTITLE_ENCODING_KOI8_R,          "KOI8-R",               qtTrId ("Cyrillic")},
217     {SUBTITLE_ENCODING_MAC_CYRILLIC,    "MAC-CYRILLIC",         qtTrId ("Cyrillic")},
218     {SUBTITLE_ENCODING_WINDOWS_1251,    "WINDOWS-1251",         qtTrId ("Cyrillic")},
219
220     {SUBTITLE_ENCODING_CP_866,          "CP866",                qtTrId ("Cyrillic/Russian")},
221
222     {SUBTITLE_ENCODING_MAC_UKRAINIAN,   "MAC_UKRAINIAN",        qtTrId ("Cyrillic/Ukrainian")},
223     {SUBTITLE_ENCODING_KOI8_U,          "KOI8-U",               qtTrId ("Cyrillic/Ukrainian")},
224
225     {SUBTITLE_ENCODING_GEOSTD8,         "GEORGIAN-PS",          qtTrId ("Georgian")},
226
227     {SUBTITLE_ENCODING_ISO_8859_7,      "ISO-8859-7",           qtTrId ("Greek")},
228     {SUBTITLE_ENCODING_MAC_GREEK,       "MAC_GREEK",            qtTrId ("Greek")},
229     {SUBTITLE_ENCODING_WINDOWS_1253,    "WINDOWS-1253",         qtTrId ("Greek")},
230
231     {SUBTITLE_ENCODING_MAC_GUJARATI,    "MAC_GUJARATI",         qtTrId ("Gujarati")},
232
233     {SUBTITLE_ENCODING_MAC_GURMUKHI,    "MAC_GURMUKHI",         qtTrId ("Gurmukhi")},
234
235     {SUBTITLE_ENCODING_ISO_8859_8_I,    "ISO-8859-8-I",         qtTrId ("Hebrew")},
236     {SUBTITLE_ENCODING_IBM_862,         "IBM862",               qtTrId ("Hebrew")},
237     {SUBTITLE_ENCODING_MAC_HEBREW,      "MAC_HEBREW",           qtTrId ("Hebrew")},
238     {SUBTITLE_ENCODING_WINDOWS_1255,    "WINDOWS-1255",         qtTrId ("Hebrew")},
239
240     {SUBTITLE_ENCODING_ISO_8859_8,      "ISO-8859-8",           qtTrId ("Hebrew Visual")},
241
242     {SUBTITLE_ENCODING_MAC_DEVANAGARI,  "MAC_DEVANAGARI",       qtTrId ("Hindi")},
243
244     {SUBTITLE_ENCODING_MAC_ICELANDIC,   "MAC_ICELANDIC",        qtTrId ("Icelandic")},
245
246     {SUBTITLE_ENCODING_EUC_JP,          "EUC-JP",               qtTrId ("Japanese")},
247     {SUBTITLE_ENCODING_ISO_2022_JP,     "ISO2022JP",            qtTrId ("Japanese")},
248     {SUBTITLE_ENCODING_SHIFT_JIS,       "SHIFT-JIS",            qtTrId ("Japanese")},
249
250     {SUBTITLE_ENCODING_EUC_KR,          "EUC-KR",               qtTrId ("Korean")},
251     {SUBTITLE_ENCODING_ISO_2022_KR,     "ISO2022KR",            qtTrId ("Korean")},
252     {SUBTITLE_ENCODING_JOHAB,           "JOHAB",                qtTrId ("Korean")},
253     {SUBTITLE_ENCODING_UHC,             "UHC",                  qtTrId ("Korean")},
254
255     {SUBTITLE_ENCODING_ISO_8859_10,     "ISO-8859-10",          qtTrId ("Nordic")},
256
257     {SUBTITLE_ENCODING_MAC_FARSI,       "MAC_FARSI",            qtTrId ("Persian")},
258
259     {SUBTITLE_ENCODING_ISO_8859_16,     "ISO-8859-16",          qtTrId ("Romanian")},
260     {SUBTITLE_ENCODING_MAC_ROMANIAN,    "MAC_ROMANIAN",         qtTrId ("Romanian")},
261
262     {SUBTITLE_ENCODING_ISO_8859_3,      "ISO-8859-3",           qtTrId ("South European")},
263
264     {SUBTITLE_ENCODING_TIS_620,         "TIS-620",              qtTrId ("Thai")},
265
266     {SUBTITLE_ENCODING_ISO_8859_9,      "ISO-8859-9",           qtTrId ("Turkish")},
267     {SUBTITLE_ENCODING_IBM_857,         "IBM857",               qtTrId ("Turkish")},
268     {SUBTITLE_ENCODING_MAC_TURKISH,     "MAC_TURKISH",          qtTrId ("Turkish")},
269     {SUBTITLE_ENCODING_WINDOWS_1254,    "WINDOWS-1254",         qtTrId ("Turkish")},
270
271     {SUBTITLE_ENCODING_UTF_7,           "UTF-7",                qtTrId ("Unicode")},
272     {SUBTITLE_ENCODING_UTF_8,           "UTF-8",                qtTrId ("Unicode")},
273     {SUBTITLE_ENCODING_UTF_16,          "UTF-16",               qtTrId ("Unicode")},
274     {SUBTITLE_ENCODING_UCS_2,           "UCS-2",                qtTrId ("Unicode")},
275     {SUBTITLE_ENCODING_UCS_4,           "UCS-4",                qtTrId ("Unicode")},
276
277     {SUBTITLE_ENCODING_ISO_8859_1,      "ISO-8859-1",           qtTrId ("Western")},
278     {SUBTITLE_ENCODING_ISO_8859_15,     "ISO-8859-15",          qtTrId ("Western")},
279     {SUBTITLE_ENCODING_IBM_850,         "IBM850",               qtTrId ("Western")},
280     {SUBTITLE_ENCODING_MAC_ROMAN,       "MAC_ROMAN",            qtTrId ("Western")},
281     {SUBTITLE_ENCODING_WINDOWS_1252,    "WINDOWS-1252",         qtTrId ("Western")},
282
283     {SUBTITLE_ENCODING_TCVN,            "TCVN",                 qtTrId ("Vietnamese")},
284     {SUBTITLE_ENCODING_VISCII,          "VISCII",               qtTrId ("Vietnamese")},
285     {SUBTITLE_ENCODING_WINDOWS_1258,    "WINDOWS-1258",         qtTrId ("Vietnamese")},
286
287     {SUBTITLE_ENCODING_CURRENT_LOCALE,  NULL,                   qtTrId ("Current Locale")}
288 };
289
290 /******************************************************************************
291  * SubtitlesWidget implementation.
292  */
293 SubtitlesWidget::SubtitlesWidget (QGraphicsWidget *parent) :
294         DcpStylableWidget (parent),
295         m_MainLayout (0),
296         m_TitleLabel (0),
297         m_AutoloadSubtitlesSwitch (0),
298         m_FontStyleLabel (0),
299         m_RegularStyleButton (0),
300         m_ItalicStyleButton (0),
301         m_BoldStyleButton (0),
302         m_SubtitlesFontSizeCombo (0),
303         m_SubtitlesEncodingCombo (0),
304         m_SubtitlesSettings (0)
305 {
306     m_SubtitlesSettings = new QSettings (RENDERER_PLUGIN_CONFIG_FILE, QSettings::NativeFormat);
307     m_SubtitlesSettings->beginGroup ("pipeline");
308
309     setContentsMargins (0.0, 0.0, 0.0, 0.0);
310
311     initWidget ();
312 }
313
314 SubtitlesWidget::~SubtitlesWidget ()
315 {
316 }
317
318 bool
319 SubtitlesWidget::back ()
320 {
321     return true; // back is handled by main window by default
322 }
323
324 void
325 SubtitlesWidget::initWidget ()
326 {
327     MLayout     *layout;
328     int         index = 0;
329
330     layout = new MLayout (this);
331     m_MainLayout = new MLinearLayoutPolicy (layout, Qt::Vertical);
332     m_MainLayout->setContentsMargins (0.0, 0.0, 0.0, 0.0);
333     m_MainLayout->setSpacing (0.0);
334     setLayout (layout);
335
336     addHeaderContainer ();
337
338     addAutoloadSubtitlesContainer ();
339     addSubtitlesFontStyleContainer ();
340     addSubtitlesFontSizeContainer ();
341     addSubtitlesEncodingContainer ();
342
343     m_MainLayout->addStretch ();
344
345     bool autoload_subtitles = m_SubtitlesSettings->value ("autoload_subtitles").toBool ();
346     m_AutoloadSubtitlesSwitch->setChecked (autoload_subtitles);
347
348     QString subtitle_font = m_SubtitlesSettings->value ("subtitle_font").toString ();
349     PangoFontDescription *font_desc = pango_font_description_from_string (
350                                            (const char *) subtitle_font.toAscii ().data ());
351     if (font_desc) {
352         index = 0;
353         while (font_sizes[index] != -1) {
354             if (font_sizes[index] == (pango_font_description_get_size (font_desc) / PANGO_SCALE)) {
355                 m_SubtitlesFontSizeCombo->setCurrentIndex (index);
356                 break;
357             }
358             index++;
359         }
360
361         PangoStyle font_style = pango_font_description_get_style (font_desc);
362         if (font_style == PANGO_STYLE_NORMAL)
363             m_RegularStyleButton->setChecked (true);
364         else
365             m_ItalicStyleButton->setChecked (true);
366
367         PangoWeight font_weight = pango_font_description_get_weight (font_desc);
368         if (font_weight == PANGO_WEIGHT_BOLD)
369             m_BoldStyleButton->setChecked (true);
370         else
371             m_BoldStyleButton->setChecked (false);
372
373         pango_font_description_free (font_desc);
374     }
375
376     QString subtitle_encoding = m_SubtitlesSettings->value ("subtitle_encoding").toString ();
377     index = 0;
378     while (index < SUBTITLE_ENCODING_LAST) {
379         if (encodings[index].charset == subtitle_encoding) {
380             m_SubtitlesEncodingCombo->setCurrentIndex (index);
381             break;
382         }
383         index++;
384     }
385 }
386
387 void
388 SubtitlesWidget::addHeaderContainer ()
389 {
390     QGraphicsLinearLayout   *layout;
391
392     Q_ASSERT (m_MainLayout);
393
394     layout = new QGraphicsLinearLayout (Qt::Horizontal);
395     layout->setContentsMargins (0.0, 0.0, 0.0, 0.0);
396
397     m_TitleLabel = new MLabel (qtTrId ("Subtitles"));
398     m_TitleLabel->setStyleName ("CommonHeaderInverted");
399     layout->addItem (m_TitleLabel);
400     layout->setAlignment (m_TitleLabel, Qt::AlignLeft);
401
402     m_MainLayout->addItem (layout);
403     m_MainLayout->setStretchFactor (layout, 0);
404 }
405
406 void
407 SubtitlesWidget::addAutoloadSubtitlesContainer ()
408 {
409     MContainer            *container;
410     QGraphicsLinearLayout *layout;
411
412     Q_ASSERT (m_MainLayout);
413
414     container = new MContainer (this);
415     container->setContentsMargins (0.0, 0.0, 0.0, 0.0);
416     container->setStyleName ("CommonLargePanelInverted");
417     container->setHeaderVisible (false);
418
419     layout = new QGraphicsLinearLayout (Qt::Horizontal);
420     layout->setContentsMargins (0.0, 0.0, 0.0, 0.0);
421     layout->setSpacing (0.0);
422     container->centralWidget()->setLayout (layout);
423
424     MLabel *label = new MLabel;
425     label->setWordWrap (true);
426     label->setStyleName ("CommonSingleTitleInverted");
427     label->setText (qtTrId ("Automatically load subtitles"));
428     layout->addItem (label);
429     layout->setAlignment (label, Qt::AlignVCenter);
430
431     m_AutoloadSubtitlesSwitch = new MButton;
432     m_AutoloadSubtitlesSwitch->setCheckable (true);
433     m_AutoloadSubtitlesSwitch->setViewType (MButton::switchType);
434     m_AutoloadSubtitlesSwitch->setStyleName ("CommonRightSwitchInverted");
435
436     connect (m_AutoloadSubtitlesSwitch, SIGNAL (toggled (bool)),
437              this, SLOT (AutoloadSubtitlesToggled (bool)));
438
439     layout->addItem (m_AutoloadSubtitlesSwitch);
440     layout->setAlignment (m_AutoloadSubtitlesSwitch, Qt::AlignVCenter | Qt::AlignRight);
441
442     m_MainLayout->addItem (container);
443     m_MainLayout->setStretchFactor (container, 0);
444 }
445
446 void
447 SubtitlesWidget::addSubtitlesFontStyleContainer ()
448 {
449     MContainer            *container;
450     QGraphicsLinearLayout *layout;
451     MLayout               *buttonGroup;
452     MLinearLayoutPolicy   *buttonGroupLayout;
453     MSeparator            *spacer;
454
455     Q_ASSERT (m_MainLayout);
456
457     container = new MContainer (this);
458     container->setContentsMargins (0.0, 0.0, 0.0, 0.0);
459     container->setStyleName ("CommonLargePanelInverted");
460     container->setHeaderVisible (false);
461
462     layout = new QGraphicsLinearLayout (Qt::Vertical);
463     layout->setContentsMargins (0.0, 0.0, 0.0, 0.0);
464     layout->setSpacing (0.0);
465     container->centralWidget()->setLayout (layout);
466
467     m_FontStyleLabel = new MLabel (qtTrId ("Font style"));
468     m_FontStyleLabel->setStyleName ("CommonTitleInverted");
469
470     layout->addItem (m_FontStyleLabel);
471     layout->setAlignment (m_FontStyleLabel, Qt::AlignLeft);
472
473     spacer = new MSeparator;
474     spacer->setStyleName ("CommonSpacer");
475     layout->addItem (spacer);
476
477     buttonGroup = new MLayout;
478     buttonGroupLayout = new MLinearLayoutPolicy (buttonGroup, Qt::Horizontal);
479     buttonGroupLayout->setNotifyWidgetsOfLayoutPositionEnabled (true);
480     buttonGroupLayout->setContentsMargins (14.0, 0.0, 14.0, 0.0);
481     buttonGroupLayout->setSpacing (0.0);
482
483     m_RegularStyleButton = new MButton ();
484     m_RegularStyleButton->setCheckable (true);
485     m_RegularStyleButton->setViewType (MButton::groupType);
486     m_RegularStyleButton->setText (font_styles[0].name);
487     buttonGroupLayout->addItem (m_RegularStyleButton);
488
489     connect (m_RegularStyleButton, SIGNAL (toggled (bool)),
490              this, SLOT (RegularStyleButtonToggled (bool)));
491
492     m_ItalicStyleButton = new MButton ();
493     m_ItalicStyleButton->setCheckable (true);
494     m_ItalicStyleButton->setViewType (MButton::groupType);
495     m_ItalicStyleButton->setText (font_styles[1].name);
496     buttonGroupLayout->addItem (m_ItalicStyleButton);
497
498     connect (m_ItalicStyleButton, SIGNAL (toggled (bool)),
499              this, SLOT (ItalicStyleButtonToggled (bool)));
500
501     m_BoldStyleButton = new MButton ();
502     m_BoldStyleButton->setCheckable (true);
503     m_BoldStyleButton->setViewType (MButton::groupType);
504     m_BoldStyleButton->setText (font_styles[2].name);
505     buttonGroupLayout->addItem (m_BoldStyleButton);
506
507     connect (m_BoldStyleButton, SIGNAL (toggled (bool)),
508              this, SLOT (BoldStyleButtonToggled (bool)));
509
510     layout->addItem (buttonGroup);
511     layout->setAlignment (buttonGroup, Qt::AlignLeft);
512
513     spacer = new MSeparator;
514     spacer->setStyleName ("CommonXLargeSpacer");
515     layout->addItem (spacer);
516
517     m_MainLayout->addItem (container);
518     m_MainLayout->setStretchFactor (container, 0);
519 }
520
521 void
522 SubtitlesWidget::addSubtitlesFontSizeContainer ()
523 {
524     int                   index = 0;
525
526     m_SubtitlesFontSizeCombo = new MComboBox ();
527     m_SubtitlesFontSizeCombo->setTitle (qtTrId ("Font size"));
528     m_SubtitlesFontSizeCombo->setStyleName ("CommonComboBoxInverted");
529
530     while (font_sizes[index] != -1) {
531         m_SubtitlesFontSizeCombo->addItem (QString::number (font_sizes[index]));
532         index++;
533     }
534
535     connect (m_SubtitlesFontSizeCombo, SIGNAL (activated (int)),
536              this, SLOT (SubtitlesFontSizeActivated (int)));
537
538     m_MainLayout->addItem (m_SubtitlesFontSizeCombo);
539     m_MainLayout->setStretchFactor (m_SubtitlesFontSizeCombo, 0);
540 }
541
542 void
543 SubtitlesWidget::addSubtitlesEncodingContainer ()
544 {
545     int                   index = 0;
546
547     m_SubtitlesEncodingCombo = new MComboBox ();
548     m_SubtitlesEncodingCombo->setTitle (qtTrId ("Encoding"));
549     m_SubtitlesEncodingCombo->setStyleName ("CommonComboBoxInverted");
550
551     while (index < SUBTITLE_ENCODING_LAST) {
552         if (encodings[index].charset.isNull ()) {
553             m_SubtitlesEncodingCombo->addItem (encodings[index].name);
554         } else {
555             m_SubtitlesEncodingCombo->addItem (QString ("%1 (%2)").arg (encodings[index].name)
556                                                                   .arg (encodings[index].charset));
557         }
558         index++;
559     }
560
561     connect (m_SubtitlesEncodingCombo, SIGNAL (activated (int)),
562              this, SLOT (SubtitlesEncodingActivated (int)));
563
564     m_MainLayout->addItem (m_SubtitlesEncodingCombo);
565     m_MainLayout->setStretchFactor (m_SubtitlesEncodingCombo, 0);
566 }
567
568 void
569 SubtitlesWidget::retranslateUi ()
570 {
571 }
572
573 void
574 SubtitlesWidget::AutoloadSubtitlesToggled (bool enabled)
575 {
576     m_SubtitlesSettings->setValue ("autoload_subtitles", enabled);
577 }
578
579 void
580 SubtitlesWidget::RegularStyleButtonToggled (bool toggled)
581 {
582     if (toggled) {
583         if (m_ItalicStyleButton->isChecked ())
584             m_ItalicStyleButton->setChecked (false);
585     } else {
586             m_ItalicStyleButton->setChecked (true);
587     }
588
589     QString subtitle_font = m_SubtitlesSettings->value ("subtitle_font").toString ();
590     PangoFontDescription *font_desc = pango_font_description_from_string (
591                                                 (const char *) subtitle_font.toAscii ().data ());
592     if (font_desc) {
593         if (toggled) {
594             pango_font_description_set_style (font_desc, PANGO_STYLE_NORMAL);
595         } else {
596             pango_font_description_set_style (font_desc, PANGO_STYLE_ITALIC);
597         }
598
599         m_SubtitlesSettings->setValue ("subtitle_font", pango_font_description_to_string (font_desc));
600         pango_font_description_free (font_desc);
601     }
602 }
603
604 void
605 SubtitlesWidget::ItalicStyleButtonToggled (bool toggled)
606 {
607     if (toggled) {
608         if (m_RegularStyleButton->isChecked ())
609             m_RegularStyleButton->setChecked (false);
610     } else {
611             m_RegularStyleButton->setChecked (true);
612     }
613
614     QString subtitle_font = m_SubtitlesSettings->value ("subtitle_font").toString ();
615     PangoFontDescription *font_desc = pango_font_description_from_string (
616                                                 (const char *) subtitle_font.toAscii ().data ());
617     if (font_desc) {
618         if (toggled) {
619             pango_font_description_set_style (font_desc, PANGO_STYLE_ITALIC);
620         } else {
621             pango_font_description_set_style (font_desc, PANGO_STYLE_NORMAL);
622         }
623
624         m_SubtitlesSettings->setValue ("subtitle_font", pango_font_description_to_string (font_desc));
625         pango_font_description_free (font_desc);
626     }
627 }
628
629 void
630 SubtitlesWidget::BoldStyleButtonToggled (bool toggled)
631 {
632     QString subtitle_font = m_SubtitlesSettings->value ("subtitle_font").toString ();
633     PangoFontDescription *font_desc = pango_font_description_from_string (
634                                                 (const char *) subtitle_font.toAscii ().data ());
635     if (font_desc) {
636         if (toggled) {
637             pango_font_description_set_weight (font_desc, PANGO_WEIGHT_BOLD);
638         } else {
639             pango_font_description_set_weight (font_desc, PANGO_WEIGHT_NORMAL);
640         }
641
642         m_SubtitlesSettings->setValue ("subtitle_font", pango_font_description_to_string (font_desc));
643         pango_font_description_free (font_desc);
644     }
645 }
646
647 void
648 SubtitlesWidget::SubtitlesFontSizeActivated (int index)
649 {
650     QString subtitle_font = m_SubtitlesSettings->value ("subtitle_font").toString ();
651     PangoFontDescription *font_desc = pango_font_description_from_string (
652                                                 (const char *) subtitle_font.toAscii ().data ());
653     if (font_desc) {
654         if (pango_font_description_get_size (font_desc)  != (font_sizes[index] * PANGO_SCALE)) {
655             pango_font_description_set_size (font_desc, font_sizes[index] * PANGO_SCALE);
656             m_SubtitlesSettings->setValue ("subtitle_font", pango_font_description_to_string (font_desc));
657         }
658         pango_font_description_free (font_desc);
659     }
660 }
661
662 void
663 SubtitlesWidget::SubtitlesEncodingActivated (int index)
664 {
665     m_SubtitlesSettings->setValue ("subtitle_encoding", encodings[index].charset);
666 }