]> git.parisson.com Git - telemeta.git/commitdiff
Added tabs (still to be fixed, especially didnt check cross-browser) and ok button...
authorriccardo <riccardo@parisson.com>
Wed, 23 Feb 2011 17:12:56 +0000 (18:12 +0100)
committerriccardo <riccardo@parisson.com>
Wed, 23 Feb 2011 17:12:56 +0000 (18:12 +0100)
telemeta/htdocs/css/telemeta.css
telemeta/htdocs/timeside/src/markermap.js
telemeta/templates/telemeta_default/mediaitem_detail.html

index f73b3663052f9fdbf0a7aa9a59a7a311b13dfa69..c4dbdd318a7861ff15dffafe7f3a17340eae0392 100644 (file)
@@ -107,7 +107,7 @@ a img { border: none; }
     -webkit-border-radius: 5px 5px 5px 5px;\r
     border-radius: 5px 5px 5px 5px;\r
 }\r
-#rightcol .analyzer, #rightcol .exporter {\r
+#rightcol .analyzer, #rightcol .exporter, .markers {\r
     text-align: left;\r
     position: relative;\r
 }\r
@@ -134,13 +134,13 @@ a img { border: none; }
     font-size: 1em;\r
 }\r
 \r
-.analyzer {\r
+.analyzer, .markers {\r
     background-color: #fff;\r
     color: #000;\r
     border: 1px solid #adadad;\r
     width: 356px;\r
     padding: 2px;\r
-    margin: 5px 0 0;\r
+    /*margin: 5px 0 0;*/\r
     font-size: 1em;\r
 }\r
 \r
@@ -751,10 +751,43 @@ a.image-link {
     padding: 1em;\r
 }\r
 \r
-/*.ts-marker-button {\r
-    border: solid #00190a 1px;\r
-    padding: .5ex .5ex .5ex .5ex;\r
-    background-color:#00890a;\r
-    color: #ffffff;\r
-    font-weight: bold;\r
-}*/\r
+/*\r
+code for tabs. See link http://www.sohtanaka.com/web-design/simple-tabs-w-css-jquery/\r
+There is also a plugin jQuery UI, but is heavy, hard to understand (compared to implementing it on my own)\r
+and heavy for the page (the re are tons of files to download and include in the page)\r
+Example usage:\r
+    <ul class="tabs">\r
+        <li><a href="#tab1">Gallery</a></li>\r
+        <li><a href="#tab2">Submit</a></li>\r
+    </ul>\r
+\r
+    <div class="tab_container">\r
+        <div id="tab1" class="tab_content">\r
+            <!--Content-->\r
+        </div>\r
+        <div id="tab2" class="tab_content">\r
+           <!--Content-->\r
+        </div>\r
+    </div>\r
+*/\r
+\r
+\r
+\r
+\r
+\r
+\r
+.tab_unselected {\r
+    background-color: #999999;\r
+    color: #666666;\r
+    border: 1px solid #999999;\r
+    z-index: 0;\r
+}\r
+.tab_selected {\r
+    background-color: #ffffff;\r
+    color: #000000;\r
+    border-top: 1px solid #999999;\r
+    border-right: 1px solid #999999;\r
+    border-left: 1px solid #999999;\r
+    border-bottom: 1px solid #ffffff;\r
+    z-index: 10;\r
+}\r
index c5daf04e61fb2f0c7481533995d8eb28dc7df194..e59671bfae623334ab88bfa2153be12b021ec1e2 100644 (file)
@@ -18,7 +18,7 @@ TimeSide(function($N, $J) {
             }
             this.markers = markers;
         },
-        //static variables to retireve the Marker Html Elements (MHE)
+        //static constant variables to retireve the Marker Html Elements (MHE)
         //to be used with the function below getHtmElm, eg:
         //getHtmElm(marker, this.MHE_OFFSET_LABEL)
         MHE_INDEX_LABEL:'indexLabel',
@@ -28,6 +28,11 @@ TimeSide(function($N, $J) {
         MHE_EDIT_BUTTON:'editButton',
         MHE_OK_BUTTON:'okButton',
         MHE_DELETE_BUTTON:'deleteButton',
+        //static constant variables for edit mode:
+        EDIT_MODE_SAVED:0,
+        EDIT_MODE_EDIT_TEXT:1,
+        EDIT_MODE_MARKER_MOVED:2,
+
         //function to retreve html elements in the edit div associated with marker:
         getHtmElm: function(marker, elementName){
             //return marker.div.children('[name="'+elementName+'"]');
@@ -35,14 +40,16 @@ TimeSide(function($N, $J) {
             return marker.div.find('*[name="'+elementName+'"]');
         },
 
-        toArray: function() {
-            return [].concat(this.markers);
-        },
-
-        byIndex: function(index) {
-            return this.markers[index];
-        },
+        //        toArray: function() {
+        //            return [].concat(this.markers);
+        //        },
+        //
+        //        byIndex: function(index) {
+        //            return this.markers[index];
+        //        },
+        //
 
+        //used by controller._onMarkerMove
         byId: function(id) {
             var marker = null;
             for (var i in this.markers) {
@@ -74,15 +81,12 @@ TimeSide(function($N, $J) {
                 desc: description,
                 isNew: true
             };
-            this.add(marker);
-            //fire the click event on the edit button (anchor)
-            var eB =
-            this.getHtmElm(marker, this.MHE_EDIT_BUTTON);
-            eB.trigger('click');
+            this.add(marker, this.EDIT_MODE_EDIT_TEXT);
         },
 
-        
-        add: function(marker) {
+            //editMode is optional, in case it defaults to
+         //EDIT_MODE_SAVED:0
+         add: function(marker, editMode) {
             var idx = this.insertionIndex(marker);
             //adding the div
             marker.div = this.createDiv(marker,idx);
@@ -102,6 +106,7 @@ TimeSide(function($N, $J) {
             });
             this.fireRefreshLabels(idx+1,this.markers.length);
             //this._reorder(marker.offset);
+            this.fireEditMode(marker,editMode);
             return marker;
         },
 
@@ -136,7 +141,7 @@ TimeSide(function($N, $J) {
             }
             var oldIndex = this.indexOf(marker);
             marker.offset = offset;
-            marker.offset = offset;
+            //marker.offset = offset;
             var newIndex = this.insertionIndex(marker);
             //change marker time
             //$($( marker.div.children()[0] ).children()[1]).html(this.formatMarkerOffset(offset));
@@ -145,9 +150,9 @@ TimeSide(function($N, $J) {
             if(newIndex>oldIndex){
                 newIndex--;
             }
-            //trigger the edit button in order to let appear the ok button to save the new offset
-            //must be done here because we might return in a moment
-            this.getHtmElm(marker, this.MHE_EDIT_BUTTON).trigger('click');
+            //fire edit mode
+            this.fireEditMode(marker, this.EDIT_MODE_MARKER_MOVED);
+
             if(newIndex==oldIndex){
                 return;
             }
@@ -166,7 +171,7 @@ TimeSide(function($N, $J) {
             //$($( marker.div.children()[1] )).focus();
 
             //this.getHtmElm(marker,this.MHE_DESCRIPTION_TEXT).focus();
-            this.getHtmElm(marker,this.MHE_DESCRIPTION_TEXT).select();
+            //this.getHtmElm(marker,this.MHE_DESCRIPTION_TEXT).select();
             var i1= Math.min(oldIndex,newIndex);
             var i2= Math.max(oldIndex,newIndex);
             //var mrks = this.markers;
@@ -218,7 +223,7 @@ TimeSide(function($N, $J) {
             var div = this.divContainer;
             var markerDiv;
             if(div){
-                var indexLabel, descriptionText, offsetLabel, closeButton, okbutton, header, editButton, descriptionLabel;
+                var indexLabel, descriptionText, offsetLabel, closeButton, okButton, header, editButton, descriptionLabel;
                 var margin = '1ex';
 
                 //index label
@@ -304,7 +309,7 @@ TimeSide(function($N, $J) {
                 });
             
                 //ok button
-                okbutton = $J('<a/>')
+                okButton = $J('<a/>')
                 .attr("name", this.MHE_OK_BUTTON)
                 .attr('title','save marker description and offset')
                 .css({
@@ -320,7 +325,7 @@ TimeSide(function($N, $J) {
                 markerDiv = $J('<div/>')
                 .append(header)
                 .append(descriptionText)
-                .append(okbutton)
+                .append(okButton)
                 .css({
                     paddingBottom:'1em',
                     paddingTop:'1ex',
@@ -331,33 +336,25 @@ TimeSide(function($N, $J) {
                 //ACTIONS TO BUTTONS:
                 ////first define this keyword inside functions
                 var klass = this;
+                //reference to fireEditMode
+                var func_fem = this.fireEditMode;
+                var editModeEditText = this.EDIT_MODE_EDIT_TEXT;
                 //action for edit
                 editButton.unbind('click').click( function(){
-                    marker.desc = descriptionText.val();
-                    editButton.hide('fast');
-                    descriptionText.show(400, function(){this.select();});
-                    descriptionLabel.hide(); //without arguments, otherwise alignement problems arise )in chrome)
-                    okbutton.show('fast');
+                   func_fem.apply(klass,[marker,editModeEditText,editButton, descriptionText,
+                        descriptionLabel, okButton]);
                 });
 
-                // ok button
-                //reference the send function (to be passed below):
-                var send = this.sendHTTP;
-                //reference to setLabelDescription
-                var sld = this.setLabelDescription;
-                //set the ok function
-                //we clear all the click event handlers from ok and assign a new one:
-                okbutton.unbind('click').click( function(){
-                    marker.desc = descriptionText.val();
-                    descriptionLabel.attr('title',marker.desc);
-                    editButton.show(); //we cannot show it fast because the sld function below needs
-                    //the edit button displayed to calculate the size. Without argument the editbutton
-                    //is shown immediately
-                    descriptionLabel.show(); //same as aboe: without arguments
-                    descriptionText.hide('fast');
-                    okbutton.hide('fast');
-                    send(marker);
-                    sld.apply(klass,[marker]);
+                //action for ok button
+                var editModeSaved = this.EDIT_MODE_SAVED;
+                var func_send = this.sendHTTP;
+                okButton.unbind('click').click( function(){
+                    if(marker.desc !== descriptionText.val()){ //strict equality needed. See note below
+                        marker.desc = descriptionText.val();
+                        func_send(marker);
+                    }
+                    func_fem.apply(klass,[marker,editModeSaved,editButton, descriptionText,
+                        descriptionLabel, okButton]);
                 });
 
                 //action for removing
@@ -382,6 +379,81 @@ TimeSide(function($N, $J) {
             return markerDiv;
         },
 
+        //sets the edit mode in the div associated to marker. Last 4 arguments are optional
+        fireEditMode: function(marker, editMode, editButton, descriptionText,
+            descriptionLabel, okButton){
+            var e = this.getHtmElm;
+            if(editButton == undefined){
+                editButton = e(marker,this.MHE_EDIT_BUTTON);
+            }
+            if(descriptionLabel == undefined){
+                descriptionLabel = e(marker,this.MHE_DESCRIPTION_LABEL);
+            }
+            if(descriptionText == undefined){
+                descriptionText = e(marker,this.MHE_DESCRIPTION_TEXT);
+            }
+            if(okButton == undefined){
+                okButton = e(marker,this.MHE_OK_BUTTON);
+            }
+            var speed = 400; //fast is 200 slow is 600 (see jQuery help)
+//            var func_fem = this.fireEditMode;
+//            var func_send = this.sendHTTP;
+            var klass = this;
+            //var editModeSaved = this.EDIT_MODE_SAVED;
+            if(editMode == this.EDIT_MODE_EDIT_TEXT){ //edit text
+                descriptionLabel.hide(); //without arguments, otherwise alignement problems arise (in chrome)
+                editButton.hide(speed);
+                descriptionText.show(speed, function(){
+                    this.select();
+                });
+                okButton.show(speed);
+
+//                okButton.unbind('click').click( function(){
+//                    if(marker.desc !== descriptionText.val()){ //strict equality needed. See note below
+//                        marker.desc = descriptionText.val();
+//                        func_send(marker);
+//                    }
+//                    func_fem.apply(klass,[marker,editModeSaved,editButton, descriptionText,
+//                        descriptionLabel, okButton]);
+//                });
+            }else if(editMode == this.EDIT_MODE_MARKER_MOVED){
+                editButton.show(speed, function(){
+                    descriptionLabel.show();
+                });
+                //if then a user types the edit button, this function is called with
+                //editMode=1 (this.EDIT_MODE_EDIT_TEXT). Which means (see okbutton click binding above) marker will be saved
+                //ONLY if text is different from marker.desc. However, as the offset has changed we want to
+                //save IN ANY CASE, so we set marker.desc undefined. This way, text will be always different and
+                //we will save the marker in any case
+                marker.desc = undefined;
+                descriptionText.hide(speed);
+                okButton.show(speed);
+//                okButton.unbind('click').click( function(){
+//                    func_send(marker);
+//                    func_fem.apply(klass,[marker,editModeSaved,editButton, descriptionText,
+//                        descriptionLabel, okButton]);
+//                });
+            }else if(editMode == this.EDIT_MODE_SAVED){
+                var function_sld = klass.setLabelDescription;
+                editButton.show(speed, function(){
+                    function_sld.apply(klass,[marker]);
+                    descriptionLabel.show();
+                });
+                descriptionText.hide(speed);
+                okButton.hide(speed);
+            }
+        },
+
+//        fireMarkerMoved: function(marker){
+//            marker.desc = descriptionText.val();
+//            editButton.hide('fast');
+//            descriptionText.show(400, function(){
+//                this.select();
+//            });
+//            descriptionLabel.hide(); //without arguments, otherwise alignement problems arise )in chrome)
+//            okbutton.show('fast');
+//        },
+
         setLabelDescription: function(marker){
             var mDiv = marker.div;
             var e = this.getHtmElm;
index 4f798e9609758a16d9e03e1b63ed431b46d2bbff..d20ea3a57a1335375680bb0b2c6c099add9a10da 100644 (file)
     load_player({{ item.approx_duration.as_seconds }});\r
 </script>\r
 \r
+<!-- script for tabs-->\r
+<script type="text/javascript">\r
+    //    $(document).ready(function() {\r
+    //\r
+    //        //When page loads...\r
+    //        $(".tab_content").hide(); //Hide all content\r
+    //        $("ul.tabs li:first").addClass("active").show(); //Activate first tab\r
+    //        $(".tab_content:first").show(); //Show first tab content\r
+    //\r
+    //        //On Click Event\r
+    //        $("ul.tabs li").click(function() {\r
+    //\r
+    //            $("ul.tabs li").removeClass("active"); //Remove any "active" class\r
+    //            $(this).addClass("active"); //Add "active" class to selected tab\r
+    //            $(".tab_content").hide(); //Hide all tab content\r
+    //\r
+    //            var activeTab = $(this).find("a").attr("href");\r
+    //            //Find the href attribute value to identify the active tab + content\r
+    //            $(activeTab).fadeIn(); //Fade in the active ID content\r
+    //            return false;\r
+    //        });\r
+    //\r
+    //    });\r
+        $(document).ready(function() {\r
+\r
+          //When page loads...\r
+            //$(".tab_content").hide(); //Hide all content\r
+\r
+            var h1 = '5ex';\r
+            var h2 = '4ex';\r
+            var w = '10ex';\r
+            var bottom='0px';\r
+\r
+            $("#tabs_container").css({'position':'relative','height':h1});\r
+\r
+            var tabs = $('a[class^="tab_"]');\r
+\r
+            tabs.css('position','absolute');\r
+            tabs.css('height',h2);\r
+            //tabs.css('zIndex','10');\r
+            tabs.css('top','1ex');\r
+            tabs.css('bottom',bottom);\r
+            tabs.css('width',w);\r
+            tabs.css('textAlign','center');\r
+            //tabs.css('backgroundColor','#ffffff');\r
+\r
+            var tabA = $(tabs[0]);\r
+            var tabM = $(tabs[1]);\r
+\r
+            tabM.css('left',w);\r
+\r
+            tabA.click(function() {\r
+                tabA.removeClass("tab_unselected").addClass("tab_selected");\r
+                tabM.removeClass("tab_selected").addClass("tab_unselected");\r
+                $("#"+tabA.attr("name")).show('fast');\r
+                $("#"+tabM.attr("name")).hide();\r
+\r
+            });\r
+\r
+            tabM.click(function() {\r
+                tabM.removeClass("tab_unselected").addClass("tab_selected");\r
+                tabA.removeClass("tab_selected").addClass("tab_unselected");\r
+                $("#"+tabM.attr("name")).show('fast');\r
+                $("#"+tabA.attr("name")).hide();\r
+\r
+            });\r
+\r
+            tabA.trigger("click");\r
+            \r
+//            $("ul.tabs li:first").addClass("active").show(); //Activate first tab\r
+//            $(".tab_content:first").show(); //Show first tab content\r
+//\r
+//            //On Click Event\r
+//            $("ul.tabs li").click(function() {\r
+//\r
+//                $("ul.tabs li").removeClass("active"); //Remove any "active" class\r
+//                $(this).addClass("active"); //Add "active" class to selected tab\r
+//                $(".tab_content").hide(); //Hide all tab content\r
+//\r
+//              var activeTab = $(this).find("a").attr("href");\r
+//              //Find the href attribute value to identify the active tab + content\r
+//              $(activeTab).fadeIn(); //Fade in the active ID content\r
+//               return false;\r
+//           });\r
+\r
+      });\r
+\r
+</script>\r
+\r
 {% endblock %}\r
 \r
 \r
 {% if item %}\r
 {% block submenu %}\r
 <div>\r
- <table>\r
-   <tr>\r
-    <td align="left">\r
-    <a href="{% url telemeta-item-dublincore item.public_id %}">Dublin Core</a>\r
-    </td>\r
-    <td align="right">\r
-    {% if user.is_authenticated and user.is_staff%} \r
-    <a href="{% url telemeta-item-detail-edit item.public_id %}"><img src="/images/edit_page.png" alt="EDIT"></a>\r
-    {% endif %}\r
-    <a href="{% url telemeta-item-detail previous %}"><img src="/images/previous.png" alt="PREVIOUS"></a>\r
-    <a href="{% url telemeta-item-detail next %}"><img src="/images/next.png" alt="NEXT"></a>\r
-    </td>\r
-   </tr>\r
- </table>\r
   <table>\r
+        <tr>\r
+            <td align="left">\r
+                <a href="{% url telemeta-item-dublincore item.public_id %}">Dublin Core</a>\r
+            </td>\r
+            <td align="right">\r
+                {% if user.is_authenticated and user.is_staff%}\r
+                <a href="{% url telemeta-item-detail-edit item.public_id %}"><img src="/images/edit_page.png" alt="EDIT"></a>\r
+                {% endif %}\r
+                <a href="{% url telemeta-item-detail previous %}"><img src="/images/previous.png" alt="PREVIOUS"></a>\r
+                <a href="{% url telemeta-item-detail next %}"><img src="/images/next.png" alt="NEXT"></a>\r
+            </td>\r
+        </tr>\r
   </table>\r
 </div>\r
 {% endblock %}\r
 \r
             </div>\r
         </div>\r
 \r
-        \r
-       \r
-            \r
-            <div class="item_visualization" id="item_visualization_id">\r
-                <form id="visualizer_id_form" method="get" action="#">\r
-                    <!--\r
-                    <select name="visualizer_id" onchange="this.form.submit()">\r
-                        {% for v in visualizers %}\r
-                        <option value="{{ v.id }}" {% ifequal v.id visualizer_id %} selected="selected" {% endifequal %}>\r
-                        {{v.name}}</option>\r
-                        {% endfor %}\r
-                    </select>\r
-                    -->\r
-                    &nbsp;Visualization :\r
-                    <select id="visualizer_id" name="visualizer_id">\r
-                        {% for v in visualizers %}\r
-                        <option value="{% url telemeta-item-visualize item.public_id,v.id,"WIDTH","HEIGHT" %}">\r
-                                {{v.name}}</option>\r
+\r
+\r
+\r
+        <div class="item_visualization" id="item_visualization_id">\r
+            <form id="visualizer_id_form" method="get" action="#">\r
+                <!--\r
+                <select name="visualizer_id" onchange="this.form.submit()">\r
+                    {% for v in visualizers %}\r
+                    <option value="{{ v.id }}" {% ifequal v.id visualizer_id %} selected="selected" {% endifequal %}>\r
+                    {{v.name}}</option>\r
+                    {% endfor %}\r
+                </select>\r
+                -->\r
+                &nbsp;Visualization :\r
+                <select id="visualizer_id" name="visualizer_id">\r
+                    {% for v in visualizers %}\r
+                    <option value="{% url telemeta-item-visualize item.public_id,v.id,"WIDTH","HEIGHT" %}">\r
+                            {{v.name}}</option>\r
+                    {% endfor %}\r
+                </select>\r
+                <input type="submit" value="Set" />\r
+            </form>\r
+\r
+\r
+            <!--\r
+                    <form method="get" action="#">\r
+                        <p>&nbsp;Vamp plugin analysis</p>\r
+                        <select name="vamp_id">\r
+                        {% for plugin in vamp_plugins %}\r
+                        <option value="{{ plugin }}" {% ifequal plugin vamp_id %} selected="selected" {% endifequal %}>\r
+                        {{ plugin }}</option>\r
                         {% endfor %}\r
-                    </select>\r
-                    <input type="submit" value="Set" />\r
-                </form>\r
+                        </select>\r
+                        <input type="submit" value="Get" />\r
+                    </form>\r
+            -->\r
+        </div>\r
+\r
+        <div id="tabs_container">\r
+            <!--            <ul class="tabs_" >\r
+                            <li><a href="#">Analysis</a></li>\r
+                            <li><a href="#">Markers</a></li>\r
+                        </ul>-->\r
+            <a class="tab_analysis" name ="analyzer_div_id" href="#">Analysis</a>\r
+            <a class="tab_markers" name="markers_div_id" href="#">Markers</a>\r
+            </div>\r
+            <!--<div class="tab_container_">-->\r
+                <!--        <div id="tab1" class="tab_content">\r
+                            Content\r
+                        </div>\r
+                        <div id="tab2" class="tab_content">\r
+                           Content\r
+                        </div>\r
+                    </div>-->\r
+                <div class="markers" id="markers_div_id"></div>\r
 \r
-                <div class="markers_div" id="markers_div_id"></div>\r
-                \r
-                <div class="analyzer">\r
+                <div class="analyzer" id="analyzer_div_id">\r
                     <table width="100%">\r
                         <tr class="analyzer-title">\r
                             <td>Property</td>\r
                         {% endfor %}\r
                     </table>\r
                 </div>\r
-\r
-                \r
-                <!--\r
-                        <form method="get" action="#">\r
-                            <p>&nbsp;Vamp plugin analysis</p>\r
-                            <select name="vamp_id">\r
-                            {% for plugin in vamp_plugins %}\r
-                            <option value="{{ plugin }}" {% ifequal plugin vamp_id %} selected="selected" {% endifequal %}>\r
-                            {{ plugin }}</option>\r
-                            {% endfor %}\r
-                            </select>\r
-                            <input type="submit" value="Get" />\r
-                        </form>\r
-                -->\r
-            </div>\r
+            <!--</div>-->\r
         \r
+\r
         {% if audio_export_enabled %}\r
         <div class="exporter">\r
             <p>{% trans "Download:" %}\r