Added DUI control panel applet
[mafwsubrenderer] / qmafw-gst-subtitles-renderer / applet / subtitleswidget.cpp
1 /****************************************************************************+
2 **
3 ** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
4 ** All rights reserved.
5 ** Contact: Nokia Corporation (directui@nokia.com)
6 **
7 ** This file is part of meegotouch-controlpanelapplets.
8 **
9 ** If you have questions regarding the use of this file, please contact
10 ** Nokia at directui@nokia.com.
11 **
12 ** This library is free software; you can redistribute it and/or
13 ** modify it under the terms of the GNU Lesser General Public
14 ** License version 2.1 as published by the Free Software Foundation
15 ** and appearing in the file LICENSE.LGPL included in the packaging
16 ** of this file.
17 **
18 ****************************************************************************/
19 #include "subtitleswidget.h"
20 #include "dcpsubtitles.h"
21
22 #include <QGraphicsLinearLayout>
23 #include <QSettings>
24 #include <QDebug>
25
26 #include <MStylableWidget>
27 #include <MLayout>
28 #include <MLinearLayoutPolicy>
29 #include <MButton>
30 #include <MSeparator>
31 #include <MContainer>
32 #include <MLabel>
33 #include <MComboBox>
34
35 #include <MWidgetCreator>
36 M_REGISTER_WIDGET_NO_CREATE (SubtitlesWidget);
37
38 #include <pango/pango-font.h>
39
40 const QString RENDERER_PLUGIN_CONFIG_FILE = "/usr/share/qmafw/mafw-gst-renderer-plugin.conf";
41
42 typedef enum
43 {
44     FONT_STYLE_REGULAR,
45     FONT_STYLE_ITALIC,
46     FONT_STYLE_BOLD,
47     FONT_STYLE_ITALIC_BOLD,
48     FONT_STYLE_LAST,
49 } FontStyleIndex;
50
51 typedef struct {
52     int index;
53     const QString name;
54 } FontStyle;
55
56 static FontStyle font_styles[] = {
57     {FONT_STYLE_REGULAR,        qtTrId("Regular")},
58     {FONT_STYLE_ITALIC,         qtTrId("Italic")},
59     {FONT_STYLE_BOLD,           qtTrId("Bold")},
60     {FONT_STYLE_ITALIC_BOLD,    qtTrId("Italic Bold")},
61 };
62
63 static const int font_sizes[] =
64 {
65   10, 12, 14, 16, 18, 20, 22, 24, 26, 28, -1
66 };
67
68 typedef enum
69 {
70     SUBTITLE_ENCODING_ISO_8859_6,
71     SUBTITLE_ENCODING_IBM_864,
72     SUBTITLE_ENCODING_MAC_ARABIC,
73     SUBTITLE_ENCODING_WINDOWS_1256,
74
75     SUBTITLE_ENCODING_ARMSCII_8,
76
77     SUBTITLE_ENCODING_ISO_8859_4,
78     SUBTITLE_ENCODING_ISO_8859_13,
79     SUBTITLE_ENCODING_WINDOWS_1257,
80
81     SUBTITLE_ENCODING_ISO_8859_14,
82
83     SUBTITLE_ENCODING_ISO_8859_2,
84     SUBTITLE_ENCODING_IBM_852,
85     SUBTITLE_ENCODING_MAC_CE,
86     SUBTITLE_ENCODING_WINDOWS_1250,
87
88     SUBTITLE_ENCODING_GB18030,
89     SUBTITLE_ENCODING_GB2312,
90     SUBTITLE_ENCODING_GBK,
91     SUBTITLE_ENCODING_HZ,
92
93     SUBTITLE_ENCODING_BIG5,
94     SUBTITLE_ENCODING_BIG5_HKSCS,
95     SUBTITLE_ENCODING_EUC_TW,
96
97     SUBTITLE_ENCODING_MAC_CROATIAN,
98
99     SUBTITLE_ENCODING_ISO_8859_5,
100     SUBTITLE_ENCODING_IBM_855,
101     SUBTITLE_ENCODING_ISO_IR_111,
102     SUBTITLE_ENCODING_KOI8_R,
103     SUBTITLE_ENCODING_MAC_CYRILLIC,
104     SUBTITLE_ENCODING_WINDOWS_1251,
105
106     SUBTITLE_ENCODING_CP_866,
107
108     SUBTITLE_ENCODING_MAC_UKRAINIAN,
109     SUBTITLE_ENCODING_KOI8_U,
110
111     SUBTITLE_ENCODING_GEOSTD8,
112
113     SUBTITLE_ENCODING_ISO_8859_7,
114     SUBTITLE_ENCODING_MAC_GREEK,
115     SUBTITLE_ENCODING_WINDOWS_1253,
116
117     SUBTITLE_ENCODING_MAC_GUJARATI,
118
119     SUBTITLE_ENCODING_MAC_GURMUKHI,
120
121     SUBTITLE_ENCODING_ISO_8859_8_I,
122     SUBTITLE_ENCODING_IBM_862,
123     SUBTITLE_ENCODING_MAC_HEBREW,
124     SUBTITLE_ENCODING_WINDOWS_1255,
125
126     SUBTITLE_ENCODING_ISO_8859_8,
127
128     SUBTITLE_ENCODING_MAC_DEVANAGARI,
129
130     SUBTITLE_ENCODING_MAC_ICELANDIC,
131
132     SUBTITLE_ENCODING_EUC_JP,
133     SUBTITLE_ENCODING_ISO_2022_JP,
134     SUBTITLE_ENCODING_SHIFT_JIS,
135
136     SUBTITLE_ENCODING_EUC_KR,
137     SUBTITLE_ENCODING_ISO_2022_KR,
138     SUBTITLE_ENCODING_JOHAB,
139     SUBTITLE_ENCODING_UHC,
140
141     SUBTITLE_ENCODING_ISO_8859_10,
142
143     SUBTITLE_ENCODING_MAC_FARSI,
144
145     SUBTITLE_ENCODING_ISO_8859_16,
146     SUBTITLE_ENCODING_MAC_ROMANIAN,
147
148     SUBTITLE_ENCODING_ISO_8859_3,
149
150     SUBTITLE_ENCODING_TIS_620,
151
152     SUBTITLE_ENCODING_ISO_8859_9,
153     SUBTITLE_ENCODING_IBM_857,
154     SUBTITLE_ENCODING_MAC_TURKISH,
155     SUBTITLE_ENCODING_WINDOWS_1254,
156
157     SUBTITLE_ENCODING_UTF_7,
158     SUBTITLE_ENCODING_UTF_8,
159     SUBTITLE_ENCODING_UTF_16,
160     SUBTITLE_ENCODING_UCS_2,
161     SUBTITLE_ENCODING_UCS_4,
162
163     SUBTITLE_ENCODING_ISO_8859_1,
164     SUBTITLE_ENCODING_ISO_8859_15,
165     SUBTITLE_ENCODING_IBM_850,
166     SUBTITLE_ENCODING_MAC_ROMAN,
167     SUBTITLE_ENCODING_WINDOWS_1252,
168
169     SUBTITLE_ENCODING_TCVN,
170     SUBTITLE_ENCODING_VISCII,
171     SUBTITLE_ENCODING_WINDOWS_1258,
172
173     SUBTITLE_ENCODING_CURRENT_LOCALE,
174
175     SUBTITLE_ENCODING_LAST
176 } SubtitleEncodingIndex;
177
178 typedef struct {
179     int index;
180     const QString charset;
181     const QString name;
182 } SubtitleEncoding;
183
184 static SubtitleEncoding encodings[] = {
185     {SUBTITLE_ENCODING_ISO_8859_6,      "ISO-8859-6",           qtTrId("Arabic")},
186     {SUBTITLE_ENCODING_IBM_864,         "IBM864",               qtTrId("Arabic")},
187     {SUBTITLE_ENCODING_MAC_ARABIC,      "MAC_ARABIC",           qtTrId("Arabic")},
188     {SUBTITLE_ENCODING_WINDOWS_1256,    "WINDOWS-1256",         qtTrId("Arabic")},
189
190     {SUBTITLE_ENCODING_ARMSCII_8,       "ARMSCII-8",            qtTrId("Armenian")},
191
192     {SUBTITLE_ENCODING_ISO_8859_4,      "ISO-8859-4",           qtTrId("Baltic")},
193     {SUBTITLE_ENCODING_ISO_8859_13,     "ISO-8859-13",          qtTrId("Baltic")},
194     {SUBTITLE_ENCODING_WINDOWS_1257,    "WINDOWS-1257",         qtTrId("Baltic")},
195
196     {SUBTITLE_ENCODING_ISO_8859_14,     "ISO-8859-14",          qtTrId("Celtic")},
197
198     {SUBTITLE_ENCODING_ISO_8859_2,      "ISO-8859-2",           qtTrId("Central European")},
199     {SUBTITLE_ENCODING_IBM_852,         "IBM852",               qtTrId("Central European")},
200     {SUBTITLE_ENCODING_MAC_CE,          "MAC_CE",               qtTrId("Central European")},
201     {SUBTITLE_ENCODING_WINDOWS_1250,    "WINDOWS-1250",         qtTrId("Central European")},
202
203     {SUBTITLE_ENCODING_GB18030,         "GB18030",              qtTrId("Chinese Simplified")},
204     {SUBTITLE_ENCODING_GB2312,          "GB2312",               qtTrId("Chinese Simplified")},
205     {SUBTITLE_ENCODING_GBK,             "GBK",                  qtTrId("Chinese Simplified")},
206     {SUBTITLE_ENCODING_HZ,              "HZ",                   qtTrId("Chinese Simplified")},
207
208     {SUBTITLE_ENCODING_BIG5,            "BIG5",                 qtTrId("Chinese Traditional")},
209     {SUBTITLE_ENCODING_BIG5_HKSCS,      "BIG5-HKSCS",           qtTrId("Chinese Traditional")},
210     {SUBTITLE_ENCODING_EUC_TW,          "EUC-TW",               qtTrId("Chinese Traditional")},
211
212     {SUBTITLE_ENCODING_MAC_CROATIAN,    "MAC_CROATIAN",         qtTrId("Croatian")},
213
214     {SUBTITLE_ENCODING_ISO_8859_5,      "ISO-8859-5",           qtTrId("Cyrillic")},
215     {SUBTITLE_ENCODING_IBM_855,         "IBM855",               qtTrId("Cyrillic")},
216     {SUBTITLE_ENCODING_ISO_IR_111,      "ISO-IR-111",           qtTrId("Cyrillic")},
217     {SUBTITLE_ENCODING_KOI8_R,          "KOI8-R",               qtTrId("Cyrillic")},
218     {SUBTITLE_ENCODING_MAC_CYRILLIC,    "MAC-CYRILLIC",         qtTrId("Cyrillic")},
219     {SUBTITLE_ENCODING_WINDOWS_1251,    "WINDOWS-1251",         qtTrId("Cyrillic")},
220
221     {SUBTITLE_ENCODING_CP_866,          "CP866",                qtTrId("Cyrillic/Russian")},
222
223     {SUBTITLE_ENCODING_MAC_UKRAINIAN,   "MAC_UKRAINIAN",        qtTrId("Cyrillic/Ukrainian")},
224     {SUBTITLE_ENCODING_KOI8_U,          "KOI8-U",               qtTrId("Cyrillic/Ukrainian")},
225
226     {SUBTITLE_ENCODING_GEOSTD8,         "GEORGIAN-PS",          qtTrId("Georgian")},
227
228     {SUBTITLE_ENCODING_ISO_8859_7,      "ISO-8859-7",           qtTrId("Greek")},
229     {SUBTITLE_ENCODING_MAC_GREEK,       "MAC_GREEK",            qtTrId("Greek")},
230     {SUBTITLE_ENCODING_WINDOWS_1253,    "WINDOWS-1253",         qtTrId("Greek")},
231
232     {SUBTITLE_ENCODING_MAC_GUJARATI,    "MAC_GUJARATI",         qtTrId("Gujarati")},
233
234     {SUBTITLE_ENCODING_MAC_GURMUKHI,    "MAC_GURMUKHI",         qtTrId("Gurmukhi")},
235
236     {SUBTITLE_ENCODING_ISO_8859_8_I,    "ISO-8859-8-I",         qtTrId("Hebrew")},
237     {SUBTITLE_ENCODING_IBM_862,         "IBM862",               qtTrId("Hebrew")},
238     {SUBTITLE_ENCODING_MAC_HEBREW,      "MAC_HEBREW",           qtTrId("Hebrew")},
239     {SUBTITLE_ENCODING_WINDOWS_1255,    "WINDOWS-1255",         qtTrId("Hebrew")},
240
241     {SUBTITLE_ENCODING_ISO_8859_8,      "ISO-8859-8",           qtTrId("Hebrew Visual")},
242
243     {SUBTITLE_ENCODING_MAC_DEVANAGARI,  "MAC_DEVANAGARI",       qtTrId("Hindi")},
244
245     {SUBTITLE_ENCODING_MAC_ICELANDIC,   "MAC_ICELANDIC",        qtTrId("Icelandic")},
246
247     {SUBTITLE_ENCODING_EUC_JP,          "EUC-JP",               qtTrId("Japanese")},
248     {SUBTITLE_ENCODING_ISO_2022_JP,     "ISO2022JP",            qtTrId("Japanese")},
249     {SUBTITLE_ENCODING_SHIFT_JIS,       "SHIFT-JIS",            qtTrId("Japanese")},
250
251     {SUBTITLE_ENCODING_EUC_KR,          "EUC-KR",               qtTrId("Korean")},
252     {SUBTITLE_ENCODING_ISO_2022_KR,     "ISO2022KR",            qtTrId("Korean")},
253     {SUBTITLE_ENCODING_JOHAB,           "JOHAB",                qtTrId("Korean")},
254     {SUBTITLE_ENCODING_UHC,             "UHC",                  qtTrId("Korean")},
255
256     {SUBTITLE_ENCODING_ISO_8859_10,     "ISO-8859-10",          qtTrId("Nordic")},
257
258     {SUBTITLE_ENCODING_MAC_FARSI,       "MAC_FARSI",            qtTrId("Persian")},
259
260     {SUBTITLE_ENCODING_ISO_8859_16,     "ISO-8859-16",          qtTrId("Romanian")},
261     {SUBTITLE_ENCODING_MAC_ROMANIAN,    "MAC_ROMANIAN",         qtTrId("Romanian")},
262
263     {SUBTITLE_ENCODING_ISO_8859_3,      "ISO-8859-3",           qtTrId("South European")},
264
265     {SUBTITLE_ENCODING_TIS_620,         "TIS-620",              qtTrId("Thai")},
266
267     {SUBTITLE_ENCODING_ISO_8859_9,      "ISO-8859-9",           qtTrId("Turkish")},
268     {SUBTITLE_ENCODING_IBM_857,         "IBM857",               qtTrId("Turkish")},
269     {SUBTITLE_ENCODING_MAC_TURKISH,     "MAC_TURKISH",          qtTrId("Turkish")},
270     {SUBTITLE_ENCODING_WINDOWS_1254,    "WINDOWS-1254",         qtTrId("Turkish")},
271
272     {SUBTITLE_ENCODING_UTF_7,           "UTF-7",                qtTrId("Unicode")},
273     {SUBTITLE_ENCODING_UTF_8,           "UTF-8",                qtTrId("Unicode")},
274     {SUBTITLE_ENCODING_UTF_16,          "UTF-16",               qtTrId("Unicode")},
275     {SUBTITLE_ENCODING_UCS_2,           "UCS-2",                qtTrId("Unicode")},
276     {SUBTITLE_ENCODING_UCS_4,           "UCS-4",                qtTrId("Unicode")},
277
278     {SUBTITLE_ENCODING_ISO_8859_1,      "ISO-8859-1",           qtTrId("Western")},
279     {SUBTITLE_ENCODING_ISO_8859_15,     "ISO-8859-15",          qtTrId("Western")},
280     {SUBTITLE_ENCODING_IBM_850,         "IBM850",               qtTrId("Western")},
281     {SUBTITLE_ENCODING_MAC_ROMAN,       "MAC_ROMAN",            qtTrId("Western")},
282     {SUBTITLE_ENCODING_WINDOWS_1252,    "WINDOWS-1252",         qtTrId("Western")},
283
284     {SUBTITLE_ENCODING_TCVN,            "TCVN",                 qtTrId("Vietnamese")},
285     {SUBTITLE_ENCODING_VISCII,          "VISCII",               qtTrId("Vietnamese")},
286     {SUBTITLE_ENCODING_WINDOWS_1258,    "WINDOWS-1258",         qtTrId("Vietnamese")},
287
288     {SUBTITLE_ENCODING_CURRENT_LOCALE,  NULL,                   qtTrId("Current Locale")}
289 };
290
291 /******************************************************************************
292  * SubtitlesWidget implementation.
293  */
294 SubtitlesWidget::SubtitlesWidget (QGraphicsWidget *parent) :
295         DcpStylableWidget (parent),
296         m_MainLayout (0),
297         m_TitleLabel (0),
298         m_AutoloadSubtitlesSwitch (0),
299         m_FontStyleLabel (0),
300         m_RegularStyleButton (0),
301         m_ItalicStyleButton (0),
302         m_BoldStyleButton (0),
303         m_SubtitlesFontSizeCombo (0),
304         m_SubtitlesEncodingCombo (0),
305         m_SubtitlesSettings (0)
306 {
307     m_SubtitlesSettings = new QSettings (RENDERER_PLUGIN_CONFIG_FILE, QSettings::NativeFormat);
308     m_SubtitlesSettings->beginGroup ("pipeline");
309
310     setContentsMargins (0.0, 0.0, 0.0, 0.0);
311
312     initWidget ();
313 }
314
315 SubtitlesWidget::~SubtitlesWidget ()
316 {
317 }
318
319 bool
320 SubtitlesWidget::back ()
321 {
322     return true; // back is handled by main window by default
323 }
324
325 void
326 SubtitlesWidget::initWidget ()
327 {
328     MLayout     *layout;
329     int         index = 0;
330
331     layout = new MLayout (this);
332     m_MainLayout = new MLinearLayoutPolicy (layout, Qt::Vertical);
333     m_MainLayout->setContentsMargins (0.0, 0.0, 0.0, 0.0);
334     m_MainLayout->setSpacing (0.0);
335     setLayout (layout);
336
337     addHeaderContainer ();
338
339     addAutoloadSubtitlesContainer ();
340     addSubtitlesFontStyleContainer ();
341     addSubtitlesFontSizeContainer ();
342     addSubtitlesEncodingContainer ();
343
344     m_MainLayout->addStretch ();
345
346     bool autoload_subtitles = m_SubtitlesSettings->value ("autoload_subtitles").toBool ();
347     m_AutoloadSubtitlesSwitch->setChecked (autoload_subtitles);
348
349     QString subtitle_font = m_SubtitlesSettings->value ("subtitle_font").toString ();
350     PangoFontDescription *font_desc = pango_font_description_from_string ((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);
416     container->setStyleName ("CommonLargePanelInverted");
417     container->setHeaderVisible (false);
418
419     layout = new QGraphicsLinearLayout (Qt::Horizontal);
420     layout->setContentsMargins (0,0,0,0);
421     layout->setSpacing (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);
459     container->setStyleName ("CommonLargePanelInverted");
460     container->setHeaderVisible (false);
461
462     layout = new QGraphicsLinearLayout (Qt::Vertical);
463     layout->setContentsMargins (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, 14, 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     if (m_TitleLabel)
572         m_TitleLabel->setText (qtTrId("Subtitles"));
573 }
574
575 void
576 SubtitlesWidget::AutoloadSubtitlesToggled (bool enabled)
577 {
578     m_SubtitlesSettings->setValue ("autoload_subtitles", enabled);
579 }
580
581 void
582 SubtitlesWidget::RegularStyleButtonToggled (bool toggled)
583 {
584     if (toggled) {
585         if (m_ItalicStyleButton->isChecked ())
586             m_ItalicStyleButton->setChecked (false);
587     } else {
588             m_ItalicStyleButton->setChecked (true);
589     }
590
591     QString subtitle_font = m_SubtitlesSettings->value ("subtitle_font").toString ();
592     PangoFontDescription *font_desc = pango_font_description_from_string (
593                                                 (const char *) subtitle_font.toAscii().data());
594     if (font_desc) {
595         if (toggled) {
596             pango_font_description_set_style (font_desc, PANGO_STYLE_NORMAL);
597         } else {
598             pango_font_description_set_style (font_desc, PANGO_STYLE_ITALIC);
599         }
600
601         m_SubtitlesSettings->setValue ("subtitle_font", pango_font_description_to_string (font_desc));
602         pango_font_description_free (font_desc);
603     }
604 }
605
606 void
607 SubtitlesWidget::ItalicStyleButtonToggled (bool toggled)
608 {
609     if (toggled) {
610         if (m_RegularStyleButton->isChecked ())
611             m_RegularStyleButton->setChecked (false);
612     } else {
613             m_RegularStyleButton->setChecked (true);
614     }
615
616     QString subtitle_font = m_SubtitlesSettings->value ("subtitle_font").toString ();
617     PangoFontDescription *font_desc = pango_font_description_from_string (
618                                                 (const char *) subtitle_font.toAscii().data());
619     if (font_desc) {
620         if (toggled) {
621             pango_font_description_set_style (font_desc, PANGO_STYLE_ITALIC);
622         } else {
623             pango_font_description_set_style (font_desc, PANGO_STYLE_NORMAL);
624         }
625
626         m_SubtitlesSettings->setValue ("subtitle_font", pango_font_description_to_string (font_desc));
627         pango_font_description_free (font_desc);
628     }
629 }
630
631 void
632 SubtitlesWidget::BoldStyleButtonToggled (bool toggled)
633 {
634     QString subtitle_font = m_SubtitlesSettings->value ("subtitle_font").toString ();
635     PangoFontDescription *font_desc = pango_font_description_from_string (
636                                                 (const char *) subtitle_font.toAscii().data());
637     if (font_desc) {
638         if (toggled) {
639             pango_font_description_set_weight (font_desc, PANGO_WEIGHT_BOLD);
640         } else {
641             pango_font_description_set_weight (font_desc, PANGO_WEIGHT_NORMAL);
642         }
643
644         m_SubtitlesSettings->setValue ("subtitle_font", pango_font_description_to_string (font_desc));
645         pango_font_description_free (font_desc);
646     }
647 }
648
649 void
650 SubtitlesWidget::SubtitlesFontSizeActivated (int index)
651 {
652     QString subtitle_font = m_SubtitlesSettings->value ("subtitle_font").toString ();
653     PangoFontDescription *font_desc = pango_font_description_from_string (
654                                                 (const char *) subtitle_font.toAscii().data());
655     if (font_desc) {
656         if (pango_font_description_get_size (font_desc)  != (font_sizes[index] * PANGO_SCALE)) {
657             pango_font_description_set_size (font_desc, font_sizes[index] * PANGO_SCALE);
658             m_SubtitlesSettings->setValue ("subtitle_font", pango_font_description_to_string (font_desc));
659         }
660         pango_font_description_free (font_desc);
661     }
662 }
663
664 void
665 SubtitlesWidget::SubtitlesEncodingActivated (int index)
666 {
667     m_SubtitlesSettings->setValue ("subtitle_encoding", encodings[index].charset);
668 }