Compare commits

..

3 Commits

Author SHA1 Message Date
Eric Murray
b87aab0302 fix manual ride entry crash when no zones file
This is a partial patch based on code from Eric Murray.  It changes just
enough of ManyalRideDialog to fix a crash that otherwise occurs when the
user doesn't have a zones file.
2009-09-19 09:22:42 -07:00
Mark Liversedge
ecdc2288ff Optional padding data with value 0x8012 discovered 2009-09-12 21:30:17 -04:00
Berend De Schouwer
04bb484f8e SplitRide altitude matches CSV2 2009-09-12 21:30:09 -04:00
666 changed files with 6883 additions and 286473 deletions

4
.gitignore vendored
View File

@@ -1,8 +1,6 @@
Makefile
# old skool
.svn
# osx noise
.DS_Store
profile
profile

View File

@@ -1,3 +0,0 @@
TEMPLATE = subdirs
SUBDIRS = qwt src
CONFIG += ordered

Binary file not shown.

Before

Width:  |  Height:  |  Size: 122 KiB

View File

@@ -2,16 +2,12 @@
CONTENT=$(wildcard *.content)
HTML=$(subst .content,.html,$(CONTENT))
TARBALLS=$(wildcard gc_*.tgz)
OTHER= 3d.png choose-a-cyclist.png cpint.gp cpint.png critical-power-plot.png critical-power.png \
cyclist-info.png editor.png gui-preview.png histogram-analysis.png logo.jpg logo.png \
main-window.png map.png metrics-power.png metrics-timedist.png metrics-tiz.png pf-pv-plot.png \
pm.png power.zones realtime.png ride-plot.png ride-plot2.png ride-summary.png sample.gp \
sample.png weekly-summary.png google-earth.png aerolab.png
BIN= GoldenCheetah_2.0.0_Linux_x86_64.gz \
GoldenCheetah_2.0.0_Linux_x86.gz \
GoldenCheetah_2.0.0_Mac_Universal.dmg \
GoldenCheetah_2.0.0_Windows_Installer.exe
OTHER=logo.jpg sample.gp sample.png cpint.gp cpint.png \
screenshot-summary.png screenshot-plot.png \
screenshot-cpint.png screenshot-phist.png \
screenshot-download.png screenshot-weekly.png \
choose-a-cyclist.png main-window.png critical-power.png \
power.zones
all: $(HTML)
.PHONY: all clean install
@@ -21,14 +17,7 @@ clean:
install:
rsync -avz -e ssh $(HTML) $(TARBALLS) $(OTHER) \
liversedge@srhea.net:/home/srhea/wwwroot/goldencheetah.org/
install-bin:
rsync -avz -e ssh $(BIN) \
srhea.net:/home/srhea/wwwroot/goldencheetah.org/
bug-tracker.html: bug-tracker.content genpage.pl
./genpage.pl "Bug Tracker" $< > $@
srhea.net:wwwroot/goldencheetah.org/
command-line.html: command-line.content genpage.pl
./genpage.pl "Legacy Command-Line Tools" $< > $@
@@ -39,18 +28,9 @@ contact.html: contact.content genpage.pl
contrib.html: contrib.content genpage.pl
./genpage.pl "Contributors" $< > $@
developers-guide.html: developers-guide.content genpage.pl
./genpage.pl "Developer's Guide" $< > $@
older-releases.html: older-releases.content genpage.pl
./genpage.pl "Older Releases" $< > $@
download.html: download.content genpage.pl
./genpage.pl "Download" $< > $@
release-notes.html: release-notes.content genpage.pl
./genpage.pl "Release Notes" $< > $@
faq.html: faq.content genpage.pl
./genpage.pl "Frequently Asked Questions" $< > $@
@@ -60,9 +40,6 @@ index.html: index.content genpage.pl
license.html: license.content genpage.pl
./genpage.pl "License" $< > $@
mailing-list.html: mailing-list.content genpage.pl
./genpage.pl "Mailing Lists" $< > $@
screenshots.html: screenshots.content genpage.pl
./genpage.pl "Screenshots" $< > $@

Binary file not shown.

Before

Width:  |  Height:  |  Size: 48 KiB

View File

@@ -1,97 +0,0 @@
<p>We have an issue tracker set up at
<a href=http://bugs.goldencheetah.org/projects/show/goldencheetah>
bugs.goldencheetah.org</a>. Below are some guidelines for users and
developers for working with the issue tracker.</p>
<big><font face="arial,helvetica,sanserif">
Report a new bug/feature
</font></big>
<p> If you think that you have found a bug in GoldenCheetah or would like
to request a new feature please report it by filing a new issue at our <a
href=http://bugs.goldencheetah.org/projects/show/goldencheetah>issue
tracker</a>. To report a bug/feature request go to the above link and
follow these steps:
<ol>
<li>Login or register for a new account.</li>
<li>Click the "new issue" link near the top of the page.</li>
<li>Select either "bug" or "feature" from the tracker drop-down menu.</li>
<li>Fill out the form including as much detail as possible.<br>
You can upload crashreports, problem files, or screenshots if they
help document the issue.</li>
<li>Click the create button to save your report.<br>
This will also send a copy of your report to the Golden-Cheetah-Users
mailing list.</li>
</ol>
<p>Thanks for helping to improve GoldenCheetah.</p>
<big><font face="arial,helvetica,sanserif">
Managing issues in the tracker
</font></big>
<p>To make it easier for all of us to track the status please try to
adhere to a few simple guidelines listed below.</p>
<font face="arial,helvetica,sanserif">
<b>Issue Status:</b>
</font>
<p>Depending on your account status (non-member, reporter, developer, or
manager) you may be able to update the status of an existing issue. When
working in the bug tracker please update the status appropriately.
Current status options are:</p>
<ul>
<li>New: Default status.
<li>Assigned: issue has been assigned to someone on the project. If you
are a Developer you can assign an issue to someone, including
yourself. If you are working on a fix, please change the status to
Assigned, and post a message stating your plan of attack etc.
<li>Feedback: This could be used to alert others that you have a
proposed fix that you want feed back on. Please attach patches and
make a note. Also remember to tag the issue in your patches.
<li>Resolved: The issue has been corrected. People that have tested the
patch or that submitted the bug should update to this status when
they feel that it has been fixed. If it turns out that it was not
resolved, most users can change the status back to "feedback". If
you do so, please leave a note.
<li>Tempfix: A workaround for the issue has been posted, but we may still be
working on a more long term solution.
<li>Closed: Those with commit access to Github are the only ones that
can mark an issue as closed. That said, if you are submitting a
patch that fixes and issue, please include the "fixes #<issuenum>"
tag to your commit as this will automatically close the issue when your
patch is accepted and pushed to github.
</ul>
<font face="arial,helvetica,sanserif">
<b>Tagging in messages</b>
</font>
<p>The tracker has a very basic tagging and markup scheme that is described in
detail <a href="http://bugs.goldencheetah.org/help/wiki_syntax.html">here</a>.
Perhaps the most useful feature is the ability to use tags to link issues,
commits, etc. When commenting on an issue please use the following tags
when appropriate to automatically create links when:</p>
<table align="center" width="600">
<tr>
<th>Tag</th>
<th>Effect</th>
</tr>
<tr>
<td>Issue #2</td>
<td>Creates a link to existing Issue #2</td>
</tr>
<tr>
<td>commit:e76247a</td>
<td>Creates a link to commit e76247a</td>
</tr>
<tr>
<td>source:src/MainWindow.cpp</td>
<td>Creates a link to src/Mainwindow.cpp in our git repo</td>
</tr>
</table>

View File

@@ -1,61 +1,32 @@
<!-- $Id: contrib.content,v 1.4 2006/09/06 04:07:18 srhea Exp $ -->
<p>Sean Rhea bought a PowerTap Pro on April 20, 2006 and immediately set
to figuring out how to use it from his Mac without using Virtual PC.
With help from Russ Cox and David Easter, he wrote two command-line
programs for downloading data from a PowerTap and interpreting that
data. Sean released these two tools, <code>ptdl</code> and
<code>ptunpk</code>, on May 4, 2006.</p>
Sean Rhea bought a PowerTap Pro on April 20, 2006, and immediately set to
figuring out how to use it from his Mac Powerbook without using Virtual PC.
Within a week, he was able to download the raw data. Shortly thereafter, Russ
Cox asked what he was up to, and the two worked together to figure out the
packing format used. By May 4, they could reproduce the numbers given by the
PowerTap software except for minor discrepancies in the time values. David
Easter then pointed out how the checksum bytes in the download protocol were
used, and Sean Rhea coded up their combined discoveries into the two
utilities, <code>ptdl</code> and <code>ptunpk</code>.
<p>Later that year, Sean needed to learn QT for his real job, and he set
about writing a graphical version of his software for practice. He
released the first graphical version on September 6, 2006, changing the
name to GoldenCheetah in reference to an old legend from his days as a
runner.</p>
<p>
Later that year, Sean needed to learn QT for his real job, and he set about
writing a graphical version of <code>ptdl</code> and <code>ptunpk</code> for
practice. He released the first graphical version on September 6, 2006,
changing the name to GoldenCheetah in reference to an old legend from his days
as a runner.
<p>Since then, a large community has contributed additional code and
other support, including:</p>
<table width="80%">
<tr>
<td valign="top" width="33%">
<ul>
<li>Robert Carlsen</li>
<li>Rainer Clasen</li>
<li>Chris Cleeland</li>
<li>J.T. Conklin</li>
<li>Dan Connelly</li>
<li>Damien Grauser</li>
<li>Steve Gribble</li>
<li>Dag Gruneau</li>
<li>Ned Harding</li>
</ul>
</td>
<td valign="top" width="33%">
<ul>
<li>Aldy Hernandez</li>
<li>Jamie Kimberley</li>
<li>Justin Knotzke</li>
<li>Andrew Kruse</li>
<li>Mark Liversedge</li>
<li>Greg Lonnon</li>
<li>Tom Montgomery</li>
<li>Eric Murray</li>
<li>Scott Overfield</li>
</ul>
</td>
<td valign="top">
<ul>
<li>Mark Rages</li>
<li>Robb Romans</li>
<li>Mitsukuni Sato</li>
<li>Berend de Schouwer</li>
<li>Julian Simioni</li>
<li>Greg Steele</li>
<li>Tom Weichmann</li>
<li>Keisuke Yamaguchi</li>
</ul>
</td>
</tr>
</table>
<p>
Since then, a number of others have helped out in various ways.
Robert Carlsen helped get the serial port version of the PowerTap Pro working
with the Keyspan USB-to-serial adaptor. Robert also figured out how to build
universal binaries for Mac OS X. Scott Overfield helped figure out
that we should be using the <code>/dev/cu.*</code> devices instead of the
<code>/dev/tty.*</code> ones. Aldy Hernandez and Andrew Kruse helped get
things working under Linux.
Dan Connelly helped find and fix several core dumps.
Justin Knotzke contributed code to import comma-separated value files
and visually mark intervals on the ride plot. J.T. Conklin added the ability
to import TCX files. J.T. also added a pedal force vs. pedal velocity chart. Tom Montgomery added IBike 3 support and cleaned up the Import CSV tool, adding the default ride date when importing new files. Ned Harding resurrected the Windows builds of Golden Cheetah (fixing USB download inconsistencies in the process), then added slew of functions including the long-desired Split Ride feature. (available in version 1.0.305+).

Binary file not shown.

Before

Width:  |  Height:  |  Size: 139 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 195 KiB

View File

