void FullscreenVideoControllerGtk::createHud() { m_hudWindow = gtk_window_new(GTK_WINDOW_POPUP); gtk_window_set_gravity(GTK_WINDOW(m_hudWindow), GDK_GRAVITY_SOUTH_WEST); gtk_window_set_type_hint(GTK_WINDOW(m_hudWindow), GDK_WINDOW_TYPE_HINT_NORMAL); m_hudMotionNotifySignalId = g_signal_connect(m_hudWindow, "motion-notify-event", G_CALLBACK(onFullscreenGtkMotionNotifyEvent), this); #ifdef GTK_API_VERSION_2 GtkWidget* hbox = gtk_hbox_new(FALSE, 4); #else GtkWidget* hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 4); #endif gtk_container_add(GTK_CONTAINER(m_hudWindow), hbox); m_playPauseAction = gtk_action_new("play", _("Play / Pause"), _("Play or pause the media"), PAUSE_ICON_NAME); m_playActionActivateSignalId = g_signal_connect(m_playPauseAction, "activate", G_CALLBACK(togglePlayPauseActivated), this); GtkWidget* item = gtk_action_create_tool_item(m_playPauseAction); gtk_box_pack_start(GTK_BOX(hbox), item, FALSE, TRUE, 0); GtkWidget* label = gtk_label_new(_("Time:")); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, TRUE, 0); GtkAdjustment* adjustment = GTK_ADJUSTMENT(gtk_adjustment_new(0.0, 0.0, 100.0, 0.1, 1.0, 1.0)); #ifdef GTK_API_VERSION_2 m_timeHScale = gtk_hscale_new(adjustment); #else m_timeHScale = gtk_scale_new(GTK_ORIENTATION_HORIZONTAL, adjustment); #endif gtk_scale_set_draw_value(GTK_SCALE(m_timeHScale), FALSE); gtk_range_set_show_fill_level(GTK_RANGE(m_timeHScale), TRUE); m_timeScaleButtonPressedSignalId = g_signal_connect(m_timeHScale, "button-press-event", G_CALLBACK(timeScaleButtonPressed), this); m_timeScaleButtonReleasedSignalId = g_signal_connect(m_timeHScale, "button-release-event", G_CALLBACK(timeScaleButtonReleased), this); m_hscaleUpdateId = g_signal_connect(m_timeHScale, "value-changed", G_CALLBACK(timeScaleValueChanged), this); gtk_box_pack_start(GTK_BOX(hbox), m_timeHScale, TRUE, TRUE, 0); m_timeLabel = gtk_label_new(""); gtk_box_pack_start(GTK_BOX(hbox), m_timeLabel, FALSE, TRUE, 0); // Volume button. m_volumeButton = gtk_volume_button_new(); gtk_box_pack_start(GTK_BOX(hbox), m_volumeButton, FALSE, TRUE, 0); gtk_scale_button_set_value(GTK_SCALE_BUTTON(m_volumeButton), m_player->volume()); m_volumeUpdateId = g_signal_connect(m_volumeButton, "value-changed", G_CALLBACK(volumeValueChanged), this); m_exitFullscreenAction = gtk_action_new("exit", _("Exit Fullscreen"), _("Exit from fullscreen mode"), EXIT_FULLSCREEN_ICON_NAME); m_exitFullcreenActionActivateSignalId = g_signal_connect(m_exitFullscreenAction, "activate", G_CALLBACK(exitFullscreenActivated), this); g_object_set(m_exitFullscreenAction, "icon-name", EXIT_FULLSCREEN_ICON_NAME, NULL); item = gtk_action_create_tool_item(m_exitFullscreenAction); gtk_box_pack_start(GTK_BOX(hbox), item, FALSE, TRUE, 0); m_progressBarUpdateId = g_timeout_add(PROGRESS_BAR_UPDATE_INTERVAL, reinterpret_cast<GSourceFunc>(progressBarUpdateCallback), this); playStateChanged(); }
gboolean set_widgets_defaults(GtkWidget *mvbox, track_t *t, GdkRGBA *color) { GtkWidget *hbox, *vbox, *label, *hbox2, *sep, *button, *img, *eventBox; gint i = 0; GdkRGBA buttonNormal = {1, 1, 1, 0.2}; GdkRGBA buttonSelected = {1, 1, 1, 0.6}; hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 10); gtk_box_pack_start(GTK_BOX(mvbox), hbox, 0, 0, 1); /* album image */ eventBox = gtk_event_box_new(); gtk_event_box_set_visible_window(GTK_EVENT_BOX(eventBox), 0); gtk_widget_set_events(eventBox, GDK_BUTTON_PRESS_MASK); t->trackw.image = gtk_image_new(); gtk_container_add(GTK_CONTAINER(eventBox), t->trackw.image); g_signal_connect(eventBox, "button_press_event", G_CALLBACK(show_player_callback), NULL); gtk_box_pack_start(GTK_BOX(hbox), eventBox, 0, 0, 0); /* track info: name, artist, album */ vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); gtk_box_pack_start(GTK_BOX(hbox), vbox, 0, 0, 0); t->trackw.label.name = gtk_label_new(NULL); gtk_misc_set_alignment(GTK_MISC(t->trackw.label.name), 0, 0); /* create the layout to be able to scrol the label's contents */ t->trackw.layout.name = gtk_layout_new(NULL, NULL); /* set size otherwise it won't show up */ gtk_widget_set_size_request(t->trackw.layout.name, SCROLL_SIZE_W, SCROLL_SIZE_H); /* make layout's color the same as the window's */ gtk_widget_override_background_color(t->trackw.layout.name, GTK_STATE_FLAG_NORMAL, color); gtk_layout_put(GTK_LAYOUT(t->trackw.layout.name), t->trackw.label.name, 0, 0); t->trackw.label.artist = gtk_label_new(NULL); gtk_misc_set_alignment(GTK_MISC(t->trackw.label.artist), 0, 0); t->trackw.layout.artist = gtk_layout_new(NULL, NULL); gtk_widget_set_size_request(t->trackw.layout.artist, SCROLL_SIZE_W-23, SCROLL_SIZE_H); gtk_widget_override_background_color(t->trackw.layout.artist, GTK_STATE_FLAG_NORMAL, color); gtk_layout_put(GTK_LAYOUT(t->trackw.layout.artist), t->trackw.label.artist, 0, 0); t->trackw.label.album = gtk_label_new(NULL); gtk_misc_set_alignment(GTK_MISC(t->trackw.label.album), 0, 0); t->trackw.layout.album = gtk_layout_new(NULL, NULL); gtk_widget_set_size_request(t->trackw.layout.album, SCROLL_SIZE_W-40, SCROLL_SIZE_H); gtk_widget_override_background_color(t->trackw.layout.album, GTK_STATE_FLAG_NORMAL, color); gtk_layout_put(GTK_LAYOUT(t->trackw.layout.album), t->trackw.label.album, 0, 0); /* put the name, artist and album at their places */ gtk_box_pack_start(GTK_BOX(vbox), t->trackw.layout.name, 0, 0, 0); hbox2 = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox2, 0, 0, 0); label = gtk_label_new(NULL); gtk_misc_set_alignment(GTK_MISC(label), 0, 0); gtk_label_set_markup(GTK_LABEL(label), "<span font='Sans 11' font_style='italic'" "color='#FFFFFF'>by </span>"); gtk_box_pack_start(GTK_BOX(hbox2), label, 0, 0, 0); gtk_box_pack_start(GTK_BOX(hbox2), t->trackw.layout.artist, 0, 0, 0); hbox2 = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox2, 0, 0, 0); label = gtk_label_new(NULL); gtk_misc_set_alignment(GTK_MISC(label), 0, 0); gtk_label_set_markup(GTK_LABEL(label), "<span font='Sans 11' font_style='italic'" "color='#FFFFFF'>from </span>"); gtk_box_pack_start(GTK_BOX(hbox2), label, 0, 0, 0); gtk_box_pack_start(GTK_BOX(hbox2), t->trackw.layout.album, 0, 0, 0); /* puts the genre, rating, year, and playcount */ hbox2 = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox2, 0, 0, 0); t->trackw.genre = gtk_label_new(NULL); gtk_misc_set_alignment(GTK_MISC(t->trackw.genre), 0, 0); gtk_box_pack_start(GTK_BOX(hbox2), t->trackw.genre, 0, 0, 0); sep = gtk_separator_new(GTK_ORIENTATION_VERTICAL); gtk_box_pack_start(GTK_BOX(hbox2), sep, 0, 0, 3); for (i = 0; i < 5; i++) { t->trackw.stars[i] = gtk_image_new(); gtk_box_pack_start(GTK_BOX(hbox2), t->trackw.stars[i], 0, 0, 1); } sep = gtk_separator_new(GTK_ORIENTATION_VERTICAL); gtk_box_pack_start(GTK_BOX(hbox2), sep, 0, 0, 3); t->trackw.year = gtk_label_new(NULL); gtk_misc_set_alignment(GTK_MISC(t->trackw.year), 0, 0); gtk_box_pack_start(GTK_BOX(hbox2), t->trackw.year, 0, 0, 0); sep = gtk_separator_new(GTK_ORIENTATION_VERTICAL); gtk_box_pack_start(GTK_BOX(hbox2), sep, 0, 0, 3); t->trackw.playcount = gtk_label_new(NULL); gtk_misc_set_alignment(GTK_MISC(t->trackw.playcount), 0, 0); gtk_box_pack_start(GTK_BOX(hbox2), t->trackw.playcount, 0, 0, 0); /* puts the current position, the slider showing the progress * and track length */ hbox2 = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox2, 0, 0, 0); t->trackw.position = gtk_label_new(NULL); gtk_misc_set_alignment(GTK_MISC(t->trackw.position), 0, 0); gtk_box_pack_start(GTK_BOX(hbox2), t->trackw.position, 0, 0, 0); t->trackw.slider = gtk_scale_new(GTK_ORIENTATION_HORIZONTAL, NULL); gtk_widget_set_size_request(t->trackw.slider, 170, -1); gtk_scale_set_draw_value(GTK_SCALE(t->trackw.slider), 0); gtk_range_set_show_fill_level(GTK_RANGE(t->trackw.slider), 1); gtk_range_set_restrict_to_fill_level(GTK_RANGE(t->trackw.slider), 0); /*g_signal_connect(t->trackw.slider, "value-changed", G_CALLBACK(slider_value_changed), NULL);*/ gtk_box_pack_start(GTK_BOX(hbox2), t->trackw.slider, 0, 0, 0); t->trackw.length = gtk_label_new(NULL); gtk_misc_set_alignment(GTK_MISC(t->trackw.length), 0, 0); gtk_box_pack_start(GTK_BOX(hbox2), t->trackw.length, 0, 0, 0); /* the player controls */ hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 5); gtk_box_pack_start(GTK_BOX(mvbox), hbox, 0, 0, 0); img = gtk_image_new_from_pixbuf(gdk_pixbuf_new_from_xpm_data(prev_xpm)); button = gtk_button_new(); gtk_widget_override_background_color(button, GTK_STATE_FLAG_NORMAL, &buttonNormal); gtk_widget_override_background_color(button, GTK_STATE_FLAG_ACTIVE, &buttonSelected); gtk_container_add(GTK_CONTAINER(button), img); g_signal_connect(button, "clicked", G_CALLBACK(button_callback), GINT_TO_POINTER(BUTTON_PREV)); gtk_box_pack_start(GTK_BOX(hbox), button, 0, 0, 0); t->playerControls.playPause = gtk_image_new(); button = gtk_button_new(); gtk_widget_override_background_color(button, GTK_STATE_FLAG_NORMAL, &buttonNormal); gtk_widget_override_background_color(button, GTK_STATE_FLAG_ACTIVE, &buttonSelected); gtk_container_add(GTK_CONTAINER(button), t->playerControls.playPause); g_signal_connect(button, "clicked", G_CALLBACK(button_callback), GINT_TO_POINTER(BUTTON_PLAY_PAUSE)); gtk_box_pack_start(GTK_BOX(hbox), button, 0, 0, 0); img = gtk_image_new_from_pixbuf(gdk_pixbuf_new_from_xpm_data(next_xpm)); button = gtk_button_new(); gtk_widget_override_background_color(button, GTK_STATE_FLAG_NORMAL, &buttonNormal); gtk_widget_override_background_color(button, GTK_STATE_FLAG_ACTIVE, &buttonSelected); gtk_container_add(GTK_CONTAINER(button), img); g_signal_connect(button, "clicked", G_CALLBACK(button_callback), GINT_TO_POINTER(BUTTON_NEXT)); gtk_box_pack_start(GTK_BOX(hbox), button, 0, 0, 0); sep = gtk_separator_new(GTK_ORIENTATION_VERTICAL); gtk_box_pack_start(GTK_BOX(hbox), sep, 0, 0, 2); t->playerControls.repeat = gtk_image_new(); button = gtk_button_new(); gtk_widget_override_background_color(button, GTK_STATE_FLAG_NORMAL, &buttonNormal); gtk_widget_override_background_color(button, GTK_STATE_FLAG_ACTIVE, &buttonSelected); gtk_container_add(GTK_CONTAINER(button), t->playerControls.repeat); g_signal_connect(button, "clicked", G_CALLBACK(button_callback), GINT_TO_POINTER(BUTTON_REPEAT)); gtk_box_pack_start(GTK_BOX(hbox), button, 0, 0, 0); t->playerControls.shuffle = gtk_image_new(); button = gtk_button_new(); gtk_widget_override_background_color(button, GTK_STATE_FLAG_NORMAL, &buttonNormal); gtk_widget_override_background_color(button, GTK_STATE_FLAG_ACTIVE, &buttonSelected); gtk_container_add(GTK_CONTAINER(button), t->playerControls.shuffle); g_signal_connect(button, "clicked", G_CALLBACK(button_callback), GINT_TO_POINTER(BUTTON_SHUFFLE)); gtk_box_pack_start(GTK_BOX(hbox), button, 0, 0, 0); return TRUE; }
// Основная функция построения класса, в которой происходит заполнение окна виджетами. void cMainWin::Create() { // Создаём объект, если ранее он был не создан или был уничтожен. if(mbIsCreated) return; // Общие виджеты. Будут использованы несколько раз. GtkWidget *awHBox; // Горизонтальный бокс. GtkWidget *awVBox; // Вертикальный бокс. GtkWidget *awLabel; // Заголовок. GtkWidget *awFrame; // Фрейм для виджетов. GtkWidget *awMenuBar; // Виджет для основного меню. GtkWidget *awSubmenu; // Подменю. GtkWidget *awMenuitem; // Пункт основного меню. GtkWidget *awSubMenuitem; // Пункт подменю. GtkWidget *awOpenFileButton; // Кнопка открытия файла. GtkWidget *awAdditionButton; // Кнопка доп. настроек. GtkWidget *awConvertButton; // Кнопка конвертации. // Настраиваем виджет главного окна. mwWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_default_size ((GtkWindow *)mwWindow, 800, 400); // Задаём размер. gtk_window_move((GtkWindow *)mwWindow, 50, 50); // Перемещаем окно. gtk_window_set_title((GtkWindow *)mwWindow, msTitle.c_str()); // Задаём имя. // Устанавливаем обработчик события уничтожения окна. g_signal_connect( G_OBJECT(mwWindow), "delete_event", G_CALLBACK(gtk_main_quit), this); // Создаём новый вертикальный бокс и забиваем его в основное окно. mwMainBox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); gtk_container_add((GtkContainer *)mwWindow, mwMainBox); // Создаём новый виджет основного меню. awMenuBar = gtk_menu_bar_new (); gtk_box_pack_start (GTK_BOX (mwMainBox), awMenuBar, FALSE, TRUE, 0); // Забиваем меню в главный бокс. // Создаём новый пункт меню Справка и заполняем его подменю. awMenuitem = gtk_menu_item_new_with_label ("Справка"); awSubmenu = gtk_menu_new(); // Добавляем в подменю новый пункт. awSubMenuitem = gtk_menu_item_new_with_label ("О программе"); gtk_menu_shell_append (GTK_MENU_SHELL (awSubmenu), awSubMenuitem); // Не забываем связать этот пункт с подменю. // Устанавливаем обработчик нажатия на пункт подменю. g_signal_connect(awSubMenuitem, "activate", G_CALLBACK(OnAbout), this); gtk_menu_item_set_submenu (GTK_MENU_ITEM (awMenuitem), awSubmenu); // Связываем подменю с главным. gtk_menu_shell_append (GTK_MENU_SHELL (awMenuBar), awMenuitem); // И добавляем пунтк меню в главное меню. // Добавляем в главный бокс разделитель виджетов(простая длинная линия). gtk_box_pack_start (GTK_BOX (mwMainBox), gtk_separator_new(GTK_ORIENTATION_HORIZONTAL), FALSE, TRUE, 5); // Задаём вертикальный бокс для первого пункта процесса конвертации и забиваем его в главный бокс. awVBox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); gtk_box_pack_start(GTK_BOX(mwMainBox), awVBox, FALSE, FALSE, 1); // Задаём горизонтальный бокс для первого пункта процесса конвертации и забиваем его в предыдущий вертикальный бокс. awHBox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); gtk_box_pack_start(GTK_BOX(awVBox), awHBox, FALSE, FALSE, 1); // Задаём виджет для отображения текста и добавляем в горизонтальный бокс. awLabel = gtk_label_new ("1."); //gtk_widget_set_halign (awLabel, GTK_ALIGN_START); // Выравнивание. Не нужно, если использовать горизонтальный бокс. gtk_box_pack_start(GTK_BOX(awHBox), awLabel, FALSE, FALSE, 5); // Создаём кнопку Открыть файл и добавляем в горизонтальный бокс. awOpenFileButton = gtk_button_new_with_label ("Открыть файл"); gtk_box_pack_start(GTK_BOX(awHBox), awOpenFileButton, FALSE, FALSE, 10); // Устанавливаем обработчик нажатия на кнопку Открыть файл. g_signal_connect(awOpenFileButton, "clicked", G_CALLBACK(OnOpenFile), this); // Создаём бокс для списка всех записей и добавляем в горизонтальный бокс. mwTrackNameBox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); gtk_box_pack_start(GTK_BOX(awHBox), mwTrackNameBox, FALSE, FALSE, 5); // Переходим ко второму пункту меню // Задаём вертикальный бокс для второго пункта процесса конвертации и забиваем его в главный бокс. awVBox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); gtk_box_pack_start(GTK_BOX(mwMainBox), awVBox, FALSE, FALSE, 10); // Задаём горизонтальный бокс для второго пункта процесса конвертации и забиваем его в предыдущий вертикальный бокс. awHBox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); gtk_box_pack_start(GTK_BOX(awVBox), awHBox, FALSE, FALSE, 1); // Задаём виджет для отображения текста и добавляем в горизонтальный бокс. awLabel = gtk_label_new ("2. "); gtk_box_pack_start(GTK_BOX(awHBox), awLabel, FALSE, FALSE, 5); // Создаём комбо бокс для выбора формата конвертации. mwFormat = gtk_combo_box_text_new (); for(int i = eFormat_MP3; i < eFormat_Unknown; i++) { // Для каждого пункта из enum добавляем пункт в комбо боксе со своим текстом из asFormat. gtk_combo_box_text_insert_text ((GtkComboBoxText *)mwFormat, -1, asFormat[i].c_str()); } gtk_combo_box_set_active((GtkComboBox *)mwFormat, 0); // Устанавливаем активный элемент на первый в списке. // Задаём обработчик события смены формата. g_signal_connect (mwFormat, "changed", G_CALLBACK (OnChangeFormat), this); gtk_box_pack_start(GTK_BOX(awHBox), mwFormat, FALSE, FALSE, 5); // Добавляем комбо бокс в горизонтальный бокс. // Теперь настроим виджеты, которые будут соответствовать формату конвертации из комбо бокса. // Виджеты, соответствующие формату, будут показываться, только при выборе этого формата в комбо боксе. // Задаём горизонтальный бокс для настроек под определённый формат и добавляем его в вертикальный бокс. awHBox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); gtk_box_pack_start(GTK_BOX(awVBox), awHBox, FALSE, FALSE, 10); // Настроим MP3 виджеты. // Задаём слайдер качества с определённым количеством меток. mMP3Widgets.mwQuality = gtk_scale_new_with_range (GTK_ORIENTATION_HORIZONTAL, 0, eMP3Quality_count-1, 1); gtk_scale_set_draw_value ((GtkScale *)mMP3Widgets.mwQuality, FALSE); // Не будем рисовать текущее значение. // Добавим метки на шкалу слайдера для визуализации. for(int i = 0; i < eMP3Quality_count; i++) { std::string asQ = asMP3Quality[i] +"kbps"; // Значения мток берём из asMP3Quality массива. gtk_scale_add_mark ((GtkScale *)mMP3Widgets.mwQuality, i, GTK_POS_TOP, asQ.c_str()); } gtk_box_pack_start(GTK_BOX(awHBox), mMP3Widgets.mwQuality, TRUE, TRUE, 30); // Добавляем слайдер в горизонтальный бокс. gtk_range_set_show_fill_level ((GtkRange *)mMP3Widgets.mwQuality, TRUE); // Заполняем слайдер другим цветом. gtk_range_set_restrict_to_fill_level ((GtkRange *)mMP3Widgets.mwQuality, TRUE); // Устанавливаем указатель слайдера до уровня заполнения слайдера. gtk_range_set_fill_level ((GtkRange *)mMP3Widgets.mwQuality, eMP3Quality_count-1); // Полностью заполняем слайдер цветом. gtk_range_set_value ((GtkRange *)mMP3Widgets.mwQuality, eMP3Quality_count-1); // Ставим значение слайдера на последнее из массива значений. // Указатель теперь связан с уровнем заполнения, но указатель всё ещё можно двигать, не меняя уровень заполнения. // Для этого необходимо ввести 2 обработчика событий - изменение значение слайдера и изменение границ указателя, для перемещения уровня заполнения. g_signal_connect (mMP3Widgets.mwQuality, "value-changed", G_CALLBACK (OnQualityChanged), this); g_signal_connect (mMP3Widgets.mwQuality, "adjust-bounds", G_CALLBACK (OnAdjustBoundsQuality), this); gtk_widget_show(mMP3Widgets.mwQuality); // Показываем виджеты страницы MP3 конвертера. // Настраиваем OGG виджеты. // Задаём слайдер качества с определённым количеством меток. mOGGWidgets.mwQuality = gtk_scale_new_with_range (GTK_ORIENTATION_HORIZONTAL, 0, eOGGQuality_count-1, 1); gtk_scale_set_draw_value ((GtkScale *)mOGGWidgets.mwQuality, FALSE); // Добавим метки на шкалу слайдера для визуализации. for(int i = 0; i < eOGGQuality_count; i++) { std::string asQ = asOGGQuality[i] +"kbps"; // Значения мток берём из asOGGQuality массива. gtk_scale_add_mark ((GtkScale *)mOGGWidgets.mwQuality, i, GTK_POS_TOP, asQ.c_str()); } gtk_box_pack_start(GTK_BOX(awHBox), mOGGWidgets.mwQuality, TRUE, TRUE, 30); // Добавляем слайдер в горизонтальный бокс. gtk_range_set_show_fill_level ((GtkRange *)mOGGWidgets.mwQuality, TRUE); // Заполняем слайдер другим цветом. gtk_range_set_restrict_to_fill_level ((GtkRange *)mOGGWidgets.mwQuality, TRUE); // Устанавливаем указатель слайдера до уровня заполнения слайдера. gtk_range_set_fill_level ((GtkRange *)mOGGWidgets.mwQuality, eOGGQuality_count-1); // Полностью заполняем слайдер цветом. gtk_range_set_value ((GtkRange *)mOGGWidgets.mwQuality, eOGGQuality_count-1); // Ставим значение слайдера на последнее из массива значений. // Снова вводим 2 обработчика событий, один на изменение значения слайдера и друго для изменения границ указателя, для перемещения уровня заполнения. g_signal_connect (mOGGWidgets.mwQuality, "value-changed", G_CALLBACK (OnQualityChanged), this); g_signal_connect (mOGGWidgets.mwQuality, "adjust-bounds", G_CALLBACK (OnAdjustBoundsQuality), this); // Добавим новую кнопку Дополнительно для отображения дополнительных параметров и добавим его в горизонтальный бокс. awAdditionButton = gtk_button_new_with_label ("Дополнительно"); gtk_box_pack_end(GTK_BOX(awHBox), awAdditionButton, FALSE, FALSE, 30); // Введём обработчик нажатия на кнопку Дополнительно. g_signal_connect(awAdditionButton, "clicked", G_CALLBACK(OnShowAdditionalSettings), this); // Переходим к третьему пункту меню. // Задаём вертикальный бокс для третьего пункта процесса конвертации и забиваем его в главный бокс. awVBox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); gtk_box_pack_start(GTK_BOX(mwMainBox), awVBox, FALSE, FALSE, 1); // Задаём горизонтальный бокс для третьего пункта процесса конвертации и забиваем его в предыдущий вертикальный бокс. awHBox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); gtk_box_pack_start(GTK_BOX(awVBox), awHBox, FALSE, FALSE, 10); // Задаём виджет для отображения текста и добавляем в горизонтальный бокс. awLabel = gtk_label_new ("3."); gtk_box_pack_start(GTK_BOX(awHBox), awLabel, FALSE, FALSE, 5); // Добавим кнопку Конвертировать - для начала процесса конвертации ваших аудио файлов. Добавим кнопку в горизонтальный бокс. awConvertButton = gtk_button_new_with_label ("Конвертировать"); gtk_box_pack_start(GTK_BOX(awHBox), awConvertButton, FALSE, FALSE, 10); // Создадим спиннер для визуального отображения процесса конвертации. // Это просто необходимо, т.к. программа как бы подвисает, из-за того что мы конвертируем в одном потоке с программой. // Серъёзно нагружает процессор =( mwSpinner = gtk_spinner_new (); gtk_box_pack_start(GTK_BOX(awHBox), mwSpinner, FALSE, FALSE, 5); // Обработчик события нажатие на кнопку Конвертация. g_signal_connect(awConvertButton, "clicked", G_CALLBACK(OnConvert), this); gtk_widget_show_all (mwWindow); // Покажем все виджеты в окне. gtk_widget_hide(mOGGWidgets.mwQuality); // Скроем виджеты со страницы OGG. По умолчанию отображаем конвертацию в MP3. gtk_widget_hide(mwSpinner); // Скроем спиннер, т.к. мы хотим его показать только в момент конвертации файлов. mbIsCreated = true; // Объект создан. }
int main (int argc, char *argv[]) { GtkWidget *window; GtkWidget *box; GtkWidget *box1; GtkWidget *box2; GtkWidget *button; GtkWidget *frame; GtkWidget *scale; const gchar *labels[3] = { "<small>Left</small>", "<small>Middle</small>", "<small>Right</small>" }; gdouble bath_marks[4] = { 0.0, 33.3, 66.6, 100.0 }; const gchar *bath_labels[4] = { "<span color='blue' size='small'>Cold</span>", "<span size='small'>Baby bath</span>", "<span size='small'>Hot tub</span>", "<span color='Red' size='small'>Hot</span>" }; gdouble pos_marks[4] = { 0.0, 33.3, 66.6, 100.0 }; const gchar *pos_labels[4] = { "Left", "Right", "Top", "Bottom" }; gtk_init (&argc, &argv); window = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_window_set_title (GTK_WINDOW (window), "Ranges with marks"); box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5); flipbox = box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5); gtk_widget_set_hexpand (flipbox, TRUE); gtk_widget_set_vexpand (flipbox, TRUE); gtk_container_add (GTK_CONTAINER (box1), box); gtk_container_add (GTK_CONTAINER (window), box1); frame = gtk_frame_new ("No marks"); scale = gtk_scale_new_with_range (GTK_ORIENTATION_HORIZONTAL, 0, 100, 1); scales = g_slist_prepend (scales, scale); gtk_scale_set_draw_value (GTK_SCALE (scale), FALSE); gtk_container_add (GTK_CONTAINER (frame), scale); gtk_box_pack_start (GTK_BOX (box), frame, FALSE, FALSE, 0); frame = gtk_frame_new ("With fill level"); scale = gtk_scale_new_with_range (GTK_ORIENTATION_HORIZONTAL, 0, 100, 1); scales = g_slist_prepend (scales, scale); gtk_scale_set_draw_value (GTK_SCALE (scale), FALSE); gtk_range_set_show_fill_level (GTK_RANGE (scale), TRUE); gtk_range_set_fill_level (GTK_RANGE (scale), 50); gtk_container_add (GTK_CONTAINER (frame), scale); gtk_box_pack_start (GTK_BOX (box), frame, FALSE, FALSE, 0); frame = gtk_frame_new ("Simple marks"); extra_scale = scale = gtk_scale_new_with_range (GTK_ORIENTATION_HORIZONTAL, 0, 100, 1); scales = g_slist_prepend (scales, scale); gtk_scale_set_draw_value (GTK_SCALE (scale), FALSE); gtk_scale_add_mark (GTK_SCALE (scale), marks[0], GTK_POS_BOTTOM, NULL); gtk_scale_add_mark (GTK_SCALE (scale), marks[1], GTK_POS_BOTTOM, NULL); gtk_scale_add_mark (GTK_SCALE (scale), marks[2], GTK_POS_BOTTOM, NULL); gtk_container_add (GTK_CONTAINER (frame), scale); gtk_box_pack_start (GTK_BOX (box), frame, FALSE, FALSE, 0); frame = gtk_frame_new ("Simple marks up"); scale = gtk_scale_new_with_range (GTK_ORIENTATION_HORIZONTAL, 0, 100, 1); scales = g_slist_prepend (scales, scale); gtk_scale_set_draw_value (GTK_SCALE (scale), FALSE); gtk_scale_add_mark (GTK_SCALE (scale), marks[0], GTK_POS_TOP, NULL); gtk_scale_add_mark (GTK_SCALE (scale), marks[1], GTK_POS_TOP, NULL); gtk_scale_add_mark (GTK_SCALE (scale), marks[2], GTK_POS_TOP, NULL); gtk_container_add (GTK_CONTAINER (frame), scale); gtk_box_pack_start (GTK_BOX (box), frame, FALSE, FALSE, 0); frame = gtk_frame_new ("Labeled marks"); box2 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6); scale = gtk_scale_new_with_range (GTK_ORIENTATION_HORIZONTAL, 0, 100, 1); scales = g_slist_prepend (scales, scale); gtk_scale_set_draw_value (GTK_SCALE (scale), FALSE); gtk_scale_add_mark (GTK_SCALE (scale), marks[0], GTK_POS_BOTTOM, labels[0]); gtk_scale_add_mark (GTK_SCALE (scale), marks[1], GTK_POS_BOTTOM, labels[1]); gtk_scale_add_mark (GTK_SCALE (scale), marks[2], GTK_POS_BOTTOM, labels[2]); gtk_container_add (GTK_CONTAINER (frame), scale); gtk_box_pack_start (GTK_BOX (box), frame, FALSE, FALSE, 0); frame = gtk_frame_new ("Some labels"); scale = gtk_scale_new_with_range (GTK_ORIENTATION_HORIZONTAL, 0, 100, 1); scales = g_slist_prepend (scales, scale); gtk_scale_set_draw_value (GTK_SCALE (scale), FALSE); gtk_scale_add_mark (GTK_SCALE (scale), marks[0], GTK_POS_TOP, labels[0]); gtk_scale_add_mark (GTK_SCALE (scale), marks[1], GTK_POS_TOP, NULL); gtk_scale_add_mark (GTK_SCALE (scale), marks[2], GTK_POS_TOP, labels[2]); gtk_container_add (GTK_CONTAINER (frame), scale); gtk_box_pack_start (GTK_BOX (box), frame, FALSE, FALSE, 0); frame = gtk_frame_new ("Above and below"); scale = gtk_scale_new_with_range (GTK_ORIENTATION_HORIZONTAL, 0, 100, 1); scales = g_slist_prepend (scales, scale); gtk_scale_set_draw_value (GTK_SCALE (scale), FALSE); gtk_scale_add_mark (GTK_SCALE (scale), bath_marks[0], GTK_POS_TOP, bath_labels[0]); gtk_scale_add_mark (GTK_SCALE (scale), bath_marks[1], GTK_POS_BOTTOM, bath_labels[1]); gtk_scale_add_mark (GTK_SCALE (scale), bath_marks[2], GTK_POS_BOTTOM, bath_labels[2]); gtk_scale_add_mark (GTK_SCALE (scale), bath_marks[3], GTK_POS_TOP, bath_labels[3]); gtk_container_add (GTK_CONTAINER (frame), scale); gtk_box_pack_start (GTK_BOX (box), frame, FALSE, FALSE, 0); frame = gtk_frame_new ("Positions"); scale = gtk_scale_new_with_range (GTK_ORIENTATION_HORIZONTAL, 0, 100, 1); scales = g_slist_prepend (scales, scale); gtk_scale_set_draw_value (GTK_SCALE (scale), FALSE); gtk_scale_add_mark (GTK_SCALE (scale), pos_marks[0], GTK_POS_LEFT, pos_labels[0]); gtk_scale_add_mark (GTK_SCALE (scale), pos_marks[1], GTK_POS_RIGHT, pos_labels[1]); gtk_scale_add_mark (GTK_SCALE (scale), pos_marks[2], GTK_POS_TOP, pos_labels[2]); gtk_scale_add_mark (GTK_SCALE (scale), pos_marks[3], GTK_POS_BOTTOM, pos_labels[3]); gtk_container_add (GTK_CONTAINER (frame), scale); gtk_box_pack_start (GTK_BOX (box), frame, FALSE, FALSE, 0); box2 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6); gtk_container_add (GTK_CONTAINER (box1), box2); button = gtk_button_new_with_label ("Flip"); g_signal_connect (button, "clicked", G_CALLBACK (flip), NULL); gtk_container_add (GTK_CONTAINER (box2), button); button = gtk_button_new_with_label ("Invert"); g_signal_connect (button, "clicked", G_CALLBACK (invert), NULL); gtk_container_add (GTK_CONTAINER (box2), button); button = gtk_toggle_button_new_with_label ("Trough"); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE); g_signal_connect (button, "toggled", G_CALLBACK (trough), NULL); gtk_container_add (GTK_CONTAINER (box2), button); gtk_widget_show_all (window); button = gtk_toggle_button_new_with_label ("Extra"); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), FALSE); g_signal_connect (button, "toggled", G_CALLBACK (extra), NULL); gtk_container_add (GTK_CONTAINER (box2), button); gtk_widget_show_all (window); gtk_main (); return 0; }
osso_return_t execute(osso_context_t *osso, gpointer data, gboolean user_activated) { /* Create needed variables */ GtkWidget *dialog; GtkObject *adj[NUM_BANDS]; struct label_band *lband[NUM_BANDS]; struct dialog_and_sliders *dialog_slid; GtkWidget *slider_band[NUM_BANDS]; GtkWidget *single_slider_container[NUM_BANDS]; gulong update_label_signal[NUM_BANDS]; gulong update_band_signal[NUM_BANDS]; GtkWidget *sliders_container; gint i; GtkWidget *toolbar; GtkToolItem *toolitem_open; GtkToolItem *toolitem_save_as; GtkToolItem *toolitem_delete; GtkWidget *content_area; guint update_slider_signal; dialog = gtk_dialog_new(); gtk_window_set_modal(GTK_WINDOW(dialog), TRUE); gtk_window_set_transient_for(GTK_WINDOW(dialog), GTK_WINDOW(data)); gtk_window_set_title(GTK_WINDOW(dialog), "MAFW Equalizer"); gtk_window_set_default_size(GTK_WINDOW(dialog), -1, 400); sliders_container = gtk_hbox_new(TRUE, 10); toolbar = gtk_toolbar_new(); /* Create the bands */ for (i = 0; i < NUM_BANDS; i++) { slider_band[i] = hildon_gtk_vscale_new(); adj[i] = gtk_adjustment_new(EQ_GAIN_MIN, EQ_GAIN_MIN, EQ_GAIN_MAX, 1, 10, 0); gtk_range_set_adjustment(GTK_RANGE(slider_band[i]), GTK_ADJUSTMENT(adj[i])); gtk_range_set_inverted(GTK_RANGE(slider_band[i]), TRUE); gtk_range_set_update_policy(GTK_RANGE(slider_band[i]), GTK_UPDATE_DELAYED); gtk_range_set_show_fill_level(GTK_RANGE(slider_band[i]), FALSE); single_slider_container[i] = gtk_hbox_new(TRUE, 0); lband[i] = g_new0(struct label_band, 1); lband[i]->label = gtk_label_new(NULL); lband[i]->id = i; gtk_label_set_angle(GTK_LABEL(lband[i]->label), 90); gtk_misc_set_alignment(GTK_MISC(lband[i]->label), 0, 0.9); gtk_box_pack_start(GTK_BOX(single_slider_container[i]), lband[i]->label, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(single_slider_container[i]), slider_band[i], TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(sliders_container), single_slider_container[i], TRUE, TRUE, 10); update_label_signal[i] = g_signal_connect(slider_band[i], "value-changed", G_CALLBACK(update_label_cb), lband[i]); gtk_range_set_value(GTK_RANGE(slider_band[i]), get_band_value(i)); update_band_signal[i] = g_signal_connect(slider_band[i], "value-changed", G_CALLBACK(update_band_cb), GINT_TO_POINTER(i)); } /* Listen for changes in gconf */ if (!confclient) { confclient = gconf_client_get_default(); } gconf_client_add_dir(confclient, GCONF_MAFW_GST_EQ_RENDERER, GCONF_CLIENT_PRELOAD_ONELEVEL, NULL); update_slider_signal = gconf_client_notify_add( confclient, GCONF_MAFW_GST_EQ_RENDERER, (GConfClientNotifyFunc) update_slider_cb, slider_band, NULL, NULL); /* Create the toolbuttons */ toolitem_open = gtk_tool_button_new_from_stock(GTK_STOCK_OPEN); toolitem_save_as = gtk_tool_button_new_from_stock(GTK_STOCK_SAVE_AS); toolitem_delete = gtk_tool_button_new_from_stock(GTK_STOCK_DELETE); gtk_toolbar_insert(GTK_TOOLBAR(toolbar), toolitem_open, -1); gtk_toolbar_insert(GTK_TOOLBAR(toolbar), toolitem_save_as, -1); gtk_toolbar_insert(GTK_TOOLBAR(toolbar), toolitem_delete, -1); g_signal_connect(toolitem_open, "clicked", G_CALLBACK(open_button_cb), dialog); g_signal_connect(toolitem_delete, "clicked", G_CALLBACK(delete_button_cb), dialog); dialog_slid = g_new0(struct dialog_and_sliders, 1); dialog_slid->dialog = dialog; dialog_slid->slider_band = slider_band; g_signal_connect(toolitem_save_as, "clicked", G_CALLBACK(save_as_button_cb), dialog_slid); content_area = gtk_dialog_get_content_area(GTK_DIALOG(dialog)); gtk_box_pack_start(GTK_BOX(content_area), sliders_container, TRUE, TRUE, 1); gtk_box_pack_start(GTK_BOX(content_area), toolbar, FALSE, FALSE, 1); /* Run the dialog */ gtk_widget_show_all(GTK_WIDGET(dialog)); gtk_dialog_run(GTK_DIALOG(dialog)); /* Free everything */ gconf_client_notify_remove(confclient, update_slider_signal); for (i = 0; i < NUM_BANDS; i++) { g_signal_handler_disconnect(slider_band[i], update_label_signal[i]); g_signal_handler_disconnect(slider_band[i], update_band_signal[i]); g_free(lband[i]); } g_free(dialog_slid); gtk_widget_destroy(GTK_WIDGET(dialog)); return OSSO_OK; }