Web-Drafter update: Color Picker

My very tiny vector graphics application is improving at a snail pace.

I managed to make a colour picker using jQuery and the HTML range input element.

The code isn’t exactly succinct, but it gets the job done.

Because the program is growing larger, I’m trying to use the OOP facets of JavaScript and put the functions in their respective objects as much as possible, the loose functions in the posfunc.js file creates the dialog:

function color_selector_form(color) {
    frgb = color.get_fill_rgb();
    srgb = color.get_stroke_rgb();

    var red_slider = "<input class='fill_slider' id='red_slider' value="+frgb[0]+" type=\"range\" min=\"0\" max=\"255\"> <br> <div id='rfval' >"+frgb[0]+"</div><br> ";
    var green_slider = "<input class='fill_slider' id='green_slider' value="+frgb[1]+" type=\"range\" min=\"0\" max=\"255\"> <br> <div id='gfval' >"+frgb[1]+"</div><br>";
    var blue_slider = "<input class='fill_slider' id='blue_slider' value="+frgb[2]+" type=\"range\" min=\"0\" max=\"255\"> <br> <div id='bfval' >"+frgb[2]+"</div><br>";
    var fcbox = "<span id=\"fillbox\" style=\"background-color: "+color.fill+"; display: block; height: 50px; width: 50px;\">&nbsp</span>";

    var red_stroke_slider = "<input class='stroke_slider' id='red_stroke_slider' value="+srgb[0]+" type=\"range\" min=\"0\" max=\"255\"> <br> <div id='rsval' >"+srgb[0]+"</div><br> ";
    var green_stroke_slider = "<input class='stroke_slider' id='green_stroke_slider' value="+srgb[1]+" type=\"range\" min=\"0\" max=\"255\"> <br> <div id='gsval' >"+srgb[1]+"</div><br>";
    var blue_stroke_slider = "<input class='stroke_slider' id='blue_stroke_slider' value="+srgb[2]+" type=\"range\" min=\"0\" max=\"255\"> <br> <div id='bsval' >"+srgb[2]+"</div><br>";
    var scbox = "<span id=\"strokebox\" style=\"background-color: "+color.stroke+"; display: block; height: 50px; width: 50px;\">&nbsp</span>";

    var retval = "<table><tr><td>Fill<br><br>";
    retval += "Red: <br>" + red_slider + "Green: <br>" + green_slider + "Blue: <br>" + blue_slider + "<br>" + fcbox;
    retval += "</td><td>&nbsp&nbsp&nbsp</td><td>Stroke<br><br>";
    retval += "Red: <br>" + red_stroke_slider + "Green: <br>" + green_stroke_slider + "Blue: <br>" + blue_stroke_slider + "<br>" + scbox;
    retval += "</td></tr></table>";
    return retval;
}

While the pos.js has the $(document).ready() functions for the dynamically created elements:

jQuery(document).on("change mousemove", ".fill_slider", function() {
   selected_color.update_fill(jQuery(this).val(), jQuery(this).attr("id"));
   var id = jQuery(this).attr("id");
   //console.log(id + " " +jQuery(this).val());
   if(id.substring(1, 2) == "r") {
        jQuery("#red_val").html(jQuery(this).val());
       } else  if(id.substring(1, 2) == "g") {
           jQuery("#green_val").html(jQuery(this).val());
       } else  if(id.substring(1, 2) == "b") {
           jQuery("#blue_val").html(jQuery(this).val());
       }
   });

Which in turn calls the appropriate methods in the MyColor object.

MyColor.prototype.update_fill = function(colorval, id) {
    var hexredval = parseInt(colorval).toString(16);
    if(hexredval.length < 2)
        hexredval = "0" + hexredval;
    var channel = id.substring(0,1);
    if(channel == "r")
        this.fill = (this.fill.substring(0, 1) + hexredval.substring(0, 2) + this.fill.substring(3)).toUpperCase();
    else if(channel == "g")
        this.fill = (this.fill.substring(0, 3) + hexredval.substring(0, 2) + this.fill.substring(5)).toUpperCase();
    else if(channel == "b")
        this.fill = (this.fill.substring(0, 5) + hexredval.substring(0, 2)).toUpperCase();
    jQuery("#" + channel + "fval").html(colorval);
    jQuery("#fillbox").css("background-color", this.fill);
    update_color(this);
}

As you can see, the code isn’t really¬†DRY, but I find that making a clumsy solution is a great way to start a project and get anything done whatsoever, and then improve on it (or just keep it until it becomes cluttered).

Leave a Reply

Your email address will not be published. Required fields are marked *