You are here

image_desaturate_formatter.module in Image desaturate formatter 7

Code for the Image Desaturate Formatter module.

File

image_desaturate_formatter.module
View source
<?php

/**
 * @file
 * Code for the Image Desaturate Formatter module.
 */

/**
 * Implements hook_theme().
 */
function image_desaturate_formatter_theme() {
  return array(
    'image_desaturate_formatter' => array(
      'variables' => array(
        'item' => NULL,
        'image_style' => NULL,
        'image_style_desaturate' => NULL,
        'path' => NULL,
        'default_style' => 'desaturate',
      ),
    ),
  );
}

/**
 * Implements hook_field_formatter_info().
 */
function image_desaturate_formatter_field_formatter_info() {
  return array(
    'imagefield_desaturate' => array(
      'label' => t('Image desaturate'),
      'field types' => array(
        'image',
      ),
      'settings' => array(
        'image_style' => '',
        'image_link' => '',
        'default_style' => 'desaturate',
      ),
    ),
  );
}

/**
 * Implements hook_fiel_formatter_settings().
 */
function image_desaturate_formatter_field_formatter_settings_form($field, $instance, $view_mode, $form, &$form_state) {
  $display = $instance['display'][$view_mode];
  $settings = $display['settings'];
  $image_styles = image_style_options(FALSE);
  $element['image_style'] = array(
    '#title' => t('Image style'),
    '#type' => 'select',
    '#default_value' => $settings['image_style'],
    '#empty_option' => t('None (original image)'),
    '#options' => $image_styles,
  );
  $link_types = array(
    'content' => t('Content'),
    'file' => t('File'),
  );
  $element['image_link'] = array(
    '#title' => t('Link image to'),
    '#type' => 'select',
    '#default_value' => $settings['image_link'],
    '#empty_option' => t('Nothing'),
    '#options' => $link_types,
  );
  $element['default_style'] = array(
    '#title' => t('Default image style'),
    '#type' => 'select',
    '#options' => array(
      'desaturate' => t('Desaturate'),
      'default' => t('Default'),
    ),
    '#default_value' => $settings['default_style'],
  );
  return $element;
}

/**
 * Implements hook_field_formatter_summary().
 */
function image_desaturate_formatter_field_formatter_settings_summary($field, $instance, $view_mode) {
  $display = $instance['display'][$view_mode];
  $settings = $display['settings'];
  $summary = array();
  $image_styles = image_style_options(FALSE);

  // Unset possible 'No defined styles' option.
  unset($image_styles['']);

  // Styles could be lost because of enabled/disabled modules that defines
  // their styles in code.
  if (isset($image_styles[$settings['image_style']])) {
    $summary[] = t('Image style: @style', array(
      '@style' => $image_styles[$settings['image_style']],
    ));
  }
  else {
    $summary[] = t('Original image');
  }
  $link_types = array(
    'content' => t('Linked to content'),
    'file' => t('Linked to file'),
  );

  // Display this setting only if image is linked.
  if (isset($link_types[$settings['image_link']])) {
    $summary[] = $link_types[$settings['image_link']];
  }
  $default_style = array(
    'default' => t('Default image style'),
    'desaturate' => t('Desaturate image style'),
  );
  if (isset($default_style[$settings['default_style']])) {
    $summary[] = $default_style[$settings['default_style']];
  }
  return implode('<br />', $summary);
}

/**
 * Implements hook_field_formatter_view().
 */
function image_desaturate_formatter_field_formatter_view($entity_type, $entity, $field, $instance, $langcode, $items, $display) {
  $element = array();

  // Check if exists the desaturae image style related to the selected one.
  if (!image_style_load($display['settings']['image_style'] . '-desaturate')) {
    $normal_style = image_style_load($display['settings']['image_style']);
    $new_style = image_style_save(array(
      'name' => $display['settings']['image_style'] . '-desaturate',
    ));
    foreach ($normal_style['effects'] as $effect) {
      $new_effect = array(
        'name' => $effect['name'],
        'data' => $effect['data'],
        'isid' => $new_style['isid'],
        'weight' => $effect['weight'],
      );
      image_effect_save($new_effect);
    }
    $new_effect = array(
      'name' => 'image_desaturate',
      'data' => array(),
      'isid' => $new_style['isid'],
      'weight' => 1000,
    );
    image_effect_save($new_effect);
  }

  // Check if the formatter involves a link.
  if ($display['settings']['image_link'] == 'content') {
    $uri = entity_uri($entity_type, $entity);
  }
  elseif ($display['settings']['image_link'] == 'file') {
    $link_file = TRUE;
  }
  foreach ($items as $delta => $item) {
    if (isset($link_file)) {
      $uri = array(
        'path' => file_create_url($item['uri']),
        'options' => array(),
      );
    }
    $element[$delta] = array(
      '#theme' => 'image_desaturate_formatter',
      '#item' => $item,
      '#image_style' => $display['settings']['image_style'],
      '#image_style_desaturate' => $display['settings']['image_style'] . '-desaturate',
      '#path' => isset($uri) ? $uri : '',
      '#default_style' => $display['settings']['default_style'],
    );
  }
  return $element;
}

/**
 * Implements theme_image_desaturate
 */
function theme_image_desaturate_formatter($variables) {
  drupal_add_library('image_desaturate_formatter', 'image-desaturate-formatter');
  $variables['item']['attributes'] = array(
    'class' => 'image-default',
  );
  $image_color = theme('image_formatter', array(
    'item' => $variables['item'],
    'image_style' => $variables['default_style'] == 'default' ? $variables['image_style'] : $variables['image_style_desaturate'],
    'path' => $variables['path'],
  ));
  $variables['item']['attributes'] = array(
    'class' => 'image-hover',
  );
  $image_desaturate = theme('image_formatter', array(
    'item' => $variables['item'],
    'image_style' => $variables['default_style'] == 'desaturate' ? $variables['image_style'] : $variables['image_style_desaturate'],
    'path' => $variables['path'],
  ));
  $dimensions = array(
    'width' => $variables['item']['width'],
    'height' => $variables['item']['height'],
  );
  image_style_transform_dimensions($variables['image_style'], $dimensions);
  return '<div class="image-desaturate-formatter" style="width:' . $dimensions['width'] . 'px;height:' . $dimensions['height'] . 'px;">' . $image_color . $image_desaturate . '</div>';
}

/**
 * Implements hook_library().
 */
function image_desaturate_formatter_library() {
  $libraries['image-desaturate-formatter'] = array(
    'title' => 'Image desaturate Formatter',
    'version' => '1',
    'css' => array(
      drupal_get_path('module', 'image_desaturate_formatter') . '/library/image_desaturate_formatter.css' => array(),
    ),
  );
  return $libraries;
}