added simple graphs into the code history view
This commit is contained in:
parent
adcce47950
commit
4a2a119bec
@ -106,5 +106,6 @@ LICENSE
|
|||||||
JavaScript Creole 1.0 Wiki Markup Parser See src/js/creole.js
|
JavaScript Creole 1.0 Wiki Markup Parser See src/js/creole.js
|
||||||
jQuery JavaScript Library v1.4.2 See http://jquery.org/license
|
jQuery JavaScript Library v1.4.2 See http://jquery.org/license
|
||||||
jQuery UI 1.8 MIT or GPL
|
jQuery UI 1.8 MIT or GPL
|
||||||
|
PHPGraphLib MIT
|
||||||
------------------------------------------------------------------------
|
------------------------------------------------------------------------
|
||||||
|
|
||||||
|
@ -9,7 +9,7 @@ License: GPL
|
|||||||
Group: Applications/Utilities
|
Group: Applications/Utilities
|
||||||
Source0: %{name}-%{version}.tar.gz
|
Source0: %{name}-%{version}.tar.gz
|
||||||
|
|
||||||
Requires: httpd php php-ldap php-mysql subversion subversion-perl mod_dav_svn mod_perl perl-LDAP perl-Config-Simple perl-URI perl-DBI perl-Digest-SHA1
|
Requires: httpd php php-ldap php-mysql php-gd subversion subversion-perl mod_dav_svn mod_perl perl-LDAP perl-Config-Simple perl-URI perl-DBI perl-Digest-SHA1
|
||||||
|
|
||||||
#BuildRequires:
|
#BuildRequires:
|
||||||
BuildRoot: %{_tmppath}/%{name}-%{version}-root
|
BuildRoot: %{_tmppath}/%{name}-%{version}-root
|
||||||
|
@ -635,4 +635,61 @@ class Code extends Controller
|
|||||||
return $path;
|
return $path;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function graph ($type = '', $projectid = '', $path = '')
|
||||||
|
{
|
||||||
|
$this->load->model ('SubversionModel', 'subversion');
|
||||||
|
|
||||||
|
$path = $this->converter->HexToAscii ($path);
|
||||||
|
if ($path == '.') $path = ''; /* treat a period specially */
|
||||||
|
$path = $this->_normalize_path ($path);
|
||||||
|
|
||||||
|
$file = $this->subversion->getHistory ($projectid, $path, SVN_REVISION_HEAD);
|
||||||
|
$history = $file['history'];
|
||||||
|
$history_count = count($history);
|
||||||
|
|
||||||
|
|
||||||
|
if ($type == 'commit-share-by-users')
|
||||||
|
{
|
||||||
|
$stats = array();
|
||||||
|
for ($i = 0; $i < $history_count; $i++)
|
||||||
|
{
|
||||||
|
$h = $history[$i];
|
||||||
|
if (array_key_exists ($h['author'], $stats))
|
||||||
|
$stats[$h['author']]++;
|
||||||
|
else
|
||||||
|
$stats[$h['author']] = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->load->library ('PHPGraphLibPie', array ('width' => 400, 'height' => 300), 'graph');
|
||||||
|
$this->graph->addData($stats);
|
||||||
|
$this->graph->setTitle("Commit share by users");
|
||||||
|
$this->graph->setLabelTextColor('50,50,50');
|
||||||
|
$this->graph->setLegendTextColor('50,50,50');
|
||||||
|
$this->graph->createGraph();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$stats = array();
|
||||||
|
for ($i = 0; $i < $history_count; $i++)
|
||||||
|
{
|
||||||
|
$h = $history[$i];
|
||||||
|
if (array_key_exists ($h['author'], $stats))
|
||||||
|
$stats[$h['author']]++;
|
||||||
|
else
|
||||||
|
$stats[$h['author']] = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->load->library ('PHPGraphLib', array ('width' => 400, 'height' => 300), 'graph');
|
||||||
|
$this->graph->addData($stats);
|
||||||
|
$this->graph->setTitle("Commits by users");
|
||||||
|
$this->graph->setDataPoints(TRUE);
|
||||||
|
$this->graph->setDataValues(TRUE);
|
||||||
|
//$this->graph->setLine(TRUE);
|
||||||
|
$this->graph->setBars(TRUE);
|
||||||
|
//$this->graph->setXValuesHorizontal(TRUE);
|
||||||
|
$this->graph->createGraph();
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -4,7 +4,9 @@ www_DATA = \
|
|||||||
index.html \
|
index.html \
|
||||||
Lang_detect.php \
|
Lang_detect.php \
|
||||||
issuehelper.php \
|
issuehelper.php \
|
||||||
wikihelper.php
|
wikihelper.php \
|
||||||
|
phpgraphlib.php \
|
||||||
|
phpgraphlibpie.php
|
||||||
|
|
||||||
EXTRA_DIST = $(www_DATA)
|
EXTRA_DIST = $(www_DATA)
|
||||||
|
|
||||||
|
@ -144,7 +144,9 @@ www_DATA = \
|
|||||||
index.html \
|
index.html \
|
||||||
Lang_detect.php \
|
Lang_detect.php \
|
||||||
issuehelper.php \
|
issuehelper.php \
|
||||||
wikihelper.php
|
wikihelper.php \
|
||||||
|
phpgraphlib.php \
|
||||||
|
phpgraphlibpie.php
|
||||||
|
|
||||||
EXTRA_DIST = $(www_DATA)
|
EXTRA_DIST = $(www_DATA)
|
||||||
all: all-am
|
all: all-am
|
||||||
|
1619
codepot/src/codepot/libraries/phpgraphlib.php
Normal file
1619
codepot/src/codepot/libraries/phpgraphlib.php
Normal file
File diff suppressed because it is too large
Load Diff
390
codepot/src/codepot/libraries/phpgraphlibpie.php
Normal file
390
codepot/src/codepot/libraries/phpgraphlibpie.php
Normal file
@ -0,0 +1,390 @@
|
|||||||
|
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
|
||||||
|
|
||||||
|
/*
|
||||||
|
|
||||||
|
PHPGraphLib Graphing Library
|
||||||
|
|
||||||
|
The first version PHPGraphLib was written in 2007 by Elliott Brueggeman to
|
||||||
|
deliver PHP generated graphs quickly and easily. It has grown in both features
|
||||||
|
and maturity since its inception, but remains PHP 4.04+ compatible. Originally
|
||||||
|
available only for paid commerial use, PHPGraphLib was open-sourced in 2013
|
||||||
|
under the MIT License. Please visit http://www.ebrueggeman.com/phpgraphlib
|
||||||
|
for more information.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
The MIT License (MIT)
|
||||||
|
|
||||||
|
Copyright (c) 2013 Elliott Brueggeman
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in
|
||||||
|
all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
THE SOFTWARE.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
define('__ROOT__', dirname(__FILE__));
|
||||||
|
require_once(__ROOT__.'/phpgraphlib.php');
|
||||||
|
|
||||||
|
class PHPGraphLibPie extends PHPGraphLib
|
||||||
|
{
|
||||||
|
const PIE_3D_HEIGHT_PERCENT = 4;
|
||||||
|
const PIE_LEGEND_TEXT_WIDTH = 6;
|
||||||
|
const PIE_LEGEND_TEXT_HEIGHT = 12;
|
||||||
|
const PIE_LABEL_TEXT_WIDTH = 6;
|
||||||
|
const PIE_LABEL_TEXT_HEIGHT = 12;
|
||||||
|
const PIE_LEGEND_PADDING = 5;
|
||||||
|
const PIE_CENTER_Y_OFFSET = 50; //in %
|
||||||
|
const PIE_CENTER_X_OFFSET = 50; //in %
|
||||||
|
const PIE_CENTER_LEGEND_SCALE = 55; //offset in % of existing coords when legend
|
||||||
|
const PIE_WIDTH_PERCENT = 75; //default width % of total width
|
||||||
|
const PIE_HEIGHT_PERCENT = 28;
|
||||||
|
const PIE_LABEL_SCALE = 90; //in % scale width/height if data labels
|
||||||
|
const PIE_LEGEND_SCALE = 64;//in % scale width/height if legend
|
||||||
|
|
||||||
|
//internals - do not change
|
||||||
|
protected $pie_width;
|
||||||
|
protected $pie_height;
|
||||||
|
protected $pie_center_x;
|
||||||
|
protected $pie_center_y;
|
||||||
|
protected $pie_legend_x;
|
||||||
|
protected $pie_legend_y;
|
||||||
|
protected $pie_data_label_space;
|
||||||
|
protected $pie_3D_height;
|
||||||
|
|
||||||
|
protected $pie_data_max_length = 0;
|
||||||
|
protected $pie_color_pointer = 0;
|
||||||
|
protected $pie_data_array_percents = array();
|
||||||
|
protected $bool_x_axis = false;
|
||||||
|
protected $bool_y_axis = false;
|
||||||
|
protected $bool_data_points = false;
|
||||||
|
protected $pie_precision = 0; //number of significant digits in label %
|
||||||
|
protected $bool_legend = true;
|
||||||
|
protected $bool_data_labels = true;
|
||||||
|
|
||||||
|
//default colors, in order of display on graph
|
||||||
|
protected $pie_avail_colors = array(
|
||||||
|
'pastel_orange_1', 'pastel_orange_2', 'pastel_blue_1', 'pastel_green_1',
|
||||||
|
'clay', 'pastel_blue_2', 'pastel_yellow', 'silver', 'pastel_green_2',
|
||||||
|
'brown', 'gray', 'pastel_purple', 'olive', 'aqua', 'yellow', 'teal', 'lime'
|
||||||
|
);
|
||||||
|
|
||||||
|
protected function calcCoords()
|
||||||
|
{
|
||||||
|
//calc coords of pie center and width/height
|
||||||
|
$this->pie_width = $this->width * (self::PIE_WIDTH_PERCENT / 100);
|
||||||
|
$this->pie_height = $this->width * (self::PIE_HEIGHT_PERCENT / 100);
|
||||||
|
$this->pie_center_y = $this->height * (self::PIE_CENTER_Y_OFFSET / 100);
|
||||||
|
$this->pie_center_x = $this->width * (self::PIE_CENTER_X_OFFSET / 100);
|
||||||
|
|
||||||
|
//set data label spacing
|
||||||
|
if ($this->bool_data_labels) {
|
||||||
|
//set to number of pixels that are equal to text width
|
||||||
|
//7 is a base spacer that all labels get
|
||||||
|
$this->pie_data_label_space = 7 + $this->width / 30;
|
||||||
|
$this->pie_width *= self::PIE_LABEL_SCALE / 100;
|
||||||
|
$this->pie_height *= self::PIE_LABEL_SCALE / 100;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($this->bool_legend) {
|
||||||
|
//compensate for legend with lesser preset percent
|
||||||
|
$this->pie_width *= self::PIE_LEGEND_SCALE / 100;
|
||||||
|
$this->pie_height *= self::PIE_LEGEND_SCALE / 100;
|
||||||
|
$this->pie_center_x *= self::PIE_CENTER_LEGEND_SCALE / 100;
|
||||||
|
}
|
||||||
|
$this->pie_3D_height = self::PIE_3D_HEIGHT_PERCENT * ($this->pie_width / 100);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function setupData()
|
||||||
|
{
|
||||||
|
//in the pie extension, this will calculate the total sum and the corresponding percentages
|
||||||
|
if ($this->data_set_count == 1) {
|
||||||
|
$sum = array_sum($this->data_array[0]);
|
||||||
|
if ($sum > 0) {
|
||||||
|
foreach ($this->data_array[0] as $dataText => $dataValue) {
|
||||||
|
$this->pie_data_array_percents[] = $dataValue / $sum;
|
||||||
|
//find data text length
|
||||||
|
$len = strlen($dataText);
|
||||||
|
if ($len > $this->pie_data_max_length) {
|
||||||
|
$this->pie_data_max_length = $len; }
|
||||||
|
}
|
||||||
|
$this->bool_bars_generate = true;
|
||||||
|
} else {
|
||||||
|
$this->bool_bars_generate = false;
|
||||||
|
$this->error[] = "Sum of data must be greater than 0.";
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$this->error[]="Multiple datasets not allowed with pie charts";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function generateLegend()
|
||||||
|
{
|
||||||
|
$maxChars = NULL;
|
||||||
|
//calc height / width based on # of values
|
||||||
|
$pie_legend_height = (self::PIE_LEGEND_TEXT_HEIGHT * $this->data_count) + (2 * self::PIE_LEGEND_PADDING);
|
||||||
|
$pie_legend_width = ($this->pie_data_max_length * self::PIE_LEGEND_TEXT_WIDTH) + (6 * self::PIE_LEGEND_PADDING);
|
||||||
|
|
||||||
|
//allotted space does not include padding around legend (smaller)
|
||||||
|
$allottedSpace = $this->width - $this->pie_center_x - ($this->pie_width / 2) - (2 * self::PIE_LEGEND_PADDING);
|
||||||
|
if ($this->bool_data_labels) {
|
||||||
|
//also compensate for displayed text data % on graph
|
||||||
|
$allottedSpace -= ((4 + $this->pie_precision) * self::PIE_LABEL_TEXT_WIDTH) + $this->pie_data_label_space;
|
||||||
|
}
|
||||||
|
//check to make sure we are not > allotted space
|
||||||
|
if ($pie_legend_width > $allottedSpace) {
|
||||||
|
//if we are, adjust width and max length for data values
|
||||||
|
//4 = padding | swatch(padding width) | padding | ...text... |padding
|
||||||
|
$swatchAndPaddingWidth = 4 * self::PIE_LEGEND_PADDING;
|
||||||
|
//MAX CHARS = ALOTTED SPACE - ENOUGH ROOM FOR SWATCHES / TEXT WIDTH
|
||||||
|
$maxChars = floor(($allottedSpace - $swatchAndPaddingWidth) / self::PIE_LEGEND_TEXT_WIDTH);
|
||||||
|
$pie_legend_width = ($maxChars * self::PIE_LEGEND_TEXT_WIDTH) + $swatchAndPaddingWidth;
|
||||||
|
} else {
|
||||||
|
//we didnt go over allotted space, so we should adjust the center of the pie chart now
|
||||||
|
$equalSpacing = ($this->width - ($this->pie_width + $pie_legend_width)) / 3;
|
||||||
|
//so now reposition center at spacing + 1/2 pie width
|
||||||
|
$this->pie_center_x = ($this->pie_width / 2) + $equalSpacing;
|
||||||
|
}
|
||||||
|
//auto adjusting formula for position of pie_legend_x based on pie chart size
|
||||||
|
$a = ($this->pie_center_x + $this->pie_width / 2);
|
||||||
|
$b = $this->width - $a;
|
||||||
|
$c = ($b - $pie_legend_width) / 2;
|
||||||
|
//set pie x & y args
|
||||||
|
$this->pie_legend_x = $a + $c;
|
||||||
|
$this->pie_legend_y = ($this->height - $pie_legend_height) / 2;
|
||||||
|
//background
|
||||||
|
imagefilledrectangle($this->image, $this->pie_legend_x, $this->pie_legend_y, $this->pie_legend_x + $pie_legend_width,
|
||||||
|
$this->pie_legend_y + $pie_legend_height, $this->legend_color);
|
||||||
|
//border
|
||||||
|
imagerectangle($this->image, $this->pie_legend_x, $this->pie_legend_y, $this->pie_legend_x + $pie_legend_width,
|
||||||
|
$this->pie_legend_y + $pie_legend_height, $this->legend_outline_color);
|
||||||
|
$xValue = $this->pie_legend_x + self::PIE_LEGEND_PADDING;
|
||||||
|
$count = 0;
|
||||||
|
$this->resetColorPointer();
|
||||||
|
$swatchToTextOffset = (self::PIE_LEGEND_TEXT_HEIGHT - 6) / 2;
|
||||||
|
$swatchSize = self::PIE_LEGEND_TEXT_HEIGHT - (2 * $swatchToTextOffset);
|
||||||
|
foreach ($this->data_array[0] as $dataText => $dataValue) {
|
||||||
|
$yValue = $this->pie_legend_y + self::PIE_LEGEND_TEXT_HEIGHT * $count + self::PIE_LEGEND_PADDING;
|
||||||
|
//draw color boxes
|
||||||
|
$color = $this->generateNextColor();
|
||||||
|
imagefilledrectangle($this->image, $xValue, $yValue + $swatchToTextOffset, $xValue + $swatchSize, $yValue + $swatchToTextOffset + $swatchSize, $color);
|
||||||
|
imagerectangle($this->image, $xValue, $yValue + $swatchToTextOffset, $xValue + $swatchSize, $yValue + $swatchToTextOffset + $swatchSize, $this->legend_swatch_outline_color);
|
||||||
|
//if longer than our max, trim text
|
||||||
|
if ($maxChars) {
|
||||||
|
$dataText = substr($dataText,0, $maxChars);
|
||||||
|
}
|
||||||
|
imagestring($this->image, 2, $xValue + (2 * self::PIE_LEGEND_PADDING), $yValue, $dataText, $this->legend_text_color);
|
||||||
|
$count++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function generateBars()
|
||||||
|
{
|
||||||
|
$this->resetColorPointer();
|
||||||
|
//loop through and create shadaing
|
||||||
|
for ($i = $this->pie_center_y + $this->pie_3D_height; $i > $this->pie_center_y; $i--) {
|
||||||
|
$arcStart = 0;
|
||||||
|
foreach ($this->pie_data_array_percents as $key => $value) {
|
||||||
|
$color = $this->generateNextColor(true);
|
||||||
|
// generate a darker version of the indexed color
|
||||||
|
// do not draw if the value is zero
|
||||||
|
if (! $value == 0){
|
||||||
|
imagefilledarc($this->image, $this->pie_center_x, $i, $this->pie_width, $this->pie_height, $arcStart, (360 * $value) + $arcStart, $color, IMG_ARC_PIE);
|
||||||
|
$arcStart += 360*$value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$this->resetColorPointer();
|
||||||
|
}
|
||||||
|
$arcStart = 0;
|
||||||
|
foreach ($this->pie_data_array_percents as $key => $value) {
|
||||||
|
$color = $this->generateNextColor();
|
||||||
|
// do not draw if the value is zero
|
||||||
|
if (! $value == 0){
|
||||||
|
imagefilledarc($this->image, $this->pie_center_x, $this->pie_center_y, $this->pie_width, $this->pie_height, $arcStart, (360*$value)+$arcStart, $color, IMG_ARC_PIE);
|
||||||
|
$arcStart += 360 * $value;
|
||||||
|
}
|
||||||
|
if ($this->bool_data_labels) {
|
||||||
|
$this->generateDataLabel($value, $arcStart);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function generateDataLabel($value, $arcStart)
|
||||||
|
{
|
||||||
|
//midway if the mid arc angle of the wedge we just drew
|
||||||
|
$midway = ($arcStart - (180 * $value));
|
||||||
|
//adjust for ellipse height/width ratio
|
||||||
|
$skew = self::PIE_HEIGHT_PERCENT / self::PIE_WIDTH_PERCENT;
|
||||||
|
$pi = atan(1.0) * 4.0;
|
||||||
|
$theta = ($midway / 180) * $pi;
|
||||||
|
$valueX = $this->pie_center_x + ($this->pie_width / 2 + $this->pie_data_label_space) * cos($theta);
|
||||||
|
$valueY = $this->pie_center_y + ($this->pie_width / 2 + $this->pie_data_label_space) * sin($theta) * $skew;
|
||||||
|
$displayValue = $this->formatPercent($value);
|
||||||
|
$valueArray = $this->dataLabelHandicap($valueX, $valueY, $displayValue, $midway);
|
||||||
|
$valueX = $valueArray[0];
|
||||||
|
$valueY = $valueArray[1];
|
||||||
|
imagestring($this->image, 2, $valueX, $valueY, $displayValue, $this->label_text_color);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function formatPercent($input)
|
||||||
|
{
|
||||||
|
return number_format($input * 100, $this->pie_precision) . '%';
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function dataLabelHandicap($x, $y, $value, $midway)
|
||||||
|
{
|
||||||
|
//moves data label x/y based on quadrant and length of displayed data
|
||||||
|
//and how text is displayed (upper left corner x/y)
|
||||||
|
//extra 1 for % sign
|
||||||
|
$lengthOffset = (strlen($value) * (self::PIE_LABEL_TEXT_WIDTH)) / 2;
|
||||||
|
$vertOffset = self::PIE_LABEL_TEXT_HEIGHT / 2;
|
||||||
|
if ($midway <= 30) {
|
||||||
|
$newX = $x - (1.5 * $lengthOffset);
|
||||||
|
$newY = $y - $vertOffset;
|
||||||
|
} elseif ($midway > 30 && $midway <= 135) {
|
||||||
|
$newX = $x - $lengthOffset;
|
||||||
|
$newY = $y - $vertOffset + $this->pie_3D_height;
|
||||||
|
} elseif ($midway > 135 && $midway <= 165) {
|
||||||
|
$newX = $x - $lengthOffset;
|
||||||
|
$newY = $y - $vertOffset;
|
||||||
|
} elseif ($midway > 165 && $midway <= 200) {
|
||||||
|
//value at risk for being out of bounds on smaller graphs
|
||||||
|
$newX = $x - (1/3 * $lengthOffset);
|
||||||
|
$newY = $y - $vertOffset;
|
||||||
|
} elseif ($midway > 200 && $midway <= 330) {
|
||||||
|
$newX = $x - $lengthOffset;
|
||||||
|
$newY = $y - $vertOffset;
|
||||||
|
} elseif ($midway > 330) {
|
||||||
|
//value at risk for overlapping the legend on smaller graphs
|
||||||
|
$newX = $x - (1.5 * $lengthOffset);
|
||||||
|
$newY = $y - $vertOffset;
|
||||||
|
} else {
|
||||||
|
$newX = $x - $lengthOffset;
|
||||||
|
$newY = $y - $vertOffset;
|
||||||
|
}
|
||||||
|
return array($newX, $newY);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function generateNextColor($dark = false)
|
||||||
|
{
|
||||||
|
$array = $this->returnColorArray($this->pie_avail_colors[$this->pie_color_pointer]);
|
||||||
|
if ($dark) {
|
||||||
|
//we are trying to generate a darker version of the existing color
|
||||||
|
$array[0] *= .8;
|
||||||
|
$array[1] *= .8;
|
||||||
|
$array[2] *= .8;
|
||||||
|
}
|
||||||
|
$color = imagecolorallocate($this->image, $array[0], $array[1], $array[2]);
|
||||||
|
$this->pie_color_pointer++;
|
||||||
|
if ($this->pie_color_pointer >= count($this->pie_avail_colors)) {
|
||||||
|
$this->pie_color_pointer = 0;
|
||||||
|
}
|
||||||
|
return $color;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function resetColorPointer()
|
||||||
|
{
|
||||||
|
$this->pie_color_pointer = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function returnColorArray($color)
|
||||||
|
{
|
||||||
|
//this function first checks exisitng colors in phpgraphlib
|
||||||
|
//then if not found checks its own list
|
||||||
|
//comes with various preset lighter pie chart friendly colors
|
||||||
|
if ($resultColor = parent::returnColorArray($color)) {
|
||||||
|
return $resultColor;
|
||||||
|
} else {
|
||||||
|
//remove last error generated (phpgraphlib::returncolorarray) sets only one error if false)
|
||||||
|
array_pop($this->error);
|
||||||
|
//check to see if numeric color passed through in form '128,128,128'
|
||||||
|
if (strpos($color,',') !== false) {
|
||||||
|
return explode(',', $color);
|
||||||
|
}
|
||||||
|
switch(strtolower($color)) {
|
||||||
|
//named colors based on w3c's recommended html colors
|
||||||
|
case 'pastel_orange_1': return array(238,197,145); break;
|
||||||
|
case 'pastel_orange_2': return array(238,180,34); break;
|
||||||
|
case 'pastel_blue_1': return array(122,197,205); break;
|
||||||
|
case 'pastel_green_1': return array(102,205,0); break;
|
||||||
|
case 'pastel_blue_2': return array(125,167,217); break;
|
||||||
|
case 'pastel_green_2': return array(196,223,155); break;
|
||||||
|
case 'clay': return array(246,142,85); break;
|
||||||
|
case 'pastel_yellow': return array(255,247,153); break;
|
||||||
|
case 'pastel_purple': return array(135,129,189); break;
|
||||||
|
case 'brown': return array(166,124,81); break;
|
||||||
|
}
|
||||||
|
$this->error[] = "Color name \"$color\" not recogized.";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
protected function generateTitle()
|
||||||
|
{
|
||||||
|
//draws title b/t top of graph and edge of canvas
|
||||||
|
$pieTop = $this->pie_center_y - ($this->pie_height / 2);
|
||||||
|
if ($this->bool_legend) {
|
||||||
|
$topElement = ($pieTop < $this->pie_legend_y) ? $pieTop : $this->pie_legend_y;
|
||||||
|
} else {
|
||||||
|
$topElement = $pieTop;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($topElement < 0) {
|
||||||
|
$this->error[] = "Not enough room for a title. Increase graph height, or eliminate data values.";
|
||||||
|
} else {
|
||||||
|
$title_y = ($topElement / 2) - (self::TITLE_CHAR_HEIGHT / 2);
|
||||||
|
$title_x = ($this->width / 2) - ((strlen($this->title_text) * self::TITLE_CHAR_WIDTH) / 2);
|
||||||
|
imagestring($this->image, 2, $title_x , $title_y , $this->title_text, $this->title_color);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setLabelTextColor($color)
|
||||||
|
{
|
||||||
|
$this->setGenericColor($color, '$this->label_text_color', "Label text color not specified properly.");
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setPrecision($digits)
|
||||||
|
{
|
||||||
|
if (is_int($digits)) {
|
||||||
|
$this->pie_precision = $digits;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->error[] = "Integer arg for setPrecision() not specified properly.";
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setDataLabels($bool)
|
||||||
|
{
|
||||||
|
if (is_bool($bool)) {
|
||||||
|
$this->bool_data_labels = $bool;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->error[] = "Boolean arg for setDataLabels() not specified properly.";
|
||||||
|
}
|
||||||
|
|
||||||
|
//overwritten and unused PHPGraphLib functions
|
||||||
|
function setDataPoints($bool)
|
||||||
|
{
|
||||||
|
$this->error[] = __function__ . '() function not allowed in PHPGraphLib Stacked extension.';
|
||||||
|
}
|
||||||
|
|
||||||
|
function calcTopMargin() {}
|
||||||
|
function calcRightMargin() {}
|
||||||
|
function setupGrid() {}
|
||||||
|
}
|
||||||
|
|
||||||
|
?>
|
@ -79,6 +79,17 @@ $this->load->view (
|
|||||||
</div> <!-- code_history_mainarea_menu -->
|
</div> <!-- code_history_mainarea_menu -->
|
||||||
|
|
||||||
<div id="code_history_mainarea_result">
|
<div id="code_history_mainarea_result">
|
||||||
|
|
||||||
|
<?php
|
||||||
|
$xfullpath = $this->converter->AsciiToHex (($fullpath == '')? '.': $fullpath);
|
||||||
|
|
||||||
|
$graph_url = site_url() . "/code/graph/commits-by-users/{$project->id}/{$xfullpath}";
|
||||||
|
print "<img src='{$graph_url}' />";
|
||||||
|
|
||||||
|
$graph_url = site_url() . "/code/graph/commit-share-by-users/{$project->id}/{$xfullpath}";
|
||||||
|
print "<img src='{$graph_url}' />";
|
||||||
|
?>
|
||||||
|
|
||||||
<table id="code_history_mainarea_result_table">
|
<table id="code_history_mainarea_result_table">
|
||||||
<tr class='heading'>
|
<tr class='heading'>
|
||||||
<th><?=$this->lang->line('Revision')?></th>
|
<th><?=$this->lang->line('Revision')?></th>
|
||||||
|
Loading…
Reference in New Issue
Block a user