martymarkenson of Ninjas
9/19/2017 - 3:54 PM

flipflop widget

No Description

.flipflopElement {
	display: block;
	height: 100%;
	width: 100%;
}

.flipflopWidget {
	margin: auto;
	width: 198px;
	height: 54px;
	border-radius: 5px;
	background-color: #DDDDDD;
	padding: 3px;
	opacity: 0.5;
}
function twxFlipflop() {
  return {
    elementTag: 'twx-flipflop',

    label: 'Flipflop',

    properties: [
      {
            name: 'class',
           label: 'Class',
        datatype: 'string',
         default: ''
      },
      {
            name: 'toggle',
           label: 'Toggle',
        datatype: 'boolean',
         default: false,
 isBindingTarget: true,
       showInput: true
      },
      {
            name: 'q',
           label: 'Q',
        datatype: 'boolean',
         default: false,
 isBindingSource: true,
 isBindingTarget: false,
       showInput: false
      },
      {
            name: 'qbar',
           label: 'Qbar',
        datatype: 'boolean',
         default: false,
 isBindingSource: true,
 isBindingTarget: false,
       showInput: false
      },
    ],

    services: [
      {
         name: 'clkq',
        label: 'Clock'
      },
      {
         name: 'setq',
        label: 'Set'
      },
      {
         name: 'resetq',
        label: 'Reset'
      }

    ],

    events: [
      {
         name: 'qclocked',
        label: 'Clk'
      },
    ],

    designTemplate: function () {
      return '<div class="flipflopWidget"></div>';
    },

    runtimeTemplate: function (props) {
      var tmpl = '<div ng-flipflop class="ng-hide flipflopWidget ' + props.class + '" delegate-field="delegate" toggle-field={{me.toggle}}></div>';
      return tmpl;
    }
  }
}

twxAppBuilder.widget('twxFlipflop', twxFlipflop);
if (typeof module !== 'undefined' && typeof exports !== 'undefined' && module.exports === exports) {
  module.exports = 'flipflop-ng';
}

(function () {
  'use strict';

  var flipflopModule = angular.module('flipflop-ng', []);
  flipflopModule.directive('ngFlipflop', ['$timeout', ngFlipflop]);

  function ngFlipflop($timeout) {

    return {
      restrict: 'EA',
      scope: {
        toggleField  : '@',
        delegateField: '='
      },
      template: '<div></div>',
      link: function (scope, element, attr) {

        var lastUpdated = 'unknown';
        scope.data = {    q: true, 
                       qbar: false, 
                     toggle: true
                     };
        
        var _setq = function(v) {
          scope.data.q = v;
          scope.data.qbar = !scope.data.q;

          scope.$parent.view.wdg[scope.$parent.widgetId]['q']    = scope.data.q;
          scope.$parent.view.wdg[scope.$parent.widgetId]['qbar'] = scope.data.qbar;
        }

        var clkq = function(){
          // toggle, and then propogate clock
          $timeout(function () {
            if (scope.data.toggle) 
            {
              _setq(!scope.data.q);
            }

            scope.$parent.fireEvent('qclocked');
          }, 1);

        };

        var setq = function() {
          // set and then propogate clock  
          $timeout(function () {
            _setq(true); 
            scope.$parent.fireEvent('qclocked');
          }, 1);
              
        }

        var resetq = function() {
          // reset, and then propogate clock  
          $timeout(function () {
            _setq(false);
            scope.$parent.fireEvent('qclocked');
          }, 1);
                
        }

        scope.$watch('toggleField', function () {
          scope.data.toggle = (scope.toggleField != undefined && scope.toggleField === 'true') ? true :false ;
        });

        scope.$watch('delegateField', function (delegate) {
          if (delegate) {
            delegate.clkq   = function () { clkq();   };
            delegate.setq   = function () { setq();   };
            delegate.resetq = function () { resetq(); };
          }
        });

      }
    };
  }

}());