--- ffmpeg_converter.module 2009-04-20 17:11:46.000000000 -0400 +++ ffmpeg_converter.module 2009-06-01 20:59:14.000000000 -0400 @@ -33,12 +33,22 @@ 'page callback' => 'drupal_get_form', 'page arguments' => array('ffmpeg_converter_admin_debug'), 'access arguments' => array('administer ffmpeg wrapper'), 'file' => 'ffmpeg_converter.admin.inc', ); + $items['admin/settings/ffmpeg_converter/delete/%'] = array( + 'title' => 'Delete Preset', + 'description' => t('Delete an ffmpeg converter preset.'), + 'page callback' => 'drupal_get_form', + 'page arguments' => array('ffmpeg_converter_admin_delete_confirm', 4), + 'access arguments' => array('administer ffmpeg wrapper'), + 'type' => MENU_CALLBACK, + 'file' => 'ffmpeg_converter.admin.inc', + ); + return $items; } /** * Implementation of hook_theme(). @@ -296,12 +306,21 @@ } } } } +function ffmpeg_converter_default_presets() { + return array( + 'default' => array( + 'name' => 'default', + 'process_same_format' => 0, + 'ffmpeg_wrapper' => ffmpeg_converter_default_options(), + ), + ); +} /** * Get the presets array. * * @param $key * This presets's key value. Optional. @@ -310,19 +329,13 @@ * If not, a nested array containing options for all presets. */ function ffmpeg_converter_options($key = null) { static $presets; if (!isset($presets)) { - $presets = variable_get('ffmpeg_converter_presets', array( - 'preset-1' => array( - 'name' => 'Default', - 'process_same_format' => 0, - 'ffmpeg_wrapper' => ffmpeg_converter_default_options(), - ), - )); + $presets = variable_get('ffmpeg_converter_presets', ffmpeg_converter_default_presets()); foreach ($presets as &$preset) { // Flatten the ffmpeg_wrapper array of options. $options = array(); foreach ($preset['ffmpeg_wrapper'] as $opt_key => $option) { if (is_array($option)) { $options = array_merge($options, $option); @@ -1167,12 +1180,13 @@ $format = $element['items'][0]['#formatter']; } else { $field = content_fields($element['#field_name']); $format = $field['display_settings']['full']['format']; } + $parts = explode('_', $format); $link_style = array_pop($parts); $presetname = implode('_', $parts); // Define where the image should link to. switch ($link_style) { --- ffmpeg_converter.admin.inc 2009-03-04 15:47:20.000000000 -0400 +++ ffmpeg_converter.admin.inc 2009-06-02 00:43:00.000000000 -0400 @@ -25,21 +25,22 @@ $form['ffmpeg_converter_presets']['#value'] .= ' ' . t('Third party modules may make this functionality available in their own specific contexts.'); $presets = ffmpeg_converter_options(); // Add a separate fieldset for each configuration. foreach ($presets as $key => $preset) { + $key = $preset['name']; $form['ffmpeg_converter_presets'][$key] = array( '#type' => 'fieldset', '#collapsible' => false, '#tree' => true ); $form['ffmpeg_converter_presets'][$key]['name'] = array( '#type' => 'textfield', '#title' => t('Preset name'), - '#description' => t('Use this field to rename the preset.'), + '#description' => t('A machine readable name for this preset. This name must contain only lowercase letters, numbers, dashes, and underscores.'), '#default_value' => $preset['name'], '#size' => 20, ); // Add FFmpeg Wrapper's configuration form. $form['ffmpeg_converter_presets'][$key] += ffmpeg_wrapper_configuration_form($preset['ffmpeg_wrapper'], "edit-ffmpeg-converter-presets-$key-ffmpeg-wrapper-"); @@ -50,35 +51,146 @@ $form['ffmpeg_converter_presets'][$key]['process_same_format'] = array( '#type' => 'checkbox', '#title' => t('Process files already in destination format'), '#description' => t('Choose this if you want to process files even if they are already in the chosen destination format.'), '#default_value' => $preset['process_same_format'], ); - $form['ffmpeg_converter_presets'][$key]['delete_preset'] = array( - '#type' => 'submit', - '#value' => t('Delete this preset') . ' (TODO)', - '#submit' => '', - ); - if (count($presets) < 2) { + + $form['ffmpeg_converter_presets'][$key]["delete_preset_{$key}"] = array( + '#type' => 'submit', + //buttons must have unique values so that $form_state['clicked_button'] is correct + '#value' => t('Delete ' . $preset['name'] . ' preset'), + '#submit' => array('ffmpeg_converter_admin_presets_delete_preset'), + '#preset_name' => $preset['name'], + ); + + $form['ffmpeg_converter_presets'][$key]["copy_preset_{$key}"] = array( + '#type' => 'submit', + '#value' => t('Copy ' . $preset['name'] . ' preset'), + '#submit' => array('ffmpeg_converter_admin_preset_copy'), + '#preset_name' => $preset['name'], + ); + + if (count($presets) < 2) { //Need at least 1 preset. $form['ffmpeg_converter_presets'][$key]['delete_preset']['#disabled'] = true; } - // TODO: delete this line once this button is implemented. - $form['ffmpeg_converter_presets'][$key]['delete_preset']['#disabled'] = true; } - $form['add_preset'] = array( + $form['buttons']['add_preset'] = array( '#type' => 'submit', - '#value' => t('Add new preset') . ' (TODO)', - '#submit' => '', + '#value' => t('Add new preset'), + '#submit' => array('ffmpeg_converter_admin_presets_add_preset'), + ); + + $form['buttons']['submit'] = array( + '#type' => 'submit', + '#value' => t('Save configuration'), + '#submit' => array('ffmpeg_converter_admin_presets_save_configuration'), + '#validate' => array('ffmpeg_converter_admin_presets_validate') ); - // TODO: delete this line once this button is implemented. - $form['add_preset']['#disabled'] = true; - - return system_settings_form($form); + + return $form; +} + +function ffmpeg_converter_admin_presets_add_preset($form, &$form_state) { + $presets = variable_get('ffmpeg_converter_presets', ffmpeg_converter_default_presets()); + + //generate a preset name that doesn't already exist + $n = count($presets) + 1; + while (isset($presets["preset-$n"])) { + $n++; + } + $preset_name = ($n == 1 ? 'default' : "preset-$n"); + + //give it the default options + $presets[$preset_name] = array( + 'name' => $preset_name, + 'process_same_format' => 0, + 'ffmpeg_wrapper' => ffmpeg_converter_default_options(), + ); + variable_set('ffmpeg_converter_presets', $presets); + drupal_set_message(t('Created preset %preset', array('%preset' => $preset_name))); +} + +function ffmpeg_converter_admin_presets_delete_preset($form, &$form_state) { + $preset_name = $form_state['clicked_button']['#preset_name']; + drupal_goto("admin/settings/ffmpeg_converter/delete/$preset_name"); +} + +function ffmpeg_converter_admin_preset_copy($form, &$form_state) { + $preset_name = $form_state['clicked_button']['#preset_name']; + + $presets = variable_get('ffmpeg_converter_presets', ffmpeg_converter_default_presets()); + + //Make sure we have a non-duplicate name for the preset copy name + $preset_copy_name = "$preset_name-copy"; + $n = 2; + while (isset($presets[$preset_copy_name])) { + $preset_copy_name = "$preset_copy_name-copy-$n"; + $n++; + } + + $presets[$preset_copy_name] = $presets[$preset_name]; + $presets[$preset_copy_name]['name'] = $preset_copy_name; + + variable_set('ffmpeg_converter_presets', $presets); + + drupal_set_message(t('Copied preset %preset. Copy is named %preset_copy', array('%preset' => $preset_name, '%preset_copy' => $preset_copy_name))); +} + +function ffmpeg_converter_admin_presets_save_configuration($form, &$form_state) { + $presets = $form_state['values']['ffmpeg_converter_presets']; + + //get rid of the unneeded button fields + unset($presets['add_preset'], $presets['op'], $presets['submit'], $presets['form_build_id'], $presets['form_token'], $presets['form_id']); + foreach ($presets as $key => $preset) { + unset($presets[$key]['delete_preset']); + } + + variable_set('ffmpeg_converter_presets', $presets); + drupal_set_message(t('Successfully saved configuration.')); +} + +function ffmpeg_converter_admin_presets_validate($form, &$form_state) { + + if (!isset($form_state['values']['ffmpeg_converter_presets'])) { + return; + } + + $preset_name_counts = array(); + foreach ($form_state['values']['ffmpeg_converter_presets'] as $key => $preset) { + $preset_name_counts[$preset['name']]++; + //Make sure the preset names are unique + if ($preset_name_counts[$preset['name']] > 1) { + form_error($form['ffmpeg_converter_presets'][$key]['name'], t('The preset name %preset is used more than once', array('%preset' => $preset['name']))); + } + //Make sure the name is machine readable + if (!preg_match('/^[a-z0-9_-]+$/', $preset['name'])) { + form_error($form['ffmpeg_converter_presets'][$key]['name'], t('The preset name %preset must contain only lowercase letters, numbers, dashes, and underscores.', array('%preset' => $preset['name']))); + } + } } +function ffmpeg_converter_admin_delete_confirm($form_state, $preset_name) { + $form = array(); + $form['preset_name'] = array('#type' => 'value', '#value' => $preset_name); + $confirmation_message = t('Are you sure you want to delete the preset %preset?', array('%preset' => $preset_name)); + $cancel_path = 'admin/settings/ffmpeg_converter'; + return confirm_form($form, $confirmation_message, $cancel_path); +} + +function ffmpeg_converter_admin_delete_confirm_submit($form, &$form_state) { + $preset_name = $form_state['values']['preset_name']; + $presets = variable_get('ffmpeg_converter_presets', array()); + unset($presets[$preset_name]); + variable_set('ffmpeg_converter_presets', $presets); + + drupal_set_message(t('Deleted the preset %preset.', array('%preset' => $preset_name))); + + $form_state['redirect'] = 'admin/settings/ffmpeg_converter'; +} /** * Page callback: debug settings form. */ function ffmpeg_converter_admin_debug() { $form = array();