Merge branch 'master' into dependabot/docker/scripts/docker/mxe-build-container/ubuntu-24.04

This commit is contained in:
Michael Keller 2024-10-21 10:43:44 +13:00 committed by GitHub
commit 953ff85dd4
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
33 changed files with 57 additions and 468 deletions

View file

@ -18,7 +18,7 @@ jobs:
KEYSTORE_FILE: ${{ github.workspace }}/../subsurface.keystore KEYSTORE_FILE: ${{ github.workspace }}/../subsurface.keystore
runs-on: ubuntu-latest runs-on: ubuntu-latest
container: container:
image: docker://subsurface/android-build:5.15.2 image: docker://subsurface/android-build:5.15.3
steps: steps:
- name: checkout sources - name: checkout sources

View file

@ -95,6 +95,5 @@ jobs:
echo "--------------------------------------------------------------" echo "--------------------------------------------------------------"
echo "building smtk2ssrf" echo "building smtk2ssrf"
# build smtk2ssrf (needs the artefacts generated by the subsurface build
cd .. cd ..
bash -e -x subsurface/scripts/smtk2ssrf-build.sh -y bash -e -x subsurface/scripts/smtk2ssrf-build.sh -y

View file

@ -14,7 +14,7 @@ jobs:
uses: actions/checkout@v4 uses: actions/checkout@v4
- name: Set up Python - name: Set up Python
uses: actions/setup-python@v4 uses: actions/setup-python@v5
with: with:
python-version: '3.11' python-version: '3.11'
@ -28,7 +28,7 @@ jobs:
sudo snap install review-tools --edge sudo snap install review-tools --edge
- name: Set up Launchpad credentials - name: Set up Launchpad credentials
uses: DamianReeves/write-file-action@v1.2 uses: DamianReeves/write-file-action@v1.3
with: with:
path: lp_credentials path: lp_credentials
contents: ${{ secrets.LAUNCHPAD_CREDENTIALS }} contents: ${{ secrets.LAUNCHPAD_CREDENTIALS }}

View file