@@ -1,566 +0,0 @@
<!-- $Id: users-guide.content,v 1.5 2006/05/27 16:32:46 srhea Exp $ -->
<p>This guide will teach you how to download the GoldenCheetah source code,
build it, modify it, and submit your changes to be included in the next
release. If you're just looking to use GoldenCheetah, please check out the
<a href="users-guide.html">Users Guide</a> or the
<a href="download.html">Download Page</a>.</p>
<big><font face="arial,helvetica,sanserif">
Installing dependencies
</font></big>
<p>GC requires a number of libraries. On Mac OS X, you can get most of these
through <a href="http://www.macports.org/">Mac Ports</a>. On Linux and other
Unixes, you can use whatever package manager your distribution provides. (We
list the package names for MacPorts and Ubuntu below.) On Windows, you'll
probably need to download and install everything by hand. You might also want
to read <a href="old-mailing-list-archives/2009-September/002502.html">this
mailing list message</a>.</p>
<p>You'll need the following:</p>
<table align="center" width="500">
<tr>
<td>Package</td>
<td>Version</td>
<td>MacPorts</td>
<td>Ubuntu</td>
</tr>
<tr>
<td><a href="http://qt.nokia.com/downloads">Qt</a></td>
<td>4.6.0 or later</td>
<td>qt4-mac</td>
<td>libqt4-dev</td>
</tr>
<tr>
<td><a href="http://www.boost.org/users/download/">Boost</a></td>
<td>1.38.0 or later</td>
<td>boost</td>
<td>libboost-dev</td>
</tr>
<tr>
<td><a href="http://git-scm.com/download">git</a></td>
<td>any</td>
<td>git-core</td>
<td>git</td>
</tr>
</table>
<p>If you're going to download directly from a PowerTap, you might need to
install the <a href="http://www.ftdichip.com/Drivers/D2XX.htm">FTDI USB
driver</a>. If you're going to download directly from an SRM, you need to
download and install <a href="git://github.com/rclasen/srmio.git">libsrmio</a>.
Neither of these libraries is required if you just want to import data you've
already downloaded with another program.</p>
<big><font face="arial,helvetica,sanserif">
Checking out the code
</font></big>
<p>Once you've downloaded and installed the above dependencies, you need to
check out the GC source code. GC uses <em>git</em> for version control. To
checkout the code, execute this command:</p>
<blockquote>
<pre>
git clone git://github.com/srhea/GoldenCheetah.git
</pre>
</blockquote>
<p>That should create a new directory, <code>GoldenCheetah</code>, in your
current working directory. In the rest of this document, we'll reference
paths relative to that directory. You can find the source code in
<code>GoldenCheetah/src</code>, for instance. Likewise, this
document is in <code>GoldenCheetah/doc/developers-guide.content</code>.<p>
<big><font face="arial,helvetica,sanserif">
Building an executable
</font></big>
<p>To build GC, we currently use <em>qmake</em>, which comes with the Qt
libraries referenced above. All local configuration is stored in the file
<code>gcconfig.pri</code>, which you create by copying
<code>gcconfig.pri.in</code>, both in the <code>GoldenCheetah/src</code>
directory. Additionally, GoldenCheetah uses a patched version of <a
href="http://sourceforge.net/projects/qwt/">Qwt</a> which is located in the
<code>GoldenCheetah/qwt</code> directory. You'll need to copy the
configuration file <code>qwtconfig.pri.in</code> to <code>qwtconfig.pri</code>
and edit that file if needed. The steps you'll take are as follows:</p>
<blockquote>
In the top level GoldenCheetah directory
<pre>
cp src/gcconfig.pri.in src/gcconfig.pri
cp qwt/qwtconfig.pri.in qwt/qwtconfig.pri
vi src/gcconfig.pri # Follow the directions at the top of the file.
vi qwt/qwtconfig.pri # This may not need to be edited to successfully build.
qmake build.pro # called qmake-mac in MacPorts
make
</pre>
</blockquote>
<p>We're aware that a lot of people would rather use a configure-like script
for the build process. We would too, but none of us know
<a href="http://www.gnu.org/software/autoconf/">autoconf</a> well
enough to integrate it with Qt on Mac, Linux, and Windows. If you can help
us out with that, please email the
<a href="cgi-bin/mailman/listinfo/golden-cheetah-users">GoldenCheetah User's
Mailing List</a>.</p>
<big><font face="arial,helvetica,sanserif">
Making changes
</font></big>
<p>Now that you've got GC up and running, you can add whatever features you want.
We generally frown on dogmatic coding conventions, and we're big fans of the
"rough consensus and running code" philosophy. That said, please do your best
to adhere to the following style guidelines:</p>
<ul>
<li>Use spaces instead of tabs.
<li>Do not end lines with whitespace. End every file with a newline.
Otherwise git becomes angry. This command will
highlight any whitespace problems in commit <em>abcd0123</em> in red:
<blockquote>
<pre>
git show --color abcd0123
</pre>
</blockquote>
<li>Avoid "using namespace ..." in header files.
<li>Don't declare global variables in header files. If you must use a global
variable, declare it <code>static</code> within a .cpp file.
<li>Only call C++'s operator <code>new</code> within the constructors and
<code>reset</code> functions of <code>std::auto_ptr</code>,
<code>boost::scoped_pointer</code>, etc. or when passing a parent pointer to a
Qt class (so that the parent deletes the child). Never call
<code>delete</code> explicitly.
<li>Do not use <code>malloc</code> or <code>free</code> unless forced to by an
external C library.
<li>Allocate large buffers on the heap, not on the stack.
<li>When the C++ standard library has an appropriate function, use it.
Likewise for Qt and Boost.
<li>Only use external libraries with GPL-compatible licenses.
<li>Avoid C-style casts. Learn and use C++'s <code>static_cast</code>,
<code>reinterpret_cast</code>, etc.
</ul>
<p>Not all of the GoldenCheetah code follows these guidelines today, but we're
working on it. You can help out by adhering to them in new code.</p>
<hr width="20%"/>
<p>At some point, you'll probably decide that a change you've made is worth
sharing with others. You'll use <em>git</em> again to share your changes, and
the following sections will show you how. A warning: git is pretty hard to
learn, but it's worth it. Once you get used to it, you'll be surprised you
ever put up with another revision control system.</p>
<big><font face="arial,helvetica,sanserif">
Committing changes to git
</font></big>
<p> An example will make this section more concrete. Since my SRM doesn't
record altitude, let's say that I get annoyed that the Ride Summary always
shows "Elevation Gain (feet): 0.0", so I change the code not to show any ride
metric whose value is zero. <em>git-diff</em> shows exactly what I've
changed:</p>
<blockquote>
<pre>
$ cd GoldenCheetah/src
$ git diff
diff --git a/src/RideItem.cpp b/src/RideItem.cpp
index 6971b9b..c368725 100644
--- a/src/RideItem.cpp
+++ b/src/RideItem.cpp
@@ -362,6 +362,8 @@ RideItem::htmlSummary()
assert(displayName.length() &gt; 0);
const RideMetric *m = metrics.value(name);
assert(m);
+ if (m-&gt;value(false) == 0.0)
+ continue;
if (m-&gt;units(metricUnits) == "seconds") {
QString s("&lt;tr&gt;&lt;td&gt;%1:&lt;/td&gt;&lt;td "
"align=\"right\"&gt;%2&lt;/td&gt;&lt;/tr&gt;");
</pre>
</blockquote>
<p>In order to share this change, I need to use <em>git-commit</em>:</p>
<blockquote>
<pre>
$ git commit RideItem.cpp
</pre>
</blockquote>
<p>git will open up an editor for me to type a commit message. It's important
to take the time to write good commit messages, as they form a history of who
has changed which lines of code and for what purpose. The first line of every
commit message should be a short description of 50 characters or less. The
second line should be blank. Subsequent lines should be less than 80
characters long and should describe the change in detail. If your commit
addresses an existing bug or feature please add a tag to the body of your
commit message. Allowable tags are "fixes" which is used to close an
issue and "refs" to reference an issue. For example, adding the text
"fixes #2" will close issue #2. Once I write the file and exit the
editor, <em>git-log</em> will show the result:</p>
<blockquote>
<pre>
$ git log -p -1
commit 30303ef2d11f4bead0860b969b4b74814053b76b
Author: Sean Rhea &lt;sean.c.rhea@gmail.com&gt;
Date: Wed Sep 2 21:04:33 2009 -0400
don't include zero metrics in ride summary
When a device doesn't have altitude, there's no reason to show it. Likewise
with heart rate if the user wasn't wearing a heart rate monitor during a ride.
Maybe in the future this behavior could be enabled on a per-metric basis.
diff --git a/src/RideItem.cpp b/src/RideItem.cpp
index 6971b9b..c368725 100644
--- a/src/RideItem.cpp
+++ b/src/RideItem.cpp
@@ -362,6 +362,8 @@ RideItem::htmlSummary()
assert(displayName.length() &gt; 0);
const RideMetric *m = metrics.value(name);
assert(m);
+ if (m-&gt;value(false) == 0.0)
+ continue;
if (m-&gt;units(metricUnits) == "seconds") {
QString s("&lt;tr&gt;&lt;td&gt;%1:&lt;/td&gt;&lt;td "
"align=\"right\"&gt;%2&lt;/td&gt;&lt;/tr&gt;");
</pre>
</blockquote>
<p>Note that had I changed more than one file, I would have just listed them
all when I ran <em>git-commit</em>. For example,</p>
<blockquote>
<pre>
$ git commit file1.cpp file2.cpp
</pre>
</blockquote>
<p>I can also commit everything I've changed all at once via</p>
<blockquote>
<pre>
$ git commit . # note the 'dot'
</pre>
</blockquote>
<big><font face="arial,helvetica,sanserif">
Managing commits
</font></big>
<p>git works best if you commit early and often. For example, I usually
commit a few times as I'm writing a new feature. Once I get my code to
compile, I commit it again. Then if I fix any bugs that turn up during
runtime, I commit the bug fixes. Then maybe I go back and clean up the new
code, now that I understand the problem better, and I commit those changes,
too.</p>
<p>The reasoning behind all of these commits is that commits are like save
points in a video game. If at any point I decide I'm messing things up,
I can just go back to the previous commit. <em>git-diff</em> shows me my
uncommitted changes. Let's say that I've decided I should also change the
text in the Ride Summary to reflect the fact that I'm only showing non-zero
metrics now. Here's my change:</p>
<blockquote>
<pre>
$ git diff
diff --git a/src/RideItem.cpp b/src/RideItem.cpp
index c368725..2ff9c49 100644
--- a/src/RideItem.cpp
+++ b/src/RideItem.cpp
@@ -159,13 +159,13 @@ static const char *metricsXml =
" precision=\"1\"/&gt;\n"
" &lt;/metric_group&gt;\n"
" &lt;metric_group name=\"Averages\"&gt;\n"
- " &lt;metric name=\"average_speed\" display_name=\"Speed\"\n"
+ " &lt;metric name=\"average_speed\" display_name=\"(Non-zero) Speed\"\n"
" precision=\"1\"/&gt;\n"
- " &lt;metric name=\"average_power\" display_name=\"Power\"\n"
+ " &lt;metric name=\"average_power\" display_name=\"(Non-zero) Power\"\n"
" precision=\"0\"/&gt;\n"
- " &lt;metric name=\"average_hr\" display_name=\"Heart rate\"\n"
+ " &lt;metric name=\"average_hr\" display_name=\"(Non-zero) Heart rate\"\n"
" precision=\"0\"/&gt;\n"
- " &lt;metric name=\"average_cad\" display_name=\"Cadence\"\n"
+ " &lt;metric name=\"average_cad\" display_name=\"(Non-zero) Cadence\"\n"
" precision=\"0\"/&gt;\n"
" &lt;/metric_group&gt;\n"
" &lt;metric_group name=\"BikeScore&#8482;\" note=\"BikeScore is a trademark
</pre>
</blockquote>
<p>But now I decide I don't like that change--I'd rather do it another way.
No problem. <em>git-checkout</em> will restore the previous version committed:</p>
<blockquote>
<pre>
$ git checkout src/RideItem.cpp
</pre>
</blockquote>
<p>If I want to restore the entire directory to the state of the last commit,
I checkout the whole directory:</p>
<blockquote>
<pre>
$ git checkout . # note the 'dot'
</pre>
</blockquote>
<p>Alternatively, if I had already committed this change, I can use
<em>git-reset</em> to throw away my latest commit like this:</p>
<blockquote>
<pre>
$ git reset --hard HEAD^
</pre>
</blockquote>
<p>Be careful with that one, though--it's irreversible.</p>
<big><font face="arial,helvetica,sanserif">
Combining commits
</font></big>
<p>Coming back to our example, let's say I instead decide to change the ride
summary a little differently and commit it:</p>
<blockquote>
<pre>
$ git log -p -1
commit 225f3093a206cbcc296ed1c8a25996ce1968bda6
Author: Sean Rhea <sean.c.rhea@gmail.com>
Date: Sat Sep 5 16:21:33 2009 -0400
include "non-zero" in metric group titles
diff --git a/src/RideItem.cpp b/src/RideItem.cpp
index c368725..449e19e 100644
--- a/src/RideItem.cpp
+++ b/src/RideItem.cpp
@@ -146,7 +146,7 @@ double RideItem::timeInZone(int zone)
static const char *metricsXml =
"&lt;metrics&gt;\n"
- " &lt;metric_group name=\"Totals\"&gt;\n"
+ " &lt;metric_group name=\"Non-zero Totals\"&gt;\n"
" &lt;metric name=\"workout_time\" display_name=\"Workout time\"\n"
" precision=\"0\"/&gt;\n"
" &lt;metric name=\"time_riding\" display_name=\"Time riding\"\n"
@@ -158,7 +158,7 @@ static const char *metricsXml =
" &lt;metric name=\"elevation_gain\" display_name=\"Elevation Gain\"\n"
" precision=\"1\"/&gt;\n"
" &lt;/metric_group&gt;\n"
- " &lt;metric_group name=\"Averages\"&gt;\n"
+ " &lt;metric_group name=\"Non-zero Averages\"&gt;\n"
" &lt;metric name=\"average_speed\" display_name=\"Speed\"\n"
" precision=\"1\"/&gt;\n"
" &lt;metric name=\"average_power\" display_name=\"Power\"\n"
</pre>
</blockquote>
<p>Now I have two commits, which I can see with <em>git-log</em>:</p>
<blockquote>
<pre>
$ git log origin/master..devel-guide
commit 225f3093a206cbcc296ed1c8a25996ce1968bda6
Author: Sean Rhea &lt;sean.c.rhea@gmail.com&gt;
Date: Sat Sep 5 16:21:33 2009 -0400
include "non-zero" in metric group titles
commit df657cd3f0dcb8484a468c2efb04da77ee0472e0
Author: Sean Rhea &lt;sean.c.rhea@gmail.com&gt;
Date: Wed Sep 2 13:42:33 2009 -0400
don't include zero metrics in ride summary
When a device doesn't have altitude, there's no reason to show it. Likewise
with heart rate if the user wasn't wearing a heart rate monitor during a ride.
Maybe in the future this behavior could be enabled on a per-metric basis.
</pre>
</blockquote>
<p>If I'm happy with my changes, I can share them with the world just
like they are using <em>git-format-patch</em>. In this case, however, these
two changes should really be combined into one: the second change was
something I should have done along with the first, I just didn't think of it
at the time. I can use <em>git-rebase -i</em> to combine them:</p>
<blockquote>
<pre>
$ git rebase -i origin/master
</pre>
</blockquote>
<p>That will bring up an editor window with a list of my changes, like
this:</p>
<blockquote>
<pre>
pick df657cd don't include zero metrics in ride summary
pick 225f309 include "non-zero" in metric group titles
# Rebase df33fe2..920643f onto df33fe2
#
# Commands:
# p, pick = use commit
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
#
# If you remove a line here THAT COMMIT WILL BE LOST.
# However, if you remove everything, the rebase will be aborted.
#
</pre>
</blockquote>
<p>The directions are pretty self explanatory. You can reorder commits by
reordering their lines in this file. You can drop a commit by removing it
from the file entirely. You can also change the first word on a line from
"pick" to "squash", and git will combine that commit with the one that comes
before it. That's what I want to do here. I change line 2 of this file so
that the first two lines are:</p>
<blockquote>
<pre>
pick df657cd don't include zero metrics in ride summary
squash 225f309 include "non-zero" in metric group titles
</pre>
</blockquote>
<p>Then I write the file and quit the editor. Git does a little work
saying:</p>
<blockquote>
<pre>
Rebasing (1/2)
</pre>
</blockquote>
<p>And then it brings up another editor window that shows both of my commit
messages. I edit the two message to combine them into one, write the file,
and exit the editor. git says:</p>
<blockquote>
<pre>
Successfully rebased and updated refs/heads/master.
</pre>
</blockquote>
<p>And I can see the result with <code>git log -p</code>.</p>
<big><font face="arial,helvetica,sanserif">
Submitting a patch
</font></big>
<p>Okay, <em>now</em> I'm ready to share my change. I'll use
<em>git-format-patch</em>:
<blockquote>
<pre>
$ git format-patch HEAD^
0001-don-t-include-zero-metrics-in-ride-summary.patch
</pre>
</blockquote>
<p>In the <code>GoldenCheetah/src</code> directory I'll now find a <em>patch
file</em>, <code>0001-don-t-include-zero-metrics-in-ride-summary.patch</code>,
that other people can use to include my change in their own local git
repositories.</p>
<p>If you have a patch you'd like to share with others, you can email it to
the <a href="cgi-bin/mailman/listinfo/golden-cheetah-users">GoldenCheetah
User's Mailing List</a>, and it will be considered for inclusion in the next
release of GoldenCheetah. In fact, if you join the mailing list, you'll see
lots of patches like this. You may even want to try some of them.</p>
<big><font face="arial,helvetica,sanserif">
Applying patches
</font></big>
<p>Let's say I email the patch above to the mailing list, and it sounds like a
useful feature to you. To test it yourself, you can download the patch file
to your <code>GoldenCheetah/src</code> directory and apply it to your
repository using <em>git-am</em>:</p>
<blockquote>
<pre>
$ git am 0001-don-t-include-zero-metrics-in-ride-summary.patch
Applying: don't include zero metrics in ride summary
</pre>
</blockquote>
<p>If you now type, "git log", you'll see that "don't include zero metrics in
ride summary" has been added to your repository.</p>
<p>If enough people like a patch, and it doesn't introduce any new bugs, one
of the GoldenCheetah maintainers will probably commit it to the official GC
repository on github.</p>
<big><font face="arial,helvetica,sanserif">
Staying up to date
</font></big>
<p>In order to keep your local repository up to date with
the official one, you use <em>git-fetch</em> followed by
<em>git-rebase</em>:</p>
<blockquote>
<pre>
$ git fetch origin
$ git rebase origin/master
First, rewinding head to replay your work on top of it...
Fast-forwarded master to origin/master.
</pre>
</blockquote>
<p>Note that, unlike above, we didn't supply a "-i" option to
<em>git-rebase</em> this time.</p>
<p><em>git-fetch</em> downloads a copy of all the patches at github to
your local repository, but it doesn't apply them. <em>git-rebase</em> undoes
the changes that are unique to your local repository, applies any new patches
from <code>origin/master</code>, and then re-applies your patches.</p>
<p>If you have uncommitted changes, the rebase will fail:</p>
<blockquote>
<pre>
$ git rebase origin/master
src/RideItem.cpp: needs update
cannot rebase: you have unstaged changes
</pre>
</blockquote>
<p>Commit your changes with <em>git-commit</em> and then re-run the
<em>git-rebase</em>. It will work this time.</p>
<p>For developers who are used to subversion, this need to commit changes
before rebasing is the most annoying aspect of git. All I can say is that you
won't mind it much after time. Because you can use "git rebase -i" to
combine, reorder, and even drop commits, a commit in git is much lighter
weight than one in subversion. As I said above, commit early and often.</p>
<p>If the changes from github conflict with yours, you'll have to merge.
<em>git-rebase</em> will exit with an error and a list of directions on how to
fix things. Read them carefully.</p>

View File

@@ -1,72 +1,297 @@
<!-- $Id: download.content,v 1.6 2009/01/09 20:45:03 rcarlsen Exp $ -->
<p>
Golden Cheetah is available in binary form for
Linux x86, Mac OS X (universal binary), and Windows.
It is also available as source code.
</p>
<p>
Golden Cheetah downloads data from all versions of the PowerTap
computer including the new Joule. If you're using the PowerTap USB cradle
(as opposed to the older, serial cable), you may need to install the
<a href="http://www.ftdichip.com/Drivers/D2XX.htm">FTDI USB driver</a>
before downloading.
</p>
<p>
On Linux and Mac OS X, Golden Cheetah also downloads from the SRM PCV. On Mac
OS X, you'll need to install <a href="http://osx-pl2303.sourceforge.net/">the
open source PL2303 driver</a> to download from an SRM. Please see the
<a href="http://bugs.goldencheetah.org/projects/goldencheetah/wiki/">WIKI</a> article
- <a href="http://bugs.goldencheetah.org/projects/goldencheetah/wiki/PCV_on_Mac_OS_X">
PCV on Mac OS X</a> for further information.
</p>
<p>
<font face="arial,helvetica,sanserif">
<big><strong>Download Release 2.1</strong></big>
</font>
</p>
<ul>
<li><a href="GoldenCheetah_2.1.0_Windows_Installer.exe">Windows 32-bit (runs on 64bit as well)</a>
<li><a href="GoldenCheetah_2.1.0_Mac_Universal.dmg">Mac OS X Universal 10.4->10.7</a><br>
<li><a href="GoldenCheetah_2.1.0_Linux_x86.tgz">Linux x86</a><br>
<li><a href="GoldenCheetah_2.1.0_Linux_x86_64.tgz">Linux x86_64</a><br>
</ul>
</p>
<p>
Please follow the <a href="/users-guid.html">User's Guide</a> on how to install
and use Golden Cheetah.
Golden Cheetah is available as source code and in binary form for
Mac OS X Universal Binary, Linux on x86 processors and Windows 32-bit.
</p>
<p>
You can also <a href="release-notes.html">view the release notes</a> for 2.1
or <a href="older-releases.html">download older releases</a> of Golden Cheetah.
</p>
<p>
<font face="arial,helvetica,sanserif">
<big><strong>Development Releases</strong></big>
</font>
</p>
<p>Gareth Coco has also made
<a href="http://goldencheetah.stand2surf.net/">regular development builds</a>
available. These binaries are based on the latest source code, so they may have
more features and less (but sometime more) bugs than the stable release above.
Depending on your operating system, you may need to install the <a
href="http://www.ftdichip.com/Drivers/D2XX.htm">FTDI USB
driver</a> if you're using the PowerTap's new USB download cradle. The FTDI USB drivers are an optional install if you do not plan on downloading from your device using Golden Cheetah.
</p>
<p>
<font face="arial,helvetica,sanserif">
<big><strong>Source Code</strong></big>
</font>
</p>
<p>
The Golden Cheetah source code is available via git. See the
<a href="developers-guide.html">Developer's Guide</a> for more information.
The Golden Cheetah source code is available via
<a href="http://git-scm.com/">git</a>. You need to install
<a href="http://www.trolltech.com/products/qt">QT 4.5.x</a> and
<a href="http://qwt.sourceforge.net/">qwt 5.0.2</a> (as a static, not
dynamic, library) and
edit <code>goldencheetah/src/src.pro</code> to point to them
before building GoldenCheetah.
Use this command to check out the current version of the repository:
<pre>
git clone git://github.com/srhea/GoldenCheetah.git
</pre>
You can also <a href="http://github.com/srhea/GoldenCheetah/tree/master/">browse
the source on github</a>.
<p>
<font face="arial,helvetica,sanserif">
<big><strong>Binaries</strong></big>
</font>
<p>
<center>
<table width="100%" cellspacing="10">
<tr>
<td width="20%"><i>Version</i></td>
<td width="30%"><i>Files</i></td>
<td><i>Description</i></td>
</tr>
<tr>
<td valign="top">1.1.325</td>
<td valign="top">
<a href="GoldenCheetah_1.1.325_Linux_x86.gz">Linux x86</a><br>
<a href="GoldenCheetah_1.1.325_Linux_x86_64.gz">Linux x86_64</a><br>
<a href="GoldenCheetah_1.1.325_Darwin_Universal.dmg">Mac OS X Universal</a><br>
<a href="GoldenCheetah_1.1.325_Windows_Installer.exe">Windows 32-bit</a>
</td>
<td valign="top">
<p>
First official Windows release courtesy of Ned Harding. Ned put much effort into the port to make the download reliable and created a nice installer, too (Thanks Ned!). He also provided the long-awaited Split Ride feature - break up a ride file into separate rides easily using long time gaps and intervals.
<ul>
<li>Ant+Sport PowerTap support.
<li>Split Rides by time gaps or intervals.
<li>Delete ride from list.
<li>Use distance or time for x-axis in Ride Plot (Thanks Damain).
<li>Numerous bug fixes (Thanks Tom, Dan).
</p>
</td>
</tr>
<tr>
<td valign="top">1.0.277</td>
<td valign="top">
<a href="GoldenCheetah_1.0.277_Linux_x86.gz">Linux x86</a>,<br>
<a href="GoldenCheetah_1.0.277_Linux_x86_64.tar.gz">Linux x86_64</a>,<br>
<a href="GoldenCheetah_1.0.277_Darwin_Universal.dmg">Mac OS X Universal</a>
</td>
<td valign="top">
<p>*Note: Beginning with this release we are changing to a numbered versioning system. Minor point releases will generally indicate builds with new features, while bugfix releases will increment the final number, which represents the svn revision*</p>
<p>Several new features in this release: Critical Power calculator, find best intervals utility, Pedal Force / Pedal Velocity chart, iBike and Ergomo CSV import, GUI power zones creator, separate vertical axes for Power / HR / Cadence and Speed in the Ride plot, sorting rides with the most recent at the top of the list, and many bug fixes courtesy of JT Conklin.
</p>
<p>You may need to install <a href="http://www.ftdichip.com/Drivers/D2XX.htm">USB drivers</a> from FTDI.
</p>
<p>
For posterity, the <a href="http://robertcarlsen.net/blog/?page_id=49">beta version</a> for Windows, based on r295.
</p>
</td>
</tr>
<tr>
<td valign="top">Mar 10, 2008</td>
<td valign="top">
<a href="GoldenCheetah_2008-03-10_Linux_x86.tgz">Linux x86</a>,<br>
<a href="GoldenCheetah_2008-03-10_Darwin_Universal.dmg">Mac OS X Universal</a>
</td>
<td valign="top">
This release introduces <a href="http://www.physfarm.com/Analysis%20of%20Power%20Output%20and%20Training%20Stress%20in%20Cyclists-%20BikeScore.pdf">BikeScore&#8482;</a>,
a metric of training stress developed by Dr. Philip Skiba. It also
fixes several small bugs in earlier releases.
</td>
</tr>
<tr>
<td valign="top">Sep 23, 2007</td>
<td valign="top">
<a href="GoldenCheetah_2007-09-23_Linux_x86.tgz">Linux x86</a>,<br>
<a href="GoldenCheetah_2007-09-23_Darwin_i386.dmg">Mac OS X x86</a>,<br>
<a href="GoldenCheetah_2007-09-23_Darwin_powerpc.dmg">Mac OS X PowerPC</a>
</td>
<td valign="top">
Bug fix release. CVS imports weren't quite working in the last one.
</td>
</tr>
<tr>
<td valign="top">Sep 18, 2007</td>
<td valign="top">
<a href="GoldenCheetah_2007-09-18_Linux_x86.tgz">Linux x86</a>,<br>
<a href="GoldenCheetah_2007-09-18_Darwin_powerpc.dmg">Mac OS X PowerPC</a>
</td>
<td valign="top">
This release adds two small, but excellent features from Justin Knotzke:
CSV file imports and visual interval markers in the ride plot.
</td>
</tr>
<tr>
<td valign="top">Aug 7, 2007</td>
<td valign="top">
<a href="GoldenCheetah_2007-08-07_Linux_x86.tgz">Linux x86</a>,<br>
<a href="GoldenCheetah_2007-08-07_Darwin_powerpc.dmg">Mac OS X PowerPC</a>
</td>
<td valign="top">This release fixes a bug in the critical power
intervals graph where you could get bad data if you started an interval
after a long period of not moving. It also adds really basic zooming to
the ride plot: use the left mouse button to zoom in and the right one to
return to the previous zoom state. It's pretty crappy right now, but
it's better than nothing.
</td>
</tr>
<tr>
<td valign="top">Apr 26, 2007</td>
<td valign="top">
<a href="GoldenCheetah_2007-04-26_Linux_x86.tgz">Linux x86</a>,<br>
<a href="GoldenCheetah_2007-04-26_Darwin_powerpc.dmg">Mac OS X PowerPC</a>
</td>
<td valign="top">This release fixes some bugs and adds a whole bunch of
new features:
<ul>
<li>Now imports .srm files (direct download from SRM hopefully coming
soon)
<li>New "Weekly Summary" tab shows total weekly hours, miles, and work
<li>Power zones can now be entered into a text file, after which GC will
display time in each zone in the ride and weekly summaries; for more
information on the zone file format, <a href="zones.html">see this
page</a>.
</ul>
</td>
</tr>
<tr>
<td valign="top">Apr 1, 2007</td>
<td valign="top">
<a href="GoldenCheetah_2007-04-01_Linux_x86.tgz">Linux x86</a>,<br>
<a href="GoldenCheetah_2007-04-01_Darwin_powerpc.dmg">Mac OS X PowerPC</a>
</td>
<td valign="top">This release fixes a bug that was introduced with the
hardware echo detection code. If you're using the CycleOps-supplied USB
cable to download from your PowerTap unit, this release should make
downloads more reliable. (Those using the KeySpan USB-to-serial adaptor
or a plain-old serial port shouldn't see any difference.)</td>
</tr>
<tr>
<td valign="top">Feb 22, 2007</td>
<td valign="top">
<a href="GoldenCheetah_2007-02-22_Linux_x86.tgz">Linux x86</a>,<br>
<a href="GoldenCheetah_2007-02-22_Darwin_powerpc.dmg">Mac OS X PowerPC</a>
</td>
<td valign="top">Clicking on the Critical Power Plot now displays the
interval duration, maximum power for that ride, and maximum power for all
rides below the plot. Also fixes a bug for recording intervals longer than
two seconds.</td>
</tr>
<tr>
<td valign="top">Feb 12, 2007</td>
<td valign="top">
<a href="GoldenCheetah_2007-02-12_Linux_x86.tgz">Linux x86</a>,<br>
<a href="GoldenCheetah_2007-02-12_Darwin_powerpc.dmg">Mac OS X PowerPC</a>
</td>
<td valign="top">Interval information now included in ride summary, rides can
now be exported as comma-separated values for import into Excel, and better
automatic detection of hardware echo. Also includes a number of bux
fixes.</td>
</tr>
<tr>
<td valign="top">Jan 30, 2007</td>
<td valign="top">
<a href="GoldenCheetah_2007-01-30_Linux_x86.tgz">Linux x86</a>,<br>
<a href="GoldenCheetah_2007-01-30_Darwin_powerpc.dmg">Mac OS X PowerPC</a>
</td>
<td valign="top">Bug fix release.</td>
</tr>
<tr>
<td valign="top">Jan 6, 2007</td>
<td valign="top"><a href="GoldenCheetah_2007-01-06_Linux_x86.tgz">Linux
x86</a></td>
<td valign="top">First release for Linux.</td>
</tr>
<tr>
<td valign="top">Dec 25, 2006</td>
<td valign="top"><a href="GoldenCheetah_2006-12-25_Darwin_powerpc.dmg">Mac OS
X PowerPC</a></td>
<td valign="top">Adds the Power Histogram, which shows how much time a rider
spent at each particular power level during a ride.</td>
</tr>
<tr>
<td valign="top">Sep 19, 2006</td>
<td valign="top"><a href="GoldenCheetah_2006-09-19_Darwin_powerpc.dmg">Mac OS
X PowerPC</a></td>
<td valign="top">Adds the Critical Power Plot, which shows the highest average
power you've achieved for every interval length over all your rides and the
selected ride. Also shows download progress in minutes of ride data
downloaded.</td>
</tr>
<tr>
<td valign="top">Sep 7, 2006</td>
<td valign="top"><a href="GoldenCheetah_2006-09-07_Darwin_powerpc.dmg">Mac OS
X PowerPC</a></td>
<td valign="top">Adds speed and cadence to the ride plot. Fixes a bug
found by George Gilliland where reseting the time during a ride could cause
the GUI to crash.</td>
</tr>
<tr>
<td valign="top">Sep 6, 2006</td>
<td valign="top"><a href="GoldenCheetah_2006-09-06_Darwin_powerpc.dmg">Mac OS
X PowerPC</a></td>
<td valign="top">The first release of the Golden Cheetah GUI.</td>
</tr>
</table>
</center>
<p>
<hr width="50%">
<p>
<font face="arial,helvetica,sanserif">
<big><strong>Older Stuff</strong></big>
</font>
<p>
These are the older, source-only, command-line distributions. I've left them
up for historical purposes only; I don't recommend using them.
<center>
<table width="100%" cellspacing="10">
<tr>
<td width="20%"><i>Date</i></td>
<td width="30%"><i>File</i></td>
<td><i>Description</i></td>
</tr>
<tr>
<td valign="top">Aug 11, 2006</td>
<td valign="top"><a href="gc_2006-08-11.tgz">gc_2006-08-11.tgz</a></td>
<td valign="top">ptdl now works with Keyspan USB-to-serial adaptor, after
debugging help from Rob Carlsen.
</td>
</tr>
<tr>
<td valign="top">May 27, 2006</td>
<td valign="top"><a href="gc_2006-05-27.tgz">gc_2006-05-27.tgz</a></td>
<td valign="top">Adds the <code>cpint</code> program for computing critical
power intervals and the <code>ptpk</code> program for converting from
PowerTuned data files (see the <a href="users-guide.html">User's
Guide</a>).</td>
</tr>
<tr>
<td valign="top">May 16, 2006</td>
<td valign="top"><a href="gc_2006-05-16.tgz">gc_2006-05-16.tgz</a></td>
<td valign="top">The first code release, containing <code>ptdl</code> and
<code>ptunpk</code>.</td>
</tr>
</table>
</center>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 155 KiB

View File

@@ -18,8 +18,7 @@ Applications, double-clicked on it, and nothing happened. What
gives?</i></b>
<p>
Are you running OS X Tiger (10.4) or later? You need to be.
If you are, and you're still
Are you running OS X Tiger? You need to be. If you are, and you're still
having this problem, open Terminal (in Applications -&gt; Utilities) and type
this at the prompt:
@@ -30,3 +29,51 @@ this at the prompt:
then press &lt;return&gt; and send an email to the mailing list with
whatever it prints out. We'll help you debug it.
<p>
<b><i>I've downloaded and unpacked the data. Now what do I do with
it?</i></b>
<p>
We highly recommend that you buy and read both Joe Friel's <i>The
Cyclist's Training Bible</i> and Allen and Coggan's <i>Training and
Racing with a Power Meter</i>. The former is the definitive book about all
aspects of cycling training (although we think he's off his rocker in the
chapter about diet), and the latter is the definitive book about power-based
training.
<p>
Also, if you buy either of these books through the links below, we'll get a
referral fee in return, helping us to support this web site. Thanks!
<center>
<iframe
src="http://rcm.amazon.com/e/cm?t=goldencheetah-20&o=1&p=8&l=as1&asins=B0006JHZ7Q&fc1=000000&IS2=1&lt1=_blank&lc1=0000ff&bc1=000000&bg1=ffffff&f=ifr"
style="width:120px;height:240px;" scrolling="no" marginwidth="0"
marginheight="0" frameborder="0"></iframe>
<iframe
src="http://rcm.amazon.com/e/cm?t=goldencheetah-20&o=1&p=8&l=as1&asins=1931382794&fc1=000000&IS2=1&lt1=_blank&lc1=0000ff&bc1=000000&bg1=ffffff&f=ifr"
style="width:120px;height:240px;" scrolling="no" marginwidth="0"
marginheight="0" frameborder="0"></iframe>
</center>
<p>
<b><i>Does the output of <code>ptunpk</code> exactly match that of the software
included with the PowerTap?</i></b>
<p>
Almost. If you run it in compatibility mode, using the <code>-c</code>
option, it matches the PowerTap software's output exactly on everything but
the time values, at least for the five sample rides we've tried it with.
The times are a little off, but not by more than 0.1%, so we don't consider it
a big deal.
<p>
That said, the PowerTap software does some weird things, like converting from
kilometers to miles by multiplying by 0.62, but then reporting the miles
values with five digits after the decimal place. If you run
<code>ptunpk</code> without the <code>-c</code> option, it will unpack the
data in the way we think it should. The results mostly match up with the
official ones, and are almost certainly identical within the range of accuracy
of the device.

View File

@@ -28,23 +28,14 @@ print<<EOF;
<head>
<title>Golden Cheetah: Cycling Performance Software for Linux, Mac OS X, and Windows</title>
<meta name="keywords" content="powertap srm linux mac cycling performance">
<style type='text/css'>
li {
margin: .5em 0
}
body {
color: #000000;
background: #ffffff;
}
:link {
color: #5e431b;
}
:visited {
color: #996e2d;
}
</style>
</head>
<body text="#000000"
link="#5e431b"
vlink="#996e2d"
alink="#000000"
bgcolor="#ffffff">
<table width="95%" border="0" width="100%" cellspacing="10">
<tr>
@@ -55,17 +46,32 @@ body {
<p> <b><a href="index.html">Introduction</a></b>
<br> <b><a href="screenshots.html">Screenshots</a>
<br> <b><a href="http://bugs.goldencheetah.org/projects/goldencheetah/wiki">Wiki</a>
<br> <b><a href="users-guide.html">User's Guide</a>
<br> <b><a href="developers-guide.html">Developer's Guide</a>
<br> <b><a href="faq.html">FAQ</a>
<br> <b><a href="wishlist.html">Wish List</a>
<br> <b><a href="license.html">License</a></b>
<br> <b><a href="download.html">Download</a></b>
<br> <b><a href="contrib.html">Contributors</a></b>
<br> <b><a href="search.html">Search</a></b>
<br> <b><a href="mailing-list.html">Mailing List</a></b>
<br> <b><a href="bug-tracker.html">Bug Tracker</a></b>
<br> <b><a href="cgi-bin/mailman/listinfo/golden-cheetah-users">Mailing List</a></b>
<p>
<script type="text/javascript"><!--
google_ad_client = "pub-2993461533095312";
google_ad_width = 120;
google_ad_height = 240;
google_ad_format = "120x240_as";
google_ad_type = "text";
google_ad_channel ="";
google_color_border = "FFFFFF";
google_color_bg = "FFFFFF";
google_color_link = "5E431B";
google_color_url = "996E2D";
google_color_text = "000000";
//--></script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
</center>
</td>
@@ -109,9 +115,9 @@ while (<FILE>) {
}
close (FILE);
#if (defined $last_mod) {
# print "<p><hr><em>Last modified $last_mod.</em>\n";
#}
if (defined $last_mod) {
print "<p><hr><em>Last modified $last_mod.</em>\n";
}
print<<EOF;

Binary file not shown.

Before

Width:  |  Height:  |  Size: 311 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 135 KiB

View File

@@ -1,33 +1,22 @@
<!-- $Id: index.content,v 1.1 2006/05/16 14:24:50 srhea Exp $ -->
<p>
<center>
<em>To all those volunteers who selflessly give their time and without whom
amateur sport would not exist.</em>
<br>
-- Graeme Obree, in the dedication of <em>Flying Scotsman</em>
</center>
<p>
GoldenCheetah is a software package that:
<ul>
<li>Downloads ride data directly from the CycleOps PowerTap and the SRM
PowerControl V. Support for SRM PowerControl VI and VII is planned for the
future.<p>
<li>Downloads ride data directly from the CycleOps PowerTap, including the
newer Ant+Sport models.<p>
<li>Imports ride data downloaded with other programs, including TrainingPeaks
WKO+ and the manufacturers' software for the Ergomo, Garmin, Polar, PowerTap,
and SRM devices.<p>
<li>Imports ride data from SRM, Garmin TCX, Polar HRM, and CSV files,
including those from Cycling Peaks&nbsp;(TM) and the ergomo.<p>
<li>Provides a rich set of analysis tools, including a critical power graph,
BikeScore calculation, histogram analysis, a best interval finder, and a pedal
force versus pedal velocity chart, to name just a few.<p>
<li>Provides a rich set of analysis tools, including critial power,
BikeScore&nbsp;(TM), power histograms, a best interval finder, and pedal force
versus pedal velocity, to name just a few.<p>
<li>Is available for Linux, Mac OS X, and Windows. (The Windows version
does not yet support direct downloads from the SRM PowerControl.)<p>
<li>Works identically under Linux, Mac OS X, and Windows.<p>
<li>Is released under an Open Source license.
<li>Is available under an Open Source license.
</ul>
<p>
@@ -35,13 +24,3 @@ We believe that cyclists should be able to download their power data
to the computer of their choice, analyze it in whatever way they see fit, and
share their methods of analysis with others.
<hr width="20%"/>
<small>
<p>
* WKO+ and TrainingPeaks are trademarks of Peaksware, LLC.
<br/>
** BikeScore is a trademark of Dr. Philip Friere Skiba, PhysFarm Training
Systems LLC.
</p>
</small>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 21 KiB

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 159 KiB

After

Width:  |  Height:  |  Size: 229 B

View File

@@ -1,17 +0,0 @@
<p>
There are two mailing lists for the Golden Cheetah project:
<p><a href="http://groups.google.com/group/golden-cheetah-users">Golden
Cheetah Users</a> is a list for submitting bug reports, feature requests, and
constructive criticism. It's a good place to search if you have a question
that someone might have already answered. It's also where we discuss new
features, plans, etc. On busy days there may be as many as 20 emails sent to
Golden Cheetah Users.
<p><a href="http://groups.google.com/group/golden-cheetah-announce">Golden
Cheetah Announce</a> is a lower volume, moderated list where we post
announcements of new releases, important bug fixes, etc. If you don't want to
get a lot of email, but you do want to know when we put out a new release,
this is the list for you. It receives one or two emails per month.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 267 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 121 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 90 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 63 KiB

View File

@@ -1,485 +0,0 @@
<p>
This page contains older releases of Golden Cheetah. For the latest version,
please see <a href="download.html">the download page</a> instead.
</p>
<p>
<font face="arial,helvetica,sanserif">
<big><strong>Golden Cheetah</strong></big>
</font>
<p>
<center>
<table width="100%" cellspacing="5">
<tr>
<td width="15%"><i>Version</i></td>
<td width="25%"><i>Files</i></td>
<td><i>Description</i></td>
</tr>
<tr>
<td valign="top">2.0.0</td>
<td valign="top">
<a href="GoldenCheetah_2.0.0_Linux_x86.gz">Linux x86</a><br>
<a href="GoldenCheetah_2.0.0_Linux_x86_64.gz">Linux x86_64</a><br>
<a href="GoldenCheetah_2.0.0_Mac_Universal.zip">Mac OS X Universal</a><br>
<a href="GoldenCheetah_2.0.0_Windows_Installer.exe">Windows 32-bit</a>
</td>
<td valign="top">
<p>
New Features
<ul>
<li>Aerolab (Andy Froncioni)</li>
<li>View ride in Google Maps (Greg Lonnon)</li>
<li>Long Term Metrics (Mark Liversedge)</li>
<li>User configurable ride metadata (Mark Liversedge)</li>
<li>Ride editor and tools (Mark Liversedge)</li>
<li>HR Zones and TRIMP Metrics (Damien Grauser)</li>
<li>Twitter support (Justin Knotzke)</li>
</ul>
</p>
<p>
Internationalisation
<ul>
<li>Updates to French translation (Damien Grauser)</li>
<li>Japanese translation (Mitsukuni Sato)</li>
</ul>
</p>
<p>
New Logo and Icons
<ul>
<li>Golden Cheetah Logo(Dan Schmalz)</li>
</ul>
</p>
<p>
Enhanced Ride Plot
<ul>
<li>Ride plot stacked view (Damien Grauser)</li>
<li>Scrolling Ride Plot (Mark Liversedge)</li>
</ul>
</p>
<p>
New Devices and File Formats Supported
<ul>
<li>Support for Joule BIN File Format (Damien Grauser)</li>
<li>Tacx CAF Ride File Format Support (Ilja Booij)</li>
<li>Garmin FIT ride file support (Sean Rhea)</li>
<li>Export to Google Earth 5.2 KML (Mark Liversedge)</li>
<li>Training Peaks PWX ride file support (Mark Liversedge)</li>
<li>Polar SRD ride file support (Mark Liversedge)</li>
<li>Racermate CompCS/Ergvideo .TXT ride file support (Mark Liversedge)</li>
</ul>
<p>
<p>
Numerous enhancements and bug fixes from
<ul>
<li>Julian Baumgartner</li>
<li>Robert Carlsen</li>
<li>Rainer Clasen</li>
<li>Gareth Coco</li>
<li>Dag Gruneau</li>
<li>Jamie Kimberley</li>
<li>Jim Ley</li>
<li>Patrick J. McNerthney</li>
<li>Austin Roach</li>
<li>Ken Sallot</li>
<li>Thomas Weichmann</li>
</ul>
</p>
<p>
Builds, testing and support
<ul>
<li>Robert Carlsen</li>
<li>Gareth Coco</li>
<li>Jamie Kimberley</li>
<li>Justin Knotzke</li>
</ul>
</p>
</td>
</tr>
<tr>
<td valign="top">1.3.0</td>
<td valign="top">
<a href="GoldenCheetah_1.3.0_Linux_x86.gz">Linux x86</a><br>
<a href="GoldenCheetah_1.3.0_Linux_x86_64.gz">Linux x86_64</a><br>
<a href="GoldenCheetah_1.3.0_Mac_Universal.zip">Mac OS X Universal</a><br>
<a href="GoldenCheetah_1.3.0_Windows_Installer.exe">Windows 32-bit</a>
</td>
<td valign="top">
<p>
Lots of new features:
<p>
Realtime Mode:
<ul>
<li>Graph data as you ride (Mark Liversedge, Justin Knotzke, Steve Gribble)</li>
</ul>
</p>
<p>
Charts:
<ul>
<li>Added Performance Manager (Eric Murray)</li>
<li>Added 3D Modeling (Mark Liversedge and Greg Steele)</li>
<li>Up to four y-axes on Ride Plot (Sean Rhea)</li>
<li>Option to show work instead of power in Critical Power Plot (Sean Rhea)</li>
</ul>
</p>
<p>
Intervals:
<ul>
<li>Configurable metrics for intervals (Sean Rhea)</li>
<li>Find peak powers and add to intervals (Mark Liversedge)</li>
<li>Highlight intervals in plots (Damien Grauser)</li>
</ul>
</p>
<p>
Device support:
<ul>
<li>Serial port support on Windows (Mark Liversedge)</li>
<li>Erase SRM memory without downloading (Sean Rhea)</li>
</ul>
</p>
<p>
Imports:
<ul>
<li>New ride import wizard (Mark Liversedge, Jamie Kimberley)</li>
<li>Support Computrainer 3dp file format (Greg Lonnon)</li>
<li>Support WKO v3 file format (Mark Liversedge)</li>
<li>Support files with Garmin "smart recording" (Greg Lonnon)</li>
<li>New GoldenCheetah (.gc) file format (Sean Rhea)</li>
</ul>
</p>
<p>
New/improved ride metrics:
<ul>
<li>Added Joe Friel's Aerobic Decoupling (Sean Rhea)</li>
<li>Added training points system by running coach Jack Daniels (Sean Rhea)</li>
<li>Better elevation gain estimates (Sean Rhea)</li>
</ul>
</p>
<p>
Support for more languages:
<ul>
<li>French (Damien Grauser)</li>
<li>Japanese (Mitsukuni Sato, Keisuke Yamaguchi)</li>
</ul>
</p>
<p>
Other new features:
<ul>
<li>Group rides into seasons (Justin Knotzke)</li>
<li>Better ride calendar (Berend De Schouwer)</li>
<li>Ride list pop-up menu (Thomas Weichmann)</li>
</ul>
</p>
</p>
<ul>
<li>Direct download from SRM (R. Clasen and S. Rhea)
<li>WKO+ file import (M. Liversedge)
<li>Qollector support (M. Rages)
<li>Altitude plotting (T. Weichmann)
<li>Manual ride entry (E. Murray)
<li>Power zones shading (D. Connell)
<li>Weekly summary histograms (R. Carlsen)
<li>Automatic CP estimation from CP graph (D. Connell)
<li>Support for running off a USB stick (J. Knotzke)
<li>OS-specific directory layout (J. Simioni)
<li>PF/PV plot improvements (B. de Schouwer)
<li>Memory leak fixes (G. Lonnon)
</ul>
<p>Thanks also to Jamie Kimberley for extensive testing.
</td>
</tr>
<tr>
<td valign="top">1.2.0</td>
<td valign="top">
<a href="GoldenCheetah_1.2.0_Linux_x86.tgz">Linux x86</a><br>
<a href="GoldenCheetah_1.2.0_Linux_x86_64.tgz">Linux x86_64</a><br>
<a href="GoldenCheetah_1.2.0_Darwin_Universal.dmg">Mac OS X Universal</a><br>
<a href="GoldenCheetah_1.2.0_Windows_Installer.exe">Windows 32-bit</a>
</td>
<td valign="top">
<p>
Lots of new features in this release, including:
</p>
<ul>
<li>Direct download from SRM (R. Clasen and S. Rhea)
<li>WKO+ file import (M. Liversedge)
<li>Qollector support (M. Rages)
<li>Altitude plotting (T. Weichmann)
<li>Manual ride entry (E. Murray)
<li>Power zones shading (D. Connell)
<li>Weekly summary histograms (R. Carlsen)
<li>Automatic CP estimation from CP graph (D. Connell)
<li>Support for running off a USB stick (J. Knotzke)
<li>OS-specific directory layout (J. Simioni)
<li>PF/PV plot improvements (B. de Schouwer)
<li>Memory leak fixes (G. Lonnon)
</ul>
<p>Thanks also to Jamie Kimberley for extensive testing.
</td>
</tr>
<tr>
<td valign="top">1.1.325</td>
<td valign="top">
<a href="GoldenCheetah_1.1.325_Linux_x86.gz">Linux x86</a><br>
<a href="GoldenCheetah_1.1.325_Linux_x86_64.gz">Linux x86_64</a><br>
<a href="GoldenCheetah_1.1.325_Darwin_Universal.dmg">Mac OS X Universal</a><br>
<a href="GoldenCheetah_1.1.325_Windows_Installer.exe">Windows 32-bit</a>
</td>
<td valign="top">
<p>
First official Windows release courtesy of Ned Harding. Ned put much effort into the port to make the download reliable and created a nice installer, too (Thanks Ned!). He also provided the long-awaited Split Ride feature - break up a ride file into separate rides easily using long time gaps and intervals.
<ul>
<li>Ant+Sport PowerTap support.
<li>Split Rides by time gaps or intervals.
<li>Delete ride from list.
<li>Use distance or time for x-axis in Ride Plot (Thanks Damain).
<li>Numerous bug fixes (Thanks Tom, Dan).
</p>
</td>
</tr>
<tr>
<td valign="top">1.0.277</td>
<td valign="top">
<a href="GoldenCheetah_1.0.277_Linux_x86.gz">Linux x86</a>,<br>
<a href="GoldenCheetah_1.0.277_Linux_x86_64.tar.gz">Linux x86_64</a>,<br>
<a href="GoldenCheetah_1.0.277_Darwin_Universal.dmg">Mac OS X Universal</a>
</td>
<td valign="top">
<p>*Note: Beginning with this release we are changing to a numbered versioning system. Minor point releases will generally indicate builds with new features, while bugfix releases will increment the final number, which represents the svn revision*</p>
<p>Several new features in this release: Critical Power calculator, find best intervals utility, Pedal Force / Pedal Velocity chart, iBike and Ergomo CSV import, GUI power zones creator, separate vertical axes for Power / HR / Cadence and Speed in the Ride plot, sorting rides with the most recent at the top of the list, and many bug fixes courtesy of JT Conklin.
</p>
<p>You may need to install <a href="http://www.ftdichip.com/Drivers/D2XX.htm">USB drivers</a> from FTDI.
</p>
<p>
For posterity, the <a href="http://robertcarlsen.net/blog/?page_id=49">beta version</a> for Windows, based on r295.
</p>
</td>
</tr>
<tr>
<td valign="top">Mar 10, 2008</td>
<td valign="top">
<a href="GoldenCheetah_2008-03-10_Linux_x86.tgz">Linux x86</a>,<br>
<a href="GoldenCheetah_2008-03-10_Darwin_Universal.dmg">Mac OS X Universal</a>
</td>
<td valign="top">
This release introduces <a href="http://www.physfarm.com/Analysis%20of%20Power%20Output%20and%20Training%20Stress%20in%20Cyclists-%20BikeScore.pdf">BikeScore&#8482;</a>,
a metric of training stress developed by Dr. Philip Skiba. It also
fixes several small bugs in earlier releases.
</td>
</tr>
<tr>
<td valign="top">Sep 23, 2007</td>
<td valign="top">
<a href="GoldenCheetah_2007-09-23_Linux_x86.tgz">Linux x86</a>,<br>
<a href="GoldenCheetah_2007-09-23_Darwin_i386.dmg">Mac OS X x86</a>,<br>
<a href="GoldenCheetah_2007-09-23_Darwin_powerpc.dmg">Mac OS X PowerPC</a>
</td>
<td valign="top">
Bug fix release. CVS imports weren't quite working in the last one.
</td>
</tr>
<tr>
<td valign="top">Sep 18, 2007</td>
<td valign="top">
<a href="GoldenCheetah_2007-09-18_Linux_x86.tgz">Linux x86</a>,<br>
<a href="GoldenCheetah_2007-09-18_Darwin_powerpc.dmg">Mac OS X PowerPC</a>
</td>
<td valign="top">
This release adds two small, but excellent features from Justin Knotzke:
CSV file imports and visual interval markers in the ride plot.
</td>
</tr>
<tr>
<td valign="top">Aug 7, 2007</td>
<td valign="top">
<a href="GoldenCheetah_2007-08-07_Linux_x86.tgz">Linux x86</a>,<br>
<a href="GoldenCheetah_2007-08-07_Darwin_powerpc.dmg">Mac OS X PowerPC</a>
</td>
<td valign="top">This release fixes a bug in the critical power
intervals graph where you could get bad data if you started an interval
after a long period of not moving. It also adds really basic zooming to
the ride plot: use the left mouse button to zoom in and the right one to
return to the previous zoom state. It's pretty crappy right now, but
it's better than nothing.
</td>
</tr>
<tr>
<td valign="top">Apr 26, 2007</td>
<td valign="top">
<a href="GoldenCheetah_2007-04-26_Linux_x86.tgz">Linux x86</a>,<br>
<a href="GoldenCheetah_2007-04-26_Darwin_powerpc.dmg">Mac OS X PowerPC</a>
</td>
<td valign="top">This release fixes some bugs and adds a whole bunch of
new features:
<ul>
<li>Now imports .srm files (direct download from SRM hopefully coming
soon)
<li>New "Weekly Summary" tab shows total weekly hours, miles, and work
<li>Power zones can now be entered into a text file, after which GC will
display time in each zone in the ride and weekly summaries; for more
information on the zone file format, <a href="zones.html">see this
page</a>.
</ul>
</td>
</tr>
<tr>
<td valign="top">Apr 1, 2007</td>
<td valign="top">
<a href="GoldenCheetah_2007-04-01_Linux_x86.tgz">Linux x86</a>,<br>
<a href="GoldenCheetah_2007-04-01_Darwin_powerpc.dmg">Mac OS X PowerPC</a>
</td>
<td valign="top">This release fixes a bug that was introduced with the
hardware echo detection code. If you're using the CycleOps-supplied USB
cable to download from your PowerTap unit, this release should make
downloads more reliable. (Those using the KeySpan USB-to-serial adaptor
or a plain-old serial port shouldn't see any difference.)</td>
</tr>
<tr>
<td valign="top">Feb 22, 2007</td>
<td valign="top">
<a href="GoldenCheetah_2007-02-22_Linux_x86.tgz">Linux x86</a>,<br>
<a href="GoldenCheetah_2007-02-22_Darwin_powerpc.dmg">Mac OS X PowerPC</a>
</td>
<td valign="top">Clicking on the Critical Power Plot now displays the
interval duration, maximum power for that ride, and maximum power for all
rides below the plot. Also fixes a bug for recording intervals longer than
two seconds.</td>
</tr>
<tr>
<td valign="top">Feb 12, 2007</td>
<td valign="top">
<a href="GoldenCheetah_2007-02-12_Linux_x86.tgz">Linux x86</a>,<br>
<a href="GoldenCheetah_2007-02-12_Darwin_powerpc.dmg">Mac OS X PowerPC</a>
</td>
<td valign="top">Interval information now included in ride summary, rides can
now be exported as comma-separated values for import into Excel, and better
automatic detection of hardware echo. Also includes a number of bux
fixes.</td>
</tr>
<tr>
<td valign="top">Jan 30, 2007</td>
<td valign="top">
<a href="GoldenCheetah_2007-01-30_Linux_x86.tgz">Linux x86</a>,<br>
<a href="GoldenCheetah_2007-01-30_Darwin_powerpc.dmg">Mac OS X PowerPC</a>
</td>
<td valign="top">Bug fix release.</td>
</tr>
<tr>
<td valign="top">Jan 6, 2007</td>
<td valign="top"><a href="GoldenCheetah_2007-01-06_Linux_x86.tgz">Linux
x86</a></td>
<td valign="top">First release for Linux.</td>
</tr>
<tr>
<td valign="top">Dec 25, 2006</td>
<td valign="top"><a href="GoldenCheetah_2006-12-25_Darwin_powerpc.dmg">Mac OS
X PowerPC</a></td>
<td valign="top">Adds the Power Histogram, which shows how much time a rider
spent at each particular power level during a ride.</td>
</tr>
<tr>
<td valign="top">Sep 19, 2006</td>
<td valign="top"><a href="GoldenCheetah_2006-09-19_Darwin_powerpc.dmg">Mac OS
X PowerPC</a></td>
<td valign="top">Adds the Critical Power Plot, which shows the highest average
power you've achieved for every interval length over all your rides and the
selected ride. Also shows download progress in minutes of ride data
downloaded.</td>
</tr>
<tr>
<td valign="top">Sep 7, 2006</td>
<td valign="top"><a href="GoldenCheetah_2006-09-07_Darwin_powerpc.dmg">Mac OS
X PowerPC</a></td>
<td valign="top">Adds speed and cadence to the ride plot. Fixes a bug
found by George Gilliland where reseting the time during a ride could cause
the GUI to crash.</td>
</tr>
<tr>
<td valign="top">Sep 6, 2006</td>
<td valign="top"><a href="GoldenCheetah_2006-09-06_Darwin_powerpc.dmg">Mac OS
X PowerPC</a></td>
<td valign="top">The first release of the Golden Cheetah GUI.</td>
</tr>
</table>
</center>
<p>
<hr width="50%">
<p>
<font face="arial,helvetica,sanserif">
<big><strong>Older Stuff</strong></big>
</font>
<p>
These are the older, source-only, command-line distributions. I've left them
up for historical purposes only; I don't recommend using them.
<center>
<table width="100%" cellspacing="10">
<tr>
<td width="20%"><i>Date</i></td>
<td width="30%"><i>File</i></td>
<td><i>Description</i></td>
</tr>
<tr>
<td valign="top">Aug 11, 2006</td>
<td valign="top"><a href="gc_2006-08-11.tgz">gc_2006-08-11.tgz</a></td>
<td valign="top">ptdl now works with Keyspan USB-to-serial adaptor, after
debugging help from Rob Carlsen.
</td>
</tr>
<tr>
<td valign="top">May 27, 2006</td>
<td valign="top"><a href="gc_2006-05-27.tgz">gc_2006-05-27.tgz</a></td>
<td valign="top">Adds the <code>cpint</code> program for computing critical
power intervals and the <code>ptpk</code> program for converting from
PowerTuned data files (see the <a href="users-guide.html">User's
Guide</a>).</td>
</tr>
<tr>
<td valign="top">May 16, 2006</td>
<td valign="top"><a href="gc_2006-05-16.tgz">gc_2006-05-16.tgz</a></td>
<td valign="top">The first code release, containing <code>ptdl</code> and
<code>ptunpk</code>.</td>
</tr>
</table>
</center>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 197 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 92 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 78 KiB

View File

@@ -1,259 +0,0 @@
<p>
<font face="arial,helvetica,sanserif">
<big><strong>GoldenCheetah 2.1</strong></big>
</font>
</p>
<p>
New Features and Enhancements
<ul>
<li>FIT file support for Mac OSX - Rainer Clasen</li>
<li>SRM 5 - Rainer Clasen</li>
<li>Aerolab Improvements - Damien Grauser</li>
<li>O-Sync Macro X device support - Damien Grauser</li>
<li>Air density (RHO) Calculator - Steven Gribble</li>
<li>Virtual Power - Darren Hague</li>
<li>GoldenCheetah JSON - Mark Liversedge</li>
<li>Support TrainerRoad.com TCX Files - Mark Liversedge</li>
<li>Garmin GPX - Greg Lonnon</li>
<li>Sigma SLF/SMF - Frank Zschockelt</li>
</ul>
</p>
<p>
Internationalisation
<ul>
<li>Czech (David Kramar)</li>
<li>French (Damien Grauser, Guillaume LeMaitre)</li>
<li>German (Alexander Pietsch)</li>
<li>Italian (Robert Masso)</li>
<li>Portugese (Thomas Irps)</li>
<li>Portugese-Brazil (Bruno Assis)</li>
<li>Japanese (Mitsukuni Sato, Keisuke Yamaguchi)</li>
<li>Spanish (Alejandro Martinez)</li>
</ul>
</p>
<p>
Development Builds
<ul>
<li>Gareth Coco</li>
<li>Jamie Kimberley</li>
</ul>
</p>
<p>
Full Change Log
<pre>
Alejandro Martinez (7):
Add Spanish Translation and Enable Metrics Translation
Add Spanish Translation & Fix Translation Issues
Set UTF-8 in charts,metadata and seasons xml files
Add HrZones to Weekly Summary and Fix Spanish Translation
Update Spanish Translation
Enable 3d Plot Translation and include spanish translation
Rho Estimator Translation
Bruno Assis (1):
Portugese (Brazil) Translation
Damien (22):
Modify csv import for ergomo file with comma or semicolon separator
Remove error logs for unused datas in ride file
handle showHr/Speed/Cad/Alt state for stacked view
Add summary metrics list to preferences
Correct crash with truncated files
Add PeakPowerHr metric (average HR during peak power)
Altitude scale present with no altitude data.
Bug #178 TRIMP is not updated after modification in Rest Hr Tag -> compute metric after save
Add a setFocus on the Treelist to correct a MacOs Bug of Qt
Modification to handle odd start page and compatible with qt 4.6
Correct interval
Modify TRIMP formula to use time_riding instead of workout time
Modify Aerolab to add interval highlight and zoom + auto offset
Aerolab : Change LCD display to LineEdit
Correct bug in the peakPowerHr formula
Correct encoding in json parser
Correct bug #496 for longitude < -65
Remove Joule warnings
Update french translation for rho estimator
Change speed to double in Bin parser
Correct intialisation of altitude for TCX without altitude
Correct intialisation of altitude for TCX without altitude
Damien Grauser (2):
Update French translation.
O_Sync Macro X device support
Darren Hague (5):
Virtual Power; Better GSC-10 pairing support.
Corrected - to + in CycleOps formula
Use realtime clock for realtime-mode clock
Add virtual power support for BT-ATS trainer
Remove toMSecsSinceEpoch() and work around
David (1):
Updated Czech translations
Eric Brandt (1):
fix realtime mode load timer and lcd sig. digit display issues
Frank Zschockelt (2):
Support for Sigma SLF/SMF file formats
Included 4 sample sigma files in the test/rides directory
Gareth Coco (25):
Changes to map markers
FIT file reader fixes
Set default Smoothing (secs) in Ride Plot to one (1) second
Change start date from UTC to localtime for bin ride file
Make interval period on map user defineable
Reorder liboauth includes
Comment out QwtDesigner build in qwtconfig.pri.in
Changed kph to km/h in displays
Changed KPH to km/h in displays
Update translation .qm files
Update gc_fr.qm for updated French translation
Fixes for RealtimeController
Initialise LAT/LON to zero (0.0) in the parser
Updated Spanish Translation
Add a Portuguese translation
Add a TCX ride exporter
Fix interpolation of lat/lon when missing or 0/0
Allow CdA to lowest possible in AerolabWindow.cpp
Update translation files
Ordered build - qwt then src
Fixes for Manual Ride Entry
Comment added and replace tabs with spaces
v2.1dev - Allow ride to be added with no Average HR
Update documentation
Added v2.0.0 information.
Greg Lonnon (3):
GPX RideFile Support
changes to the markers in google maps.
Added a QFilesystemWatcher to monitor adding files to the workout directory.
Ilja Booij (1):
fix 'Wrong distance on Tacx caf file import'
Jamie Kimberley (6):
Update download page to reflect build of mac 10.4
force use of no elide and scrollbars in main tab
Update user guide steps 1 and 2
clean up wishlist web page
Add other TRIMP metrics to performance manager.
update French Translation
Justin Knotzke (2):
Cycleops Test Ride
Update of German translation by LukeNRG
Keisuke Yamaguchi (1):
Update Japanese translation files
LukeNRG (4):
German Translation
Updated German Translation
Updated German Translations
German Translations
Mark Liversedge (59):
Updated www.goldencheetah.org for v2.0 release.
Joule support fixed on download page.
Add link to wiki from the website.
Mac PPC binary added to downloads page.
Merge branch 'master' of github.com:/srhea/GoldenCheetah
Translations Bonanza!
Fix Computrainer with Stereo FTDI adaptor
Fix 'Save data' in RealtimeWindow
Updated Czech translation
Fix Wko GPS parsing on 64bit
Fix Virtual Power for Fluid2
Revert "Add Spanish Translation and Enable Metrics Translation"
Fix WKO parser for Ergomo users
Better rounding of time in AllPlot
Fix WKO+ file reader GPS 'drops'
Remove console error for seasons.xml
Fix RideSummaryWindow crash
Fix RideEditor find dialog for 'between'
Fix .man crash in CP plot
Better support for Negative, Inf, NaN and High Values
Fix annoying gap in CP curve.
Fix Save when old .bak exists
Fix SummaryWindow crash
Merge branch 'master' of github.com:/srhea/GoldenCheetah
Don't allow Nan or Inf sample values
Fix LogY Intervals on Histogram
Fit files sometimes go backwards
Guess ride date time for Poweragent CSV files
Add JSON support to v2.1
Merge branch 'master' of github.com:/srhea/GoldenCheetah
Fix date/time handling when importing rides
Update .gitignore for Lex/yacc
Fix Macro device data crash
Support FR310xt latest firmware
Fix FitRideFile for header change
Fix Download Ride Dialog instructions refresh
Merge branch 'master' of github.com:/srhea/GoldenCheetah
SplitRide overwrites existing file
Revert "SplitRide overwrites existing file"
Fix Split Ride file loss bug
Merge branch 'master' of github.com:/srhea/GoldenCheetah
Check Date/Time unique
Summary fixups
Updated translation files.
Add virtual power for LeMond Revolution
Use strtod() to convert text to double
Fix FTDI Adaptor on Linux and Mac
Merge branch 'master' of github.com:/srhea/GoldenCheetah
Better Bounds Checking in RideFile::intervalBegin()
Forward support in .json for temp/slope
Add Virtual Power for 1UP USA bike trainer
FitRideFile distance of zero bug
Disable roch text in metadata
Fix zero speed in TxtRideFile for Imperial units
Support TrainerRoad.com TCX Files/Tcx speed in meters/sec The TCX parser ignored samples where distance is
Fix crash if TRIMP zones > 5
Fix PWX file intervals
Fix SEGV on empty/dodgy FIT files
Merge branch 'master' of github.com:/srhea/GoldenCheetah
Mitsukuni Sato (1):
Japanese Translation
Rainer Clasen (8):
Added SRM5 file format read support
whitespace cleanup
fix reading signed values from srm files
Fit: ignore unknown message types
Fit: support big/little endian data
Fit: handle unknown fields gracefully
SrmRideFile: turned assertions into graceful fail
FitRideFile: turned assertions into graceful fail
Roberto Massa (1):
Italian Translation
Roderic Campbell (1):
There was what looked like a copy paste error. I changed the zone 7 label to the appropriate 7 instead of
Steven Gribble (1):
This patch adds an air density (rho) calculator feature to GoldenCheetah.
Thomas Irps (1):
Portuguese translation
Tim Shaffer (1):
Make the default date range for Performance Manager a user preference.
kohasa (1):
enabled editing interval duration by keyboard.
lemaitre (1):
Updating of the French translation
unknown (1):
This patch correct altitude for TCX files converted from FIT files These files doesn't have altitude for e
</pre>
</p>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 192 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 195 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 134 KiB

BIN
doc/screenshot-cpint.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

BIN
doc/screenshot-download.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

BIN
doc/screenshot-phist.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 54 KiB

BIN
doc/screenshot-plot.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 KiB

BIN
doc/screenshot-summary.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 81 KiB

BIN
doc/screenshot-weekly.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

View File

@@ -3,115 +3,47 @@
<p>
<center>
<p>
<big><font face="arial,helvetica,sanserif">
Ride Summary
The Download Dialog
</font></big>
<p>
<img src="ride-summary.png" alt="Ride Summary Screen" align="center">
<img src="screenshot-download.png" alt="Download Dialog" align="center">
<p>
<big><font face="arial,helvetica,sanserif">
Plotting Altitude, Cadence, Heart Rate, Power, and Speed
The Ride Summary
</font></big>
<p>
<img src="ride-plot.png" alt="Power and HR Plot" align="center">
<img src="screenshot-summary.png" alt="Ride Summary Screen" align="center">
<p>
<big><font face="arial,helvetica,sanserif">
Plotting in a Stacked View
The Power, Heart Rate, Speed, and Cadence Plot
</font></big>
<p>
<img src="ride-plot2.png" alt="Stacked Power and HR Plot" align="center">
<img src="screenshot-plot.png" alt="Power and HR Plot" align="center">
<p>
<big><font face="arial,helvetica,sanserif">
Plotting Critical Power
The Critical Power Plot
</font></big>
<p>
<img src="critical-power-plot.png" alt="The Critical Power Plot" align="center">
<img src="screenshot-cpint.png" alt="The Critical Power Plot" align="center">
<p>
<big><font face="arial,helvetica,sanserif">
Histogram Analysis
The Power Histogram
</font></big>
<p>
<img src="histogram-analysis.png" alt="The Power Histogram" align="center">
<p>
<big><font face="arial,helvetica,sanserif">
Plotting Pedal Force Versus Pedal Velocity
</font></big>
<p>
<img src="pf-pv-plot.png" alt="The Power Histogram" align="center">
<img src="screenshot-phist.png" alt="The Power Histogram" align="center">
<p>
<big><font face="arial,helvetica,sanserif">
The Weekly Summary
</font></big>
<p>
<img src="weekly-summary.png" alt="The Weekly Summary" align="center">
<img src="screenshot-weekly.png" alt="The Weekly Summary" align="center">
<p>
<big><font face="arial,helvetica,sanserif">
Plot from a selection of over 30 metrics
</font></big>
<p>
<img src="metrics-power.png" alt="The Power Metrics" align="center">
<p>
<big><font face="arial,helvetica,sanserif">
Including Time and Distance
</font></big>
<p>
<img src="metrics-timedist.png" alt="The Time and Distance" align="center">
<p>
<big><font face="arial,helvetica,sanserif">
Time In Zone
</font></big>
<p>
<img src="metrics-tiz.png" alt="The Time In Zone" align="center">
<p>
<big><font face="arial,helvetica,sanserif">
Plot with Google Maps
</font></big>
<p>
<img src="map.png" alt="Google Maps" align="center">
<p>
<big><font face="arial,helvetica,sanserif">
Plot in 3 Dimensions
</font></big>
<p>
<img src="3d.png" alt="The 3d plot" align="center">
<p>
<big><font face="arial,helvetica,sanserif">
Edit and Correct Ride Data
</font></big>
<p>
<img src="editor.png" alt="The Ride Editor" align="center">
<p>
<big><font face="arial,helvetica,sanserif">
The Performance Manager
</font></big>
<p>
<img src="pm.png" alt="The Performance Manager" align="center">
<p>
<big><font face="arial,helvetica,sanserif">
Train with a Computrainer or ANT+ Device
</font></big>
<p>
<img src="realtime.png" alt="The Realtime Window" align="center">
<p>
<big><font face="arial,helvetica,sanserif">
Export to Google Earth 5.2
</font></big>
<p>
<img src="google-earth.png" alt="Google Earth 5.2" align="center">
<p>
<big><font face="arial,helvetica,sanserif">
The Aerolab
</font></big>
<p>
<img src="aerolab.png" alt="Aerolab" align="center">
</center>

View File

@@ -1,35 +1,14 @@
<!-- $Id: users-guide.content,v 1.5 2006/05/27 16:32:46 srhea Exp $ -->
<p>
Note that more detailed information is often available on the
<a href = http://bugs.goldencheetah.org/projects/goldencheetah/wiki>
Golden Cheetah Wiki</a>.
<p>
What follows is a brief step-by-step guide to installing and setting up
Golden Cheetah.
<p>
<big><font face="arial,helvetica,sanserif">
Step 1 (optional): Installing the FTDI drivers
Step 1: Installing the FTDI drivers
</font></big>
<p>
This step is only needed if you want to download rides from a powertap
pro/comp/cervo head unit via the supplied USB cradle. Furthermore, most
Windows and Linux systems should recognize the device without installing
the drivers below.
<p>
Depending on your operating system, you <i>may</i> need to install the
<ahref="http://www.ftdichip.com/Drivers/D2XX.htm">FTDI D2XX driver</a> if
you're using the PowerTap's new USB download cradle.
Note: version 0.1.7 of the FTDI drivers for Mac seems to be buggy. Until they
post a patched version, you can download version 0.1.6
<a href="http://bugs.goldencheetah.org/attachments/download/1/Universal_D2XX0.1.6.dmg"> here</a>
and install via the terminal. Or if you are not terminal savvy, download an installer that will
perform the installation of the 0.1.6 drivers for you
<a href="http://bugs.goldencheetah.org/attachments/download/248/Install_D2XX_drivers.mpkg.zip">
here</a>.
Depending on your operating system, you may need to install the <a
href="http://www.ftdichip.com/Drivers/D2XX.htm">FTDI USB
driver</a> if you're using the PowerTap's new USB download cradle. The FTDI USB drivers are an optional install if you do not plan on downloading from your device using Golden Cheetah.
</p>
<p>
If you're running Linux, you may also need to uninstall the <code>brtty</code>
@@ -62,30 +41,22 @@ and download the version for your operating system and processor.
On Mac OS X, when the download finishes, Mac OS X should automatically open
the <code>.dmg</code> file for you. If not, double-click to open it. Drag
the GoldenCheetah icon into your Applications folder, and you're done.
</p>
<p>
The Windows version has an installer. Just run the Installer, select where
to install the application and away you go.
</p>
<p>
The Linux version of GoldenCheetah is distributed as a GZipped tar archive.
Download this file and save it to <code>/tmp</code>, then from a terminal:
The Linux version of GoldenCheetah is distributed as a tarball. Download this
file and save it to <code>/tmp</code>, then from a terminal:
<pre>
cd /tmp
tar xvzf GoldenCheetah_X.X.X_Linux_ARCH.tgz
cd GoldenCheetah_X.X.X_Linux_ARCH
sudo chmod u+x GoldenCheetah
tar xzvf GoldenCheetah_DATE_Linux_x86.tgz
cd GoldenCheetah_DATE_Linux_x86
sudo cp GoldenCheetah /usr/local/bin
cd ..
rm -rf GoldenCheetah_X.X.X_Linux_ARCH
rm -rf GoldenCheetah_DATE_Linux_x86.tgz
</pre>
Be sure to replace "X.X.X" with the version of the release you downloaded,
such as "2.1.0" and replace "ARCH" with the architecture of the release
you download - either "x86" (32bit) or "x84_64" (64bit).
Be sure to replace "DATE" with the date of the revision you downloaded, such
as "2007-09-23".
<p>
<big><font face="arial,helvetica,sanserif">
@@ -94,9 +65,7 @@ Step 3: Running GoldenCheetah
<p>
To run GoldenCheetah on Mac OS X, double-click on the GoldenCheetah icon in
your Applications folder. On Windows, click the Start button, All Programs
link, GoldenCheetah folder and then the Golden Cheetah program. On Linux,
just type "GoldenCheetah" at the prompt.
your Applications folder. On Linux, just type "GoldenCheetah" at the prompt.
<p>
The first time you run GoldenCheetah, you'll get an empty "Choose a Cyclist"
@@ -185,102 +154,25 @@ maximum power you can sustain over an hour. Some people call this your
rose by any other name would smell as sweet.
<p>
There are currently three ways to set up your power zones. Each method has
its benefits, so feel free to select the method that best suits your needs.
<p><b>Method 1: Set via critical power plot.</b>
<p> GoldenCheetah can determine a value for your CP value based on all
of the data in your critical power plot. The calculated value of CP can
be used to create a new range in your power.zones file by clicking the
"save CP value" button in the lower right corner of the critical power
plot tab. The new range will use the default zone definitions (see Method 2).
Once the new range is set, you can manually edit the file to change the zone
definitions as in Method 3.
We'll have a dialog box that will let you set up your power zones and
critical power in a future version of GoldenCheetah, but for now you'll need
to use a text editor. On Linux, that probably means nano, vi, or emacs.
On Mac, the easiest editor to use is TextEdit, which is in your Applications
folder.
<p>
<b>Method 2: User preferences.</b>
<p>
From the menu bar select GoldenCheetah->Preferences, then click on
"cyclist info". The window should look like this:
Start by
downloading <a href="power.zones">this sample file</a> and saving it in
<pre>
~/Library/GoldenCheetah/Your Name/power.zones
</pre>
<p>
<center><img src="cyclist-info.png"></center>
<p>
Enter a value for critical power at the top of the dialog and click save
to set your CP. New ranges can also be set via this dialog so that you can
adjust your CP value throughout the season as your fitness increases (or
decreases). Once your CP is set, GoldenCheetah will set up seven power zones
based on percentages of your CP value. The zones are:
<p>
<table align="center" width="450">
<tr>
<td>Zone</td>
<td>Description</td>
<td>Low</td>
<td>High</td>
</tr>
<tr>
<td>Z1</td>
<td>Active Recovery</td>
<td>0%</td>
<td>55%</td>
</tr>
<tr>
<td>Z2</td>
<td>Endurance</td>
<td>55%</td>
<td>75%</td>
</tr>
<tr>
<td>Z3</td>
<td>Tempo</td>
<td>75%</td>
<td>90%</td>
</tr>
<tr>
<td>Z4</td>
<td>Threshold</td>
<td>90%</td>
<td>105%</td>
</tr>
<tr>
<td>Z5</td>
<td>VO2 Max</td>
<td>105%</td>
<td>120%</td>
</tr>
<tr>
<td>Z6</td>
<td>Anaerobic</td>
<td>120%</td>
<td>150%</td>
</tr>
<tr>
<td>Z7</td>
<td>Neuromuscular</td>
<td>150%</td>
<td>MAX</td>
</tr>
</table>
<p>
If you want to use other zones boundaries or labels, you can manually edit
the power.zones file as described in Method 3.
<p>
<b>Method 3: Manually edit the power.zones file.</b>
<p>
To edit/create the power.zones file you'll need to use a text editor.
On Linux, that probably means nano, vi, or emacs. On Mac, the easiest
editor to use is TextEdit, which is in your Applications folder.
<p> Start by downloading <a href="power.zones">this sample file</a> and saving
it in your rider directory, which is listed in the GoldenCheetah->About GoldenCheetah
menu item.
<p>
Open the power.zones file in a text editor and you'll see this:
where "~" is your home directory (e.g., <code>/Users/srhea</code> on Mac or
<code>/home/srhea</code> on Linux) and "Your Name" is the name you chose when
you first opened GoldenCheetah. Open the power.zones file in a text editor
and you'll see this:
<blockquote>
<pre>
@@ -329,8 +221,6 @@ with a <code>.txt</code> extension. Use the menu command "Format->Make Plain
Text" to get it to let you save the file with a <code>.zones</code> extension
instead.
<p>
<p>
<big><font face="arial,helvetica,sanserif">
Legacy Command-Line Tools

Binary file not shown.

Before

Width:  |  Height:  |  Size: 162 KiB

View File

@@ -1,18 +1,29 @@
<big><font face="arial,helvetica,sanserif">
I wish GoldenCheetah would let me...
</font></big>
<p>If you have a new feature that you'd like to see in GoldenCheetah
please create a new issue on our
<a href=http://bugs.goldencheetah.org/projects/show/goldencheetah>bug/feature
tracker</a>. Instructions for doing so are <a href="bug-tracker.html">here</a>.
<p>
Examples of some features are:
<ul>
<li>Split one ride into multiple rides</li>
<li>Download directly from SRM</li>
<li>Graph ride metrics (daily hours, work, BikeScore) over the long
term (weeks, seasons)</li>
<li>Automatically calculate CP from .cpi files</li>
<li>Display the numbers at the bottom of the ride plot, like the
critical power graph does</li>
<li>Select intervals in the ride plot and display metrics for them
at the bottom</li>
<li>Pop up an "importing rides" thermometer when importing</li>
<li>Remember last settings for showPower, showHr, etc., in ride plot</li>
<li>Switch ride plot x-axis from time to distance</li>
<li>Edit power zones in a dialog</li>
<li>-done- Sort rides in AllRides newest to oldest</li>
<li>Group rides list into seasons</li>
<li>Group rides list by type, course</li>
<li>Add lines to CP plot for seasons, last six (eight?) weeks, etc.</li>
<li>Create new intervals</li>
<li>Ignore zeros in power histogram</li>
<li>Show mulitple rides (seasons, etc.) in power histogram</li>
<li>Annotate ride plot</li>
<li>Label rides by type, course</li>
<li>Use the current date as default when importing CSV files</li>
</ul>

2
qwt/.gitignore vendored
View File

@@ -1,2 +0,0 @@
lib
qwtconfig.pri

View File

@@ -1,409 +0,0 @@
Release 5.2.1
===================
Bug Fixes
---------
1) QwtScaleDraw
Wrong border dist hints for unregular scale divisions fixed
Release 5.2.0
===================
Changes
-------
1) Ported to Qt 4.5.x
2) Scaling of non cosmetic pens (for printing to devices in high resolution)
3) Clipping of polygons for SVG rendering
4) QwtRect removed
use QwtClipper instead
5) QwtPlotRescaler
Introduced
6) QwtDoubleInterval
BorderMode introduced
7) QwtPlotCurve
Performance of incremental curve painting ( = draw(from, to) ) improved.
8) QwtLegendItem
setIdentfierMode renamed to setIdentifierMode
9) QwtPlotCanvas::replot() introduced
code from QwtPlot::replot shifted
10)QwtPlot
drawCanvas(), updateAxes() changed from protected to public
11)QwtScaleEngine
loMargin/hiMargin renamed to lowerMargin/upperMargin
12)QwtScaleDiv
lBound/hBound renamed to lowerBound/upperBound
13)QwtSpline
cofficientA/B/C introduced
14)QwtDial
counter clockwise scales introduced
15)QwtPlotMarker
Vertical text labels
16)doc/qwt-5.2.0.qch added foe browsing the Qwt docs in the Qt assistant
Bug Fixes
---------
1) QwtLinearScaleEngine
Rounding problems fixed
2) Again some print layout problems fixed
3) QwtPlotScaleItem: 1 pixel offset fixed
4) QwtPlotSpectrogram, clipping of contour lines
against the bounding rect
5) QwtPlotZoomer::setZoomStack for stacks with unlimited depth
6) Printing of rotated tick labels
Release 5.1.1
===================
Bug Fixes
---------
1) Several compiler incompatibilities fixed
2) DBL_EPSILON removed
Using DBL_EPSILON in the calculations of the dials/sliders and the
scale engines leads to problems with the inaccuracy of floating points.
The behaviour has been reverted to 5.0.x.
3) QwtSlider/QwtKnob
setScaleDraw() fixed.
4) QwtRect
Pointless private declaration removed
Release 5.1.0
===================
Changes
-------
1) QwtSymbol::copy introduced
Now it is possible to use derived symbol classes for curves
2) QwtPlotScaleItem introduced
A new type of plot item for displaying axes on the canvas
3) QwtClipper added
A collection of clipping algos
4) Using DBL_EPSILON
This change allows smaller intervals for sliders/dials
5) QwtPanner
setOrientation() added.
6) QwtPlot
axisStepSize() added
clear is virtual now
7) QwtPlotPrintFilter
PrintCanvasBackground splitted into PrintBackground, PrintFrameWithScales
8) QwtPlotZoomer
setZoomStack() added
9) Changes for the QwtPolar package
QwtLegendItemManager introduced
QwtMagnifier introduced
10)Suffix rules added in qwtconfig.pri for different targets for
debug/release builds.
Bug Fixes
---------
1. QwtAbstractScaleDraw::setAbstractScaleDraw
Reinitialization problem fixed
2. QwtLegendItem
key event handlers fixed
3. QwtPicker
solaris-cc compiler problem fixed
4. Inaccurate mapping of scale to widget coordinates fixed
5. QwtPlotCurve::draw
Updates for Qt 4.3 added
6. QwtPlotLayout
AlignToCanvas layout calculation fixed
7. QwtPlot::print
Workaround for a QPen initialization problem,
when printing to Pdf, added
8. QwtText
Layout of rich text documents fixed
9. Designer
Handling of QwtScaleWidget fixed
10. realtime example
Qt::WA_PaintOutsidePaintEvent added, ScrollZoomer fixed
11. Several others I have forgotten
Release 5.0.2
===================
Bug Fixes
---------
1. QwtPlotCurve::Xfy curve type fixed
2. Memory leak in QwtLegend fixed
3. Vertical alignment of rich texts fixed
4. Workaround for a Qt4 bug added, that produces horrible performance
when painting curves with a pen width > 1.
5. Background for the tracker text of QwtPickers fixed.
Improved (faster + better rendered texts) implementation of
painting tracker texts, using capabilities of Qt >= 4.3.
6. QwtArrowButton/QwtCounter: workaround for layout bug ( Qt < 4.3 )
of the Cleanlook style added.
7. A couple of minor fixes
Changes
-------
1. QSvgGenerator added to the bode example
Release 5.0.1
===================
Changes
-------
1. A couple of problems, when building Qwt fixed.
2. Displaying Rich Text with Qt 4.x fixed
Release 5.0.0
===================
Platforms
---------
Support of Qt3 and Qt4. Qt2 is not supported any longer.
Key features
------------
1. Redesign of plot items. Makes it much easier to develop
individual items.
2. Redesign of the scale classes. All calculations are
collected in scale engines, where the application can
implement it´s own (f.e log2, or date scales). Now it´s
also possible to have individual and completely irregular scales
3. Redesign of the QwtText classes. The MathML renderer of
the Qt4 solutions package is embedded.
work for all expressions/situations.
4. New classes for navigating: QwtPanner, QwtMaginfier
5. Spectrogram/Contour plots and other classes for displaying
raster data added.
Changes
-------
5.0.0 is by far the release with the most changes in the history of Qwt
- too many to make list.
Release 4.2.0/0.4.2
===================
License
--------
A couple of exceptions to the LGPL with the intention to allow static
linking with commercial applications. See COPYING.
Key features:
-------------
1. Designer plugin
2. Rich Text support ( f.e. E = m * c<sup>2</sup> ) added.
3. QwtDial class family added (QwtDial, QwtCompass, QwtAnalogClock, ...)
4. QwtPicker class family added. Includes QwtPlotZoomer, a complete
implementation of recursive zooming.
5. Device metrics independent printing of QwtPlot. (QPrinter::HighResolution)
6. QwtPlot::setCurveBrush(), QwtCurve::setBrush() added. The area
between curve and baseline will be filled with this brush.
7. Rotation of axis tick labels added. Very useful for axis with long
labels like time scales ...
8. Added a new abstract QwtData class to plot data from almost any type of
container class.
9. QwtDoublePoint, QwtDoubleSize, QwtDoubleRect double counterparts
for QPoint, QSize, QRect.
10. First steps to support Qtopia. All examples can be compiled and started
in the qvfb emulator.
Changes:
---------
1. Rewrite of QwtLegend/QwtLegendItem (no QTable anymore)
2. Each plot item will be painted, even if one of the axis it is
attached to is disabled. (like in all other releases beside 0.4.1)
3. Code for double buffering moved to a new class QwtPaintBuffer.
Double buffering can be enabled/disabled now.
4. QwtPainter, QwtMetricsMap, QwtLayoutMetrics added
Hide paint device metrics dependencies.
5. Layout code rewritten and moved to a new class QwtPlotLayout
New layout options canvasMargin(), alignCanvasToScales()
6. QwtPlot: sizeHint() != minimumSizeHint()
9. Internal plot data are private again. A couple of get methods
added instead.
10. canvas repaints triggered by paint events. Enables event filtering
11. QwtPlot::drawCanvasItems added. In opposite to QwtPlot::drawCanvas
it is used by the printing code too.
12. qwtMax, qwtMin, qwtInt mapped to QMAX, QMIN, qRound from qglobal.h
13. operator= for plot item classes changed.
14. readOnly property added for sliders.
15. valid flag added for QwtDblRange
16. QwtCounter wrap around policy: a counter under- or overflow sets
focus to the smallest up/down button and disables counting.
A space bar keypress release event re-enables counting.
17. QwtPushButton added. A class that adds rich text and alignments
features to QPushButton, like they are used in QLabel
18. Clipped painting code moved from QwtCurve to QwtPainter/QwtRect
19. Canvas cache added to optimize trivial repaints.
20. QwtPlot::drawCurve added for incremental curve data
21. QwtSliderBase, readOnly, isValid added
22. Added filtering of the colors of the title and scales to QwtPrintFilter.
23. Support of QT_NO_CAST_ASII and QT_NO_COMPAT added
24. Batch file added for generating Visual Studio project files
25. QwtPlotCurve, QwtPlotMarker, QwtPlotGrid: more methods public
26. QwtPlot::setLegendPosition added
27. A lot of changes I don't remember, ... sorry.
Bugfixes:
---------
1. Autodetection of painter redirection. QPixmap::grabWidget() works
with Qwt Widgets again.
2. QwtSlider: Rounding double->int conversions instead of simple casts.
3. Bad additional line, connected to the first curve point, when zooming
deep, fixed.
4. QwtMarker: Painting of symbols with width != height fixed
5. QwtPlot::plotMouseXXX/canvasMap pixel coordinates synced.
Now both include the canvas frame.
6. Layout fixed for QwtScaleDraws without tick labels
8. Tab focus chains fixed, focus indications added.
9. Support QwtAutoScale::Inverted when autoScale is off also.
10. Keyboard control, focus indications added.
11. Improved QStyle awareness.
12. Printing of plots with disabled axes
Examples
--------
1. New example linux/cpustat added. Runs also on non linux boxes
with dummy values. Beside showing a couple of features that
are new with 0.4.1 and 0.4.2, it shows how to extend and customize
a QwtPlots.
2. Added new example event_filter to demonstrate event filtering.
This example shows how to add additional controls to the scales,
how to translate mouse clicks on the scales into signals and
how to move points on the canvas.
3. realtime example shows how to use scrollbars when zooming
Release 0.4.1
============
Changes:
---------
1. Platform independent project files. makefiles directory removed.
2. RPM spec file template added.
3. __declspec formalism added for Win32 DLLs. Requires
'DEFINES += QWT_DLL' in the .pro file.
4. QString used for visible texts.
5. Code for error curves removed. These type of features should be
implemented in derived curve classes.
6. A lot of Qt 1.2 related code removed/replaced.
7. QwtColorFilter, QwtPixFrame removed. QwtPlotPixFrame renamed
to QwtPlotCanvas.
8. qmodules.h aware. Skips QwtLegend in case of !QT_MODULE_TABLE
9. All Widgets including QwtPlot optimized to reduce flicker
during resize/repaint.
10. QwtPlot curves/markers can be disabled/enabled to hide/show individual
curves without removing the curves from the plot.
11. Internal maps removed from QwtCurve. QwtCurve::setMap, QwtCurve::setRect,
QwtCurve::setRange removed.
Feature additions:
------------------
1. Printing
QwtPlot::print prints to any type of QPaintDevice now.
Hardcoded printer attributes margin, creator and document title have
been removed and must/can be set by the applications now.
Printing of background and legends added. QwtColorFilter replaced
by QwtPlotPrintFilter.
2. Layout
Many layout fixes and additions. Now all Widgets behave well in
QLayouts and provide sensible sizeHints. QwtPlot::setMargin(int) added.
Fieldwidth added for QwtPlot::setAxisFormat for application that need
range independent width. Title and axis title are Qt:Alignment aware.
Qt::WordBreak or multiline titles are possible.
3. Legend
En/Disabling of single curves in the legend added.
QwtPlot::setAutoLegend added.
4. Extensibility
QwtPlot::insertCurve + QwtPlot::insertMarker added. Now derived
classes of QwtPlotCurve and QwtPlotMarker can be added. Virtual
methods provided by QwtPlotCurve for sub-classing.
QwtScale::setScaleDraw + QwtPlot::setAxisScaleDraw + some virtual
methods for QwtScaleDraw added. Application can implement individual
axis labels now.
5. Sliders
QWheelEvent added. The MouseWheel stepsize is controlled by the
Scroll Page Size. QwtWheel::setWheelWidth added. QwtKnob::setSymbol,
QwtKnob::symbol added.
Bugfixes:
---------
1. Workaround for spontanous curves resulting from overruns
when zooming too deep.
2. Wrong QColorGroup::ColorRole for background colors fixed.
Necessary for several non default QStyles.
3. QwtWheel fixed for vertical wheels. Better color support.
4. QwtSlider fixed.
5. Many forgotten others
Release 0.4.0
============
Bugfixes:
---------
1. A few occurences of the boolean literal \c false were changed into macro
\c FALSE for cross compiler compatibility.
2. A few local variables in member functions were renamed to suppress
warnings issued by really picky compilers about global/class variables
being hidden.
3. In qwt_legend.h, a fully qualified name was used in a class declaration.
The HPUX compiler chokes on this (and it's ugly), so it was fixed.
4. Macro M_2PI is now only defined is this hasn't already been done by the
system's clib.
Feature additions:
------------------
1. Qwt now works with Qt3.0. In order to achieve this, QwtLegend now no
longer derives from QTableView, but from QTable. This seems to have had
quite a few consequences. Kudo's to Uwe Rathmann for uploading this nice
fix to the CVS tree.
2. Getters for a plot's title and title font have been added.
Release 0.3.0
============
License:
--------
1. The license has changed from GPL to LGPL.
Bugfixes:
---------
1. The makefiles for win32 caused object files to have extension .o instead of
.obj. The 'propagate' file was changed to fix this, using tmake's target
platform flag.
2. There were problems with rint() on win32 platforms. rint() is a BSD call,
not even available on all unices. All calls to rint(x) have been replaced
by floor(x+.5).
3. Some static class data members were initialized with the value of other
static class data members (from Qt). This caused programs depend on the
initialization order of class members. This is now fixed by replacing the
static properties by static signleton factories.
4. When a plot was zoomed and then printed, curves and markers laying outside
the plot's scale were still printed. The print() function now uses clipping.
Feature additions:
------------------
1. Multi-line plot titles are now supported: the PostScript document name is
not the plot title, with "\n" characters replaced by "--". Geometry
management has been changed to support multi-line titles.
2. In the mailinglist, there were often feature requests for features that
were in fact implemented, but not available through QwtPlot's API. Many
private members have been made protected or even public, to give users
more control. This is poor design, but Qwt will be refactored anyway.
3. Qwt always displayed floats with 5 digits. This was insufficient for many
applications. QwtPlot, QwtScale, QwtAutoScale got some methods to set the
label format. This is a printf like format for the numbers at the scales,
consisting of 'f' and a precision, or 'g' and the significance.
Build system:
-------------
1. The 'makefiles' directory was removed from the cvs tree, and is now only
generated for releases. CVS users should have tmake installed, to generate
the makefiles themselves.
2. The 'examples' directory now uses tmake's 'subdirs' template, to iterate
over all subdirectories and build all examples with one command. There was
allready a makefile for this, but now the process is automated by tmake.
3. Under unix, the library now gets a proper version number. Current version
is 0.3.0.
Documentation:
--------------
1. All documentation is converted to the Doxygen documentation system. The
release contains two settings files, 'Doxygen' and 'Doxygen.users',
generating a developer's and user's manual, respectively.

View File

@@ -1,543 +0,0 @@
Qwt License
Version 1.0, January 1, 2003
The Qwt library and included programs are provided under the terms
of the GNU LESSER GENERAL PUBLIC LICENSE (LGPL) with the following
exceptions:
1. Widgets that are subclassed from Qwt widgets do not
constitute a derivative work.
2. Static linking of applications and widgets to the
Qwt library does not constitute a derivative work
and does not require the author to provide source
code for the application or widget, use the shared
Qwt libraries, or link their applications or
widgets against a user-supplied version of Qwt.
If you link the application or widget to a modified
version of Qwt, then the changes to Qwt must be
provided under the terms of the LGPL in sections
1, 2, and 4.
3. You do not have to provide a copy of the Qwt license
with programs that are linked to the Qwt library, nor
do you have to identify the Qwt license in your
program or documentation as required by section 6
of the LGPL.
However, programs must still identify their use of Qwt.
The following example statement can be included in user
documentation to satisfy this requirement:
[program/widget] is based in part on the work of
the Qwt project (http://qwt.sf.net).
----------------------------------------------------------------------
GNU LESSER GENERAL PUBLIC LICENSE
Version 2.1, February 1999
Copyright (C) 1991, 1999 Free Software Foundation, Inc.
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
[This is the first released version of the Lesser GPL. It also counts
as the successor of the GNU Library Public License, version 2, hence
the version number 2.1.]
Preamble
The licenses for most software are designed to take away your
freedom to share and change it. By contrast, the GNU General Public
Licenses are intended to guarantee your freedom to share and change
free software--to make sure the software is free for all its users.
This license, the Lesser General Public License, applies to some
specially designated software packages--typically libraries--of the
Free Software Foundation and other authors who decide to use it. You
can use it too, but we suggest you first think carefully about whether
this license or the ordinary General Public License is the better
strategy to use in any particular case, based on the explanations below.
When we speak of free software, we are referring to freedom of use,
not price. Our General Public Licenses are designed to make sure that
you have the freedom to distribute copies of free software (and charge
for this service if you wish); that you receive source code or can get
it if you want it; that you can change the software and use pieces of
it in new free programs; and that you are informed that you can do
these things.
To protect your rights, we need to make restrictions that forbid
distributors to deny you these rights or to ask you to surrender these
rights. These restrictions translate to certain responsibilities for
you if you distribute copies of the library or if you modify it.
For example, if you distribute copies of the library, whether gratis
or for a fee, you must give the recipients all the rights that we gave
you. You must make sure that they, too, receive or can get the source
code. If you link other code with the library, you must provide
complete object files to the recipients, so that they can relink them
with the library after making changes to the library and recompiling
it. And you must show them these terms so they know their rights.
We protect your rights with a two-step method: (1) we copyright the
library, and (2) we offer you this license, which gives you legal
permission to copy, distribute and/or modify the library.
To protect each distributor, we want to make it very clear that
there is no warranty for the free library. Also, if the library is
modified by someone else and passed on, the recipients should know
that what they have is not the original version, so that the original
author's reputation will not be affected by problems that might be
introduced by others.
Finally, software patents pose a constant threat to the existence of
any free program. We wish to make sure that a company cannot
effectively restrict the users of a free program by obtaining a
restrictive license from a patent holder. Therefore, we insist that
any patent license obtained for a version of the library must be
consistent with the full freedom of use specified in this license.
Most GNU software, including some libraries, is covered by the
ordinary GNU General Public License. This license, the GNU Lesser
General Public License, applies to certain designated libraries, and
is quite different from the ordinary General Public License. We use
this license for certain libraries in order to permit linking those
libraries into non-free programs.
When a program is linked with a library, whether statically or using
a shared library, the combination of the two is legally speaking a
combined work, a derivative of the original library. The ordinary
General Public License therefore permits such linking only if the
entire combination fits its criteria of freedom. The Lesser General
Public License permits more lax criteria for linking other code with
the library.
We call this license the "Lesser" General Public License because it
does Less to protect the user's freedom than the ordinary General
Public License. It also provides other free software developers Less
of an advantage over competing non-free programs. These disadvantages
are the reason we use the ordinary General Public License for many
libraries. However, the Lesser license provides advantages in certain
special circumstances.
For example, on rare occasions, there may be a special need to
encourage the widest possible use of a certain library, so that it becomes
a de-facto standard. To achieve this, non-free programs must be
allowed to use the library. A more frequent case is that a free
library does the same job as widely used non-free libraries. In this
case, there is little to gain by limiting the free library to free
software only, so we use the Lesser General Public License.
In other cases, permission to use a particular library in non-free
programs enables a greater number of people to use a large body of
free software. For example, permission to use the GNU C Library in
non-free programs enables many more people to use the whole GNU
operating system, as well as its variant, the GNU/Linux operating
system.
Although the Lesser General Public License is Less protective of the
users' freedom, it does ensure that the user of a program that is
linked with the Library has the freedom and the wherewithal to run
that program using a modified version of the Library.
The precise terms and conditions for copying, distribution and
modification follow. Pay close attention to the difference between a
"work based on the library" and a "work that uses the library". The
former contains code derived from the library, whereas the latter must
be combined with the library in order to run.
GNU LESSER GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License Agreement applies to any software library or other
program which contains a notice placed by the copyright holder or
other authorized party saying it may be distributed under the terms of
this Lesser General Public License (also called "this License").
Each licensee is addressed as "you".
A "library" means a collection of software functions and/or data
prepared so as to be conveniently linked with application programs
(which use some of those functions and data) to form executables.
The "Library", below, refers to any such software library or work
which has been distributed under these terms. A "work based on the
Library" means either the Library or any derivative work under
copyright law: that is to say, a work containing the Library or a
portion of it, either verbatim or with modifications and/or translated
straightforwardly into another language. (Hereinafter, translation is
included without limitation in the term "modification".)
"Source code" for a work means the preferred form of the work for
making modifications to it. For a library, complete source code means
all the source code for all modules it contains, plus any associated
interface definition files, plus the scripts used to control compilation
and installation of the library.
Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope. The act of
running a program using the Library is not restricted, and output from
such a program is covered only if its contents constitute a work based
on the Library (independent of the use of the Library in a tool for
writing it). Whether that is true depends on what the Library does
and what the program that uses the Library does.
1. You may copy and distribute verbatim copies of the Library's
complete source code as you receive it, in any medium, provided that
you conspicuously and appropriately publish on each copy an
appropriate copyright notice and disclaimer of warranty; keep intact
all the notices that refer to this License and to the absence of any
warranty; and distribute a copy of this License along with the
Library.
You may charge a fee for the physical act of transferring a copy,
and you may at your option offer warranty protection in exchange for a
fee.
2. You may modify your copy or copies of the Library or any portion
of it, thus forming a work based on the Library, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:
a) The modified work must itself be a software library.
b) You must cause the files modified to carry prominent notices
stating that you changed the files and the date of any change.
c) You must cause the whole of the work to be licensed at no
charge to all third parties under the terms of this License.
d) If a facility in the modified Library refers to a function or a
table of data to be supplied by an application program that uses
the facility, other than as an argument passed when the facility
is invoked, then you must make a good faith effort to ensure that,
in the event an application does not supply such function or
table, the facility still operates, and performs whatever part of
its purpose remains meaningful.
(For example, a function in a library to compute square roots has
a purpose that is entirely well-defined independent of the
application. Therefore, Subsection 2d requires that any
application-supplied function or table used by this function must
be optional: if the application does not supply it, the square
root function must still compute square roots.)
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Library,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works. But when you
distribute the same sections as part of a whole which is a work based
on the Library, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote
it.
Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Library.
In addition, mere aggregation of another work not based on the Library
with the Library (or with a work based on the Library) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.
3. You may opt to apply the terms of the ordinary GNU General Public
License instead of this License to a given copy of the Library. To do
this, you must alter all the notices that refer to this License, so
that they refer to the ordinary GNU General Public License, version 2,
instead of to this License. (If a newer version than version 2 of the
ordinary GNU General Public License has appeared, then you can specify
that version instead if you wish.) Do not make any other change in
these notices.
Once this change is made in a given copy, it is irreversible for
that copy, so the ordinary GNU General Public License applies to all
subsequent copies and derivative works made from that copy.
This option is useful when you wish to copy part of the code of
the Library into a program that is not a library.
4. You may copy and distribute the Library (or a portion or
derivative of it, under Section 2) in object code or executable form
under the terms of Sections 1 and 2 above provided that you accompany
it with the complete corresponding machine-readable source code, which
must be distributed under the terms of Sections 1 and 2 above on a
medium customarily used for software interchange.
If distribution of object code is made by offering access to copy
from a designated place, then offering equivalent access to copy the
source code from the same place satisfies the requirement to
distribute the source code, even though third parties are not
compelled to copy the source along with the object code.
5. A program that contains no derivative of any portion of the
Library, but is designed to work with the Library by being compiled or
linked with it, is called a "work that uses the Library". Such a
work, in isolation, is not a derivative work of the Library, and
therefore falls outside the scope of this License.
However, linking a "work that uses the Library" with the Library
creates an executable that is a derivative of the Library (because it
contains portions of the Library), rather than a "work that uses the
library". The executable is therefore covered by this License.
Section 6 states terms for distribution of such executables.
When a "work that uses the Library" uses material from a header file
that is part of the Library, the object code for the work may be a
derivative work of the Library even though the source code is not.
Whether this is true is especially significant if the work can be
linked without the Library, or if the work is itself a library. The
threshold for this to be true is not precisely defined by law.
If such an object file uses only numerical parameters, data
structure layouts and accessors, and small macros and small inline
functions (ten lines or less in length), then the use of the object
file is unrestricted, regardless of whether it is legally a derivative
work. (Executables containing this object code plus portions of the
Library will still fall under Section 6.)
Otherwise, if the work is a derivative of the Library, you may
distribute the object code for the work under the terms of Section 6.
Any executables containing that work also fall under Section 6,
whether or not they are linked directly with the Library itself.
6. As an exception to the Sections above, you may also combine or
link a "work that uses the Library" with the Library to produce a
work containing portions of the Library, and distribute that work
under terms of your choice, provided that the terms permit
modification of the work for the customer's own use and reverse
engineering for debugging such modifications.
You must give prominent notice with each copy of the work that the
Library is used in it and that the Library and its use are covered by
this License. You must supply a copy of this License. If the work
during execution displays copyright notices, you must include the
copyright notice for the Library among them, as well as a reference
directing the user to the copy of this License. Also, you must do one
of these things:
a) Accompany the work with the complete corresponding
machine-readable source code for the Library including whatever
changes were used in the work (which must be distributed under
Sections 1 and 2 above); and, if the work is an executable linked
with the Library, with the complete machine-readable "work that
uses the Library", as object code and/or source code, so that the
user can modify the Library and then relink to produce a modified
executable containing the modified Library. (It is understood
that the user who changes the contents of definitions files in the
Library will not necessarily be able to recompile the application
to use the modified definitions.)
b) Use a suitable shared library mechanism for linking with the
Library. A suitable mechanism is one that (1) uses at run time a
copy of the library already present on the user's computer system,
rather than copying library functions into the executable, and (2)
will operate properly with a modified version of the library, if
the user installs one, as long as the modified version is
interface-compatible with the version that the work was made with.
c) Accompany the work with a written offer, valid for at
least three years, to give the same user the materials
specified in Subsection 6a, above, for a charge no more
than the cost of performing this distribution.
d) If distribution of the work is made by offering access to copy
from a designated place, offer equivalent access to copy the above
specified materials from the same place.
e) Verify that the user has already received a copy of these
materials or that you have already sent this user a copy.
For an executable, the required form of the "work that uses the
Library" must include any data and utility programs needed for
reproducing the executable from it. However, as a special exception,
the materials to be distributed need not include anything that is
normally distributed (in either source or binary form) with the major
components (compiler, kernel, and so on) of the operating system on
which the executable runs, unless that component itself accompanies
the executable.
It may happen that this requirement contradicts the license
restrictions of other proprietary libraries that do not normally
accompany the operating system. Such a contradiction means you cannot
use both them and the Library together in an executable that you
distribute.
7. You may place library facilities that are a work based on the
Library side-by-side in a single library together with other library
facilities not covered by this License, and distribute such a combined
library, provided that the separate distribution of the work based on
the Library and of the other library facilities is otherwise
permitted, and provided that you do these two things:
a) Accompany the combined library with a copy of the same work
based on the Library, uncombined with any other library
facilities. This must be distributed under the terms of the
Sections above.
b) Give prominent notice with the combined library of the fact
that part of it is a work based on the Library, and explaining
where to find the accompanying uncombined form of the same work.
8. You may not copy, modify, sublicense, link with, or distribute
the Library except as expressly provided under this License. Any
attempt otherwise to copy, modify, sublicense, link with, or
distribute the Library is void, and will automatically terminate your
rights under this License. However, parties who have received copies,
or rights, from you under this License will not have their licenses
terminated so long as such parties remain in full compliance.
9. You are not required to accept this License, since you have not
signed it. However, nothing else grants you permission to modify or
distribute the Library or its derivative works. These actions are
prohibited by law if you do not accept this License. Therefore, by
modifying or distributing the Library (or any work based on the
Library), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Library or works based on it.
10. Each time you redistribute the Library (or any work based on the
Library), the recipient automatically receives a license from the
original licensor to copy, distribute, link with or modify the Library
subject to these terms and conditions. You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties with
this License.
11. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Library at all. For example, if a patent
license would not permit royalty-free redistribution of the Library by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Library.
If any portion of this section is held invalid or unenforceable under any
particular circumstance, the balance of the section is intended to apply,
and the section as a whole is intended to apply in other circumstances.
It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system which is
implemented by public license practices. Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.
This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
12. If the distribution and/or use of the Library is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Library under this License may add
an explicit geographical distribution limitation excluding those countries,
so that distribution is permitted only in or among countries not thus
excluded. In such case, this License incorporates the limitation as if
written in the body of this License.
13. The Free Software Foundation may publish revised and/or new
versions of the Lesser General Public License from time to time.
Such new versions will be similar in spirit to the present version,
but may differ in detail to address new problems or concerns.
Each version is given a distinguishing version number. If the Library
specifies a version number of this License which applies to it and
"any later version", you have the option of following the terms and
conditions either of that version or of any later version published by
the Free Software Foundation. If the Library does not specify a
license version number, you may choose any version ever published by
the Free Software Foundation.
14. If you wish to incorporate parts of the Library into other free
programs whose distribution conditions are incompatible with these,
write to the author to ask for permission. For software which is
copyrighted by the Free Software Foundation, write to the Free
Software Foundation; we sometimes make exceptions for this. Our
decision will be guided by the two goals of preserving the free status
of all derivatives of our free software and of promoting the sharing
and reuse of software generally.
NO WARRANTY
15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
DAMAGES.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Libraries
If you develop a new library, and you want it to be of the greatest
possible use to the public, we recommend making it free software that
everyone can redistribute and change. You can do so by permitting
redistribution under these terms (or, alternatively, under the terms of the
ordinary General Public License).
To apply these terms, attach the following notices to the library. It is
safest to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least the
"copyright" line and a pointer to where the full notice is found.
<one line to give the library's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Also add information on how to contact you by electronic and paper mail.
You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the library, if
necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in the
library `Frob' (a library for tweaking knobs) written by James Random Hacker.
<signature of Ty Coon>, 1 April 1990
Ty Coon, President of Vice
That's all there is to it!

View File

@@ -1,176 +0,0 @@
Introduction
============
Qwt uses qmake to build all its components and examples.
qmake is part of a Qt distribution.
qmake reads project files, that contain the options and rules how to
build a certain project. A project file ends with the suffix "*.pro".
Files that end with the suffix "*.pri" are included by the project
files and contain definitions, that are common for several project files.
qwtconfig.pri is read by all project files of the Qwt package.
So the first step is to edit qwtconfig.pri to adjust it to your
needs.
MathML Extension
================
Qwt/Qt4 supports the MathML render engine from the Qt solutions package,
that is only available with a commercial Qt license.
You need a release of qtmmlwidget >= 2.1.
Copy the files qtmmlwidget.[cpp|h] to textengines/mathml.
Documentation
==========================
Qwt includes a class documentation, that is available in various formats:
- Html files
- PDF document
- Qt Compressed Help (*.qch ) for the Qt assistant.
- Man pages ( UNIX only )
A) Unix Qt3/Qt4
==========================
qmake
make
make install
If you have installed a shared library it's path has to be known to
the run-time linker of your operating system. On Linux systems read
"man ldconfig" ( or google for it ). Another option is to use
the LD_LIBRARY_PATH (on some systems LIBPATH is used instead, on MacOSX
it is called DYLD_LIBRARY_PATH) environment variable.
If you only want to check the Qwt examples without installing something,
you can set the LD_LIBRARY_PATH to the lib directory
of your local build.
If you didn't enable autobuilding of the examples in qwtconfig.pri
you have to build the examples this way:
cd examples
qmake
make
B) Win32/MSVC Qt3/Qt4
=====================
Please read the qmake documentation how to convert
your *.pro files into your development environment.
F.e MSVC with nmake:
qmake qwt.pro
nmake
If you didn't enable autobuilding of the examples in qwtconfig.pri
you have to build the examples this way:
cd examples
qmake examples.pro
nmake
admin/msvc-qmake.bat helps users of Visual Studio users to
generate makefiles or project files (.dsp for MSVC-6.0 or vcproj for
MSVC.NET) for Qwt.
To generate makefiles, type: "admin\msvc-qmake"
To generate project files, type: "admin\msvc-qmake vc"
When you have built a Qwt DLL you need to add the following
define to your compiler flags: QWT_DLL.
Windows doesn't like mixing of debug and release binaries. Most
of the problems with using the Qwt designer plugin are because
of trying to load a Qwt debug library into a designer release
executable.
C) Win32/MinGW Qt4
==================
C1) Windows Shell
Start a Windows Shell, where Qt4 is initialized. ( F.e. with
"Programs->Qt by Trolltech ...->Qt 4.x.x Command Prompt" ).
qmake qwt.pro
make
If you didn't enable autobuilding of the examples in qwtconfig.pri
you have to build the examples this way:
cd examples
qmake examples.pro
make
make install
C2) MSYS Shell Qt >= 4.3.0
Support for the MSYS Shell has been improved in Qt 4.3.0.
Now building Qwt from the MSYS Shell works exactly like in UNIX or in the
Windows Shell - or at least it should:
because of a bug in Qt 4.3.0 you always have to do a "qmake -r".
C3) MSYS Shell Qt < 4.3.0
For Qt < 4.3.0 you have to set the MINGW_IN_SHELL variable.
make will run into errors with the subdirs target, that can be
ignored (make -i).
export MINGW_IN_SHELL=1;
qmake
make -i
make -i install
If you didn't enable autobuilding of the examples in qwtconfig.pri
you have to build the examples this way:
cd examples
qmake examples.pro
make -i
make -i install
C1-C3)
When you have built a Qwt DLL you need to add QWT_DLL to your compiler
flags. If you are using qmake for your own builds this done by adding
the following line to your profile: "DEFINES += QWT_DLL".
Windows doesn't like mixing of debug and release binaries. Most
of the problems with using the Qwt designer plugin are because
of trying to load a Qwt debug library into a designer release
executable.
D) MacOSX
Well, the Mac is only another Unix system. So read the instructions in A).
In the recent Qt4 releases the default target of qmake is to generate
XCode project files instead of makefiles. So you might need to do the
following:
qmake -spec macx-g++
...
D) Qtopia Core
I only tested Qwt with Qtopia Core in qvfb (Virtual Framebuffer Devivce)
Emulator on my Linux box. To build Qwt for the emulator was as simple as
for a regular Unix build.
qmake
make
E) Qtopia (!= Qtopia Core)
I once compiled the Qwt library against Qtopia 4.2.0 successfully - but
not more. It should be possible to build and install Qwt, but it's
not done yet.
Good luck !

View File

@@ -1,33 +0,0 @@
The Qwt Widget Library
----------------------
Qwt is an extension to the Qt GUI library from Troll Tech AS.
The Qwt library contains widgets and components which are
primarily useful for technical and scientifical purposes.
It includes a 2-D plotting widget, different kinds of sliders,
and much more.
Qwt is hosted at http://qwt.sf.net
Installation
------------
Read INSTALL how to build and install Qwt.
Copyright
---------
Qwt Widget Library
Copyright (C) 1997 Josef Wilgen
Copyright (C) 2002 Uwe Rathmann
Qwt is published under the Qwt License, Version 1.0.
You should have received a copy of this licence in the file
COPYING.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

View File

@@ -1,58 +0,0 @@
REM Batch file to make all Makefiles or all Visual Studio project files
REM (*.dsp for MSVC-6.0 or *.vcproj for MSVC-7.0) for Qwt with qmake.
REM
REM BUG: the designer plugin *.dsp file may not work; the Makefile does.
REM
REM To make Makefiles, type: msvc-qmake
REM To make project files type: msvc-qmake vc
REM For the Qwt library:
cd src
qmake -t %1lib% src.pro
cd ..
REM For the designer plugin:
cd textengines\mathml
qmake -t %1lib mathml.pro
cd ..\..
REM For the designer plugin:
cd designer
qmake -t %1lib designer.pro
cd ..
REM For the examples:
cd examples
cd bode
qmake -t %1app bode.pro
cd ..\cpuplot
qmake -t %1app cpuplot.pro
cd ..\curvdemo1
qmake -t %1app curvdemo1.pro
cd ..\curvdemo2
qmake -t %1app curvdemo2.pro
cd ..\data_plot
qmake -t %1app data_plot.pro
cd ..\dials
qmake -t %1app dials.pro
cd ..\event_filter
qmake -t %1app event_filter.pro
cd ..\histogram
qmake -t %1app histogram.pro
cd ..\radio
qmake -t %1app radio.pro
cd ..\realtime_plot
qmake -t %1app realtime_plot.pro
cd ..\simple_plot
qmake -t %1app simple_plot.pro
cd ..\sliders
qmake -t %1app sliders.pro
cd ..\spectrogram
qmake -t %1app spectrogram.pro
cd ..\svgmap
qmake -t %1app svgmap.pro
cd ..\sysinfo
qmake -t %1app sysinfo.pro
cd ..\..
REM EOF

View File

@@ -1,9 +0,0 @@
#! /bin/sh
find src -name "qwt_*.h" | xargs grep -l 'signals:' | xargs sed -i "s/signals:/Q_SIGNALS:/"
find src -name "qwt_*.h" | xargs grep -l 'slots:' | xargs sed -i "s/signals:/Q_SLOTS:/"
find src -name "qwt_*.cpp" | xargs grep -l 'emit ' | xargs sed -i "s/emit /Q_EMIT /"
echo "CONFIG += no_keywords" >> src/src.pro

View File

@@ -1,299 +0,0 @@
#! /bin/sh
#
# Generates a Qwt package from sourceforge svn
#
# Usage: svn2package.sh [-b|--branch <svn-branch>] [packagename]
#
##########################
# usage
##########################
function usage() {
echo "Usage: $0 [-b|--branch <svn-branch>] [-pdf] [-qch] [packagename]"
exit 1
}
################################
# checkout
################################
function checkoutQwt() {
if [ -x $2 ]
then
rm -r $2
if [ $? -ne 0 ]
then
exit $?
fi
fi
svn -q co https://qwt.svn.sourceforge.net/svnroot/qwt/$1/$2
if [ $? -ne 0 ]
then
echo "Can't access sourceforge SVN"
exit $?
fi
if [ "$3" != "$2" ]
then
rm -rf $3
mv $2 $3
fi
}
##########################
# cleanQwt dirname
##########################
function cleanQwt {
cd $1
if [ $? -ne 0 ]
then
exit $?
fi
find . -name .svn -print | xargs rm -r
rm TODO
rm admin/svn2package.sh
PROFILES="qwtconfig.pri"
for PROFILE in $PROFILES
do
sed -i -e 's/= debug /= release /' $PROFILE
done
HEADERS=`find . -type f -name '*.h' -print`
SOURCES=`find . -type f -name '*.cpp' -print`
PROFILES=`find . -type f -name '*.pro' -print`
PRIFILES=`find . -type f -name '*.pri' -print`
for EXPANDFILE in $HEADERS $SOURCES $PROFILES $PRIFILES
do
expand -4 $EXPANDFILE > $EXPANDFILE.expand
mv $EXPANDFILE.expand $EXPANDFILE
done
for SRCFILE in $SOURCES $PROFILES $PRIFILES
do
sed -i -e '/#warning/d' $SRCFILE
done
sed -i -e "s/\$\$VERSION-svn/$VERSION/" qwtconfig.pri
sed -i -e "s/\$\${QwtVersion}-svn/\$\${QwtVersion}/" qwt.prf
cd - > /dev/null
}
##########################
# createDocs dirname
##########################
function createDocs {
ODIR=`pwd`
cd $1
if [ $? -ne 0 ]
then
exit $?
fi
cp Doxyfile Doxyfile.doc
sed -i '/PROJECT_NUMBER/d' Doxyfile.doc
echo "PROJECT_NUMBER = $VERSION" >> Doxyfile.doc
if [ $GENERATE_MAN -ne 0 ]
then
sed -i -e '/GENERATE_MAN/d' -e '/PROJECT_NUMBER/d' Doxyfile.doc
echo 'GENERATE_MAN = YES' >> Doxyfile.doc
fi
if [ $GENERATE_PDF -ne 0 ]
then
# We need LateX for the qwtdoc.pdf
sed -i -e '/GENERATE_LATEX/d' -e '/GENERATE_MAN/d' -e '/PROJECT_NUMBER/d' Doxyfile.doc
echo 'GENERATE_LATEX = YES' >> Doxyfile.doc
echo 'GENERATE_MAN = YES' >> Doxyfile.doc
echo "PROJECT_NUMBER = $VERSION" >> Doxyfile.doc
fi
if [ $GENERATE_QCH -ne 0 ]
then
sed -i -e '/GENERATE_HTMLHELP/d' Doxyfile.doc
echo "GENERATE_HTMLHELP = YES" >> Doxyfile.doc
fi
cp ../INSTALL ../COPYING ./
doxygen Doxyfile.doc > /dev/null
if [ $? -ne 0 ]
then
exit $?
fi
if [ $GENERATE_QCH -ne 0 ]
then
doxygen2qthelp --namespace=net.sourceforge.qwt-$VERSION --folder=qwt-$VERSION html/index.hhp qwt-$VERSION.qch
rm html/index.hh*
fi
rm Doxyfile.doc Doxygen.log INSTALL COPYING
rm -r images
if [ $GENERATE_PDF -ne 0 ]
then
cd latex
make > /dev/null 2>&1
if [ $? -ne 0 ]
then
exit $?
fi
cd ..
mkdir pdf
mv latex/refman.pdf pdf/qwtdoc.pdf
rm -r latex
fi
cd $ODIR
}
##########################
# posix2dos filename
##########################
function posix2dos {
# At least one unix2dos writes to stdout instead of overwriting the input.
# The -q option is always enabled in stdin->stdout mode.
unix2dos <$1 >$1.dos
mv $1.dos $1
}
##########################
# prepare4Win dirname
##########################
function prepare4Win {
cd $1
if [ $? -ne 0 ]
then
exit $?
fi
rm -r doc/man
# win files, but not uptodate
BATCHES=`find . -type f -name '*.bat' -print`
HEADERS=`find . -type f -name '*.h' -print`
SOURCES=`find . -type f -name '*.cpp' -print`
PROFILES=`find . -type f -name '*.pro' -print`
PRIFILES=`find . -type f -name '*.pri' -print`
for FILE in $BATCHES $HEADERS $SOURCES $PROFILES $PRIFILES
do
posix2dos $FILE
done
cd - > /dev/null
}
##########################
# prepare4Unix dirname
##########################
function prepare4Unix {
cd $1
if [ $? -ne 0 ]
then
exit $?
fi
rm -rf admin
cd - > /dev/null
}
##########################
# main
##########################
QWTDIR=
SVNDIR=trunk
BRANCH=qwt
VERSION=
GENERATE_PDF=0
GENERATE_QCH=0
GENERATE_MAN=1
while [ $# -gt 0 ] ; do
case "$1" in
-h|--help)
usage; exit 1 ;;
-b|--branch)
shift; SVNDIR=branches; BRANCH=$1; shift;;
-pdf)
GENERATE_PDF=1; shift;;
-qch)
GENERATE_QCH=1; shift;;
*)
QWTDIR=qwt-$1 ; VERSION=$1; shift;;
esac
done
if [ "$QWTDIR" == "" ]
then
usage
exit 2
fi
TMPDIR=/tmp/$QWTDIR-tmp
echo -n "checkout to $TMPDIR ... "
checkoutQwt $SVNDIR $BRANCH $TMPDIR
cleanQwt $TMPDIR
echo done
echo -n "generate documentation ... "
createDocs $TMPDIR/doc
if [ $GENERATE_PDF -ne 0 ]
then
mv $TMPDIR/doc/pdf/qwtdoc.pdf $QWTDIR.pdf
rmdir $TMPDIR/doc/pdf
fi
echo done
DIR=`pwd`
echo -n "create packages in $DIR ... "
cd /tmp
rm -rf $QWTDIR
cp -a $TMPDIR $QWTDIR
prepare4Unix $QWTDIR
tar cfz $QWTDIR.tgz $QWTDIR
tar cfj $QWTDIR.tar.bz2 $QWTDIR
rm -rf $QWTDIR
cp -a $TMPDIR $QWTDIR
prepare4Win $QWTDIR
zip -r $QWTDIR.zip $QWTDIR > /dev/null
rm -rf $TMPDIR $QWTDIR
mv $QWTDIR.tgz $QWTDIR.tar.bz2 $QWTDIR.zip $DIR/
echo done
exit 0

View File

@@ -1,4 +0,0 @@
moc
obj
plugins
resources

View File

@@ -1,135 +0,0 @@
# -*- mode: sh -*- ###########################
# Qwt Widget Library
# Copyright (C) 1997 Josef Wilgen
# Copyright (C) 2002 Uwe Rathmann
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the Qwt License, Version 1.0
##############################################
QWT_ROOT = ..
include ( $${QWT_ROOT}/qwtconfig.pri )
contains(CONFIG, QwtDesigner) {
CONFIG += warn_on
SUFFIX_STR =
VVERSION = $$[QT_VERSION]
isEmpty(VVERSION) {
# Qt 3
debug {
SUFFIX_STR = $${DEBUG_SUFFIX}
}
else {
SUFFIX_STR = $${RELEASE_SUFFIX}
}
}
else {
CONFIG(debug, debug|release) {
SUFFIX_STR = $${DEBUG_SUFFIX}
}
else {
SUFFIX_STR = $${RELEASE_SUFFIX}
}
}
TEMPLATE = lib
MOC_DIR = moc
OBJECTS_DIR = obj$${SUFFIX_STR}
DESTDIR = plugins/designer
INCLUDEPATH += $${QWT_ROOT}/src
DEPENDPATH += $${QWT_ROOT}/src
LIBNAME = qwt$${SUFFIX_STR}
contains(CONFIG, QwtDll) {
win32 {
DEFINES += QT_DLL QWT_DLL
LIBNAME = $${LIBNAME}$${VER_MAJ}
}
}
!contains(CONFIG, QwtPlot) {
DEFINES += NO_QWT_PLOT
}
!contains(CONFIG, QwtWidgets) {
DEFINES += NO_QWT_WIDGETS
}
unix:LIBS += -L$${QWT_ROOT}/lib -l$${LIBNAME}
win32-msvc:LIBS += $${QWT_ROOT}/lib/$${LIBNAME}.lib
win32-msvc.net:LIBS += $${QWT_ROOT}/lib/$${LIBNAME}.lib
win32-msvc2002:LIBS += $${QWT_ROOT}/lib/$${LIBNAME}.lib
win32-msvc2003:LIBS += $${QWT_ROOT}/lib/$${LIBNAME}.lib
win32-msvc2005:LIBS += $${QWT_ROOT}/lib/$${LIBNAME}.lib
win32-msvc2008:LIBS += $${QWT_ROOT}/lib/$${LIBNAME}.lib
win32-g++:LIBS += -L$${QWT_ROOT}/lib -l$${LIBNAME}
# isEmpty(QT_VERSION) does not work with Qt-4.1.0/MinGW
VVERSION = $$[QT_VERSION]
isEmpty(VVERSION) {
# Qt 3
TARGET = qwtplugin$${SUFFIX_STR}
CONFIG += qt plugin
UI_DIR = ui
HEADERS += qwtplugin.h
SOURCES += qwtplugin.cpp
target.path = $(QTDIR)/plugins/designer
INSTALLS += target
IMAGES += \
pixmaps/qwtplot.png \
pixmaps/qwtanalogclock.png \
pixmaps/qwtcounter.png \
pixmaps/qwtcompass.png \
pixmaps/qwtdial.png \
pixmaps/qwtknob.png \
pixmaps/qwtscale.png \
pixmaps/qwtslider.png \
pixmaps/qwtthermo.png \
pixmaps/qwtwheel.png \
pixmaps/qwtwidget.png
} else {
# Qt 4
TARGET = qwt_designer_plugin$${SUFFIX_STR}
CONFIG += qt designer plugin
RCC_DIR = resources
HEADERS += \
qwt_designer_plugin.h
SOURCES += \
qwt_designer_plugin.cpp
contains(CONFIG, QwtPlot) {
HEADERS += \
qwt_designer_plotdialog.h
SOURCES += \
qwt_designer_plotdialog.cpp
}
RESOURCES += \
qwt_designer_plugin.qrc
target.path = $$[QT_INSTALL_PLUGINS]/designer
INSTALLS += target
}
}
else {
TEMPLATE = subdirs # do nothing
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 422 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 992 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 433 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 807 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 543 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 373 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 452 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 580 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 298 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

View File

@@ -1,42 +0,0 @@
/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
* Qwt Widget Library
* Copyright (C) 1997 Josef Wilgen
* Copyright (C) 2002 Uwe Rathmann
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the Qwt License, Version 1.0
*****************************************************************************/
#include <QLineEdit>
#include <QTabWidget>
#include <QHBoxLayout>
#include <QPushButton>
#include "qwt_designer_plotdialog.h"
using namespace QwtDesignerPlugin;
PlotDialog::PlotDialog(const QString &properties, QWidget *parent):
QDialog(parent)
{
setWindowTitle("Plot Properties");
QLineEdit *lineEdit = new QLineEdit(properties);
connect(lineEdit, SIGNAL(textChanged(const QString &)),
SIGNAL(edited(const QString &)));
QTabWidget *tabWidget = new QTabWidget(this);
tabWidget->addTab(lineEdit, "General");
QPushButton *closeButton = new QPushButton("Close");
connect(closeButton, SIGNAL(clicked()), this, SLOT(accept()));
QHBoxLayout *buttonLayout = new QHBoxLayout;
buttonLayout->addStretch(1);
buttonLayout->addWidget(closeButton);
QVBoxLayout *mainLayout = new QVBoxLayout;
mainLayout->addWidget(tabWidget);
mainLayout->addLayout(buttonLayout);
setLayout(mainLayout);
}

View File

@@ -1,39 +0,0 @@
/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
* Qwt Widget Library
* Copyright (C) 1997 Josef Wilgen
* Copyright (C) 2002 Uwe Rathmann
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the Qwt License, Version 1.0
*****************************************************************************/
#ifndef QWT_DESIGNER_PLOTDIALOG_H
#define QWT_DESIGNER_PLOTDIALOG_H
#include <qglobal.h>
#if QT_VERSION < 0x040000
#ifdef __GNUC__
#error This code is Qt4 only
#endif
#endif
#include <QDialog>
namespace QwtDesignerPlugin
{
class PlotDialog: public QDialog
{
Q_OBJECT
public:
PlotDialog(const QString &properties, QWidget *parent = NULL);
signals:
void edited(const QString&);
};
}
#endif

View File

@@ -1,516 +0,0 @@
/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
* Qwt Widget Library
* Copyright (C) 1997 Josef Wilgen
* Copyright (C) 2002 Uwe Rathmann
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the Qwt License, Version 1.0
*****************************************************************************/
#if defined(_MSC_VER) /* MSVC Compiler */
#pragma warning ( disable : 4786 )
#endif
#include <qglobal.h>
#include <qaction.h>
#include <QtPlugin>
#include <QDesignerFormEditorInterface>
#include <QDesignerFormWindowInterface>
#include <QDesignerFormWindowCursorInterface>
#include <QExtensionManager>
#include <QErrorMessage>
#include "qwt_designer_plugin.h"
#ifndef NO_QWT_PLOT
#include "qwt_designer_plotdialog.h"
#include "qwt_plot.h"
#include "qwt_scale_widget.h"
#endif
#ifndef NO_QWT_WIDGETS
#include "qwt_counter.h"
#include "qwt_wheel.h"
#include "qwt_thermo.h"
#include "qwt_knob.h"
#include "qwt_slider.h"
#include "qwt_analog_clock.h"
#include "qwt_compass.h"
#endif
#include "qwt_text_label.h"
using namespace QwtDesignerPlugin;
CustomWidgetInterface::CustomWidgetInterface(QObject *parent):
QObject(parent),
d_isInitialized(false)
{
}
bool CustomWidgetInterface::isContainer() const
{
return false;
}
bool CustomWidgetInterface::isInitialized() const
{
return d_isInitialized;
}
QIcon CustomWidgetInterface::icon() const
{
return d_icon;
}
QString CustomWidgetInterface::codeTemplate() const
{
return d_codeTemplate;
}
QString CustomWidgetInterface::domXml() const
{
return d_domXml;
}
QString CustomWidgetInterface::group() const
{
return "Qwt Widgets";
}
QString CustomWidgetInterface::includeFile() const
{
return d_include;
}
QString CustomWidgetInterface::name() const
{
return d_name;
}
QString CustomWidgetInterface::toolTip() const
{
return d_toolTip;
}
QString CustomWidgetInterface::whatsThis() const
{
return d_whatsThis;
}
void CustomWidgetInterface::initialize(
QDesignerFormEditorInterface *formEditor)
{
if ( d_isInitialized )
return;
QExtensionManager *manager = formEditor->extensionManager();
if ( manager )
{
manager->registerExtensions(new TaskMenuFactory(manager),
Q_TYPEID(QDesignerTaskMenuExtension));
}
d_isInitialized = true;
}
#ifndef NO_QWT_PLOT
PlotInterface::PlotInterface(QObject *parent):
CustomWidgetInterface(parent)
{
d_name = "QwtPlot";
d_include = "qwt_plot.h";
d_icon = QPixmap(":/pixmaps/qwtplot.png");
d_domXml =
"<widget class=\"QwtPlot\" name=\"qwtPlot\">\n"
" <property name=\"geometry\">\n"
" <rect>\n"
" <x>0</x>\n"
" <y>0</y>\n"
" <width>400</width>\n"
" <height>200</height>\n"
" </rect>\n"
" </property>\n"
"</widget>\n";
}
QWidget *PlotInterface::createWidget(QWidget *parent)
{
return new QwtPlot(parent);
}
#endif
#ifndef NO_QWT_WIDGETS
AnalogClockInterface::AnalogClockInterface(QObject *parent):
CustomWidgetInterface(parent)
{
d_name = "QwtAnalogClock";
d_include = "qwt_analog_clock.h";
d_icon = QPixmap(":/pixmaps/qwtanalogclock.png");
d_domXml =
"<widget class=\"QwtAnalogClock\" name=\"AnalogClock\">\n"
" <property name=\"geometry\">\n"
" <rect>\n"
" <x>0</x>\n"
" <y>0</y>\n"
" <width>200</width>\n"
" <height>200</height>\n"
" </rect>\n"
" </property>\n"
" <property name=\"lineWidth\">\n"
" <number>4</number>\n"
" </property>\n"
"</widget>\n";
}
QWidget *AnalogClockInterface::createWidget(QWidget *parent)
{
return new QwtAnalogClock(parent);
}
#endif
#ifndef NO_QWT_WIDGETS
CompassInterface::CompassInterface(QObject *parent):
CustomWidgetInterface(parent)
{
d_name = "QwtCompass";
d_include = "qwt_compass.h";
d_icon = QPixmap(":/pixmaps/qwtcompass.png");
d_domXml =
"<widget class=\"QwtCompass\" name=\"Compass\">\n"
" <property name=\"geometry\">\n"
" <rect>\n"
" <x>0</x>\n"
" <y>0</y>\n"
" <width>200</width>\n"
" <height>200</height>\n"
" </rect>\n"
" </property>\n"
" <property name=\"lineWidth\">\n"
" <number>4</number>\n"
" </property>\n"
"</widget>\n";
}
QWidget *CompassInterface::createWidget(QWidget *parent)
{
return new QwtCompass(parent);
}
#endif
#ifndef NO_QWT_WIDGETS
CounterInterface::CounterInterface(QObject *parent):
CustomWidgetInterface(parent)
{
d_name = "QwtCounter";
d_include = "qwt_counter.h";
d_icon = QPixmap(":/pixmaps/qwtcounter.png");
d_domXml =
"<widget class=\"QwtCounter\" name=\"Counter\">\n"
"</widget>\n";
}
QWidget *CounterInterface::createWidget(QWidget *parent)
{
return new QwtCounter(parent);
}
#endif
#ifndef NO_QWT_WIDGETS
DialInterface::DialInterface(QObject *parent):
CustomWidgetInterface(parent)
{
d_name = "QwtDial";
d_include = "qwt_dial.h";
d_icon = QPixmap(":/pixmaps/qwtdial.png");
d_domXml =
"<widget class=\"QwtDial\" name=\"Dial\">\n"
" <property name=\"geometry\">\n"
" <rect>\n"
" <x>0</x>\n"
" <y>0</y>\n"
" <width>200</width>\n"
" <height>200</height>\n"
" </rect>\n"
" </property>\n"
" <property name=\"lineWidth\">\n"
" <number>4</number>\n"
" </property>\n"
"</widget>\n";
}
QWidget *DialInterface::createWidget(QWidget *parent)
{
return new QwtDial(parent);
}
#endif
#ifndef NO_QWT_WIDGETS
KnobInterface::KnobInterface(QObject *parent):
CustomWidgetInterface(parent)
{
d_name = "QwtKnob";
d_include = "qwt_knob.h";
d_icon = QPixmap(":/pixmaps/qwtknob.png");
d_domXml =
"<widget class=\"QwtKnob\" name=\"Knob\">\n"
" <property name=\"geometry\">\n"
" <rect>\n"
" <x>0</x>\n"
" <y>0</y>\n"
" <width>100</width>\n"
" <height>100</height>\n"
" </rect>\n"
" </property>\n"
"</widget>\n";
}
QWidget *KnobInterface::createWidget(QWidget *parent)
{
return new QwtKnob(parent);
}
#endif
#ifndef NO_QWT_PLOT
ScaleWidgetInterface::ScaleWidgetInterface(QObject *parent):
CustomWidgetInterface(parent)
{
d_name = "QwtScaleWidget";
d_include = "qwt_scale_widget.h";
d_icon = QPixmap(":/pixmaps/qwtscale.png");
d_domXml =
"<widget class=\"QwtScaleWidget\" name=\"ScaleWidget\">\n"
"</widget>\n";
}
QWidget *ScaleWidgetInterface::createWidget(QWidget *parent)
{
return new QwtScaleWidget(QwtScaleDraw::LeftScale, parent);
}
#endif
#ifndef NO_QWT_WIDGETS
SliderInterface::SliderInterface(QObject *parent):
CustomWidgetInterface(parent)
{
d_name = "QwtSlider";
d_include = "qwt_slider.h";
d_icon = QPixmap(":/pixmaps/qwtslider.png");
d_domXml =
"<widget class=\"QwtSlider\" name=\"Slider\">\n"
" <property name=\"geometry\">\n"
" <rect>\n"
" <x>0</x>\n"
" <y>0</y>\n"
" <width>200</width>\n"
" <height>60</height>\n"
" </rect>\n"
" </property>\n"
"</widget>\n";
}
QWidget *SliderInterface::createWidget(QWidget *parent)
{
QwtSlider *slider = new QwtSlider(parent);
#if 0
slider->setScalePosition(QwtSlider::Bottom);
slider->setRange(0.0, 10.0, 1.0, 0);
slider->setValue(3.0);
#endif
return slider;
}
#endif
TextLabelInterface::TextLabelInterface(QObject *parent):
CustomWidgetInterface(parent)
{
d_name = "QwtTextLabel";
d_include = "qwt_text_label.h";
#ifdef __GNUC__
#warning QwtTextLabel icon is missing
#endif
d_icon = QPixmap(":/pixmaps/qwtwidget.png");
d_domXml =
"<widget class=\"QwtTextLabel\" name=\"TextLabel\">\n"
" <property name=\"geometry\">\n"
" <rect>\n"
" <x>0</x>\n"
" <y>0</y>\n"
" <width>100</width>\n"
" <height>20</height>\n"
" </rect>\n"
" </property>\n"
"</widget>\n";
}
QWidget *TextLabelInterface::createWidget(QWidget *parent)
{
return new QwtTextLabel(parent);
}
#ifndef NO_QWT_WIDGETS
ThermoInterface::ThermoInterface(QObject *parent):
CustomWidgetInterface(parent)
{
d_name = "QwtThermo";
d_include = "qwt_thermo.h";
d_icon = QPixmap(":/pixmaps/qwtthermo.png");
d_domXml =
"<widget class=\"QwtThermo\" name=\"Thermo\">\n"
"</widget>\n";
}
QWidget *ThermoInterface::createWidget(QWidget *parent)
{
return new QwtThermo(parent);
}
#endif
#ifndef NO_QWT_WIDGETS
WheelInterface::WheelInterface(QObject *parent):
CustomWidgetInterface(parent)
{
d_name = "QwtWheel";
d_include = "qwt_wheel.h";
d_icon = QPixmap(":/pixmaps/qwtwheel.png");
d_domXml =
"<widget class=\"QwtWheel\" name=\"Wheel\">\n"
"</widget>\n";
}
QWidget *WheelInterface::createWidget(QWidget *parent)
{
return new QwtWheel(parent);
}
#endif
CustomWidgetCollectionInterface::CustomWidgetCollectionInterface(
QObject *parent):
QObject(parent)
{
#ifndef NO_QWT_PLOT
d_plugins.append(new PlotInterface(this));
d_plugins.append(new ScaleWidgetInterface(this));
#endif
#ifndef NO_QWT_WIDGETS
d_plugins.append(new AnalogClockInterface(this));
d_plugins.append(new CompassInterface(this));
d_plugins.append(new CounterInterface(this));
d_plugins.append(new DialInterface(this));
d_plugins.append(new KnobInterface(this));
d_plugins.append(new SliderInterface(this));
d_plugins.append(new ThermoInterface(this));
d_plugins.append(new WheelInterface(this));
#endif
d_plugins.append(new TextLabelInterface(this));
}
QList<QDesignerCustomWidgetInterface*>
CustomWidgetCollectionInterface::customWidgets(void) const
{
return d_plugins;
}
TaskMenuFactory::TaskMenuFactory(QExtensionManager *parent):
QExtensionFactory(parent)
{
}
QObject *TaskMenuFactory::createExtension(
QObject *object, const QString &iid, QObject *parent) const
{
if (iid == Q_TYPEID(QDesignerTaskMenuExtension))
{
#ifndef NO_QWT_PLOT
if (QwtPlot *plot = qobject_cast<QwtPlot*>(object))
return new TaskMenuExtension(plot, parent);
#endif
#ifndef NO_QWT_WIDGETS
if (QwtDial *dial = qobject_cast<QwtDial*>(object))
return new TaskMenuExtension(dial, parent);
#endif
}
return QExtensionFactory::createExtension(object, iid, parent);
}
TaskMenuExtension::TaskMenuExtension(QWidget *widget, QObject *parent):
QObject(parent),
d_widget(widget)
{
d_editAction = new QAction(tr("Edit Qwt Attributes ..."), this);
connect(d_editAction, SIGNAL(triggered()),
this, SLOT(editProperties()));
}
QList<QAction *> TaskMenuExtension::taskActions() const
{
QList<QAction *> list;
list.append(d_editAction);
return list;
}
QAction *TaskMenuExtension::preferredEditAction() const
{
return d_editAction;
}
void TaskMenuExtension::editProperties()
{
const QVariant v = d_widget->property("propertiesDocument");
if ( v.type() != QVariant::String )
return;
#ifndef NO_QWT_PLOT
QString properties = v.toString();
if ( qobject_cast<QwtPlot*>(d_widget) )
{
PlotDialog dialog(properties);
connect(&dialog, SIGNAL(edited(const QString&)),
SLOT(applyProperties(const QString &)));
(void)dialog.exec();
return;
}
#endif
static QErrorMessage *errorMessage = NULL;
if ( errorMessage == NULL )
errorMessage = new QErrorMessage();
errorMessage->showMessage("Not implemented yet.");
}
void TaskMenuExtension::applyProperties(const QString &properties)
{
QDesignerFormWindowInterface *formWindow
= QDesignerFormWindowInterface::findFormWindow(d_widget);
if ( formWindow && formWindow->cursor() )
formWindow->cursor()->setProperty("propertiesDocument", properties);
}
Q_EXPORT_PLUGIN2(QwtDesignerPlugin, CustomWidgetCollectionInterface)

View File

@@ -1,244 +0,0 @@
/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
* Qwt Widget Library
* Copyright (C) 1997 Josef Wilgen
* Copyright (C) 2002 Uwe Rathmann
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the Qwt License, Version 1.0
*****************************************************************************/
#ifndef QWT_DESIGNER_PLUGIN_H
#define QWT_DESIGNER_PLUGIN_H
#include <qglobal.h>
#if QT_VERSION < 0x040000
#ifdef __GNUC__
#error This code is Qt4 only
#endif
#endif
#include <QDesignerCustomWidgetInterface>
#include <QDesignerTaskMenuExtension>
#include <QExtensionFactory>
namespace QwtDesignerPlugin
{
class CustomWidgetInterface: public QObject,
public QDesignerCustomWidgetInterface
{
Q_OBJECT
Q_INTERFACES(QDesignerCustomWidgetInterface)
public:
CustomWidgetInterface(QObject *parent);
virtual bool isContainer() const;
virtual bool isInitialized() const;
virtual QIcon icon() const;
virtual QString codeTemplate() const;
virtual QString domXml() const;
virtual QString group() const;
virtual QString includeFile() const;
virtual QString name() const;
virtual QString toolTip() const;
virtual QString whatsThis() const;
virtual void initialize(QDesignerFormEditorInterface *);
protected:
QString d_name;
QString d_include;
QString d_toolTip;
QString d_whatsThis;
QString d_domXml;
QString d_codeTemplate;
QIcon d_icon;
private:
bool d_isInitialized;
};
class CustomWidgetCollectionInterface: public QObject,
public QDesignerCustomWidgetCollectionInterface
{
Q_OBJECT
Q_INTERFACES(QDesignerCustomWidgetCollectionInterface)
public:
CustomWidgetCollectionInterface(QObject *parent = NULL);
virtual QList<QDesignerCustomWidgetInterface*> customWidgets() const;
private:
QList<QDesignerCustomWidgetInterface*> d_plugins;
};
#ifndef NO_QWT_PLOT
class PlotInterface: public CustomWidgetInterface
{
Q_OBJECT
Q_INTERFACES(QDesignerCustomWidgetInterface)
public:
PlotInterface(QObject *parent);
virtual QWidget *createWidget(QWidget *parent);
};
#endif
#ifndef NO_QWT_WIDGETS
class AnalogClockInterface: public CustomWidgetInterface
{
Q_OBJECT
Q_INTERFACES(QDesignerCustomWidgetInterface)
public:
AnalogClockInterface(QObject *parent);
virtual QWidget *createWidget(QWidget *parent);
};
#endif
#ifndef NO_QWT_WIDGETS
class CompassInterface: public CustomWidgetInterface
{
Q_OBJECT
Q_INTERFACES(QDesignerCustomWidgetInterface)
public:
CompassInterface(QObject *parent);
virtual QWidget *createWidget(QWidget *parent);
};
#endif
#ifndef NO_QWT_WIDGETS
class CounterInterface: public CustomWidgetInterface
{
Q_OBJECT
Q_INTERFACES(QDesignerCustomWidgetInterface)
public:
CounterInterface(QObject *parent);
virtual QWidget *createWidget(QWidget *parent);
};
#endif
#ifndef NO_QWT_WIDGETS
class DialInterface: public CustomWidgetInterface
{
Q_OBJECT
Q_INTERFACES(QDesignerCustomWidgetInterface)
public:
DialInterface(QObject *parent);
virtual QWidget *createWidget(QWidget *parent);
};
#endif
#ifndef NO_QWT_WIDGETS
class KnobInterface: public CustomWidgetInterface
{
Q_OBJECT
Q_INTERFACES(QDesignerCustomWidgetInterface)
public:
KnobInterface(QObject *parent);
virtual QWidget *createWidget(QWidget *parent);
};
#endif
#ifndef NO_QWT_PLOT
class ScaleWidgetInterface: public CustomWidgetInterface
{
Q_OBJECT
Q_INTERFACES(QDesignerCustomWidgetInterface)
public:
ScaleWidgetInterface(QObject *parent);
virtual QWidget *createWidget(QWidget *parent);
};
#endif
#ifndef NO_QWT_WIDGETS
class SliderInterface: public CustomWidgetInterface
{
Q_OBJECT
Q_INTERFACES(QDesignerCustomWidgetInterface)
public:
SliderInterface(QObject *parent);
virtual QWidget *createWidget(QWidget *parent);
};
#endif
class TextLabelInterface: public CustomWidgetInterface
{
Q_OBJECT
Q_INTERFACES(QDesignerCustomWidgetInterface)
public:
TextLabelInterface(QObject *parent);
virtual QWidget *createWidget(QWidget *parent);
};
#ifndef NO_QWT_WIDGETS
class ThermoInterface: public CustomWidgetInterface
{
Q_OBJECT
Q_INTERFACES(QDesignerCustomWidgetInterface)
public:
ThermoInterface(QObject *parent);
virtual QWidget *createWidget(QWidget *parent);
};
#endif
#ifndef NO_QWT_WIDGETS
class WheelInterface: public CustomWidgetInterface
{
Q_OBJECT
Q_INTERFACES(QDesignerCustomWidgetInterface)
public:
WheelInterface(QObject *parent);
virtual QWidget *createWidget(QWidget *parent);
};
#endif
class TaskMenuFactory: public QExtensionFactory
{
Q_OBJECT
public:
TaskMenuFactory(QExtensionManager *parent = 0);
protected:
QObject *createExtension(QObject *object,
const QString &iid, QObject *parent) const;
};
class TaskMenuExtension: public QObject,
public QDesignerTaskMenuExtension
{
Q_OBJECT
Q_INTERFACES(QDesignerTaskMenuExtension)
public:
TaskMenuExtension(QWidget *widget, QObject *parent);
QAction *preferredEditAction() const;
QList<QAction *> taskActions() const;
private slots:
void editProperties();
void applyProperties(const QString &);
private:
QAction *d_editAction;
QWidget *d_widget;
};
};
#endif

View File

@@ -1,15 +0,0 @@
<!DOCTYPE RCC><RCC version="1.0">
<qresource>
<file>pixmaps/qwtplot.png</file>
<file>pixmaps/qwtanalogclock.png</file>
<file>pixmaps/qwtcounter.png</file>
<file>pixmaps/qwtcompass.png</file>
<file>pixmaps/qwtdial.png</file>
<file>pixmaps/qwtknob.png</file>
<file>pixmaps/qwtscale.png</file>
<file>pixmaps/qwtslider.png</file>
<file>pixmaps/qwtthermo.png</file>
<file>pixmaps/qwtwheel.png</file>
<file>pixmaps/qwtwidget.png</file>
</qresource>
</RCC>

View File

@@ -1,202 +0,0 @@
/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
* Qwt Widget Library
* Copyright (C) 1997 Josef Wilgen
* Copyright (C) 2002 Uwe Rathmann
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the Qwt License, Version 1.0
*****************************************************************************/
#if defined(_MSC_VER) /* MSVC Compiler */
#pragma warning ( disable : 4786 )
#endif
#include <qglobal.h>
#include <qvaluelist.h>
#include <qmime.h>
#include <qdragobject.h>
#include "qwtplugin.h"
#include "qwt_text_label.h"
#ifndef NO_QWT_PLOT
#include "qwt_plot.h"
#include "qwt_scale_widget.h"
#endif
#ifndef NO_QWT_WIDGETS
#include "qwt_counter.h"
#include "qwt_wheel.h"
#include "qwt_thermo.h"
#include "qwt_knob.h"
#include "qwt_slider.h"
#include "qwt_analog_clock.h"
#include "qwt_compass.h"
#endif
namespace
{
struct Entry
{
Entry() {}
Entry( QString _classname, QString _header, QString _pixmap,
QString _tooltip, QString _whatshis):
classname(_classname),
header(_header),
pixmap(_pixmap),
tooltip(_tooltip),
whatshis(_whatshis)
{}
QString classname;
QString header;
QString pixmap;
QString tooltip;
QString whatshis;
};
QValueList<Entry> vec;
const Entry *entry(const QString& str)
{
for ( uint i = 0; i < vec.count(); i++ )
{
if (str == vec[i].classname)
return &vec[i];
}
return NULL;
}
}
QwtPlugin::QwtPlugin()
{
#ifndef NO_QWT_PLOT
vec.append(Entry("QwtPlot", "qwt_plot.h",
"qwtplot.png", "QwtPlot", "whatsthis"));
vec.append(Entry("QwtScaleWidget", "qwt_scale_widget.h",
"qwtscale.png", "QwtScaleWidget", "whatsthis"));
#endif
#ifndef NO_QWT_WIDGETS
vec.append(Entry("QwtAnalogClock", "qwt_analog_clock.h",
"qwtanalogclock.png", "QwtAnalogClock", "whatsthis"));
vec.append(Entry("QwtCompass", "qwt_compass.h",
"qwtcompass.png", "QwtCompass", "whatsthis"));
vec.append(Entry("QwtCounter", "qwt_counter.h",
"qwtcounter.png", "QwtCounter", "whatsthis"));
vec.append(Entry("QwtDial", "qwt_dial.h",
"qwtdial.png", "QwtDial", "whatsthis"));
vec.append(Entry("QwtKnob", "qwt_knob.h",
"qwtknob.png", "QwtKnob", "whatsthis"));
vec.append(Entry("QwtSlider", "qwt_slider.h",
"qwtslider.png", "QwtSlider", "whatsthis"));
vec.append(Entry("QwtThermo", "qwt_thermo.h",
"qwtthermo.png", "QwtThermo", "whatsthis"));
vec.append(Entry("QwtWheel", "qwt_wheel.h",
"qwtwheel.png", "QwtWheel", "whatsthis"));
#endif
vec.append(Entry("QwtTextLabel", "qwt_text_label.h",
"qwtwidget.png", "QwtTextLabel", "whatsthis"));
}
QWidget* QwtPlugin::create(const QString &key,
QWidget* parent, const char* name)
{
QWidget *w = NULL;
#ifndef NO_QWT_PLOT
if ( key == "QwtPlot" )
w = new QwtPlot( parent );
else if ( key == "QwtScaleWidget" )
w = new QwtScaleWidget( QwtScaleDraw::LeftScale, parent);
#endif
#ifndef NO_QWT_WIDGETS
if ( key == "QwtAnalogClock" )
w = new QwtAnalogClock( parent);
else if ( key == "QwtCounter" )
w = new QwtCounter( parent);
else if ( key == "QwtCompass" )
w = new QwtCompass( parent);
else if ( key == "QwtDial" )
w = new QwtDial( parent);
else if ( key == "QwtWheel" )
w = new QwtWheel( parent);
else if ( key == "QwtThermo" )
w = new QwtThermo( parent);
else if ( key == "QwtKnob" )
w = new QwtKnob( parent);
else if ( key == "QwtSlider" )
w = new QwtSlider( parent);
#endif
if ( key == "QwtTextLabel" )
w = new QwtTextLabel( parent);
if ( w )
w->setName(name);
return w;
}
QStringList QwtPlugin::keys() const
{
QStringList list;
for (unsigned i = 0; i < vec.count(); i++)
list += vec[i].classname;
return list;
}
QString QwtPlugin::group( const QString& feature ) const
{
if (entry(feature) != NULL )
return QString("Qwt");
return QString::null;
}
QIconSet QwtPlugin::iconSet( const QString& pmap) const
{
QString pixmapKey("qwtwidget.png");
if (entry(pmap) != NULL )
pixmapKey = entry(pmap)->pixmap;
const QMimeSource *ms =
QMimeSourceFactory::defaultFactory()->data(pixmapKey);
QPixmap pixmap;
QImageDrag::decode(ms, pixmap);
return QIconSet(pixmap);
}
QString QwtPlugin::includeFile( const QString& feature ) const
{
if (entry(feature) != NULL)
return entry(feature)->header;
return QString::null;
}
QString QwtPlugin::toolTip( const QString& feature ) const
{
if (entry(feature) != NULL )
return entry(feature)->tooltip;
return QString::null;
}
QString QwtPlugin::whatsThis( const QString& feature ) const
{
if (entry(feature) != NULL)
return entry(feature)->whatshis;
return QString::null;
}
bool QwtPlugin::isContainer( const QString& ) const
{
return false;
}
Q_EXPORT_PLUGIN( QwtPlugin )

View File

@@ -1,42 +0,0 @@
/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
* Qwt Widget Library
* Copyright (C) 1997 Josef Wilgen
* Copyright (C) 2002 Uwe Rathmann
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the Qwt License, Version 1.0
*****************************************************************************/
#ifndef QWT_PLUGIN_H
#define QWT_PLUGIN_H
#include <qglobal.h>
#if QT_VERSION >= 0x040000
#ifdef __GNUC__
#error This code is Qt3 only
#endif
This code is Qt3 only
#endif
#include <qwidgetplugin.h>
class QT_WIDGET_PLUGIN_EXPORT QwtPlugin: public QWidgetPlugin
{
public:
QwtPlugin();
QStringList keys() const;
QWidget* create( const QString &classname, QWidget* parent = 0, const char* name = 0 );
QString group( const QString& ) const;
QIconSet iconSet( const QString& ) const;
QString includeFile( const QString& ) const;
QString toolTip( const QString& ) const;
QString whatsThis( const QString& ) const;
bool isContainer( const QString& ) const;
};
#endif

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 71 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

View File

@@ -1,161 +0,0 @@
/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
* Qwt Widget Library
* Copyright (C) 1997 Josef Wilgen
* Copyright (C) 2002 Uwe Rathmann
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the Qwt License, Version 1.0
*****************************************************************************/
/*
This file contains NO source code, just some documentation for doxygen to
parse.
*/
/*!
\mainpage Qwt - Qt Widgets for Technical Applications
The Qwt library contains GUI Components and utility classes which are primarily
useful for programs with a technical background. Beside a 2D plot widget
it provides scales, sliders, dials, compasses, thermometers, wheels and knobs
to control or display values, arrays, or ranges of type double.
\image html plot.png
\if homepage
\section homepage Project page
The official project page is hosted at
<a href="http://qwt.sourceforge.net">sourceforge</a>
\endif
\section license License
Qwt is distributed under the terms of the \ref qwtlicense.
\section platforms Platforms
Qwt 5.x might be usable in all environments where you find
<a href="http://www.trolltech.com/products/qt">Qt</a>.
It is compatible with Qt 3.3.x and Qt 4.x, but the documentation
is generated for Qt 4.x.\n
\section screenshotsonmainpage Screenshots
- \ref curvescreenshots\n
- \ref scatterscreenshots\n
- \ref spectrogramscreenshots\n
- \ref histogramscreenshots\n
- \ref controlscreenshots\n
\latexonly Screenshots are only available in the HTML docs.\endlatexonly
\section downloads Downloads
Stable releases, prereleases and snapshots are available at the Qwt <a href="http://sourceforge.net/projects/qwt">project page</a>.
For getting a snapshot with all bugfixes for the latest 5.2 release:
\code svn co https://qwt.svn.sourceforge.net/svnroot/qwt/branches/qwt-5.2 \endcode
For getting a development snapshot from the SVN repository:
\code svn co https://qwt.svn.sourceforge.net/svnroot/qwt/trunk/qwt \endcode
Qwt doesn't distribute binary packages, but today all major Linux distributors
offer one. Note, that these packages often don't include the examples.
\section installonmainpage Installation
Have a look at the qwt.pro project file. It is prepared for building
dynamic libraries in Win32 and Unix/X11 environments.
If you don't know what to do with it, read the file \ref qwtinstall and/or
Trolltechs
<a href="http://www.trolltech.com/developer/documentation/index.html">qmake</a> documentation. Once you have build the library you have to install
all files from the lib, include and doc directories.
\section support Support
- Mailing list\n
For all kind of Qwt related questions use the Qwt <a href="http://sourceforge.net/mail/?group_id=13693">mailing list</a>.\n
If you prefer newsgroups use the mail to news gateway of <a href="http://dir.gmane.org/gmane.comp.graphics.qwt.general">Gmane</a>.
- Forum\n
<a href="http://www.qtcentre.org">Qt Centre</a> is a great resource for Qt
related questions. It has a sub forum, that is dedicated to
Qwt related questions.
- Individual support\n
If you are looking for individual support, or need someone who implements
your Qwt component/application contact qwt-support@tigertal.de.
\section relatedprojects Related Projects
<a href="http://qwtpolar.sourceforge.net">QwtPolar</a>, a polar plot widget.\n
<a href="http://qwtplot3d.sourceforge.net">QwtPlot3D</a>, an OpenGL 3D plot widget.\n
<a href="http://soft.proindependent.com/qtiplot.html">QtiPlot</a>,
data analysis and scientific plotting tool, using QwtPlot.
\section languagebindings Language Bindings
<a href="http://pyqwt.sourceforge.net">PyQwt</a>, a set of Qwt Python bindings.\n
<a href="http://rubyforge.org/projects/korundum/">Korundum/QtRuby</a>, including a set of Qwt Ruby bindings.\n
\section donations Donations
Sourceforge offers a <a href="http://sourceforge.net/docman/display_doc.php?docid=20244&group_id=1"> Donation System</a> via PayPal. You can use it, if you like to <a href="http://sourceforge.net/project/project_donations.php?group_id=13693">support</a> the development of Qwt.
\section credits Credits:
\par Authors:
Uwe Rathmann, Josef Wilgen ( <= Qwt 0.2 )
\par Project admin:
Uwe Rathmann \<rathmann@users.sourceforge.net\>
*/
/*!
\page qwtlicense Qwt License, Version 1.0
\include "COPYING"
*/
/*!
\page qwtinstall INSTALL
\include "INSTALL"
*/
/*!
\page curvescreenshots Curve Plots
\image html plot.png
\image html sinus.png
\image html cpuplot.png
\image html graph.png
\image html curves.png
*/
/*!
\page scatterscreenshots Scatter Plot
\image html scatterplot.png
*/
/*!
\page spectrogramscreenshots Spectrogram, Contour Plot
\image html spectrogram1.png
\image html spectrogram2.png
\image html spectrogram3.png
/*!
\page histogramscreenshots Histogram
\image html histogram.png
*/
/*!
\page controlscreenshots Dials, Compasses, Knobs, Wheels, Sliders, Thermos
\image html radio.png
\image html sliders.png
\image html dials1.png
\image html dials2.png
\image html sysinfo.png
*/

View File

@@ -1,350 +0,0 @@
#include <qregexp.h>
#include <qapplication.h>
#include <qtoolbar.h>
#include <qtoolbutton.h>
#include <qlabel.h>
#include <qlayout.h>
#include <qstatusbar.h>
#include <qprinter.h>
#include <qpicture.h>
#include <qpainter.h>
#include <qfiledialog.h>
#if QT_VERSION >= 0x040300
#ifdef QT_SVG_LIB
#include <qsvggenerator.h>
#endif
#endif
#if QT_VERSION >= 0x040000
#include <qprintdialog.h>
#include <qfileinfo.h>
#else
#include <qwt_painter.h>
#endif
#include <qwt_counter.h>
#include <qwt_plot_zoomer.h>
#include <qwt_plot_panner.h>
#include <qwt_text.h>
#include <qwt_math.h>
#include "pixmaps.h"
#include "bode_plot.h"
#include "bode.h"
class Zoomer: public QwtPlotZoomer
{
public:
Zoomer(int xAxis, int yAxis, QwtPlotCanvas *canvas):
QwtPlotZoomer(xAxis, yAxis, canvas)
{
setSelectionFlags(QwtPicker::DragSelection | QwtPicker::CornerToCorner);
setTrackerMode(QwtPicker::AlwaysOff);
setRubberBand(QwtPicker::NoRubberBand);
// RightButton: zoom out by 1
// Ctrl+RightButton: zoom out to full size
#if QT_VERSION < 0x040000
setMousePattern(QwtEventPattern::MouseSelect2,
Qt::RightButton, Qt::ControlButton);
#else
setMousePattern(QwtEventPattern::MouseSelect2,
Qt::RightButton, Qt::ControlModifier);
#endif
setMousePattern(QwtEventPattern::MouseSelect3,
Qt::RightButton);
}
};
//-----------------------------------------------------------------
//
// bode.cpp -- A demo program featuring QwtPlot and QwtCounter
//
// This example demonstrates the mapping of different curves
// to different axes in a QwtPlot widget. It also shows how to
// display the cursor position and how to implement zooming.
//
//-----------------------------------------------------------------
MainWin::MainWin(QWidget *parent):
QMainWindow(parent)
{
d_plot = new BodePlot(this);
d_plot->setMargin(5);
#if QT_VERSION >= 0x040000
setContextMenuPolicy(Qt::NoContextMenu);
#endif
d_zoomer[0] = new Zoomer( QwtPlot::xBottom, QwtPlot::yLeft,
d_plot->canvas());
d_zoomer[0]->setRubberBand(QwtPicker::RectRubberBand);
d_zoomer[0]->setRubberBandPen(QColor(Qt::green));
d_zoomer[0]->setTrackerMode(QwtPicker::ActiveOnly);
d_zoomer[0]->setTrackerPen(QColor(Qt::white));
d_zoomer[1] = new Zoomer(QwtPlot::xTop, QwtPlot::yRight,
d_plot->canvas());
d_panner = new QwtPlotPanner(d_plot->canvas());
d_panner->setMouseButton(Qt::MidButton);
d_picker = new QwtPlotPicker(QwtPlot::xBottom, QwtPlot::yLeft,
QwtPicker::PointSelection | QwtPicker::DragSelection,
QwtPlotPicker::CrossRubberBand, QwtPicker::AlwaysOn,
d_plot->canvas());
d_picker->setRubberBandPen(QColor(Qt::green));
d_picker->setRubberBand(QwtPicker::CrossRubberBand);
d_picker->setTrackerPen(QColor(Qt::white));
setCentralWidget(d_plot);
QToolBar *toolBar = new QToolBar(this);
QToolButton *btnZoom = new QToolButton(toolBar);
#if QT_VERSION >= 0x040000
btnZoom->setText("Zoom");
btnZoom->setIcon(QIcon(zoom_xpm));
btnZoom->setCheckable(true);
btnZoom->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
#else
btnZoom->setTextLabel("Zoom");
btnZoom->setPixmap(zoom_xpm);
btnZoom->setToggleButton(true);
btnZoom->setUsesTextLabel(true);
#endif
QToolButton *btnPrint = new QToolButton(toolBar);
#if QT_VERSION >= 0x040000
btnPrint->setText("Print");
btnPrint->setIcon(QIcon(print_xpm));
btnPrint->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
#else
btnPrint->setTextLabel("Print");
btnPrint->setPixmap(print_xpm);
btnPrint->setUsesTextLabel(true);
#endif
#if QT_VERSION < 0x040000
QToolButton *btnSVG = new QToolButton(toolBar);
btnSVG->setTextLabel("SVG");
btnSVG->setPixmap(print_xpm);
btnSVG->setUsesTextLabel(true);
#elif QT_VERSION >= 0x040300
#ifdef QT_SVG_LIB
QToolButton *btnSVG = new QToolButton(toolBar);
btnSVG->setText("SVG");
btnSVG->setIcon(QIcon(print_xpm));
btnSVG->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
#endif
#endif
#if QT_VERSION >= 0x040000
toolBar->addWidget(btnZoom);
toolBar->addWidget(btnPrint);
#if QT_VERSION >= 0x040300
#ifdef QT_SVG_LIB
toolBar->addWidget(btnSVG);
#endif
#endif
#endif
toolBar->addSeparator();
QWidget *hBox = new QWidget(toolBar);
QHBoxLayout *layout = new QHBoxLayout(hBox);
layout->setSpacing(0);
layout->addWidget(new QWidget(hBox), 10); // spacer
layout->addWidget(new QLabel("Damping Factor", hBox), 0);
layout->addSpacing(10);
QwtCounter *cntDamp = new QwtCounter(hBox);
cntDamp->setRange(0.0, 5.0, 0.01);
cntDamp->setValue(0.0);
layout->addWidget(cntDamp, 0);
#if QT_VERSION >= 0x040000
(void)toolBar->addWidget(hBox);
#else
toolBar->setStretchableWidget(hBox);
#endif
addToolBar(toolBar);
#ifndef QT_NO_STATUSBAR
(void)statusBar();
#endif
enableZoomMode(false);
showInfo();
connect(cntDamp, SIGNAL(valueChanged(double)),
d_plot, SLOT(setDamp(double)));
connect(btnPrint, SIGNAL(clicked()), SLOT(print()));
#if QT_VERSION < 0x040000
connect(btnSVG, SIGNAL(clicked()), SLOT(exportSVG()));
#elif QT_VERSION >= 0x040300
#ifdef QT_SVG_LIB
connect(btnSVG, SIGNAL(clicked()), SLOT(exportSVG()));
#endif
#endif
connect(btnZoom, SIGNAL(toggled(bool)), SLOT(enableZoomMode(bool)));
connect(d_picker, SIGNAL(moved(const QPoint &)),
SLOT(moved(const QPoint &)));
connect(d_picker, SIGNAL(selected(const QwtPolygon &)),
SLOT(selected(const QwtPolygon &)));
}
void MainWin::print()
{
#if 1
QPrinter printer;
#else
QPrinter printer(QPrinter::HighResolution);
#if QT_VERSION < 0x040000
printer.setOutputToFile(true);
printer.setOutputFileName("/tmp/bode.ps");
printer.setColorMode(QPrinter::Color);
#else
printer.setOutputFileName("/tmp/bode.pdf");
#endif
#endif
QString docName = d_plot->title().text();
if ( !docName.isEmpty() )
{
docName.replace (QRegExp (QString::fromLatin1 ("\n")), tr (" -- "));
printer.setDocName (docName);
}
printer.setCreator("Bode example");
printer.setOrientation(QPrinter::Landscape);
#if QT_VERSION >= 0x040000
QPrintDialog dialog(&printer);
if ( dialog.exec() )
{
#else
if (printer.setup())
{
#endif
QwtPlotPrintFilter filter;
if ( printer.colorMode() == QPrinter::GrayScale )
{
int options = QwtPlotPrintFilter::PrintAll;
options &= ~QwtPlotPrintFilter::PrintBackground;
options |= QwtPlotPrintFilter::PrintFrameWithScales;
filter.setOptions(options);
}
d_plot->print(printer, filter);
}
}
void MainWin::exportSVG()
{
QString fileName = "bode.svg";
#if QT_VERSION < 0x040000
#ifndef QT_NO_FILEDIALOG
fileName = QFileDialog::getSaveFileName(
"bode.svg", "SVG Documents (*.svg)", this);
#endif
if ( !fileName.isEmpty() )
{
// enable workaround for Qt3 misalignments
QwtPainter::setSVGMode(true);
QPicture picture;
QPainter p(&picture);
d_plot->print(&p, QRect(0, 0, 800, 600));
p.end();
picture.save(fileName, "svg");
}
#elif QT_VERSION >= 0x040300
#ifdef QT_SVG_LIB
#ifndef QT_NO_FILEDIALOG
fileName = QFileDialog::getSaveFileName(
this, "Export File Name", QString(),
"SVG Documents (*.svg)");
#endif
if ( !fileName.isEmpty() )
{
QSvgGenerator generator;
generator.setFileName(fileName);
generator.setSize(QSize(800, 600));
d_plot->print(generator);
}
#endif
#endif
}
void MainWin::enableZoomMode(bool on)
{
d_panner->setEnabled(on);
d_zoomer[0]->setEnabled(on);
d_zoomer[0]->zoom(0);
d_zoomer[1]->setEnabled(on);
d_zoomer[1]->zoom(0);
d_picker->setEnabled(!on);
showInfo();
}
void MainWin::showInfo(QString text)
{
if ( text == QString::null )
{
if ( d_picker->rubberBand() )
text = "Cursor Pos: Press left mouse button in plot region";
else
text = "Zoom: Press mouse button and drag";
}
#ifndef QT_NO_STATUSBAR
#if QT_VERSION >= 0x040000
statusBar()->showMessage(text);
#else
statusBar()->message(text);
#endif
#endif
}
void MainWin::moved(const QPoint &pos)
{
QString info;
info.sprintf("Freq=%g, Ampl=%g, Phase=%g",
d_plot->invTransform(QwtPlot::xBottom, pos.x()),
d_plot->invTransform(QwtPlot::yLeft, pos.y()),
d_plot->invTransform(QwtPlot::yRight, pos.y())
);
showInfo(info);
}
void MainWin::selected(const QwtPolygon &)
{
showInfo();
}
int main (int argc, char **argv)
{
QApplication a(argc, argv);
MainWin w;
#if QT_VERSION < 0x040000
a.setMainWidget(&w);
#endif
w.resize(540,400);
w.show();
int rv = a.exec();
return rv;
}

View File

@@ -1,32 +0,0 @@
#include <qmainwindow.h>
#include <qwt_polygon.h>
class QwtPlotZoomer;
class QwtPlotPicker;
class QwtPlotPanner;
class BodePlot;
class MainWin : public QMainWindow
{
Q_OBJECT
public:
MainWin(QWidget *parent = 0);
private slots:
void moved(const QPoint &);
void selected(const QwtPolygon &);
void print();
void exportSVG();
void enableZoomMode(bool);
private:
void showInfo(QString text = QString::null);
BodePlot *d_plot;
QwtPlotZoomer *d_zoomer[2];
QwtPlotPicker *d_picker;
QwtPlotPanner *d_panner;
};

View File

@@ -1,23 +0,0 @@
# -*- mode: sh -*- ################################################
# Qwt Widget Library
# Copyright (C) 1997 Josef Wilgen
# Copyright (C) 2002 Uwe Rathmann
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the Qwt License, Version 1.0
###################################################################
include( ../examples.pri )
TARGET = bode
QT += svg
HEADERS = \
bode.h \
bode_plot.h \
cplx.h \
pixmaps.h
SOURCES = \
bode.cpp \
bode_plot.cpp

View File

@@ -1,181 +0,0 @@
#include <qwt_math.h>
#include <qwt_scale_engine.h>
#include <qwt_symbol.h>
#include <qwt_plot_grid.h>
#include <qwt_plot_marker.h>
#include <qwt_plot_curve.h>
#include <qwt_legend.h>
#include <qwt_text.h>
#include "cplx.h"
#include "bode_plot.h"
static void logSpace(double *array, int size, double xmin, double xmax)
{
if ((xmin <= 0.0) || (xmax <= 0.0) || (size <= 0))
return;
const int imax = size -1;
array[0] = xmin;
array[imax] = xmax;
const double lxmin = log(xmin);
const double lxmax = log(xmax);
const double lstep = (lxmax - lxmin) / double(imax);
for (int i = 1; i < imax; i++)
array[i] = exp(lxmin + double(i) * lstep);
}
BodePlot::BodePlot(QWidget *parent):
QwtPlot(parent)
{
setAutoReplot(false);
setTitle("Frequency Response of a Second-Order System");
setCanvasBackground(QColor(Qt::darkBlue));
// legend
QwtLegend *legend = new QwtLegend;
legend->setFrameStyle(QFrame::Box|QFrame::Sunken);
insertLegend(legend, QwtPlot::BottomLegend);
// grid
QwtPlotGrid *grid = new QwtPlotGrid;
grid->enableXMin(true);
grid->setMajPen(QPen(Qt::white, 0, Qt::DotLine));
grid->setMinPen(QPen(Qt::gray, 0 , Qt::DotLine));
grid->attach(this);
// axes
enableAxis(QwtPlot::yRight);
setAxisTitle(QwtPlot::xBottom, "Normalized Frequency");
setAxisTitle(QwtPlot::yLeft, "Amplitude [dB]");
setAxisTitle(QwtPlot::yRight, "Phase [deg]");
setAxisMaxMajor(QwtPlot::xBottom, 6);
setAxisMaxMinor(QwtPlot::xBottom, 10);
setAxisScaleEngine(QwtPlot::xBottom, new QwtLog10ScaleEngine);
// curves
d_crv1 = new QwtPlotCurve("Amplitude");
#if QT_VERSION >= 0x040000
d_crv1->setRenderHint(QwtPlotItem::RenderAntialiased);
#endif
d_crv1->setPen(QPen(Qt::yellow));
d_crv1->setYAxis(QwtPlot::yLeft);
d_crv1->attach(this);
d_crv2 = new QwtPlotCurve("Phase");
#if QT_VERSION >= 0x040000
d_crv2->setRenderHint(QwtPlotItem::RenderAntialiased);
#endif
d_crv2->setPen(QPen(Qt::cyan));
d_crv2->setYAxis(QwtPlot::yRight);
d_crv2->attach(this);
// marker
d_mrk1 = new QwtPlotMarker();
d_mrk1->setValue(0.0, 0.0);
d_mrk1->setLineStyle(QwtPlotMarker::VLine);
d_mrk1->setLabelAlignment(Qt::AlignRight | Qt::AlignBottom);
d_mrk1->setLinePen(QPen(Qt::green, 0, Qt::DashDotLine));
d_mrk1->attach(this);
d_mrk2 = new QwtPlotMarker();
d_mrk2->setLineStyle(QwtPlotMarker::HLine);
d_mrk2->setLabelAlignment(Qt::AlignRight | Qt::AlignBottom);
d_mrk2->setLinePen(QPen(QColor(200,150,0), 0, Qt::DashDotLine));
d_mrk2->setSymbol( QwtSymbol(QwtSymbol::Diamond,
QColor(Qt::yellow), QColor(Qt::green), QSize(7,7)));
d_mrk2->attach(this);
setDamp(0.0);
setAutoReplot(true);
}
void BodePlot::showData(double *frequency, double *amplitude,
double *phase, int count)
{
d_crv1->setData(frequency, amplitude, count);
d_crv2->setData(frequency, phase, count);
}
void BodePlot::showPeak(double freq, double amplitude)
{
QString label;
label.sprintf("Peak: %.3g dB", amplitude);
QwtText text(label);
text.setFont(QFont("Helvetica", 10, QFont::Bold));
text.setColor(QColor(200,150,0));
d_mrk2->setValue(freq, amplitude);
d_mrk2->setLabel(text);
}
void BodePlot::show3dB(double freq)
{
QString label;
label.sprintf("-3 dB at f = %.3g", freq);
QwtText text(label);
text.setFont(QFont("Helvetica", 10, QFont::Bold));
text.setColor(Qt::green);
d_mrk1->setValue(freq, 0.0);
d_mrk1->setLabel(text);
}
//
// re-calculate frequency response
//
void BodePlot::setDamp(double damping)
{
const bool doReplot = autoReplot();
setAutoReplot(false);
const int ArraySize = 200;
double frequency[ArraySize];
double amplitude[ArraySize];
double phase[ArraySize];
// build frequency vector with logarithmic division
logSpace(frequency, ArraySize, 0.01, 100);
int i3 = 1;
double fmax = 1;
double amax = -1000.0;
for (int i = 0; i < ArraySize; i++)
{
double f = frequency[i];
cplx g = cplx(1.0) / cplx(1.0 - f * f, 2.0 * damping * f);
amplitude[i] = 20.0 * log10(sqrt( g.real()*g.real() + g.imag()*g.imag()));
phase[i] = atan2(g.imag(), g.real()) * (180.0 / M_PI);
if ((i3 <= 1) && (amplitude[i] < -3.0))
i3 = i;
if (amplitude[i] > amax)
{
amax = amplitude[i];
fmax = frequency[i];
}
}
double f3 = frequency[i3] -
(frequency[i3] - frequency[i3 - 1])
/ (amplitude[i3] - amplitude[i3 -1]) * (amplitude[i3] + 3);
showPeak(fmax, amax);
show3dB(f3);
showData(frequency, amplitude, phase, ArraySize);
setAutoReplot(doReplot);
replot();
}

View File

@@ -1,25 +0,0 @@
#include <qwt_plot.h>
class QwtPlotCurve;
class QwtPlotMarker;
class BodePlot: public QwtPlot
{
Q_OBJECT
public:
BodePlot(QWidget *parent);
public slots:
void setDamp(double damping);
private:
void showData(double *frequency, double *amplitude,
double *phase, int count);
void showPeak(double freq, double amplitude);
void show3dB(double freq);
QwtPlotCurve *d_crv1;
QwtPlotCurve *d_crv2;
QwtPlotMarker *d_mrk1;
QwtPlotMarker *d_mrk2;
};

View File

@@ -1,62 +0,0 @@
#ifndef BODE_CPLX_H
#define BODE_CPLX_H
#include <math.h>
class cplx {
private:
double re,im;
public:
double real() {return re;}
double imag() {return im;}
cplx() {
re = 0.0;
im = -0.0;
}
cplx& operator= (cplx a) {
re = a.re;
im = a.im;
return *this;
}
cplx(double r, double i = 0.0) {
re = r;
im = i;
}
friend cplx operator * (cplx x1, cplx x2);
friend cplx operator + (cplx x1, cplx x2);
friend cplx operator - (cplx x1, cplx x2);
friend cplx operator / (cplx x1, cplx x2);
};
inline cplx operator+(cplx x1, cplx x2)
{
return cplx(x1.re + x2.re, x1.im + x2.im);
}
inline cplx operator-(cplx x1, cplx x2)
{
return cplx(x1.re - x2.re, x1.im - x2.im);
}
inline cplx operator*(cplx x1, cplx x2)
{
return cplx(x1.re * x2.re - x1.im * x2.im,
x1.re * x2.im + x2.re * x1.im);
}
inline cplx operator/(cplx x1, cplx x2)
{
double denom = x2.re * x2.re + x2.im * x2.im;
return cplx( (x1.re * x2.re + x1.im * x2.im) /denom,
(x1.im * x2.re - x2.im * x1.re) / denom);
}
#endif

View File

@@ -1,95 +0,0 @@
#ifndef PIXMAPS_H
#define PIXMAPS_H
static const char *print_xpm[]={
"32 32 12 1",
"a c #ffffff",
"h c #ffff00",
"c c #ffffff",
"f c #dcdcdc",
"b c #c0c0c0",
"j c #a0a0a4",
"e c #808080",
"g c #808000",
"d c #585858",
"i c #00ff00",
"# c #000000",
". c None",
"................................",
"................................",
"...........###..................",
"..........#abb###...............",
".........#aabbbbb###............",
".........#ddaaabbbbb###.........",
"........#ddddddaaabbbbb###......",
".......#deffddddddaaabbbbb###...",
"......#deaaabbbddddddaaabbbbb###",
".....#deaaaaaaabbbddddddaaabbbb#",
"....#deaaabbbaaaa#ddedddfggaaad#",
"...#deaaaaaaaaaa#ddeeeeafgggfdd#",
"..#deaaabbbaaaa#ddeeeeabbbbgfdd#",
".#deeefaaaaaaa#ddeeeeabbhhbbadd#",
"#aabbbeeefaaa#ddeeeeabbbbbbaddd#",
"#bbaaabbbeee#ddeeeeabbiibbadddd#",
"#bbbbbaaabbbeeeeeeabbbbbbaddddd#",
"#bjbbbbbbaaabbbbeabbbbbbadddddd#",
"#bjjjjbbbbbbaaaeabbbbbbaddddddd#",
"#bjaaajjjbbbbbbaaabbbbadddddddd#",
"#bbbbbaaajjjbbbbbbaaaaddddddddd#",
"#bjbbbbbbaaajjjbbbbbbddddddddd#.",
"#bjjjjbbbbbbaaajjjbbbdddddddd#..",
"#bjaaajjjbbbbbbjaajjbddddddd#...",
"#bbbbbaaajjjbbbjbbaabdddddd#....",
"###bbbbbbaaajjjjbbbbbddddd#.....",
"...###bbbbbbaaajbbbbbdddd#......",
"......###bbbbbbjbbbbbddd#.......",
".........###bbbbbbbbbdd#........",
"............###bbbbbbd#.........",
"...............###bbb#..........",
"..................###..........."};
static const char *zoom_xpm[]={
"32 32 8 1",
"# c #000000",
"b c #c0c0c0",
"a c #ffffff",
"e c #585858",
"d c #a0a0a4",
"c c #0000ff",
"f c #00ffff",
". c None",
"..######################........",
".#a#baaaaaaaaaaaaaaaaaa#........",
"#aa#baaaaaaaaaaaaaccaca#........",
"####baaaaaaaaaaaaaaaaca####.....",
"#bbbbaaaaaaaaaaaacccaaa#da#.....",
"#aaaaaaaaaaaaaaaacccaca#da#.....",
"#aaaaaaaaaaaaaaaaaccaca#da#.....",
"#aaaaaaaaaabe###ebaaaaa#da#.....",
"#aaaaaaaaa#########aaaa#da#.....",
"#aaaaaaaa###dbbbb###aaa#da#.....",
"#aaaaaaa###aaaaffb###aa#da#.....",
"#aaaaaab##aaccaaafb##ba#da#.....",
"#aaaaaae#daaccaccaad#ea#da#.....",
"#aaaaaa##aaaaaaccaab##a#da#.....",
"#aaaaaa##aacccaaaaab##a#da#.....",
"#aaaaaa##aaccccaccab##a#da#.....",
"#aaaaaae#daccccaccad#ea#da#.....",
"#aaaaaab##aacccaaaa##da#da#.....",
"#aaccacd###aaaaaaa###da#da#.....",
"#aaaaacad###daaad#####a#da#.....",
"#acccaaaad##########da##da#.....",
"#acccacaaadde###edd#eda#da#.....",
"#aaccacaaaabdddddbdd#eda#a#.....",
"#aaaaaaaaaaaaaaaaaadd#eda##.....",
"#aaaaaaaaaaaaaaaaaaadd#eda#.....",
"#aaaaaaaccacaaaaaaaaadd#eda#....",
"#aaaaaaaaaacaaaaaaaaaad##eda#...",
"#aaaaaacccaaaaaaaaaaaaa#d#eda#..",
"########################dd#eda#.",
"...#dddddddddddddddddddddd##eda#",
"...#aaaaaaaaaaaaaaaaaaaaaa#.####",
"...########################..##."};
#endif

View File

@@ -1,57 +0,0 @@
#include <qpainter.h>
#include <qwt_scale_map.h>
#include <qwt_plot_curve.h>
#include "cpuplot.h"
#include "cpupiemarker.h"
CpuPieMarker::CpuPieMarker()
{
setZ(1000);
#if QT_VERSION >= 0x040000
setRenderHint(QwtPlotItem::RenderAntialiased, true);
#endif
}
int CpuPieMarker::rtti() const
{
return QwtPlotItem::Rtti_PlotUserItem;
}
void CpuPieMarker::draw(QPainter *p,
const QwtScaleMap &, const QwtScaleMap &,
const QRect &rect) const
{
const CpuPlot *cpuPlot = (CpuPlot *)plot();
const QwtScaleMap yMap = cpuPlot->canvasMap(QwtPlot::yLeft);
const int margin = 5;
QRect pieRect;
pieRect.setX(rect.x() + margin);
pieRect.setY(rect.y() + margin);
pieRect.setHeight(yMap.transform(80.0));
pieRect.setWidth(pieRect.height());
const int dataType[] = { CpuPlot::User, CpuPlot::System, CpuPlot::Idle };
int angle = (int)(5760 * 0.75);
for ( unsigned int i = 0;
i < sizeof(dataType) / sizeof(dataType[0]); i++ )
{
const QwtPlotCurve *curve = cpuPlot->cpuCurve(dataType[i]);
if ( curve->dataSize() > 0 )
{
const int value = (int)(5760 * curve->y(0) / 100.0);
p->save();
p->setBrush(QBrush(curve->pen().color(), Qt::SolidPattern));
if ( value != 0 )
p->drawPie(pieRect, -angle, -value);
p->restore();
angle += value;
}
}
}

View File

@@ -1,18 +0,0 @@
//-----------------------------------------------------------------
// This class shows how to extend QwtPlotItems. It displays a
// pie chart of user/total/idle cpu usage in percent.
//-----------------------------------------------------------------
#include <qwt_plot_item.h>
class CpuPieMarker: public QwtPlotItem
{
public:
CpuPieMarker();
virtual int rtti() const;
virtual void draw(QPainter *p,
const QwtScaleMap &, const QwtScaleMap &,
const QRect &rect) const;
};

View File

@@ -1,244 +0,0 @@
#include <qapplication.h>
#include <qlayout.h>
#include <qlabel.h>
#include <qpainter.h>
#include <qwt_plot_layout.h>
#include <qwt_plot_curve.h>
#include <qwt_scale_draw.h>
#include <qwt_scale_widget.h>
#include <qwt_legend.h>
#include <qwt_legend_item.h>
#include "cpupiemarker.h"
#include "cpuplot.h"
class TimeScaleDraw: public QwtScaleDraw
{
public:
TimeScaleDraw(const QTime &base):
baseTime(base)
{
}
virtual QwtText label(double v) const
{
QTime upTime = baseTime.addSecs((int)v);
return upTime.toString();
}
private:
QTime baseTime;
};
class Background: public QwtPlotItem
{
public:
Background()
{
setZ(0.0);
}
virtual int rtti() const
{
return QwtPlotItem::Rtti_PlotUserItem;
}
virtual void draw(QPainter *painter,
const QwtScaleMap &, const QwtScaleMap &yMap,
const QRect &rect) const
{
QColor c(Qt::white);
QRect r = rect;
for ( int i = 100; i > 0; i -= 10 )
{
r.setBottom(yMap.transform(i - 10));
r.setTop(yMap.transform(i));
painter->fillRect(r, c);
c = c.dark(110);
}
}
};
class CpuCurve: public QwtPlotCurve
{
public:
CpuCurve(const QString &title):
QwtPlotCurve(title)
{
#if QT_VERSION >= 0x040000
setRenderHint(QwtPlotItem::RenderAntialiased);
#endif
}
void setColor(const QColor &color)
{
#if QT_VERSION >= 0x040000
QColor c = color;
c.setAlpha(150);
setPen(c);
setBrush(c);
#else
setPen(color);
setBrush(QBrush(color, Qt::Dense4Pattern));
#endif
}
};
CpuPlot::CpuPlot(QWidget *parent):
QwtPlot(parent),
dataCount(0)
{
setAutoReplot(false);
plotLayout()->setAlignCanvasToScales(true);
QwtLegend *legend = new QwtLegend;
legend->setItemMode(QwtLegend::CheckableItem);
insertLegend(legend, QwtPlot::RightLegend);
setAxisTitle(QwtPlot::xBottom, " System Uptime [h:m:s]");
setAxisScaleDraw(QwtPlot::xBottom,
new TimeScaleDraw(cpuStat.upTime()));
setAxisScale(QwtPlot::xBottom, 0, HISTORY);
setAxisLabelRotation(QwtPlot::xBottom, -50.0);
setAxisLabelAlignment(QwtPlot::xBottom, Qt::AlignLeft | Qt::AlignBottom);
/*
In situations, when there is a label at the most right position of the
scale, additional space is needed to display the overlapping part
of the label would be taken by reducing the width of scale and canvas.
To avoid this "jumping canvas" effect, we add a permanent margin.
We don't need to do the same for the left border, because there
is enough space for the overlapping label below the left scale.
*/
QwtScaleWidget *scaleWidget = axisWidget(QwtPlot::xBottom);
const int fmh = QFontMetrics(scaleWidget->font()).height();
scaleWidget->setMinBorderDist(0, fmh / 2);
setAxisTitle(QwtPlot::yLeft, "Cpu Usage [%]");
setAxisScale(QwtPlot::yLeft, 0, 100);
Background *bg = new Background();
bg->attach(this);
CpuPieMarker *pie = new CpuPieMarker();
pie->attach(this);
CpuCurve *curve;
curve = new CpuCurve("System");
curve->setColor(Qt::red);
curve->attach(this);
data[System].curve = curve;
curve = new CpuCurve("User");
curve->setColor(Qt::blue);
curve->setZ(curve->z() - 1);
curve->attach(this);
data[User].curve = curve;
curve = new CpuCurve("Total");
curve->setColor(Qt::black);
curve->setZ(curve->z() - 2);
curve->attach(this);
data[Total].curve = curve;
curve = new CpuCurve("Idle");
curve->setColor(Qt::darkCyan);
curve->setZ(curve->z() - 3);
curve->attach(this);
data[Idle].curve = curve;
showCurve(data[System].curve, true);
showCurve(data[User].curve, true);
showCurve(data[Total].curve, false);
showCurve(data[Idle].curve, false);
for ( int i = 0; i < HISTORY; i++ )
timeData[HISTORY - 1 - i] = i;
(void)startTimer(1000); // 1 second
connect(this, SIGNAL(legendChecked(QwtPlotItem *, bool)),
SLOT(showCurve(QwtPlotItem *, bool)));
}
void CpuPlot::timerEvent(QTimerEvent *)
{
for ( int i = dataCount; i > 0; i-- )
{
for ( int c = 0; c < NCpuData; c++ )
{
if ( i < HISTORY )
data[c].data[i] = data[c].data[i-1];
}
}
cpuStat.statistic(data[User].data[0], data[System].data[0]);
data[Total].data[0] = data[User].data[0] +
data[System].data[0];
data[Idle].data[0] = 100.0 - data[Total].data[0];
if ( dataCount < HISTORY )
dataCount++;
for ( int j = 0; j < HISTORY; j++ )
timeData[j]++;
setAxisScale(QwtPlot::xBottom,
timeData[HISTORY - 1], timeData[0]);
for ( int c = 0; c < NCpuData; c++ )
{
data[c].curve->setRawData(
timeData, data[c].data, dataCount);
}
replot();
}
void CpuPlot::showCurve(QwtPlotItem *item, bool on)
{
item->setVisible(on);
QWidget *w = legend()->find(item);
if ( w && w->inherits("QwtLegendItem") )
((QwtLegendItem *)w)->setChecked(on);
replot();
}
int main(int argc, char **argv)
{
QApplication a(argc, argv);
QWidget vBox;
#if QT_VERSION >= 0x040000
vBox.setWindowTitle("Cpu Plot");
#else
vBox.setCaption("Cpu Plot");
#endif
CpuPlot *plot = new CpuPlot(&vBox);
plot->setTitle("History");
plot->setMargin(5);
QString info("Press the legend to en/disable a curve");
QLabel *label = new QLabel(info, &vBox);
QVBoxLayout *layout = new QVBoxLayout(&vBox);
layout->addWidget(plot);
layout->addWidget(label);
#if QT_VERSION < 0x040000
a.setMainWidget(&vBox);
#endif
vBox.resize(600,400);
vBox.show();
return a.exec();
}

View File

@@ -1,42 +0,0 @@
#include <qwt_plot.h>
#include "cpustat.h"
#define HISTORY 60 // seconds
class QwtPlotCurve;
class CpuPlot : public QwtPlot
{
Q_OBJECT
public:
enum CpuData
{
User,
System,
Total,
Idle,
NCpuData
};
CpuPlot(QWidget * = 0);
const QwtPlotCurve *cpuCurve(int id) const
{ return data[id].curve; }
protected:
void timerEvent(QTimerEvent *e);
private slots:
void showCurve(QwtPlotItem *, bool on);
private:
struct
{
QwtPlotCurve *curve;
double data[HISTORY];
} data[NCpuData];
double timeData[HISTORY];
int dataCount;
CpuStat cpuStat;
};

Some files were not shown because too many files have changed in this diff Show More