From 282168079e8cdfc66c62f60e27bc2af744ee6dc3 Mon Sep 17 00:00:00 2001 From: Aleksandar Vidakovic Date: Thu, 5 Feb 2015 23:45:12 +0000 Subject: [PATCH] Rewrite as AngularJs app --- gadget/images/logo.png | Bin 1271 -> 6757 bytes gadget/index.html | 26 ++++- gadget/scripts/wakatime.js | 205 +++++++++++++++++++++++-------------- gadget/styles/wakatime.css | 4 - gadget/wakatime.xml | 5 +- gulpfile.js | 2 +- public/wakatime.xml | 2 + 7 files changed, 157 insertions(+), 87 deletions(-) diff --git a/gadget/images/logo.png b/gadget/images/logo.png index 4d40eacb8e15a684378c90c99bfaee5dcefaf320..aeabc26fa29bd827effa18c881596d1a5be3c3c7 100644 GIT binary patch literal 6757 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 diff --git a/gadget/index.html b/gadget/index.html index e275fc7..aa3803a 100644 --- a/gadget/index.html +++ b/gadget/index.html @@ -1,6 +1,22 @@ -

Wakatime Hangout

+
+
+ +
+
+ +
+
+ +
+
+ +
+
+
+ + + +
+
+
-
- - -
\ No newline at end of file diff --git a/gadget/scripts/wakatime.js b/gadget/scripts/wakatime.js index 7fed2cf..960b690 100644 --- a/gadget/scripts/wakatime.js +++ b/gadget/scripts/wakatime.js @@ -1,86 +1,139 @@ -/* global gapi, gadgets, $ */ - -var logoUrl = 'https://wakatime.com/static/img/wakatime-white-120.png'; -var overlayEffect = null; - -function sendHeartbeat(file, time, project, language, isWrite, lines) { - // TODO -} - -function createTextOverlay(string) { - // Create a canvas to draw on - var canvas = document.createElement('canvas'); - canvas.setAttribute('width', 166); - canvas.setAttribute('height', 100); - - var context = canvas.getContext('2d'); - - // Draw background - //context.fillStyle = '#BBB'; - //context.fillRect(0,0,166,50); - - // Draw text - context.font = '16pt Impact'; - context.lineWidth = 6; - context.lineStyle = '#000'; - context.fillStyle = '#FFF'; - context.textAlign = 'center'; - context.textBaseline = 'bottom'; - context.strokeText(string, canvas.width / 2, canvas.height / 2); - context.fillText(string, canvas.width / 2, canvas.height / 2); - - return canvas.toDataURL(); -} - -function showOverlay() { - var options = { - 'scale': { - 'magnitude': 0.5, - 'reference': gapi.hangout.av.effects.ScaleReference.WIDTH - } - }; - //var overlayImage = gapi.hangout.av.effects.createImageResource(logoUrl); - var overlayImage = gapi.hangout.av.effects.createImageResource(createTextOverlay('Time: 00:00:23')); - overlayEffect = overlayImage.createOverlay(options); - overlayEffect.setPosition(-0.5, 0.45); - overlayEffect.setVisible(true); -} - -function startApp() { - gapi.hangout.onair.onYouTubeLiveIdReady.add( - function(eventObject) { +/* global angular, gapi, gadgets, moment, $ */ + +(function() { + 'use strict'; + + angular.module('wakatime', ['ngCookies']).config(function ($rootScope) { + // Wait for gadget to load. + gadgets.util.registerOnLoadHandler(function() { + gapi.hangout.onApiReady.add( + function(e) { + $rootScope.$broadcast('hangout.ready', e); + }); }); + }).controller('WakatimeCtrl', function ($scope, $http, Hangout) { + $scope.edit = true; + $scope.running = false; + $scope.logo = 'https://avatars2.githubusercontent.com/u/4814844?v=3&s=200'; - gapi.hangout.onParticipantsChanged.add( - function(eventObject) { - }); + $scope.start = function() { + Hangout.start(); + }; - gapi.hangout.onair.onBroadcastingChanged.add( - function(eventObject) { - }); + $scope.stop = function() { + Hangout.stop(); + }; - gapi.hangout.onair.onNewParticipantInBroadcastChanged.add( - function(eventObject) { - }); + $scope.reset = function() { + Hangout.reset(); + }; - gapi.hangout.onTopicChanged.add( - function(eventObject) { + $scope.$watch('showLogo', function(newValue, oldValue) { + Hangout.showLogo(newValue); }); - gapi.hangout.onTopicChanged.add( - function(eventObject) { - }); - -} - -function init() { - // When API is ready... - gapi.hangout.onApiReady.add( - function(eventObj) { + $scope.sendHeartbeat = function(file, time, project, language, isWrite, lines) { // TODO - showOverlay(); + }; + }).factory('Hangout', function ($rootScope, $interval) { + var overlays = {}; + var watch; + var time = 0; + + function createTextOverlay(string) { + // Create a canvas to draw on + var canvas = document.createElement('canvas'); + canvas.setAttribute('width', 166); + canvas.setAttribute('height', 100); + + var context = canvas.getContext('2d'); + + // Draw text + context.font = '16pt Impact'; + context.lineWidth = 6; + context.lineStyle = '#000'; + context.fillStyle = '#FFF'; + context.textAlign = 'center'; + context.textBaseline = 'bottom'; + context.strokeText(string, canvas.width / 2, canvas.height / 2); + context.fillText(string, canvas.width / 2, canvas.height / 2); + + return canvas.toDataURL(); + } + + var Hangout = { + init: function() { + gapi.hangout.onParticipantsChanged.add( + function(e) { + $rootScope.$broadcast('hangout.participant', e); + }); + + gapi.hangout.onair.onBroadcastingChanged.add( + function(e) { + $rootScope.$broadcast('hangout.broadcasting', e); + }); + + gapi.hangout.onair.onNewParticipantInBroadcastChanged.add( + function(e) { + }); + + gapi.hangout.onTopicChanged.add( + function(e) { + $rootScope.$broadcast('hangout.topic', e); + }); + }, + start: function() { + if(watch) { + return; + } else { + watch = $interval(function() { + time += 5000; + Hangout.setTime(moment(time).format('HH:mm:ss')); + }, 5000) + } + }, + stop: function() { + if(watch) { + $interval.cancel(watch); + watch = undefined; + } + }, + reset: function() { + time = 0; + }, + setTime: function(time) { + if(overlays['time']) { + overlays['time'].dispose(); + } + overlays['time'] = gapi.hangout.av.effects.createImageResource(createTextOverlay(time)); + overlays['time'] = overlays['time'].createOverlay({ + 'scale': { + 'magnitude': 0.5, + 'reference': gapi.hangout.av.effects.ScaleReference.WIDTH + } + }); + overlays['time'].setPosition(-0.5, 0.45); + overlays['time'].setVisible(true); + }, + showLogo: function(show) { + if(!overlays['logo']) { + overlays['logo'] = gapi.hangout.av.effects.createImageResource('https://avatars2.githubusercontent.com/u/4814844?v=3&s=200'); + overlays['logo'] = overlays['logo'].createOverlay({ + 'scale': { + 'magnitude': 0.5, + 'reference': gapi.hangout.av.effects.ScaleReference.WIDTH + } + }); + overlays['logo'].setPosition(0.5, 0.45); + } + overlays['logo'].setVisible(show); + } + }; + + $rootScope.$on('hangout.ready', function(e) { + Hangout.init(); }); -} -// Wait for gadget to load. -gadgets.util.registerOnLoadHandler(init); + return Hangout; + }); +})(); \ No newline at end of file diff --git a/gadget/styles/wakatime.css b/gadget/styles/wakatime.css index 09e6b57..e69de29 100644 --- a/gadget/styles/wakatime.css +++ b/gadget/styles/wakatime.css @@ -1,4 +0,0 @@ -body { - color: #ffffff; - background-color: #000000; -} \ No newline at end of file diff --git a/gadget/wakatime.xml b/gadget/wakatime.xml index f02ee6c..b613e2e 100644 --- a/gadget/wakatime.xml +++ b/gadget/wakatime.xml @@ -20,14 +20,17 @@ + - + + + diff --git a/gulpfile.js b/gulpfile.js index 06049cc..3b99199 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -14,7 +14,7 @@ gulp.task('merge', function () { //.pipe($.inject(gulp.src(['./gadget/**/*.js', './gadget/**/*.css'], {read: false}))) return gulp.src('./gadget/wakatime.xml') - .pipe($.replace(/]*>/g, function(s, filename) { + .pipe($.replace(/]*>/g, function(s, filename) { var style = fs.readFileSync('./gadget/styles/' + filename, 'utf8'); return ''; })) diff --git a/public/wakatime.xml b/public/wakatime.xml index 211fc5f..4a53fcc 100644 --- a/public/wakatime.xml +++ b/public/wakatime.xml @@ -20,6 +20,7 @@ +