From 3e42efbf6377add245000b3d4b6a70a34ddc7b6d Mon Sep 17 00:00:00 2001
From: Bruno Massa <brmassa@67164.no-reply.drupal.org>
Date: Wed, 13 May 2009 22:54:57 +0000
Subject: [PATCH] Improvements: * The new color system is now enabled. Well,
 the input part only. Now its time to actually use this color in the charts! *
 Note take Charts module might use ColorPicker module to enhance the
 experience. But its now required.

---
 charts.admin.inc | 120 +++++++++++---------------
 charts.inc       |  13 +--
 charts_color.js  | 217 ++++-------------------------------------------
 3 files changed, 73 insertions(+), 277 deletions(-)

diff --git a/charts.admin.inc b/charts.admin.inc
index 7cc0605..b9070ec 100644
--- a/charts.admin.inc
+++ b/charts.admin.inc
@@ -12,59 +12,57 @@
  *
  * @ingroup from
  */
-function _charts_color_form(&$form, $settings) {
-  // The Color module integration starts with a field set
+function _charts_color_form_complete(&$form, $default) {
+  // Use ColorPicker module if possible
+  $field_type = module_exists('colorpicker') ? 'colorpicker_textfield' : 'textfield';
+
   $form['color'] = array(
-    '#attributes'     => array('id' => 'charts_color', 'class' => ' clear-block'),
-    '#collapsible'    => TRUE,
     '#type'           => 'fieldset',
-    '#theme'          => 'charts_settings_color',
     '#title'          => t('Color'),
+    '#tree'           => TRUE
   );
-
-  // Load some color palettes
-  $form['color']['scheme'] = array(
+  $form['color']['color_palettes'] = array(
     '#type'           => 'select',
-    '#title'          => t('Color set'),
-    '#options'        => $settings['#color_palettes'],
-    '#default_value'  => $settings['#color_palette'],
+    '#title'          => t('Color palettes'),
+    '#options'        => $default['color_palettes'],
+    '#default_value'  => $default['color_palette'],
   );
-
-  // Add palette fields. Since all
-  $color_palette = explode(',', $settings['#color_palette']);
-
-  $names = array(
-    t('Color %number', array('%number' => 1)),
-    t('Color %number', array('%number' => 2)),
-    t('Color %number', array('%number' => 3)),
-    t('Color %number', array('%number' => 4)),
-    t('Color %number', array('%number' => 5)),
-    t('Color %number', array('%number' => 6)),
-    t('Color %number', array('%number' => 7)),
-    t('Color %number', array('%number' => 8)),
+  $form['color']['background'] = array(
+    '#type'           => $field_type,
+    '#title'          => t('Background'),
+    '#default_value'  => $default['color']['background'],
+//     '#colorpicker'    => 'colorpicker',
   );
-  $form['color']['palette'] = array(
-    '#prefix'           => '<div id="preview"></div><div id="farbtastic"></div><div id="palette" class="clear-block">',
-    '#suffix'           => '</div>',
-    '#tree'             => TRUE,
+  $form['color']['text'] = array(
+    '#type'           => $field_type,
+    '#title'          => t('Text'),
+    '#default_value'  => $default['color']['text'],
   );
-  foreach ($names as $color => $value) {
-    $form['color']['palette']['color'. $color] = array(
-      '#type'           => 'textfield',
-      '#title'          => $value,
-      '#default_value'  => empty($color_palette[$color]) ? '336699' : $color_palette[$color],
-      '#size'           => 8,
+  for ($series = 0; $series < 8; $series++) {
+    $form['color'][$series] = array(
+      '#type'           => $field_type,
+      '#title'          => t('Series %serie', array('%serie' => $series + 1)),
+      '#default_value'  => $default['color'][$series],
     );
-    $color_palette['color'. $color] = $color_palette[$color];
-    unset($color_palette[$color]);
   }
-  $form['color']['farbtastic'] = array(
-    '#prefix'          => '<div id="farbtastic">',
-    '#sufix'           => '</div>',
-  );
 
-  // Add the necessary JS data into the page
-  drupal_add_js(array('charts_color' => array('reference' => $color_palette)), 'setting');
+  drupal_add_js(drupal_get_path('module', 'charts') .'/charts_color.js');
+  drupal_add_js(array('chartsColorCustom' => t('Custom')), 'setting');
+}
+
+/**
+ * Subform that use simple color inputs.
+ *
+ * @ingroup from
+ */
+function _charts_color_form_simple(&$form, $settings) {
+  // Load some color palettes
+  $form['color_palettes'] = array(
+    '#type'           => 'select',
+    '#title'          => t('Color palettes'),
+    '#options'        => $settings['color_palettes'],
+    '#default_value'  => $settings['color_palette'],
+  );
 }
 
 /**
@@ -129,13 +127,14 @@ function _charts_module_invoke_all() {
  *
  * @ingroup form
  */
-function _charts_settings_form(&$form, $default = array(), $example = FALSE, $color_full = FALSE, $use_default = FALSE) {
+function _charts_settings_form(&$form, $default = array(), $options = array()) {
   module_load_include('inc', 'charts');
   $default = $default + _charts_settings();
+  $options = array_fill_keys($options, TRUE);
 
-  if ($example) {
+  if (!empty($options['example'])) {
     $form['chart_example'] = array(
-      '#value'          => _charts_example(),
+      '#value'          => _charts_example($default),
     );
   }
 
@@ -170,16 +169,11 @@ function _charts_settings_form(&$form, $default = array(), $example = FALSE, $co
     '#title'          => t('Height'),
   );
 
-  if ($color_full) {
-    _charts_color_form($form, $default);
+  if (empty($options['color_complete'])) {
+    _charts_color_form_simple($form, $default);
   }
   else {
-    $form['color_palette'] = array(
-      '#type'           => 'select',
-      '#title'          => t('Color set'),
-      '#options'        => $default['color_palettes'],
-      '#default_value'  => $default['color_palette'],
-    );
+    _charts_color_form_complete($form, $default);
   }
 
   return $form;
@@ -193,7 +187,7 @@ function _charts_settings_form(&$form, $default = array(), $example = FALSE, $co
  */
 function _charts_settings_page() {
   $form = array();
-  _charts_settings_form($form, array(), TRUE, TRUE);
+  _charts_settings_form($form, array(), array('example', 'color_complete'));
 
   $form['submit'] = array(
     '#type'           => 'submit',
@@ -229,21 +223,3 @@ function _charts_settings_page_submit(&$form, &$form_state) {
   // Save the data into database
   variable_set('charts_settings', $settings);
 }
-
-/**
- * Theme color form.
- *
- * @ingroup @themeable
- */
-function theme_charts_settings_color($form) {
-  // Add Farbtastic color picker JS
-  drupal_add_css('misc/farbtastic/farbtastic.css', 'module', 'all', FALSE);
-  drupal_add_js('misc/farbtastic/farbtastic.js');
-  drupal_add_js(drupal_get_path('module', 'charts') .'/charts_color.js');
-
-  // Add the necessary CSS
-  drupal_add_css(drupal_get_path('module', 'charts') .'/charts_color.css');
-
-  // Preview and the rest of the form
-  return '<div id="preview"></div>'. drupal_render($form);
-}
diff --git a/charts.inc b/charts.inc
index 909d8fa..4734b51 100644
--- a/charts.inc
+++ b/charts.inc
@@ -116,8 +116,13 @@ function _charts_settings() {
     // Color Palette
     $settings['color_palettes'] = _charts_settings_color_palette();
     if (empty($settings['color_palette'])) {
-      $settings['color_palette'] = '0,0,0,0,0,0,0,0';
+      $settings['color_palette'] = current(array_keys($settings['color_palettes']));
     }
+
+    // Color
+    $settings['color'] = explode( ',', $settings['color_palette']);
+    $settings['color']['background'] = array_shift($settings['color']);
+    $settings['color']['text']       = array_shift($settings['color']);
   }
 
   return $settings;
@@ -128,10 +133,8 @@ function _charts_settings() {
  */
 function _charts_settings_color_palette() {
   return array(
+    '#ffffff,#000000,#ff0000,#00cc00,#0066b3,#ff8000,#ffcc00,#330099,#990099,#ccff00' => t('Primary'),
+    '#ffffff,#000000,#ff6600,#009999,#1919b3,#ffb200,#ffff00,#660099,#e60066,#33ff00' => t('Secondary'),
     '' => t('Custom'),
-    '#ff0000,#00cc00,#0066b3,#ff8000,#ffcc00,#330099,#990099,#ccff00' => t('Primary'),
-    '#ff6600,#009999,#1919b3,#ffb200,#ffff00,#660099,#e60066,#33ff00' => t('Secondary'),
-//     'ff0000,00cc00,0066b3,ff8000,ffcc00,330099,990099,ccff00' => t('Primary'),
-//     'ff6600,009999,1919b3,ffb200,ffff00,660099,e60066,33ff00' => t('Secondary'),
   );
 }
diff --git a/charts_color.js b/charts_color.js
index b2937c5..22cb2a2 100644
--- a/charts_color.js
+++ b/charts_color.js
@@ -2,213 +2,30 @@
 /**
  * @author Bruno Massa http://drupal.org/user/67164
  * @file
- * Its the integration with Color module and Charts.
- * Using the Farbtastic JS, this file set the behavior of the
+ * Set the color palette to Charts.
  */
-Drupal.behaviors.charts_color = function (context) {
-  /**
-    * Function copied from Color module.
-    *
-    * Callback for Farbtastic when a new color is chosen.
-    */
-  callback = function (input, color, propagate, colorscheme) {
-    // Set background/foreground color
-    $(input).css({
-      backgroundColor: color,
-      'color': farb.RGBToHSL(farb.unpack(color))[2] > 0.5 ? '#000' : '#fff'
-    });
-
-    // Change input value
-    if (input.value && input.value != color) {
-      input.value = color;
-
-      // Update locked values
-      if (propagate) {
-        var i = input.i;
-        for (j = i + 1; ; ++j) {
-          if (!locks[j - 1] || $(locks[j - 1]).is('.unlocked')) break;
-          var matched = shift_color(color, reference[input.key], reference[inputs[j].key]);
-          callback(inputs[j], matched, false);
-        }
-        for (j = i - 1; ; --j) {
-          if (!locks[j] || $(locks[j]).is('.unlocked')) break;
-          var matched = shift_color(color, reference[input.key], reference[inputs[j].key]);
-          callback(inputs[j], matched, false);
-        }
-
-        // Update preview
-        preview();
-      }
-
-      // Reset colorscheme selector
-      if (!colorscheme) {
-        resetScheme();
-      }
-    }
-  }
-
-  /**
-    * Function copied from Color module.
-    *
-    * Focus the Farbtastic on a particular field.
-    */
-  focus = function () {
-    var input = this;
-    // Remove old bindings
-    focused && $(focused).unbind('keyup', farb.updateValue)
-        .unbind('keyup', preview).unbind('keyup', resetScheme)
-        .parent().removeClass('item-selected');
-
-    // Add new bindings
-    focused = this;
-    farb.linkTo(function (color) { callback(input, color, true, false); });
-    farb.setColor(this.value);
-    $(focused).keyup(farb.updateValue).keyup(preview).keyup(resetScheme)
-      .parent().addClass('item-selected');
-  }
-
-  /**
-  * Print a Chart (with generic data) preview.
-  */
-  preview = function () {
-  }
-
-  /**
-    * Function copied from Color module.
-    *
-    * Reset the color scheme selector.
-    */
-  resetScheme = function () {
-    $('#edit-scheme', form).each(function () {
-      this.selectedIndex = this.options.length - 1;
-    });
-  }
-
-  /**
-    * Function copied from Color module
-    *
-    * Shift a given color, using a reference pair (ref in HSL).
-    */
-  shift_color = function (given, ref1, ref2) {
-    // Convert to HSL
-    given = farb.RGBToHSL(farb.unpack(given));
-
-    // Hue: apply delta
-    given[0] += ref2[0] - ref1[0];
-
-    // Saturation: interpolate
-    if (ref1[1] == 0 || ref2[1] == 0) {
-      given[1] = ref2[1];
-    }
-    else {
-      var d = ref1[1] / ref2[1];
-      if (d > 1) {
-        given[1] /= d;
+Drupal.behaviors.chartsColor = function (context) {
+  var chartsColor = function() {
+    var colors = $("#edit-color-color-palettes").val().split(",");
+    var series = ["background", "text", 0, 1, 2, 3, 4, 5, 6, 7];
+    var disabled = ($("#edit-color-palettes").children("option:selected").text() == Drupal.settings.chartsColorCustom);
+    for (var s = 0, len = series.length; s < len; ++s) {
+      $("#edit-color-"+ s).val(colors[s]);
+      if (disabled) {
+        $("#edit-color-"+ s).attr("disabled", "");
       }
       else {
-        given[1] = 1 - (1 - given[1]) * d;
+        $("#edit-color-"+ s).attr("disabled", "disabled");
       }
     }
-
-    // Luminance: interpolate
-    if (ref1[2] == 0 || ref2[2] == 0) {
-      given[2] = ref2[2];
+    if (disabled) {
+      $("#edit-colorpicker").attr("disabled", "");
     }
     else {
-      var d = ref1[2] / ref2[2];
-      if (d > 1) {
-        given[2] /= d;
-      }
-      else {
-        given[2] = 1 - (1 - given[2]) * d;
-      }
+      $("#edit-colorpicker").attr("disabled", "disabled");
     }
+  };
 
-    return farb.pack(farb.HSLToRGB(given));
-  }
-
-  // Declaring some variavles and settings some generic values
-  var inputs = [];
-  var hooks = [];
-  var locks = [];
-  var focused = null;
-
-  // Determine what is the main charts color piece of
-  var form = $('#charts_color', context);
-
-  // Add Farbtastic
-  var farb = $.farbtastic('#farbtastic');
-
-  // Decode reference colors to HSL
-  var reference = Drupal.settings.charts_color.reference;
-  for (i in reference) {
-    reference[i] = farb.RGBToHSL(farb.unpack(reference[i]));
-  }
-
-  // Set up colorscheme selector
-  $('#edit-scheme', form).change(function () {
-    var colors = this.options[this.selectedIndex].value;
-    if (colors != '') {
-      colors = colors.split(',');
-      for (i in colors) {
-        callback(inputs[i], colors[i], false, true);
-      }
-      preview();
-    }
-  });
-
-  // Initialize color fields
-  $('#palette input.form-text', form)
-  .each(function () {
-    // Extract palette field name
-    this.key = this.id.substring(13);
-
-    // Link to color picker temporarily to initialize.
-    farb.linkTo(function () {}).setColor('#000').linkTo(this);
-
-    // Add lock
-    var i = inputs.length;
-    if (inputs.length) {
-      var lock = $('<div class="lock"></div>').toggle(
-        function () {
-          $(this).addClass('unlocked');
-          $(hooks[i - 1]).attr('class',
-            locks[i - 2] && $(locks[i - 2]).is(':not(.unlocked)') ? 'hook up' : 'hook'
-          );
-          $(hooks[i]).attr('class',
-            locks[i] && $(locks[i]).is(':not(.unlocked)') ? 'hook down' : 'hook'
-          );
-        },
-        function () {
-          $(this).removeClass('unlocked');
-          $(hooks[i - 1]).attr('class',
-            locks[i - 2] && $(locks[i - 2]).is(':not(.unlocked)') ? 'hook both' : 'hook down'
-          );
-          $(hooks[i]).attr('class',
-            locks[i] && $(locks[i]).is(':not(.unlocked)') ? 'hook both' : 'hook up'
-          );
-        }
-      );
-      $(this).after(lock);
-      locks.push(lock);
-    };
-
-    // Add hook
-    var hook = $('<div class="hook"></div>');
-    $(this).after(hook);
-    hooks.push(hook);
-
-    $(this).parent().find('.lock').click();
-    this.i = i;
-    inputs.push(this);
-  })
-  .focus(focus);
-
-  $('#palette label', form);
-
-  // Focus first color
-  focus.call(inputs[0]);
-
-  // Render preview
-  preview();
+  $("#edit-color-color-palettes").change(chartsColor);
+  chartsColor();
 };
-- 
GitLab