@ -52,6 +52,7 @@ option(NO_USERMANUAL "don't include a viewer for the user manual" OFF)
#Options regarding enabling parts of subsurface #Options regarding enabling parts of subsurface
option(BTSUPPORT "enable support for QtBluetooth" ON) option(BTSUPPORT "enable support for QtBluetooth" ON)
option(FTDISUPPORT "enable support for libftdi based serial" OFF) option(FTDISUPPORT "enable support for libftdi based serial" OFF)
option(LIBRAW_SUPPORT "enable support for LibRaw images" ON)
# Options regarding What should we build on subsurface # Options regarding What should we build on subsurface
option(MAKE_TESTS "Make the tests" ON) option(MAKE_TESTS "Make the tests" ON)
@ -169,10 +170,6 @@ if(NOT ANDROID)
pkg_config_library(LIBRAW libraw ) pkg_config_library(LIBRAW libraw )
endif() endif()
if(LIBRAW_FOUND)
add_definitions(-DLIBRAW_SUPPORT)
endif()
include_directories(. include_directories(.
${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_BINARY_DIR}
${CMAKE_BINARY_DIR} ${CMAKE_BINARY_DIR}
@ -300,6 +297,7 @@ elseif (SUBSURFACE_TARGET_EXECUTABLE MATCHES "DownloaderExecutable")
set(SUBSURFACE_TARGET subsurface-downloader) set(SUBSURFACE_TARGET subsurface-downloader)
endif() endif()
set(BTSUPPORT ON) set(BTSUPPORT ON)
set(LIBRAW_SUPPORT OFF)
add_definitions(-DSUBSURFACE_DOWNLOADER) add_definitions(-DSUBSURFACE_DOWNLOADER)
message(STATUS "building the embedded Subsurface-downloader app") message(STATUS "building the embedded Subsurface-downloader app")
endif() endif()
@ -363,6 +361,14 @@ if(BTSUPPORT)
add_definitions(-DBLE_SUPPORT) add_definitions(-DBLE_SUPPORT)
endif() endif()
if (LIBRAW_SUPPORT)
if(LIBRAW_FOUND)
add_definitions(-DLIBRAW_SUPPORT)
endif()
else()
message(STATUS "building without built-in libraw support")
endif()
if(ANDROID) if(ANDROID)
# when building for Android, the toolchain file requires all cmake modules # when building for Android, the toolchain file requires all cmake modules
# to be inside the CMAKE_FIND_ROOT_PATH - which prevents cmake from finding # to be inside the CMAKE_FIND_ROOT_PATH - which prevents cmake from finding

View file

@ -11,7 +11,7 @@ buildscript {
} }
dependencies { dependencies {
classpath 'com.android.tools.build:gradle:3.2.1' classpath 'com.android.tools.build:gradle:3.5.4'
} }
} }
@ -28,8 +28,8 @@ apply plugin: 'com.android.application'
dependencies { dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar']) implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.github.mik3y:usb-serial-for-android:v3.4.3' implementation 'com.github.mik3y:usb-serial-for-android:v3.8.0'
implementation 'com.android.support:support-v4:25.3.1' implementation 'com.android.support:support-v4:28.0.0'
} }
android { android {

View file

@ -439,7 +439,7 @@ static void cochran_parse_samples(struct dive *dive, const unsigned char *log,
{ {
const unsigned char *s; const unsigned char *s;
unsigned int offset = 0, profile_period = 1, sample_cnt = 0; unsigned int offset = 0, profile_period = 1, sample_cnt = 0;
double depth = 0, temp = 0, depth_sample = 0, psi = 0, sgc_rate = 0; double depth = 0, temp = 0, depth_sample = 0, psi = 0;
//int ascent_rate = 0; //int ascent_rate = 0;
unsigned int ndl = 0; unsigned int ndl = 0;
unsigned int in_deco = 0, deco_ceiling = 0, deco_time = 0; unsigned int in_deco = 0, deco_ceiling = 0, deco_time = 0;
@ -457,8 +457,6 @@ static void cochran_parse_samples(struct dive *dive, const unsigned char *log,
+ log[CMD_START_DEPTH + 1] * 256) / 4; + log[CMD_START_DEPTH + 1] * 256) / 4;
temp = log[CMD_START_TEMP]; temp = log[CMD_START_TEMP];
psi = log[CMD_START_PSI] + log[CMD_START_PSI + 1] * 256; psi = log[CMD_START_PSI] + log[CMD_START_PSI + 1] * 256;
sgc_rate = (double)(log[CMD_START_SGC]
+ log[CMD_START_SGC + 1] * 256) / 2;
profile_period = log[CMD_PROFILE_PERIOD]; profile_period = log[CMD_PROFILE_PERIOD];
break; break;
case TYPE_COMMANDER: case TYPE_COMMANDER:
@ -533,9 +531,6 @@ static void cochran_parse_samples(struct dive *dive, const unsigned char *log,
case 2: // PSI change case 2: // PSI change
psi -= (double)(s[1] & 0x7f) * (s[1] & 0x80 ? 1 : -1) / 4; psi -= (double)(s[1] & 0x7f) * (s[1] & 0x80 ? 1 : -1) / 4;
break; break;
case 1: // SGC rate
sgc_rate -= (double)(s[1] & 0x7f) * (s[1] & 0x80 ? 1 : -1) / 2;
break;
case 3: // Temperature case 3: // Temperature
temp = (double)s[1] / 2 + 20; temp = (double)s[1] / 2 + 20;
break; break;

View file

@ -1599,7 +1599,7 @@ static bool cylinder_in_use(const struct dive *dive, int idx)
bool is_cylinder_use_appropriate(const struct divecomputer &dc, const cylinder_t &cyl, bool allowNonUsable) bool is_cylinder_use_appropriate(const struct divecomputer &dc, const cylinder_t &cyl, bool allowNonUsable)
{ {
switch (cyl.cylinder_use) { switch (cyl.cylinder_use) {
case OC: case OC_GAS:
if (dc.divemode == FREEDIVE) if (dc.divemode == FREEDIVE)
return false; return false;

View file

@ -160,6 +160,6 @@ void exportHtmlInitLogic(const QString &filename, struct htmlExportSetting &hes)
file_copy_and_overwrite(searchPath + "jqplot.canvasAxisTickRenderer.min.js", exportFiles + "jqplot.canvasAxisTickRenderer.min.js"); file_copy_and_overwrite(searchPath + "jqplot.canvasAxisTickRenderer.min.js", exportFiles + "jqplot.canvasAxisTickRenderer.min.js");
file_copy_and_overwrite(searchPath + "jqplot.canvasTextRenderer.min.js", exportFiles + "jqplot.canvasTextRenderer.min.js"); file_copy_and_overwrite(searchPath + "jqplot.canvasTextRenderer.min.js", exportFiles + "jqplot.canvasTextRenderer.min.js");
file_copy_and_overwrite(searchPath + "jquery.min.js", exportFiles + "jquery.min.js"); file_copy_and_overwrite(searchPath + "jquery.min.js", exportFiles + "jquery.min.js");
file_copy_and_overwrite(searchPath + "jquery.jqplot.css", exportFiles + "jquery.jqplot.css"); file_copy_and_overwrite(searchPath + "jquery.jqplot.min.css", exportFiles + "jquery.jqplot.min.css");
file_copy_and_overwrite(searchPath + hes.themeFile, exportFiles + "theme.css"); file_copy_and_overwrite(searchPath + hes.themeFile, exportFiles + "theme.css");
} }

View file

@ -17,6 +17,7 @@
#include "gettext.h" #include "gettext.h"
#include "tag.h" #include "tag.h"
#include "errorhelper.h" #include "errorhelper.h"
#include "format.h"
#include <string.h> #include <string.h>
#include "divecomputer.h" #include "divecomputer.h"
@ -45,7 +46,6 @@ static int seac_dive(void *param, int, char **data, char **)
{ {
int retval = 0, cylnum = 0; int retval = 0, cylnum = 0;
int year, month, day, hour, min, sec, tz; int year, month, day, hour, min, sec, tz;
char isodatetime[30];
time_t divetime; time_t divetime;
struct gasmix lastgas, curgas; struct gasmix lastgas, curgas;
struct parser_state *state = (struct parser_state *)param; struct parser_state *state = (struct parser_state *)param;
@ -123,8 +123,8 @@ static int seac_dive(void *param, int, char **data, char **)
"-13:45", // 40 "-13:45", // 40
"-14:00"}; // 41 "-14:00"}; // 41
sprintf(isodatetime, "%4i-%02i-%02iT%02i:%02i:%02i%6s", year, month, day, hour, min, sec, timezoneoffset[tz]); std::string isodatetime = format_string_std("%4i-%02i-%02iT%02i:%02i:%02i%6s", year, month, day, hour, min, sec, timezoneoffset[tz]);
divetime = get_dive_datetime_from_isostring(isodatetime); divetime = get_dive_datetime_from_isostring(isodatetime.c_str());
state->cur_dive->when = divetime; state->cur_dive->when = divetime;
// 6 = dive_type // 6 = dive_type

View file

@ -917,7 +917,7 @@ QString get_dive_date_string(timestamp_t when)
} }
// Get local seconds since Epoch from ISO formatted UTC date time + offset string // Get local seconds since Epoch from ISO formatted UTC date time + offset string
time_t get_dive_datetime_from_isostring(char *when) { time_t get_dive_datetime_from_isostring(const char *when) {
QDateTime divetime = QDateTime::fromString(when, Qt::ISODate); QDateTime divetime = QDateTime::fromString(when, Qt::ISODate);
return (time_t)(divetime.toSecsSinceEpoch()); return (time_t)(divetime.toSecsSinceEpoch());
} }

View file

@ -111,7 +111,7 @@ std::string local_file_path(const struct picture &picture);
std::string hashfile_name(); std::string hashfile_name();
enum deco_mode decoMode(bool in_planner); enum deco_mode decoMode(bool in_planner);
void parse_seabear_header(const char *filename, struct xml_params *params); void parse_seabear_header(const char *filename, struct xml_params *params);
time_t get_dive_datetime_from_isostring(char *when); time_t get_dive_datetime_from_isostring(const char *when);
void print_qt_versions(); void print_qt_versions();
void lock_planner(); void lock_planner();
void unlock_planner(); void unlock_planner();

View file

@ -399,6 +399,8 @@ Kirigami.Page {
delegate: Flickable { delegate: Flickable {
id: internalScrollView id: internalScrollView
width: diveDetailsListView.width width: diveDetailsListView.width
height: diveDetailsListView.height
contentHeight: diveDetails.height
boundsBehavior: Flickable.StopAtBounds boundsBehavior: Flickable.StopAtBounds
property var modelData: model property var modelData: model
DiveDetailsView { DiveDetailsView {
@ -423,6 +425,7 @@ Kirigami.Page {
anchors.fill: parent anchors.fill: parent
leftMargin: Kirigami.Units.smallSpacing leftMargin: Kirigami.Units.smallSpacing
rightMargin: Kirigami.Units.smallSpacing rightMargin: Kirigami.Units.smallSpacing
contentHeight: detailsEdit.height
// start invisible and scaled down, to get the transition // start invisible and scaled down, to get the transition
// off to the right start // off to the right start
visible: false visible: false

View file

@ -34,7 +34,7 @@ if [[ -z "${CONTAINER_ID}" ]]; then
croak "Please make sure GIT_AUTHOR_NAME and GIT_AUTHOR_EMAIL are set for the first run of this script." croak "Please make sure GIT_AUTHOR_NAME and GIT_AUTHOR_EMAIL are set for the first run of this script."
fi fi
docker create -v ${SUBSURFACE_ROOT}:${CONTAINER_SUBSURFACE_DIR} --name=${CONTAINER_NAME} subsurface/android-build:5.15.2 sleep infinity docker create -v ${SUBSURFACE_ROOT}:${CONTAINER_SUBSURFACE_DIR} --name=${CONTAINER_NAME} subsurface/android-build:5.15.3 sleep infinity
fi fi

View file

@ -13,7 +13,7 @@ set -e
mkdir -p win32 mkdir -p win32
cd win32 cd win32
# build Subsurface and then smtk2ssrf # build Subsurface
export MXEBUILDTYPE=x86_64-w64-mingw32.shared export MXEBUILDTYPE=x86_64-w64-mingw32.shared
bash -ex ../subsurface/packaging/windows/mxe-based-build.sh installer bash -ex ../subsurface/packaging/windows/mxe-based-build.sh installer
@ -23,6 +23,10 @@ mv subsurface/subsurface.exe* ${OUTPUT_DIR}/
fullname=$(cd subsurface ; ls subsurface-*.exe) fullname=$(cd subsurface ; ls subsurface-*.exe)
mv subsurface/"$fullname" ${OUTPUT_DIR}/"${fullname%.exe}-installer.exe" mv subsurface/"$fullname" ${OUTPUT_DIR}/"${fullname%.exe}-installer.exe"
# build Subsurface for smtk2ssrf
bash -ex ../subsurface/packaging/windows/mxe-based-build.sh -noftdi -nolibraw subsurface
bash -ex ../subsurface/packaging/windows/smtk2ssrf-mxe-build.sh -a -i bash -ex ../subsurface/packaging/windows/smtk2ssrf-mxe-build.sh -a -i
# the strange two step move is in order to get predictable names to use # the strange two step move is in order to get predictable names to use

View file

@ -27,12 +27,16 @@
# #
# now you can start the build # now you can start the build
# #
# make libxml2 libxslt libusb1 libzip libssh2 libftdi1 curl qt5 nsis # make libxml2 libxslt libusb1 libzip libssh2 libftdi1 libraw curl qt5 nsis
# #
# (if you intend to build Subsurface without user space FTDI support # (if you intend to build Subsurface without user space FTDI support
# you can drop libftdi1 from that list and start this script with # you can drop libftdi1 from that list and start this script with
# -noftdi ) # -noftdi )
# #
# (if you intend to build Subsurface without libraw support
# you can drop libraw from that list and start this script with
# -nolibraw )
#
# After quite a while (depending on your machine anywhere from 15-20 # After quite a while (depending on your machine anywhere from 15-20
# minutes to several hours) you should have a working MXE install in # minutes to several hours) you should have a working MXE install in
# ~/src/mxe # ~/src/mxe
@ -93,6 +97,13 @@ else
FTDI="ON" FTDI="ON"
fi fi
if [[ "$1" == "-nolibraw" ]] ; then
shift
LIBRAW="OFF"
else
LIBRAW="ON"
fi
# this is run on a rather powerful machine - if you want less # this is run on a rather powerful machine - if you want less
# build parallelism, please change this variable # build parallelism, please change this variable
JOBS="-j4" JOBS="-j4"
@ -292,6 +303,7 @@ cd "$BUILDDIR"/subsurface
-DMAKE_TESTS=OFF \ -DMAKE_TESTS=OFF \
-DBTSUPPORT=ON -DBLESUPPORT=ON \ -DBTSUPPORT=ON -DBLESUPPORT=ON \
-DFTDISUPPORT=$FTDI \ -DFTDISUPPORT=$FTDI \
-DLIBRAW_SUPPORT=$LIBRAW \
-DLIBGIT2_FROM_PKGCONFIG=ON \ -DLIBGIT2_FROM_PKGCONFIG=ON \
"$BASEDIR"/subsurface "$BASEDIR"/subsurface

View file

@ -6,7 +6,7 @@
#include "core/event.h" #include "core/event.h"
class DiveCartesianAxis; class DiveCartesianAxis;
class DivePixmaps; struct DivePixmaps;
struct event; struct event;
struct plot_info; struct plot_info;

View file

@ -20,7 +20,7 @@ class DiveGasPressureItem;
class DiveHeartrateItem; class DiveHeartrateItem;
class DiveMeanDepthItem; class DiveMeanDepthItem;
class DivePercentageItem; class DivePercentageItem;
class DivePixmaps; struct DivePixmaps;
class DivePlannerPointsModel; class DivePlannerPointsModel;
class DiveProfileItem; class DiveProfileItem;
class DiveReportedCeiling; class DiveReportedCeiling;

View file

@ -586,7 +586,7 @@ void ProfileWidget2::contextMenuEvent(QContextMenuEvent *event)
if (DiveEventItem *item = dynamic_cast<DiveEventItem *>(sceneItem)) { if (DiveEventItem *item = dynamic_cast<DiveEventItem *>(sceneItem)) {
m.addAction(tr("Remove event"), [this,item] { removeEvent(item); }); m.addAction(tr("Remove event"), [this,item] { removeEvent(item); });
m.addAction(tr("Hide event"), [this, item] { hideEvent(item); }); m.addAction(tr("Hide event"), [this, item] { hideOneEvent(item); });
m.addAction(tr("Hide events of type '%1'").arg(event_type_name(item->ev)), m.addAction(tr("Hide events of type '%1'").arg(event_type_name(item->ev)),
[this, item] { hideEventType(item); }); [this, item] { hideEventType(item); });
if (item->ev.type == SAMPLE_EVENT_BOOKMARK) if (item->ev.type == SAMPLE_EVENT_BOOKMARK)
@ -678,7 +678,7 @@ void ProfileWidget2::renameCurrentDC()
Command::editDeviceNickname(currentdc, newName); Command::editDeviceNickname(currentdc, newName);
} }
void ProfileWidget2::hideEvent(DiveEventItem *item) void ProfileWidget2::hideOneEvent(DiveEventItem *item)
{ {
if (!d) if (!d)
return; return;

View file

@ -126,7 +126,7 @@ private:
void splitDive(int seconds); void splitDive(int seconds);
void addSetpointChange(int seconds); void addSetpointChange(int seconds);
void removeEvent(DiveEventItem *item); void removeEvent(DiveEventItem *item);
void hideEvent(DiveEventItem *item); void hideOneEvent(DiveEventItem *item);
void hideEventType(DiveEventItem *item); void hideEventType(DiveEventItem *item);
void editName(DiveEventItem *item); void editName(DiveEventItem *item);
void unhideEvents(); void unhideEvents();

View file

@ -5,6 +5,7 @@
#include "core/divelist.h" #include "core/divelist.h"
#include "core/divelog.h" #include "core/divelog.h"
#include "core/event.h" #include "core/event.h"
#include "core/format.h"
#include "core/subsurface-string.h" #include "core/subsurface-string.h"
#include "qt-models/cylindermodel.h" #include "qt-models/cylindermodel.h"
#include "core/metrics.h" // For defaultModelFont(). #include "core/metrics.h" // For defaultModelFont().
@ -1271,13 +1272,12 @@ void DivePlannerPointsModel::computeVariations(std::unique_ptr<struct diveplan>
auto shorter = plan(&ds, plan_copy, dive.get(), dcNr, 1, cache, true, false); auto shorter = plan(&ds, plan_copy, dive.get(), dcNr, 1, cache, true, false);
save.restore(&ds, false); save.restore(&ds, false);
char buf[200]; std::string buf = format_string_std(", %s: %c %d:%02d /%s %c %d:%02d /min", qPrintable(tr("Stop times")),
sprintf(buf, ", %s: %c %d:%02d /%s %c %d:%02d /min", qPrintable(tr("Stop times")),
SIGNED_FRAC_TRIPLET(analyzeVariations(shallower, original, deeper, qPrintable(depth_units)), 60), qPrintable(depth_units), SIGNED_FRAC_TRIPLET(analyzeVariations(shallower, original, deeper, qPrintable(depth_units)), 60), qPrintable(depth_units),
SIGNED_FRAC_TRIPLET(analyzeVariations(shorter, original, longer, qPrintable(time_units)), 60)); SIGNED_FRAC_TRIPLET(analyzeVariations(shorter, original, longer, qPrintable(time_units)), 60));
// By using a signal, we can transport the variations to the main thread. // By using a signal, we can transport the variations to the main thread.
emit variationsComputed(QString(buf)); emit variationsComputed(QString::fromStdString(buf));
#ifdef DEBUG_STOPVAR #ifdef DEBUG_STOPVAR
printf("\n\n"); printf("\n\n");
#endif #endif

View file

@ -148,6 +148,7 @@ cmake -DBTSUPPORT=OFF \
-DNO_DOCS=ON \ -DNO_DOCS=ON \
-DNO_PRINTING=ON \ -DNO_PRINTING=ON \
-DNO_USERMANUAL=ON \ -DNO_USERMANUAL=ON \
-DLIBRAW_SUPPORT=OFF \
-DSUBSURFACE_TARGET_EXECUTABLE=DesktopExecutable \ -DSUBSURFACE_TARGET_EXECUTABLE=DesktopExecutable \
build build
cd build || aborting "Couldn't cd into $SSRF_PATH/build directory" cd build || aborting "Couldn't cd into $SSRF_PATH/build directory"

View file

@ -34,8 +34,6 @@ pkg_config_library(GLIB2 glib-2.0 REQUIRED)
pkg_config_library(LIBGIT2 libgit2 REQUIRED) pkg_config_library(LIBGIT2 libgit2 REQUIRED)
pkg_config_library(LIBMDB libmdb REQUIRED) pkg_config_library(LIBMDB libmdb REQUIRED)
pkg_config_library(LIBDC libdivecomputer REQUIRED) pkg_config_library(LIBDC libdivecomputer REQUIRED)
pkg_config_library(LIBFTDI libftdi1 QUIET)
pkg_config_library(LIBRAW libraw)
find_package(Qt5 REQUIRED COMPONENTS Core find_package(Qt5 REQUIRED COMPONENTS Core
Concurrent Concurrent

View file

@ -27,7 +27,7 @@ function load_scripts()
fileref=document.createElement("link"); fileref=document.createElement("link");
fileref.setAttribute("rel", "stylesheet"); fileref.setAttribute("rel", "stylesheet");
fileref.setAttribute("type", "text/css"); fileref.setAttribute("type", "text/css");
fileref.setAttribute("href", location.pathname + "_files/jquery.jqplot.css"); fileref.setAttribute("href", location.pathname + "_files/jquery.jqplot.min.css");
document.getElementsByTagName("head")[0].appendChild(fileref); document.getElementsByTagName("head")[0].appendChild(fileref);
fileref=document.createElement('script'); fileref=document.createElement('script');

Binary file not shown.

View file

@ -1,57 +0,0 @@
/**
* jqPlot
* Pure JavaScript plotting plugin using jQuery
*
* Version: 1.0.0r1095
*
* Copyright (c) 2009-2011 Chris Leonello
* jqPlot is currently available for use in all personal or commercial projects
* under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL
* version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can
* choose the license that best suits your project and use it accordingly.
*
* Although not required, the author would appreciate an email letting him
* know of any substantial use of jqPlot. You can reach the author at:
* chris at jqplot dot com or see http://www.jqplot.com/info.php .
*
* If you are feeling kind and generous, consider supporting the project by
* making a donation at: http://www.jqplot.com/donate.php .
*
* sprintf functions contained in jqplot.sprintf.js by Ash Searle:
*
* version 2007.04.27
* author Ash Searle
* http://hexmen.com/blog/2007/03/printf-sprintf/
* http://hexmen.com/js/sprintf.js
* The author (Ash Searle) has placed this code in the public domain:
* "This code is unrestricted: you are free to use it however you like."
*
* included jsDate library by Chris Leonello:
*
* Copyright (c) 2010-2011 Chris Leonello
*
* jsDate is currently available for use in all personal or commercial projects
* under both the MIT and GPL version 2.0 licenses. This means that you can
* choose the license that best suits your project and use it accordingly.
*
* jsDate borrows many concepts and ideas from the Date Instance
* Methods by Ken Snyder along with some parts of Ken's actual code.
*
* Ken's origianl Date Instance Methods and copyright notice:
*
* Ken Snyder (ken d snyder at gmail dot com)
* 2008-09-10
* version 2.0.2 (http://kendsnyder.com/sandbox/date/)
* Creative Commons Attribution License 3.0 (http://creativecommons.org/licenses/by/3.0/)
*
* jqplotToImage function based on Larry Siden's export-jqplot-to-png.js.
* Larry has generously given permission to adapt his code for inclusion
* into jqPlot.
*
* Larry's original code can be found here:
*
* https://github.com/lsiden/export-jqplot-to-png
*
*
*/
(function(a){a.jqplot.CanvasAxisTickRenderer=function(b){this.mark="outside";this.showMark=true;this.showGridline=true;this.isMinorTick=false;this.angle=0;this.markSize=4;this.show=true;this.showLabel=true;this.labelPosition="auto";this.label="";this.value=null;this._styles={};this.formatter=a.jqplot.DefaultTickFormatter;this.formatString="";this.prefix="";this.fontFamily='"Trebuchet MS", Arial, Helvetica, sans-serif';this.fontSize="10pt";this.fontWeight="normal";this.fontStretch=1;this.textColor="#666666";this.enableFontSupport=true;this.pt2px=null;this._elem;this._ctx;this._plotWidth;this._plotHeight;this._plotDimensions={height:null,width:null};a.extend(true,this,b);var c={fontSize:this.fontSize,fontWeight:this.fontWeight,fontStretch:this.fontStretch,fillStyle:this.textColor,angle:this.getAngleRad(),fontFamily:this.fontFamily};if(this.pt2px){c.pt2px=this.pt2px}if(this.enableFontSupport){if(a.jqplot.support_canvas_text()){this._textRenderer=new a.jqplot.CanvasFontRenderer(c)}else{this._textRenderer=new a.jqplot.CanvasTextRenderer(c)}}else{this._textRenderer=new a.jqplot.CanvasTextRenderer(c)}};a.jqplot.CanvasAxisTickRenderer.prototype.init=function(b){a.extend(true,this,b);this._textRenderer.init({fontSize:this.fontSize,fontWeight:this.fontWeight,fontStretch:this.fontStretch,fillStyle:this.textColor,angle:this.getAngleRad(),fontFamily:this.fontFamily})};a.jqplot.CanvasAxisTickRenderer.prototype.getWidth=function(d){if(this._elem){return this._elem.outerWidth(true)}else{var f=this._textRenderer;var c=f.getWidth(d);var e=f.getHeight(d);var b=Math.abs(Math.sin(f.angle)*e)+Math.abs(Math.cos(f.angle)*c);return b}};a.jqplot.CanvasAxisTickRenderer.prototype.getHeight=function(d){if(this._elem){return this._elem.outerHeight(true)}else{var f=this._textRenderer;var c=f.getWidth(d);var e=f.getHeight(d);var b=Math.abs(Math.cos(f.angle)*e)+Math.abs(Math.sin(f.angle)*c);return b}};a.jqplot.CanvasAxisTickRenderer.prototype.getAngleRad=function(){var b=this.angle*Math.PI/180;return b};a.jqplot.CanvasAxisTickRenderer.prototype.setTick=function(b,d,c){this.value=b;if(c){this.isMinorTick=true}return this};a.jqplot.CanvasAxisTickRenderer.prototype.draw=function(c,f){if(!this.label){this.label=this.prefix+this.formatter(this.formatString,this.value)}if(this._elem){if(a.jqplot.use_excanvas&&window.G_vmlCanvasManager.uninitElement!==undefined){window.G_vmlCanvasManager.uninitElement(this._elem.get(0))}this._elem.emptyForce();this._elem=null}var e=f.canvasManager.getCanvas();this._textRenderer.setText(this.label,c);var b=this.getWidth(c);var d=this.getHeight(c);e.width=b;e.height=d;e.style.width=b;e.style.height=d;e.style.textAlign="left";e.style.position="absolute";e=f.canvasManager.initCanvas(e);this._elem=a(e);this._elem.css(this._styles);this._elem.addClass("jqplot-"+this.axis+"-tick");e=null;return this._elem};a.jqplot.CanvasAxisTickRenderer.prototype.pack=function(){this._textRenderer.draw(this._elem.get(0).getContext("2d"),this.label)}})(jQuery);

Binary file not shown.

File diff suppressed because one or more lines are too long

BIN
theme/jqplot.highlighter.js Normal file

Binary file not shown.

File diff suppressed because one or more lines are too long

View file

@ -1,259 +0,0 @@
/*rules for the plot target div. These will be cascaded down to all plot elements according to css rules*/
.jqplot-target {
position: relative;
color: #666666;
font-family: "Trebuchet MS", Arial, Helvetica, sans-serif;
font-size: 1em;
/* height: 300px;
width: 400px;*/
}
/*rules applied to all axes*/
.jqplot-axis {
font-size: 0.75em;
}
.jqplot-xaxis {
margin-top: 10px;
}
.jqplot-x2axis {
margin-bottom: 10px;
}
.jqplot-yaxis {
margin-right: 10px;
}
.jqplot-y2axis, .jqplot-y3axis, .jqplot-y4axis, .jqplot-y5axis, .jqplot-y6axis, .jqplot-y7axis, .jqplot-y8axis, .jqplot-y9axis, .jqplot-yMidAxis {
margin-left: 10px;
margin-right: 10px;
}
/*rules applied to all axis tick divs*/
.jqplot-axis-tick, .jqplot-xaxis-tick, .jqplot-yaxis-tick, .jqplot-x2axis-tick, .jqplot-y2axis-tick, .jqplot-y3axis-tick, .jqplot-y4axis-tick, .jqplot-y5axis-tick, .jqplot-y6axis-tick, .jqplot-y7axis-tick, .jqplot-y8axis-tick, .jqplot-y9axis-tick, .jqplot-yMidAxis-tick {
position: absolute;
white-space: pre;
}
.jqplot-xaxis-tick {
top: 0px;
/* initial position untill tick is drawn in proper place */
left: 15px;
/* padding-top: 10px;*/
vertical-align: top;
}
.jqplot-x2axis-tick {
bottom: 0px;
/* initial position untill tick is drawn in proper place */
left: 15px;
/* padding-bottom: 10px;*/
vertical-align: bottom;
}
.jqplot-yaxis-tick {
right: 0px;
/* initial position untill tick is drawn in proper place */
top: 15px;
/* padding-right: 10px;*/
text-align: right;
}
.jqplot-yaxis-tick.jqplot-breakTick {
right: -20px;
margin-right: 0px;
padding:1px 5px 1px 5px;
/* background-color: white;*/
z-index: 2;
font-size: 1.5em;
}
.jqplot-y2axis-tick, .jqplot-y3axis-tick, .jqplot-y4axis-tick, .jqplot-y5axis-tick, .jqplot-y6axis-tick, .jqplot-y7axis-tick, .jqplot-y8axis-tick, .jqplot-y9axis-tick {
left: 0px;
/* initial position untill tick is drawn in proper place */
top: 15px;
/* padding-left: 10px;*/
/* padding-right: 15px;*/
text-align: left;
}
.jqplot-yMidAxis-tick {
text-align: center;
white-space: nowrap;
}
.jqplot-xaxis-label {
margin-top: 10px;
font-size: 11pt;
position: absolute;
}
.jqplot-x2axis-label {
margin-bottom: 10px;
font-size: 11pt;
position: absolute;
}
.jqplot-yaxis-label {
margin-right: 10px;
/* text-align: center;*/
font-size: 11pt;
position: absolute;
}
.jqplot-yMidAxis-label {
font-size: 11pt;
position: absolute;
}
.jqplot-y2axis-label, .jqplot-y3axis-label, .jqplot-y4axis-label, .jqplot-y5axis-label, .jqplot-y6axis-label, .jqplot-y7axis-label, .jqplot-y8axis-label, .jqplot-y9axis-label {
/* text-align: center;*/
font-size: 11pt;
margin-left: 10px;
position: absolute;
}
.jqplot-meterGauge-tick {
font-size: 0.75em;
color: #999999;
}
.jqplot-meterGauge-label {
font-size: 1em;
color: #999999;
}
table.jqplot-table-legend {
margin-top: 12px;
margin-bottom: 12px;
margin-left: 12px;
margin-right: 12px;
}
table.jqplot-table-legend, table.jqplot-cursor-legend {
background-color: rgba(255,255,255,0.6);
border: 1px solid #cccccc;
position: absolute;
font-size: 0.75em;
}
td.jqplot-table-legend {
vertical-align:middle;
}
/*
These rules could be used instead of assigning
element styles and relying on js object properties.
*/
/*
td.jqplot-table-legend-swatch {
padding-top: 0.5em;
text-align: center;
}
tr.jqplot-table-legend:first td.jqplot-table-legend-swatch {
padding-top: 0px;
}
*/
td.jqplot-seriesToggle:hover, td.jqplot-seriesToggle:active {
cursor: pointer;
}
.jqplot-table-legend .jqplot-series-hidden {
text-decoration: line-through;
}
div.jqplot-table-legend-swatch-outline {
border: 1px solid #cccccc;
padding:1px;
}
div.jqplot-table-legend-swatch {
width:0px;
height:0px;
border-top-width: 5px;
border-bottom-width: 5px;
border-left-width: 6px;
border-right-width: 6px;
border-top-style: solid;
border-bottom-style: solid;
border-left-style: solid;
border-right-style: solid;
}
.jqplot-title {
top: 0px;
left: 0px;
padding-bottom: 0.5em;
font-size: 1.2em;
}
table.jqplot-cursor-tooltip {
border: 1px solid #cccccc;
font-size: 0.75em;
}
.jqplot-cursor-tooltip {
border: 1px solid #cccccc;
font-size: 0.75em;
white-space: nowrap;
background: rgba(208,208,208,0.5);
padding: 1px;
}
.jqplot-highlighter-tooltip, .jqplot-canvasOverlay-tooltip {
border: 1px solid #cccccc;
font-size: 0.75em;
white-space: nowrap;
background: rgba(208,208,208,0.9);
padding: 1px;
}
.jqplot-point-label {
font-size: 0.75em;
z-index: 2;
}
td.jqplot-cursor-legend-swatch {
vertical-align: middle;
text-align: center;
}
div.jqplot-cursor-legend-swatch {
width: 1.2em;
height: 0.7em;
}
.jqplot-error {
/* Styles added to the plot target container when there is an error go here.*/
text-align: center;
}
.jqplot-error-message {
/* Styling of the custom error message div goes here.*/
position: relative;
top: 46%;
display: inline-block;
}
div.jqplot-bubble-label {
font-size: 0.8em;
/* background: rgba(90%, 90%, 90%, 0.15);*/
padding-left: 2px;
padding-right: 2px;
color: rgb(20%, 20%, 20%);
}
div.jqplot-bubble-label.jqplot-bubble-label-highlight {
background: rgba(90%, 90%, 90%, 0.7);
}
div.jqplot-noData-container {
text-align: center;
background-color: rgba(96%, 96%, 96%, 0.3);
}

1
theme/jquery.jqplot.min.css vendored Normal file
View file

@ -0,0 +1 @@
.jqplot-xaxis,.jqplot-xaxis-label{margin-top:10px}.jqplot-x2axis,.jqplot-x2axis-label{margin-bottom:10px}.jqplot-target{position:relative;color:#666;font-family:"Trebuchet MS",Arial,Helvetica,sans-serif;font-size:1em}.jqplot-axis{font-size:.75em}.jqplot-yaxis{margin-right:10px}.jqplot-y2axis,.jqplot-y3axis,.jqplot-y4axis,.jqplot-y5axis,.jqplot-y6axis,.jqplot-y7axis,.jqplot-y8axis,.jqplot-y9axis,.jqplot-yMidAxis{margin-left:10px;margin-right:10px}.jqplot-axis-tick,.jqplot-x2axis-tick,.jqplot-xaxis-tick,.jqplot-y2axis-tick,.jqplot-y3axis-tick,.jqplot-y4axis-tick,.jqplot-y5axis-tick,.jqplot-y6axis-tick,.jqplot-y7axis-tick,.jqplot-y8axis-tick,.jqplot-y9axis-tick,.jqplot-yMidAxis-tick,.jqplot-yaxis-tick{position:absolute;white-space:pre}.jqplot-xaxis-tick{top:0;left:15px;vertical-align:top}.jqplot-x2axis-tick{bottom:0;left:15px;vertical-align:bottom}.jqplot-yaxis-tick{right:0;top:15px;text-align:right}.jqplot-yaxis-tick.jqplot-breakTick{right:-20px;margin-right:0;padding:1px 5px;z-index:2;font-size:1.5em}.jqplot-x2axis-label,.jqplot-xaxis-label,.jqplot-yMidAxis-label,.jqplot-yaxis-label{font-size:11pt;position:absolute}.jqplot-y2axis-tick,.jqplot-y3axis-tick,.jqplot-y4axis-tick,.jqplot-y5axis-tick,.jqplot-y6axis-tick,.jqplot-y7axis-tick,.jqplot-y8axis-tick,.jqplot-y9axis-tick{left:0;top:15px;text-align:left}.jqplot-yMidAxis-tick{text-align:center;white-space:nowrap}.jqplot-yaxis-label{margin-right:10px}.jqplot-y2axis-label,.jqplot-y3axis-label,.jqplot-y4axis-label,.jqplot-y5axis-label,.jqplot-y6axis-label,.jqplot-y7axis-label,.jqplot-y8axis-label,.jqplot-y9axis-label{font-size:11pt;margin-left:10px;position:absolute}.jqplot-meterGauge-tick{font-size:.75em;color:#999}.jqplot-meterGauge-label{font-size:1em;color:#999}table.jqplot-table-legend{margin:12px}table.jqplot-cursor-legend,table.jqplot-table-legend{background-color:rgba(255,255,255,.6);border:1px solid #ccc;position:absolute;font-size:.75em}td.jqplot-table-legend{vertical-align:middle}td.jqplot-seriesToggle:active,td.jqplot-seriesToggle:hover{cursor:pointer}.jqplot-table-legend .jqplot-series-hidden{text-decoration:line-through}div.jqplot-table-legend-swatch-outline{border:1px solid #ccc;padding:1px}div.jqplot-table-legend-swatch{width:0;height:0;border-width:5px 6px;border-style:solid}.jqplot-title{top:0;left:0;padding-bottom:.5em;font-size:1.2em}table.jqplot-cursor-tooltip{border:1px solid #ccc;font-size:.75em}.jqplot-canvasOverlay-tooltip,.jqplot-cursor-tooltip,.jqplot-highlighter-tooltip{border:1px solid #ccc;font-size:.75em;white-space:nowrap;background:rgba(208,208,208,.5);padding:1px}.jqplot-point-label{font-size:.75em;z-index:2}td.jqplot-cursor-legend-swatch{vertical-align:middle;text-align:center}div.jqplot-cursor-legend-swatch{width:1.2em;height:.7em}.jqplot-error{text-align:center}.jqplot-error-message{position:relative;top:46%;display:inline-block}div.jqplot-bubble-label{font-size:.8em;padding-left:2px;padding-right:2px;color:rgb(20%,20%,20%)}div.jqplot-bubble-label.jqplot-bubble-label-highlight{background:rgba(90%,90%,90%,.7)}div.jqplot-noData-container{text-align:center;background-color:rgba(96%,96%,96%,.3)}

Binary file not shown.

BIN
theme/jquery.min.js vendored

Binary file not shown.