mirror of
https://bitbucket.org/smil3y/kde-playground.git
synced 2025-02-23 18:32:51 +00:00
add massif-visualizer
This commit is contained in:
parent
b7327cfea8
commit
d6419d5b2a
514 changed files with 123370 additions and 0 deletions
4
massif-visualizer/.kateconfig
Normal file
4
massif-visualizer/.kateconfig
Normal file
|
@ -0,0 +1,4 @@
|
|||
kate: space-indent on; indent-width 4; replace-tabs on; auto-insert-doxygen on;
|
||||
kate: eol unix; replace-trailing-space-save on; show-tabs on; tab-indents on;
|
||||
kate: tab-width 4;
|
||||
|
6
massif-visualizer/AUTHORS
Normal file
6
massif-visualizer/AUTHORS
Normal file
|
@ -0,0 +1,6 @@
|
|||
Main author:
|
||||
Milian Wolff <mail@milianw.de>
|
||||
|
||||
Contributions by:
|
||||
Andrei Nistor <coder.tux@ceata.org>
|
||||
Arnold Dumas <contact@arnolddumas.fr>
|
38
massif-visualizer/CMakeLists.txt
Normal file
38
massif-visualizer/CMakeLists.txt
Normal file
|
@ -0,0 +1,38 @@
|
|||
cmake_minimum_required(VERSION 2.8.9)
|
||||
PROJECT(massif-visualizer)
|
||||
|
||||
enable_testing()
|
||||
|
||||
set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake/ ${CMAKE_MODULE_PATH})
|
||||
|
||||
set(KDE_MIN_VERSION "4.7.0")
|
||||
find_package(KDE4 4.7.0 REQUIRED)
|
||||
|
||||
include (KDE4Defaults)
|
||||
include (MacroLibrary)
|
||||
|
||||
macro_optional_find_package(KGraphViewer 2.1)
|
||||
macro_log_feature(KGRAPHVIEWER_FOUND "KGraphViewer" "KPart to view callgraph dot files."
|
||||
"http://extragear.kde.org/apps/kgraphviewer/" FALSE ""
|
||||
"Required for detailed snapshot analysis. From KDE SDK Extragear package, KGraphViewer 2.1 or higher is required.")
|
||||
|
||||
macro_display_feature_log()
|
||||
|
||||
include_directories(
|
||||
${KDE4_INCLUDES}
|
||||
${CMAKE_CURRENT_BINARY_DIR}
|
||||
${CMAKE_CURRENT_SOURCE_DIR}
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/kdchart/include/KDChart
|
||||
)
|
||||
|
||||
add_definitions(-Wall)
|
||||
|
||||
add_subdirectory(kdchart)
|
||||
add_subdirectory(massifdata)
|
||||
add_subdirectory(visualizer)
|
||||
add_subdirectory(app)
|
||||
add_subdirectory(pics)
|
||||
|
||||
if(ENABLE_TESTING)
|
||||
add_subdirectory(test)
|
||||
endif()
|
340
massif-visualizer/COPYING
Normal file
340
massif-visualizer/COPYING
Normal file
|
@ -0,0 +1,340 @@
|
|||
GNU GENERAL PUBLIC LICENSE
|
||||
Version 2, June 1991
|
||||
|
||||
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
|
||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
Preamble
|
||||
|
||||
The licenses for most software are designed to take away your
|
||||
freedom to share and change it. By contrast, the GNU General Public
|
||||
License is intended to guarantee your freedom to share and change free
|
||||
software--to make sure the software is free for all its users. This
|
||||
General Public License applies to most of the Free Software
|
||||
Foundation's software and to any other program whose authors commit to
|
||||
using it. (Some other Free Software Foundation software is covered by
|
||||
the GNU Library General Public License instead.) You can apply it to
|
||||
your programs, too.
|
||||
|
||||
When we speak of free software, we are referring to freedom, 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 or use pieces of it
|
||||
in new free programs; and that you know you can do these things.
|
||||
|
||||
To protect your rights, we need to make restrictions that forbid
|
||||
anyone to deny you these rights or to ask you to surrender the rights.
|
||||
These restrictions translate to certain responsibilities for you if you
|
||||
distribute copies of the software, or if you modify it.
|
||||
|
||||
For example, if you distribute copies of such a program, whether
|
||||
gratis or for a fee, you must give the recipients all the rights that
|
||||
you have. You must make sure that they, too, receive or can get the
|
||||
source code. And you must show them these terms so they know their
|
||||
rights.
|
||||
|
||||
We protect your rights with two steps: (1) copyright the software, and
|
||||
(2) offer you this license which gives you legal permission to copy,
|
||||
distribute and/or modify the software.
|
||||
|
||||
Also, for each author's protection and ours, we want to make certain
|
||||
that everyone understands that there is no warranty for this free
|
||||
software. If the software is modified by someone else and passed on, we
|
||||
want its recipients to know that what they have is not the original, so
|
||||
that any problems introduced by others will not reflect on the original
|
||||
authors' reputations.
|
||||
|
||||
Finally, any free program is threatened constantly by software
|
||||
patents. We wish to avoid the danger that redistributors of a free
|
||||
program will individually obtain patent licenses, in effect making the
|
||||
program proprietary. To prevent this, we have made it clear that any
|
||||
patent must be licensed for everyone's free use or not licensed at all.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow.
|
||||
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||
|
||||
0. This License applies to any program or other work which contains
|
||||
a notice placed by the copyright holder saying it may be distributed
|
||||
under the terms of this General Public License. The "Program", below,
|
||||
refers to any such program or work, and a "work based on the Program"
|
||||
means either the Program or any derivative work under copyright law:
|
||||
that is to say, a work containing the Program or a portion of it,
|
||||
either verbatim or with modifications and/or translated into another
|
||||
language. (Hereinafter, translation is included without limitation in
|
||||
the term "modification".) Each licensee is addressed as "you".
|
||||
|
||||
Activities other than copying, distribution and modification are not
|
||||
covered by this License; they are outside its scope. The act of
|
||||
running the Program is not restricted, and the output from the Program
|
||||
is covered only if its contents constitute a work based on the
|
||||
Program (independent of having been made by running the Program).
|
||||
Whether that is true depends on what the Program does.
|
||||
|
||||
1. You may copy and distribute verbatim copies of the Program's
|
||||
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 give any other recipients of the Program a copy of this License
|
||||
along with the Program.
|
||||
|
||||
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 Program or any portion
|
||||
of it, thus forming a work based on the Program, 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) You must cause the modified files to carry prominent notices
|
||||
stating that you changed the files and the date of any change.
|
||||
|
||||
b) You must cause any work that you distribute or publish, that in
|
||||
whole or in part contains or is derived from the Program or any
|
||||
part thereof, to be licensed as a whole at no charge to all third
|
||||
parties under the terms of this License.
|
||||
|
||||
c) If the modified program normally reads commands interactively
|
||||
when run, you must cause it, when started running for such
|
||||
interactive use in the most ordinary way, to print or display an
|
||||
announcement including an appropriate copyright notice and a
|
||||
notice that there is no warranty (or else, saying that you provide
|
||||
a warranty) and that users may redistribute the program under
|
||||
these conditions, and telling the user how to view a copy of this
|
||||
License. (Exception: if the Program itself is interactive but
|
||||
does not normally print such an announcement, your work based on
|
||||
the Program is not required to print an announcement.)
|
||||
|
||||
These requirements apply to the modified work as a whole. If
|
||||
identifiable sections of that work are not derived from the Program,
|
||||
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 Program, 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 Program.
|
||||
|
||||
In addition, mere aggregation of another work not based on the Program
|
||||
with the Program (or with a work based on the Program) on a volume of
|
||||
a storage or distribution medium does not bring the other work under
|
||||
the scope of this License.
|
||||
|
||||
3. You may copy and distribute the Program (or a work based on it,
|
||||
under Section 2) in object code or executable form under the terms of
|
||||
Sections 1 and 2 above provided that you also do one of the following:
|
||||
|
||||
a) 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; or,
|
||||
|
||||
b) Accompany it with a written offer, valid for at least three
|
||||
years, to give any third party, for a charge no more than your
|
||||
cost of physically performing source distribution, a complete
|
||||
machine-readable copy of the corresponding source code, to be
|
||||
distributed under the terms of Sections 1 and 2 above on a medium
|
||||
customarily used for software interchange; or,
|
||||
|
||||
c) Accompany it with the information you received as to the offer
|
||||
to distribute corresponding source code. (This alternative is
|
||||
allowed only for noncommercial distribution and only if you
|
||||
received the program in object code or executable form with such
|
||||
an offer, in accord with Subsection b above.)
|
||||
|
||||
The source code for a work means the preferred form of the work for
|
||||
making modifications to it. For an executable work, 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 executable. However, as a
|
||||
special exception, the source code 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.
|
||||
|
||||
If distribution of executable or 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 counts as
|
||||
distribution of the source code, even though third parties are not
|
||||
compelled to copy the source along with the object code.
|
||||
|
||||
4. You may not copy, modify, sublicense, or distribute the Program
|
||||
except as expressly provided under this License. Any attempt
|
||||
otherwise to copy, modify, sublicense or distribute the Program 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.
|
||||
|
||||
5. 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 Program or its derivative works. These actions are
|
||||
prohibited by law if you do not accept this License. Therefore, by
|
||||
modifying or distributing the Program (or any work based on the
|
||||
Program), you indicate your acceptance of this License to do so, and
|
||||
all its terms and conditions for copying, distributing or modifying
|
||||
the Program or works based on it.
|
||||
|
||||
6. Each time you redistribute the Program (or any work based on the
|
||||
Program), the recipient automatically receives a license from the
|
||||
original licensor to copy, distribute or modify the Program 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 to
|
||||
this License.
|
||||
|
||||
7. 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 Program at all. For example, if a patent
|
||||
license would not permit royalty-free redistribution of the Program 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 Program.
|
||||
|
||||
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.
|
||||
|
||||
8. If the distribution and/or use of the Program is restricted in
|
||||
certain countries either by patents or by copyrighted interfaces, the
|
||||
original copyright holder who places the Program 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.
|
||||
|
||||
9. The Free Software Foundation may publish revised and/or new versions
|
||||
of the 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 Program
|
||||
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 Program does not specify a version number of
|
||||
this License, you may choose any version ever published by the Free Software
|
||||
Foundation.
|
||||
|
||||
10. If you wish to incorporate parts of the Program into other free
|
||||
programs whose distribution conditions are different, 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
|
||||
|
||||
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
||||
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
||||
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
|
||||
PROVIDE THE PROGRAM "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 PROGRAM IS WITH YOU. SHOULD THE
|
||||
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
|
||||
REPAIR OR CORRECTION.
|
||||
|
||||
12. 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 PROGRAM 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 PROGRAM (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 PROGRAM TO OPERATE WITH ANY OTHER
|
||||
PROGRAMS), 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 Programs
|
||||
|
||||
If you develop a new program, and you want it to be of the greatest
|
||||
possible use to the public, the best way to achieve this is to make it
|
||||
free software which everyone can redistribute and change under these terms.
|
||||
|
||||
To do so, attach the following notices to the program. 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 program's name and a brief idea of what it does.>
|
||||
Copyright (C) <year> <name of author>
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program 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 General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
If the program is interactive, make it output a short notice like this
|
||||
when it starts in an interactive mode:
|
||||
|
||||
Gnomovision version 69, Copyright (C) year name of author
|
||||
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
||||
This is free software, and you are welcome to redistribute it
|
||||
under certain conditions; type `show c' for details.
|
||||
|
||||
The hypothetical commands `show w' and `show c' should show the appropriate
|
||||
parts of the General Public License. Of course, the commands you use may
|
||||
be called something other than `show w' and `show c'; they could even be
|
||||
mouse-clicks or menu items--whatever suits your program.
|
||||
|
||||
You should also get your employer (if you work as a programmer) or your
|
||||
school, if any, to sign a "copyright disclaimer" for the program, if
|
||||
necessary. Here is a sample; alter the names:
|
||||
|
||||
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
|
||||
`Gnomovision' (which makes passes at compilers) written by James Hacker.
|
||||
|
||||
<signature of Ty Coon>, 1 April 1989
|
||||
Ty Coon, President of Vice
|
||||
|
||||
This General Public License does not permit incorporating your program into
|
||||
proprietary programs. If your program is a subroutine library, you may
|
||||
consider it more useful to permit linking proprietary applications with the
|
||||
library. If this is what you want to do, use the GNU Library General
|
||||
Public License instead of this License.
|
15
massif-visualizer/INSTALL
Normal file
15
massif-visualizer/INSTALL
Normal file
|
@ -0,0 +1,15 @@
|
|||
Build requirements:
|
||||
|
||||
- kdelibs headers from KDE4
|
||||
- optional: kgraphviewer 2.1: http://kde-apps.org/content/show.php/KGraphViewer+and+KGraphEditor?content=23999
|
||||
|
||||
When you got all this, you simply do the usual CMake run:
|
||||
|
||||
cd massif-visualizer
|
||||
mkdir build
|
||||
cd build
|
||||
cmake ..
|
||||
make
|
||||
sudo make install
|
||||
|
||||
That should be it.
|
16
massif-visualizer/Messages.sh
Executable file
16
massif-visualizer/Messages.sh
Executable file
|
@ -0,0 +1,16 @@
|
|||
#! /usr/bin/env bash
|
||||
subdirs="app kdchart massifdata visualizer"
|
||||
rcfiles="`find $subdirs -name \*.rc`"
|
||||
uifiles="`find $subdirs -name \*.ui`"
|
||||
kcfgfiles="`find $subdirs -name \*.kcfg`"
|
||||
if [[ "$rcfiles" != "" ]] ; then
|
||||
$EXTRACTRC $rcfiles >> rc.cpp || exit 11
|
||||
fi
|
||||
if [[ "$uifiles" != "" ]] ; then
|
||||
$EXTRACTRC $uifiles >> rc.cpp || exit 12
|
||||
fi
|
||||
if [[ "$kcfgfiles" != "" ]] ; then
|
||||
$EXTRACTRC $kcfgfiles >> rc.cpp || exit 13
|
||||
fi
|
||||
$XGETTEXT `find $subdirs -name \*.cc -o -name \*.cpp -o -name \*.h` rc.cpp -o $podir/massif-visualizer.pot
|
||||
rm -f rc.cpp
|
93
massif-visualizer/README
Normal file
93
massif-visualizer/README
Normal file
|
@ -0,0 +1,93 @@
|
|||
=================
|
||||
massif-visualizer
|
||||
=================
|
||||
|
||||
---------------------------------------------------------
|
||||
visualizer for Valgrind Massif memory-usage tracking tool
|
||||
---------------------------------------------------------
|
||||
|
||||
:Author: Milian Wolff <mail@milianw.de>
|
||||
:Date: 2011-11-21
|
||||
:Manual section: 1
|
||||
|
||||
SYNOPSIS
|
||||
========
|
||||
|
||||
**massif-visualizer [massif-data-file]**
|
||||
|
||||
DESCRIPTION
|
||||
===========
|
||||
|
||||
Massif Visualizer is a tool that visualizes massif data. You run your
|
||||
application in Valgrind with ``--tool=massif`` and then open the generated
|
||||
``massif.out.%pid`` in the visualizer. Gzip or Bzip2 compressed massif files can
|
||||
also be opened transparently.
|
||||
|
||||
The application consists of three parts:
|
||||
|
||||
**The Overview Chart**
|
||||
|
||||
The first thing you'll notice is a nice chart that displays the same as e.g.
|
||||
``ms_print`` does in Ascii-Art: total memory consumption over time.
|
||||
|
||||
Massif-Visualizer goes beyond that by additionally showing the top most
|
||||
cost-intensive locations in your code as a stacked graph below the total cost.
|
||||
The graph also reacts on user-interaction.
|
||||
|
||||
This view you can use for:
|
||||
|
||||
- checking whether your application has memory leaks
|
||||
- finding expensive peaks
|
||||
- finding locations that significantly contribute to the overall memory
|
||||
consumption of your application
|
||||
|
||||
**The Snapshot Data Tree**
|
||||
|
||||
Directly next to the above chart, you'll see a tree with all of the massif
|
||||
data. The tree items are colored depending on their cost, with red opaque being
|
||||
the most interesting (peak) elements. Green/transparent items are negligible
|
||||
and don't add significant cost to your application.
|
||||
|
||||
You can also search the tree and when you select something in it, the snapshot
|
||||
gets highlighted in the overview chart and the call graph gets updated.
|
||||
|
||||
**The Call Graph for Detailed Snapshots**
|
||||
|
||||
Massif generates a few detailed snapshots that essentially make up the tree. If
|
||||
you want to get an overview in a more comfortable way than the simple tree
|
||||
view, switch over to the detailed snapshot tab and see the tree visualized as a
|
||||
call graph. Zoom in, zoom out, use the birds eye view and see what contributes
|
||||
to a given snapshot. Note that function calls with the same memory cost are
|
||||
grouped to easily find the interesting parts.
|
||||
|
||||
OPTIONS
|
||||
=======
|
||||
|
||||
--help Show help about options
|
||||
--help-all Show all options
|
||||
--author Show author information
|
||||
-v, --version Show version information
|
||||
--license Show license information
|
||||
|
||||
AUTHOR
|
||||
======
|
||||
|
||||
Written by Milian Wolff.
|
||||
|
||||
REPORTING BUGS
|
||||
==============
|
||||
|
||||
Please report bugs on https://bugs.kde.org under the massif-visualizer product.
|
||||
|
||||
COPYRIGHT
|
||||
=========
|
||||
|
||||
Copyright © 2011 Milian Wolff.
|
||||
License GPLv2+: GNU GPL version 2 or later <http://gnu.org/licenses/gpl.html>.
|
||||
This is free software: you are free to change and redistribute it.
|
||||
There is NO WARRANTY, to the extent permitted by law.
|
||||
|
||||
SEE ALSO
|
||||
========
|
||||
|
||||
**valgrind(1)**, **ms_print(1)**
|
55
massif-visualizer/app/CMakeLists.txt
Normal file
55
massif-visualizer/app/CMakeLists.txt
Normal file
|
@ -0,0 +1,55 @@
|
|||
include_directories(
|
||||
${CMAKE_CURRENT_BINARY_DIR}
|
||||
${CMAKE_CURRENT_SOURCE_DIR}
|
||||
)
|
||||
|
||||
set(massif-visualizer_SRCS
|
||||
main.cpp
|
||||
mainwindow.cpp
|
||||
configdialog.cpp
|
||||
documentwidget.cpp
|
||||
documenttabinterface.cpp
|
||||
charttab.cpp
|
||||
allocatorstab.cpp
|
||||
)
|
||||
|
||||
if(KGRAPHVIEWER_FOUND)
|
||||
include_directories(
|
||||
${KGRAPHVIEWER_INCLUDE_DIRECTORIES}
|
||||
)
|
||||
add_definitions(-DHAVE_KGRAPHVIEWER)
|
||||
list(APPEND massif-visualizer_SRCS callgraphtab.cpp)
|
||||
endif(KGRAPHVIEWER_FOUND)
|
||||
|
||||
kde4_add_kcfg_files(massif-visualizer_SRCS massif-visualizer-settings.kcfgc)
|
||||
|
||||
add_executable(massif-visualizer ${massif-visualizer_SRCS})
|
||||
|
||||
target_link_libraries(massif-visualizer LINK_PRIVATE
|
||||
${KDE4_KDEUI_LIBS}
|
||||
${KDE4_KIO_LIBS}
|
||||
${KDE4_KPARTS_LIBS}
|
||||
mv-kdchart
|
||||
mv-massifdata
|
||||
mv-visualizer
|
||||
)
|
||||
|
||||
install( TARGETS massif-visualizer ${INSTALL_TARGETS_DEFAULT_ARGS} )
|
||||
|
||||
install(
|
||||
FILES massif-visualizerui.rc documentwidgetui.rc charttabui.rc callgraphtabui.rc
|
||||
DESTINATION ${DATA_INSTALL_DIR}/massif-visualizer
|
||||
)
|
||||
|
||||
install(FILES massif-visualizer-settings.kcfg DESTINATION ${KCFG_INSTALL_DIR})
|
||||
|
||||
install(PROGRAMS massif-visualizer.desktop DESTINATION ${XDG_APPS_INSTALL_DIR})
|
||||
|
||||
# XML mime type
|
||||
set( SHARED_MIME_INFO_MINIMUM_VERSION "0.30" )
|
||||
set( XDG_MIME_INSTALL_DIR "share/mime/packages" )
|
||||
find_package( SharedMimeInfo )
|
||||
if( SHARED_MIME_INFO_FOUND )
|
||||
install( FILES massif.xml DESTINATION ${XDG_MIME_INSTALL_DIR} )
|
||||
update_xdg_mimetypes( ${XDG_MIME_INSTALL_DIR} )
|
||||
endif( SHARED_MIME_INFO_FOUND )
|
103
massif-visualizer/app/allocatorstab.cpp
Normal file
103
massif-visualizer/app/allocatorstab.cpp
Normal file
|
@ -0,0 +1,103 @@
|
|||
/*
|
||||
This file is part of Massif Visualizer
|
||||
|
||||
Copyright 2014 Milian Wolff <mail@milianw.de>
|
||||
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License as
|
||||
published by the Free Software Foundation; either version 2 of
|
||||
the License or (at your option) version 3 or any later version
|
||||
accepted by the membership of KDE e.V. (or its successor approved
|
||||
by the membership of KDE e.V.), which shall act as a proxy
|
||||
defined in Section 14 of version 3 of the license.
|
||||
|
||||
This program 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 General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "allocatorstab.h"
|
||||
|
||||
#include "visualizer/allocatorsmodel.h"
|
||||
|
||||
#include <QVBoxLayout>
|
||||
#include <QTreeView>
|
||||
#include <QSortFilterProxyModel>
|
||||
#include <QMenu>
|
||||
|
||||
using namespace Massif;
|
||||
|
||||
AllocatorsTab::AllocatorsTab(const FileData* data,
|
||||
KXMLGUIClient* guiParent, QWidget* parent)
|
||||
: DocumentTabInterface(data, guiParent, parent)
|
||||
, m_model(new AllocatorsModel(data, this))
|
||||
, m_proxy(new QSortFilterProxyModel(this))
|
||||
, m_view(new QTreeView(this))
|
||||
{
|
||||
m_proxy->setSourceModel(m_model);
|
||||
m_proxy->setSortRole(AllocatorsModel::SortRole);
|
||||
|
||||
m_view->setRootIsDecorated(false);
|
||||
m_view->setModel(m_proxy);
|
||||
m_view->setSortingEnabled(true);
|
||||
m_view->sortByColumn(AllocatorsModel::Peak);
|
||||
m_view->resizeColumnToContents(AllocatorsModel::Function);
|
||||
m_view->resizeColumnToContents(AllocatorsModel::Peak);
|
||||
m_view->setContextMenuPolicy(Qt::CustomContextMenu);
|
||||
connect(m_view->selectionModel(), SIGNAL(currentChanged(QModelIndex,QModelIndex)),
|
||||
this, SLOT(selectionChanged(QModelIndex,QModelIndex)));
|
||||
connect(m_view, SIGNAL(customContextMenuRequested(QPoint)),
|
||||
this, SLOT(customContextMenuRequested(QPoint)));
|
||||
|
||||
setLayout(new QVBoxLayout(this));
|
||||
layout()->addWidget(m_view);
|
||||
}
|
||||
|
||||
AllocatorsTab::~AllocatorsTab()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void AllocatorsTab::selectModelItem(const ModelItem& item)
|
||||
{
|
||||
const QModelIndex idx = m_model->indexForItem(item);
|
||||
if (!idx.isValid()) {
|
||||
return;
|
||||
}
|
||||
|
||||
m_view->selectionModel()->clearSelection();
|
||||
m_view->selectionModel()->setCurrentIndex(m_proxy->mapFromSource(idx),
|
||||
QItemSelectionModel::Select | QItemSelectionModel::Rows);
|
||||
m_view->scrollTo(m_view->selectionModel()->currentIndex());
|
||||
}
|
||||
|
||||
void AllocatorsTab::settingsChanged()
|
||||
{
|
||||
m_model->settingsChanged();
|
||||
}
|
||||
|
||||
void AllocatorsTab::selectionChanged(const QModelIndex& current, const QModelIndex& /*previous*/)
|
||||
{
|
||||
const ModelItem item = current.data(AllocatorsModel::ItemRole).value<ModelItem>();
|
||||
if (item.first) {
|
||||
emit modelItemSelected(item);
|
||||
}
|
||||
}
|
||||
|
||||
void AllocatorsTab::customContextMenuRequested(const QPoint& pos)
|
||||
{
|
||||
const QModelIndex idx = m_view->indexAt(pos);
|
||||
const ModelItem item = idx.data(AllocatorsModel::ItemRole).value<ModelItem>();
|
||||
|
||||
QMenu menu;
|
||||
emit contextMenuRequested(item, &menu);
|
||||
if (!menu.actions().isEmpty()) {
|
||||
menu.exec(m_view->mapToGlobal(pos));
|
||||
}
|
||||
}
|
||||
|
||||
#include "allocatorstab.moc"
|
57
massif-visualizer/app/allocatorstab.h
Normal file
57
massif-visualizer/app/allocatorstab.h
Normal file
|
@ -0,0 +1,57 @@
|
|||
/*
|
||||
This file is part of Massif Visualizer
|
||||
|
||||
Copyright 2014 Milian Wolff <mail@milianw.de>
|
||||
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License as
|
||||
published by the Free Software Foundation; either version 2 of
|
||||
the License or (at your option) version 3 or any later version
|
||||
accepted by the membership of KDE e.V. (or its successor approved
|
||||
by the membership of KDE e.V.), which shall act as a proxy
|
||||
defined in Section 14 of version 3 of the license.
|
||||
|
||||
This program 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 General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef ALLOCATORSTAB_H
|
||||
#define ALLOCATORSTAB_H
|
||||
|
||||
#include "documenttabinterface.h"
|
||||
|
||||
class QTreeView;
|
||||
class QSortFilterProxyModel;
|
||||
class QModelIndex;
|
||||
|
||||
namespace Massif {
|
||||
class AllocatorsModel;
|
||||
}
|
||||
|
||||
class AllocatorsTab : public DocumentTabInterface
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit AllocatorsTab(const Massif::FileData* data, KXMLGUIClient* guiParent, QWidget* parent = 0);
|
||||
virtual ~AllocatorsTab();
|
||||
|
||||
virtual void selectModelItem(const Massif::ModelItem& item);
|
||||
virtual void settingsChanged();
|
||||
|
||||
private slots:
|
||||
void selectionChanged(const QModelIndex& current, const QModelIndex& previous);
|
||||
void customContextMenuRequested(const QPoint& pos);
|
||||
|
||||
private:
|
||||
Massif::AllocatorsModel* m_model;
|
||||
QSortFilterProxyModel* m_proxy;
|
||||
QTreeView* m_view;
|
||||
};
|
||||
|
||||
#endif // ALLOCATORSTAB_H
|
194
massif-visualizer/app/callgraphtab.cpp
Normal file
194
massif-visualizer/app/callgraphtab.cpp
Normal file
|
@ -0,0 +1,194 @@
|
|||
/*
|
||||
This file is part of Massif Visualizer
|
||||
|
||||
Copyright 2014 Milian Wolff <mail@milianw.de>
|
||||
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License as
|
||||
published by the Free Software Foundation; either version 2 of
|
||||
the License or (at your option) version 3 or any later version
|
||||
accepted by the membership of KDE e.V. (or its successor approved
|
||||
by the membership of KDE e.V.), which shall act as a proxy
|
||||
defined in Section 14 of version 3 of the license.
|
||||
|
||||
This program 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 General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "callgraphtab.h"
|
||||
|
||||
#include "visualizer/dotgraphgenerator.h"
|
||||
#include "massifdata/filedata.h"
|
||||
|
||||
#include <QVBoxLayout>
|
||||
|
||||
#include <KDebug>
|
||||
#include <KParts/Part>
|
||||
#include <KStandardAction>
|
||||
#include <KActionCollection>
|
||||
#include <KAction>
|
||||
#include <KLocalizedString>
|
||||
|
||||
#include <kgraphviewer_interface.h>
|
||||
|
||||
using namespace Massif;
|
||||
|
||||
CallGraphTab::CallGraphTab(const FileData* data, KParts::ReadOnlyPart* graphViewerPart,
|
||||
KXMLGUIClient* guiParent, QWidget* parent)
|
||||
: DocumentTabInterface(data, guiParent, parent)
|
||||
, m_graphViewerPart(graphViewerPart)
|
||||
, m_graphViewer(qobject_cast<KGraphViewer::KGraphViewerInterface*>(m_graphViewerPart))
|
||||
, m_dotGenerator(0)
|
||||
, m_zoomIn(0)
|
||||
, m_zoomOut(0)
|
||||
, m_focusExpensive(0)
|
||||
{
|
||||
setXMLFile("callgraphtabui.rc", true);
|
||||
setupActions();
|
||||
|
||||
Q_ASSERT(m_graphViewer);
|
||||
setLayout(new QVBoxLayout);
|
||||
layout()->addWidget(m_graphViewerPart->widget());
|
||||
|
||||
connect(m_graphViewerPart, SIGNAL(graphLoaded()),
|
||||
this, SLOT(slotGraphLoaded()));
|
||||
|
||||
showDotGraph(ModelItem(0, data->peak()));
|
||||
}
|
||||
|
||||
CallGraphTab::~CallGraphTab()
|
||||
{
|
||||
if (m_dotGenerator) {
|
||||
if (m_dotGenerator->isRunning()) {
|
||||
disconnect(m_dotGenerator.data(), 0, this, 0);
|
||||
connect(m_dotGenerator.data(), SIGNAL(finished()),
|
||||
m_dotGenerator.data(), SLOT(deleteLater()));
|
||||
m_dotGenerator->cancel();
|
||||
m_dotGenerator.take();
|
||||
}
|
||||
m_dotGenerator.reset();
|
||||
}
|
||||
if (m_graphViewer) {
|
||||
m_graphViewerPart->closeUrl();
|
||||
}
|
||||
m_lastDotItem.first = 0;
|
||||
m_lastDotItem.second = 0;
|
||||
}
|
||||
|
||||
void CallGraphTab::setupActions()
|
||||
{
|
||||
m_zoomIn = KStandardAction::zoomIn(this, SLOT(zoomIn()), actionCollection());
|
||||
actionCollection()->addAction("zoomIn", m_zoomIn);
|
||||
m_zoomOut = KStandardAction::zoomOut(this, SLOT(zoomOut()), actionCollection());
|
||||
actionCollection()->addAction("zoomOut", m_zoomOut);
|
||||
m_focusExpensive = new KAction(KIcon("flag-red"), i18n("Focus most expensive node"), actionCollection());
|
||||
connect(m_focusExpensive, SIGNAL(triggered()), this, SLOT(focusExpensiveGraphNode()));
|
||||
actionCollection()->addAction("focusExpensive", m_focusExpensive);
|
||||
}
|
||||
|
||||
void CallGraphTab::settingsChanged()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void CallGraphTab::focusExpensiveGraphNode()
|
||||
{
|
||||
Q_ASSERT(m_graphViewer);
|
||||
Q_ASSERT(m_dotGenerator);
|
||||
|
||||
m_graphViewer->centerOnNode(m_dotGenerator->mostCostIntensiveGraphvizId());
|
||||
}
|
||||
|
||||
void CallGraphTab::showDotGraph(const ModelItem& item)
|
||||
{
|
||||
m_nextDotItem = item;
|
||||
|
||||
if (item == m_lastDotItem && m_graphViewerPart->url().isValid()) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!isVisible()) {
|
||||
return;
|
||||
}
|
||||
m_lastDotItem = item;
|
||||
|
||||
Q_ASSERT(m_graphViewer);
|
||||
|
||||
kDebug() << "new dot graph requested" << item;
|
||||
if (m_dotGenerator) {
|
||||
kDebug() << "existing generator is running:" << m_dotGenerator->isRunning();
|
||||
if (m_dotGenerator->isRunning()) {
|
||||
disconnect(m_dotGenerator.data(), 0, this, 0);
|
||||
connect(m_dotGenerator.data(), SIGNAL(finished()),
|
||||
m_dotGenerator.data(), SLOT(deleteLater()));
|
||||
m_dotGenerator->cancel();
|
||||
m_dotGenerator.take();
|
||||
}
|
||||
m_dotGenerator.reset();
|
||||
}
|
||||
if (!item.first && !item.second) {
|
||||
return;
|
||||
}
|
||||
if (item.second) {
|
||||
m_dotGenerator.reset(new DotGraphGenerator(item.second, m_data->timeUnit(), this));
|
||||
} else {
|
||||
m_dotGenerator.reset(new DotGraphGenerator(item.first, m_data->timeUnit(), this));
|
||||
}
|
||||
m_dotGenerator->start();
|
||||
connect(m_dotGenerator.data(), SIGNAL(finished()), this, SLOT(showDotGraph()));
|
||||
}
|
||||
|
||||
void CallGraphTab::setVisible(bool visible)
|
||||
{
|
||||
QWidget::setVisible(visible);
|
||||
|
||||
if (visible) {
|
||||
showDotGraph(m_nextDotItem);
|
||||
}
|
||||
}
|
||||
|
||||
void CallGraphTab::showDotGraph()
|
||||
{
|
||||
if (!m_dotGenerator || !m_graphViewerPart || !isVisible()) {
|
||||
return;
|
||||
}
|
||||
kDebug() << "show dot graph in output file" << m_dotGenerator->outputFile();
|
||||
if (!m_dotGenerator->outputFile().isEmpty() && m_graphViewerPart->url() != KUrl(m_dotGenerator->outputFile())) {
|
||||
m_graphViewerPart->openUrl(KUrl(m_dotGenerator->outputFile()));
|
||||
}
|
||||
}
|
||||
|
||||
void CallGraphTab::slotGraphLoaded()
|
||||
{
|
||||
Q_ASSERT(m_graphViewer);
|
||||
|
||||
if (!m_dotGenerator) {
|
||||
return;
|
||||
}
|
||||
m_graphViewer->setZoomFactor(0.75);
|
||||
m_graphViewer->setPannerPosition(KGraphViewer::KGraphViewerInterface::BottomRight);
|
||||
m_graphViewer->setPannerEnabled(true);
|
||||
m_graphViewer->centerOnNode(m_dotGenerator->mostCostIntensiveGraphvizId());
|
||||
}
|
||||
|
||||
void CallGraphTab::zoomIn()
|
||||
{
|
||||
m_graphViewer->zoomIn();
|
||||
}
|
||||
|
||||
void CallGraphTab::zoomOut()
|
||||
{
|
||||
m_graphViewer->zoomOut();
|
||||
}
|
||||
|
||||
void CallGraphTab::selectModelItem(const ModelItem& item)
|
||||
{
|
||||
showDotGraph(item);
|
||||
}
|
||||
|
||||
#include "callgraphtab.moc"
|
84
massif-visualizer/app/callgraphtab.h
Normal file
84
massif-visualizer/app/callgraphtab.h
Normal file
|
@ -0,0 +1,84 @@
|
|||
/*
|
||||
This file is part of Massif Visualizer
|
||||
|
||||
Copyright 2014 Milian Wolff <mail@milianw.de>
|
||||
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License as
|
||||
published by the Free Software Foundation; either version 2 of
|
||||
the License or (at your option) version 3 or any later version
|
||||
accepted by the membership of KDE e.V. (or its successor approved
|
||||
by the membership of KDE e.V.), which shall act as a proxy
|
||||
defined in Section 14 of version 3 of the license.
|
||||
|
||||
This program 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 General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef CALLGRAPHTAB_H
|
||||
#define CALLGRAPHTAB_H
|
||||
|
||||
#include "documenttabinterface.h"
|
||||
|
||||
#include <visualizer/modelitem.h>
|
||||
|
||||
class KAction;
|
||||
|
||||
namespace KGraphViewer {
|
||||
class KGraphViewerInterface;
|
||||
}
|
||||
|
||||
namespace Massif {
|
||||
class DotGraphGenerator;
|
||||
}
|
||||
|
||||
namespace KParts {
|
||||
class ReadOnlyPart;
|
||||
}
|
||||
|
||||
class CallGraphTab : public DocumentTabInterface
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
CallGraphTab(const Massif::FileData* data, KParts::ReadOnlyPart* graphViewerPart,
|
||||
KXMLGUIClient* guiParent, QWidget* parent = 0);
|
||||
~CallGraphTab();
|
||||
|
||||
void showDotGraph(const Massif::ModelItem& item);
|
||||
|
||||
virtual void settingsChanged();
|
||||
|
||||
virtual void selectModelItem(const Massif::ModelItem& item);
|
||||
virtual void setVisible(bool visible);
|
||||
|
||||
public slots:
|
||||
void showDotGraph();
|
||||
|
||||
private slots:
|
||||
void slotGraphLoaded();
|
||||
void zoomIn();
|
||||
void zoomOut();
|
||||
void focusExpensiveGraphNode();
|
||||
|
||||
private:
|
||||
void setupActions();
|
||||
|
||||
private:
|
||||
KParts::ReadOnlyPart* m_graphViewerPart;
|
||||
KGraphViewer::KGraphViewerInterface* m_graphViewer;
|
||||
QScopedPointer<Massif::DotGraphGenerator> m_dotGenerator;
|
||||
Massif::ModelItem m_lastDotItem;
|
||||
Massif::ModelItem m_nextDotItem;
|
||||
|
||||
KAction* m_zoomIn;
|
||||
KAction* m_zoomOut;
|
||||
KAction* m_focusExpensive;
|
||||
};
|
||||
|
||||
#endif // CALLGRAPHTAB_H
|
19
massif-visualizer/app/callgraphtabui.rc
Normal file
19
massif-visualizer/app/callgraphtabui.rc
Normal file
|
@ -0,0 +1,19 @@
|
|||
<!DOCTYPE kpartgui SYSTEM "kpartgui.dtd">
|
||||
<kpartgui name="callgraphtab" version="1">
|
||||
|
||||
<MenuBar>
|
||||
<Menu name="view">
|
||||
<Action name="zoomIn"/>
|
||||
<Action name="zoomOut"/>
|
||||
<Action name="focusExpensive"/>
|
||||
</Menu>
|
||||
</MenuBar>
|
||||
|
||||
<ToolBar name="callgraphToolBar">
|
||||
<text>CallGraph Toolbar</text>
|
||||
<Action name="zoomIn"/>
|
||||
<Action name="zoomOut"/>
|
||||
<Action name="focusExpensive"/>
|
||||
</ToolBar>
|
||||
|
||||
</kpartgui>
|
620
massif-visualizer/app/charttab.cpp
Normal file
620
massif-visualizer/app/charttab.cpp
Normal file
|
@ -0,0 +1,620 @@
|
|||
/*
|
||||
This file is part of Massif Visualizer
|
||||
|
||||
Copyright 2014 Milian Wolff <mail@milianw.de>
|
||||
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License as
|
||||
published by the Free Software Foundation; either version 2 of
|
||||
the License or (at your option) version 3 or any later version
|
||||
accepted by the membership of KDE e.V. (or its successor approved
|
||||
by the membership of KDE e.V.), which shall act as a proxy
|
||||
defined in Section 14 of version 3 of the license.
|
||||
|
||||
This program 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 General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "charttab.h"
|
||||
|
||||
#include "KDChartChart"
|
||||
#include "KDChartGridAttributes"
|
||||
#include "KDChartHeaderFooter"
|
||||
#include "KDChartCartesianCoordinatePlane"
|
||||
#include "KDChartPlotter"
|
||||
#include "KDChartLegend"
|
||||
#include "KDChartDataValueAttributes"
|
||||
#include "KDChartBackgroundAttributes"
|
||||
#include <KDChartFrameAttributes.h>
|
||||
|
||||
#include "visualizer/totalcostmodel.h"
|
||||
#include "visualizer/detailedcostmodel.h"
|
||||
#include "visualizer/datatreemodel.h"
|
||||
#include "visualizer/filtereddatatreemodel.h"
|
||||
|
||||
#include "massifdata/util.h"
|
||||
#include "massifdata/snapshotitem.h"
|
||||
#include "massifdata/treeleafitem.h"
|
||||
#include "massifdata/filedata.h"
|
||||
|
||||
#include "massif-visualizer-settings.h"
|
||||
|
||||
#include <QVBoxLayout>
|
||||
#include <QPrinter>
|
||||
#include <QPrintPreviewDialog>
|
||||
#include <QLabel>
|
||||
#include <QMenu>
|
||||
#include <QApplication>
|
||||
#include <QDesktopWidget>
|
||||
#include <QSvgGenerator>
|
||||
|
||||
#include <KColorScheme>
|
||||
#include <KLocalizedString>
|
||||
#include <KStandardAction>
|
||||
#include <KActionCollection>
|
||||
#include <KAction>
|
||||
#include <KFileDialog>
|
||||
#include <KMessageBox>
|
||||
#include <KLocale>
|
||||
|
||||
using namespace KDChart;
|
||||
using namespace Massif;
|
||||
|
||||
namespace {
|
||||
|
||||
class TimeAxis : public CartesianAxis
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit TimeAxis(AbstractCartesianDiagram* diagram = 0)
|
||||
: CartesianAxis(diagram)
|
||||
{}
|
||||
|
||||
virtual const QString customizedLabel(const QString& label) const
|
||||
{
|
||||
// squeeze large numbers here
|
||||
// TODO: when the unit is 'b' also use prettyCost() here
|
||||
return QString::number(label.toDouble());
|
||||
}
|
||||
};
|
||||
|
||||
class SizeAxis : public CartesianAxis
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit SizeAxis(AbstractCartesianDiagram* diagram = 0)
|
||||
: CartesianAxis(diagram)
|
||||
{}
|
||||
|
||||
virtual const QString customizedLabel(const QString& label) const
|
||||
{
|
||||
// TODO: change distance between labels to 1024 and simply use prettyCost() here
|
||||
return KGlobal::locale()->formatByteSize(label.toDouble(), 1, KLocale::MetricBinaryDialect);
|
||||
}
|
||||
};
|
||||
|
||||
void markPeak(Plotter* p, const QModelIndex& peak, quint64 cost, const KColorScheme& scheme)
|
||||
{
|
||||
QBrush brush = p->model()->data(peak, DatasetBrushRole).value<QBrush>();
|
||||
|
||||
QColor outline = brush.color();
|
||||
QColor foreground = scheme.foreground().color();
|
||||
QBrush background = scheme.background();
|
||||
|
||||
DataValueAttributes dataAttributes = p->dataValueAttributes(peak);
|
||||
dataAttributes.setDataLabel(prettyCost(cost));
|
||||
dataAttributes.setVisible(true);
|
||||
dataAttributes.setShowRepetitiveDataLabels(true);
|
||||
dataAttributes.setShowOverlappingDataLabels(false);
|
||||
|
||||
FrameAttributes frameAttrs = dataAttributes.frameAttributes();
|
||||
QPen framePen(outline);
|
||||
framePen.setWidth(2);
|
||||
frameAttrs.setPen(framePen);
|
||||
frameAttrs.setVisible(true);
|
||||
dataAttributes.setFrameAttributes(frameAttrs);
|
||||
|
||||
MarkerAttributes a = dataAttributes.markerAttributes();
|
||||
a.setMarkerSize(QSizeF(7, 7));
|
||||
a.setPen(outline);
|
||||
a.setMarkerStyle(KDChart::MarkerAttributes::MarkerDiamond);
|
||||
a.setVisible(true);
|
||||
dataAttributes.setMarkerAttributes(a);
|
||||
|
||||
TextAttributes txtAttrs = dataAttributes.textAttributes();
|
||||
txtAttrs.setPen(foreground);
|
||||
txtAttrs.setFontSize(Measure(12));
|
||||
dataAttributes.setTextAttributes(txtAttrs);
|
||||
|
||||
BackgroundAttributes bkgAtt = dataAttributes.backgroundAttributes();
|
||||
|
||||
bkgAtt.setBrush(background);
|
||||
bkgAtt.setVisible(true);
|
||||
dataAttributes.setBackgroundAttributes(bkgAtt);
|
||||
|
||||
p->setDataValueAttributes(peak, dataAttributes);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
ChartTab::ChartTab(const FileData* data,
|
||||
KXMLGUIClient* guiParent, QWidget* parent)
|
||||
: DocumentTabInterface(data, guiParent, parent)
|
||||
, m_chart(new Chart(this))
|
||||
, m_header(new QLabel(this))
|
||||
, m_totalDiagram(0)
|
||||
, m_totalCostModel(new TotalCostModel(m_chart))
|
||||
, m_detailedDiagram(0)
|
||||
, m_detailedCostModel(new DetailedCostModel(m_chart))
|
||||
, m_legend(new Legend(m_chart))
|
||||
, m_print(0)
|
||||
, m_saveAs(0)
|
||||
, m_toggleTotal(0)
|
||||
, m_toggleDetailed(0)
|
||||
, m_hideFunction(0)
|
||||
, m_hideOtherFunctions(0)
|
||||
, m_box(new QSpinBox(this))
|
||||
, m_settingSelection(false)
|
||||
{
|
||||
setXMLFile("charttabui.rc", true);
|
||||
setupActions();
|
||||
|
||||
setLayout(new QVBoxLayout(this));
|
||||
|
||||
setupGui();
|
||||
}
|
||||
|
||||
ChartTab::~ChartTab()
|
||||
{
|
||||
}
|
||||
|
||||
void ChartTab::setupActions()
|
||||
{
|
||||
m_print = KStandardAction::print(this, SLOT(showPrintPreviewDialog()), actionCollection());
|
||||
actionCollection()->addAction("file_print", m_print);
|
||||
|
||||
m_saveAs = KStandardAction::saveAs(this, SLOT(saveCurrentDocument()), actionCollection());
|
||||
actionCollection()->addAction("file_save_as", m_saveAs);
|
||||
|
||||
m_toggleTotal = new KAction(KIcon("office-chart-area"), i18n("Toggle total cost graph"), actionCollection());
|
||||
m_toggleTotal->setCheckable(true);
|
||||
m_toggleTotal->setChecked(true);
|
||||
connect(m_toggleTotal, SIGNAL(toggled(bool)), SLOT(showTotalGraph(bool)));
|
||||
actionCollection()->addAction("toggle_total", m_toggleTotal);
|
||||
|
||||
m_toggleDetailed = new KAction(KIcon("office-chart-area-stacked"), i18n("Toggle detailed cost graph"), actionCollection());
|
||||
m_toggleDetailed->setCheckable(true);
|
||||
m_toggleDetailed->setChecked(true);
|
||||
connect(m_toggleDetailed, SIGNAL(toggled(bool)), SLOT(showDetailedGraph(bool)));
|
||||
actionCollection()->addAction("toggle_detailed", m_toggleDetailed);
|
||||
|
||||
KAction* stackNumAction = actionCollection()->addAction("stackNum");
|
||||
stackNumAction->setText(i18n("Stacked diagrams"));
|
||||
QWidget *stackNumWidget = new QWidget;
|
||||
QHBoxLayout* stackNumLayout = new QHBoxLayout;
|
||||
stackNumLayout->addWidget(new QLabel(i18n("Stacked diagrams:")));
|
||||
m_box->setMinimum(0);
|
||||
m_box->setMaximum(50);
|
||||
m_box->setValue(10);
|
||||
connect(m_box, SIGNAL(valueChanged(int)), this, SLOT(setStackNum(int)));
|
||||
stackNumLayout->addWidget(m_box);
|
||||
stackNumWidget->setLayout(stackNumLayout);
|
||||
stackNumAction->setDefaultWidget(stackNumWidget);
|
||||
|
||||
m_hideFunction = new KAction(i18n("hide function"), this);
|
||||
connect(m_hideFunction, SIGNAL(triggered()),
|
||||
this, SLOT(slotHideFunction()));
|
||||
m_hideOtherFunctions = new KAction(i18n("hide other functions"), this);
|
||||
connect(m_hideOtherFunctions, SIGNAL(triggered()),
|
||||
this, SLOT(slotHideOtherFunctions()));
|
||||
}
|
||||
|
||||
void ChartTab::setupGui()
|
||||
{
|
||||
layout()->addWidget(m_header);
|
||||
layout()->addWidget(m_chart);
|
||||
|
||||
// HACK: otherwise the legend becomes _really_ large and might even crash X...
|
||||
// to visualize the issue, try: m_chart->setMaximumSize(QSize(10000, 10000));
|
||||
m_chart->setMaximumSize(qApp->desktop()->size());
|
||||
|
||||
// for axis labels to fit
|
||||
m_chart->setGlobalLeadingRight(10);
|
||||
m_chart->setGlobalLeadingLeft(10);
|
||||
m_chart->setGlobalLeadingTop(20);
|
||||
m_chart->setContextMenuPolicy(Qt::CustomContextMenu);
|
||||
|
||||
updateLegendPosition();
|
||||
m_legend->setTitleText(QString());
|
||||
m_legend->setSortOrder(Qt::DescendingOrder);
|
||||
|
||||
m_chart->addLegend(m_legend);
|
||||
|
||||
//NOTE: this has to be set _after_ the legend was added to the chart...
|
||||
updateLegendFont();
|
||||
m_legend->setTextAlignment(Qt::AlignLeft);
|
||||
m_legend->hide();
|
||||
|
||||
connect(m_chart, SIGNAL(customContextMenuRequested(QPoint)),
|
||||
this, SLOT(chartContextMenuRequested(QPoint)));
|
||||
|
||||
//BEGIN KDChart
|
||||
KColorScheme scheme(QPalette::Active, KColorScheme::Window);
|
||||
QPen foreground(scheme.foreground().color());
|
||||
|
||||
//Begin Legend
|
||||
BackgroundAttributes bkgAtt = m_legend->backgroundAttributes();
|
||||
QColor background = scheme.background(KColorScheme::AlternateBackground).color();
|
||||
background.setAlpha(200);
|
||||
bkgAtt.setBrush(QBrush(background));
|
||||
bkgAtt.setVisible(true);
|
||||
m_legend->setBackgroundAttributes(bkgAtt);
|
||||
TextAttributes txtAttrs = m_legend->textAttributes();
|
||||
txtAttrs.setPen(foreground);
|
||||
m_legend->setTextAttributes(txtAttrs);
|
||||
|
||||
m_header->setAlignment(Qt::AlignCenter);
|
||||
updateHeader();
|
||||
|
||||
//BEGIN TotalDiagram
|
||||
m_totalDiagram = new Plotter(this);
|
||||
m_totalDiagram->setAntiAliasing(true);
|
||||
|
||||
CartesianAxis* bottomAxis = new TimeAxis(m_totalDiagram);
|
||||
TextAttributes axisTextAttributes = bottomAxis->textAttributes();
|
||||
axisTextAttributes.setPen(foreground);
|
||||
axisTextAttributes.setFontSize(Measure(10));
|
||||
bottomAxis->setTextAttributes(axisTextAttributes);
|
||||
TextAttributes axisTitleTextAttributes = bottomAxis->titleTextAttributes();
|
||||
axisTitleTextAttributes.setPen(foreground);
|
||||
axisTitleTextAttributes.setFontSize(Measure(12));
|
||||
bottomAxis->setTitleTextAttributes(axisTitleTextAttributes);
|
||||
bottomAxis->setTitleText(i18n("time in %1", m_data->timeUnit()));
|
||||
bottomAxis->setPosition ( CartesianAxis::Bottom );
|
||||
m_totalDiagram->addAxis(bottomAxis);
|
||||
|
||||
CartesianAxis* rightAxis = new SizeAxis(m_totalDiagram);
|
||||
rightAxis->setTextAttributes(axisTextAttributes);
|
||||
rightAxis->setTitleTextAttributes(axisTitleTextAttributes);
|
||||
rightAxis->setTitleText(i18n("memory heap size"));
|
||||
rightAxis->setPosition ( CartesianAxis::Right );
|
||||
m_totalDiagram->addAxis(rightAxis);
|
||||
|
||||
m_totalCostModel->setSource(m_data);
|
||||
m_totalDiagram->setModel(m_totalCostModel);
|
||||
|
||||
CartesianCoordinatePlane* coordinatePlane = dynamic_cast<CartesianCoordinatePlane*>(m_chart->coordinatePlane());
|
||||
Q_ASSERT(coordinatePlane);
|
||||
coordinatePlane->addDiagram(m_totalDiagram);
|
||||
|
||||
GridAttributes gridAttributes = coordinatePlane->gridAttributes(Qt::Horizontal);
|
||||
gridAttributes.setAdjustBoundsToGrid(false, false);
|
||||
coordinatePlane->setGridAttributes(Qt::Horizontal, gridAttributes);
|
||||
|
||||
m_legend->addDiagram(m_totalDiagram);
|
||||
|
||||
m_detailedDiagram = new Plotter;
|
||||
m_detailedDiagram->setAntiAliasing(true);
|
||||
m_detailedDiagram->setType(KDChart::Plotter::Stacked);
|
||||
|
||||
m_detailedCostModel->setSource(m_data);
|
||||
m_detailedDiagram->setModel(m_detailedCostModel);
|
||||
|
||||
updatePeaks();
|
||||
|
||||
m_chart->coordinatePlane()->addDiagram(m_detailedDiagram);
|
||||
|
||||
m_legend->addDiagram(m_detailedDiagram);
|
||||
m_legend->show();
|
||||
|
||||
m_box->setValue(m_detailedCostModel->maximumDatasetCount());
|
||||
|
||||
connect(m_totalDiagram, SIGNAL(clicked(QModelIndex)),
|
||||
this, SLOT(totalItemClicked(QModelIndex)));
|
||||
connect(m_detailedDiagram, SIGNAL(clicked(QModelIndex)),
|
||||
this, SLOT(detailedItemClicked(QModelIndex)));
|
||||
}
|
||||
|
||||
void ChartTab::settingsChanged()
|
||||
{
|
||||
updateHeader();
|
||||
updatePeaks();
|
||||
updateLegendPosition();
|
||||
updateLegendFont();
|
||||
}
|
||||
|
||||
void ChartTab::setDetailedDiagramHidden(bool hidden)
|
||||
{
|
||||
m_detailedDiagram->setHidden(hidden);
|
||||
}
|
||||
|
||||
void ChartTab::setDetailedDiagramVisible(bool visible)
|
||||
{
|
||||
m_detailedDiagram->setVisible(visible);
|
||||
}
|
||||
|
||||
void ChartTab::setTotalDiagramHidden(bool hidden)
|
||||
{
|
||||
m_totalDiagram->setHidden(hidden);
|
||||
}
|
||||
|
||||
void ChartTab::setTotalDiagramVisible(bool visible)
|
||||
{
|
||||
m_totalDiagram->setVisible(visible);
|
||||
}
|
||||
|
||||
void ChartTab::updatePeaks()
|
||||
{
|
||||
KColorScheme scheme(QPalette::Active, KColorScheme::Window);
|
||||
|
||||
if (m_data->peak()) {
|
||||
const QModelIndex peak = m_totalCostModel->peak();
|
||||
Q_ASSERT(peak.isValid());
|
||||
markPeak(m_totalDiagram, peak, m_data->peak()->cost(), scheme);
|
||||
}
|
||||
updateDetailedPeaks();
|
||||
}
|
||||
|
||||
void ChartTab::updateLegendPosition()
|
||||
{
|
||||
KDChartEnums::PositionValue pos;
|
||||
switch (Settings::self()->legendPosition()) {
|
||||
case Settings::EnumLegendPosition::North:
|
||||
pos = KDChartEnums::PositionNorth;
|
||||
break;
|
||||
case Settings::EnumLegendPosition::South:
|
||||
pos = KDChartEnums::PositionSouth;
|
||||
break;
|
||||
case Settings::EnumLegendPosition::East:
|
||||
pos = KDChartEnums::PositionEast;
|
||||
break;
|
||||
case Settings::EnumLegendPosition::West:
|
||||
pos = KDChartEnums::PositionWest;
|
||||
break;
|
||||
case Settings::EnumLegendPosition::Floating:
|
||||
pos = KDChartEnums::PositionFloating;
|
||||
break;
|
||||
default:
|
||||
pos = KDChartEnums::PositionFloating;
|
||||
kDebug() << "invalid legend position";
|
||||
}
|
||||
m_legend->setPosition(Position(pos));
|
||||
|
||||
Qt::Alignment align;
|
||||
switch (Settings::self()->legendAlignment()) {
|
||||
case Settings::EnumLegendAlignment::Left:
|
||||
align = Qt::AlignLeft;
|
||||
break;
|
||||
case Settings::EnumLegendAlignment::Center:
|
||||
align = Qt::AlignHCenter | Qt::AlignVCenter;
|
||||
break;
|
||||
case Settings::EnumLegendAlignment::Right:
|
||||
align = Qt::AlignRight;
|
||||
break;
|
||||
case Settings::EnumLegendAlignment::Top:
|
||||
align = Qt::AlignTop;
|
||||
break;
|
||||
case Settings::EnumLegendAlignment::Bottom:
|
||||
align = Qt::AlignBottom;
|
||||
break;
|
||||
default:
|
||||
align = Qt::AlignHCenter | Qt::AlignVCenter;
|
||||
kDebug() << "invalid legend alignmemnt";
|
||||
}
|
||||
|
||||
// do something reasonable since top,bottom have no effect
|
||||
// when used with north,south, same for left,right used with
|
||||
// east,west
|
||||
if ((((pos == KDChartEnums::PositionNorth) || (pos == KDChartEnums::PositionSouth))
|
||||
&& ((align == Qt::AlignTop) || (align == Qt::AlignBottom)))
|
||||
|| (((pos == KDChartEnums::PositionEast) || (pos == KDChartEnums::PositionWest))
|
||||
&& ((align == Qt::AlignLeft) || (align == Qt::AlignRight)))) {
|
||||
|
||||
align = Qt::AlignHCenter | Qt::AlignVCenter;
|
||||
}
|
||||
|
||||
m_legend->setAlignment(align);
|
||||
}
|
||||
|
||||
void ChartTab::updateLegendFont()
|
||||
{
|
||||
TextAttributes att = m_legend->textAttributes();
|
||||
att.setAutoShrink(true);
|
||||
att.setFontSize(Measure(Settings::self()->legendFontSize()));
|
||||
QFont font("monospace");
|
||||
font.setStyleHint(QFont::TypeWriter);
|
||||
att.setFont(font);
|
||||
m_legend->setTextAttributes(att);
|
||||
}
|
||||
|
||||
void ChartTab::updateDetailedPeaks()
|
||||
{
|
||||
KColorScheme scheme(QPalette::Active, KColorScheme::Window);
|
||||
|
||||
const DetailedCostModel::Peaks& peaks = m_detailedCostModel->peaks();
|
||||
DetailedCostModel::Peaks::const_iterator it = peaks.constBegin();
|
||||
while (it != peaks.constEnd()) {
|
||||
const QModelIndex peak = it.key();
|
||||
Q_ASSERT(peak.isValid());
|
||||
markPeak(m_detailedDiagram, peak, it.value()->cost(), scheme);
|
||||
++it;
|
||||
}
|
||||
}
|
||||
|
||||
void ChartTab::updateHeader()
|
||||
{
|
||||
const QString app = m_data->cmd().split(' ', QString::SkipEmptyParts).first();
|
||||
|
||||
m_header->setText(QString("<b>%1</b><br /><i>%2</i>")
|
||||
.arg(i18n("Memory consumption of %1", app))
|
||||
.arg(i18n("Peak of %1 at snapshot #%2", prettyCost(m_data->peak()->cost()), m_data->peak()->number()))
|
||||
);
|
||||
m_header->setToolTip(i18n("Command: %1\nValgrind Options: %2", m_data->cmd(), m_data->description()));
|
||||
}
|
||||
|
||||
void ChartTab::saveCurrentDocument()
|
||||
{
|
||||
QString saveFilename = KFileDialog::getSaveFileName(KUrl("kfiledialog:///massif-visualizer"),
|
||||
QString("image/png image/jpeg image/tiff image/svg+xml"),
|
||||
this, i18n("Save Current Visualization"), KFileDialog::ConfirmOverwrite);
|
||||
|
||||
if (!saveFilename.isEmpty()) {
|
||||
|
||||
// TODO: implement a dialog to expose more options to the user.
|
||||
// for example we could expose dpi, size, and various format
|
||||
// dependent options such as compressions settings.
|
||||
|
||||
// Vector graphic format
|
||||
if (QFileInfo(saveFilename).suffix().compare(QLatin1String("svg")) == 0) {
|
||||
QSvgGenerator generator;
|
||||
generator.setFileName(saveFilename);
|
||||
generator.setSize(m_chart->size());
|
||||
generator.setViewBox(m_chart->rect());
|
||||
|
||||
QPainter painter;
|
||||
painter.begin(&generator);
|
||||
m_chart->paint(&painter, m_chart->rect());
|
||||
painter.end();
|
||||
}
|
||||
|
||||
// Other format
|
||||
else if (!QPixmap::grabWidget(m_chart).save(saveFilename)) {
|
||||
|
||||
KMessageBox::sorry(this, QString(
|
||||
i18n("Error, failed to save the image to %1.")
|
||||
).arg(saveFilename));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void ChartTab::showPrintPreviewDialog()
|
||||
{
|
||||
QPrinter printer;
|
||||
QPrintPreviewDialog *ppd = new QPrintPreviewDialog(&printer, this);
|
||||
ppd->setAttribute(Qt::WA_DeleteOnClose);
|
||||
connect(ppd, SIGNAL(paintRequested(QPrinter*)), SLOT(printFile(QPrinter*)));
|
||||
ppd->setWindowTitle(i18n("Massif Chart Print Preview"));
|
||||
ppd->resize(800, 600);
|
||||
ppd->exec();
|
||||
}
|
||||
|
||||
void ChartTab::printFile(QPrinter *printer)
|
||||
{
|
||||
QPainter painter;
|
||||
painter.begin(printer);
|
||||
m_chart->paint(&painter, printer->pageRect());
|
||||
painter.end();
|
||||
}
|
||||
|
||||
void ChartTab::showDetailedGraph(bool show)
|
||||
{
|
||||
m_detailedDiagram->setHidden(!show);
|
||||
m_toggleDetailed->setChecked(show);
|
||||
m_chart->update();
|
||||
}
|
||||
|
||||
void ChartTab::showTotalGraph(bool show)
|
||||
{
|
||||
m_totalDiagram->setHidden(!show);
|
||||
m_toggleTotal->setChecked(show);
|
||||
m_chart->update();
|
||||
}
|
||||
|
||||
void ChartTab::slotHideFunction()
|
||||
{
|
||||
m_detailedCostModel->hideFunction(m_hideFunction->data().value<const TreeLeafItem*>());
|
||||
}
|
||||
|
||||
void ChartTab::slotHideOtherFunctions()
|
||||
{
|
||||
m_detailedCostModel->hideOtherFunctions(m_hideOtherFunctions->data().value<const TreeLeafItem*>());
|
||||
}
|
||||
|
||||
void ChartTab::chartContextMenuRequested(const QPoint& pos)
|
||||
{
|
||||
const QPoint dPos = m_detailedDiagram->mapFromGlobal(m_chart->mapToGlobal(pos));
|
||||
|
||||
const QModelIndex idx = m_detailedDiagram->indexAt(dPos);
|
||||
if (!idx.isValid()) {
|
||||
return;
|
||||
}
|
||||
// hack: the ToolTip will only be queried by KDChart and that one uses the
|
||||
// left index, but we want it to query the right one
|
||||
const QModelIndex _idx = m_detailedCostModel->index(idx.row() + 1, idx.column(), idx.parent());
|
||||
ModelItem item = m_detailedCostModel->itemForIndex(_idx);
|
||||
|
||||
if (!item.first) {
|
||||
return;
|
||||
}
|
||||
|
||||
QMenu menu;
|
||||
|
||||
m_hideFunction->setData(QVariant::fromValue(item.first));
|
||||
menu.addAction(m_hideFunction);
|
||||
|
||||
m_hideOtherFunctions->setData(QVariant::fromValue(item.first));
|
||||
menu.addAction(m_hideOtherFunctions);
|
||||
|
||||
menu.addSeparator();
|
||||
|
||||
emit contextMenuRequested(item, &menu);
|
||||
|
||||
menu.exec(m_detailedDiagram->mapToGlobal(dPos));
|
||||
}
|
||||
|
||||
void ChartTab::setStackNum(int num)
|
||||
{
|
||||
m_detailedCostModel->setMaximumDatasetCount(num);
|
||||
updatePeaks();
|
||||
}
|
||||
|
||||
void ChartTab::detailedItemClicked(const QModelIndex& idx)
|
||||
{
|
||||
m_detailedCostModel->setSelection(idx);
|
||||
m_totalCostModel->setSelection(QModelIndex());
|
||||
m_chart->update();
|
||||
|
||||
// hack: the ToolTip will only be queried by KDChart and that one uses the
|
||||
// left index, but we want it to query the right one
|
||||
m_settingSelection = true;
|
||||
const QModelIndex _idx = m_detailedCostModel->index(idx.row() + 1, idx.column(), idx.parent());
|
||||
emit modelItemSelected(m_detailedCostModel->itemForIndex(_idx));
|
||||
m_settingSelection = false;
|
||||
}
|
||||
|
||||
void ChartTab::totalItemClicked(const QModelIndex& idx)
|
||||
{
|
||||
const QModelIndex _idx = m_totalCostModel->index(idx.row() + 1, idx.column(), idx.parent());
|
||||
m_totalCostModel->setSelection(_idx);
|
||||
m_detailedCostModel->setSelection(QModelIndex());
|
||||
m_chart->update();
|
||||
|
||||
m_settingSelection = true;
|
||||
emit modelItemSelected(m_totalCostModel->itemForIndex(_idx));
|
||||
m_settingSelection = false;
|
||||
}
|
||||
|
||||
void ChartTab::selectModelItem(const ModelItem& item)
|
||||
{
|
||||
if (m_settingSelection) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (item.first) {
|
||||
m_detailedCostModel->setSelection(m_detailedCostModel->indexForItem(item));
|
||||
m_totalCostModel->setSelection(QModelIndex());
|
||||
} else {
|
||||
m_totalCostModel->setSelection(m_totalCostModel->indexForItem(item));
|
||||
m_detailedCostModel->setSelection(QModelIndex());
|
||||
}
|
||||
|
||||
m_chart->update();
|
||||
}
|
||||
|
||||
#include "charttab.moc"
|
||||
#include "moc_charttab.cpp"
|
123
massif-visualizer/app/charttab.h
Normal file
123
massif-visualizer/app/charttab.h
Normal file
|
@ -0,0 +1,123 @@
|
|||
/*
|
||||
This file is part of Massif Visualizer
|
||||
|
||||
Copyright 2014 Milian Wolff <mail@milianw.de>
|
||||
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License as
|
||||
published by the Free Software Foundation; either version 2 of
|
||||
the License or (at your option) version 3 or any later version
|
||||
accepted by the membership of KDE e.V. (or its successor approved
|
||||
by the membership of KDE e.V.), which shall act as a proxy
|
||||
defined in Section 14 of version 3 of the license.
|
||||
|
||||
This program 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 General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef CHARTTAB_H
|
||||
#define CHARTTAB_H
|
||||
|
||||
#include "documenttabinterface.h"
|
||||
#include <QSpinBox>
|
||||
|
||||
class QLabel;
|
||||
class QModelIndex;
|
||||
|
||||
class KAction;
|
||||
|
||||
namespace KDChart {
|
||||
class Chart;
|
||||
class HeaderFooter;
|
||||
class Plotter;
|
||||
class CartesianAxis;
|
||||
class Legend;
|
||||
class BarDiagram;
|
||||
}
|
||||
|
||||
namespace Massif {
|
||||
class FileData;
|
||||
class TotalCostModel;
|
||||
class DetailedCostModel;
|
||||
class DataTreeModel;
|
||||
class FilteredDataTreeModel;
|
||||
}
|
||||
|
||||
class ChartTab : public DocumentTabInterface
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
ChartTab(const Massif::FileData* data,
|
||||
KXMLGUIClient* guiParent, QWidget* parent = 0);
|
||||
~ChartTab();
|
||||
|
||||
virtual void settingsChanged();
|
||||
|
||||
virtual void selectModelItem(const Massif::ModelItem& item);
|
||||
|
||||
private:
|
||||
void setupGui();
|
||||
void setupActions();
|
||||
void updateHeader();
|
||||
void updatePeaks();
|
||||
void updateLegendPosition();
|
||||
void updateLegendFont();
|
||||
void updateDetailedPeaks();
|
||||
|
||||
private slots:
|
||||
void setDetailedDiagramHidden(bool hidden);
|
||||
void setDetailedDiagramVisible(bool visible);
|
||||
|
||||
void setTotalDiagramHidden(bool hidden);
|
||||
void setTotalDiagramVisible(bool visible);
|
||||
|
||||
void saveCurrentDocument();
|
||||
void showPrintPreviewDialog();
|
||||
|
||||
void showDetailedGraph(bool show);
|
||||
void showTotalGraph(bool show);
|
||||
|
||||
void setStackNum(int num);
|
||||
|
||||
void chartContextMenuRequested(const QPoint &pos);
|
||||
|
||||
void slotHideFunction();
|
||||
void slotHideOtherFunctions();
|
||||
|
||||
void detailedItemClicked(const QModelIndex& item);
|
||||
void totalItemClicked(const QModelIndex& item);
|
||||
|
||||
void printFile(QPrinter *printer);
|
||||
|
||||
private:
|
||||
KDChart::Chart* m_chart;
|
||||
QLabel* m_header;
|
||||
KDChart::Plotter* m_totalDiagram;
|
||||
Massif::TotalCostModel* m_totalCostModel;
|
||||
|
||||
KDChart::Plotter* m_detailedDiagram;
|
||||
Massif::DetailedCostModel* m_detailedCostModel;
|
||||
|
||||
KDChart::Legend* m_legend;
|
||||
|
||||
KAction* m_print;
|
||||
KAction* m_saveAs;
|
||||
|
||||
KAction* m_toggleTotal;
|
||||
KAction* m_toggleDetailed;
|
||||
|
||||
KAction* m_hideFunction;
|
||||
KAction* m_hideOtherFunctions;
|
||||
|
||||
QSpinBox* m_box;
|
||||
|
||||
bool m_settingSelection;
|
||||
};
|
||||
|
||||
#endif // CHARTTAB_H
|
23
massif-visualizer/app/charttabui.rc
Normal file
23
massif-visualizer/app/charttabui.rc
Normal file
|
@ -0,0 +1,23 @@
|
|||
<!DOCTYPE kpartgui SYSTEM "kpartgui.dtd">
|
||||
<kpartgui name="charttab" version="1">
|
||||
|
||||
<MenuBar>
|
||||
<Menu name="file">
|
||||
<Action name="file_save_as" group="file_saveas_merge"/>
|
||||
<Action name="file_print" group="file_saveas_merge"/>
|
||||
</Menu>
|
||||
|
||||
<Menu name="view">
|
||||
<Action name="toggle_total"/>
|
||||
<Action name="toggle_detailed"/>
|
||||
</Menu>
|
||||
</MenuBar>
|
||||
|
||||
<ToolBar name="chartToolBar">
|
||||
<text>Chart Toolbar</text>
|
||||
<Action name="toggle_total"/>
|
||||
<Action name="toggle_detailed"/>
|
||||
<Action name="stackNum"/>
|
||||
</ToolBar>
|
||||
|
||||
</kpartgui>
|
129
massif-visualizer/app/config.ui
Normal file
129
massif-visualizer/app/config.ui
Normal file
|
@ -0,0 +1,129 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>Config</class>
|
||||
<widget class="QWidget" name="Config">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>283</width>
|
||||
<height>216</height>
|
||||
</rect>
|
||||
</property>
|
||||
<layout class="QFormLayout" name="formLayout_2">
|
||||
<item row="0" column="0">
|
||||
<widget class="QLabel" name="costLabel">
|
||||
<property name="text">
|
||||
<string>Cost Precision:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="1">
|
||||
<widget class="QSpinBox" name="kcfg_PrettyCostPrecision"/>
|
||||
</item>
|
||||
<item row="2" column="0" colspan="2">
|
||||
<widget class="QGroupBox" name="groupBox">
|
||||
<property name="title">
|
||||
<string>Legend</string>
|
||||
</property>
|
||||
<layout class="QFormLayout" name="formLayout">
|
||||
<property name="fieldGrowthPolicy">
|
||||
<enum>QFormLayout::AllNonFixedFieldsGrow</enum>
|
||||
</property>
|
||||
<item row="0" column="0">
|
||||
<widget class="QLabel" name="legendPositionLabel">
|
||||
<property name="text">
|
||||
<string>Position:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="1">
|
||||
<widget class="QComboBox" name="kcfg_LegendPosition">
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>North</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>East</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>South</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>West</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>Floating</string>
|
||||
</property>
|
||||
</item>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="0">
|
||||
<widget class="QLabel" name="legendAlignmentLabel">
|
||||
<property name="text">
|
||||
<string>Alignment:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="1">
|
||||
<widget class="QComboBox" name="kcfg_LegendAlignment">
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>Left</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>Center</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>Right</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>Top</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>Bottom</string>
|
||||
</property>
|
||||
</item>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="0">
|
||||
<widget class="QLabel" name="legendFontSizeLabel">
|
||||
<property name="text">
|
||||
<string>Font Size:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="1">
|
||||
<widget class="QSpinBox" name="kcfg_LegendFontSize"/>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="0">
|
||||
<widget class="QCheckBox" name="kcfg_ShortenTemplates">
|
||||
<property name="text">
|
||||
<string>Shorten Templates</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<resources/>
|
||||
<connections/>
|
||||
</ui>
|
54
massif-visualizer/app/configdialog.cpp
Normal file
54
massif-visualizer/app/configdialog.cpp
Normal file
|
@ -0,0 +1,54 @@
|
|||
/*
|
||||
This file is part of Massif Visualizer
|
||||
|
||||
Copyright 2010 Milian Wolff <mail@milianw.de>
|
||||
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License as
|
||||
published by the Free Software Foundation; either version 2 of
|
||||
the License or (at your option) version 3 or any later version
|
||||
accepted by the membership of KDE e.V. (or its successor approved
|
||||
by the membership of KDE e.V.), which shall act as a proxy
|
||||
defined in Section 14 of version 3 of the license.
|
||||
|
||||
This program 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 General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "configdialog.h"
|
||||
|
||||
#include "massif-visualizer-settings.h"
|
||||
#include "ui_config.h"
|
||||
|
||||
#include <KLocale>
|
||||
|
||||
using namespace Massif;
|
||||
|
||||
ConfigDialog::ConfigDialog(QWidget* parent)
|
||||
: KConfigDialog(parent, "settings", Settings::self())
|
||||
, m_ui(new Ui::Config)
|
||||
{
|
||||
setAttribute(Qt::WA_DeleteOnClose, true);
|
||||
|
||||
QWidget* settingsPage = new QWidget(this);
|
||||
m_ui->setupUi(settingsPage);
|
||||
|
||||
addPage(settingsPage, Settings::self(), i18n("Settings"));
|
||||
setFaceType(KPageDialog::Plain);
|
||||
}
|
||||
|
||||
ConfigDialog::~ConfigDialog()
|
||||
{
|
||||
}
|
||||
|
||||
bool ConfigDialog::isShown()
|
||||
{
|
||||
return KConfigDialog::showDialog("settings");
|
||||
}
|
||||
|
||||
#include "configdialog.moc"
|
53
massif-visualizer/app/configdialog.h
Normal file
53
massif-visualizer/app/configdialog.h
Normal file
|
@ -0,0 +1,53 @@
|
|||
/*
|
||||
This file is part of Massif Visualizer
|
||||
|
||||
Copyright 2010 Milian Wolff <mail@milianw.de>
|
||||
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License as
|
||||
published by the Free Software Foundation; either version 2 of
|
||||
the License or (at your option) version 3 or any later version
|
||||
accepted by the membership of KDE e.V. (or its successor approved
|
||||
by the membership of KDE e.V.), which shall act as a proxy
|
||||
defined in Section 14 of version 3 of the license.
|
||||
|
||||
This program 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 General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef CONFIGDIALOG_H
|
||||
#define CONFIGDIALOG_H
|
||||
|
||||
#include <KConfigDialog>
|
||||
|
||||
namespace Ui {
|
||||
class Config;
|
||||
}
|
||||
|
||||
namespace Massif {
|
||||
|
||||
/**
|
||||
* Config dialog, gets deleted when closed.
|
||||
*/
|
||||
class ConfigDialog : public KConfigDialog
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
ConfigDialog(QWidget* parent);
|
||||
virtual ~ConfigDialog();
|
||||
|
||||
static bool isShown();
|
||||
|
||||
private:
|
||||
QScopedPointer<Ui::Config> m_ui;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif // CONFIGDIALOG_H
|
41
massif-visualizer/app/documenttabinterface.cpp
Normal file
41
massif-visualizer/app/documenttabinterface.cpp
Normal file
|
@ -0,0 +1,41 @@
|
|||
/*
|
||||
This file is part of Massif Visualizer
|
||||
|
||||
Copyright 2014 Milian Wolff <mail@milianw.de>
|
||||
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License as
|
||||
published by the Free Software Foundation; either version 2 of
|
||||
the License or (at your option) version 3 or any later version
|
||||
accepted by the membership of KDE e.V. (or its successor approved
|
||||
by the membership of KDE e.V.), which shall act as a proxy
|
||||
defined in Section 14 of version 3 of the license.
|
||||
|
||||
This program 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 General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "documenttabinterface.h"
|
||||
|
||||
using namespace Massif;
|
||||
|
||||
DocumentTabInterface::DocumentTabInterface(const FileData* data,
|
||||
KXMLGUIClient* guiParent, QWidget* parent)
|
||||
: QWidget(parent)
|
||||
, KXMLGUIClient(guiParent)
|
||||
, m_data(data)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
DocumentTabInterface::~DocumentTabInterface()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
#include "documenttabinterface.moc"
|
59
massif-visualizer/app/documenttabinterface.h
Normal file
59
massif-visualizer/app/documenttabinterface.h
Normal file
|
@ -0,0 +1,59 @@
|
|||
/*
|
||||
This file is part of Massif Visualizer
|
||||
|
||||
Copyright 2014 Milian Wolff <mail@milianw.de>
|
||||
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License as
|
||||
published by the Free Software Foundation; either version 2 of
|
||||
the License or (at your option) version 3 or any later version
|
||||
accepted by the membership of KDE e.V. (or its successor approved
|
||||
by the membership of KDE e.V.), which shall act as a proxy
|
||||
defined in Section 14 of version 3 of the license.
|
||||
|
||||
This program 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 General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef DOCUMENTTABINTERFACE_H
|
||||
#define DOCUMENTTABINTERFACE_H
|
||||
|
||||
#include <QWidget>
|
||||
|
||||
#include <KXMLGUIClient>
|
||||
|
||||
#include "visualizer/modelitem.h"
|
||||
|
||||
class QMenu;
|
||||
|
||||
namespace Massif {
|
||||
class FileData;
|
||||
}
|
||||
|
||||
class DocumentTabInterface : public QWidget, public KXMLGUIClient
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit DocumentTabInterface(const Massif::FileData* data,
|
||||
KXMLGUIClient* guiParent, QWidget* parent = 0);
|
||||
virtual ~DocumentTabInterface();
|
||||
|
||||
virtual void settingsChanged() = 0;
|
||||
|
||||
public slots:
|
||||
virtual void selectModelItem(const Massif::ModelItem& item) = 0;
|
||||
|
||||
signals:
|
||||
void modelItemSelected(const Massif::ModelItem& item);
|
||||
void contextMenuRequested(const Massif::ModelItem& item, QMenu* menu);
|
||||
|
||||
protected:
|
||||
const Massif::FileData* const m_data;
|
||||
};
|
||||
|
||||
#endif // DOCUMENTTABINTERFACE_H
|
306
massif-visualizer/app/documentwidget.cpp
Normal file
306
massif-visualizer/app/documentwidget.cpp
Normal file
|
@ -0,0 +1,306 @@
|
|||
/*
|
||||
This file is part of Massif Visualizer
|
||||
|
||||
Copyright 2010 Milian Wolff <mail@milianw.de>
|
||||
Copyright 2013 Arnold Dumas <contact@arnolddumas.fr>
|
||||
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License as
|
||||
published by the Free Software Foundation; either version 2 of
|
||||
the License or (at your option) version 3 or any later version
|
||||
accepted by the membership of KDE e.V. (or its successor approved
|
||||
by the membership of KDE e.V.), which shall act as a proxy
|
||||
defined in Section 14 of version 3 of the license.
|
||||
|
||||
This program 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 General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "documentwidget.h"
|
||||
|
||||
#include <QApplication>
|
||||
|
||||
#include "massifdata/filedata.h"
|
||||
#include "massifdata/parser.h"
|
||||
#include "massifdata/parseworker.h"
|
||||
#include "massifdata/snapshotitem.h"
|
||||
#include "massifdata/treeleafitem.h"
|
||||
#include "massifdata/util.h"
|
||||
|
||||
#include <KStandardAction>
|
||||
#include <KColorScheme>
|
||||
|
||||
#include <KLocalizedString>
|
||||
// forward include not available until later KDE versions...
|
||||
#include <kmessagewidget.h>
|
||||
#include <KIcon>
|
||||
#include <KDebug>
|
||||
#include <KXMLGUIFactory>
|
||||
|
||||
#include <QLabel>
|
||||
#include <QProgressBar>
|
||||
#include <QStackedWidget>
|
||||
#include <QTabWidget>
|
||||
#include <QToolButton>
|
||||
#include <QVBoxLayout>
|
||||
|
||||
#include "charttab.h"
|
||||
#include "allocatorstab.h"
|
||||
|
||||
#ifdef HAVE_KGRAPHVIEWER
|
||||
#include "callgraphtab.h"
|
||||
|
||||
#include <KPluginLoader>
|
||||
#include <KPluginFactory>
|
||||
#include <KParts/ReadOnlyPart>
|
||||
#endif
|
||||
|
||||
using namespace Massif;
|
||||
|
||||
DocumentWidget::DocumentWidget(const KUrl& file, const QStringList& customAllocators,
|
||||
KXMLGUIClient* guiParent, QWidget* parent)
|
||||
: QWidget(parent)
|
||||
, KXMLGUIClient(guiParent)
|
||||
, m_data(0)
|
||||
, m_parseWorker(new ParseWorker)
|
||||
, m_file(file)
|
||||
, m_currentTab(0)
|
||||
, m_stackedWidget(new QStackedWidget(this))
|
||||
, m_tabs(new QTabWidget(m_stackedWidget))
|
||||
, m_errorMessage(0)
|
||||
, m_loadingMessage(0)
|
||||
, m_loadingProgressBar(0)
|
||||
, m_stopParserButton(0)
|
||||
, m_isLoaded(false)
|
||||
{
|
||||
connect(m_parseWorker, SIGNAL(finished(KUrl, Massif::FileData*)),
|
||||
this, SLOT(parserFinished(KUrl, Massif::FileData*)));
|
||||
connect(m_parseWorker, SIGNAL(error(QString, QString)),
|
||||
this, SLOT(showError(QString, QString)));
|
||||
connect(m_parseWorker, SIGNAL(progressRange(int, int)),
|
||||
this, SLOT(setRange(int,int)));
|
||||
connect(m_parseWorker, SIGNAL(progress(int)),
|
||||
this, SLOT(setProgress(int)));
|
||||
|
||||
// Create dedicated thread for this document.
|
||||
// TODO: use ThreadWeaver
|
||||
QThread* thread = new QThread(this);
|
||||
thread->start();
|
||||
m_parseWorker->moveToThread(thread);
|
||||
m_parseWorker->parse(file, customAllocators);
|
||||
|
||||
setXMLFile("documentwidgetui.rc", true);
|
||||
|
||||
// Set m_stackedWidget as the main widget.
|
||||
setLayout(new QVBoxLayout(this));
|
||||
layout()->addWidget(m_stackedWidget);
|
||||
|
||||
m_tabs->setTabPosition(QTabWidget::South);
|
||||
m_stackedWidget->addWidget(m_tabs);
|
||||
|
||||
// Second widget : loadingPage
|
||||
QWidget* loadingPage = new QWidget(m_stackedWidget);
|
||||
QVBoxLayout* verticalLayout = new QVBoxLayout(loadingPage);
|
||||
QSpacerItem* upperSpacerItem = new QSpacerItem(20, 247, QSizePolicy::Minimum, QSizePolicy::Expanding);
|
||||
verticalLayout->addItem(upperSpacerItem);
|
||||
|
||||
m_loadingMessage = new QLabel(loadingPage);
|
||||
m_loadingMessage->setText(i18n("loading file <i>%1</i>...", file.pathOrUrl()));
|
||||
m_loadingMessage->setAlignment(Qt::AlignCenter);
|
||||
verticalLayout->addWidget(m_loadingMessage);
|
||||
|
||||
m_loadingProgressBar = new QProgressBar(loadingPage);
|
||||
m_loadingProgressBar->setValue(24);
|
||||
m_loadingProgressBar->setRange(0, 0);
|
||||
verticalLayout->addWidget(m_loadingProgressBar);
|
||||
|
||||
QWidget* stopParserWidget = new QWidget(loadingPage);
|
||||
stopParserWidget->setLayoutDirection(Qt::LeftToRight);
|
||||
QHBoxLayout* stopParserWidgetLayout = new QHBoxLayout(stopParserWidget);
|
||||
m_stopParserButton = new QToolButton(stopParserWidget);
|
||||
m_stopParserButton->setObjectName(QString::fromUtf8("stopParsing"));
|
||||
m_stopParserButton->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
|
||||
m_stopParserButton->setIcon(KIcon("process-stop"));
|
||||
m_stopParserButton->setIconSize(QSize(48, 48));
|
||||
connect(m_stopParserButton, SIGNAL(clicked()),
|
||||
this, SIGNAL(requestClose()));
|
||||
stopParserWidgetLayout->addWidget(m_stopParserButton);
|
||||
verticalLayout->addWidget(stopParserWidget);
|
||||
|
||||
QSpacerItem* bottomSpacerItem = new QSpacerItem(20, 230, QSizePolicy::Minimum, QSizePolicy::Expanding);
|
||||
verticalLayout->addItem(bottomSpacerItem);
|
||||
m_stackedWidget->addWidget(loadingPage);
|
||||
|
||||
// By default we show the loadingPage.
|
||||
m_stackedWidget->setCurrentIndex(1);
|
||||
}
|
||||
|
||||
DocumentWidget::~DocumentWidget()
|
||||
{
|
||||
stopParser();
|
||||
if (m_data) {
|
||||
delete m_data;
|
||||
m_data = 0;
|
||||
m_file.clear();
|
||||
}
|
||||
}
|
||||
|
||||
FileData* DocumentWidget::data() const
|
||||
{
|
||||
return m_data;
|
||||
}
|
||||
|
||||
KUrl DocumentWidget::file() const
|
||||
{
|
||||
return m_file;
|
||||
}
|
||||
|
||||
bool DocumentWidget::isLoaded() const
|
||||
{
|
||||
return m_isLoaded;
|
||||
}
|
||||
|
||||
void DocumentWidget::settingsChanged()
|
||||
{
|
||||
for (int i = 0; i < m_tabs->count(); ++i) {
|
||||
static_cast<DocumentTabInterface*>(m_tabs->widget(i))->settingsChanged();
|
||||
}
|
||||
}
|
||||
|
||||
void DocumentWidget::parserFinished(const KUrl& file, FileData* data)
|
||||
{
|
||||
Q_ASSERT(data->peak());
|
||||
|
||||
kDebug() << "loaded massif file:" << file;
|
||||
qDebug() << "description:" << data->description();
|
||||
qDebug() << "command:" << data->cmd();
|
||||
qDebug() << "time unit:" << data->timeUnit();
|
||||
qDebug() << "snapshots:" << data->snapshots().size();
|
||||
qDebug() << "peak: snapshot #" << data->peak()->number() << "after" << QString("%1%2").arg(data->peak()->time()).arg(data->timeUnit());
|
||||
qDebug() << "peak cost:" << prettyCost(data->peak()->memHeap()) << " heap"
|
||||
<< prettyCost(data->peak()->memHeapExtra()) << " heap extra"
|
||||
<< prettyCost(data->peak()->memStacks()) << " stacks";
|
||||
|
||||
m_data = data;
|
||||
m_file = file;
|
||||
|
||||
m_tabs->addTab(new ChartTab(m_data, this, this), KIcon("office-chart-area-stacked"),
|
||||
i18n("Memory Chart"));
|
||||
|
||||
#ifdef HAVE_KGRAPHVIEWER
|
||||
static KPluginFactory *factory = KPluginLoader("kgraphviewerpart").factory();
|
||||
if (factory) {
|
||||
KParts::ReadOnlyPart* part = factory->create<KParts::ReadOnlyPart>("kgraphviewerpart", this);
|
||||
if (part) {
|
||||
m_tabs->addTab(new CallGraphTab(m_data, part, this, this), KIcon("kgraphviewer"),
|
||||
i18n("Callgraph"));
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
m_tabs->addTab(new AllocatorsTab(m_data, this, this), KIcon("view-list-text"),
|
||||
i18n("Allocators"));
|
||||
|
||||
for (int i = 0; i < m_tabs->count(); ++i) {
|
||||
DocumentTabInterface* tab = static_cast<DocumentTabInterface*>(m_tabs->widget(i));
|
||||
connect(tab, SIGNAL(modelItemSelected(Massif::ModelItem)),
|
||||
this, SIGNAL(modelItemSelected(Massif::ModelItem)));
|
||||
connect(tab, SIGNAL(contextMenuRequested(Massif::ModelItem,QMenu*)),
|
||||
this, SIGNAL(contextMenuRequested(Massif::ModelItem,QMenu*)));
|
||||
}
|
||||
|
||||
m_tabs->setCurrentIndex(0);
|
||||
connect(m_tabs, SIGNAL(currentChanged(int)),
|
||||
this, SLOT(slotTabChanged(int)));
|
||||
slotTabChanged(0);
|
||||
|
||||
m_isLoaded = true;
|
||||
|
||||
// Switch to the display page and notify that everything is setup.
|
||||
m_stackedWidget->setCurrentIndex(0);
|
||||
emit loadingFinished();
|
||||
}
|
||||
|
||||
void DocumentWidget::addGuiActions(KXMLGUIFactory* factory)
|
||||
{
|
||||
factory->addClient(this);
|
||||
|
||||
// ensure only the current tab's client is in the factory
|
||||
// otherwise the actions from the other tabs are visible
|
||||
const int current = m_tabs->currentIndex();
|
||||
for (int i = 0; i < m_tabs->count(); ++i) {
|
||||
if (i != current) {
|
||||
factory->removeClient(static_cast<DocumentTabInterface*>(m_tabs->widget(i)));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void DocumentWidget::clearGuiActions(KXMLGUIFactory* factory)
|
||||
{
|
||||
factory->removeClient(this);
|
||||
}
|
||||
|
||||
void DocumentWidget::slotTabChanged(int tab)
|
||||
{
|
||||
if (!factory()) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (m_currentTab) {
|
||||
factory()->removeClient(m_currentTab);
|
||||
}
|
||||
|
||||
if (tab >= 0 && tab < m_tabs->count()) {
|
||||
m_currentTab = static_cast<DocumentTabInterface*>(m_tabs->widget(tab));
|
||||
factory()->addClient(m_currentTab);
|
||||
}
|
||||
}
|
||||
|
||||
void DocumentWidget::selectModelItem(const ModelItem& item)
|
||||
{
|
||||
for (int i = 0; i < m_tabs->count(); ++i) {
|
||||
static_cast<DocumentTabInterface*>(m_tabs->widget(i))->selectModelItem(item);
|
||||
}
|
||||
}
|
||||
|
||||
void DocumentWidget::setProgress(int value)
|
||||
{
|
||||
m_loadingProgressBar->setValue(value);
|
||||
}
|
||||
|
||||
void DocumentWidget::setRange(int minimum, int maximum)
|
||||
{
|
||||
m_loadingProgressBar->setRange(minimum, maximum);
|
||||
}
|
||||
|
||||
void DocumentWidget::showError(const QString& title, const QString& error)
|
||||
{
|
||||
if (!m_errorMessage) {
|
||||
m_errorMessage = new KMessageWidget(m_stackedWidget);
|
||||
m_stackedWidget->addWidget(m_errorMessage);
|
||||
m_errorMessage->setWordWrap(true);
|
||||
m_errorMessage->setMessageType(KMessageWidget::Error);
|
||||
m_errorMessage->setCloseButtonVisible(false);
|
||||
}
|
||||
m_errorMessage->setText(QString("<b>%1</b><p style=\"text-align:left\">%2</p>").arg(title).arg(error));
|
||||
m_stackedWidget->setCurrentWidget(m_errorMessage);
|
||||
}
|
||||
|
||||
void DocumentWidget::stopParser()
|
||||
{
|
||||
if (!m_parseWorker) {
|
||||
return;
|
||||
}
|
||||
|
||||
QThread* thread = m_parseWorker->thread();
|
||||
m_parseWorker->stop();
|
||||
m_parseWorker->deleteLater();
|
||||
m_parseWorker = 0;
|
||||
thread->quit();
|
||||
thread->wait();
|
||||
}
|
104
massif-visualizer/app/documentwidget.h
Normal file
104
massif-visualizer/app/documentwidget.h
Normal file
|
@ -0,0 +1,104 @@
|
|||
/*
|
||||
This file is part of Massif Visualizer
|
||||
|
||||
Copyright 2010 Milian Wolff <mail@milianw.de>
|
||||
Copyright 2013 Arnold Dumas <contact@arnolddumas.fr>
|
||||
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License as
|
||||
published by the Free Software Foundation; either version 2 of
|
||||
the License or (at your option) version 3 or any later version
|
||||
accepted by the membership of KDE e.V. (or its successor approved
|
||||
by the membership of KDE e.V.), which shall act as a proxy
|
||||
defined in Section 14 of version 3 of the license.
|
||||
|
||||
This program 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 General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef DOCUMENTWIDGET_H
|
||||
#define DOCUMENTWIDGET_H
|
||||
|
||||
#include <QWidget>
|
||||
|
||||
#include <KUrl>
|
||||
#include <KXMLGUIClient>
|
||||
|
||||
#include "visualizer/modelitem.h"
|
||||
|
||||
class DocumentTabInterface;
|
||||
|
||||
class QMenu;
|
||||
class QLabel;
|
||||
class QProgressBar;
|
||||
class QToolButton;
|
||||
class QStackedWidget;
|
||||
class QTabWidget;
|
||||
|
||||
class KMessageWidget;
|
||||
|
||||
namespace Massif {
|
||||
class FileData;
|
||||
class ParseWorker;
|
||||
}
|
||||
|
||||
class DocumentWidget : public QWidget, public KXMLGUIClient
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit DocumentWidget(const KUrl& file, const QStringList& customAllocators,
|
||||
KXMLGUIClient* guiParent, QWidget* parent = 0);
|
||||
~DocumentWidget();
|
||||
|
||||
Massif::FileData* data() const;
|
||||
KUrl file() const;
|
||||
|
||||
bool isLoaded() const;
|
||||
|
||||
void settingsChanged();
|
||||
|
||||
void addGuiActions(KXMLGUIFactory* factory);
|
||||
void clearGuiActions(KXMLGUIFactory* factory);
|
||||
|
||||
void selectModelItem(const Massif::ModelItem& item);
|
||||
|
||||
signals:
|
||||
void loadingFinished();
|
||||
void modelItemSelected(const Massif::ModelItem& item);
|
||||
void contextMenuRequested(const Massif::ModelItem& item, QMenu* menu);
|
||||
void requestClose();
|
||||
|
||||
private slots:
|
||||
void stopParser();
|
||||
void parserFinished(const KUrl& file, Massif::FileData* data);
|
||||
|
||||
void setProgress(int value);
|
||||
void setRange(int minimum, int maximum);
|
||||
|
||||
void showError(const QString& title, const QString& error);
|
||||
|
||||
void slotTabChanged(int tab);
|
||||
|
||||
private:
|
||||
Massif::FileData* m_data;
|
||||
Massif::ParseWorker* m_parseWorker;
|
||||
KUrl m_file;
|
||||
|
||||
DocumentTabInterface* m_currentTab;
|
||||
|
||||
QStackedWidget* m_stackedWidget;
|
||||
QTabWidget* m_tabs;
|
||||
KMessageWidget* m_errorMessage;
|
||||
QLabel* m_loadingMessage;
|
||||
QProgressBar* m_loadingProgressBar;
|
||||
QToolButton* m_stopParserButton;
|
||||
bool m_isLoaded;
|
||||
};
|
||||
|
||||
#endif // DOCUMENTWIDGET_H
|
4
massif-visualizer/app/documentwidgetui.rc
Normal file
4
massif-visualizer/app/documentwidgetui.rc
Normal file
|
@ -0,0 +1,4 @@
|
|||
<!DOCTYPE kpartgui SYSTEM "kpartgui.dtd">
|
||||
<kpartgui name="documentwidget" version="1">
|
||||
|
||||
</kpartgui>
|
65
massif-visualizer/app/main.cpp
Normal file
65
massif-visualizer/app/main.cpp
Normal file
|
@ -0,0 +1,65 @@
|
|||
/*
|
||||
This file is part of Massif Visualizer
|
||||
|
||||
Copyright 2010 Milian Wolff <mail@milianw.de>
|
||||
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License as
|
||||
published by the Free Software Foundation; either version 2 of
|
||||
the License or (at your option) version 3 or any later version
|
||||
accepted by the membership of KDE e.V. (or its successor approved
|
||||
by the membership of KDE e.V.), which shall act as a proxy
|
||||
defined in Section 14 of version 3 of the license.
|
||||
|
||||
This program 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 General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <KLocalizedString>
|
||||
#include <KAboutData>
|
||||
#include <KApplication>
|
||||
#include <KCmdLineArgs>
|
||||
#include <KCmdLineOptions>
|
||||
#include <KUrl>
|
||||
|
||||
#include <QtCore/QDebug>
|
||||
|
||||
#include "mainwindow.h"
|
||||
|
||||
int main( int argc, char *argv[] )
|
||||
{
|
||||
KAboutData aboutData( "massif-visualizer", 0, ki18n( "Massif Visualizer" ),
|
||||
"0.5", ki18n("A visualizer for output generated by Valgrind's massif tool."), KAboutData::License_LGPL,
|
||||
ki18n( "Copyright 2010-2014, Milian Wolff <mail@milianw.de>" ),
|
||||
KLocalizedString(), QByteArray(), "massif-visualizer@kde.org" );
|
||||
|
||||
aboutData.addAuthor(ki18n("Milian Wolff"), ki18n("Original author, maintainer"),
|
||||
"mail@milianw.de", "http://milianw.de");
|
||||
|
||||
aboutData.addAuthor(ki18n("Arnold Dumas"), ki18n("Multiple document interface, bug fixes"),
|
||||
"contact@arnolddumas.fr", "http://arnolddumas.fr");
|
||||
|
||||
aboutData.setProgramIconName("office-chart-area");
|
||||
|
||||
KCmdLineArgs::init( argc, argv, &aboutData, KCmdLineArgs::CmdLineArgNone );
|
||||
KCmdLineOptions options;
|
||||
options.add("+file(s)", ki18n("Opens given output file(s) and visualize it."));
|
||||
|
||||
KCmdLineArgs::addCmdLineOptions( options );
|
||||
KCmdLineArgs* args = KCmdLineArgs::parsedArgs();
|
||||
KApplication app;
|
||||
|
||||
Massif::MainWindow* window = new Massif::MainWindow;
|
||||
|
||||
for (int i = 0; i < args->count(); ++i) {
|
||||
window->openFile(args->url(i));
|
||||
}
|
||||
|
||||
window->show();
|
||||
return app.exec();
|
||||
}
|
528
massif-visualizer/app/mainwindow.cpp
Normal file
528
massif-visualizer/app/mainwindow.cpp
Normal file
|
@ -0,0 +1,528 @@
|
|||
/*
|
||||
This file is part of Massif Visualizer
|
||||
|
||||
Copyright 2010 Milian Wolff <mail@milianw.de>
|
||||
Copyright 2013 Arnold Dumas <contact@arnolddumas.fr>
|
||||
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License as
|
||||
published by the Free Software Foundation; either version 2 of
|
||||
the License or (at your option) version 3 or any later version
|
||||
accepted by the membership of KDE e.V. (or its successor approved
|
||||
by the membership of KDE e.V.), which shall act as a proxy
|
||||
defined in Section 14 of version 3 of the license.
|
||||
|
||||
This program 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 General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "mainwindow.h"
|
||||
|
||||
#include "massifdata/filedata.h"
|
||||
#include "massifdata/snapshotitem.h"
|
||||
#include "massifdata/treeleafitem.h"
|
||||
#include "massifdata/util.h"
|
||||
|
||||
#include "visualizer/totalcostmodel.h"
|
||||
#include "visualizer/detailedcostmodel.h"
|
||||
#include "visualizer/datatreemodel.h"
|
||||
#include "visualizer/filtereddatatreemodel.h"
|
||||
#include "visualizer/dotgraphgenerator.h"
|
||||
|
||||
#include "massif-visualizer-settings.h"
|
||||
#include "configdialog.h"
|
||||
|
||||
#include <KStandardAction>
|
||||
#include <KActionCollection>
|
||||
#include <KFileDialog>
|
||||
#include <KRecentFilesAction>
|
||||
#include <KColorScheme>
|
||||
#include <KStatusBar>
|
||||
#include <KToolBar>
|
||||
#include <KParts/Part>
|
||||
#include <KPluginFactory>
|
||||
#include <KPluginLoader>
|
||||
#include <KXMLGUIFactory>
|
||||
#include <KLocale>
|
||||
|
||||
#include <QSortFilterProxyModel>
|
||||
#include <QStringListModel>
|
||||
#include <QLabel>
|
||||
#include <QSpinBox>
|
||||
#include <QInputDialog>
|
||||
|
||||
#include <KMessageBox>
|
||||
|
||||
#ifdef HAVE_KGRAPHVIEWER
|
||||
#include <kgraphviewer_interface.h>
|
||||
#endif
|
||||
|
||||
using namespace Massif;
|
||||
|
||||
// Helper function
|
||||
static KConfigGroup allocatorConfig()
|
||||
{
|
||||
return KGlobal::config()->group("Allocators");
|
||||
}
|
||||
|
||||
MainWindow::MainWindow(QWidget* parent, Qt::WindowFlags f)
|
||||
: KParts::MainWindow(parent, f)
|
||||
, m_recentFiles(0)
|
||||
, m_close(0)
|
||||
, m_allocatorModel(new QStringListModel(this))
|
||||
, m_newAllocator(0)
|
||||
, m_removeAllocator(0)
|
||||
, m_shortenTemplates(0)
|
||||
, m_selectPeak(0)
|
||||
, m_currentDocument(0)
|
||||
, m_dataTreeModel(new DataTreeModel(this))
|
||||
, m_dataTreeFilterModel(new FilteredDataTreeModel(m_dataTreeModel))
|
||||
, m_settingSelection(false)
|
||||
{
|
||||
ui.setupUi(this);
|
||||
|
||||
setWindowTitle(i18n("Massif Visualizer"));
|
||||
|
||||
//BEGIN KGraphViewer
|
||||
bool haveGraphViewer = false;
|
||||
|
||||
// NOTE: just check if kgraphviewer is available at runtime.
|
||||
// The former logic has been moved to DocumentWidget constructor.
|
||||
#ifdef HAVE_KGRAPHVIEWER
|
||||
KPluginFactory *factory = KPluginLoader("kgraphviewerpart").factory();
|
||||
if (factory) {
|
||||
KParts::ReadOnlyPart* readOnlyPart = factory->create<KParts::ReadOnlyPart>("kgraphviewerpart", this);
|
||||
if (readOnlyPart) {
|
||||
readOnlyPart->widget()->hide();
|
||||
haveGraphViewer = true;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
if (!haveGraphViewer) {
|
||||
// cleanup UI when we installed with kgraphviewer but it's not available at runtime
|
||||
KToolBar* callgraphToolbar = toolBar("callgraphToolBar");
|
||||
removeToolBar(callgraphToolbar);
|
||||
delete callgraphToolbar;
|
||||
}
|
||||
//END KGraphViewer
|
||||
|
||||
ui.documents->setMovable(true);
|
||||
ui.documents->setTabsClosable(true);
|
||||
connect(ui.documents, SIGNAL(currentChanged(int)),
|
||||
this, SLOT(documentChanged()));
|
||||
connect(ui.documents, SIGNAL(tabCloseRequested(int)),
|
||||
this, SLOT(closeFileTab(int)));
|
||||
|
||||
//BEGIN custom allocators
|
||||
tabifyDockWidget(ui.allocatorDock, ui.dataTreeDock);
|
||||
ui.allocatorView->setModel(m_allocatorModel);
|
||||
|
||||
int iconSize = style()->pixelMetric(QStyle::PM_SmallIconSize);
|
||||
ui.dockMenuBar->setIconSize(QSize(iconSize, iconSize));
|
||||
ui.dockMenuBar->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
|
||||
ui.dockMenuBar->setFloatable(false);
|
||||
ui.dockMenuBar->setMovable(false);
|
||||
|
||||
KConfigGroup cfg = allocatorConfig();
|
||||
m_allocatorModel->setStringList(cfg.entryMap().values());
|
||||
|
||||
connect(m_allocatorModel, SIGNAL(modelReset()),
|
||||
this, SLOT(allocatorsChanged()));
|
||||
|
||||
connect(m_allocatorModel, SIGNAL(dataChanged(QModelIndex,QModelIndex)),
|
||||
this, SLOT(allocatorsChanged()));
|
||||
|
||||
connect(ui.dataTreeView, SIGNAL(customContextMenuRequested(QPoint)),
|
||||
this, SLOT(dataTreeContextMenuRequested(QPoint)));
|
||||
ui.dataTreeView->setContextMenuPolicy(Qt::CustomContextMenu);
|
||||
|
||||
connect(ui.allocatorView, SIGNAL(customContextMenuRequested(QPoint)),
|
||||
this, SLOT(allocatorViewContextMenuRequested(QPoint)));
|
||||
ui.allocatorView->setContextMenuPolicy(Qt::CustomContextMenu);
|
||||
//END custom allocators
|
||||
|
||||
setupActions();
|
||||
setupGUI(StandardWindowOptions(Default ^ StatusBar));
|
||||
statusBar()->hide();
|
||||
|
||||
ui.dataTreeView->setModel(m_dataTreeFilterModel);
|
||||
|
||||
connect(ui.filterDataTree, SIGNAL(textChanged(QString)),
|
||||
m_dataTreeFilterModel, SLOT(setFilter(QString)));
|
||||
connect(ui.dataTreeView->selectionModel(), SIGNAL(currentChanged(QModelIndex,QModelIndex)),
|
||||
this, SLOT(treeSelectionChanged(QModelIndex,QModelIndex)));
|
||||
|
||||
// open page
|
||||
ui.stackedWidget->setCurrentWidget(ui.openPage);
|
||||
}
|
||||
|
||||
MainWindow::~MainWindow()
|
||||
{
|
||||
while (ui.documents->count()) {
|
||||
closeCurrentFile();
|
||||
}
|
||||
|
||||
m_recentFiles->saveEntries(KGlobal::config()->group( QString() ));
|
||||
}
|
||||
|
||||
void MainWindow::setupActions()
|
||||
{
|
||||
KAction* openFile = KStandardAction::open(this, SLOT(openFile()), actionCollection());
|
||||
m_recentFiles = KStandardAction::openRecent(this, SLOT(openFile(KUrl)), actionCollection());
|
||||
m_recentFiles->loadEntries(KGlobal::config()->group( QString() ));
|
||||
|
||||
KAction* reload = KStandardAction::redisplay(this, SLOT(reloadCurrentFile()), actionCollection());
|
||||
actionCollection()->addAction("file_reload", reload);
|
||||
reload->setEnabled(false);
|
||||
|
||||
m_close = KStandardAction::close(this, SLOT(closeCurrentFile()), actionCollection());
|
||||
m_close->setEnabled(false);
|
||||
|
||||
KStandardAction::quit(qApp, SLOT(closeAllWindows()), actionCollection());
|
||||
|
||||
KStandardAction::preferences(this, SLOT(preferences()), actionCollection());
|
||||
|
||||
m_shortenTemplates = new KAction(KIcon("shortentemplates"), i18n("Shorten Templates"), actionCollection());
|
||||
m_shortenTemplates->setCheckable(true);
|
||||
m_shortenTemplates->setChecked(Settings::shortenTemplates());
|
||||
connect(m_shortenTemplates, SIGNAL(toggled(bool)), SLOT(slotShortenTemplates(bool)));
|
||||
actionCollection()->addAction("shorten_templates", m_shortenTemplates);
|
||||
|
||||
m_selectPeak = new KAction(KIcon("flag-red"), i18n("Select peak snapshot"), actionCollection());
|
||||
connect(m_selectPeak, SIGNAL(triggered()), this, SLOT(selectPeakSnapshot()));
|
||||
actionCollection()->addAction("selectPeak", m_selectPeak);
|
||||
m_selectPeak->setEnabled(false);
|
||||
|
||||
//BEGIN custom allocators
|
||||
m_newAllocator = new KAction(KIcon("list-add"), i18n("add"), ui.allocatorDock);
|
||||
m_newAllocator->setToolTip(i18n("add custom allocator"));
|
||||
connect(m_newAllocator, SIGNAL(triggered()), this, SLOT(slotNewAllocator()));
|
||||
ui.dockMenuBar->addAction(m_newAllocator);
|
||||
m_removeAllocator = new KAction(KIcon("list-remove"), i18n("remove"),
|
||||
ui.allocatorDock);
|
||||
m_newAllocator->setToolTip(i18n("remove selected allocator"));
|
||||
connect(m_removeAllocator, SIGNAL(triggered()), this, SLOT(slotRemoveAllocator()));
|
||||
connect(ui.allocatorView->selectionModel(), SIGNAL(selectionChanged(QItemSelection,QItemSelection)),
|
||||
this, SLOT(allocatorSelectionChanged()));
|
||||
m_removeAllocator->setEnabled(false);
|
||||
ui.dockMenuBar->addAction(m_removeAllocator);
|
||||
|
||||
m_markCustomAllocator = new KAction(i18n("mark as custom allocator"), ui.allocatorDock);
|
||||
connect(m_markCustomAllocator, SIGNAL(triggered()),
|
||||
this, SLOT(slotMarkCustomAllocator()), Qt::QueuedConnection);
|
||||
//END custom allocators
|
||||
|
||||
//dock actions
|
||||
actionCollection()->addAction("toggleDataTree", ui.dataTreeDock->toggleViewAction());
|
||||
actionCollection()->addAction("toggleAllocators", ui.allocatorDock->toggleViewAction());
|
||||
|
||||
//open page actions
|
||||
ui.openFile->setDefaultAction(openFile);
|
||||
ui.openFile->setText(i18n("Open Massif Data File"));
|
||||
ui.openFile->setIconSize(QSize(48, 48));
|
||||
}
|
||||
|
||||
void MainWindow::preferences()
|
||||
{
|
||||
if (ConfigDialog::isShown()) {
|
||||
return;
|
||||
}
|
||||
|
||||
ConfigDialog* dlg = new ConfigDialog(this);
|
||||
connect(dlg, SIGNAL(settingsChanged(QString)),
|
||||
this, SLOT(settingsChanged()));
|
||||
dlg->show();
|
||||
}
|
||||
|
||||
void MainWindow::settingsChanged()
|
||||
{
|
||||
if (Settings::self()->shortenTemplates() != m_shortenTemplates->isChecked()) {
|
||||
m_shortenTemplates->setChecked(Settings::self()->shortenTemplates());
|
||||
}
|
||||
|
||||
Settings::self()->writeConfig();
|
||||
|
||||
if (m_currentDocument) {
|
||||
m_currentDocument->settingsChanged();
|
||||
}
|
||||
ui.dataTreeView->viewport()->update();
|
||||
}
|
||||
|
||||
void MainWindow::openFile()
|
||||
{
|
||||
const KUrl::List files = KFileDialog::getOpenUrls(KUrl("kfiledialog:///massif-visualizer"),
|
||||
QString("application/x-valgrind-massif"),
|
||||
this, i18n("Open Massif Output File"));
|
||||
foreach (const KUrl& file, files) {
|
||||
openFile(file);
|
||||
}
|
||||
}
|
||||
|
||||
void MainWindow::reloadCurrentFile()
|
||||
{
|
||||
if (m_currentDocument->file().isValid()) {
|
||||
openFile(KUrl(m_currentDocument->file()));
|
||||
}
|
||||
}
|
||||
|
||||
void MainWindow::openFile(const KUrl& file)
|
||||
{
|
||||
Q_ASSERT(file.isValid());
|
||||
|
||||
// Is file already opened ?
|
||||
int indexToInsert = -1;
|
||||
for (int i = 0; i < ui.documents->count(); ++i) {
|
||||
if (qobject_cast<DocumentWidget*>(ui.documents->widget(i))->file() == file) {
|
||||
indexToInsert = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
DocumentWidget* documentWidget = new DocumentWidget(file.pathOrUrl(), m_allocatorModel->stringList(),
|
||||
this, this);
|
||||
|
||||
if (indexToInsert != -1) {
|
||||
// Remove existing instance of the file.
|
||||
ui.documents->setCurrentIndex(indexToInsert);
|
||||
closeCurrentFile();
|
||||
// Insert the new tab at the correct position.
|
||||
ui.documents->insertTab(indexToInsert, documentWidget, file.fileName());
|
||||
ui.documents->setCurrentIndex(indexToInsert);
|
||||
} else {
|
||||
const int idx = ui.documents->addTab(documentWidget, file.fileName());
|
||||
ui.documents->setCurrentIndex(idx);
|
||||
}
|
||||
connect(documentWidget, SIGNAL(loadingFinished()),
|
||||
this, SLOT(documentChanged()));
|
||||
connect(documentWidget, SIGNAL(requestClose()),
|
||||
this, SLOT(closeRequested()));
|
||||
|
||||
m_recentFiles->addUrl(file);
|
||||
ui.stackedWidget->setCurrentWidget(ui.displayPage);
|
||||
}
|
||||
|
||||
void MainWindow::treeSelectionChanged(const QModelIndex& now, const QModelIndex& before)
|
||||
{
|
||||
if (!m_currentDocument || m_settingSelection || now == before) {
|
||||
return;
|
||||
}
|
||||
|
||||
m_settingSelection = true;
|
||||
|
||||
const ModelItem& item = now.data(DataTreeModel::ModelItemRole).value<ModelItem>();
|
||||
m_currentDocument->selectModelItem(item);
|
||||
|
||||
m_settingSelection = false;
|
||||
}
|
||||
|
||||
void MainWindow::modelItemSelected(const ModelItem& item)
|
||||
{
|
||||
if (!m_currentDocument || m_settingSelection) {
|
||||
return;
|
||||
}
|
||||
|
||||
m_settingSelection = true;
|
||||
|
||||
const QModelIndex& newIndex = m_dataTreeFilterModel->mapFromSource(
|
||||
m_dataTreeModel->indexForItem(item)
|
||||
);
|
||||
ui.dataTreeView->selectionModel()->clearSelection();
|
||||
ui.dataTreeView->selectionModel()->setCurrentIndex(newIndex, QItemSelectionModel::Select | QItemSelectionModel::Rows);
|
||||
ui.dataTreeView->scrollTo(ui.dataTreeView->selectionModel()->currentIndex());
|
||||
m_currentDocument->selectModelItem(item);
|
||||
|
||||
m_settingSelection = false;
|
||||
}
|
||||
|
||||
void MainWindow::selectPeakSnapshot()
|
||||
{
|
||||
ui.dataTreeView->selectionModel()->clearSelection();
|
||||
ui.dataTreeView->selectionModel()->setCurrentIndex(
|
||||
m_dataTreeFilterModel->mapFromSource(
|
||||
m_dataTreeModel->indexForSnapshot(m_currentDocument->data()->peak())),
|
||||
QItemSelectionModel::Select | QItemSelectionModel::Rows
|
||||
);
|
||||
}
|
||||
|
||||
void MainWindow::closeCurrentFile()
|
||||
{
|
||||
closeFileTab(ui.documents->currentIndex());
|
||||
}
|
||||
|
||||
void MainWindow::closeRequested()
|
||||
{
|
||||
DocumentWidget* widget = qobject_cast<DocumentWidget*>(sender());
|
||||
Q_ASSERT(widget);
|
||||
closeFileTab(ui.documents->indexOf(widget));
|
||||
}
|
||||
|
||||
void MainWindow::closeFileTab(int idx)
|
||||
{
|
||||
Q_ASSERT(idx != -1);
|
||||
ui.documents->widget(idx)->deleteLater();
|
||||
ui.documents->removeTab(idx);
|
||||
}
|
||||
|
||||
void MainWindow::allocatorsChanged()
|
||||
{
|
||||
KConfigGroup cfg = allocatorConfig();
|
||||
cfg.deleteGroup();
|
||||
int i = 0;
|
||||
foreach(const QString& allocator, m_allocatorModel->stringList()) {
|
||||
if (allocator.isEmpty()) {
|
||||
m_allocatorModel->removeRow(i);
|
||||
continue;
|
||||
}
|
||||
cfg.writeEntry(QString::number(i++), allocator);
|
||||
}
|
||||
cfg.sync();
|
||||
|
||||
if (m_currentDocument) {
|
||||
reloadCurrentFile();
|
||||
}
|
||||
}
|
||||
|
||||
void MainWindow::allocatorSelectionChanged()
|
||||
{
|
||||
m_removeAllocator->setEnabled(ui.allocatorView->selectionModel()->hasSelection());
|
||||
}
|
||||
|
||||
void MainWindow::slotNewAllocator()
|
||||
{
|
||||
QString allocator = QInputDialog::getText(this, i18n("Add Custom Allocator"), i18n("allocator:"));
|
||||
if (allocator.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
if (!m_allocatorModel->stringList().contains(allocator)) {
|
||||
m_allocatorModel->setStringList(m_allocatorModel->stringList() << allocator);
|
||||
}
|
||||
}
|
||||
|
||||
void MainWindow::slotRemoveAllocator()
|
||||
{
|
||||
Q_ASSERT(ui.allocatorView->selectionModel()->hasSelection());
|
||||
foreach(const QModelIndex& idx, ui.allocatorView->selectionModel()->selectedRows()) {
|
||||
m_allocatorModel->removeRow(idx.row(), idx.parent());
|
||||
}
|
||||
allocatorsChanged();
|
||||
}
|
||||
|
||||
void MainWindow::slotMarkCustomAllocator()
|
||||
{
|
||||
const QString allocator = m_markCustomAllocator->data().toString();
|
||||
Q_ASSERT(!allocator.isEmpty());
|
||||
if (!m_allocatorModel->stringList().contains(allocator)) {
|
||||
m_allocatorModel->setStringList(m_allocatorModel->stringList() << allocator);
|
||||
}
|
||||
}
|
||||
|
||||
void MainWindow::allocatorViewContextMenuRequested(const QPoint& pos)
|
||||
{
|
||||
const QModelIndex idx = ui.allocatorView->indexAt(pos);
|
||||
|
||||
QMenu menu;
|
||||
menu.addAction(m_newAllocator);
|
||||
if (idx.isValid()) {
|
||||
menu.addAction(m_removeAllocator);
|
||||
}
|
||||
menu.exec(ui.allocatorView->mapToGlobal(pos));
|
||||
}
|
||||
|
||||
void MainWindow::dataTreeContextMenuRequested(const QPoint& pos)
|
||||
{
|
||||
const QModelIndex idx = ui.dataTreeView->indexAt(pos);
|
||||
const TreeLeafItem* item = idx.data(DataTreeModel::TreeItemRole).value<const TreeLeafItem*>();
|
||||
if (!item) {
|
||||
return;
|
||||
}
|
||||
|
||||
QMenu menu;
|
||||
contextMenuRequested(ModelItem(item, 0), &menu);
|
||||
|
||||
menu.exec(ui.dataTreeView->mapToGlobal(pos));
|
||||
}
|
||||
|
||||
void MainWindow::contextMenuRequested(const ModelItem& item, QMenu* menu)
|
||||
{
|
||||
if (!item.first) {
|
||||
// only handle context menu on tree-leaf items for now
|
||||
return;
|
||||
}
|
||||
|
||||
QString func = functionInLabel(item.first->label());
|
||||
if (func.length() > 40) {
|
||||
func.resize(40);
|
||||
func.append("...");
|
||||
}
|
||||
menu->setTitle(func);
|
||||
|
||||
m_markCustomAllocator->setData(item.first->label());
|
||||
menu->addAction(m_markCustomAllocator);
|
||||
}
|
||||
|
||||
void MainWindow::slotShortenTemplates(bool shorten)
|
||||
{
|
||||
if (shorten == Settings::self()->shortenTemplates()) {
|
||||
return;
|
||||
}
|
||||
|
||||
Settings::self()->setShortenTemplates(shorten);
|
||||
settingsChanged();
|
||||
}
|
||||
|
||||
void MainWindow::updateWindowTitle()
|
||||
{
|
||||
if (m_currentDocument && m_currentDocument->isLoaded()) {
|
||||
setWindowTitle(i18n("Massif Visualizer - evaluation of %1 (%2)", m_currentDocument->data()->cmd(), m_currentDocument->file().fileName()));
|
||||
} else {
|
||||
setWindowTitle(i18n("Massif Visualizer"));
|
||||
}
|
||||
}
|
||||
|
||||
void MainWindow::documentChanged()
|
||||
{
|
||||
// required to prevent GUI flickering when changing documents
|
||||
// the changing actions in the toolbar are really flickering bad otherwise
|
||||
setUpdatesEnabled(false);
|
||||
|
||||
if (m_currentDocument) {
|
||||
m_dataTreeModel->setSource(0);
|
||||
m_dataTreeFilterModel->setFilter(QString());
|
||||
m_currentDocument->clearGuiActions(guiFactory());
|
||||
disconnect(m_currentDocument, SIGNAL(modelItemSelected(Massif::ModelItem)),
|
||||
this, SLOT(modelItemSelected(Massif::ModelItem)));
|
||||
disconnect(m_currentDocument, SIGNAL(contextMenuRequested(Massif::ModelItem,QMenu*)),
|
||||
this, SLOT(contextMenuRequested(Massif::ModelItem,QMenu*)));
|
||||
}
|
||||
|
||||
m_currentDocument = qobject_cast<DocumentWidget*>(ui.documents->currentWidget());
|
||||
|
||||
updateWindowTitle();
|
||||
|
||||
actionCollection()->action("file_reload")->setEnabled(m_currentDocument && m_currentDocument->isLoaded());
|
||||
m_close->setEnabled(m_currentDocument);
|
||||
m_selectPeak->setEnabled(m_currentDocument && m_currentDocument->isLoaded());
|
||||
|
||||
if (!m_currentDocument) {
|
||||
ui.stackedWidget->setCurrentWidget(ui.openPage);
|
||||
setUpdatesEnabled(true);
|
||||
return;
|
||||
} else {
|
||||
m_dataTreeModel->setSource(m_currentDocument->data());
|
||||
m_currentDocument->addGuiActions(guiFactory());
|
||||
connect(m_currentDocument, SIGNAL(modelItemSelected(Massif::ModelItem)),
|
||||
this, SLOT(modelItemSelected(Massif::ModelItem)));
|
||||
connect(m_currentDocument, SIGNAL(contextMenuRequested(Massif::ModelItem,QMenu*)),
|
||||
this, SLOT(contextMenuRequested(Massif::ModelItem,QMenu*)));
|
||||
}
|
||||
|
||||
setUpdatesEnabled(true);
|
||||
}
|
||||
|
||||
#include "mainwindow.moc"
|
145
massif-visualizer/app/mainwindow.h
Normal file
145
massif-visualizer/app/mainwindow.h
Normal file
|
@ -0,0 +1,145 @@
|
|||
/*
|
||||
This file is part of Massif Visualizer
|
||||
|
||||
Copyright 2010 Milian Wolff <mail@milianw.de>
|
||||
Copyright 2013 Arnold Dumas <contact@arnolddumas.fr>
|
||||
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License as
|
||||
published by the Free Software Foundation; either version 2 of
|
||||
the License or (at your option) version 3 or any later version
|
||||
accepted by the membership of KDE e.V. (or its successor approved
|
||||
by the membership of KDE e.V.), which shall act as a proxy
|
||||
defined in Section 14 of version 3 of the license.
|
||||
|
||||
This program 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 General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef MASSIF_MAINWINDOW_H
|
||||
#define MASSIF_MAINWINDOW_H
|
||||
|
||||
#include <KParts/MainWindow>
|
||||
|
||||
#include <QPrintPreviewDialog>
|
||||
|
||||
#include "ui_mainwindow.h"
|
||||
#include "documentwidget.h"
|
||||
|
||||
class QSpinBox;
|
||||
class QStringListModel;
|
||||
|
||||
namespace KDChart {
|
||||
class Chart;
|
||||
class HeaderFooter;
|
||||
class Plotter;
|
||||
class CartesianAxis;
|
||||
class Legend;
|
||||
class BarDiagram;
|
||||
}
|
||||
|
||||
class KAction;
|
||||
class KRecentFilesAction;
|
||||
|
||||
#ifdef HAVE_KGRAPHVIEWER
|
||||
namespace KGraphViewer {
|
||||
class KGraphViewerInterface;
|
||||
}
|
||||
#endif
|
||||
|
||||
namespace Massif {
|
||||
|
||||
class FilteredDataTreeModel;
|
||||
class DataTreeModel;
|
||||
class SnapshotItem;
|
||||
class TreeLeafItem;
|
||||
|
||||
class MainWindow : public KParts::MainWindow
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
MainWindow(QWidget* parent = 0, Qt::WindowFlags f = 0);
|
||||
virtual ~MainWindow();
|
||||
|
||||
void setupActions();
|
||||
|
||||
public slots:
|
||||
/**
|
||||
* Open a dialog to pick a massif output file(s) to display.
|
||||
*/
|
||||
void openFile();
|
||||
|
||||
/**
|
||||
* Opens @p file as massif output file and visualize it.
|
||||
*/
|
||||
void openFile(const KUrl& file);
|
||||
|
||||
/**
|
||||
* reload currently opened file
|
||||
*/
|
||||
void reloadCurrentFile();
|
||||
|
||||
/**
|
||||
* Close currently opened file.
|
||||
*/
|
||||
void closeCurrentFile();
|
||||
|
||||
private slots:
|
||||
void closeRequested();
|
||||
void closeFileTab(int idx);
|
||||
|
||||
void preferences();
|
||||
void settingsChanged();
|
||||
|
||||
void treeSelectionChanged(const QModelIndex& now, const QModelIndex& before);
|
||||
void selectPeakSnapshot();
|
||||
void modelItemSelected(const Massif::ModelItem& item);
|
||||
void contextMenuRequested(const Massif::ModelItem& item, QMenu* menu);
|
||||
|
||||
void documentChanged();
|
||||
|
||||
void allocatorsChanged();
|
||||
void allocatorSelectionChanged();
|
||||
void dataTreeContextMenuRequested(const QPoint &pos);
|
||||
void slotNewAllocator();
|
||||
void slotRemoveAllocator();
|
||||
/// operates on data of @c m_markCustomAllocator
|
||||
void slotMarkCustomAllocator();
|
||||
void allocatorViewContextMenuRequested(const QPoint &pos);
|
||||
|
||||
void slotShortenTemplates(bool);
|
||||
|
||||
private:
|
||||
void updateWindowTitle();
|
||||
|
||||
// Helper
|
||||
Ui::MainWindow ui;
|
||||
|
||||
KRecentFilesAction* m_recentFiles;
|
||||
|
||||
KAction* m_close;
|
||||
|
||||
QStringListModel* m_allocatorModel;
|
||||
KAction* m_newAllocator;
|
||||
KAction* m_removeAllocator;
|
||||
KAction* m_markCustomAllocator;
|
||||
|
||||
KAction* m_shortenTemplates;
|
||||
KAction* m_selectPeak;
|
||||
|
||||
DocumentWidget* m_currentDocument;
|
||||
|
||||
Massif::DataTreeModel* m_dataTreeModel;
|
||||
Massif::FilteredDataTreeModel* m_dataTreeFilterModel;
|
||||
bool m_settingSelection;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif // MASSIF_MAINWINDOW_H
|
169
massif-visualizer/app/mainwindow.ui
Normal file
169
massif-visualizer/app/mainwindow.ui
Normal file
|
@ -0,0 +1,169 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>MainWindow</class>
|
||||
<widget class="QMainWindow" name="MainWindow">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>800</width>
|
||||
<height>600</height>
|
||||
</rect>
|
||||
</property>
|
||||
<widget class="QWidget" name="centralwidget">
|
||||
<layout class="QVBoxLayout" name="verticalLayout_4">
|
||||
<property name="leftMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<item>
|
||||
<widget class="QStackedWidget" name="stackedWidget">
|
||||
<property name="currentIndex">
|
||||
<number>1</number>
|
||||
</property>
|
||||
<widget class="QWidget" name="displayPage">
|
||||
<layout class="QVBoxLayout" name="verticalLayout_6">
|
||||
<item>
|
||||
<widget class="QTabWidget" name="documents">
|
||||
<property name="currentIndex">
|
||||
<number>-1</number>
|
||||
</property>
|
||||
<property name="documentMode">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<widget class="QWidget" name="openPage">
|
||||
<layout class="QVBoxLayout" name="verticalLayout_7">
|
||||
<item>
|
||||
<spacer name="verticalSpacer">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Vertical</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>20</width>
|
||||
<height>252</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QWidget" name="widget" native="true">
|
||||
<layout class="QHBoxLayout" name="horizontalLayout">
|
||||
<item>
|
||||
<widget class="QToolButton" name="openFile">
|
||||
<property name="text">
|
||||
<string>...</string>
|
||||
</property>
|
||||
<property name="toolButtonStyle">
|
||||
<enum>Qt::ToolButtonTextUnderIcon</enum>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<spacer name="verticalSpacer_2">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Vertical</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>20</width>
|
||||
<height>40</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<widget class="QMenuBar" name="menubar">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>800</width>
|
||||
<height>19</height>
|
||||
</rect>
|
||||
</property>
|
||||
</widget>
|
||||
<widget class="QStatusBar" name="statusbar"/>
|
||||
<widget class="QDockWidget" name="dataTreeDock">
|
||||
<property name="windowTitle">
|
||||
<string>Massif Data</string>
|
||||
</property>
|
||||
<attribute name="dockWidgetArea">
|
||||
<number>2</number>
|
||||
</attribute>
|
||||
<widget class="QWidget" name="dockWidgetContents">
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<item>
|
||||
<widget class="KLineEdit" name="filterDataTree">
|
||||
<property name="urlDropsEnabled" stdset="0">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<property name="clickMessage" stdset="0">
|
||||
<string>filter</string>
|
||||
</property>
|
||||
<property name="showClearButton" stdset="0">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QTreeView" name="dataTreeView"/>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</widget>
|
||||
<widget class="QDockWidget" name="allocatorDock">
|
||||
<property name="windowTitle">
|
||||
<string>Custom Allocators</string>
|
||||
</property>
|
||||
<attribute name="dockWidgetArea">
|
||||
<number>2</number>
|
||||
</attribute>
|
||||
<widget class="QWidget" name="dockWidgetContents_2">
|
||||
<layout class="QVBoxLayout" name="verticalLayout_5">
|
||||
<item>
|
||||
<widget class="KToolBar" name="dockMenuBar" native="true"/>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QListView" name="allocatorView"/>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</widget>
|
||||
</widget>
|
||||
<customwidgets>
|
||||
<customwidget>
|
||||
<class>KLineEdit</class>
|
||||
<extends>QLineEdit</extends>
|
||||
<header>klineedit.h</header>
|
||||
</customwidget>
|
||||
<customwidget>
|
||||
<class>KToolBar</class>
|
||||
<extends>QWidget</extends>
|
||||
<header location="global">ktoolbar.h</header>
|
||||
<container>1</container>
|
||||
</customwidget>
|
||||
</customwidgets>
|
||||
<resources/>
|
||||
<connections/>
|
||||
</ui>
|
49
massif-visualizer/app/massif-visualizer-settings.kcfg
Normal file
49
massif-visualizer/app/massif-visualizer-settings.kcfg
Normal file
|
@ -0,0 +1,49 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<kcfg xmlns="http://www.kde.org/standards/kcfg/1.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://www.kde.org/standards/kcfg/1.0
|
||||
http://www.kde.org/standards/kcfg/1.0/kcfg.xsd">
|
||||
<group name="Settings">
|
||||
<entry name="PrettyCostPrecision" key="prettyCostPrecision" type="int">
|
||||
<default>1</default>
|
||||
<label>Cost Precision</label>
|
||||
<tooltip>Defines the number of places after the comma for memory costs shown in the application.</tooltip>
|
||||
</entry>
|
||||
<entry name="ShortenTemplates" key="shortenTemplates" type="bool">
|
||||
<default>0</default>
|
||||
<label>Shorten Templates</label>
|
||||
<tooltip>Defines whether identifiers of C++ template instantiations should be shortened by removing their template arguments.</tooltip>
|
||||
</entry>
|
||||
<entry name="LegendPosition" key="legendPosition" type="Enum">
|
||||
<default>EnumLegendPosition::Floating</default>
|
||||
<label>Legend Position</label>
|
||||
<tooltip>Defines the position of the legend relative to the plot.</tooltip>
|
||||
<choices label="PositionValue">
|
||||
<choice name="North"/>
|
||||
<choice name="East"/>
|
||||
<choice name="South"/>
|
||||
<choice name="West"/>
|
||||
<choice name="Floating"/>
|
||||
</choices>
|
||||
</entry>
|
||||
<entry name="LegendAlignment" key="legendAlignment" type="Enum">
|
||||
<default>EnumLegendAlignment::Center</default>
|
||||
<label>Legend Alignment</label>
|
||||
<tooltip>Defines the alignment of the legend.</tooltip>
|
||||
<choices label="AlignmentValue">
|
||||
<choice name="Left"/>
|
||||
<choice name="Center"/>
|
||||
<choice name="Right"/>
|
||||
<choice name="Top"/>
|
||||
<choice name="Bottom"/>
|
||||
</choices>
|
||||
</entry>
|
||||
<entry name="LegendFontSize" key="legendFontSize" type="int">
|
||||
<default>12</default>
|
||||
<min>6</min>
|
||||
<max>14</max>
|
||||
<label>Legend Font Size</label>
|
||||
<tooltip>Defines the font size used in the legend.</tooltip>
|
||||
</entry>
|
||||
</group>
|
||||
</kcfg>
|
8
massif-visualizer/app/massif-visualizer-settings.kcfgc
Normal file
8
massif-visualizer/app/massif-visualizer-settings.kcfgc
Normal file
|
@ -0,0 +1,8 @@
|
|||
File=massif-visualizer-settings.kcfg
|
||||
ClassName=Settings
|
||||
NameSpace=Massif
|
||||
Singleton=true
|
||||
UseEnumTypes=true
|
||||
SetUserTexts=true
|
||||
ItemAccessors=true
|
||||
Mutators=true
|
172
massif-visualizer/app/massif-visualizer.appdata.xml
Normal file
172
massif-visualizer/app/massif-visualizer.appdata.xml
Normal file
|
@ -0,0 +1,172 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<component type="desktop">
|
||||
<id>massif-visualizer.desktop</id>
|
||||
<metadata_license>CC0-1.0</metadata_license>
|
||||
<project_license>GPL-2.0+</project_license>
|
||||
<name>Massif-Visualizer</name>
|
||||
<name xml:lang="ca">Massif-Visualizer</name>
|
||||
<name xml:lang="cs">Massif-Visualizer</name>
|
||||
<name xml:lang="de">Massif-Visualizer</name>
|
||||
<name xml:lang="en-GB">Massif-Visualizer</name>
|
||||
<name xml:lang="es">Massif-Visualizer</name>
|
||||
<name xml:lang="gl">Visualizador de Massif</name>
|
||||
<name xml:lang="ko">Massif 시각화 도구</name>
|
||||
<name xml:lang="nl">Massif-Visualizer</name>
|
||||
<name xml:lang="pl">Wizualizacja-Massif</name>
|
||||
<name xml:lang="pt">Visualizador do Massif</name>
|
||||
<name xml:lang="pt-BR">Visualizador de Massif</name>
|
||||
<name xml:lang="sk">Massif-Visualizer</name>
|
||||
<name xml:lang="sv">Massif visualisering</name>
|
||||
<name xml:lang="uk">Візуалізатор Massif</name>
|
||||
<name xml:lang="x-test">xxMassif-Visualizerxx</name>
|
||||
<summary>A visualizer for Valgrind Massif data files.</summary>
|
||||
<summary xml:lang="ca">Un visualitzador pels fitxers de dades Massif del Valgrind.</summary>
|
||||
<summary xml:lang="de">Ein Programm zum Visualisieren von Massif-Datendateien.</summary>
|
||||
<summary xml:lang="en-GB">A visualiser for Valgrind Massif data files.</summary>
|
||||
<summary xml:lang="es">Un visualizador para archivos de datos Massif de Valgrind.</summary>
|
||||
<summary xml:lang="gl">Un visualizador para ficheiros de datos Massif de Valgrind.</summary>
|
||||
<summary xml:lang="ko">Valgrind의 massif 도구의 출력을 시각화합니다.</summary>
|
||||
<summary xml:lang="nl">Een programma voor het zichtbaar maken van gegevensbestanden van Valgrind Massif.</summary>
|
||||
<summary xml:lang="pl">Wizualizacja dla plików Valgrind Massif.</summary>
|
||||
<summary xml:lang="pt">Um visualizador dos ficheiros dos dados do Massif para o Valgrind.</summary>
|
||||
<summary xml:lang="pt-BR">Um visualizador para arquivos de dados Massif do Valgrind.</summary>
|
||||
<summary xml:lang="sv">Ett visualiseringsverktyg för utdata skapad av Valgrinds verktyg Massif</summary>
|
||||
<summary xml:lang="uk">Засіб візуалізації файлів даних Massif Valgrind.</summary>
|
||||
<summary xml:lang="x-test">xxA visualizer for Valgrind Massif data files.xx</summary>
|
||||
<description>
|
||||
<p>
|
||||
Massif Visualizer is a tool that - who'd guess that - visualizes massif data.
|
||||
You run your application in Valgrind with --tool=massif and then open the generated
|
||||
massif.out.%pid in the visualizer. Gzip or Bzip2 compressed massif files can also be
|
||||
opened transparently.
|
||||
</p>
|
||||
<p xml:lang="ca">Massif Visualizer és una eina que -com imagineu- visualitza les dades massif. Executeu l'aplicació en Valgrind amb --tool=massif i després obriu el massif.out.%pid generat en el visualitzador. Els fitxers massif comprimits amb gzip o bzip2 també es poden obrir de forma transparent.</p>
|
||||
<p xml:lang="en-GB">Massif Visualizer is a tool that - who'd guess that - visualises massif data. You run your application in Valgrind with --tool=massif and then open the generated massif.out.%pid in the visualiser. Gzip or Bzip2 compressed massif files can also be opened transparently.</p>
|
||||
<p xml:lang="es">Massif Visualizer es una herramienta que sirve para visualizar datos de Massif. Puede ejecutar una aplicación en Valgrind con «--tool=massif» y abrir a continuación en el visualizador el archivo «massif.out.%pid» generado. También se pueden abrir de forma transparente los archivos de Massif comprimidos con Gzip o Bzip2.</p>
|
||||
<p xml:lang="gl">Visualizador de Massif é unha ferramenta que, como o nome indica, permite visualizar datos Massif. Execute o seu programa en Valgrind usando a opción «--tool=massif» e a continuación abra o ficheiro «massif.out.%pid» xerado no visualizador. Tamén pode abrir ficheiros Massif comprimidos con Gzip ou Bzip2 de maneira transparente.</p>
|
||||
<p xml:lang="ko">Massif 시각화 도구는 massif 데이터를 표시합니다. Valgrind에서 프로그램을 실행시킬 때 --tool=massif 인자로 실행시키고, 생성된 massif.out.%pid 파일을 시각화 도구로 엽니다. Gzip/Bzip2 압축된 파일도 별도의 과정 없이 열 수 있습니다.</p>
|
||||
<p xml:lang="nl">Massif Visualizer is een hulpmiddel dat - u raad het - massif-gegevens visualiseert. U kunt uw toepassing in Valgrind uitvoeren met --tool=massif en dan de gegenereerde massif.out.%pid openen in het visualisatieprogramma. Gzip of Bzip2 gecomprimeerde massif-bestanden kunnen ook transparent geopend worden.</p>
|
||||
<p xml:lang="pl">Program do wizualizacji Massif jest narzędziem, które wizualizuje dane massif. Uruchamiasz swoją aplikację w Valgrind przy użyciu --tool=massif a następnie otwierasz utworzony massif.out.%pid w programie do wizualizacji. Można otwierać pliki massif skompresowane przy użyciu Gzip lub Bzip2.</p>
|
||||
<p xml:lang="pt">O Visualizador do Massif é uma ferramenta que, como é óbvio, apresenta dados do Massif. Você poderá executar a sua aplicação no Valgrind com a opção --tool=massif e depois abrir o ficheiro massif.out.%pid gerado no visualizador. Poderá abrir de forma transparente os ficheiros do Massif comprimidos com Gzip ou Bzip2.</p>
|
||||
<p xml:lang="pt-BR">O Visualizador de Massif é uma ferramenta que, como o nome sugere, visualiza dados Massif. Você pode executar seu aplicativo no Valgrind com a opção --tool=massif e depois abrir o arquivo massif.out.%pid gerado no visualizador. Os arquivos Massif compactados com Gzip ou Bzip2 podem ser abertos de forma transparente.</p>
|
||||
<p xml:lang="sv">Massif visualisering är ett verktyg som åskådliggöra data från Massif, som inte är svårt att gissa. Man kör sitt program i Valgrind med --tool=massif och öppnar den skapade massif.out.%pid i verktyget. Massif-filer komprimerade med gzip eller bzip2 kan också öppnas direkt.</p>
|
||||
<p xml:lang="uk">Візуалізатор Massif, яким би дивним це не здавалося, — засіб для візуалізації даних massif. Ви запускаєте вашу програму у Valgrind із параметром --tool=massif, а потім відкриваєте створений файл massif.out.%pid у засобі візуалізації. Передбачено прозоре відкриття файлів massif, запакованих за допомогою Gzip або Bzip2.</p>
|
||||
<p xml:lang="x-test">xxMassif Visualizer is a tool that - who'd guess that - visualizes massif data. You run your application in Valgrind with --tool=massif and then open the generated massif.out.%pid in the visualizer. Gzip or Bzip2 compressed massif files can also be opened transparently.xx</p>
|
||||
<p>Features:</p>
|
||||
<p xml:lang="ca">Característiques:</p>
|
||||
<p xml:lang="cs">Vlastnosti:</p>
|
||||
<p xml:lang="de">Funktionen:</p>
|
||||
<p xml:lang="en-GB">Features:</p>
|
||||
<p xml:lang="es">Funciones:</p>
|
||||
<p xml:lang="gl">Funcionalidades:</p>
|
||||
<p xml:lang="ko">기능:</p>
|
||||
<p xml:lang="nl">Kenmerken:</p>
|
||||
<p xml:lang="pl">Możliwości:</p>
|
||||
<p xml:lang="pt">Funcionalidades:</p>
|
||||
<p xml:lang="pt-BR">Funcionalidades:</p>
|
||||
<p xml:lang="sk">Funkcie:</p>
|
||||
<p xml:lang="sv">Funktioner:</p>
|
||||
<p xml:lang="uk">Можливості:</p>
|
||||
<p xml:lang="x-test">xxFeatures:xx</p>
|
||||
<ul>
|
||||
<li>Interactive chart of memory consumption over time.</li>
|
||||
<li xml:lang="ca">Gràfic interactiu del consum de memòria al llarg del temps.</li>
|
||||
<li xml:lang="de">Interaktive Diagramme des Speicherverbrauch über Zeiträume.</li>
|
||||
<li xml:lang="en-GB">Interactive chart of memory consumption over time.</li>
|
||||
<li xml:lang="es">Mapa interactivo del consumo de memoria a lo largo del tiempo.</li>
|
||||
<li xml:lang="gl">Gráfica interactiva de consumo de memoria no tempo.</li>
|
||||
<li xml:lang="ko">시간별 메모리 사용량 차트 표시.</li>
|
||||
<li xml:lang="nl">Interactieve grafiek van geheugengebruik in de tijd.</li>
|
||||
<li xml:lang="pl">Interaktywny wykres wykorzystania pamięci w czasie.</li>
|
||||
<li xml:lang="pt">Gráfico interactivo do consumo de memória ao longo do tempo.</li>
|
||||
<li xml:lang="pt-BR">Gráfico interativo do consumo de memória usada pelo aplicativo.</li>
|
||||
<li xml:lang="sv">Interaktivt diagram av minnesanvändning över tid.</li>
|
||||
<li xml:lang="uk">Інтерактивна діаграма споживання пам’яті.</li>
|
||||
<li xml:lang="x-test">xxInteractive chart of memory consumption over time.xx</li>
|
||||
<li>Detailed snapshot analysis with callgraph visualization (requires KGraphViewer).</li>
|
||||
<li xml:lang="ca">Anàlisi detallat de les captures amb visualització de «callgraph» (requereix el KGraphViewer).</li>
|
||||
<li xml:lang="en-GB">Detailed snapshot analysis with callgraph visualisation (requires KGraphViewer).</li>
|
||||
<li xml:lang="es">Análisis detallado de instantáneas con visualización de «callgraph» (necesita KGraphViewer).</li>
|
||||
<li xml:lang="gl">Análise detallada de capturas con visualización da gráfica de chamadas (require KGraphViewer).</li>
|
||||
<li xml:lang="ko">호출 그래프 시각화 및 자세한 스냅샷 분석(KGraphViewer 필요).</li>
|
||||
<li xml:lang="nl">Gedetailleerde analyses van momentopnamen met callgraph-visualisatie (vereist KGraphViewer).</li>
|
||||
<li xml:lang="pl">Szczegółowe analizy zrzutów z wizualizacją wykresu wywołań (wymaga KGraphViewer).</li>
|
||||
<li xml:lang="pt">Análise detalhada das capturas com a visualização do grafo de chamadas (precisa do KGraphViewer).</li>
|
||||
<li xml:lang="pt-BR">Análise detalhada das capturas com a visualização do grafo de chamadas (é necessário o KGraphViewer).</li>
|
||||
<li xml:lang="sv">Detaljerad ögonblicksanalys med visualisering av anropsgraf (kräver Kgraphviewer).</li>
|
||||
<li xml:lang="uk">Докладний аналіз знімків із візуалізацією графу викликів (потребує KGraphViewer).</li>
|
||||
<li xml:lang="x-test">xxDetailed snapshot analysis with callgraph visualization (requires KGraphViewer).xx</li>
|
||||
<li>Summary of peak memory consumption of all allocating functions.</li>
|
||||
<li xml:lang="ca">Resum dels pics de consum de memòria de totes les funcions d'assignació.</li>
|
||||
<li xml:lang="en-GB">Summary of peak memory consumption of all allocating functions.</li>
|
||||
<li xml:lang="es">Sumario de picos de consumo de memoria de todas las funciones de asignación.</li>
|
||||
<li xml:lang="gl">Resumo dos picos de consumo de memoria de todas as funcións de reserva de memoria.</li>
|
||||
<li xml:lang="ko">모든 할당된 함수의 메모리 소모 요약.</li>
|
||||
<li xml:lang="nl">Overzicht van pieken in geheugengebruik van alle functies voor toekennen.</li>
|
||||
<li xml:lang="pl">Podsumowanie szczytowego wykorzystania pamięci wszystkich przydzielonych funkcji.</li>
|
||||
<li xml:lang="pt">Resumo do consumo de pico da memória de todas as funções de alocação.</li>
|
||||
<li xml:lang="pt-BR">Resumo do consumo de pico da memória de todas as funções de alocação.</li>
|
||||
<li xml:lang="sv">Sammanfattning av största minnesanvändning för alla allokerande funktioner.</li>
|
||||
<li xml:lang="uk">Резюме щодо пікового споживання пам’яті для всіх функцій отримання об’ємів пам’яті.</li>
|
||||
<li xml:lang="x-test">xxSummary of peak memory consumption of all allocating functions.xx</li>
|
||||
</ul>
|
||||
</description>
|
||||
<url type="homepage">projects.kde.org/massif-visualizer</url>
|
||||
<url type="bugtracker">https://bugs.kde.org/enter_bug.cgi?format=guided&product=massif-visualizer</url>
|
||||
<url type="help">https://mail.kde.org/mailman/listinfo/massif-visualizer</url>
|
||||
<screenshots>
|
||||
<screenshot type="default">
|
||||
<image>http://milianw.de/files/massif-visualizer/memory-chart.png</image>
|
||||
<caption>Interactive chart of memory consumption over time.</caption>
|
||||
<caption xml:lang="ca">Gràfic interactiu del consum de memòria al llarg del temps.</caption>
|
||||
<caption xml:lang="de">Interaktive Diagramme des Speicherverbrauch über Zeiträume.</caption>
|
||||
<caption xml:lang="en-GB">Interactive chart of memory consumption over time.</caption>
|
||||
<caption xml:lang="es">Mapa interactivo del consumo de memoria a lo largo del tiempo.</caption>
|
||||
<caption xml:lang="gl">Gráfica interactiva de consumo de memoria no tempo.</caption>
|
||||
<caption xml:lang="ko">시간별 메모리 사용량 차트 표시.</caption>
|
||||
<caption xml:lang="nl">Interactieve grafiek van geheugengebruik in de tijd.</caption>
|
||||
<caption xml:lang="pl">Interaktywny wykres wykorzystania pamięci w czasie.</caption>
|
||||
<caption xml:lang="pt">Gráfico interactivo do consumo de memória ao longo do tempo.</caption>
|
||||
<caption xml:lang="pt-BR">Gráfico interativo do consumo de memória usada pelo aplicativo.</caption>
|
||||
<caption xml:lang="sv">Interaktivt diagram av minnesanvändning över tid.</caption>
|
||||
<caption xml:lang="uk">Інтерактивна діаграма споживання пам’яті.</caption>
|
||||
<caption xml:lang="x-test">xxInteractive chart of memory consumption over time.xx</caption>
|
||||
</screenshot>
|
||||
<screenshot>
|
||||
<image>http://milianw.de/files/massif-visualizer/callgraph.png</image>
|
||||
<caption>Detailed snapshot analysis with callgraph visualization (requires KGraphViewer).</caption>
|
||||
<caption xml:lang="ca">Anàlisi detallat de les captures amb visualització de «callgraph» (requereix el KGraphViewer).</caption>
|
||||
<caption xml:lang="en-GB">Detailed snapshot analysis with callgraph visualisation (requires KGraphViewer).</caption>
|
||||
<caption xml:lang="es">Análisis detallado de instantáneas con visualización de «callgraph» (necesita KGraphViewer).</caption>
|
||||
<caption xml:lang="gl">Análise detallada de capturas con visualización da gráfica de chamadas (require KGraphViewer).</caption>
|
||||
<caption xml:lang="ko">호출 그래프 시각화 및 자세한 스냅샷 분석(KGraphViewer 필요).</caption>
|
||||
<caption xml:lang="nl">Gedetailleerde analyses van momentopnamen met callgraph-visualisatie (vereist KGraphViewer).</caption>
|
||||
<caption xml:lang="pl">Szczegółowe analizy zrzutów z wizualizacją wykresu wywołań (wymaga KGraphViewer).</caption>
|
||||
<caption xml:lang="pt">Análise detalhada das capturas com a visualização do grafo de chamadas (precisa do KGraphViewer).</caption>
|
||||
<caption xml:lang="pt-BR">Análise detalhada das capturas com a visualização do grafo de chamadas (é necessário o KGraphViewer).</caption>
|
||||
<caption xml:lang="sv">Detaljerad ögonblicksanalys med visualisering av anropsgraf (kräver Kgraphviewer).</caption>
|
||||
<caption xml:lang="uk">Докладний аналіз знімків із візуалізацією графу викликів (потребує KGraphViewer).</caption>
|
||||
<caption xml:lang="x-test">xxDetailed snapshot analysis with callgraph visualization (requires KGraphViewer).xx</caption>
|
||||
</screenshot>
|
||||
<screenshot>
|
||||
<image>http://milianw.de/files/massif-visualizer/allocators.png</image>
|
||||
<caption>Summary of peak memory consumption of all allocating functions.</caption>
|
||||
<caption xml:lang="ca">Resum dels pics de consum de memòria de totes les funcions d'assignació.</caption>
|
||||
<caption xml:lang="en-GB">Summary of peak memory consumption of all allocating functions.</caption>
|
||||
<caption xml:lang="es">Sumario de picos de consumo de memoria de todas las funciones de asignación.</caption>
|
||||
<caption xml:lang="gl">Resumo dos picos de consumo de memoria de todas as funcións de reserva de memoria.</caption>
|
||||
<caption xml:lang="ko">모든 할당된 함수의 메모리 소모 요약.</caption>
|
||||
<caption xml:lang="nl">Overzicht van pieken in geheugengebruik van alle functies voor toekennen.</caption>
|
||||
<caption xml:lang="pl">Podsumowanie szczytowego wykorzystania pamięci wszystkich przydzielonych funkcji.</caption>
|
||||
<caption xml:lang="pt">Resumo do consumo de pico da memória de todas as funções de alocação.</caption>
|
||||
<caption xml:lang="pt-BR">Resumo do consumo de pico da memória de todas as funções de alocação.</caption>
|
||||
<caption xml:lang="sv">Sammanfattning av största minnesanvändning för alla allokerande funktioner.</caption>
|
||||
<caption xml:lang="uk">Резюме щодо пікового споживання пам’яті для всіх функцій отримання об’ємів пам’яті.</caption>
|
||||
<caption xml:lang="x-test">xxSummary of peak memory consumption of all allocating functions.xx</caption>
|
||||
</screenshot>
|
||||
</screenshots>
|
||||
<project_group>KDE</project_group>
|
||||
<provides>
|
||||
<binary>massif-visualizer</binary>
|
||||
</provides>
|
||||
</component>
|
112
massif-visualizer/app/massif-visualizer.desktop
Normal file
112
massif-visualizer/app/massif-visualizer.desktop
Normal file
|
@ -0,0 +1,112 @@
|
|||
# KDE Config File
|
||||
[Desktop Entry]
|
||||
Type=Application
|
||||
Exec=massif-visualizer %u
|
||||
MimeType=application/x-valgrind-massif;
|
||||
# FIXME: get an icon!
|
||||
Icon=office-chart-area
|
||||
# FIXME: write docs!
|
||||
# X-DocPath=kcachegrind/index.html
|
||||
Terminal=false
|
||||
Name=Massif-Visualizer
|
||||
Name[ast]=Massif-Visualizer
|
||||
Name[bs]=Massif-Visualizer
|
||||
Name[ca]=Massif-Visualizer
|
||||
Name[ca@valencia]=Massif-Visualizer
|
||||
Name[da]=Massif-Visualizer
|
||||
Name[de]=Massif-Visualizer
|
||||
Name[el]=Massif-Visualizer
|
||||
Name[en_GB]=Massif-Visualizer
|
||||
Name[es]=Visualizador Massif
|
||||
Name[et]=Massif-Visualizer
|
||||
Name[fi]=Massif-visualisointi
|
||||
Name[fr]=Massif-Visualizer
|
||||
Name[ga]=Amharcléiritheoir Massif
|
||||
Name[gl]=Visualizador Massif
|
||||
Name[hu]=Massif-megjelenítő
|
||||
Name[it]=Visualizzatore Massif
|
||||
Name[kk]=Massif визуализаторы
|
||||
Name[ko]=Massif 시각화 도구
|
||||
Name[mr]=मास्सीफ-व्हिज्युअलायझर
|
||||
Name[nb]=Massif visualisering
|
||||
Name[nds]=Massif-Visualiserer
|
||||
Name[nl]=Massif - programma voor visualiseren
|
||||
Name[pl]=Wizualizacja-Massif
|
||||
Name[pt]=Visualizador Massif
|
||||
Name[pt_BR]=Massif-Visualizer
|
||||
Name[ru]=Визуализатор Massif
|
||||
Name[sk]=Massif-Visualizer
|
||||
Name[sv]=Massif visualisering
|
||||
Name[tr]=Massif-Görselleyici
|
||||
Name[ug]=Massif-Visualizer
|
||||
Name[uk]=Візуалізатор Massif
|
||||
Name[x-test]=xxMassif-Visualizerxx
|
||||
Name[zh_TW]=Massif-Visualizer
|
||||
GenericName=Profiler Frontend
|
||||
GenericName[bs]=Profajlerski program
|
||||
GenericName[ca]=Frontal de l'analitzador del rendiment
|
||||
GenericName[ca@valencia]=Frontal del Profiler
|
||||
GenericName[cs]=Rozhraní pro profilaci
|
||||
GenericName[da]=Grænseflade til profilering
|
||||
GenericName[de]=Profiler-Oberfläche
|
||||
GenericName[el]=Σύστημα περιβάλλοντος προφίλ
|
||||
GenericName[en_GB]=Profiler Frontend
|
||||
GenericName[es]=Interfaz del analizador
|
||||
GenericName[et]=Profileerimisrakendus
|
||||
GenericName[fi]=Profiloijan käyttöliittymä
|
||||
GenericName[fr]=Interface de profilage
|
||||
GenericName[ga]=Comhéadan ar Phróifíleoir
|
||||
GenericName[gl]=Interface do analizador
|
||||
GenericName[hu]=Ábrázoló előtétprogram
|
||||
GenericName[it]=Frontend dell'analizzatore di prestazioni
|
||||
GenericName[kk]=Profiler-дың интерфейсі
|
||||
GenericName[ko]=프로파일러 프론트엔드
|
||||
GenericName[mr]=प्रोफाइलर फ्रंटएण्ड
|
||||
GenericName[nb]=Grensesnitt for profilvisning
|
||||
GenericName[nds]=Profiler-Böversiet
|
||||
GenericName[nl]=Profiler-hulpprogramma
|
||||
GenericName[pl]=Nakładka programu profilującego
|
||||
GenericName[pt]=Interface de Análise de Performance
|
||||
GenericName[pt_BR]=Frontend do Profiler (Analisador)
|
||||
GenericName[ru]=Представитель данных профилировщика
|
||||
GenericName[sk]=Rozhranie pre profiláciu
|
||||
GenericName[sv]=Profileringsgränssnitt
|
||||
GenericName[tr]=Profil Önyüzü
|
||||
GenericName[uk]=Інтерфейс до Profiler
|
||||
GenericName[x-test]=xxProfiler Frontendxx
|
||||
GenericName[zh_TW]=分析器前端
|
||||
Comment=Visualization of Memory Profiling Data
|
||||
Comment[bs]=Vizualizacija memorijsko profilizirajućih podatka
|
||||
Comment[ca]=Visualització de les dades de l'anàlisi del rendiment de la memòria
|
||||
Comment[ca@valencia]=Visualització de dades de perfilat de la memòria
|
||||
Comment[cs]=Vizualizace dat profilování paměti
|
||||
Comment[da]=Visualisering af data for hukommelsesprofilering
|
||||
Comment[de]=Visualisierung von Daten des Speicherverhaltens eines Programms
|
||||
Comment[el]=Οπτικοποίηση δεδομένων προφίλ μνήμης
|
||||
Comment[en_GB]=Visualization of Memory Profiling Data
|
||||
Comment[es]=Visualización de datos de análisis de memoria
|
||||
Comment[et]=Mälu profileerimise andmete visualiseerimise vahend
|
||||
Comment[fi]=Visualisointi muistiprofiloinnin tiedoista
|
||||
Comment[fr]=Visualisation des données de profilage de la mémoire
|
||||
Comment[ga]=Amharcléiriú ar Shonraí Próifílithe Chuimhne
|
||||
Comment[gl]=Visualización dos datos da análise de rendemento
|
||||
Comment[hu]=Memória adatábrázolás megjelenítése
|
||||
Comment[it]=Visualizzazione dei dati di profiling della memoria
|
||||
Comment[kk]=Жадын профильдеу деректерінің визуализаторы
|
||||
Comment[ko]=메모리 프로파일링 데이터 시각화
|
||||
Comment[mr]=स्मृती प्रोफाइलिंग डेटाचे व्हिज्युअलायझेशन
|
||||
Comment[nb]=Visualisering av minneprofileringsdata
|
||||
Comment[nds]=Spiekerleisten-Looptietdaten sichtbor maken
|
||||
Comment[nl]=Visualisatie van geheugenprofileringsgegevens
|
||||
Comment[pl]=Wizualizacja danych profilowania pamięci
|
||||
Comment[pt]=Visualização dos Dados de Performance da Memória
|
||||
Comment[pt_BR]=Visualização de Dados de Análise da Memória
|
||||
Comment[ru]=Визуализация данных потребления памяти
|
||||
Comment[sk]=Vizualizácia dát profilovania pamäte
|
||||
Comment[sv]=Visualisering av profileringsdata för minne
|
||||
Comment[tr]=Bellek Profilleme Verisinin Görselleştirilmesi
|
||||
Comment[ug]=ئىچكى ساقلغۇچتىكى سانلىق-مەلۇماتلارنىڭ سەپلىنىشىنى سۈرۈتلەشتۈرۈش
|
||||
Comment[uk]=Візуалізація даних профілювання пам’яті
|
||||
Comment[x-test]=xxVisualization of Memory Profiling Dataxx
|
||||
Comment[zh_TW]=記憶體效能分析資料視覺化
|
||||
Categories=Qt;KDE;Development;
|
55
massif-visualizer/app/massif-visualizerui.rc
Normal file
55
massif-visualizer/app/massif-visualizerui.rc
Normal file
|
@ -0,0 +1,55 @@
|
|||
<!DOCTYPE kpartgui SYSTEM "kpartgui.dtd">
|
||||
<kpartgui name="massif-visualizer" version="10">
|
||||
|
||||
<MenuBar>
|
||||
<Menu name="file"><text>&File</text>
|
||||
<Action name="file_open"/>
|
||||
<Action name="file_open_recent"/>
|
||||
<Action name="file_reload"/>
|
||||
<Separator/>
|
||||
<DefineGroup name="file_saveas_merge" append="file_saveas_merge"/>
|
||||
<Separator/>
|
||||
<Action name="file_close"/>
|
||||
<Separator/>
|
||||
<Action name="file_quit"/>
|
||||
<DefineGroup name="close_merge" append="close_merge"/>
|
||||
</Menu>
|
||||
|
||||
<Menu name="view">
|
||||
<text>&View</text>
|
||||
<Action name="selectPeak"/>
|
||||
</Menu>
|
||||
|
||||
<Menu name="settings"><text>&Settings</text>
|
||||
<Merge name="StandardToolBarMenuHandler" />
|
||||
<Menu name="dockWidgets"><text>&Dock Widgets</text>
|
||||
<Action name="toggleDataTree" />
|
||||
<Action name="toggleAllocators" />
|
||||
</Menu>
|
||||
<DefineGroup name="show_toolbar_merge" />
|
||||
<Action name="set_configure_toolbars" />
|
||||
<Action name="settings_configure" />
|
||||
</Menu>
|
||||
|
||||
<Menu name="help"><text>&Help</text>
|
||||
<Action name="help_whats_this"/>
|
||||
<Separator/>
|
||||
<Action name="help_report_bug"/>
|
||||
<Separator/>
|
||||
<Action name="help_about_app"/>
|
||||
<Action name="help_about_editor"/>
|
||||
<Action name="help_about_kde"/>
|
||||
</Menu>
|
||||
</MenuBar>
|
||||
|
||||
<ToolBar name="mainToolBar"><text>Main Toolbar</text>
|
||||
<Action name="file_open" />
|
||||
<Action name="file_close" />
|
||||
<Separator />
|
||||
<Action name="shorten_templates" />
|
||||
<Separator />
|
||||
<Action name="selectPeak"/>
|
||||
<Separator />
|
||||
</ToolBar>
|
||||
|
||||
</kpartgui>
|
11
massif-visualizer/app/massif.xml
Normal file
11
massif-visualizer/app/massif.xml
Normal file
|
@ -0,0 +1,11 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<mime-info xmlns="http://www.freedesktop.org/standards/shared-mime-info">
|
||||
<mime-type type="application/x-valgrind-massif">
|
||||
<sub-class-of type="text/plain"/>
|
||||
<comment>Valgrind Massif data file</comment>
|
||||
<magic priority="50">
|
||||
<match value="desc: " type="string" offset="0"/>
|
||||
</magic>
|
||||
<glob pattern="massif.out.*"/>
|
||||
</mime-type>
|
||||
</mime-info>
|
41
massif-visualizer/cmake/FindKGraphViewer.cmake
Normal file
41
massif-visualizer/cmake/FindKGraphViewer.cmake
Normal file
|
@ -0,0 +1,41 @@
|
|||
#
|
||||
# Find the KGraphViewer library and sets various variables accordingly
|
||||
#
|
||||
# Example usage of this module:
|
||||
# find_package(KGraphViewer 2.1 REQUIRED)
|
||||
#
|
||||
# The version number and REQUIRED flag are optional. You can set CMAKE_PREFIX_PATH
|
||||
# variable to help it find the required files and directories
|
||||
#
|
||||
# this will set the following variables:
|
||||
# KGRAPHVIEWER_LIBRARIES - KGraphViewer library
|
||||
# KGRAPHVIEWER_FOUND - Whether KGraphViewer was found
|
||||
# KGRAPHVIEWER_INCLUDE_DIRECTORIES - Include directories for the KGraphViewer library
|
||||
#
|
||||
# Copyright 2010 Milian Wolff <mail@milianw.de>
|
||||
# Redistribution and use is allowed according to the terms of the BSD license.
|
||||
|
||||
find_path( KGRAPHVIEWER_INCLUDE_DIRECTORIES
|
||||
NAMES kgraphviewer_interface.h
|
||||
HINTS
|
||||
${KGRAPHVIEWER_INCLUDE_DIRS}
|
||||
/usr/local/include
|
||||
/usr/include
|
||||
PATH_SUFFIXES kgraphviewer
|
||||
)
|
||||
|
||||
find_library( KGRAPHVIEWER_LIBRARIES
|
||||
NAMES kgraphviewer
|
||||
HINTS
|
||||
${KGRAPHVIEWER_LIBRARY_DIRS}
|
||||
/usr/local/lib64
|
||||
/usr/lib64
|
||||
/usr/local/lib
|
||||
/usr/lib
|
||||
)
|
||||
|
||||
include(FindPackageHandleStandardArgs)
|
||||
|
||||
# handle the QUIETLY and REQUIRED arguments and set KGRAPHVIEWER_FOUND to TRUE if
|
||||
# all listed variables are TRUE
|
||||
find_package_handle_standard_args(KGRAPHVIEWER DEFAULT_MSG KGRAPHVIEWER_LIBRARIES KGRAPHVIEWER_INCLUDE_DIRECTORIES)
|
3
massif-visualizer/kdchart/CMakeLists.txt
Normal file
3
massif-visualizer/kdchart/CMakeLists.txt
Normal file
|
@ -0,0 +1,3 @@
|
|||
add_subdirectory(src)
|
||||
|
||||
|
1027
massif-visualizer/kdchart/LICENSE.GPL.txt
Normal file
1027
massif-visualizer/kdchart/LICENSE.GPL.txt
Normal file
File diff suppressed because it is too large
Load diff
148
massif-visualizer/kdchart/LICENSE.US.txt
Normal file
148
massif-visualizer/kdchart/LICENSE.US.txt
Normal file
|
@ -0,0 +1,148 @@
|
|||
KD Chart COMMERCIAL LICENSE AGREEMENT
|
||||
FOR COMMERCIAL VERSIONS
|
||||
March 27, 2002
|
||||
|
||||
|
||||
IMPORTANT-READ CAREFULLY: This Klaralvdalens Datakonsult AB End-User
|
||||
License Agreement ("EULA") is a legal agreement between you (either an
|
||||
individual or a legal entity) and Klaralvdalens Datakonsult AB
|
||||
("KDAB") for the Klaralvdalens Datakonsult AB software product(s)
|
||||
accompanying this EULA, which include(s) computer software and may
|
||||
include "online" or electronic documentation, associated media, and
|
||||
printed materials ("Licensed Product").
|
||||
|
||||
The Licensed Product is protected by copyright laws and international
|
||||
copyright treaties, as well as other intellectual property laws and
|
||||
treaties. The Licensed Product is licensed, not sold.
|
||||
|
||||
By installing, copying, or otherwise using the Licensed Product, you
|
||||
agree to be bound by the terms of this EULA. If you do not agree to
|
||||
the terms of this EULA, do not install, copy, or otherwise use the
|
||||
Licensed Product; you may, however, return it to your place of
|
||||
purchase for a full refund. In addition, by installing, copying, or
|
||||
otherwise using any updates or other components of the Licensed
|
||||
Product that you receive separately as part of the Licensed Product
|
||||
("Updates"), you agree to be bound by any additional license terms
|
||||
that accompany such Updates. If you do not agree to the additional
|
||||
license terms that accompany such Updates, you may not install, copy,
|
||||
or otherwise use such Updates.
|
||||
|
||||
Upon your acceptance of the terms and conditions of this EULA, KDAB
|
||||
grants you the right to use the Licensed Product in the manner
|
||||
provided below.
|
||||
|
||||
KDAB grants to you as an individual a personal, nonexclusive,
|
||||
nontransferable license to make and use copies of the Licensed Product
|
||||
for the sole purposes of designing, developing, and testing your
|
||||
software product(s) ("Applications"). You may install copies of the
|
||||
Licensed Product on an unlimited number of computers provided that you
|
||||
are the only individual using the Licensed Product. If you are an
|
||||
entity, KDAB grants you the right to designate one, and only one,
|
||||
individual within your organization who shall have the sole right to
|
||||
use the Licensed Product in the manner provided above. You may at any
|
||||
time, but not more frequently that once every six (6) months,
|
||||
designate another individual to replace the current designated user by
|
||||
notifying KDAB, so long as there is no more than one designated user
|
||||
at any given time.
|
||||
|
||||
|
||||
GENERAL TERMS THAT APPLY TO APPLICATIONS AND REDISTRIBUTABLES
|
||||
KDAB grants you a nonexclusive, royalty-free right to reproduce and
|
||||
distribute the object code form of any portion of the Licensed Product
|
||||
("Redistributables") for execution on any operating system of a type
|
||||
listed in the License Certificate ("Platforms"). Copies of
|
||||
Redistributables may only be distributed with and for the sole purpose
|
||||
of executing Applications permitted under this License Agreement that
|
||||
you have created using the Licensed Product. Under no circumstances
|
||||
may any copies of Redistributables be distributed separately.
|
||||
|
||||
The license granted in this EULA for you to create your own
|
||||
Applications and distribute them and the Redistributables (if any) to
|
||||
your customers is subject to all of the following conditions: (i) all
|
||||
copies of the Applications you create must bear a valid copyright
|
||||
notice, either your own or the copyright notice that appears on the
|
||||
Licensed Product; (ii) you may not remove or alter any copyright,
|
||||
trademark or other proprietary rights notice contained in any portion
|
||||
of the Licensed Product; (iii) Redistributables, if any, shall be
|
||||
licensed to your customer "as is" (KDAB MAKES NO WARRANTIES OR
|
||||
REPRESENTATIONS VIS-A-VIS YOUR CUSTOMER WITH RESPECT TO
|
||||
REDISTRIBUTABLES, AND KDAB EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES
|
||||
VIS-A-VIS YOUR CUSTOMER, WHETHER EXPRESS OR IMPLIED, ORAL OR WRITTEN,
|
||||
INCLUDING, BUT NOT LIMITED TO ANY IMPLIED WARRANTY OF MERCHANTABILITY
|
||||
OR FITNESS FOR ANY PARTICULAR PURPOSE, WHETHER OR NOT KDAB KNOWS, HAS
|
||||
REASON TO KNOW, HAS BEEN ADVISED OR IS OTHERWISE AWARE OF SUCH
|
||||
PURPOSE); (iv) you will indemnify and hold KDAB, its related companies
|
||||
and its suppliers, harmless from and against any claims or liabilities
|
||||
arising out of the use, reproduction or distribution of your
|
||||
Applications; (v) your Applications must be written using a licensed,
|
||||
registered copy of the Licensed Product; (vi) your Applications must
|
||||
add primary and substantial functionality to the Licensed Product;
|
||||
(vii) your Applications may not pass on functionality which in any way
|
||||
makes it possible for others to create Applications with the Software;
|
||||
(viii) your Applications may not compete with the Licensed Product;
|
||||
(ix)) you may not use KDAB's or any of its suppliers' names, logos, or
|
||||
trademarks to market your programs, except to state that your program
|
||||
was written using the Licensed Product.
|
||||
|
||||
LICENSEE'S BREACH OF CONTRACT
|
||||
In addition to penalties, other sanctions and the like as stated in
|
||||
the Swedish Copyright Act (1960:729), or successive legislation as it
|
||||
may appear, the Licensee agrees to pay a Contractual Fine in case of
|
||||
his/her/their breach of any of the above mentioned obligations,
|
||||
including but not limited to, the Licensee's obligation to let only
|
||||
one person per license use the Software as stated under above. The
|
||||
Contractual Fine is EUR 5000 and is payable by the Licensee to the
|
||||
Licenser immediately upon the Licenser having reasonably demonstrated
|
||||
that the Licensee is in breach of his obligations in this Agreement.
|
||||
|
||||
WARRANTY DISCLAIMER
|
||||
THE LICENSED PRODUCT IS LICENSED TO YOU "AS IS". TO THE MAXIMUM
|
||||
EXTENT PERMITTED BY APPLICABLE LAW, KDAB ON BEHALF OF ITSELF AND ITS
|
||||
SUPPLIERS, DISCLAIMS ALL WARRANTIES AND CONDITIONS, EITHER EXPRESS OR
|
||||
IMPLIED, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE AND
|
||||
NON-INFRINGEMENT WITH REGARD TO THE LICENSED PRODUCT. THIS WARRANTY
|
||||
DISCLAIMER NOTWITHSTANDING, YOU MAY HAVE SPECIFIC LEGAL RIGHTS WHICH
|
||||
MAY VARY FROM STATE/JURISDICTION TO STATE/JURISDICTION.
|
||||
|
||||
|
||||
LIMITATION OF LIABILITY
|
||||
IF, KDAB'S WARRANTY DISCLAIMER NOTWITHSTANDING, KDAB IS HELD LIABLE TO
|
||||
YOU, WHETHER IN CONTRACT, TORT OR ANY OTHER LEGAL THEORY, BASED ON THE
|
||||
LICENSED PRODUCT, KDAB'S ENTIRE LIABILITY TO YOU AND YOUR EXCLUSIVE
|
||||
REMEDY SHALL BE, AT KDAB'S OPTION, EITHER (A) RETURN OF THE PRICE YOU
|
||||
PAID FOR THE LICENSED PRODUCT, OR (B) REPAIR OR REPLACEMENT OF THE
|
||||
LICENSED PRODUCT, PROVIDED YOU RETURN TO KDAB ALL COPIES OF THE
|
||||
LICENSED PRODUCT AS ORIGINALLY DELIVERED TO YOU. KDAB SHALL NOT UNDER
|
||||
ANY CIRCUMSTANCES BE LIABLE TO YOU BASED ON FAILURE OF THE LICENSED
|
||||
PRODUCT IF THE FAILURE RESULTED FROM ACCIDENT, ABUSE OR
|
||||
MISAPPLICATION, NOR SHALL KDAB UNDER ANY CIRCUMSTANCES BE LIABLE FOR
|
||||
SPECIAL DAMAGES, PUNITIVE OR EXEMPLARY DAMAGES, DAMAGES FOR LOSS OF
|
||||
PROFITS OR INTERRUPTION OF BUSINESS OR FOR LOSS OR CORRUPTION OF DATA.
|
||||
ANY AWARD OF DAMAGES FROM KDAB TO YOU SHALL NOT EXCEED THE TOTAL AMOUNT
|
||||
YOU HAVE PAID TO KDAB IN CONNECTION WITH THIS EULA.
|
||||
|
||||
|
||||
SUPPORT AND UPDATES
|
||||
You will receive email based, software developer support and access to
|
||||
Updates to the Licensed Product for one year from the date of initial
|
||||
delivery, in accordance with KDAB support policies and procedures.
|
||||
Such policies and procedures may be changed from time to time.
|
||||
|
||||
|
||||
GENERAL PROVISIONS
|
||||
This EULA may only be modified in writing signed by you and an
|
||||
authorized officer of KDAB. All terms of any purchase order or other
|
||||
ordering document shall be superseded by this EULA. If any provision
|
||||
of the EULA is found void or unenforceable, the remainder will remain
|
||||
valid and enforceable according to its terms. If any remedy provided
|
||||
is determined to have failed for its essential purpose, all
|
||||
limitations of liability and exclusions of damages set forth in this
|
||||
EULA shall remain in effect.
|
||||
|
||||
This EULA shall be construed, interpreted and governed by the laws of
|
||||
Sweden, the venue to be Sunne Tingsratt. The EULA gives you specific
|
||||
legal rights; you may have others, which vary from state to state and
|
||||
from country to country. KDAB reserves all rights not specifically
|
||||
granted in this EULA.
|
||||
|
104
massif-visualizer/kdchart/LICENSE.txt
Normal file
104
massif-visualizer/kdchart/LICENSE.txt
Normal file
|
@ -0,0 +1,104 @@
|
|||
KD Chart COMMERCIAL LICENSE AGREEMENT
|
||||
FOR COMMERCIAL VERSIONS
|
||||
Version 1.0
|
||||
|
||||
Copyright of this license text (C) 2001 Trolltech AS and (C) 2002-2011
|
||||
Klaralvdalens Datakonsult AB. All rights reserved. License text used
|
||||
with kind permission of Trolltech AS. The software and accompanying
|
||||
material is Copyright (C) 2002-2011 Klaralvdalens Datakonsult AB.
|
||||
|
||||
This non-exclusive non-transferable License Agreement ("Agreement") is
|
||||
between you ("Licensee") and Klaralvdalens Datakonsult AB (KDAB), and
|
||||
pertains to the Klaralvdalens Datakonsult AB software product(s)
|
||||
accompanying this Agreement, which include(s) computer software and
|
||||
may include "online" or electronic documentation, associated media,
|
||||
and printed materials, including the source code, example programs and
|
||||
the documentation ("Software").
|
||||
|
||||
|
||||
COPYRIGHT AND RESTRICTIONS
|
||||
|
||||
1. All intellectual property rights in the Software are owned by KDAB
|
||||
and are protected by Swedish copyright laws, other applicable
|
||||
copyright laws, and international treaty provisions. KDAB retains all
|
||||
rights not expressly granted. No title, property rights or copyright
|
||||
in the Software or in any modifications to the Software shall pass to
|
||||
the Licensee under any circumstances. The Software is licensed, not
|
||||
sold.
|
||||
|
||||
2. By installing, copying, or otherwise using the Software, you agree
|
||||
to be bound by the terms of this agreement. If you do not agree to the
|
||||
terms of this Agreement, do not install, copy, or otherwise use the
|
||||
Software.
|
||||
|
||||
3. Upon your acceptance of the terms and conditions of this Agreement,
|
||||
KDAB grants you the right to use the Software in the manner provided
|
||||
below.
|
||||
|
||||
4. KDAB grants to you as an individual a personal, nonexclusive,
|
||||
non-transferable license to make and use copies of the Software for
|
||||
the sole purposes of designing, developing, testing and distributing
|
||||
your software product(s) ("Applications"). You may install copies of
|
||||
the Software on an unlimited number of computers provided that you are
|
||||
the only individual using the Software. If you are an entity, KDAB
|
||||
grants you the right to designate one, and only one, individual within
|
||||
your organization who shall have the sole right to use the Software in
|
||||
the manner provided above.
|
||||
|
||||
5. The license granted in this Agreement for you to create and
|
||||
distribute your own Applications is subject to all of the following
|
||||
conditions: (i) all copies of the Applications you create must bear a
|
||||
valid copyright notice, either your own or the copyright notice that
|
||||
appears on the Software; (ii) you may not remove or alter any
|
||||
copyright, trademark or other proprietary rights notice contained in
|
||||
any portion of the Software; (iii) you will indemnify and hold KDAB, its
|
||||
related companies and its suppliers, harmless from and against any
|
||||
claims or liabilities arising out of the use and/or reproduction of
|
||||
your Applications; (iv) your Applications must be written using a
|
||||
licensed, registered copy of the Software; (v) your Applications must
|
||||
add primary and substantial functionality to the Software; (vi) your
|
||||
Applications may not pass on functionality which in any way makes it
|
||||
possible for others to create Applications with the Software; (vii)
|
||||
your Applications may not compete with the Software; (viii) you may
|
||||
not use KDAB's or any of its suppliers' names, logos, or trademarks to
|
||||
market your programs, except to state that your program was written
|
||||
using the Software.
|
||||
|
||||
6. LICENSEE'S BREACH OF CONTRACT
|
||||
In addition to penalties, other sanctions and the like as stated in
|
||||
the Swedish Copyright Act (1960:729), or successive legislation as it
|
||||
may appear, the Licensee agrees to pay a Contractual Fine in case of
|
||||
his/her/their breach of any of the above mentioned obligations,
|
||||
including but not limited to, the Licensee's obligation to let only
|
||||
one person per license use the Software as stated under above. The
|
||||
Contractual Fine is EUR 5000 and is payable by the Licensee to the
|
||||
Licenser immediately upon the Licenser having reasonably demonstrated
|
||||
that the Licensee is in breach of his obligations in this Agreement.
|
||||
|
||||
7. WARRANTY DISCLAIMER
|
||||
THE SOFTWARE IS LICENSED TO YOU "AS IS". TO THE MAXIMUM EXTENT
|
||||
PERMITTED BY APPLICABLE LAW, KDAB ON BEHALF OF ITSELF AND ITS SUPPLIERS,
|
||||
DISCLAIMS ALL WARRANTIES AND CONDITIONS, EITHER EXPRESS OR IMPLIED,
|
||||
INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT WITH
|
||||
REGARD TO THE SOFTWARE.
|
||||
|
||||
8. LIMITATION OF LIABILITY
|
||||
IF, KDAB'S WARRANTY DISCLAIMER NOTWITHSTANDING, KDAB IS HELD LIABLE TO
|
||||
YOU BASED ON THE SOFTWARE, KDAB'S ENTIRE LIABILITY TO YOU AND YOUR
|
||||
EXCLUSIVE REMEDY SHALL BE, AT REPAIR OR REPLACEMENT OF THE SOFTWARE,
|
||||
PROVIDED YOU RETURN TO KDAB ALL COPIES OF THE SOFTWARE AS ORIGINALLY
|
||||
DELIVERED TO YOU. KDAB SHALL NOT UNDER ANY CIRCUMSTANCES BE LIABLE TO
|
||||
YOU BASED ON FAILURE OF THE SOFTWARE IF THE FAILURE RESULTED FROM
|
||||
ACCIDENT, ABUSE OR MISAPPLICATION, NOR SHALL KDAB UNDER ANY
|
||||
CIRCUMSTANCES BE LIABLE FOR SPECIAL DAMAGES, PUNITIVE OR EXEMPLARY
|
||||
DAMAGES, DAMAGES FOR LOSS OF PROFITS OR INTERRUPTION OF BUSINESS OR
|
||||
FOR LOSS OR CORRUPTION OF DATA.
|
||||
|
||||
9. This Agreement may only be modified in writing signed by you and an
|
||||
authorized officer of KDAB. All terms of any purchase order or other
|
||||
ordering document shall be superseded by this Agreement.
|
||||
|
||||
10. This Agreement shall be construed, interpreted and governed by the
|
||||
laws of Sweden, the venue to be Sunne Tingsratt.
|
||||
|
|
@ -0,0 +1 @@
|
|||
#include "CartesianCoordinateTransformation.h"
|
|
@ -0,0 +1,147 @@
|
|||
/****************************************************************************
|
||||
** Copyright (C) 2001-2013 Klaralvdalens Datakonsult AB. All rights reserved.
|
||||
**
|
||||
** This file is part of the KD Chart library.
|
||||
**
|
||||
** Licensees holding valid commercial KD Chart licenses may use this file in
|
||||
** accordance with the KD Chart Commercial License Agreement provided with
|
||||
** the Software.
|
||||
**
|
||||
**
|
||||
** This file may be distributed and/or modified under the terms of the
|
||||
** GNU General Public License version 2 and version 3 as published by the
|
||||
** Free Software Foundation and appearing in the file LICENSE.GPL.txt included.
|
||||
**
|
||||
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
|
||||
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
||||
**
|
||||
** Contact info@kdab.com if any conditions of this licensing are not
|
||||
** clear to you.
|
||||
**
|
||||
**********************************************************************/
|
||||
|
||||
#ifndef CARTESIANCOORDINATETRANSFORMATION_H
|
||||
#define CARTESIANCOORDINATETRANSFORMATION_H
|
||||
|
||||
#include <QList>
|
||||
#include <QRectF>
|
||||
#include <QPointF>
|
||||
|
||||
#include "KDChartZoomParameters.h"
|
||||
|
||||
#include <cmath>
|
||||
#include <limits>
|
||||
|
||||
namespace KDChart {
|
||||
|
||||
// FIXME: if this struct is used more often, we need to make it a class
|
||||
// with proper accessor methods:
|
||||
|
||||
/**
|
||||
* \internal
|
||||
*/
|
||||
struct CoordinateTransformation {
|
||||
|
||||
CoordinateTransformation()
|
||||
: axesCalcModeY( CartesianCoordinatePlane::Linear ),
|
||||
axesCalcModeX( CartesianCoordinatePlane::Linear ),
|
||||
isPositiveX( true ),
|
||||
isPositiveY( true )
|
||||
{}
|
||||
|
||||
CartesianCoordinatePlane::AxesCalcMode axesCalcModeY;
|
||||
CartesianCoordinatePlane::AxesCalcMode axesCalcModeX;
|
||||
|
||||
ZoomParameters zoom;
|
||||
|
||||
QTransform transform;
|
||||
QTransform backTransform;
|
||||
// a logarithmic scale cannot cross zero, so we have to know which side we are on.
|
||||
bool isPositiveX;
|
||||
bool isPositiveY;
|
||||
|
||||
qreal logTransform( qreal value, bool isPositiveRange ) const
|
||||
{
|
||||
if ( isPositiveRange ) {
|
||||
return log10( value );
|
||||
} else {
|
||||
return -log10( -value );
|
||||
}
|
||||
}
|
||||
|
||||
qreal logTransformBack( qreal value, bool wasPositive ) const
|
||||
{
|
||||
if ( wasPositive ) {
|
||||
return pow( 10.0, value );
|
||||
} else {
|
||||
return -pow( 10.0, -value );
|
||||
}
|
||||
}
|
||||
|
||||
void updateTransform( const QRectF& constDataRect, const QRectF& screenRect )
|
||||
{
|
||||
QRectF dataRect = constDataRect;
|
||||
if ( axesCalcModeX == CartesianCoordinatePlane::Logarithmic ) {
|
||||
// the data will be scaled by logTransform() later, so scale its bounds as well
|
||||
isPositiveX = dataRect.left() >= 0.0;
|
||||
dataRect.setLeft( logTransform( dataRect.left(), isPositiveX ) );
|
||||
dataRect.setRight( logTransform( dataRect.right(), isPositiveX ) );
|
||||
}
|
||||
if ( axesCalcModeY == CartesianCoordinatePlane::Logarithmic ) {
|
||||
isPositiveY = dataRect.top() >= 0.0;
|
||||
dataRect.setTop( logTransform( dataRect.top(), isPositiveY ) );
|
||||
dataRect.setBottom( logTransform( dataRect.bottom(), isPositiveY ) );
|
||||
}
|
||||
|
||||
transform.reset();
|
||||
// read the following transformation sequence from bottom to top(!)
|
||||
transform.translate( screenRect.left(), screenRect.bottom() );
|
||||
transform.scale( screenRect.width(), screenRect.height() );
|
||||
|
||||
// TODO: mirror in case of "reverse" axes?
|
||||
|
||||
// transform into screen space
|
||||
transform.translate( 0.5, -0.5 );
|
||||
transform.scale( zoom.xFactor, zoom.yFactor );
|
||||
transform.translate( -zoom.xCenter, 1.0 - zoom.yCenter );
|
||||
// zoom
|
||||
transform.scale( 1.0 / dataRect.width(), 1.0 / dataRect.height() );
|
||||
transform.translate( -dataRect.left(), -dataRect.bottom() );
|
||||
// transform into the unit square
|
||||
|
||||
backTransform = transform.inverted();
|
||||
}
|
||||
|
||||
// convert data space point to screen point
|
||||
inline QPointF translate( const QPointF& dataPoint ) const
|
||||
{
|
||||
QPointF data = dataPoint;
|
||||
if ( axesCalcModeX == CartesianCoordinatePlane::Logarithmic ) {
|
||||
data.setX( logTransform( data.x(), isPositiveX ) );
|
||||
}
|
||||
if ( axesCalcModeY == CartesianCoordinatePlane::Logarithmic ) {
|
||||
data.setY( logTransform( data.y(), isPositiveY ) );
|
||||
}
|
||||
|
||||
return transform.map( data );
|
||||
}
|
||||
|
||||
// convert screen point to data space point
|
||||
inline const QPointF translateBack( const QPointF& screenPoint ) const
|
||||
{
|
||||
QPointF ret = backTransform.map( screenPoint );
|
||||
if ( axesCalcModeX == CartesianCoordinatePlane::Logarithmic ) {
|
||||
ret.setX( logTransformBack( ret.x(), isPositiveX ) );
|
||||
}
|
||||
if ( axesCalcModeY == CartesianCoordinatePlane::Logarithmic ) {
|
||||
ret.setY( logTransformBack( ret.y(), isPositiveY ) );
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
};
|
||||
|
||||
typedef QList<CoordinateTransformation> CoordinateTransformationList;
|
||||
|
||||
}
|
||||
|
||||
#endif
|
|
@ -0,0 +1 @@
|
|||
#include "ChartGraphicsItem.h"
|
|
@ -0,0 +1,54 @@
|
|||
/****************************************************************************
|
||||
** Copyright (C) 2001-2013 Klaralvdalens Datakonsult AB. All rights reserved.
|
||||
**
|
||||
** This file is part of the KD Chart library.
|
||||
**
|
||||
** Licensees holding valid commercial KD Chart licenses may use this file in
|
||||
** accordance with the KD Chart Commercial License Agreement provided with
|
||||
** the Software.
|
||||
**
|
||||
**
|
||||
** This file may be distributed and/or modified under the terms of the
|
||||
** GNU General Public License version 2 and version 3 as published by the
|
||||
** Free Software Foundation and appearing in the file LICENSE.GPL.txt included.
|
||||
**
|
||||
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
|
||||
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
||||
**
|
||||
** Contact info@kdab.com if any conditions of this licensing are not
|
||||
** clear to you.
|
||||
**
|
||||
**********************************************************************/
|
||||
|
||||
#ifndef CHARTGRAPHICSITEM_H
|
||||
#define CHARTGRAPHICSITEM_H
|
||||
|
||||
#include <QGraphicsPolygonItem>
|
||||
|
||||
namespace KDChart {
|
||||
|
||||
/**
|
||||
* @brief Graphics item used inside of the ReverseMapper
|
||||
* \internal
|
||||
*/
|
||||
class ChartGraphicsItem : public QGraphicsPolygonItem
|
||||
{
|
||||
public:
|
||||
enum { Type = UserType + 1 };
|
||||
|
||||
ChartGraphicsItem();
|
||||
|
||||
ChartGraphicsItem( int row, int column );
|
||||
|
||||
int row() const { return m_row; }
|
||||
int column() const { return m_column; }
|
||||
int type() const { return Type; }
|
||||
|
||||
private:
|
||||
int m_row;
|
||||
int m_column;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif
|
45
massif-visualizer/kdchart/include/KDChart/KDChart
Normal file
45
massif-visualizer/kdchart/include/KDChart/KDChart
Normal file
|
@ -0,0 +1,45 @@
|
|||
#include "KDChartDatasetProxyModel.h"
|
||||
#include "KDChartNullPaintDevice.h"
|
||||
#include "KDChartChart.h"
|
||||
#include "KDChartHeaderFooter.h"
|
||||
#include "KDChartGlobal.h"
|
||||
#include "KDChartDataValueAttributes.h"
|
||||
#include "KDChartPalette.h"
|
||||
#include "KDChartSignalCompressor.h"
|
||||
#include "KDChartDiagramObserver.h"
|
||||
#include "KDTextDocument.h"
|
||||
#include "KDChartMeasure.h"
|
||||
#include "KDChartGridAttributes.h"
|
||||
#include "KDChartPrintingParameters.h"
|
||||
#include "KDChartLineAttributes.h"
|
||||
#include "KDChartValueTrackerAttributes.h"
|
||||
#include "ReverseMapper.h"
|
||||
#include "KDChartAbstractGrid.h"
|
||||
#include "KDChartRulerAttributes.h"
|
||||
#include "KDChartTextArea.h"
|
||||
#include "KDChartAttributesModel.h"
|
||||
#include "KDChartEnums.h"
|
||||
#include "kdchart_export.h"
|
||||
#include "KDChartAbstractCoordinatePlane.h"
|
||||
#include "KDChartLegend.h"
|
||||
#include "KDChartRelativePosition.h"
|
||||
#include "KDChartAbstractDiagram.h"
|
||||
#include "KDChartMarkerAttributes.h"
|
||||
#include "KDChartAbstractAxis.h"
|
||||
#include "KDChartTextAttributes.h"
|
||||
#include "KDChartFrameAttributes.h"
|
||||
#include "KDChartAbstractThreeDAttributes.h"
|
||||
#include "KDChartTextLabelCache.h"
|
||||
#include "KDChartBackgroundAttributes.h"
|
||||
#include "KDChartAbstractAreaWidget.h"
|
||||
#include "KDChartThreeDLineAttributes.h"
|
||||
#include "KDChartPosition.h"
|
||||
#include "KDChartZoomParameters.h"
|
||||
#include "ChartGraphicsItem.h"
|
||||
#include "KDChartAbstractAreaBase.h"
|
||||
#include "KDChartPaintContext.h"
|
||||
#include "KDChartAbstractProxyModel.h"
|
||||
#include "KDChartDatasetSelector.h"
|
||||
#include "KDChartLayoutItems.h"
|
||||
#include "KDChartAbstractArea.h"
|
||||
#include "KDChartWidget.h"
|
|
@ -0,0 +1 @@
|
|||
#include "KDChartAbstractArea.h"
|
136
massif-visualizer/kdchart/include/KDChart/KDChartAbstractArea.h
Normal file
136
massif-visualizer/kdchart/include/KDChart/KDChartAbstractArea.h
Normal file
|
@ -0,0 +1,136 @@
|
|||
/****************************************************************************
|
||||
** Copyright (C) 2001-2013 Klaralvdalens Datakonsult AB. All rights reserved.
|
||||
**
|
||||
** This file is part of the KD Chart library.
|
||||
**
|
||||
** Licensees holding valid commercial KD Chart licenses may use this file in
|
||||
** accordance with the KD Chart Commercial License Agreement provided with
|
||||
** the Software.
|
||||
**
|
||||
**
|
||||
** This file may be distributed and/or modified under the terms of the
|
||||
** GNU General Public License version 2 and version 3 as published by the
|
||||
** Free Software Foundation and appearing in the file LICENSE.GPL.txt included.
|
||||
**
|
||||
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
|
||||
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
||||
**
|
||||
** Contact info@kdab.com if any conditions of this licensing are not
|
||||
** clear to you.
|
||||
**
|
||||
**********************************************************************/
|
||||
|
||||
#ifndef KDCHARTABSTRACTAREA_H
|
||||
#define KDCHARTABSTRACTAREA_H
|
||||
|
||||
#include <QObject>
|
||||
|
||||
#include "KDChartGlobal.h"
|
||||
#include "KDChartAbstractAreaBase.h"
|
||||
#include "KDChartLayoutItems.h"
|
||||
|
||||
namespace KDChart {
|
||||
|
||||
|
||||
/**
|
||||
* @class AbstractArea KDChartAbstractArea.h
|
||||
* @brief An area in the chart with a background, a frame, etc.
|
||||
*
|
||||
* AbstractArea is the base class for all non-widget chart elements that have
|
||||
* a set of background attributes and frame attributes, such as
|
||||
* coordinate planes or axes.
|
||||
*
|
||||
* @note This class inherits from AbstractAreaBase, AbstractLayoutItem, QObject.
|
||||
* The reason for this triple inheritance is that neither AbstractAreaBase nor
|
||||
* AbstractLayoutItem are QObject.
|
||||
*/
|
||||
class KDCHART_EXPORT AbstractArea : public QObject,
|
||||
public AbstractAreaBase,
|
||||
public AbstractLayoutItem
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
Q_DISABLE_COPY( AbstractArea )
|
||||
KDCHART_DECLARE_PRIVATE_DERIVED( AbstractArea )
|
||||
|
||||
public:
|
||||
virtual ~AbstractArea() ;
|
||||
|
||||
/**
|
||||
* @brief Draws the background and frame, then calls paint().
|
||||
*
|
||||
* In most cases there is no need to overwrite this method in a derived
|
||||
* class, but you would overwrite AbstractLayoutItem::paint() instead.
|
||||
*/
|
||||
virtual void paintIntoRect( QPainter& painter, const QRect& rect );
|
||||
|
||||
/**
|
||||
* Call paintAll, if you want the background and the frame to be drawn
|
||||
* before the normal paint() is invoked automatically.
|
||||
*/
|
||||
virtual void paintAll( QPainter& painter );
|
||||
|
||||
/**
|
||||
* This is called at layout time by KDChart::AutoSpacerLayoutItem::sizeHint().
|
||||
*
|
||||
* The method triggers AbstractArea::sizeHint() to find out the
|
||||
* amount of overlap at the left edge of the area.
|
||||
*
|
||||
* \note The default implementation is not using any caching,
|
||||
* it might make sense to implement a more sophisticated solution
|
||||
* for derived classes that have complex work to do in sizeHint().
|
||||
* All we have here is a primitive flag to be set by the caller
|
||||
* if it is sure that no sizeHint() needs to be called.
|
||||
*/
|
||||
virtual int leftOverlap( bool doNotRecalculate=false ) const;
|
||||
/**
|
||||
* This is called at layout time by KDChart::AutoSpacerLayoutItem::sizeHint().
|
||||
*
|
||||
* The method triggers AbstractArea::sizeHint() to find out the
|
||||
* amount of overlap at the right edge of the area.
|
||||
*
|
||||
* \note The default implementation is not using any caching,
|
||||
* it might make sense to implement a more sophisticated solution
|
||||
* for derived classes that have complex work to do in sizeHint().
|
||||
* All we have here is a primitive flag to be set by the caller
|
||||
* if it is sure that no sizeHint() needs to be called.
|
||||
*/
|
||||
virtual int rightOverlap( bool doNotRecalculate=false ) const;
|
||||
/**
|
||||
* This is called at layout time by KDChart::AutoSpacerLayoutItem::sizeHint().
|
||||
*
|
||||
* The method triggers AbstractArea::sizeHint() to find out the
|
||||
* amount of overlap at the top edge of the area.
|
||||
*
|
||||
* \note The default implementation is not using any caching,
|
||||
* it might make sense to implement a more sophisticated solution
|
||||
* for derived classes that have complex work to do in sizeHint().
|
||||
* All we have here is a primitive flag to be set by the caller
|
||||
* if it is sure that no sizeHint() needs to be called.
|
||||
*/
|
||||
virtual int topOverlap( bool doNotRecalculate=false ) const;
|
||||
/**
|
||||
* This is called at layout time by KDChart:AutoSpacerLayoutItem::sizeHint().
|
||||
*
|
||||
* The method triggers AbstractArea::sizeHint() to find out the
|
||||
* amount of overlap at the bottom edge of the area.
|
||||
*
|
||||
* \note The default implementation is not using any caching,
|
||||
* it might make sense to implement a more sophisticated solution
|
||||
* for derived classes that have complex work to do in sizeHint().
|
||||
* All we have here is a primitive flag to be set by the caller
|
||||
* if it is sure that no sizeHint() needs to be called.
|
||||
*/
|
||||
virtual int bottomOverlap( bool doNotRecalculate=false ) const;
|
||||
|
||||
protected:
|
||||
AbstractArea();
|
||||
virtual QRect areaGeometry() const;
|
||||
virtual void positionHasChanged();
|
||||
|
||||
Q_SIGNALS:
|
||||
void positionChanged( AbstractArea * );
|
||||
}; // End of class AbstractArea
|
||||
|
||||
}
|
||||
#endif // KDCHARTABSTRACTAREA_H
|
|
@ -0,0 +1 @@
|
|||
#include "KDChartAbstractAreaBase.h"
|
|
@ -0,0 +1,132 @@
|
|||
/****************************************************************************
|
||||
** Copyright (C) 2001-2013 Klaralvdalens Datakonsult AB. All rights reserved.
|
||||
**
|
||||
** This file is part of the KD Chart library.
|
||||
**
|
||||
** Licensees holding valid commercial KD Chart licenses may use this file in
|
||||
** accordance with the KD Chart Commercial License Agreement provided with
|
||||
** the Software.
|
||||
**
|
||||
**
|
||||
** This file may be distributed and/or modified under the terms of the
|
||||
** GNU General Public License version 2 and version 3 as published by the
|
||||
** Free Software Foundation and appearing in the file LICENSE.GPL.txt included.
|
||||
**
|
||||
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
|
||||
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
||||
**
|
||||
** Contact info@kdab.com if any conditions of this licensing are not
|
||||
** clear to you.
|
||||
**
|
||||
**********************************************************************/
|
||||
|
||||
#ifndef KDCHARTABSTRACTAREABASE_H
|
||||
#define KDCHARTABSTRACTAREABASE_H
|
||||
|
||||
#include <QPointF>
|
||||
#include <QSizeF>
|
||||
#include <QRectF>
|
||||
|
||||
#include "KDChartGlobal.h"
|
||||
#include "KDChartLayoutItems.h"
|
||||
#include "KDChartRelativePosition.h"
|
||||
#include "KDChartAbstractAreaBase.h"
|
||||
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
class QPainter;
|
||||
class QString;
|
||||
QT_END_NAMESPACE
|
||||
|
||||
namespace KDChart {
|
||||
class TextAttributes;
|
||||
class BackgroundAttributes;
|
||||
class FrameAttributes;
|
||||
class PaintContext;
|
||||
|
||||
|
||||
/**
|
||||
* @class AbstractAreaBase KDChartAbstractAreaBase.h
|
||||
* @brief Base class for AbstractArea and AbstractAreaWidget: An area
|
||||
* in the chart with a background, a frame, etc.
|
||||
*
|
||||
* AbstractAreaBase is the base class for all chart elements that have
|
||||
* a set of background attributes and frame attributes, such as
|
||||
* legends or axes.
|
||||
*
|
||||
* @note Normally you should not use AbstractAreaBase directly, but
|
||||
* derive your classes from AbstractArea or AbstractAreaWidget.
|
||||
*
|
||||
* @note This classis not a QObject, so it is easier to inherit from
|
||||
* it, if your are inheriting from a QObject too like AbstractAreaWidget does it.
|
||||
*
|
||||
* @sa AbstractArea, AbstractAreaWidget
|
||||
*/
|
||||
class KDCHART_EXPORT AbstractAreaBase
|
||||
{
|
||||
Q_DISABLE_COPY( AbstractAreaBase )
|
||||
KDCHART_DECLARE_PRIVATE_BASE_POLYMORPHIC( AbstractAreaBase )
|
||||
|
||||
protected:
|
||||
AbstractAreaBase();
|
||||
virtual ~AbstractAreaBase() ;
|
||||
|
||||
public:
|
||||
// virtual AbstractAreaBase * clone() const = 0;
|
||||
|
||||
/**
|
||||
* Returns true if both areas have the same settings.
|
||||
*/
|
||||
bool compare( const AbstractAreaBase* other ) const;
|
||||
|
||||
void alignToReferencePoint( const RelativePosition& position );
|
||||
|
||||
void setFrameAttributes( const FrameAttributes &a );
|
||||
FrameAttributes frameAttributes() const;
|
||||
|
||||
void setBackgroundAttributes( const BackgroundAttributes &a );
|
||||
BackgroundAttributes backgroundAttributes() const;
|
||||
|
||||
virtual void paintBackground( QPainter& painter, const QRect& rectangle );
|
||||
virtual void paintFrame( QPainter& painter, const QRect& rectangle );
|
||||
|
||||
static void paintBackgroundAttributes( QPainter& painter, const QRect& rectangle,
|
||||
const KDChart::BackgroundAttributes& attributes );
|
||||
static void paintFrameAttributes( QPainter& painter, const QRect& rectangle,
|
||||
const KDChart::FrameAttributes& attributes );
|
||||
|
||||
/** \internal
|
||||
* \note Normally you should not call this method, but derive your classes
|
||||
* from AbstractArea or AbstractAreaWidget.
|
||||
* \sa AbstractArea, AbstractAreaWidget
|
||||
*/
|
||||
void getFrameLeadings(int& left, int& top, int& right, int& bottom ) const;
|
||||
|
||||
|
||||
protected:
|
||||
/** \internal
|
||||
* \note Normally you should not call this method, but derive your classes
|
||||
* from AbstractArea or AbstractAreaWidget.
|
||||
* \sa AbstractArea, AbstractAreaWidget
|
||||
*/
|
||||
QRect innerRect() const;
|
||||
|
||||
/** \internal
|
||||
* This internal method is used by AbstractArea and AbstractAreaWidget
|
||||
* to find out the real widget size.
|
||||
* \sa AbstractArea, AbstractAreaWidget
|
||||
*/
|
||||
virtual QRect areaGeometry() const = 0;
|
||||
|
||||
/** \internal
|
||||
* This internal method can be overwritten by derived classes,
|
||||
* if they want to emit a signal (or perform other actions, resp.)
|
||||
* when the Position of the area has been changed.
|
||||
* The default implementation does nothing.
|
||||
*/
|
||||
virtual void positionHasChanged();
|
||||
|
||||
}; // End of class AbstractAreaBase
|
||||
|
||||
}
|
||||
#endif // KDCHARTABSTRACTAREABASE_H
|
|
@ -0,0 +1 @@
|
|||
#include "KDChartAbstractAreaWidget.h"
|
|
@ -0,0 +1,119 @@
|
|||
/****************************************************************************
|
||||
** Copyright (C) 2001-2013 Klaralvdalens Datakonsult AB. All rights reserved.
|
||||
**
|
||||
** This file is part of the KD Chart library.
|
||||
**
|
||||
** Licensees holding valid commercial KD Chart licenses may use this file in
|
||||
** accordance with the KD Chart Commercial License Agreement provided with
|
||||
** the Software.
|
||||
**
|
||||
**
|
||||
** This file may be distributed and/or modified under the terms of the
|
||||
** GNU General Public License version 2 and version 3 as published by the
|
||||
** Free Software Foundation and appearing in the file LICENSE.GPL.txt included.
|
||||
**
|
||||
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
|
||||
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
||||
**
|
||||
** Contact info@kdab.com if any conditions of this licensing are not
|
||||
** clear to you.
|
||||
**
|
||||
**********************************************************************/
|
||||
|
||||
#ifndef KDCHARTABSTRACTAREAWIDGET_H
|
||||
#define KDCHARTABSTRACTAREAWIDGET_H
|
||||
|
||||
#include <QWidget>
|
||||
#include <QPaintEvent>
|
||||
#include <QPainter>
|
||||
#include <QRect>
|
||||
|
||||
#include "KDChartAbstractAreaBase.h"
|
||||
|
||||
namespace KDChart {
|
||||
|
||||
|
||||
/**
|
||||
* @class AbstractAreaWidget KDChartAbstractArea.h
|
||||
* @brief An area in the chart with a background, a frame, etc.
|
||||
*
|
||||
* AbstractAreaWidget is the base for all widget classes that have
|
||||
* a set of background attributes and frame attributes, such as
|
||||
* KDChart::Chart and KDChart::Legend.
|
||||
*/
|
||||
class KDCHART_EXPORT AbstractAreaWidget : public QWidget, public AbstractAreaBase
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
Q_DISABLE_COPY( AbstractAreaWidget )
|
||||
KDCHART_DECLARE_PRIVATE_DERIVED_QWIDGET( AbstractAreaWidget )
|
||||
|
||||
public:
|
||||
explicit AbstractAreaWidget( QWidget* parent = 0 );
|
||||
|
||||
/**
|
||||
* @brief Draws the background and frame, then calls paint().
|
||||
*
|
||||
* In most cases there is no need to overwrite this method in a derived
|
||||
* class, but you would overwrite paint() instead.
|
||||
* @sa paint
|
||||
*/
|
||||
virtual void paintEvent( QPaintEvent* event );
|
||||
|
||||
/**
|
||||
* @brief Draws the background and frame, then calls paint().
|
||||
*
|
||||
* In most cases there is no need to overwrite this method in a derived
|
||||
* class, but you would overwrite paint() instead.
|
||||
*/
|
||||
virtual void paintIntoRect( QPainter& painter, const QRect& rect );
|
||||
|
||||
/**
|
||||
* Overwrite this to paint the inner contents of your widget.
|
||||
*
|
||||
* @note When overriding this method, please let your widget draw
|
||||
* itself at the top/left corner of the painter. You should call rect()
|
||||
* (or width(), height(), resp.) to find the drawable area's size:
|
||||
* While the paint() method is being executed the frame of the widget
|
||||
* is outside of its rect(), so you can use all of rect() for
|
||||
* your custom drawing!
|
||||
* @sa paint, paintIntoRect
|
||||
*/
|
||||
virtual void paint( QPainter* painter ) = 0;
|
||||
|
||||
/**
|
||||
* Call paintAll, if you want the background and the frame to be drawn
|
||||
* before the normal paint() is invoked automatically.
|
||||
*/
|
||||
void paintAll( QPainter& painter );
|
||||
|
||||
/**
|
||||
* Call this to trigger an unconditional re-building of the widget's internals.
|
||||
*/
|
||||
virtual void forceRebuild();
|
||||
|
||||
/**
|
||||
* Call this to trigger an conditional re-building of the widget's internals.
|
||||
*
|
||||
* e.g. AbstractAreaWidget call this, before calling layout()->setGeometry()
|
||||
*/
|
||||
virtual void needSizeHint();
|
||||
//virtual void setGeometry( const QRect & rect );
|
||||
virtual void resizeLayout( const QSize& );
|
||||
|
||||
protected:
|
||||
virtual ~AbstractAreaWidget() ;
|
||||
virtual QRect areaGeometry() const;
|
||||
virtual void positionHasChanged();
|
||||
|
||||
|
||||
public:
|
||||
// virtual AbstractAreaWidget * clone() const = 0;
|
||||
|
||||
Q_SIGNALS:
|
||||
void positionChanged( AbstractAreaWidget * );
|
||||
|
||||
}; // End of class AbstractAreaWidget
|
||||
|
||||
}
|
||||
#endif // KDCHARTABSTRACTAREAWIDGET_H
|
|
@ -0,0 +1 @@
|
|||
#include "KDChartAbstractAxis.h"
|
247
massif-visualizer/kdchart/include/KDChart/KDChartAbstractAxis.h
Normal file
247
massif-visualizer/kdchart/include/KDChart/KDChartAbstractAxis.h
Normal file
|
@ -0,0 +1,247 @@
|
|||
/****************************************************************************
|
||||
** Copyright (C) 2001-2013 Klaralvdalens Datakonsult AB. All rights reserved.
|
||||
**
|
||||
** This file is part of the KD Chart library.
|
||||
**
|
||||
** Licensees holding valid commercial KD Chart licenses may use this file in
|
||||
** accordance with the KD Chart Commercial License Agreement provided with
|
||||
** the Software.
|
||||
**
|
||||
**
|
||||
** This file may be distributed and/or modified under the terms of the
|
||||
** GNU General Public License version 2 and version 3 as published by the
|
||||
** Free Software Foundation and appearing in the file LICENSE.GPL.txt included.
|
||||
**
|
||||
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
|
||||
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
||||
**
|
||||
** Contact info@kdab.com if any conditions of this licensing are not
|
||||
** clear to you.
|
||||
**
|
||||
**********************************************************************/
|
||||
|
||||
#ifndef KDCHARTABSTRACTAXIS_H
|
||||
#define KDCHARTABSTRACTAXIS_H
|
||||
|
||||
// #include <QObject>
|
||||
// #include <QRectF>
|
||||
// #include <QWidget>
|
||||
|
||||
#include "kdchart_export.h"
|
||||
#include "KDChartGlobal.h"
|
||||
#include "KDChartAbstractArea.h"
|
||||
#include "KDChartTextAttributes.h"
|
||||
#include "KDChartRulerAttributes.h"
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
class QPainter;
|
||||
class QSizeF;
|
||||
QT_END_NAMESPACE
|
||||
|
||||
|
||||
namespace KDChart {
|
||||
|
||||
class Area;
|
||||
class AbstractCoordinatePlane;
|
||||
class PaintContext;
|
||||
class AbstractDiagram;
|
||||
|
||||
/**
|
||||
* The base class for axes.
|
||||
*
|
||||
* For being useful, axes need to be assigned to a diagram, see
|
||||
* AbstractCartesianDiagram::addAxis and AbstractCartesianDiagram::takeAxis.
|
||||
*
|
||||
* \sa PolarAxis, AbstractCartesianDiagram
|
||||
*/
|
||||
class KDCHART_EXPORT AbstractAxis : public AbstractArea
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
Q_DISABLE_COPY( AbstractAxis )
|
||||
KDCHART_DECLARE_PRIVATE_DERIVED_PARENT( AbstractAxis, AbstractDiagram* )
|
||||
|
||||
public:
|
||||
explicit AbstractAxis( AbstractDiagram* diagram = 0 );
|
||||
virtual ~AbstractAxis();
|
||||
|
||||
// FIXME implement when code os ready for it:
|
||||
// virtual Area* clone() const = 0;
|
||||
|
||||
// FIXME (Mirko) readd when needed
|
||||
// void copyRelevantDetailsFrom( const KDChartAxis* axis );
|
||||
|
||||
/* virtual void paint( PaintContext* ) const = 0;
|
||||
virtual QSize sizeHint() const = 0;*/
|
||||
//virtual void paintEvent( QPaintEvent* event) = 0;
|
||||
|
||||
/**
|
||||
* \brief Implement this method if you want to adjust axis labels
|
||||
* before they are printed.
|
||||
*
|
||||
* KD Chart is calling this method immediately before drawing the
|
||||
* text, this means: What you return here will be drawn without
|
||||
* further modifications.
|
||||
*
|
||||
* \param label The text of the label as KD Chart has calculated it
|
||||
* automatically (or as it was taken from a QStringList provided
|
||||
* by you, resp.)
|
||||
*
|
||||
* \return The text to be drawn. By default this is the same as \c label.
|
||||
*/
|
||||
virtual const QString customizedLabel( const QString& label ) const;
|
||||
|
||||
/**
|
||||
* Returns true if both axes have the same settings.
|
||||
*/
|
||||
bool compare( const AbstractAxis* other ) const;
|
||||
|
||||
/**
|
||||
* \internal
|
||||
*
|
||||
* Method invoked by AbstractCartesianDiagram::addAxis().
|
||||
*
|
||||
* You should not call this function, unless you know exactly,
|
||||
* what you are doing.
|
||||
*
|
||||
* \sa connectSignals(), AbstractCartesianDiagram::addAxis()
|
||||
*/
|
||||
void createObserver( AbstractDiagram* diagram );
|
||||
|
||||
/**
|
||||
* \internal
|
||||
*
|
||||
* Method invoked by AbstractCartesianDiagram::takeAxis().
|
||||
*
|
||||
* You should not call this function, unless you know exactly,
|
||||
* what you are doing.
|
||||
*
|
||||
* \sa AbstractCartesianDiagram::takeAxis()
|
||||
*/
|
||||
void deleteObserver( AbstractDiagram* diagram );
|
||||
const AbstractDiagram* diagram() const;
|
||||
bool observedBy( AbstractDiagram* diagram ) const;
|
||||
|
||||
/**
|
||||
* Wireing the signal/slot connections.
|
||||
*
|
||||
* This method gets called automatically, each time, when you assign
|
||||
* the axis to a diagram, either by passing a diagram* to the c'tor,
|
||||
* or by calling the diagram's setAxis method, resp.
|
||||
*
|
||||
* If overwriting this method in derived classes, make sure to call
|
||||
* this base method AbstractAxis::connectSignals(), so your axis
|
||||
* gets connected to the diagram's built-in signals.
|
||||
*
|
||||
* \sa AbstractCartesianDiagram::addAxis()
|
||||
*/
|
||||
virtual void connectSignals();
|
||||
|
||||
/**
|
||||
\brief Use this to specify the text attributes to be used for axis labels.
|
||||
|
||||
By default, the reference area will be set at painting time.
|
||||
It will be the then-valid coordinate plane's parent widget,
|
||||
so normally, it will be the KDChart::Chart.
|
||||
Thus the labels of all of your axes in all of your diagrams
|
||||
within that Chart will be drawn in same font size, by default.
|
||||
|
||||
\sa textAttributes, setLabels
|
||||
*/
|
||||
void setTextAttributes( const TextAttributes &a );
|
||||
|
||||
/**
|
||||
\brief Returns the text attributes to be used for axis labels.
|
||||
|
||||
\sa setTextAttributes
|
||||
*/
|
||||
TextAttributes textAttributes() const;
|
||||
|
||||
/**
|
||||
\brief Use this to specify the attributes used to paint the axis ruler
|
||||
|
||||
Every axis has a default set of ruler attributes that is exactly the
|
||||
same among them. Use this method to specify your own attributes.
|
||||
|
||||
\sa rulerAttributes
|
||||
*/
|
||||
void setRulerAttributes( const RulerAttributes &a );
|
||||
|
||||
/**
|
||||
\brief Returns the attributes to be used for painting the rulers
|
||||
|
||||
\sa setRulerAttributes
|
||||
*/
|
||||
RulerAttributes rulerAttributes() const;
|
||||
|
||||
/**
|
||||
\brief Use this to specify your own set of strings, to be used as axis labels.
|
||||
|
||||
Labels specified via setLabels take precedence:
|
||||
If a non-empty list is passed, KD Chart will use these strings as axis labels,
|
||||
instead of calculating them.
|
||||
|
||||
If you pass a smaller number of strings than the number of labels drawn at this
|
||||
axis, KD Chart will repeat the strings until all labels are drawn.
|
||||
As an example you could specify the seven days of the week as abscissa labels,
|
||||
which would be repeatedly used then.
|
||||
|
||||
By passing an empty QStringList you can reset the default behaviour.
|
||||
|
||||
\sa labels, setShortLabels
|
||||
*/
|
||||
void setLabels( const QStringList& list );
|
||||
|
||||
/**
|
||||
Returns a list of strings, that are used as axis labels, as set via setLabels.
|
||||
|
||||
\sa setLabels
|
||||
*/
|
||||
QStringList labels() const;
|
||||
|
||||
/**
|
||||
\brief Use this to specify your own set of strings, to be used as axis labels,
|
||||
in case the normal labels are too long.
|
||||
|
||||
\note Setting done via setShortLabels will be ignored, if you did not pass
|
||||
a non-empty string list via setLabels too!
|
||||
|
||||
By passing an empty QStringList you can reset the default behaviour.
|
||||
|
||||
\sa shortLabels, setLabels
|
||||
*/
|
||||
void setShortLabels( const QStringList& list );
|
||||
|
||||
/**
|
||||
Returns a list of strings, that are used as axis labels, as set via setShortLabels.
|
||||
|
||||
\note Setting done via setShortLabels will be ignored, if you did not pass
|
||||
a non-empty string list via setLabels too!
|
||||
|
||||
\sa setShortLabels
|
||||
*/
|
||||
QStringList shortLabels() const;
|
||||
|
||||
virtual void setGeometry( const QRect& rect ) = 0;
|
||||
virtual QRect geometry() const = 0;
|
||||
|
||||
/**
|
||||
\brief Convenience function, returns the coordinate plane, in which this axis is used.
|
||||
|
||||
If the axis is not used in a coordinate plane, the return value is Zero.
|
||||
*/
|
||||
const AbstractCoordinatePlane* coordinatePlane() const;
|
||||
|
||||
protected Q_SLOTS:
|
||||
/** called for initializing after the c'tor has completed */
|
||||
virtual void delayedInit();
|
||||
|
||||
public Q_SLOTS:
|
||||
void update();
|
||||
|
||||
Q_SIGNALS:
|
||||
void coordinateSystemChanged();
|
||||
};
|
||||
}
|
||||
|
||||
#endif // KDCHARTABSTRACTAXIS_H
|
|
@ -0,0 +1 @@
|
|||
#include "KDChartAbstractCartesianDiagram.h"
|
|
@ -0,0 +1,132 @@
|
|||
/****************************************************************************
|
||||
** Copyright (C) 2001-2013 Klaralvdalens Datakonsult AB. All rights reserved.
|
||||
**
|
||||
** This file is part of the KD Chart library.
|
||||
**
|
||||
** Licensees holding valid commercial KD Chart licenses may use this file in
|
||||
** accordance with the KD Chart Commercial License Agreement provided with
|
||||
** the Software.
|
||||
**
|
||||
**
|
||||
** This file may be distributed and/or modified under the terms of the
|
||||
** GNU General Public License version 2 and version 3 as published by the
|
||||
** Free Software Foundation and appearing in the file LICENSE.GPL.txt included.
|
||||
**
|
||||
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
|
||||
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
||||
**
|
||||
** Contact info@kdab.com if any conditions of this licensing are not
|
||||
** clear to you.
|
||||
**
|
||||
**********************************************************************/
|
||||
|
||||
#ifndef KDCHARTABSTRACTCARTESIANDIAGRAM_H
|
||||
#define KDCHARTABSTRACTCARTESIANDIAGRAM_H
|
||||
|
||||
#include "KDChartCartesianCoordinatePlane.h"
|
||||
#include "KDChartAbstractDiagram.h"
|
||||
#include "KDChartCartesianAxis.h"
|
||||
|
||||
namespace KDChart {
|
||||
|
||||
class GridAttributes;
|
||||
|
||||
/**
|
||||
* @brief Base class for diagrams based on a cartesian coordianate system.
|
||||
*
|
||||
* The AbstractCartesianDiagram interface adds those elements that are
|
||||
* specific to diagrams based on a cartesian coordinate system to the
|
||||
* basic AbstractDiagram interface.
|
||||
*/
|
||||
class KDCHART_EXPORT AbstractCartesianDiagram : public AbstractDiagram
|
||||
{
|
||||
Q_OBJECT
|
||||
Q_DISABLE_COPY( AbstractCartesianDiagram )
|
||||
KDCHART_DECLARE_DERIVED_DIAGRAM( AbstractCartesianDiagram, CartesianCoordinatePlane )
|
||||
|
||||
public:
|
||||
explicit AbstractCartesianDiagram( QWidget* parent = 0, CartesianCoordinatePlane* plane = 0 );
|
||||
virtual ~AbstractCartesianDiagram();
|
||||
|
||||
/**
|
||||
* Returns true if both diagrams have the same settings.
|
||||
*/
|
||||
bool compare( const AbstractCartesianDiagram* other ) const;
|
||||
|
||||
#if QT_VERSION < 0x040400 || defined(Q_COMPILER_MANGLES_RETURN_TYPE)
|
||||
virtual const int numberOfAbscissaSegments() const = 0;
|
||||
virtual const int numberOfOrdinateSegments() const = 0;
|
||||
#else
|
||||
virtual int numberOfAbscissaSegments() const = 0;
|
||||
virtual int numberOfOrdinateSegments() const = 0;
|
||||
#endif
|
||||
/**
|
||||
* Add the axis to the diagram. The diagram takes ownership of the axis
|
||||
* and will delete it.
|
||||
*
|
||||
* To gain back ownership (e.g. for assigning the axis to another diagram)
|
||||
* use the takeAxis method, before calling addAxis on the other diagram.
|
||||
*
|
||||
* \sa takeAxis
|
||||
*/
|
||||
virtual void addAxis( CartesianAxis * axis );
|
||||
/**
|
||||
* Removes the axis from the diagram, without deleting it.
|
||||
*
|
||||
* The diagram no longer owns the axis, so it is
|
||||
* the caller's responsibility to delete the axis.
|
||||
*
|
||||
* \sa addAxis
|
||||
*/
|
||||
virtual void takeAxis( CartesianAxis * axis );
|
||||
/**
|
||||
* @return a list of all axes added to the diagram
|
||||
*/
|
||||
virtual KDChart::CartesianAxisList axes() const;
|
||||
|
||||
/**
|
||||
* Triggers layouting of all coordinate planes on the current chart.
|
||||
* Normally you don't need to call this method. It's handled automatically for you.
|
||||
*/
|
||||
virtual void layoutPlanes();
|
||||
/** \reimpl */
|
||||
virtual void setCoordinatePlane( AbstractCoordinatePlane* plane );
|
||||
|
||||
/**
|
||||
* Makes this diagram use another diagram \a diagram as reference diagram with relative offset
|
||||
* \a offset.
|
||||
* To share cartesian axes between different diagrams there might be cases when you need that.
|
||||
* Normally you don't.
|
||||
* \sa examples/SharedAbscissa
|
||||
*/
|
||||
virtual void setReferenceDiagram( AbstractCartesianDiagram* diagram, const QPointF& offset = QPointF() );
|
||||
/**
|
||||
* @return this diagram's reference diagram
|
||||
* \sa setReferenceDiagram
|
||||
*/
|
||||
virtual AbstractCartesianDiagram* referenceDiagram() const;
|
||||
/**
|
||||
* @return the relative offset of this diagram's reference diagram
|
||||
* \sa setReferenceDiagram
|
||||
*/
|
||||
virtual QPointF referenceDiagramOffset() const;
|
||||
|
||||
/* reimpl */
|
||||
void setModel( QAbstractItemModel* model );
|
||||
/* reimpl */
|
||||
void setRootIndex( const QModelIndex& index );
|
||||
/* reimpl */
|
||||
void setAttributesModel( AttributesModel* model );
|
||||
|
||||
protected Q_SLOTS:
|
||||
void connectAttributesModel( AttributesModel* );
|
||||
|
||||
protected:
|
||||
/** @return the 3D item depth of the model index \a index */
|
||||
virtual qreal threeDItemDepth( const QModelIndex& index ) const = 0;
|
||||
/** @return the 3D item depth of the data set \a column */
|
||||
virtual qreal threeDItemDepth( int column ) const = 0;
|
||||
};
|
||||
}
|
||||
|
||||
#endif
|
|
@ -0,0 +1 @@
|
|||
#include "KDChartAbstractCoordinatePlane.h"
|
|
@ -0,0 +1,446 @@
|
|||
/****************************************************************************
|
||||
** Copyright (C) 2001-2013 Klaralvdalens Datakonsult AB. All rights reserved.
|
||||
**
|
||||
** This file is part of the KD Chart library.
|
||||
**
|
||||
** Licensees holding valid commercial KD Chart licenses may use this file in
|
||||
** accordance with the KD Chart Commercial License Agreement provided with
|
||||
** the Software.
|
||||
**
|
||||
**
|
||||
** This file may be distributed and/or modified under the terms of the
|
||||
** GNU General Public License version 2 and version 3 as published by the
|
||||
** Free Software Foundation and appearing in the file LICENSE.GPL.txt included.
|
||||
**
|
||||
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
|
||||
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
||||
**
|
||||
** Contact info@kdab.com if any conditions of this licensing are not
|
||||
** clear to you.
|
||||
**
|
||||
**********************************************************************/
|
||||
|
||||
#ifndef KDCHARTABSTRACTCOORDINATEPLANE_H
|
||||
#define KDCHARTABSTRACTCOORDINATEPLANE_H
|
||||
|
||||
#include <QObject>
|
||||
#include <QList>
|
||||
|
||||
#include "KDChartAbstractArea.h"
|
||||
#include "KDChartAbstractDiagram.h"
|
||||
#include "KDChartEnums.h"
|
||||
|
||||
namespace KDChart {
|
||||
|
||||
class Chart;
|
||||
class GridAttributes;
|
||||
class DataDimension;
|
||||
|
||||
typedef QList<DataDimension> DataDimensionsList;
|
||||
|
||||
/**
|
||||
* @brief Base class common for all coordinate planes, CartesianCoordinatePlane, PolarCoordinatePlane, TernaryCoordinatePlane
|
||||
*/
|
||||
class KDCHART_EXPORT AbstractCoordinatePlane : public AbstractArea
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
KDCHART_DECLARE_PRIVATE_DERIVED_PARENT( AbstractCoordinatePlane, Chart* )
|
||||
|
||||
friend class AbstractGrid;
|
||||
|
||||
public:
|
||||
enum AxesCalcMode { Linear, Logarithmic };
|
||||
|
||||
protected:
|
||||
explicit AbstractCoordinatePlane( Chart* parent = 0 );
|
||||
|
||||
public:
|
||||
virtual ~AbstractCoordinatePlane();
|
||||
|
||||
/**
|
||||
* Adds a diagram to this coordinate plane.
|
||||
* @param diagram The diagram to add.
|
||||
*
|
||||
* \sa replaceDiagram, takeDiagram
|
||||
*/
|
||||
virtual void addDiagram( AbstractDiagram* diagram );
|
||||
|
||||
/**
|
||||
* Replaces the old diagram, or appends the
|
||||
* diagram, it there is none yet.
|
||||
*
|
||||
* @param diagram The diagram to be used instead of the old diagram.
|
||||
* This parameter must not be zero, or the method will do nothing.
|
||||
*
|
||||
* @param oldDiagram The diagram to be removed by the new diagram. This
|
||||
* diagram will be deleted automatically. If the parameter is omitted,
|
||||
* the very first diagram will be replaced. In case, there was no
|
||||
* diagram yet, the new diagram will just be added.
|
||||
*
|
||||
* \note If you want to re-use the old diagram, call takeDiagram and
|
||||
* addDiagram, instead of using replaceDiagram.
|
||||
*
|
||||
* \sa addDiagram, takeDiagram
|
||||
*/
|
||||
virtual void replaceDiagram( AbstractDiagram* diagram, AbstractDiagram* oldDiagram = 0 );
|
||||
|
||||
/**
|
||||
* Removes the diagram from the plane, without deleting it.
|
||||
*
|
||||
* The plane no longer owns the diagram, so it is
|
||||
* the caller's responsibility to delete the diagram.
|
||||
*
|
||||
* \sa addDiagram, replaceDiagram
|
||||
*/
|
||||
virtual void takeDiagram( AbstractDiagram* diagram );
|
||||
|
||||
/**
|
||||
* @return The first diagram associated with this coordinate plane.
|
||||
*/
|
||||
AbstractDiagram* diagram();
|
||||
|
||||
/**
|
||||
* @return The list of diagrams associated with this coordinate plane.
|
||||
*/
|
||||
AbstractDiagramList diagrams();
|
||||
|
||||
/**
|
||||
* @return The list of diagrams associated with this coordinate plane.
|
||||
*/
|
||||
ConstAbstractDiagramList diagrams() const;
|
||||
|
||||
/**
|
||||
* Distribute the available space among the diagrams and axes.
|
||||
*/
|
||||
virtual void layoutDiagrams() = 0;
|
||||
|
||||
/**
|
||||
* Translate the given point in value space coordinates to a position
|
||||
* in pixel space.
|
||||
* @param diagramPoint The point in value coordinates.
|
||||
* @returns The translated point.
|
||||
*/
|
||||
virtual const QPointF translate( const QPointF& diagramPoint ) const = 0;
|
||||
|
||||
/**
|
||||
* @return Whether zooming with a rubber band using the mouse is enabled.
|
||||
*/
|
||||
bool isRubberBandZoomingEnabled() const;
|
||||
|
||||
/**
|
||||
* Enables or disables zooming with a rubber band using the mouse.
|
||||
*/
|
||||
void setRubberBandZoomingEnabled( bool enable );
|
||||
|
||||
/**
|
||||
* @return The zoom factor in horizontal direction, that is applied
|
||||
* to all coordinate transformations.
|
||||
*/
|
||||
virtual qreal zoomFactorX() const { return 1.0; }
|
||||
|
||||
/**
|
||||
* @return The zoom factor in vertical direction, that is applied
|
||||
* to all coordinate transformations.
|
||||
*/
|
||||
virtual qreal zoomFactorY() const { return 1.0; }
|
||||
|
||||
/**
|
||||
* Sets both zoom factors in one go.
|
||||
* \sa setZoomFactorX,setZoomFactorY
|
||||
*/
|
||||
virtual void setZoomFactors( qreal factorX, qreal factorY ) { Q_UNUSED( factorX ); Q_UNUSED( factorY ); }
|
||||
|
||||
/**
|
||||
* Sets the zoom factor in horizontal direction, that is applied
|
||||
* to all coordinate transformations.
|
||||
* @param factor The new zoom factor
|
||||
*/
|
||||
virtual void setZoomFactorX( qreal factor ) { Q_UNUSED( factor ); }
|
||||
|
||||
/**
|
||||
* Sets the zoom factor in vertical direction, that is applied
|
||||
* to all coordinate transformations.
|
||||
* @param factor The new zoom factor
|
||||
*/
|
||||
virtual void setZoomFactorY( qreal factor ) { Q_UNUSED( factor ); }
|
||||
|
||||
/**
|
||||
* @return The center point (in value coordinates) of the
|
||||
* coordinate plane, that is used for zoom operations.
|
||||
*/
|
||||
virtual QPointF zoomCenter() const { return QPointF(0.0, 0.0); }
|
||||
|
||||
/**
|
||||
* Set the point (in value coordinates) to be used as the
|
||||
* center point in zoom operations.
|
||||
* @param center The point to use.
|
||||
*/
|
||||
virtual void setZoomCenter( const QPointF& center ) { Q_UNUSED( center ); }
|
||||
|
||||
/**
|
||||
* Set the grid attributes to be used by this coordinate plane.
|
||||
* To disable grid painting, for example, your code should like this:
|
||||
* \code
|
||||
* GridAttributes ga = plane->globalGridAttributes();
|
||||
* ga.setGlobalGridVisible( false );
|
||||
* plane->setGlobalGridAttributes( ga );
|
||||
* \endcode
|
||||
* \sa globalGridAttributes
|
||||
* \sa CartesianCoordinatePlane::setGridAttributes
|
||||
*/
|
||||
void setGlobalGridAttributes( const GridAttributes & );
|
||||
|
||||
/**
|
||||
* @return The grid attributes used by this coordinate plane.
|
||||
* \sa setGlobalGridAttributes
|
||||
* \sa CartesianCoordinatePlane::gridAttributes
|
||||
*/
|
||||
GridAttributes globalGridAttributes() const;
|
||||
|
||||
/**
|
||||
* Returns the dimensions used for drawing the grid lines.
|
||||
*
|
||||
* Returned data is the result of (cached) grid calculations,
|
||||
* so - if you need that information for your own tasks - make sure to
|
||||
* call again this function after every data modification that has changed
|
||||
* the data range, since grid calculation is based upon the data range,
|
||||
* thus the grid start/end might have changed if the data was changed.
|
||||
*
|
||||
* @note Returned list will contain different numbers of DataDimension,
|
||||
* depending on the kind of coordinate plane used.
|
||||
* For CartesianCoordinatePlane two DataDimension are returned: the first
|
||||
* representing grid lines in X direction (matching the Abscissa axes)
|
||||
* and the second indicating vertical grid lines (or Ordinate axes, resp.).
|
||||
*
|
||||
* @return The dimensions used for drawing the grid lines.
|
||||
* @sa DataDimension
|
||||
*/
|
||||
DataDimensionsList gridDimensionsList();
|
||||
|
||||
/**
|
||||
* Set another coordinate plane to be used as the reference plane
|
||||
* for this one.
|
||||
* @param plane The coordinate plane to be used the reference plane
|
||||
* for this one.
|
||||
* @see referenceCoordinatePlane
|
||||
*/
|
||||
void setReferenceCoordinatePlane( AbstractCoordinatePlane * plane );
|
||||
|
||||
/**
|
||||
* There are two ways, in which planes can be caused to interact, in
|
||||
* where they are put layouting wise: The first is the reference plane. If
|
||||
* such a reference plane is set, on a plane, it will use the same cell in the
|
||||
* layout as that one. In addition to this, planes can share an axis. In that case
|
||||
* they will be laid out in relation to each other as suggested by the position
|
||||
* of the axis. If, for example Plane1 and Plane2 share an axis at position Left,
|
||||
* that will result in the layout: Axis Plane1 Plane 2, vertically. If Plane1
|
||||
* also happens to be Plane2's reference plane, both planes are drawn over each
|
||||
* other. The reference plane concept allows two planes to share the same space
|
||||
* even if neither has any axis, and in case there are shared axis, it is used
|
||||
* to decided, whether the planes should be painted on top of each other or
|
||||
* laid out vertically or horizontally next to each other.
|
||||
* @return The reference coordinate plane associated with this one.
|
||||
*/
|
||||
AbstractCoordinatePlane * referenceCoordinatePlane() const;
|
||||
|
||||
/**
|
||||
* @return Whether this plane should have spacers in the corners
|
||||
* formed by the presence of axes.
|
||||
*/
|
||||
bool isCornerSpacersEnabled() const;
|
||||
|
||||
/**
|
||||
* Enables or disables the use of spacers in the plane corners.
|
||||
*/
|
||||
void setCornerSpacersEnabled( bool enable );
|
||||
|
||||
virtual AbstractCoordinatePlane* sharedAxisMasterPlane( QPainter* p = 0 ); // KDChart 3: const method?
|
||||
|
||||
|
||||
/** pure virtual in QLayoutItem */
|
||||
virtual bool isEmpty() const;
|
||||
/** pure virtual in QLayoutItem */
|
||||
virtual Qt::Orientations expandingDirections() const;
|
||||
/** pure virtual in QLayoutItem */
|
||||
virtual QSize maximumSize() const;
|
||||
/** pure virtual in QLayoutItem */
|
||||
virtual QSize minimumSize() const;
|
||||
/** pure virtual in QLayoutItem */
|
||||
virtual QSize sizeHint() const;
|
||||
/** pure virtual in QLayoutItem
|
||||
*
|
||||
* \note Do not call this function directly, unless you know
|
||||
* exactly what you are doing. Geometry management is done
|
||||
* by KD Chart's internal layouting measures.
|
||||
*/
|
||||
virtual void setGeometry( const QRect& r );
|
||||
/** pure virtual in QLayoutItem */
|
||||
virtual QRect geometry() const;
|
||||
|
||||
virtual void mousePressEvent( QMouseEvent* event );
|
||||
virtual void mouseDoubleClickEvent( QMouseEvent* event );
|
||||
virtual void mouseMoveEvent( QMouseEvent* event );
|
||||
virtual void mouseReleaseEvent( QMouseEvent* event );
|
||||
|
||||
/**
|
||||
* Called internally by KDChart::Chart
|
||||
*/
|
||||
void setParent( Chart* parent );
|
||||
Chart* parent();
|
||||
const Chart* parent() const;
|
||||
|
||||
/**
|
||||
* Tests, if a point is visible on the coordinate plane.
|
||||
*
|
||||
* \note Before calling this function the point must have been translated into coordinate plane space.
|
||||
*/
|
||||
#if QT_VERSION < 0x040400 || defined(Q_COMPILER_MANGLES_RETURN_TYPE)
|
||||
const bool isVisiblePoint( const QPointF& point ) const;
|
||||
#else
|
||||
bool isVisiblePoint( const QPointF& point ) const;
|
||||
#endif
|
||||
|
||||
public Q_SLOTS:
|
||||
/**
|
||||
* Calling update() on the plane triggers the global KDChart::Chart::update()
|
||||
*/
|
||||
void update();
|
||||
/**
|
||||
* Calling relayout() on the plane triggers the global KDChart::Chart::slotRelayout()
|
||||
*/
|
||||
void relayout();
|
||||
/**
|
||||
* Calling layoutPlanes() on the plane triggers the global KDChart::Chart::slotLayoutPlanes()
|
||||
*/
|
||||
void layoutPlanes();
|
||||
/**
|
||||
* Used by the chart to clear the cached grid data.
|
||||
*/
|
||||
void setGridNeedsRecalculate();
|
||||
|
||||
Q_SIGNALS:
|
||||
/** Emitted when this coordinate plane is destroyed. */
|
||||
void destroyedCoordinatePlane( AbstractCoordinatePlane* );
|
||||
|
||||
/** Emitted when plane needs to update its drawings. */
|
||||
void needUpdate();
|
||||
|
||||
/** Emitted when plane needs to trigger the Chart's layouting. */
|
||||
void needRelayout();
|
||||
|
||||
/** Emitted when plane needs to trigger the Chart's layouting of the coord. planes. */
|
||||
void needLayoutPlanes();
|
||||
|
||||
/** Emitted upon change of a property of the Coordinate Plane or any of its components. */
|
||||
void propertiesChanged();
|
||||
|
||||
void boundariesChanged();
|
||||
|
||||
/** Emitted after the geometry of the Coordinate Plane has been changed.
|
||||
* and control has returned to the event loop.
|
||||
*
|
||||
* Parameters are the the old geometry, the new geometry.
|
||||
*/
|
||||
void geometryChanged( QRect, QRect );
|
||||
|
||||
private:
|
||||
Q_SIGNALS:
|
||||
// Emitted from inside the setGeometry()
|
||||
// This is connected via QueuedConnection to the geometryChanged() Signal
|
||||
// that users can connect to safely then.
|
||||
void internal_geometryChanged( QRect, QRect );
|
||||
/** Emitted upon change of the view coordinate system */
|
||||
void viewportCoordinateSystemChanged();
|
||||
|
||||
protected:
|
||||
virtual DataDimensionsList getDataDimensionsList() const = 0;
|
||||
|
||||
//KDCHART_DECLARE_PRIVATE_DERIVED( AbstractCoordinatePlane )
|
||||
};
|
||||
|
||||
/**
|
||||
* \brief Helper class for one dimension of data, e.g. for the rows in a data model,
|
||||
* or for the labels of an axis, or for the vertical lines in a grid.
|
||||
*
|
||||
* isCalculated specifies whether this dimension's values are calculated or counted.
|
||||
* (counted == "Item 1", "Item 2", "Item 3" ...)
|
||||
*
|
||||
* sequence is the GranularitySequence, as specified at for the respective
|
||||
* coordinate plane.
|
||||
*
|
||||
* Step width is an optional parameter, to be omitted (or set to Zero, resp.)
|
||||
* if the step width is unknown.
|
||||
*
|
||||
* The default c'tor just gets you counted values from 1..10, using step width 1,
|
||||
* used by the CartesianGrid, when showing an empty plane without any diagrams.
|
||||
*/
|
||||
class DataDimension{
|
||||
public:
|
||||
DataDimension()
|
||||
: start( 1.0 )
|
||||
, end( 10.0 )
|
||||
, isCalculated( false )
|
||||
, calcMode( AbstractCoordinatePlane::Linear )
|
||||
, sequence( KDChartEnums::GranularitySequence_10_20 )
|
||||
, stepWidth( 1.0 )
|
||||
, subStepWidth( 0.0 )
|
||||
{}
|
||||
DataDimension( qreal start_,
|
||||
qreal end_,
|
||||
bool isCalculated_,
|
||||
AbstractCoordinatePlane::AxesCalcMode calcMode_,
|
||||
KDChartEnums::GranularitySequence sequence_,
|
||||
qreal stepWidth_=0.0,
|
||||
qreal subStepWidth_=0.0 )
|
||||
: start( start_ )
|
||||
, end( end_ )
|
||||
, isCalculated( isCalculated_ )
|
||||
, calcMode( calcMode_ )
|
||||
, sequence( sequence_ )
|
||||
, stepWidth( stepWidth_ )
|
||||
, subStepWidth( subStepWidth_ )
|
||||
{}
|
||||
/**
|
||||
* Returns the size of the distance,
|
||||
* equivalent to the width() (or height(), resp.) of a QRectF.
|
||||
*
|
||||
* Note that this value can be negative, e.g. indicating axis labels
|
||||
* going in reversed direction.
|
||||
*/
|
||||
qreal distance() const
|
||||
{
|
||||
return end-start;
|
||||
}
|
||||
|
||||
bool operator==( const DataDimension& r ) const
|
||||
{
|
||||
return
|
||||
(start == r.start) &&
|
||||
(end == r.end) &&
|
||||
(sequence == r.sequence) &&
|
||||
(isCalculated == r.isCalculated) &&
|
||||
(calcMode == r.calcMode) &&
|
||||
(stepWidth == r.stepWidth) &&
|
||||
(subStepWidth == r.subStepWidth);
|
||||
}
|
||||
|
||||
bool operator!=( const DataDimension& other ) const
|
||||
{ return !operator==( other ); }
|
||||
|
||||
|
||||
qreal start;
|
||||
qreal end;
|
||||
bool isCalculated;
|
||||
AbstractCoordinatePlane::AxesCalcMode calcMode;
|
||||
KDChartEnums::GranularitySequence sequence;
|
||||
qreal stepWidth;
|
||||
qreal subStepWidth;
|
||||
};
|
||||
|
||||
#if !defined(QT_NO_DEBUG_STREAM)
|
||||
QDebug operator<<( QDebug stream, const DataDimension& r );
|
||||
#endif
|
||||
|
||||
}
|
||||
#endif
|
|
@ -0,0 +1 @@
|
|||
#include "KDChartAbstractDiagram.h"
|
|
@ -0,0 +1,742 @@
|
|||
/****************************************************************************
|
||||
** Copyright (C) 2001-2013 Klaralvdalens Datakonsult AB. All rights reserved.
|
||||
**
|
||||
** This file is part of the KD Chart library.
|
||||
**
|
||||
** Licensees holding valid commercial KD Chart licenses may use this file in
|
||||
** accordance with the KD Chart Commercial License Agreement provided with
|
||||
** the Software.
|
||||
**
|
||||
**
|
||||
** This file may be distributed and/or modified under the terms of the
|
||||
** GNU General Public License version 2 and version 3 as published by the
|
||||
** Free Software Foundation and appearing in the file LICENSE.GPL.txt included.
|
||||
**
|
||||
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
|
||||
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
||||
**
|
||||
** Contact info@kdab.com if any conditions of this licensing are not
|
||||
** clear to you.
|
||||
**
|
||||
**********************************************************************/
|
||||
|
||||
#ifndef KDCHARTABSTRACTDIAGRAM_H
|
||||
#define KDCHARTABSTRACTDIAGRAM_H
|
||||
|
||||
#include <QList>
|
||||
#include <QRectF>
|
||||
#include <QAbstractItemView>
|
||||
|
||||
#include "KDChartGlobal.h"
|
||||
#include "KDChartMarkerAttributes.h"
|
||||
#include "KDChartAttributesModel.h"
|
||||
|
||||
namespace KDChart {
|
||||
|
||||
class AbstractCoordinatePlane;
|
||||
class AttributesModel;
|
||||
class DataValueAttributes;
|
||||
class PaintContext;
|
||||
|
||||
/**
|
||||
* @brief AbstractDiagram defines the interface for diagram classes
|
||||
*
|
||||
* AbstractDiagram is the base class for diagram classes ("chart types").
|
||||
*
|
||||
* It defines the interface, that needs to be implemented for the diagram,
|
||||
* to function within the KDChart framework. It extends Interview's
|
||||
* QAbstractItemView.
|
||||
*/
|
||||
class KDCHART_EXPORT AbstractDiagram : public QAbstractItemView
|
||||
{
|
||||
Q_OBJECT
|
||||
Q_DISABLE_COPY( AbstractDiagram )
|
||||
KDCHART_DECLARE_PRIVATE_BASE_POLYMORPHIC( AbstractDiagram )
|
||||
|
||||
friend class AbstractCoordinatePlane;
|
||||
friend class CartesianCoordinatePlane;
|
||||
friend class PolarCoordinatePlane;
|
||||
|
||||
protected:
|
||||
explicit inline AbstractDiagram(
|
||||
Private *p, QWidget* parent, AbstractCoordinatePlane* plane );
|
||||
explicit AbstractDiagram (
|
||||
QWidget* parent = 0, AbstractCoordinatePlane* plane = 0 );
|
||||
public:
|
||||
virtual ~AbstractDiagram();
|
||||
|
||||
|
||||
/**
|
||||
* Returns true if both diagrams have the same settings.
|
||||
*/
|
||||
bool compare( const AbstractDiagram* other ) const;
|
||||
|
||||
|
||||
/**
|
||||
* @brief Return the bottom left and top right data point, that the
|
||||
* diagram will display (unless the grid adjusts these values).
|
||||
*
|
||||
* This method returns a cached result of calculations done by
|
||||
* calculateDataBoundaries.
|
||||
* Classes derived from AbstractDiagram must implement the
|
||||
* calculateDataBoundaries function, to specify their own
|
||||
* way of calculating the data boundaries.
|
||||
* If derived classes want to force recalculation of the
|
||||
* data boundaries, they can call setDataBoundariesDirty()
|
||||
*
|
||||
* Returned value is in diagram coordinates.
|
||||
*/
|
||||
const QPair<QPointF, QPointF> dataBoundaries() const;
|
||||
|
||||
// protected: // FIXME: why should that be private? (Mirko)
|
||||
/**
|
||||
* Draw the diagram contents to the rectangle and painter, that are
|
||||
* passed in as part of the paint context.
|
||||
*
|
||||
* @param paintContext All information needed for painting.
|
||||
*/
|
||||
virtual void paint ( PaintContext* paintContext ) = 0;
|
||||
|
||||
/**
|
||||
* Called by the widget's sizeEvent. Adjust all internal structures,
|
||||
* that are calculated, dependending on the size of the widget.
|
||||
*
|
||||
* @param area
|
||||
*/
|
||||
virtual void resize ( const QSizeF& area ) = 0;
|
||||
|
||||
/** Associate a model with the diagram. */
|
||||
virtual void setModel ( QAbstractItemModel * model );
|
||||
|
||||
/** Associate a seleection model with the diagrom. */
|
||||
virtual void setSelectionModel( QItemSelectionModel* selectionModel );
|
||||
|
||||
/**
|
||||
* Associate an AttributesModel with this diagram. Note that
|
||||
* the diagram does _not_ take ownership of the AttributesModel.
|
||||
* This should thus only be used with AttributesModels that
|
||||
* have been explicitly created by the user, and are owned
|
||||
* by her. Setting an AttributesModel that is internal to
|
||||
* another diagram is an error.
|
||||
*
|
||||
* Correct:
|
||||
*
|
||||
* \code
|
||||
* AttributesModel *am = new AttributesModel( model, 0 );
|
||||
* diagram1->setAttributesModel( am );
|
||||
* diagram2->setAttributesModel( am );
|
||||
*
|
||||
* \endcode
|
||||
*
|
||||
* Wrong:
|
||||
*
|
||||
* \code
|
||||
*
|
||||
* diagram1->setAttributesModel( diagram2->attributesModel() );
|
||||
*
|
||||
* \endcode
|
||||
*
|
||||
* @param model The AttributesModel to use for this diagram.
|
||||
* @see AttributesModel, usesExternalAttributesModel
|
||||
*/
|
||||
virtual void setAttributesModel( AttributesModel* model );
|
||||
|
||||
/**
|
||||
* Returns whether the diagram is using its own built-in attributes model
|
||||
* or an attributes model that was set via setAttributesModel.
|
||||
*
|
||||
* @see setAttributesModel
|
||||
*/
|
||||
virtual bool usesExternalAttributesModel() const;
|
||||
|
||||
/**
|
||||
* Returns the AttributesModel, that is used by this diagram.
|
||||
* By default each diagram owns its own AttributesModel, which
|
||||
* should never be deleted. Only if a user-supplied AttributesModel
|
||||
* has been set does the pointer returned here not belong to the
|
||||
* diagram.
|
||||
*
|
||||
* @return The AttributesModel associated with the diagram.
|
||||
* @see setAttributesModel
|
||||
*/
|
||||
virtual AttributesModel* attributesModel() const;
|
||||
|
||||
/** Set the root index in the model, where the diagram starts
|
||||
* referencing data for display. */
|
||||
virtual void setRootIndex ( const QModelIndex& idx );
|
||||
|
||||
/** \reimpl */
|
||||
virtual QRect visualRect(const QModelIndex &index) const;
|
||||
/** \reimpl */
|
||||
virtual void scrollTo(const QModelIndex &index, ScrollHint hint = EnsureVisible);
|
||||
/** \reimpl */
|
||||
virtual QModelIndex indexAt(const QPoint &point) const;
|
||||
/** \reimpl */
|
||||
virtual QModelIndex moveCursor(CursorAction cursorAction, Qt::KeyboardModifiers modifiers);
|
||||
/** \reimpl */
|
||||
virtual int horizontalOffset() const;
|
||||
/** \reimpl */
|
||||
virtual int verticalOffset() const;
|
||||
/** \reimpl */
|
||||
virtual bool isIndexHidden(const QModelIndex &index) const;
|
||||
/** \reimpl */
|
||||
virtual void setSelection(const QRect &rect, QItemSelectionModel::SelectionFlags command);
|
||||
/** \reimpl */
|
||||
virtual QRegion visualRegionForSelection(const QItemSelection &selection) const;
|
||||
virtual QRegion visualRegion(const QModelIndex &index) const;
|
||||
/** \reimpl */
|
||||
#if QT_VERSION < 0x050000
|
||||
virtual void dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight);
|
||||
#else
|
||||
virtual void dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight, const QVector<int> &roles = QVector<int>());
|
||||
#endif
|
||||
/** \reimpl */
|
||||
virtual void doItemsLayout();
|
||||
|
||||
/**
|
||||
* The coordinate plane associated with the diagram. This determines
|
||||
* how coordinates in value space are mapped into pixel space. By default
|
||||
* this is a CartesianCoordinatePlane.
|
||||
* @return The coordinate plane associated with the diagram.
|
||||
*/
|
||||
AbstractCoordinatePlane* coordinatePlane() const;
|
||||
|
||||
/**
|
||||
* Set the coordinate plane associated with the diagram. This determines
|
||||
* how coordinates in value space are mapped into pixel space. The chart
|
||||
* takes ownership.
|
||||
* @return The coordinate plane associated with the diagram.
|
||||
*/
|
||||
virtual void setCoordinatePlane( AbstractCoordinatePlane* plane );
|
||||
|
||||
|
||||
/**
|
||||
* Hide (or unhide, resp.) a data cell.
|
||||
*
|
||||
* \note Hidden data are still taken into account by the coordinate plane,
|
||||
* so neither the grid nor your axes' ranges will change, when you hide data.
|
||||
* For totally removing data from KD Chart's view you can use another approach:
|
||||
* e.g. you could define a proxy model on top of your data model, and register
|
||||
* the proxy model calling setModel() instead of registering your real data model.
|
||||
*
|
||||
* @param index The datapoint to set the hidden status for. With a dataset dimension
|
||||
* of two, this is the index of the key of each key/value pair.
|
||||
* @param hidden The hidden status to set.
|
||||
*/
|
||||
void setHidden( const QModelIndex & index, bool hidden );
|
||||
|
||||
/**
|
||||
* Hide (or unhide, resp.) a dataset.
|
||||
*
|
||||
* \note Hidden data are still taken into account by the coordinate plane,
|
||||
* so neither the grid nor your axes' ranges will change, when you hide data.
|
||||
* For totally removing data from KD Chart's view you can use another approach:
|
||||
* e.g. you could define a proxy model on top of your data model, and register
|
||||
* the proxy model calling setModel() instead of registering your real data model.
|
||||
*
|
||||
* @param dataset The dataset to set the hidden status for.
|
||||
* @param hidden The hidden status to set.
|
||||
*/
|
||||
void setHidden( int dataset, bool hidden );
|
||||
|
||||
/**
|
||||
* Hide (or unhide, resp.) all datapoints in the model.
|
||||
*
|
||||
* \note Hidden data are still taken into account by the coordinate plane,
|
||||
* so neither the grid nor your axes' ranges will change, when you hide data.
|
||||
* For totally removing data from KD Chart's view you can use another approach:
|
||||
* e.g. you could define a proxy model on top of your data model, and register
|
||||
* the proxy model calling setModel() instead of registering your real data model.
|
||||
*
|
||||
* @param hidden The hidden status to set.
|
||||
*/
|
||||
void setHidden( bool hidden );
|
||||
|
||||
/**
|
||||
* Retrieve the hidden status specified globally. This will fall
|
||||
* back automatically to the default settings ( = not hidden), if there
|
||||
* are no specific settings.
|
||||
* @return The global hidden status.
|
||||
*/
|
||||
bool isHidden() const;
|
||||
|
||||
/**
|
||||
* Retrieve the hidden status for the given dataset. This will fall
|
||||
* back automatically to what was set at diagram level, if there
|
||||
* are no dataset specific settings.
|
||||
* @param dataset The dataset to retrieve the hidden status for.
|
||||
* @return The hidden status for the given dataset.
|
||||
*/
|
||||
bool isHidden( int dataset ) const;
|
||||
|
||||
/**
|
||||
* Retrieve the hidden status for the given index. This will fall
|
||||
* back automatically to what was set at dataset or diagram level, if there
|
||||
* are no datapoint specific settings.
|
||||
* @param index The datapoint to retrieve the hidden status for.
|
||||
* @return The hidden status for the given index.
|
||||
*/
|
||||
bool isHidden( const QModelIndex & index ) const;
|
||||
|
||||
|
||||
/**
|
||||
* Set the DataValueAttributes for the given index.
|
||||
* @param index The datapoint to set the attributes for. With a dataset dimension
|
||||
* of two, this is the index of the key of each key/value pair.
|
||||
* @param a The attributes to set.
|
||||
*/
|
||||
void setDataValueAttributes( const QModelIndex & index,
|
||||
const DataValueAttributes & a );
|
||||
|
||||
/**
|
||||
* Set the DataValueAttributes for the given dataset.
|
||||
* @param dataset The dataset to set the attributes for.
|
||||
* @param a The attributes to set.
|
||||
*/
|
||||
void setDataValueAttributes( int dataset, const DataValueAttributes & a );
|
||||
|
||||
/**
|
||||
* Set the DataValueAttributes for all datapoints in the model.
|
||||
* @param a The attributes to set.
|
||||
*/
|
||||
void setDataValueAttributes( const DataValueAttributes & a );
|
||||
|
||||
/**
|
||||
* Retrieve the DataValueAttributes specified globally. This will fall
|
||||
* back automatically to the default settings, if there
|
||||
* are no specific settings.
|
||||
* @return The global DataValueAttributes.
|
||||
*/
|
||||
DataValueAttributes dataValueAttributes() const;
|
||||
|
||||
/**
|
||||
* Retrieve the DataValueAttributes for the given dataset. This will fall
|
||||
* back automatically to what was set at model level, if there
|
||||
* are no dataset specific settings.
|
||||
* @param dataset The dataset to retrieve the attributes for.
|
||||
* @return The DataValueAttributes for the given dataset.
|
||||
*/
|
||||
DataValueAttributes dataValueAttributes( int dataset ) const;
|
||||
|
||||
/**
|
||||
* Retrieve the DataValueAttributes for the given index. This will fall
|
||||
* back automatically to what was set at dataset or model level, if there
|
||||
* are no datapoint specific settings.
|
||||
* @param index The datapoint to retrieve the attributes for. With a dataset dimension
|
||||
* of two, this is the index of the key of each key/value pair.
|
||||
* @return The DataValueAttributes for the given index.
|
||||
*/
|
||||
DataValueAttributes dataValueAttributes( const QModelIndex & index ) const;
|
||||
|
||||
/**
|
||||
* Set the pen to be used, for painting the datapoint at the given index.
|
||||
* @param index The datapoint's index in the model. With a dataset dimension
|
||||
* of two, this is the index of the key of each key/value pair.
|
||||
* @param pen The pen to use.
|
||||
*/
|
||||
void setPen( const QModelIndex& index, const QPen& pen );
|
||||
|
||||
/**
|
||||
* Set the pen to be used, for painting the given dataset.
|
||||
* @param dataset The dataset to set the pen for.
|
||||
* @param pen The pen to use.
|
||||
*/
|
||||
void setPen( int dataset, const QPen& pen );
|
||||
|
||||
/**
|
||||
* Set the pen to be used, for painting all datasets in the model.
|
||||
* @param pen The pen to use.
|
||||
*/
|
||||
void setPen( const QPen& pen );
|
||||
|
||||
/**
|
||||
* Retrieve the pen to be used for painting datapoints globally. This will fall
|
||||
* back automatically to the default settings, if there
|
||||
* are no specific settings.
|
||||
* @return The pen to use for painting.
|
||||
*/
|
||||
QPen pen() const;
|
||||
/**
|
||||
* Retrieve the pen to be used for the given dataset. This will fall
|
||||
* back automatically to what was set at model level, if there
|
||||
* are no dataset specific settings.
|
||||
* @param dataset The dataset to retrieve the pen for.
|
||||
* @return The pen to use for painting.
|
||||
*/
|
||||
QPen pen( int dataset ) const;
|
||||
/**
|
||||
* Retrieve the pen to be used, for painting the datapoint at the given
|
||||
* index in the model.
|
||||
* @param index The index of the datapoint in the model. With a dataset dimension
|
||||
* of two, this is the index of the key of each key/value pair.
|
||||
* @return The pen to use for painting.
|
||||
*/
|
||||
QPen pen( const QModelIndex& index ) const;
|
||||
|
||||
/**
|
||||
* Set the brush to be used, for painting the datapoint at the given index.
|
||||
* @param index The datapoint's index in the model. With a dataset dimension
|
||||
* of two, this is the index of the key of each key/value pair.
|
||||
* @param brush The brush to use.
|
||||
*/
|
||||
void setBrush( const QModelIndex& index, const QBrush& brush);
|
||||
|
||||
/**
|
||||
* Set the brush to be used, for painting the given dataset.
|
||||
* @param dataset The dataset to set the brush for.
|
||||
* @param brush The brush to use.
|
||||
*/
|
||||
void setBrush( int dataset, const QBrush& brush );
|
||||
|
||||
/**
|
||||
* Set the brush to be used, for painting all datasets in the model.
|
||||
* @param brush The brush to use.
|
||||
*/
|
||||
void setBrush( const QBrush& brush);
|
||||
|
||||
/**
|
||||
* Retrieve the brush to be used for painting datapoints globally. This will fall
|
||||
* back automatically to the default settings, if there
|
||||
* are no specific settings.
|
||||
* @return The brush to use for painting.
|
||||
*/
|
||||
QBrush brush() const;
|
||||
/**
|
||||
* Retrieve the brush to be used for the given dataset. This will fall
|
||||
* back automatically to what was set at model level, if there
|
||||
* are no dataset specific settings.
|
||||
* @param dataset The dataset to retrieve the brush for.
|
||||
* @return The brush to use for painting.
|
||||
*/
|
||||
QBrush brush( int dataset ) const;
|
||||
/**
|
||||
* Retrieve the brush to be used, for painting the datapoint at the given
|
||||
* index in the model.
|
||||
* @param index The index of the datapoint in the model. With a dataset dimension
|
||||
* of two, this is the index of the key of each key/value pair.
|
||||
* @return The brush to use for painting.
|
||||
*/
|
||||
QBrush brush( const QModelIndex& index ) const;
|
||||
|
||||
/**
|
||||
* Set the unit prefix to be used on axes for one specific column.
|
||||
* @param prefix The prefix to be used.
|
||||
* @param column The column which should be set.
|
||||
* @param orientation The orientation of the axis to use.
|
||||
*/
|
||||
void setUnitPrefix( const QString& prefix, int column, Qt::Orientation orientation );
|
||||
/**
|
||||
* Set the unit prefix to be used on axes for all columns.
|
||||
* @param prefix The prefix to be used.
|
||||
* @param orientation The orientation of the axis to use.
|
||||
*/
|
||||
void setUnitPrefix( const QString& prefix, Qt::Orientation orientation );
|
||||
|
||||
/**
|
||||
* Set the unit prefix to be used on axes for one specific column.
|
||||
* @param suffix The suffix to be used.
|
||||
* @param column The column which should be set.
|
||||
* @param orientation The orientation of the axis to use.
|
||||
*/
|
||||
void setUnitSuffix( const QString& suffix, int column, Qt::Orientation orientation );
|
||||
/**
|
||||
* Set the unit prefix to be used on axes for all columns.
|
||||
* @param suffix The suffix to be used.
|
||||
* @param orientation The orientation of the axis to use.
|
||||
*/
|
||||
void setUnitSuffix( const QString& suffix, Qt::Orientation orientation );
|
||||
|
||||
/**
|
||||
* Retrieves the axis unit prefix for a specific column.
|
||||
* @param column The column whose prefix should be retrieved.
|
||||
* @param orientation The orientation of the axis.
|
||||
* @param fallback If true, the prefix for all columns is returned, when
|
||||
* none is set for the selected column.
|
||||
* @return The axis unit prefix.
|
||||
*/
|
||||
QString unitPrefix( int column, Qt::Orientation orientation, bool fallback = false ) const;
|
||||
/**
|
||||
* Retrieves the axis unit prefix.
|
||||
* @param orientation The orientation of the axis.
|
||||
* @return The axis unit prefix.
|
||||
*/
|
||||
QString unitPrefix( Qt::Orientation orientation ) const;
|
||||
|
||||
/**
|
||||
* Retrieves the axis unit suffix for a specific column.
|
||||
* @param column The column whose prefix should be retrieved.
|
||||
* @param orientation The orientation of the axis.
|
||||
* @param fallback If true, the suffix for all columns is returned, when
|
||||
* none is set for the selected column.
|
||||
* @return The axis unit suffix.
|
||||
*/
|
||||
QString unitSuffix( int column, Qt::Orientation orientation, bool fallback = false ) const;
|
||||
/**
|
||||
* Retrieves the axis unit suffix.
|
||||
* @param orientation The orientation of the axis.
|
||||
* @return The axis unit suffix.
|
||||
*/
|
||||
QString unitSuffix( Qt::Orientation orientation ) const;
|
||||
|
||||
/**
|
||||
* Set whether data value labels are allowed to overlap.
|
||||
* @param allow True means that overlapping labels are allowed.
|
||||
*/
|
||||
void setAllowOverlappingDataValueTexts( bool allow );
|
||||
|
||||
/**
|
||||
* @return Whether data value labels are allowed to overlap.
|
||||
*/
|
||||
bool allowOverlappingDataValueTexts() const;
|
||||
|
||||
/**
|
||||
* Set whether anti-aliasing is to be used while rendering
|
||||
* this diagram.
|
||||
* @param enabled True means that AA is enabled.
|
||||
*/
|
||||
void setAntiAliasing( bool enabled );
|
||||
|
||||
/**
|
||||
* @return Whether anti-aliasing is to be used for rendering
|
||||
* this diagram.
|
||||
*/
|
||||
bool antiAliasing() const;
|
||||
|
||||
/**
|
||||
* Set the palette to be used, for painting datasets to the default
|
||||
* palette.
|
||||
* @see KDChart::Palette.
|
||||
* FIXME: fold into one usePalette (KDChart::Palette&) method
|
||||
*/
|
||||
void useDefaultColors();
|
||||
|
||||
/**
|
||||
* Set the palette to be used, for painting datasets to the rainbow
|
||||
* palette.
|
||||
* @see KDChart::Palette.
|
||||
*/
|
||||
void useRainbowColors();
|
||||
|
||||
/**
|
||||
* Set the palette to be used, for painting datasets to the subdued
|
||||
* palette.
|
||||
* @see KDChart::Palette.
|
||||
*/
|
||||
void useSubduedColors();
|
||||
|
||||
/**
|
||||
* The set of item row labels currently displayed, for use in Abscissa axes, etc.
|
||||
* @return The set of item row labels currently displayed.
|
||||
*/
|
||||
QStringList itemRowLabels() const;
|
||||
|
||||
/**
|
||||
* The set of dataset labels currently displayed, for use in legends, etc.
|
||||
* @return The set of dataset labels currently displayed.
|
||||
*/
|
||||
QStringList datasetLabels() const;
|
||||
|
||||
/**
|
||||
* The set of dataset brushes currently used, for use in legends, etc.
|
||||
*
|
||||
* @note Cell-level override brushes, if set, take precedence over the
|
||||
* dataset values, so you might need to check these too, in order to find
|
||||
* the brush, that is used for a single cell.
|
||||
*
|
||||
* @return The current set of dataset brushes.
|
||||
*/
|
||||
QList<QBrush> datasetBrushes() const;
|
||||
|
||||
/**
|
||||
* The set of dataset pens currently used, for use in legends, etc.
|
||||
*
|
||||
* @note Cell-level override pens, if set, take precedence over the
|
||||
* dataset values, so you might need to check these too, in order to find
|
||||
* the pens, that is used for a single cell.
|
||||
*
|
||||
* @return The current set of dataset pens.
|
||||
*/
|
||||
QList<QPen> datasetPens() const;
|
||||
|
||||
/**
|
||||
* The set of dataset markers currently used, for use in legends, etc.
|
||||
*
|
||||
* @note Cell-level override markers, if set, take precedence over the
|
||||
* dataset values, so you might need to check these too, in order to find
|
||||
* the marker, that is shown for a single cell.
|
||||
*
|
||||
* @return The current set of dataset brushes.
|
||||
*/
|
||||
QList<MarkerAttributes> datasetMarkers() const;
|
||||
|
||||
|
||||
/**
|
||||
* \deprecated
|
||||
*
|
||||
* \brief Deprecated method that turns the percent mode of this diagram on or off.
|
||||
*
|
||||
* This method is deprecated. Use the setType() method of a supporting diagram implementation
|
||||
* instead, e.g. BarDiagram::setType().
|
||||
*
|
||||
* \see percentMode
|
||||
*/
|
||||
void setPercentMode( bool percent );
|
||||
|
||||
|
||||
/**
|
||||
* \brief Returns whether this diagram is drawn in percent mode.
|
||||
*
|
||||
* If true, all data points in the same column of a diagram will
|
||||
* be be drawn at the same X coordinate and stacked up so that the distance from the
|
||||
* last data point (or the zero line) to a data point P is always the ratio of (Y-Value of P)/
|
||||
* (sum of all Y-Values in same column as P) relative to the diagrams height
|
||||
* (or width, if abscissa and ordinate are swapped).
|
||||
*
|
||||
* Note that this property is not applicable to all diagram types.
|
||||
*/
|
||||
bool percentMode() const;
|
||||
|
||||
virtual void paintMarker( QPainter* painter,
|
||||
const MarkerAttributes& markerAttributes,
|
||||
const QBrush& brush, const QPen&,
|
||||
const QPointF& point, const QSizeF& size );
|
||||
|
||||
/**
|
||||
* The dataset dimension of a diagram determines how many value dimensions
|
||||
* it expects each datapoint to have.
|
||||
* For each dimension and data series it will expect one column of values in the model.
|
||||
* If the dimension is 1, automatic values will be used for X.
|
||||
*
|
||||
* For example, a diagram with the default dimension of 1 will have one column
|
||||
* per data series (the Y values) and will use automatic values for X
|
||||
* (1, 2, 3, ... n).
|
||||
* If the dimension is 2, the diagram will use the first, (and the third,
|
||||
* fifth, etc) columns as X values, and the second, (and the fourth, sixth,
|
||||
* etc) column as Y values.
|
||||
* @return The dataset dimension of the diagram.
|
||||
*/
|
||||
int datasetDimension() const;
|
||||
|
||||
/**
|
||||
* \deprecated
|
||||
*
|
||||
* Sets the dataset dimension of the diagram. Using this method
|
||||
* is deprecated. Use the specific diagram types instead.
|
||||
*/
|
||||
void setDatasetDimension( int dimension );
|
||||
|
||||
protected:
|
||||
void setDatasetDimensionInternal( int dimension );
|
||||
|
||||
public:
|
||||
void update() const;
|
||||
|
||||
void paintMarker( QPainter* painter, const DataValueAttributes& a,
|
||||
const QModelIndex& index,
|
||||
const QPointF& pos );
|
||||
void paintMarker( QPainter* painter,
|
||||
const QModelIndex& index,
|
||||
const QPointF& pos );
|
||||
void paintDataValueText( QPainter* painter, const QModelIndex& index,
|
||||
const QPointF& pos, qreal value );
|
||||
|
||||
// reverse mapping:
|
||||
/** This method is added alongside with indexAt from QAIM,
|
||||
since in kdchart multiple indexes can be displayed at the same
|
||||
spot. */
|
||||
QModelIndexList indexesAt( const QPoint& point ) const;
|
||||
QModelIndexList indexesIn( const QRect& rect ) const;
|
||||
|
||||
protected:
|
||||
virtual bool checkInvariants( bool justReturnTheStatus=false ) const;
|
||||
virtual const QPair<QPointF, QPointF> calculateDataBoundaries() const = 0;
|
||||
|
||||
protected Q_SLOTS:
|
||||
void setDataBoundariesDirty() const;
|
||||
|
||||
protected:
|
||||
/**
|
||||
* \deprecated
|
||||
* This method is deprecated and provided for backward-compatibility only.
|
||||
* Your own diagram classes should call
|
||||
* d->paintDataValueTextsAndMarkers() instead
|
||||
* which also is taking care for showing your cell-specific comments, if any,
|
||||
*/
|
||||
virtual void paintDataValueTexts( QPainter* painter );
|
||||
/**
|
||||
* \deprecated
|
||||
* This method is deprecated and provided for backward-compatibility only.
|
||||
* Your own diagram classes should call
|
||||
* d->paintDataValueTextsAndMarkers() instead
|
||||
* which also is taking care for showing your cell-specific comments, if any,
|
||||
*/
|
||||
virtual void paintMarkers( QPainter* painter );
|
||||
void setAttributesModelRootIndex( const QModelIndex& );
|
||||
QModelIndex attributesModelRootIndex() const;
|
||||
|
||||
/**
|
||||
* Helper method, retrieving the data value (DisplayRole) for a given row and column
|
||||
* @param row The row to query.
|
||||
* @param column The column to query.
|
||||
* @return The value of the display role at the given row and column as a qreal.
|
||||
* @deprecated
|
||||
*/
|
||||
qreal valueForCell( int row, int column ) const;
|
||||
|
||||
Q_SIGNALS:
|
||||
/** Diagrams are supposed to emit this signal, when the layout of one
|
||||
of their element changes. Layouts can change, for example, when
|
||||
axes are added or removed, or when the configuration was changed
|
||||
in a way that the axes or the diagram itself are displayed in a
|
||||
different geometry.
|
||||
Changes in the diagrams coordinate system also result
|
||||
in the layoutChanged() signal being emitted.
|
||||
*/
|
||||
void layoutChanged( AbstractDiagram* );
|
||||
|
||||
/**
|
||||
* This signal is emitted when this diagram is being destroyed, but before all the
|
||||
* data, i.e. the attributes model, is invalidated.
|
||||
*/
|
||||
void aboutToBeDestroyed();
|
||||
|
||||
/** This signal is emitted when either the model or the AttributesModel is replaced. */
|
||||
void modelsChanged();
|
||||
|
||||
/** This signal is emitted just before the new attributes model is connected internally.
|
||||
It gives you a chance to connect to its signals first or perform other setup work. */
|
||||
void attributesModelAboutToChange( AttributesModel* newModel, AttributesModel* oldModel );
|
||||
|
||||
/** This signal is emitted, when the model data is changed. */
|
||||
void modelDataChanged();
|
||||
|
||||
/** This signal is emitted, when the hidden status of at least one data cell was (un)set. */
|
||||
void dataHidden();
|
||||
|
||||
/** Emitted upon change of a property of the Diagram. */
|
||||
void propertiesChanged();
|
||||
|
||||
/** Emitted upon change of a data boundary */
|
||||
void boundariesChanged();
|
||||
/** Emitted upon change of the view coordinate system */
|
||||
void viewportCoordinateSystemChanged();
|
||||
|
||||
private:
|
||||
QModelIndex conditionallyMapFromSource( const QModelIndex & sourceIndex ) const;
|
||||
};
|
||||
|
||||
typedef QList<AbstractDiagram*> AbstractDiagramList;
|
||||
typedef QList<const AbstractDiagram*> ConstAbstractDiagramList;
|
||||
|
||||
/**
|
||||
* @brief Internally used class just adding a special constructor used by AbstractDiagram
|
||||
*/
|
||||
class PrivateAttributesModel : public AttributesModel {
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit PrivateAttributesModel( QAbstractItemModel* model, QObject * parent = 0 )
|
||||
: AttributesModel(model,parent) {}
|
||||
};
|
||||
}
|
||||
|
||||
#endif
|
|
@ -0,0 +1 @@
|
|||
#include "KDChartAbstractGrid.h"
|
159
massif-visualizer/kdchart/include/KDChart/KDChartAbstractGrid.h
Normal file
159
massif-visualizer/kdchart/include/KDChart/KDChartAbstractGrid.h
Normal file
|
@ -0,0 +1,159 @@
|
|||
/****************************************************************************
|
||||
** Copyright (C) 2001-2013 Klaralvdalens Datakonsult AB. All rights reserved.
|
||||
**
|
||||
** This file is part of the KD Chart library.
|
||||
**
|
||||
** Licensees holding valid commercial KD Chart licenses may use this file in
|
||||
** accordance with the KD Chart Commercial License Agreement provided with
|
||||
** the Software.
|
||||
**
|
||||
**
|
||||
** This file may be distributed and/or modified under the terms of the
|
||||
** GNU General Public License version 2 and version 3 as published by the
|
||||
** Free Software Foundation and appearing in the file LICENSE.GPL.txt included.
|
||||
**
|
||||
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
|
||||
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
||||
**
|
||||
** Contact info@kdab.com if any conditions of this licensing are not
|
||||
** clear to you.
|
||||
**
|
||||
**********************************************************************/
|
||||
|
||||
#ifndef KDCHARTABSTRACTGRID_H
|
||||
#define KDCHARTABSTRACTGRID_H
|
||||
|
||||
#include <QPair>
|
||||
|
||||
#include "KDChartAbstractCoordinatePlane.h"
|
||||
#include "KDChartGridAttributes.h"
|
||||
#include "KDChartAbstractDiagram.h"
|
||||
#include "KDChartCartesianAxis.h"
|
||||
|
||||
namespace KDChart {
|
||||
|
||||
class PaintContext;
|
||||
|
||||
|
||||
/**
|
||||
* \internal
|
||||
*
|
||||
* \brief Abstract base class for grid classes: cartesian, polar, ...
|
||||
*
|
||||
* The AbstractGrid interface is the base class used by
|
||||
* AbstractCoordinatePlane, for calculating and for drawing
|
||||
* the grid lines of the plane.
|
||||
*/
|
||||
class AbstractGrid
|
||||
{
|
||||
public:
|
||||
virtual ~AbstractGrid();
|
||||
protected:
|
||||
AbstractGrid ();
|
||||
|
||||
|
||||
public:
|
||||
/** \brief Returns the cached result of data calculation.
|
||||
*
|
||||
* For this, all derived classes need to implement the
|
||||
* pure-virtual calculateGrid() method.
|
||||
*/
|
||||
DataDimensionsList updateData( AbstractCoordinatePlane* plane );
|
||||
|
||||
/**
|
||||
* Doing the actual drawing.
|
||||
*
|
||||
* Every derived class must implement this.
|
||||
*
|
||||
* \note When implementing drawGrid(): Before you start drawing,
|
||||
* make sure to call updateData(), to get the data boundaries
|
||||
* recalculated.
|
||||
* For an example, see the implementation of CartesianGrid:drawGrid().
|
||||
*/
|
||||
virtual void drawGrid( PaintContext* context ) = 0;
|
||||
|
||||
/**
|
||||
* Causes grid to be recalculated upon the next call
|
||||
* of updateData().
|
||||
*
|
||||
* \see calculateGrid
|
||||
*/
|
||||
void setNeedRecalculate();
|
||||
|
||||
/**
|
||||
* Checks whether both coordinates of r are valid according
|
||||
* to isValueValid
|
||||
*
|
||||
* \see isValueValid
|
||||
*/
|
||||
static bool isBoundariesValid(const QRectF& r );
|
||||
|
||||
/**
|
||||
* Checks whether both coordinates of both points are valid
|
||||
* according to isValueValid
|
||||
*
|
||||
* \see isValueValid
|
||||
*/
|
||||
static bool isBoundariesValid(const QPair<QPointF,QPointF>& b );
|
||||
|
||||
/**
|
||||
* Checks whether all start and end properties of every
|
||||
* DataDimension in the list l are valid according to
|
||||
* isValueValid().
|
||||
*
|
||||
* \see isValueValid
|
||||
*/
|
||||
static bool isBoundariesValid(const DataDimensionsList& l );
|
||||
|
||||
/**
|
||||
* Checks if r is neither NaN nor infinity.
|
||||
*/
|
||||
static bool isValueValid(const qreal& r );
|
||||
|
||||
/**
|
||||
* Adjusts \a start and/or \a end so that they are a multiple of
|
||||
* \a stepWidth
|
||||
*/
|
||||
static void adjustLowerUpperRange(
|
||||
qreal& start, qreal& end,
|
||||
qreal stepWidth,
|
||||
bool adjustLower, bool adjustUpper );
|
||||
|
||||
/**
|
||||
* Adjusts \a dim so that \c dim.start and/or \c dim.end are a multiple
|
||||
* of \c dim.stepWidth.
|
||||
*
|
||||
* \see adjustLowerUpperRange
|
||||
*/
|
||||
static const DataDimension adjustedLowerUpperRange(
|
||||
const DataDimension& dim,
|
||||
bool adjustLower, bool adjustUpper );
|
||||
|
||||
GridAttributes gridAttributes;
|
||||
|
||||
protected:
|
||||
DataDimensionsList mDataDimensions;
|
||||
AbstractCoordinatePlane* mPlane;
|
||||
|
||||
private:
|
||||
/**
|
||||
* \brief Calculates the grid start/end/step width values.
|
||||
*
|
||||
* Gets the raw data dimensions - e.g. the data model's boundaries,
|
||||
* together with their isCalculated flags.
|
||||
*
|
||||
* Returns the calculated start/end values for the grid, and their
|
||||
* respective step widths.
|
||||
* If at least one of the step widths is Zero, all dimensions of
|
||||
* the returned list are considered invalid!
|
||||
*
|
||||
* \note This function needs to be implemented by all derived classes,
|
||||
* like CartesianGrid, PolarGrid, ...
|
||||
*/
|
||||
virtual DataDimensionsList calculateGrid( const DataDimensionsList& rawDataDimensions ) const = 0;
|
||||
DataDimensionsList mCachedRawDataDimensions;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif
|
|
@ -0,0 +1 @@
|
|||
#include "KDChartLayoutItems.h"
|
|
@ -0,0 +1 @@
|
|||
#include "KDChartAbstractPieDiagram.h"
|
|
@ -0,0 +1,96 @@
|
|||
/****************************************************************************
|
||||
** Copyright (C) 2001-2013 Klaralvdalens Datakonsult AB. All rights reserved.
|
||||
**
|
||||
** This file is part of the KD Chart library.
|
||||
**
|
||||
** Licensees holding valid commercial KD Chart licenses may use this file in
|
||||
** accordance with the KD Chart Commercial License Agreement provided with
|
||||
** the Software.
|
||||
**
|
||||
**
|
||||
** This file may be distributed and/or modified under the terms of the
|
||||
** GNU General Public License version 2 and version 3 as published by the
|
||||
** Free Software Foundation and appearing in the file LICENSE.GPL.txt included.
|
||||
**
|
||||
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
|
||||
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
||||
**
|
||||
** Contact info@kdab.com if any conditions of this licensing are not
|
||||
** clear to you.
|
||||
**
|
||||
**********************************************************************/
|
||||
|
||||
#ifndef KDCHARTABSTRACTPIEDIAGRAM_H
|
||||
#define KDCHARTABSTRACTPIEDIAGRAM_H
|
||||
|
||||
#include "KDChartAbstractPolarDiagram.h"
|
||||
|
||||
namespace KDChart {
|
||||
class PieAttributes;
|
||||
class ThreeDPieAttributes;
|
||||
|
||||
/**
|
||||
* @brief Base class for any diagram type
|
||||
*/
|
||||
class KDCHART_EXPORT AbstractPieDiagram : public AbstractPolarDiagram
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
Q_DISABLE_COPY( AbstractPieDiagram )
|
||||
KDCHART_DECLARE_DERIVED_DIAGRAM( AbstractPieDiagram, PolarCoordinatePlane )
|
||||
|
||||
public:
|
||||
explicit AbstractPieDiagram(
|
||||
QWidget* parent = 0, PolarCoordinatePlane* plane = 0 );
|
||||
virtual ~AbstractPieDiagram();
|
||||
|
||||
/**
|
||||
* Returns true if both diagrams have the same settings.
|
||||
*/
|
||||
bool compare( const AbstractPieDiagram* other ) const;
|
||||
|
||||
/** Set the granularity: the smaller the granularity the more your diagram
|
||||
* segments will show facettes instead of rounded segments.
|
||||
* \param value the granularity value between 0.05 (one twentieth of a degree)
|
||||
* and 36.0 (one tenth of a full circle), other values will be interpreted as 1.0.
|
||||
*/
|
||||
void setGranularity( qreal value );
|
||||
|
||||
/** @return the granularity. */
|
||||
qreal granularity() const;
|
||||
|
||||
/** \deprecated Use PolarCoordinatePlane::setStartPosition( qreal degrees ) instead. */
|
||||
void setStartPosition( int degrees );
|
||||
/** \deprecated Use qreal PolarCoordinatePlane::startPosition instead. */
|
||||
int startPosition() const;
|
||||
|
||||
/** If this property is set, and if a pie's TextAttributes have no rotation set, its labels will
|
||||
* automatically be rotated according to the pie's angle.
|
||||
*/
|
||||
void setAutoRotateLabels( bool autoRotate );
|
||||
/** \see setAutoRotateLabels( bool autoRotate )
|
||||
*/
|
||||
bool autoRotateLabels() const;
|
||||
|
||||
void setPieAttributes( const PieAttributes & a );
|
||||
void setPieAttributes( int column,
|
||||
const PieAttributes & a );
|
||||
void setPieAttributes( const QModelIndex & index,
|
||||
const PieAttributes & a );
|
||||
PieAttributes pieAttributes() const;
|
||||
PieAttributes pieAttributes( int column ) const;
|
||||
PieAttributes pieAttributes( const QModelIndex & index ) const;
|
||||
|
||||
void setThreeDPieAttributes( const ThreeDPieAttributes & a );
|
||||
void setThreeDPieAttributes( int column,
|
||||
const ThreeDPieAttributes & a );
|
||||
void setThreeDPieAttributes( const QModelIndex & index,
|
||||
const ThreeDPieAttributes & a );
|
||||
ThreeDPieAttributes threeDPieAttributes() const;
|
||||
ThreeDPieAttributes threeDPieAttributes( int column ) const;
|
||||
ThreeDPieAttributes threeDPieAttributes( const QModelIndex & index ) const;
|
||||
}; // End of class KDChartAbstractPieDiagram
|
||||
|
||||
}
|
||||
|
||||
#endif // KDCHARTABSTACTPIEDIAGRAM_H
|
|
@ -0,0 +1 @@
|
|||
#include "KDChartAbstractPolarDiagram.h"
|
|
@ -0,0 +1,60 @@
|
|||
/****************************************************************************
|
||||
** Copyright (C) 2001-2013 Klaralvdalens Datakonsult AB. All rights reserved.
|
||||
**
|
||||
** This file is part of the KD Chart library.
|
||||
**
|
||||
** Licensees holding valid commercial KD Chart licenses may use this file in
|
||||
** accordance with the KD Chart Commercial License Agreement provided with
|
||||
** the Software.
|
||||
**
|
||||
**
|
||||
** This file may be distributed and/or modified under the terms of the
|
||||
** GNU General Public License version 2 and version 3 as published by the
|
||||
** Free Software Foundation and appearing in the file LICENSE.GPL.txt included.
|
||||
**
|
||||
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
|
||||
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
||||
**
|
||||
** Contact info@kdab.com if any conditions of this licensing are not
|
||||
** clear to you.
|
||||
**
|
||||
**********************************************************************/
|
||||
|
||||
#ifndef KDCHARTABSTRACTPOLARDIAGRAM_H
|
||||
#define KDCHARTABSTRACTPOLARDIAGRAM_H
|
||||
|
||||
#include "KDChartPolarCoordinatePlane.h"
|
||||
#include "KDChartAbstractDiagram.h"
|
||||
|
||||
namespace KDChart {
|
||||
|
||||
class GridAttributes;
|
||||
|
||||
/**
|
||||
* @brief Base class for diagrams based on a polar coordinate system.
|
||||
*/
|
||||
class KDCHART_EXPORT AbstractPolarDiagram : public AbstractDiagram
|
||||
{
|
||||
Q_OBJECT
|
||||
Q_DISABLE_COPY( AbstractPolarDiagram )
|
||||
KDCHART_DECLARE_DERIVED_DIAGRAM( AbstractPolarDiagram, PolarCoordinatePlane )
|
||||
|
||||
public:
|
||||
explicit AbstractPolarDiagram (
|
||||
QWidget* parent = 0, PolarCoordinatePlane* plane = 0 );
|
||||
virtual ~AbstractPolarDiagram() {}
|
||||
|
||||
virtual qreal valueTotals () const = 0;
|
||||
virtual qreal numberOfValuesPerDataset() const = 0;
|
||||
virtual qreal numberOfDatasets() const { return 1; };
|
||||
virtual qreal numberOfGridRings() const = 0;
|
||||
|
||||
const PolarCoordinatePlane * polarCoordinatePlane() const;
|
||||
|
||||
int columnCount() const;
|
||||
int rowCount() const;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif
|
|
@ -0,0 +1 @@
|
|||
#include "KDChartAbstractProxyModel.h"
|
|
@ -0,0 +1,54 @@
|
|||
/****************************************************************************
|
||||
** Copyright (C) 2001-2013 Klaralvdalens Datakonsult AB. All rights reserved.
|
||||
**
|
||||
** This file is part of the KD Chart library.
|
||||
**
|
||||
** Licensees holding valid commercial KD Chart licenses may use this file in
|
||||
** accordance with the KD Chart Commercial License Agreement provided with
|
||||
** the Software.
|
||||
**
|
||||
**
|
||||
** This file may be distributed and/or modified under the terms of the
|
||||
** GNU General Public License version 2 and version 3 as published by the
|
||||
** Free Software Foundation and appearing in the file LICENSE.GPL.txt included.
|
||||
**
|
||||
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
|
||||
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
||||
**
|
||||
** Contact info@kdab.com if any conditions of this licensing are not
|
||||
** clear to you.
|
||||
**
|
||||
**********************************************************************/
|
||||
|
||||
#ifndef KDCHARTABSTRACTPROXYMODEL_H
|
||||
#define KDCHARTABSTRACTPROXYMODEL_H
|
||||
|
||||
#include <QAbstractProxyModel>
|
||||
|
||||
#include "KDChartGlobal.h"
|
||||
|
||||
namespace KDChart
|
||||
{
|
||||
/**
|
||||
* @brief Base class for all proxy models used inside KD Chart
|
||||
* \internal
|
||||
*/
|
||||
class KDCHART_EXPORT AbstractProxyModel : public QAbstractProxyModel
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit AbstractProxyModel( QObject* parent = 0 );
|
||||
|
||||
/*! \reimpl */
|
||||
QModelIndex mapFromSource( const QModelIndex & sourceIndex ) const;
|
||||
/*! \reimpl */
|
||||
QModelIndex mapToSource( const QModelIndex &proxyIndex ) const;
|
||||
|
||||
/*! \reimpl */
|
||||
QModelIndex index( int row, int col, const QModelIndex& index ) const;
|
||||
/*! \reimpl */
|
||||
QModelIndex parent( const QModelIndex& index ) const;
|
||||
};
|
||||
}
|
||||
|
||||
#endif /* KDCHARTABSTRACTPROXYMODEL_H */
|
|
@ -0,0 +1 @@
|
|||
#include "KDChartAbstractTernaryDiagram.h"
|
|
@ -0,0 +1,63 @@
|
|||
/****************************************************************************
|
||||
** Copyright (C) 2001-2013 Klaralvdalens Datakonsult AB. All rights reserved.
|
||||
**
|
||||
** This file is part of the KD Chart library.
|
||||
**
|
||||
** Licensees holding valid commercial KD Chart licenses may use this file in
|
||||
** accordance with the KD Chart Commercial License Agreement provided with
|
||||
** the Software.
|
||||
**
|
||||
**
|
||||
** This file may be distributed and/or modified under the terms of the
|
||||
** GNU General Public License version 2 and version 3 as published by the
|
||||
** Free Software Foundation and appearing in the file LICENSE.GPL.txt included.
|
||||
**
|
||||
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
|
||||
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
||||
**
|
||||
** Contact info@kdab.com if any conditions of this licensing are not
|
||||
** clear to you.
|
||||
**
|
||||
**********************************************************************/
|
||||
|
||||
#ifndef KDCHARTABSTRACTTERNARYDIAGRAM_H
|
||||
#define KDCHARTABSTRACTTERNARYDIAGRAM_H
|
||||
|
||||
#include "KDChartAbstractDiagram.h"
|
||||
#include "KDChartTernaryAxis.h"
|
||||
|
||||
namespace KDChart {
|
||||
|
||||
class TernaryCoordinatePlane;
|
||||
class TernaryAxis;
|
||||
|
||||
/**
|
||||
* @brief Base class for diagrams based on a ternary coordinate plane.
|
||||
*/
|
||||
class KDCHART_EXPORT AbstractTernaryDiagram : public AbstractDiagram
|
||||
{
|
||||
Q_OBJECT
|
||||
Q_DISABLE_COPY( AbstractTernaryDiagram )
|
||||
KDCHART_DECLARE_DERIVED_DIAGRAM( AbstractTernaryDiagram,
|
||||
TernaryCoordinatePlane )
|
||||
|
||||
public:
|
||||
explicit AbstractTernaryDiagram ( QWidget* parent = 0,
|
||||
TernaryCoordinatePlane* plane = 0 );
|
||||
virtual ~AbstractTernaryDiagram();
|
||||
|
||||
virtual void resize (const QSizeF &area) = 0;
|
||||
virtual void paint (PaintContext *paintContext);
|
||||
|
||||
virtual void addAxis( TernaryAxis* axis );
|
||||
virtual void takeAxis( TernaryAxis* axis );
|
||||
virtual TernaryAxisList axes () const;
|
||||
|
||||
protected:
|
||||
virtual const QPair< QPointF, QPointF > calculateDataBoundaries () const = 0;
|
||||
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif
|
|
@ -0,0 +1 @@
|
|||
#include "KDChartAbstractThreeDAttributes.h"
|
|
@ -0,0 +1,73 @@
|
|||
/****************************************************************************
|
||||
** Copyright (C) 2001-2013 Klaralvdalens Datakonsult AB. All rights reserved.
|
||||
**
|
||||
** This file is part of the KD Chart library.
|
||||
**
|
||||
** Licensees holding valid commercial KD Chart licenses may use this file in
|
||||
** accordance with the KD Chart Commercial License Agreement provided with
|
||||
** the Software.
|
||||
**
|
||||
**
|
||||
** This file may be distributed and/or modified under the terms of the
|
||||
** GNU General Public License version 2 and version 3 as published by the
|
||||
** Free Software Foundation and appearing in the file LICENSE.GPL.txt included.
|
||||
**
|
||||
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
|
||||
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
||||
**
|
||||
** Contact info@kdab.com if any conditions of this licensing are not
|
||||
** clear to you.
|
||||
**
|
||||
**********************************************************************/
|
||||
|
||||
#ifndef KDCHARTABSTRACTTHREEDATTRIBUTES_H
|
||||
#define KDCHARTABSTRACTTHREEDATTRIBUTES_H
|
||||
|
||||
#include <QMetaType>
|
||||
#include "KDChartGlobal.h"
|
||||
|
||||
namespace KDChart {
|
||||
|
||||
/**
|
||||
* @brief Base class for 3D attributes
|
||||
*/
|
||||
class KDCHART_EXPORT AbstractThreeDAttributes
|
||||
{
|
||||
public:
|
||||
AbstractThreeDAttributes();
|
||||
AbstractThreeDAttributes( const AbstractThreeDAttributes& );
|
||||
AbstractThreeDAttributes &operator= ( const AbstractThreeDAttributes& );
|
||||
|
||||
virtual ~AbstractThreeDAttributes() = 0;
|
||||
|
||||
void setEnabled( bool enabled );
|
||||
bool isEnabled() const;
|
||||
|
||||
void setDepth( qreal depth );
|
||||
qreal depth() const;
|
||||
|
||||
// returns the depth(), if is isEnabled() is true, otherwise returns 0.0
|
||||
qreal validDepth() const;
|
||||
|
||||
bool isThreeDBrushEnabled() const;
|
||||
void setThreeDBrushEnabled( bool enabled );
|
||||
virtual QBrush threeDBrush( const QBrush& brush, const QRectF& rect ) const;
|
||||
|
||||
bool operator==( const AbstractThreeDAttributes& ) const;
|
||||
inline bool operator!=( const AbstractThreeDAttributes& other ) const { return !operator==(other); }
|
||||
|
||||
KDCHART_DECLARE_PRIVATE_BASE_POLYMORPHIC(AbstractThreeDAttributes)
|
||||
|
||||
KDCHART_DECLARE_SWAP_BASE(AbstractThreeDAttributes)
|
||||
|
||||
}; // End of class AbstractThreeDAttributes
|
||||
|
||||
}
|
||||
|
||||
#if !defined(QT_NO_DEBUG_STREAM)
|
||||
KDCHART_EXPORT QDebug operator<<(QDebug, const KDChart::AbstractThreeDAttributes& );
|
||||
#endif /* QT_NO_DEBUG_STREAM */
|
||||
|
||||
|
||||
|
||||
#endif // KDCHARTABSTRACTTHREEDATTRIBUTES_H
|
|
@ -0,0 +1 @@
|
|||
#include "KDChartAttributesModel.h"
|
|
@ -0,0 +1,152 @@
|
|||
/****************************************************************************
|
||||
** Copyright (C) 2001-2013 Klaralvdalens Datakonsult AB. All rights reserved.
|
||||
**
|
||||
** This file is part of the KD Chart library.
|
||||
**
|
||||
** Licensees holding valid commercial KD Chart licenses may use this file in
|
||||
** accordance with the KD Chart Commercial License Agreement provided with
|
||||
** the Software.
|
||||
**
|
||||
**
|
||||
** This file may be distributed and/or modified under the terms of the
|
||||
** GNU General Public License version 2 and version 3 as published by the
|
||||
** Free Software Foundation and appearing in the file LICENSE.GPL.txt included.
|
||||
**
|
||||
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
|
||||
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
||||
**
|
||||
** Contact info@kdab.com if any conditions of this licensing are not
|
||||
** clear to you.
|
||||
**
|
||||
**********************************************************************/
|
||||
|
||||
#ifndef __KDCHART_ATTRIBUTES_MODEL_H__
|
||||
#define __KDCHART_ATTRIBUTES_MODEL_H__
|
||||
|
||||
#include "KDChartAbstractProxyModel.h"
|
||||
#include <QMap>
|
||||
#include <QVariant>
|
||||
|
||||
#include "KDChartGlobal.h"
|
||||
|
||||
namespace KDChart {
|
||||
|
||||
/**
|
||||
* @brief A proxy model used for decorating data with attributes.
|
||||
*
|
||||
* An AttributesModel forwards data from and to the source model and adds attributes,
|
||||
* data that influences the graphical rendering of the source model data.
|
||||
* The attributes are distinguished from the source model's data by their @p role values.
|
||||
* Therefore this class does not need to, and does not, change the data layout from the
|
||||
* source model's; indexes that refer to the same data have the same row and column
|
||||
* values in both models.
|
||||
* Attribute changes, that is changes to data with the attribute role, via the interface
|
||||
* of this class (including setData()) are stored internally and not forwarded to the source model.
|
||||
*/
|
||||
class KDCHART_EXPORT AttributesModel : public AbstractProxyModel
|
||||
{
|
||||
Q_OBJECT
|
||||
KDCHART_DECLARE_PRIVATE_BASE_POLYMORPHIC( AttributesModel )
|
||||
public:
|
||||
enum PaletteType {
|
||||
PaletteTypeDefault = 0,
|
||||
PaletteTypeRainbow = 1,
|
||||
PaletteTypeSubdued = 2
|
||||
};
|
||||
|
||||
explicit AttributesModel( QAbstractItemModel* model, QObject * parent = 0 );
|
||||
~AttributesModel();
|
||||
|
||||
/** Copies the internal data (maps and palette) of another
|
||||
* AttributesModel* into this one.
|
||||
*/
|
||||
void initFrom( const AttributesModel* other );
|
||||
|
||||
/** Returns true if both, all of the attributes set, and
|
||||
* the palette set is equal in both of the AttributeModels.
|
||||
*/
|
||||
bool compare( const AttributesModel* other ) const;
|
||||
|
||||
bool compareAttributes( int role, const QVariant& a, const QVariant& b ) const;
|
||||
|
||||
/* Attributes Model specific API */
|
||||
bool setModelData( const QVariant value, int role );
|
||||
QVariant modelData( int role ) const;
|
||||
|
||||
/** Returns whether the given role corresponds to one of the known
|
||||
* internally used ones. */
|
||||
bool isKnownAttributesRole( int role ) const;
|
||||
|
||||
/** Sets the palettetype used by this attributesmodel */
|
||||
void setPaletteType( PaletteType type );
|
||||
PaletteType paletteType() const;
|
||||
|
||||
/** Returns the data that were specified at global level,
|
||||
* or the default data, or QVariant().
|
||||
*/
|
||||
QVariant data(int role) const;
|
||||
|
||||
/** Returns the data that were specified at per column level,
|
||||
* or the globally set data, or the default data, or QVariant().
|
||||
*/
|
||||
QVariant data(int column, int role) const;
|
||||
|
||||
/** \reimpl */
|
||||
QVariant headerData ( int section, Qt::Orientation orientation, int role = Qt::DisplayRole ) const;
|
||||
/** \reimpl */
|
||||
int rowCount(const QModelIndex& ) const;
|
||||
/** \reimpl */
|
||||
int columnCount(const QModelIndex& ) const;
|
||||
/** \reimpl */
|
||||
QVariant data(const QModelIndex&, int role = Qt::DisplayRole) const;
|
||||
/** \reimpl */
|
||||
bool setData ( const QModelIndex & index, const QVariant & value, int role = Qt::DisplayRole);
|
||||
/** Remove any explicit attributes settings that might have been specified before. */
|
||||
bool resetData ( const QModelIndex & index, int role = Qt::DisplayRole);
|
||||
/** \reimpl */
|
||||
bool setHeaderData ( int section, Qt::Orientation orientation, const QVariant & value,
|
||||
int role = Qt::DisplayRole);
|
||||
/** Returns default values for the header data. */
|
||||
virtual QVariant defaultHeaderData ( int section, Qt::Orientation orientation, int role = Qt::DisplayRole ) const;
|
||||
/** Remove any explicit attributes settings that might have been specified before. */
|
||||
bool resetHeaderData ( int section, Qt::Orientation orientation, int role = Qt::DisplayRole);
|
||||
/** \reimpl */
|
||||
void setSourceModel ( QAbstractItemModel* sourceModel );
|
||||
|
||||
/** Define the default value for a certain role.
|
||||
Passing a default-constructed QVariant is equivalent to removing the default. */
|
||||
void setDefaultForRole( int role, const QVariant& value );
|
||||
|
||||
/** Set the dimension of the dataset in the source model. \sa AbstractDiagram::setDatasetDimension */
|
||||
void setDatasetDimension( int dimension );
|
||||
int datasetDimension() const;
|
||||
|
||||
Q_SIGNALS:
|
||||
void attributesChanged( const QModelIndex&, const QModelIndex& );
|
||||
|
||||
private Q_SLOTS:
|
||||
void slotRowsAboutToBeInserted( const QModelIndex& parent, int start, int end );
|
||||
void slotColumnsAboutToBeInserted( const QModelIndex& parent, int start, int end );
|
||||
void slotRowsInserted( const QModelIndex& parent, int start, int end );
|
||||
void slotColumnsInserted( const QModelIndex& parent, int start, int end );
|
||||
|
||||
void slotRowsAboutToBeRemoved( const QModelIndex& parent, int start, int end );
|
||||
void slotColumnsAboutToBeRemoved( const QModelIndex& parent, int start, int end );
|
||||
void slotRowsRemoved( const QModelIndex& parent, int start, int end );
|
||||
void slotColumnsRemoved( const QModelIndex& parent, int start, int end );
|
||||
|
||||
void slotDataChanged( const QModelIndex& topLeft, const QModelIndex& bottomRight );
|
||||
|
||||
private:
|
||||
// helper
|
||||
QVariant defaultsForRole( int role ) const;
|
||||
bool compareHeaderDataMaps( const QMap< int, QMap< int, QVariant > >& mapA,
|
||||
const QMap< int, QMap< int, QVariant > >& mapB ) const;
|
||||
|
||||
void removeEntriesFromDataMap( int start, int end );
|
||||
void removeEntriesFromDirectionDataMaps( Qt::Orientation dir, int start, int end );
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif
|
|
@ -0,0 +1 @@
|
|||
#include "KDChartLayoutItems.h"
|
|
@ -0,0 +1 @@
|
|||
#include "KDChartBackgroundAttributes.h"
|
|
@ -0,0 +1,85 @@
|
|||
/****************************************************************************
|
||||
** Copyright (C) 2001-2013 Klaralvdalens Datakonsult AB. All rights reserved.
|
||||
**
|
||||
** This file is part of the KD Chart library.
|
||||
**
|
||||
** Licensees holding valid commercial KD Chart licenses may use this file in
|
||||
** accordance with the KD Chart Commercial License Agreement provided with
|
||||
** the Software.
|
||||
**
|
||||
**
|
||||
** This file may be distributed and/or modified under the terms of the
|
||||
** GNU General Public License version 2 and version 3 as published by the
|
||||
** Free Software Foundation and appearing in the file LICENSE.GPL.txt included.
|
||||
**
|
||||
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
|
||||
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
||||
**
|
||||
** Contact info@kdab.com if any conditions of this licensing are not
|
||||
** clear to you.
|
||||
**
|
||||
**********************************************************************/
|
||||
|
||||
#ifndef KDCHARTBACKGROUNDATTRIBUTES_H
|
||||
#define KDCHARTBACKGROUNDATTRIBUTES_H
|
||||
|
||||
#include <QDebug>
|
||||
#include <QMetaType>
|
||||
#include <QBrush>
|
||||
#include "KDChartGlobal.h"
|
||||
|
||||
namespace KDChart {
|
||||
|
||||
/**
|
||||
* Set of attributes usable for background pixmaps
|
||||
*/
|
||||
class KDCHART_EXPORT BackgroundAttributes
|
||||
{
|
||||
public:
|
||||
BackgroundAttributes();
|
||||
BackgroundAttributes( const BackgroundAttributes& );
|
||||
BackgroundAttributes &operator= ( const BackgroundAttributes& );
|
||||
|
||||
~BackgroundAttributes();
|
||||
|
||||
enum BackgroundPixmapMode { BackgroundPixmapModeNone,
|
||||
BackgroundPixmapModeCentered,
|
||||
BackgroundPixmapModeScaled,
|
||||
BackgroundPixmapModeStretched };
|
||||
|
||||
void setVisible( bool visible );
|
||||
bool isVisible() const;
|
||||
|
||||
void setBrush( const QBrush &brush );
|
||||
QBrush brush() const;
|
||||
|
||||
void setPixmapMode( BackgroundPixmapMode mode );
|
||||
BackgroundPixmapMode pixmapMode() const;
|
||||
|
||||
void setPixmap( const QPixmap &backPixmap );
|
||||
QPixmap pixmap() const;
|
||||
|
||||
bool operator==( const BackgroundAttributes& ) const;
|
||||
inline bool operator!=( const BackgroundAttributes& other ) const { return !operator==(other); }
|
||||
|
||||
bool isEqualTo( const BackgroundAttributes& other, bool ignorePixmap=false ) const;
|
||||
|
||||
private:
|
||||
KDCHART_DECLARE_PRIVATE_BASE_VALUE( BackgroundAttributes )
|
||||
}; // End of class BackgroundAttributes
|
||||
|
||||
}
|
||||
|
||||
#if !defined(QT_NO_DEBUG_STREAM)
|
||||
KDCHART_EXPORT QDebug operator<<(QDebug, const KDChart::BackgroundAttributes& );
|
||||
#endif /* QT_NO_DEBUG_STREAM */
|
||||
|
||||
KDCHART_DECLARE_SWAP_SPECIALISATION( KDChart::BackgroundAttributes )
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
Q_DECLARE_TYPEINFO( KDChart::BackgroundAttributes, Q_MOVABLE_TYPE );
|
||||
QT_END_NAMESPACE
|
||||
|
||||
Q_DECLARE_METATYPE( KDChart::BackgroundAttributes )
|
||||
|
||||
#endif // KDCHARTBACKGROUNDATTRIBUTES_H
|
|
@ -0,0 +1 @@
|
|||
#include "KDChartBarAttributes.h"
|
|
@ -0,0 +1,84 @@
|
|||
/****************************************************************************
|
||||
** Copyright (C) 2001-2013 Klaralvdalens Datakonsult AB. All rights reserved.
|
||||
**
|
||||
** This file is part of the KD Chart library.
|
||||
**
|
||||
** Licensees holding valid commercial KD Chart licenses may use this file in
|
||||
** accordance with the KD Chart Commercial License Agreement provided with
|
||||
** the Software.
|
||||
**
|
||||
**
|
||||
** This file may be distributed and/or modified under the terms of the
|
||||
** GNU General Public License version 2 and version 3 as published by the
|
||||
** Free Software Foundation and appearing in the file LICENSE.GPL.txt included.
|
||||
**
|
||||
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
|
||||
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
||||
**
|
||||
** Contact info@kdab.com if any conditions of this licensing are not
|
||||
** clear to you.
|
||||
**
|
||||
**********************************************************************/
|
||||
|
||||
#ifndef KDCHARTBARATTRIBUTES_H
|
||||
#define KDCHARTBARATTRIBUTES_H
|
||||
|
||||
#include <QMetaType>
|
||||
#include "KDChartGlobal.h"
|
||||
|
||||
namespace KDChart {
|
||||
|
||||
/**
|
||||
* @brief Set of attributes for changing the appearance of bar charts
|
||||
*/
|
||||
class KDCHART_EXPORT BarAttributes
|
||||
{
|
||||
public:
|
||||
BarAttributes();
|
||||
BarAttributes( const BarAttributes& );
|
||||
BarAttributes &operator= ( const BarAttributes& );
|
||||
|
||||
~BarAttributes();
|
||||
|
||||
void setFixedDataValueGap( qreal gap );
|
||||
qreal fixedDataValueGap() const;
|
||||
|
||||
void setUseFixedDataValueGap( bool gapIsFixed );
|
||||
bool useFixedDataValueGap() const;
|
||||
|
||||
void setFixedValueBlockGap( qreal gap );
|
||||
qreal fixedValueBlockGap() const;
|
||||
|
||||
void setUseFixedValueBlockGap( bool gapIsFixed );
|
||||
bool useFixedValueBlockGap() const;
|
||||
|
||||
void setFixedBarWidth( qreal width );
|
||||
qreal fixedBarWidth() const;
|
||||
|
||||
void setUseFixedBarWidth( bool useFixedBarWidth );
|
||||
bool useFixedBarWidth() const;
|
||||
|
||||
void setGroupGapFactor ( qreal gapFactor );
|
||||
qreal groupGapFactor() const;
|
||||
|
||||
void setBarGapFactor( qreal gapFactor );
|
||||
qreal barGapFactor() const;
|
||||
|
||||
void setDrawSolidExcessArrows( bool solidArrows );
|
||||
bool drawSolidExcessArrows() const;
|
||||
|
||||
bool operator==( const BarAttributes& ) const;
|
||||
inline bool operator!=( const BarAttributes& other ) const { return !operator==(other); }
|
||||
|
||||
private:
|
||||
class Private;
|
||||
Private * _d;
|
||||
Private * d_func() { return _d; }
|
||||
const Private * d_func() const { return _d; }
|
||||
}; // End of class BarAttributes
|
||||
|
||||
}
|
||||
|
||||
Q_DECLARE_METATYPE( KDChart::BarAttributes )
|
||||
|
||||
#endif // KDCHARTBARATTRIBUTES_H
|
|
@ -0,0 +1 @@
|
|||
#include "KDChartBarDiagram.h"
|
130
massif-visualizer/kdchart/include/KDChart/KDChartBarDiagram.h
Normal file
130
massif-visualizer/kdchart/include/KDChart/KDChartBarDiagram.h
Normal file
|
@ -0,0 +1,130 @@
|
|||
/****************************************************************************
|
||||
** Copyright (C) 2001-2013 Klaralvdalens Datakonsult AB. All rights reserved.
|
||||
**
|
||||
** This file is part of the KD Chart library.
|
||||
**
|
||||
** Licensees holding valid commercial KD Chart licenses may use this file in
|
||||
** accordance with the KD Chart Commercial License Agreement provided with
|
||||
** the Software.
|
||||
**
|
||||
**
|
||||
** This file may be distributed and/or modified under the terms of the
|
||||
** GNU General Public License version 2 and version 3 as published by the
|
||||
** Free Software Foundation and appearing in the file LICENSE.GPL.txt included.
|
||||
**
|
||||
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
|
||||
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
||||
**
|
||||
** Contact info@kdab.com if any conditions of this licensing are not
|
||||
** clear to you.
|
||||
**
|
||||
**********************************************************************/
|
||||
|
||||
#ifndef KDCHARTBARDIAGRAM_H
|
||||
#define KDCHARTBARDIAGRAM_H
|
||||
|
||||
#include "KDChartAbstractCartesianDiagram.h"
|
||||
#include "KDChartBarAttributes.h"
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
class QPainter;
|
||||
QT_END_NAMESPACE
|
||||
|
||||
namespace KDChart {
|
||||
|
||||
class ThreeDBarAttributes;
|
||||
|
||||
/**
|
||||
* @brief BarDiagram defines a common bar diagram.
|
||||
*
|
||||
* It provides different subtypes which are set using \a setType.
|
||||
*/
|
||||
class KDCHART_EXPORT BarDiagram : public AbstractCartesianDiagram
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
Q_DISABLE_COPY( BarDiagram )
|
||||
|
||||
KDCHART_DECLARE_DERIVED_DIAGRAM( BarDiagram, CartesianCoordinatePlane )
|
||||
|
||||
public:
|
||||
class BarDiagramType;
|
||||
friend class BarDiagramType;
|
||||
|
||||
explicit BarDiagram(
|
||||
QWidget* parent = 0, CartesianCoordinatePlane* plane = 0 );
|
||||
virtual ~BarDiagram();
|
||||
|
||||
virtual BarDiagram * clone() const;
|
||||
/**
|
||||
* Returns true if both diagrams have the same settings.
|
||||
*/
|
||||
bool compare( const BarDiagram* other ) const;
|
||||
|
||||
enum BarType { Normal,
|
||||
Stacked,
|
||||
Percent,
|
||||
Rows ///< @deprecated Use BarDiagram::setOrientation() instead
|
||||
};
|
||||
|
||||
void setType( const BarType type );
|
||||
BarType type() const;
|
||||
|
||||
void setOrientation( Qt::Orientation orientation );
|
||||
Qt::Orientation orientation() const;
|
||||
|
||||
void setBarAttributes( const BarAttributes & a );
|
||||
void setBarAttributes( int column, const BarAttributes & a );
|
||||
void setBarAttributes( const QModelIndex & index, const BarAttributes & a );
|
||||
|
||||
BarAttributes barAttributes() const;
|
||||
BarAttributes barAttributes( int column ) const;
|
||||
BarAttributes barAttributes( const QModelIndex & index ) const;
|
||||
|
||||
void setThreeDBarAttributes( const ThreeDBarAttributes & a );
|
||||
void setThreeDBarAttributes( int column, const ThreeDBarAttributes & a );
|
||||
void setThreeDBarAttributes( const QModelIndex & index,
|
||||
const ThreeDBarAttributes & a );
|
||||
ThreeDBarAttributes threeDBarAttributes() const;
|
||||
ThreeDBarAttributes threeDBarAttributes( int column ) const;
|
||||
ThreeDBarAttributes threeDBarAttributes( const QModelIndex & index ) const;
|
||||
|
||||
#if QT_VERSION < 0x040400 || defined(Q_COMPILER_MANGLES_RETURN_TYPE)
|
||||
// implement AbstractCartesianDiagram
|
||||
/** \reimpl */
|
||||
const int numberOfAbscissaSegments () const;
|
||||
/** \reimpl */
|
||||
const int numberOfOrdinateSegments () const;
|
||||
#else
|
||||
// implement AbstractCartesianDiagram
|
||||
/** \reimpl */
|
||||
int numberOfAbscissaSegments () const;
|
||||
/** \reimpl */
|
||||
int numberOfOrdinateSegments () const;
|
||||
#endif
|
||||
|
||||
protected:
|
||||
void paint ( PaintContext* paintContext );
|
||||
|
||||
public:
|
||||
void resize ( const QSizeF& area );
|
||||
|
||||
protected:
|
||||
virtual qreal threeDItemDepth( const QModelIndex & index ) const;
|
||||
virtual qreal threeDItemDepth( int column ) const;
|
||||
/** \reimpl */
|
||||
const QPair<QPointF, QPointF> calculateDataBoundaries() const;
|
||||
void paintEvent ( QPaintEvent* );
|
||||
void resizeEvent ( QResizeEvent* );
|
||||
private:
|
||||
|
||||
void calculateValueAndGapWidths( int rowCount, int colCount,
|
||||
qreal groupWidth,
|
||||
qreal& barWidth,
|
||||
qreal& spaceBetweenBars,
|
||||
qreal& spaceBetweenGroups );
|
||||
}; // End of class BarDiagram
|
||||
|
||||
}
|
||||
|
||||
#endif // KDCHARTBARDIAGRAM_H
|
|
@ -0,0 +1 @@
|
|||
#include "KDChartCartesianAxis.h"
|
189
massif-visualizer/kdchart/include/KDChart/KDChartCartesianAxis.h
Normal file
189
massif-visualizer/kdchart/include/KDChart/KDChartCartesianAxis.h
Normal file
|
@ -0,0 +1,189 @@
|
|||
/****************************************************************************
|
||||
** Copyright (C) 2001-2013 Klaralvdalens Datakonsult AB. All rights reserved.
|
||||
**
|
||||
** This file is part of the KD Chart library.
|
||||
**
|
||||
** Licensees holding valid commercial KD Chart licenses may use this file in
|
||||
** accordance with the KD Chart Commercial License Agreement provided with
|
||||
** the Software.
|
||||
**
|
||||
**
|
||||
** This file may be distributed and/or modified under the terms of the
|
||||
** GNU General Public License version 2 and version 3 as published by the
|
||||
** Free Software Foundation and appearing in the file LICENSE.GPL.txt included.
|
||||
**
|
||||
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
|
||||
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
||||
**
|
||||
** Contact info@kdab.com if any conditions of this licensing are not
|
||||
** clear to you.
|
||||
**
|
||||
**********************************************************************/
|
||||
|
||||
#ifndef KDCHARTCARTESIANAXIS_H
|
||||
#define KDCHARTCARTESIANAXIS_H
|
||||
|
||||
#include <QList>
|
||||
|
||||
#include "KDChartAbstractAxis.h"
|
||||
|
||||
namespace KDChart {
|
||||
|
||||
class AbstractCartesianDiagram;
|
||||
|
||||
/**
|
||||
* The class for cartesian axes.
|
||||
*
|
||||
* For being useful, axes need to be assigned to a diagram, see
|
||||
* AbstractCartesianDiagram::addAxis and AbstractCartesianDiagram::takeAxis.
|
||||
*
|
||||
* \sa PolarAxis, AbstractCartesianDiagram
|
||||
*/
|
||||
class KDCHART_EXPORT CartesianAxis : public AbstractAxis
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
Q_DISABLE_COPY( CartesianAxis )
|
||||
KDCHART_DECLARE_PRIVATE_DERIVED_PARENT( CartesianAxis, AbstractDiagram* )
|
||||
|
||||
public:
|
||||
enum Position {
|
||||
Bottom,
|
||||
Top,
|
||||
Right,
|
||||
Left
|
||||
};
|
||||
|
||||
/**
|
||||
* C'tor of the class for cartesian axes.
|
||||
*
|
||||
* \note If you pass a null parent to the constructor, you need to call
|
||||
* your diagram's addAxis function to add your axis to the diagram.
|
||||
* Otherwise there is no need to call addAxis, since the constructor
|
||||
* does it already.
|
||||
*
|
||||
* \sa AbstractCartesianDiagram::addAxis
|
||||
*/
|
||||
explicit CartesianAxis ( AbstractCartesianDiagram* diagram = 0 );
|
||||
~CartesianAxis();
|
||||
|
||||
/**
|
||||
* Returns true if both axes have the same settings.
|
||||
*/
|
||||
bool compare( const CartesianAxis* other ) const;
|
||||
|
||||
/** reimpl */
|
||||
virtual void paint( QPainter* );
|
||||
/** reimpl */
|
||||
virtual void paintCtx( PaintContext* );
|
||||
|
||||
/**
|
||||
* Sets the optional text displayed as chart title.
|
||||
*/
|
||||
void setTitleText( const QString& text );
|
||||
QString titleText() const;
|
||||
|
||||
/**
|
||||
* \deprecated
|
||||
* Sets the spacing between the title and the diagram.
|
||||
* Be aware that setting this value can lead to
|
||||
* collisions between axis labels and the title
|
||||
*/
|
||||
void setTitleSpace( qreal value );
|
||||
/// \deprecated
|
||||
qreal titleSpace() const;
|
||||
|
||||
/// \deprecated \brief use setTitleTextAttributes() instead
|
||||
void setTitleSize(qreal value);
|
||||
/// \deprecated
|
||||
qreal titleSize() const;
|
||||
|
||||
void setTitleTextAttributes( const TextAttributes &a );
|
||||
/**
|
||||
* Returns the text attributes that will be used for displaying the
|
||||
* title text.
|
||||
* This is either the text attributes as specified by setTitleTextAttributes,
|
||||
* or (if setTitleTextAttributes() was not called) the default text attributes.
|
||||
* \sa resetTitleTextAttributes, hasDefaultTitleTextAttributes
|
||||
*/
|
||||
TextAttributes titleTextAttributes() const;
|
||||
/**
|
||||
* Reset the title text attributes to the built-in default:
|
||||
*
|
||||
* Same font and pen as AbstractAxis::textAttributes()
|
||||
* and 1.5 times their size.
|
||||
*/
|
||||
void resetTitleTextAttributes();
|
||||
bool hasDefaultTitleTextAttributes() const;
|
||||
|
||||
virtual void setPosition ( Position p );
|
||||
#if QT_VERSION < 0x040400 || defined(Q_COMPILER_MANGLES_RETURN_TYPE)
|
||||
virtual const Position position () const;
|
||||
#else
|
||||
virtual Position position () const;
|
||||
#endif
|
||||
|
||||
virtual void layoutPlanes();
|
||||
|
||||
virtual bool isAbscissa() const;
|
||||
virtual bool isOrdinate() const;
|
||||
|
||||
/**
|
||||
* Sets the axis annotations to \a annotations.
|
||||
* Annotations are a QMap of qreals and QStrings defining special
|
||||
* markers and their position.
|
||||
* If you use annotations, the normal ticks and values will be invisible.
|
||||
* To unset the annotations, pass an empty QMap.
|
||||
*/
|
||||
void setAnnotations( const QMap< qreal, QString >& annotations );
|
||||
/**
|
||||
* Returns the currently set axis annotations.
|
||||
*/
|
||||
QMap< qreal, QString > annotations() const;
|
||||
|
||||
/**
|
||||
* Sets custom ticks on the axis.
|
||||
* Ticks are a QList of qreals defining their special position.
|
||||
*/
|
||||
void setCustomTicks( const QList< qreal >& ticksPostions );
|
||||
/**
|
||||
* Returns the currently set custom ticks on the axis.
|
||||
*/
|
||||
QList< qreal > customTicks() const;
|
||||
|
||||
/**
|
||||
* Sets the length of custom ticks on the axis.
|
||||
*/
|
||||
void setCustomTickLength(int value);
|
||||
/**
|
||||
* Returns the length of custom ticks on the axis.
|
||||
*/
|
||||
int customTickLength() const;
|
||||
|
||||
/** pure virtual in QLayoutItem */
|
||||
virtual bool isEmpty() const;
|
||||
/** pure virtual in QLayoutItem */
|
||||
virtual Qt::Orientations expandingDirections() const;
|
||||
/** pure virtual in QLayoutItem */
|
||||
virtual QSize maximumSize() const;
|
||||
/** pure virtual in QLayoutItem */
|
||||
virtual QSize minimumSize() const;
|
||||
/** pure virtual in QLayoutItem */
|
||||
virtual QSize sizeHint() const;
|
||||
/** pure virtual in QLayoutItem */
|
||||
virtual void setGeometry( const QRect& r );
|
||||
/** pure virtual in QLayoutItem */
|
||||
virtual QRect geometry() const;
|
||||
|
||||
public Q_SLOTS:
|
||||
void setCachedSizeDirty() const;
|
||||
|
||||
virtual int tickLength( bool subUnitTicks = false ) const;
|
||||
private Q_SLOTS:
|
||||
void coordinateSystemChanged();
|
||||
};
|
||||
|
||||
typedef QList<CartesianAxis*> CartesianAxisList;
|
||||
}
|
||||
|
||||
#endif
|
|
@ -0,0 +1 @@
|
|||
#include "KDChartCartesianCoordinatePlane.h"
|
|
@ -0,0 +1,505 @@
|
|||
/****************************************************************************
|
||||
** Copyright (C) 2001-2013 Klaralvdalens Datakonsult AB. All rights reserved.
|
||||
**
|
||||
** This file is part of the KD Chart library.
|
||||
**
|
||||
** Licensees holding valid commercial KD Chart licenses may use this file in
|
||||
** accordance with the KD Chart Commercial License Agreement provided with
|
||||
** the Software.
|
||||
**
|
||||
**
|
||||
** This file may be distributed and/or modified under the terms of the
|
||||
** GNU General Public License version 2 and version 3 as published by the
|
||||
** Free Software Foundation and appearing in the file LICENSE.GPL.txt included.
|
||||
**
|
||||
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
|
||||
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
||||
**
|
||||
** Contact info@kdab.com if any conditions of this licensing are not
|
||||
** clear to you.
|
||||
**
|
||||
**********************************************************************/
|
||||
|
||||
#ifndef KDCHARTCARTESIANCOORDINATEPLANE_H
|
||||
#define KDCHARTCARTESIANCOORDINATEPLANE_H
|
||||
|
||||
#include "KDChartAbstractCoordinatePlane.h"
|
||||
|
||||
namespace KDChart {
|
||||
|
||||
class Chart;
|
||||
class PaintContext;
|
||||
class AbstractDiagram;
|
||||
class CartesianAxis;
|
||||
class CartesianGrid;
|
||||
|
||||
/**
|
||||
* @brief Cartesian coordinate plane
|
||||
*/
|
||||
class KDCHART_EXPORT CartesianCoordinatePlane : public AbstractCoordinatePlane
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
Q_DISABLE_COPY( CartesianCoordinatePlane )
|
||||
KDCHART_DECLARE_PRIVATE_DERIVED_PARENT( CartesianCoordinatePlane, Chart* )
|
||||
|
||||
friend class CartesianAxis;
|
||||
friend class CartesianGrid;
|
||||
|
||||
public:
|
||||
explicit CartesianCoordinatePlane ( Chart* parent = 0 );
|
||||
~CartesianCoordinatePlane();
|
||||
|
||||
void addDiagram ( AbstractDiagram* diagram );
|
||||
|
||||
/**
|
||||
* If @p onOff is true, enforce that X and Y distances are scaled by the same factor.
|
||||
* This makes the plane's height a function of its width, and hasHeightForWidth()
|
||||
* will return true.
|
||||
*/
|
||||
void setIsometricScaling ( bool onOff );
|
||||
|
||||
bool doesIsometricScaling() const;
|
||||
|
||||
const QPointF translate ( const QPointF& diagramPoint ) const;
|
||||
|
||||
/**
|
||||
* \sa setZoomFactorX, setZoomCenter
|
||||
*/
|
||||
virtual qreal zoomFactorX() const;
|
||||
/**
|
||||
* \sa setZoomFactorY, setZoomCenter
|
||||
*/
|
||||
virtual qreal zoomFactorY() const;
|
||||
|
||||
/**
|
||||
* \sa setZoomFactorX,setZoomFactorY
|
||||
*/
|
||||
virtual void setZoomFactors( qreal factorX, qreal factorY );
|
||||
/**
|
||||
* \sa zoomFactorX, setZoomCenter
|
||||
*/
|
||||
virtual void setZoomFactorX( qreal factor );
|
||||
/**
|
||||
* \sa zoomFactorY, setZoomCenter
|
||||
*/
|
||||
virtual void setZoomFactorY( qreal factor );
|
||||
|
||||
/**
|
||||
* \sa setZoomCenter, setZoomFactorX, setZoomFactorY
|
||||
*/
|
||||
virtual QPointF zoomCenter() const;
|
||||
|
||||
/**
|
||||
* \sa zoomCenter, setZoomFactorX, setZoomFactorY
|
||||
*/
|
||||
virtual void setZoomCenter( const QPointF& center );
|
||||
|
||||
/**
|
||||
* Allows to specify a fixed data-space / coordinate-space relation. If set
|
||||
* to true then fixed bar widths are used, so you see more bars as the window
|
||||
* is made wider.
|
||||
*
|
||||
* This allows to completely restrict the size of bars in a graph such that,
|
||||
* upon resizing a window, the graphs coordinate plane will grow (add more
|
||||
* ticks to x- and y-coordinates) rather than have the image grow.
|
||||
*/
|
||||
void setFixedDataCoordinateSpaceRelation( bool fixed );
|
||||
bool hasFixedDataCoordinateSpaceRelation() const;
|
||||
|
||||
/**
|
||||
* Allows to fix the lower bound of X axis to zero when diagram is in first quadrant.
|
||||
*
|
||||
* The default behavior is to lower x or y bound to be 0. If this behaviour is not wanted,
|
||||
* either \a CartesianCoordinatePlane::setHorizontalRange could be used instead of letting
|
||||
* KDChart auto-adjust the ranges, or this method can be used to disable this behavior.
|
||||
*/
|
||||
void setXAxisStartAtZero(bool fixedStart);
|
||||
bool xAxisStartAtZero() const;
|
||||
|
||||
/**
|
||||
* \brief Set the boundaries of the visible value space displayed in horizontal direction.
|
||||
*
|
||||
* This is also known as the horizontal viewport.
|
||||
*
|
||||
* By default the horizontal range is adjusted to the range covered by the model's data,
|
||||
* see setAutoAdjustHorizontalRangeToData for details.
|
||||
* Calling setHorizontalRange with a valid range disables this default automatic adjusting,
|
||||
* while on the other hand automatic adjusting will set these ranges.
|
||||
*
|
||||
* To disable use of this range you can either pass an empty pair by using the default
|
||||
* constructor QPair() or you can set both values to the same which constitutes
|
||||
* a null range.
|
||||
*
|
||||
* \note By default the visible data range often is larger than the
|
||||
* range calculated from the data model (or set by setHoriz.|Vert.Range(), resp.).
|
||||
* This is due to the built-in grid calculation feature: The visible start/end
|
||||
* values get adjusted so that they match a main-grid line.
|
||||
* You can turn this feature off for any of the four bounds by calling
|
||||
* GridAttributes::setAdjustBoundsToGrid() for either the global grid-attributes
|
||||
* or for the horizontal/vertical attrs separately.
|
||||
*
|
||||
* \note To set only one of the ends of the range to a fixed value while keeping
|
||||
* the other dynamically adjusted, use std::numeric_limits< qreal >::quiet_NaN()
|
||||
* for the dynamic value.
|
||||
*
|
||||
* \note If you use user defined vertical ranges together with logarithmic scale, only
|
||||
* positive values are supported. If you set it to negative values, the result is undefined.
|
||||
*
|
||||
* \param range a pair of values representing the smalles and the largest
|
||||
* horizontal value space coordinate displayed.
|
||||
*
|
||||
* \sa setAutoAdjustHorizontalRangeToData, setVerticalRange
|
||||
* \sa GridAttributes::setAdjustBoundsToGrid()
|
||||
*/
|
||||
void setHorizontalRange( const QPair<qreal, qreal> & range );
|
||||
|
||||
/**
|
||||
* \brief Set the boundaries of the visible value space displayed in vertical direction.
|
||||
*
|
||||
* This is also known as the vertical viewport.
|
||||
*
|
||||
* By default the vertical range is adjusted to the range covered by the model's data,
|
||||
* see setAutoAdjustVerticalRangeToData for details.
|
||||
* Calling setVerticalRange with a valid range disables this default automatic adjusting,
|
||||
* while on the other hand automatic adjusting will set these ranges.
|
||||
*
|
||||
* To disable use of this range you can either pass an empty pair by using the default
|
||||
* constructor QPair() or you can set setting both values to the same which constitutes
|
||||
* a null range.
|
||||
*
|
||||
* \note By default the visible data range often is larger than the
|
||||
* range calculated from the data model (or set by setHoriz.|Vert.Range(), resp.).
|
||||
* This is due to the built-in grid calculation feature: The visible start/end
|
||||
* values get adjusted so that they match a main-grid line.
|
||||
* You can turn this feature off for any of the four bounds by calling
|
||||
* GridAttributes::setAdjustBoundsToGrid() for either the global grid-attributes
|
||||
* or for the horizontal/vertical attrs separately.
|
||||
*
|
||||
* \note To set only one of the ends of the range to a fixed value while keeping
|
||||
* the other dynamically adjusted, use std::numeric_limits< qreal >::quiet_NaN()
|
||||
* for the dynamic value.
|
||||
*
|
||||
* \note If you use user defined vertical ranges together with logarithmic scale, only
|
||||
* positive values are supported. If you set it to negative values, the result is undefined.
|
||||
*
|
||||
* \param range a pair of values representing the smalles and the largest
|
||||
* vertical value space coordinate displayed.
|
||||
*
|
||||
* \sa setAutoAdjustVerticalRangeToData, setHorizontalRange
|
||||
* \sa GridAttributes::setAdjustBoundsToGrid()
|
||||
*/
|
||||
void setVerticalRange( const QPair<qreal, qreal> & range );
|
||||
|
||||
/**
|
||||
* @return The largest and smallest visible horizontal value space
|
||||
* value. If this is not explicitly set,or if both values are the same,
|
||||
* the plane will use the union of the dataBoundaries of all
|
||||
* associated diagrams.
|
||||
* \see KDChart::AbstractDiagram::dataBoundaries
|
||||
*/
|
||||
QPair<qreal, qreal> horizontalRange() const;
|
||||
|
||||
/**
|
||||
* @return The largest and smallest visible horizontal value space
|
||||
* value. If this is not explicitly set, or if both values are the same,
|
||||
* the plane will use the union of the dataBoundaries of all
|
||||
* associated diagrams.
|
||||
* \see KDChart::AbstractDiagram::dataBoundaries
|
||||
*/
|
||||
QPair<qreal, qreal> verticalRange() const;
|
||||
|
||||
/**
|
||||
* \brief Automatically adjust horizontal range settings to the ranges covered by
|
||||
* the model's values, when ever the data have changed, and then emit horizontalRangeAutomaticallyAdjusted.
|
||||
*
|
||||
* By default the horizontal range is adjusted automatically, if more than 67 percent of
|
||||
* the available horizontal space would be empty otherwise.
|
||||
*
|
||||
* Range setting is adjusted if more than \c percentEmpty percent of the horizontal
|
||||
* space covered by the coordinate plane would otherwise be empty.
|
||||
* Automatic range adjusting can happen, when either all of the data are positive or all are negative.
|
||||
*
|
||||
* Set percentEmpty to 100 to disable automatic range adjusting.
|
||||
*
|
||||
* \param percentEmpty The maximal percentage of horizontal space that may be empty.
|
||||
*
|
||||
* \sa horizontalRangeAutomaticallyAdjusted
|
||||
* \sa autoAdjustHorizontalRangeToData, adjustRangesToData
|
||||
* \sa setHorizontalRange, setVerticalRange
|
||||
* \sa setAutoAdjustVerticalRangeToData
|
||||
*/
|
||||
void setAutoAdjustHorizontalRangeToData( unsigned int percentEmpty = 67 );
|
||||
|
||||
/**
|
||||
* \brief Automatically adjust vertical range settings to the ranges covered by
|
||||
* the model's values, when ever the data have changed, and then emit verticalRangeAutomaticallyAdjusted.
|
||||
*
|
||||
* By default the vertical range is adjusted automatically, if more than 67 percent of
|
||||
* the available vertical space would be empty otherwise.
|
||||
*
|
||||
* Range setting is adjusted if more than \c percentEmpty percent of the horizontal
|
||||
* space covered by the coordinate plane would otherwise be empty.
|
||||
* Automatic range adjusting can happen, when either all of the data are positive or all are negative.
|
||||
*
|
||||
* Set percentEmpty to 100 to disable automatic range adjusting.
|
||||
*
|
||||
* \param percentEmpty The maximal percentage of horizontal space that may be empty.
|
||||
*
|
||||
* \sa verticalRangeAutomaticallyAdjusted
|
||||
* \sa autoAdjustVerticalRangeToData, adjustRangesToData
|
||||
* \sa setHorizontalRange, setVerticalRange
|
||||
* \sa setAutoAdjustHorizontalRangeToData
|
||||
*/
|
||||
void setAutoAdjustVerticalRangeToData( unsigned int percentEmpty = 67 );
|
||||
|
||||
/**
|
||||
* \brief Returns the maximal allowed percent of the horizontal
|
||||
* space covered by the coordinate plane that may be empty.
|
||||
*
|
||||
* \return A percent value indicating how much of the horizontal space may be empty.
|
||||
* If more than this is empty, automatic range adjusting is applied.
|
||||
* A return value of 100 indicates that no such automatic adjusting is done at all.
|
||||
*
|
||||
* \sa setAutoAdjustHorizontalRangeToData, adjustRangesToData
|
||||
*/
|
||||
unsigned int autoAdjustHorizontalRangeToData() const;
|
||||
|
||||
/**
|
||||
* \brief Returns the maximal allowed percent of the vertical
|
||||
* space covered by the coordinate plane that may be empty.
|
||||
*
|
||||
* \return A percent value indicating how much of the vertical space may be empty.
|
||||
* If more than this is empty, automatic range adjusting is applied.
|
||||
* A return value of 100 indicates that no such automatic adjusting is done at all.
|
||||
*
|
||||
* \sa setAutoAdjustVerticalRangeToData, adjustRangesToData
|
||||
*/
|
||||
unsigned int autoAdjustVerticalRangeToData() const;
|
||||
|
||||
|
||||
/**
|
||||
* Set the attributes to be used for grid lines drawn in horizontal
|
||||
* direction (or in vertical direction, resp.).
|
||||
*
|
||||
* To disable horizontal grid painting, for example, your code should like this:
|
||||
* \code
|
||||
* GridAttributes ga = plane->gridAttributes( Qt::Horizontal );
|
||||
* ga.setGridVisible( false );
|
||||
* plane-setGridAttributes( Qt::Horizontal, ga );
|
||||
* \endcode
|
||||
*
|
||||
* \note setGridAttributes overwrites the global attributes that
|
||||
* were set by AbstractCoordinatePlane::setGlobalGridAttributes.
|
||||
* To re-activate these global attributes you can call
|
||||
* resetGridAttributes.
|
||||
*
|
||||
* \sa resetGridAttributes, gridAttributes
|
||||
* \sa setAutoAdjustGridToZoom
|
||||
* \sa AbstractCoordinatePlane::setGlobalGridAttributes
|
||||
* \sa hasOwnGridAttributes
|
||||
*/
|
||||
void setGridAttributes( Qt::Orientation orientation, const GridAttributes & );
|
||||
|
||||
/**
|
||||
* Reset the attributes to be used for grid lines drawn in horizontal
|
||||
* direction (or in vertical direction, resp.).
|
||||
* By calling this method you specify that the global attributes set by
|
||||
* AbstractCoordinatePlane::setGlobalGridAttributes be used.
|
||||
*
|
||||
* \sa setGridAttributes, gridAttributes
|
||||
* \sa setAutoAdjustGridToZoom
|
||||
* \sa AbstractCoordinatePlane::globalGridAttributes
|
||||
* \sa hasOwnGridAttributes
|
||||
*/
|
||||
void resetGridAttributes( Qt::Orientation orientation );
|
||||
|
||||
/**
|
||||
* \return The attributes used for grid lines drawn in horizontal
|
||||
* direction (or in vertical direction, resp.).
|
||||
*
|
||||
* \note This function always returns a valid set of grid attributes:
|
||||
* If no special grid attributes were set foe this orientation
|
||||
* the global attributes are returned, as returned by
|
||||
* AbstractCoordinatePlane::globalGridAttributes.
|
||||
*
|
||||
* \sa setGridAttributes
|
||||
* \sa resetGridAttributes
|
||||
* \sa AbstractCoordinatePlane::globalGridAttributes
|
||||
* \sa hasOwnGridAttributes
|
||||
*/
|
||||
const GridAttributes gridAttributes( Qt::Orientation orientation ) const;
|
||||
|
||||
/**
|
||||
* \return Returns whether the grid attributes have been set for the
|
||||
* respective direction via setGridAttributes( orientation ).
|
||||
*
|
||||
* If false, the grid will use the global attributes set
|
||||
* by AbstractCoordinatePlane::globalGridAttributes (or the default
|
||||
* attributes, resp.)
|
||||
*
|
||||
* \sa setGridAttributes
|
||||
* \sa resetGridAttributes
|
||||
* \sa AbstractCoordinatePlane::globalGridAttributes
|
||||
*/
|
||||
bool hasOwnGridAttributes( Qt::Orientation orientation ) const;
|
||||
|
||||
/**
|
||||
* Disable / re-enable the built-in grid adjusting feature.
|
||||
*
|
||||
* By default additional lines will be drawn in a Linear grid when zooming in.
|
||||
*
|
||||
* \sa autoAdjustGridToZoom, setGridAttributes
|
||||
*/
|
||||
void setAutoAdjustGridToZoom( bool autoAdjust );
|
||||
|
||||
/**
|
||||
* Return the status of the built-in grid adjusting feature.
|
||||
*
|
||||
* \sa setAutoAdjustGridToZoom
|
||||
*/
|
||||
#if QT_VERSION < 0x040400 || defined(Q_COMPILER_MANGLES_RETURN_TYPE)
|
||||
const bool autoAdjustGridToZoom() const;
|
||||
#else
|
||||
bool autoAdjustGridToZoom() const;
|
||||
#endif
|
||||
|
||||
AxesCalcMode axesCalcModeY() const;
|
||||
AxesCalcMode axesCalcModeX() const;
|
||||
|
||||
/** Specifies the calculation modes for all axes */
|
||||
void setAxesCalcModes( AxesCalcMode mode );
|
||||
/** Specifies the calculation mode for all Ordinate axes */
|
||||
void setAxesCalcModeY( AxesCalcMode mode );
|
||||
/** Specifies the calculation mode for all Abscissa axes */
|
||||
void setAxesCalcModeX( AxesCalcMode mode );
|
||||
|
||||
/** reimpl */
|
||||
virtual void paint( QPainter* );
|
||||
|
||||
/** reimpl */
|
||||
AbstractCoordinatePlane* sharedAxisMasterPlane( QPainter* p = 0 );
|
||||
|
||||
/**
|
||||
* Returns the currently visible data range. Might be greater than the
|
||||
* range of the grid.
|
||||
*/
|
||||
QRectF visibleDataRange() const;
|
||||
|
||||
/**
|
||||
* Returns the logical area, i.e., the rectangle defined by the very top
|
||||
* left and very bottom right coordinate.
|
||||
*/
|
||||
QRectF logicalArea() const;
|
||||
|
||||
/**
|
||||
* Returns the (physical) area occupied by the diagram. Unless zoom is applied
|
||||
* (which is also true when a fixed data coordinate / space relation is used),
|
||||
* \code diagramArea() == drawingArea() \endcode .
|
||||
* \sa setFixedDataCoordinateSpaceRelation
|
||||
* \sa drawingArea
|
||||
*/
|
||||
QRectF diagramArea() const;
|
||||
|
||||
/**
|
||||
* Returns the visible part of the diagram area, i.e.
|
||||
* \code diagramArea().intersected( drawingArea() ) \endcode
|
||||
* \sa diagramArea
|
||||
*/
|
||||
QRectF visibleDiagramArea() const;
|
||||
|
||||
/**
|
||||
* Sets whether the horizontal range should be reversed or not, i.e.
|
||||
* small values to the left and large values to the right (the default)
|
||||
* or vice versa.
|
||||
* \param reverse Whether the horizontal range should be reversed or not
|
||||
*/
|
||||
void setHorizontalRangeReversed( bool reverse );
|
||||
|
||||
/**
|
||||
* \return Whether the horizontal range is reversed or not
|
||||
*/
|
||||
bool isHorizontalRangeReversed() const;
|
||||
|
||||
/**
|
||||
* Sets whether the vertical range should be reversed or not, i.e.
|
||||
* small values at the bottom and large values at the top (the default)
|
||||
* or vice versa.
|
||||
* \param reverse Whether the vertical range should be reversed or not
|
||||
*/
|
||||
void setVerticalRangeReversed( bool reverse );
|
||||
|
||||
/**
|
||||
* \return Whether the vertical range is reversed or not
|
||||
*/
|
||||
bool isVerticalRangeReversed() const;
|
||||
|
||||
/**
|
||||
* reimplemented from AbstractCoordinatePlane
|
||||
*/
|
||||
void setGeometry( const QRect& r );
|
||||
|
||||
// reimplemented
|
||||
Qt::Orientations expandingDirections() const;
|
||||
|
||||
|
||||
public Q_SLOTS:
|
||||
/**
|
||||
* \brief Adjust both, horizontal and vertical range settings to the
|
||||
* ranges covered by the model's data values.
|
||||
*
|
||||
* \sa setHorizontalRange, setVerticalRange
|
||||
* \sa adjustHorizontalRangeToData, adjustVerticalRangeToData
|
||||
* \sa setAutoAdjustHorizontalRangeToData, setAutoAdjustVerticalRangeToData
|
||||
*/
|
||||
void adjustRangesToData();
|
||||
|
||||
/**
|
||||
* Adjust horizontal range settings to the ranges covered by the model's data values.
|
||||
* \sa adjustRangesToData
|
||||
*/
|
||||
void adjustHorizontalRangeToData();
|
||||
|
||||
/**
|
||||
* Adjust vertical range settings to the ranges covered by the model's data values.
|
||||
* \sa adjustRangesToData
|
||||
*/
|
||||
void adjustVerticalRangeToData();
|
||||
|
||||
protected:
|
||||
QRectF getRawDataBoundingRectFromDiagrams() const;
|
||||
QRectF adjustedToMaxEmptyInnerPercentage(
|
||||
const QRectF& r, unsigned int percentX, unsigned int percentY ) const;
|
||||
virtual QRectF calculateRawDataBoundingRect() const;
|
||||
virtual DataDimensionsList getDataDimensionsList() const;
|
||||
// the whole drawing area, includes diagrams and axes, but maybe smaller
|
||||
// than (width, height):
|
||||
virtual QRectF drawingArea() const;
|
||||
public:
|
||||
const QPointF translateBack( const QPointF& screenPoint ) const;
|
||||
protected:
|
||||
void paintEvent ( QPaintEvent* );
|
||||
void layoutDiagrams();
|
||||
// the following three return true if the new value is different from the old
|
||||
bool doneSetZoomFactorX( qreal factor );
|
||||
bool doneSetZoomFactorY( qreal factor );
|
||||
bool doneSetZoomCenter( const QPointF& center );
|
||||
|
||||
void handleFixedDataCoordinateSpaceRelation( const QRectF& geometry );
|
||||
|
||||
// reimplemented from QLayoutItem, via AbstractLayoutItem, AbstractArea, AbstractCoordinatePlane
|
||||
bool hasHeightForWidth() const;
|
||||
int heightForWidth( int w ) const;
|
||||
QSize sizeHint() const;
|
||||
|
||||
protected Q_SLOTS:
|
||||
void slotLayoutChanged( AbstractDiagram* );
|
||||
|
||||
private:
|
||||
void setHasOwnGridAttributes(
|
||||
Qt::Orientation orientation, bool on );
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif
|
|
@ -0,0 +1 @@
|
|||
#include "KDChartCartesianGrid.h"
|
120
massif-visualizer/kdchart/include/KDChart/KDChartCartesianGrid.h
Normal file
120
massif-visualizer/kdchart/include/KDChart/KDChartCartesianGrid.h
Normal file
|
@ -0,0 +1,120 @@
|
|||
/****************************************************************************
|
||||
** Copyright (C) 2001-2013 Klaralvdalens Datakonsult AB. All rights reserved.
|
||||
**
|
||||
** This file is part of the KD Chart library.
|
||||
**
|
||||
** Licensees holding valid commercial KD Chart licenses may use this file in
|
||||
** accordance with the KD Chart Commercial License Agreement provided with
|
||||
** the Software.
|
||||
**
|
||||
**
|
||||
** This file may be distributed and/or modified under the terms of the
|
||||
** GNU General Public License version 2 and version 3 as published by the
|
||||
** Free Software Foundation and appearing in the file LICENSE.GPL.txt included.
|
||||
**
|
||||
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
|
||||
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
||||
**
|
||||
** Contact info@kdab.com if any conditions of this licensing are not
|
||||
** clear to you.
|
||||
**
|
||||
**********************************************************************/
|
||||
|
||||
#ifndef KDCHARTCARTESIANGRID_H
|
||||
#define KDCHARTCARTESIANGRID_H
|
||||
|
||||
#include "KDChartCartesianCoordinatePlane.h"
|
||||
#include "KDChartAbstractGrid.h"
|
||||
|
||||
namespace KDChart {
|
||||
|
||||
class PaintContext;
|
||||
class CartesianCoordinatePlane;
|
||||
|
||||
/**
|
||||
* \internal
|
||||
*
|
||||
* \brief Class for the grid in a cartesian plane.
|
||||
*
|
||||
* The CartesianGrid interface is used
|
||||
* for calculating and for drawing
|
||||
* the horizonal grid lines, and the vertical grid lines
|
||||
* of a cartesian coordinate plane.
|
||||
*/
|
||||
class CartesianGrid : public AbstractGrid
|
||||
{
|
||||
public:
|
||||
CartesianGrid();
|
||||
virtual ~CartesianGrid();
|
||||
|
||||
int minimalSteps() const;
|
||||
void setMinimalSteps(int minsteps);
|
||||
|
||||
int maximalSteps() const;
|
||||
void setMaximalSteps(int maxsteps);
|
||||
|
||||
void drawGrid( PaintContext* context );
|
||||
|
||||
private:
|
||||
int m_minsteps;
|
||||
int m_maxsteps;
|
||||
|
||||
DataDimensionsList calculateGrid(
|
||||
const DataDimensionsList& rawDataDimensions ) const;
|
||||
|
||||
/**
|
||||
* Helper function called by calculateGrid() to calculate the grid of one dimension.
|
||||
*
|
||||
* Classes derived from CartesianGrid can overwrite calculateGridXY() if they need
|
||||
* a special way of calculating the start or end or step width of their grid lines.
|
||||
*
|
||||
* \param adjustLower If true, the function adjusts the start value
|
||||
* so it matches the position of a grid line, if false the start value is
|
||||
* the raw data dimension start value.
|
||||
* \param adjustUpper If true, the function adjusts the end value
|
||||
* so it matches the position of a grid line, if false the end value is
|
||||
* the raw data dimension end value.
|
||||
*/
|
||||
virtual DataDimension calculateGridXY(
|
||||
const DataDimension& rawDataDimension,
|
||||
Qt::Orientation orientation,
|
||||
bool adjustLower, bool adjustUpper ) const;
|
||||
|
||||
/**
|
||||
* Helper function called by calculateGridXY().
|
||||
*
|
||||
* Classes derived from CartesianGrid can overwrite calculateStepWidth() if they need
|
||||
* a way of calculating the step width, based upon given start/end values
|
||||
* for their horizontal or vertical grid lines which is different from the default
|
||||
* implementation.
|
||||
*
|
||||
* \note The CartesianGrid class tries to keep the displayed range as close to
|
||||
* the raw data range as possible, so in most cases there should be no reason
|
||||
* to change the default implementation: Using
|
||||
* KDChart::GridAttributes::setGridGranularitySequence() should be sufficient.
|
||||
*
|
||||
* \param start The raw start value of the data range.
|
||||
* \param end The raw end value of the data range.
|
||||
* \param granularities The list of allowed granularities.
|
||||
* \param adjustLower If true, the function adjusts the start value
|
||||
* so it matches the position of a grid line, if false the start value is
|
||||
* left as it is, in any case the value is adjusted for internal calculation only.
|
||||
* \param adjustUpper If true, the function adjusts the end value
|
||||
* so it matches the position of a grid line, if false the end value is
|
||||
* left as it is, in any case the value is adjusted for internal calculation only.
|
||||
*
|
||||
* \returns stepWidth: One of the values from the granularities
|
||||
* list, optionally multiplied by a positive (or negative, resp.)
|
||||
* power of ten. subStepWidth: The matching width for sub-grid lines.
|
||||
*/
|
||||
virtual void calculateStepWidth(
|
||||
qreal start, qreal end,
|
||||
const QList<qreal>& granularities,
|
||||
Qt::Orientation orientation,
|
||||
qreal& stepWidth, qreal& subStepWidth,
|
||||
bool adjustLower, bool adjustUpper ) const;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif
|
1
massif-visualizer/kdchart/include/KDChart/KDChartChart
Normal file
1
massif-visualizer/kdchart/include/KDChart/KDChartChart
Normal file
|
@ -0,0 +1 @@
|
|||
#include "KDChartChart.h"
|
576
massif-visualizer/kdchart/include/KDChart/KDChartChart.h
Normal file
576
massif-visualizer/kdchart/include/KDChart/KDChartChart.h
Normal file
|
@ -0,0 +1,576 @@
|
|||
/****************************************************************************
|
||||
** Copyright (C) 2001-2013 Klaralvdalens Datakonsult AB. All rights reserved.
|
||||
**
|
||||
** This file is part of the KD Chart library.
|
||||
**
|
||||
** Licensees holding valid commercial KD Chart licenses may use this file in
|
||||
** accordance with the KD Chart Commercial License Agreement provided with
|
||||
** the Software.
|
||||
**
|
||||
**
|
||||
** This file may be distributed and/or modified under the terms of the
|
||||
** GNU General Public License version 2 and version 3 as published by the
|
||||
** Free Software Foundation and appearing in the file LICENSE.GPL.txt included.
|
||||
**
|
||||
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
|
||||
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
||||
**
|
||||
** Contact info@kdab.com if any conditions of this licensing are not
|
||||
** clear to you.
|
||||
**
|
||||
**********************************************************************/
|
||||
|
||||
#ifndef KDCHARTCHART_H
|
||||
#define KDCHARTCHART_H
|
||||
|
||||
#include <QWidget>
|
||||
|
||||
#include "kdchart_export.h"
|
||||
#include "KDChartGlobal.h"
|
||||
|
||||
/*
|
||||
Simplified(*) overview of object ownership in a chart:
|
||||
|
||||
Chart is-a QWidget
|
||||
|
|
||||
n CoordinatePlanes is-a AbstractArea is-a AbstractLayoutItem is-a QLayoutItem
|
||||
|
|
||||
n Diagrams is-a QAbstractItemView is-a QWidget
|
||||
/ | \
|
||||
AbstractGrid | Axes (can be shared between diagrams) is-a AbstractArea is-a... QLayoutItem
|
||||
(no base class) |
|
||||
Legends is-a AbstractAreaWidget is-a QWidget
|
||||
|
||||
(*) less important classes, including base classes, removed.
|
||||
|
||||
|
||||
Layout rules:
|
||||
|
||||
In principle, every size or existence change in one of the objects listed above must be propagated
|
||||
to all other objects. This could change their size.
|
||||
There are also settings changes that invalidate the size of other components, where the size changes
|
||||
are detected and propagated.
|
||||
|
||||
|
||||
Painting call tree (simplified):
|
||||
|
||||
Chart::paint() (from users) / paintEvent() (from framework)
|
||||
ChartPrivate::paintAll()-----------------------------------------------\
|
||||
CoordinatePlane::paintAll() (from AbstractArea)--------\ Axis::paintAll()-\
|
||||
CoordinatePlane::paint() (from AbstractLayoutItem) Grid::drawGrid() Axis::paint()
|
||||
Diagram::paint( PaintContext* paintContext )
|
||||
|
||||
Note that grids are painted from the coordinate plane, not from the diagram as ownership would suggest.
|
||||
|
||||
*/
|
||||
|
||||
namespace KDChart {
|
||||
|
||||
class BackgroundAttributes;
|
||||
class FrameAttributes;
|
||||
class AbstractDiagram;
|
||||
class AbstractCoordinatePlane;
|
||||
class HeaderFooter;
|
||||
class Legend;
|
||||
|
||||
typedef QList<AbstractCoordinatePlane*> CoordinatePlaneList;
|
||||
typedef QList<HeaderFooter*> HeaderFooterList;
|
||||
typedef QList<Legend*> LegendList;
|
||||
|
||||
|
||||
/**
|
||||
* @class Chart KDChartChart.h KDChartChart
|
||||
* @brief A chart with one or more diagrams.
|
||||
*
|
||||
* The Chart class represents a drawing consisting of one or more diagrams
|
||||
* and various optional elements such as legends, axes, text boxes, headers
|
||||
* or footers. It takes ownership of all these elements when they are assigned
|
||||
* to it. Each diagram is associated with a coordinate plane, of which the chart
|
||||
* can have more than one. The coordinate planes (and thus the associated diagrams)
|
||||
* can be laid out in various ways.
|
||||
*
|
||||
* The Chart class makes heavy use of the Qt Interview framework for model/view
|
||||
* programming, and thus requires data to be presented to it in a QAbstractItemModel
|
||||
* compatible way. For many simple charts, especially if the visualized data is
|
||||
* static, KDChart::Widget provides an abstracted interface, that hides the complexity
|
||||
* of Interview to a large extent.
|
||||
*/
|
||||
class KDCHART_EXPORT Chart : public QWidget
|
||||
{
|
||||
Q_OBJECT
|
||||
// KD Chart 3.0: leading is inter-line distance of text. this here is MARGIN or SPACING.
|
||||
Q_PROPERTY( int globalLeadingTop READ globalLeadingTop WRITE setGlobalLeadingTop )
|
||||
Q_PROPERTY( int globalLeadingBottom READ globalLeadingBottom WRITE setGlobalLeadingBottom )
|
||||
Q_PROPERTY( int globalLeadingLeft READ globalLeadingLeft WRITE setGlobalLeadingLeft )
|
||||
Q_PROPERTY( int globalLeadingRight READ globalLeadingRight WRITE setGlobalLeadingRight )
|
||||
Q_PROPERTY( bool useNewLayoutSystem READ useNewLayoutSystem WRITE setUseNewLayoutSystem )
|
||||
|
||||
KDCHART_DECLARE_PRIVATE_BASE_POLYMORPHIC_QWIDGET( Chart )
|
||||
|
||||
public:
|
||||
explicit Chart ( QWidget* parent = 0 );
|
||||
~Chart();
|
||||
|
||||
/**
|
||||
* @brief useNewLayoutSystem
|
||||
* Be very careful activating the new layout system,
|
||||
* its still experimental and works only if the user knows
|
||||
* what he is doing. The reason is that the system does not prevent
|
||||
* the user from creating sharing graphs that are not layoutable in a
|
||||
* plane and still needs assistance from the user.
|
||||
*/
|
||||
bool useNewLayoutSystem() const;
|
||||
void setUseNewLayoutSystem( bool value );
|
||||
|
||||
/**
|
||||
\brief Specify the frame attributes to be used, by default is it a thin black line.
|
||||
|
||||
To hide the frame line, you could do something like this:
|
||||
\verbatim
|
||||
KDChart::FrameAttributes frameAttrs( my_chart->frameAttributes() );
|
||||
frameAttrs.setVisible( false );
|
||||
my_chart->setFrameAttributes( frameAttrs );
|
||||
\endverbatim
|
||||
|
||||
\sa setBackgroundAttributes
|
||||
*/
|
||||
void setFrameAttributes( const FrameAttributes &a );
|
||||
FrameAttributes frameAttributes() const;
|
||||
|
||||
/**
|
||||
\brief Specify the background attributes to be used, by default there is no background.
|
||||
|
||||
To set a light blue background, you could do something like this:
|
||||
\verbatim
|
||||
KDChart::BackgroundAttributes backgroundAttrs( my_chart->backgroundAttributes() );
|
||||
backgroundAttrs.setVisible( true );
|
||||
backgroundAttrs.setBrush( QColor(0xd0,0xd0,0xff) );
|
||||
my_chart->setBackgroundAttributes( backgroundAttrs );
|
||||
\endverbatim
|
||||
|
||||
\sa setFrameAttributes
|
||||
*/
|
||||
void setBackgroundAttributes( const BackgroundAttributes &a );
|
||||
BackgroundAttributes backgroundAttributes() const;
|
||||
|
||||
/**
|
||||
* Each chart must have at least one coordinate plane.
|
||||
* Initially a default CartesianCoordinatePlane is created.
|
||||
* Use replaceCoordinatePlane() to replace it with a different
|
||||
* one, such as a PolarCoordinatePlane.
|
||||
* @return The first coordinate plane of the chart.
|
||||
*/
|
||||
AbstractCoordinatePlane* coordinatePlane();
|
||||
|
||||
/**
|
||||
* The list of coordinate planes.
|
||||
* @return The list of coordinate planes.
|
||||
*/
|
||||
CoordinatePlaneList coordinatePlanes();
|
||||
|
||||
/**
|
||||
* Adds a coordinate plane to the chart. The chart takes ownership.
|
||||
* @param plane The coordinate plane to add.
|
||||
*
|
||||
* \sa replaceCoordinatePlane, takeCoordinatePlane
|
||||
*/
|
||||
void addCoordinatePlane( AbstractCoordinatePlane* plane );
|
||||
|
||||
/**
|
||||
* Inserts a coordinate plane to the chart at index @p index.
|
||||
* The chart takes ownership.
|
||||
*
|
||||
* @param index The index where to add the plane
|
||||
* @param plane The coordinate plane to add.
|
||||
*
|
||||
* \sa replaceCoordinatePlane, takeCoordinatePlane
|
||||
*/
|
||||
void insertCoordinatePlane( int index, AbstractCoordinatePlane* plane );
|
||||
|
||||
/**
|
||||
* Replaces the old coordinate plane, or appends the
|
||||
* plane, it there is none yet.
|
||||
*
|
||||
* @param plane The coordinate plane to be used instead of the old plane.
|
||||
* This parameter must not be zero, or the method will do nothing.
|
||||
*
|
||||
* @param oldPlane The coordinate plane to be removed by the new plane. This
|
||||
* plane will be deleted automatically. If the parameter is omitted,
|
||||
* the very first coordinate plane will be replaced. In case, there was no
|
||||
* plane yet, the new plane will just be added.
|
||||
*
|
||||
* \note If you want to re-use the old coordinate plane, call takeCoordinatePlane and
|
||||
* addCoordinatePlane, instead of using replaceCoordinatePlane.
|
||||
*
|
||||
* \sa addCoordinatePlane, takeCoordinatePlane
|
||||
*/
|
||||
void replaceCoordinatePlane( AbstractCoordinatePlane* plane,
|
||||
AbstractCoordinatePlane* oldPlane = 0 );
|
||||
|
||||
/**
|
||||
* Removes the coordinate plane from the chart, without deleting it.
|
||||
*
|
||||
* The chart no longer owns the plane, so it is
|
||||
* the caller's responsibility to delete the plane.
|
||||
*
|
||||
* \sa addCoordinatePlane, takeCoordinatePlane
|
||||
*/
|
||||
void takeCoordinatePlane( AbstractCoordinatePlane* plane );
|
||||
|
||||
/**
|
||||
* Set the coordinate plane layout that should be used as model for
|
||||
* the internal used layout. The layout needs to be an instance of
|
||||
* QHBoxLayout or QVBoxLayout.
|
||||
*/
|
||||
void setCoordinatePlaneLayout( QLayout * layout );
|
||||
QLayout* coordinatePlaneLayout();
|
||||
|
||||
/**
|
||||
* The first header or footer of the chart. By default there is none.
|
||||
* @return The first header or footer of the chart or 0 if there was none
|
||||
* added to the chart.
|
||||
*/
|
||||
HeaderFooter* headerFooter();
|
||||
|
||||
/**
|
||||
* The list of headers and footers associated with the chart.
|
||||
* @return The list of headers and footers associated with the chart.
|
||||
*/
|
||||
HeaderFooterList headerFooters();
|
||||
|
||||
/**
|
||||
* Adds a header or a footer to the chart. The chart takes ownership.
|
||||
* @param headerFooter The header (or footer, resp.) to add.
|
||||
*
|
||||
* \sa replaceHeaderFooter, takeHeaderFooter
|
||||
*/
|
||||
void addHeaderFooter( HeaderFooter* headerFooter );
|
||||
|
||||
/**
|
||||
* Replaces the old header (or footer, resp.), or appends the
|
||||
* new header or footer, it there is none yet.
|
||||
*
|
||||
* @param headerFooter The header or footer to be used instead of the old one.
|
||||
* This parameter must not be zero, or the method will do nothing.
|
||||
*
|
||||
* @param oldHeaderFooter The header or footer to be removed by the new one. This
|
||||
* header or footer will be deleted automatically. If the parameter is omitted,
|
||||
* the very first header or footer will be replaced. In case, there was no
|
||||
* header and no footer yet, the new header or footer will just be added.
|
||||
*
|
||||
* \note If you want to re-use the old header or footer, call takeHeaderFooter and
|
||||
* addHeaderFooter, instead of using replaceHeaderFooter.
|
||||
*
|
||||
* \sa addHeaderFooter, takeHeaderFooter
|
||||
*/
|
||||
void replaceHeaderFooter ( HeaderFooter* headerFooter,
|
||||
HeaderFooter* oldHeaderFooter = 0 );
|
||||
|
||||
/**
|
||||
* Removes the header (or footer, resp.) from the chart, without deleting it.
|
||||
*
|
||||
* The chart no longer owns the header or footer, so it is
|
||||
* the caller's responsibility to delete the header or footer.
|
||||
*
|
||||
* \sa addHeaderFooter, replaceHeaderFooter
|
||||
*/
|
||||
void takeHeaderFooter( HeaderFooter* headerFooter );
|
||||
|
||||
/**
|
||||
* The first legend of the chart or 0 if there was none added to the chart.
|
||||
* @return The first legend of the chart or 0 if none exists.
|
||||
*/
|
||||
Legend* legend();
|
||||
|
||||
/**
|
||||
* The list of all legends associated with the chart.
|
||||
* @return The list of all legends associated with the chart.
|
||||
*/
|
||||
LegendList legends();
|
||||
|
||||
/**
|
||||
* Add the given legend to the chart. The chart takes ownership.
|
||||
* @param legend The legend to add.
|
||||
*
|
||||
* \sa replaceLegend, takeLegend
|
||||
*/
|
||||
void addLegend( Legend* legend );
|
||||
|
||||
/**
|
||||
* Replaces the old legend, or appends the
|
||||
* new legend, it there is none yet.
|
||||
*
|
||||
* @param legend The legend to be used instead of the old one.
|
||||
* This parameter must not be zero, or the method will do nothing.
|
||||
*
|
||||
* @param oldLegend The legend to be removed by the new one. This
|
||||
* legend will be deleted automatically. If the parameter is omitted,
|
||||
* the very first legend will be replaced. In case, there was no
|
||||
* legend yet, the new legend will just be added.
|
||||
*
|
||||
* If you want to re-use the old legend, call takeLegend and
|
||||
* addLegend, instead of using replaceLegend.
|
||||
*
|
||||
* \note Whenever addLegend is called the font sizes used by the
|
||||
* Legend are set to relative and they get coupled to the Chart's size,
|
||||
* with their relative values being 20 for the item texts and 24 to the
|
||||
* title text. So if you want to use custom font sizes for the Legend
|
||||
* make sure to set them after calling addLegend.
|
||||
*
|
||||
* \sa addLegend, takeLegend
|
||||
*/
|
||||
void replaceLegend ( Legend* legend, Legend* oldLegend = 0 );
|
||||
|
||||
/**
|
||||
* Removes the legend from the chart, without deleting it.
|
||||
*
|
||||
* The chart no longer owns the legend, so it is
|
||||
* the caller's responsibility to delete the legend.
|
||||
*
|
||||
* \sa addLegend, takeLegend
|
||||
*/
|
||||
void takeLegend( Legend* legend );
|
||||
|
||||
/**
|
||||
* Set the padding between the margin of the widget and the area that
|
||||
* the contents are drawn into.
|
||||
* @param left The padding on the left side.
|
||||
* @param top The padding at the top.
|
||||
* @param right The padding on the left hand side.
|
||||
* @param bottom The padding on the bottom.
|
||||
*
|
||||
* \note Using previous versions of KD Chart you might have called
|
||||
* setGlobalLeading() to make room for long Abscissa labels (or for an
|
||||
* overlapping top label of an Ordinate axis, resp.) that would not fit
|
||||
* into the normal axis area. This is \em no \em longer \em needed
|
||||
* because KD Chart now is using hidden auto-spacer items reserving
|
||||
* as much free space as is needed for axes with overlaping content
|
||||
* at the respective sides.
|
||||
*
|
||||
* \sa setGlobalLeadingTop, setGlobalLeadingBottom, setGlobalLeadingLeft, setGlobalLeadingRight
|
||||
* \sa globalLeadingTop, globalLeadingBottom, globalLeadingLeft, globalLeadingRight
|
||||
*/
|
||||
void setGlobalLeading( int left, int top, int right, int bottom );
|
||||
|
||||
/**
|
||||
* Set the padding between the start of the widget and the start
|
||||
* of the area that is used for drawing on the left.
|
||||
* @param leading The padding value.
|
||||
*
|
||||
* \sa setGlobalLeading
|
||||
*/
|
||||
void setGlobalLeadingLeft( int leading );
|
||||
|
||||
/**
|
||||
* The padding between the start of the widget and the start
|
||||
* of the area that is used for drawing on the left.
|
||||
* @return The padding between the start of the widget and the start
|
||||
* of the area that is used for drawing on the left.
|
||||
*
|
||||
* \sa setGlobalLeading
|
||||
*/
|
||||
int globalLeadingLeft() const;
|
||||
|
||||
/**
|
||||
* Set the padding between the start of the widget and the start
|
||||
* of the area that is used for drawing at the top.
|
||||
* @param leading The padding value.
|
||||
*
|
||||
* \sa setGlobalLeading
|
||||
*/
|
||||
void setGlobalLeadingTop( int leading );
|
||||
|
||||
/**
|
||||
* The padding between the start of the widget and the start
|
||||
* of the area that is used for drawing at the top.
|
||||
* @return The padding between the start of the widget and the start
|
||||
* of the area that is used for drawing at the top.
|
||||
*
|
||||
* \sa setGlobalLeading
|
||||
*/
|
||||
int globalLeadingTop() const;
|
||||
|
||||
/**
|
||||
* Set the padding between the start of the widget and the start
|
||||
* of the area that is used for drawing on the right.
|
||||
* @param leading The padding value.
|
||||
*
|
||||
* \sa setGlobalLeading
|
||||
*/
|
||||
void setGlobalLeadingRight( int leading );
|
||||
|
||||
/**
|
||||
* The padding between the start of the widget and the start
|
||||
* of the area that is used for drawing on the right.
|
||||
* @return The padding between the start of the widget and the start
|
||||
* of the area that is used for drawing on the right.
|
||||
*
|
||||
* \sa setGlobalLeading
|
||||
*/
|
||||
int globalLeadingRight() const;
|
||||
|
||||
/**
|
||||
* Set the padding between the start of the widget and the start
|
||||
* of the area that is used for drawing on the bottom.
|
||||
* @param leading The padding value.
|
||||
*
|
||||
* \sa setGlobalLeading
|
||||
*/
|
||||
void setGlobalLeadingBottom( int leading );
|
||||
|
||||
/**
|
||||
* The padding between the start of the widget and the start
|
||||
* of the area that is used for drawing at the bottom.
|
||||
* @return The padding between the start of the widget and the start
|
||||
* of the area that is used for drawing at the bottom.
|
||||
*
|
||||
* \sa setGlobalLeading
|
||||
*/
|
||||
int globalLeadingBottom() const;
|
||||
|
||||
/**
|
||||
* Paints all the contents of the chart. Use this method to make KDChart
|
||||
* draw into your QPainter.
|
||||
*
|
||||
* \note Any global leading settings will be used by the paint method too,
|
||||
* so make sure to set them to zero, if you want the drawing to have the exact
|
||||
* size of the target rectangle.
|
||||
*
|
||||
* \param painter The painter to be drawn into.
|
||||
* \param target The rectangle to be filled by the Chart's drawing.
|
||||
*
|
||||
* \sa setGlobalLeading
|
||||
*/
|
||||
void paint( QPainter* painter, const QRect& target );
|
||||
|
||||
void reLayoutFloatingLegends();
|
||||
|
||||
Q_SIGNALS:
|
||||
/** Emitted upon change of a property of the Chart or any of its components. */
|
||||
void propertiesChanged();
|
||||
void finishedDrawing();
|
||||
|
||||
protected:
|
||||
/**
|
||||
* Adjusts the internal layout when the chart is resized.
|
||||
*/
|
||||
/* reimp */ void resizeEvent ( QResizeEvent * event );
|
||||
|
||||
/**
|
||||
* @brief Draws the background and frame, then calls paint().
|
||||
*
|
||||
* In most cases there is no need to override this method in a derived
|
||||
* class, but if you do, do not forget to call paint().
|
||||
* @sa paint
|
||||
*/
|
||||
/* reimp */ void paintEvent( QPaintEvent* event );
|
||||
|
||||
/** reimp */
|
||||
void mousePressEvent( QMouseEvent* event );
|
||||
/** reimp */
|
||||
void mouseDoubleClickEvent( QMouseEvent* event );
|
||||
/** reimp */
|
||||
void mouseMoveEvent( QMouseEvent* event );
|
||||
/** reimp */
|
||||
void mouseReleaseEvent( QMouseEvent* event );
|
||||
/** reimp */
|
||||
bool event( QEvent* event );
|
||||
|
||||
private:
|
||||
// TODO move this to the private class
|
||||
void addLegendInternal( Legend *legend, bool setMeasures );
|
||||
};
|
||||
|
||||
// Here we have a few docu block to be included into the API documentation:
|
||||
/**
|
||||
* \dir src
|
||||
* \brief Implementation directory of KDChart.
|
||||
*
|
||||
* This directory contains the header files and the source files of both,
|
||||
* the private and the public classes.
|
||||
*
|
||||
* \note Only classes that have an include wrapper in the \c $KDCHARTDIR/include
|
||||
* directory are part of the supported API.
|
||||
* All other classes are to be considered as implemntation details, they
|
||||
* could be changed in future versions of KDChart without notice.
|
||||
*
|
||||
* In other words: No class that is not mentioned in the \c $KDCHARTDIR/include
|
||||
* directory may be directly used by your application.
|
||||
*
|
||||
* The recommended way to include classes of the KDChart API is including
|
||||
* them by class name, so instead of including KDChartChart.h you would say:
|
||||
*
|
||||
\verbatim
|
||||
#include <KDChartChart>
|
||||
\endverbatim
|
||||
*
|
||||
* When following this there is no reason to include the \c $KDCHARTDIR/src
|
||||
* directory, it is sufficient to include \c $KDCHARTDIR/include
|
||||
*/
|
||||
}
|
||||
/**
|
||||
* @class QAbstractItemView "(do not include)"
|
||||
* @brief Class only listed here to document inheritance of some KDChart classes.
|
||||
*
|
||||
* Please consult the respective Qt documentation for details:
|
||||
* <A HREF="http://doc.trolltech.com/">http://doc.trolltech.com/</A>
|
||||
*/
|
||||
/**
|
||||
* @class QAbstractProxyModel "(do not include)"
|
||||
* @brief Class only listed here to document inheritance of some KDChart classes.
|
||||
*
|
||||
* Please consult the respective Qt documentation for details:
|
||||
* <A HREF="http://doc.trolltech.com/">http://doc.trolltech.com/</A>
|
||||
*/
|
||||
/**
|
||||
* @class QFrame "(do not include)"
|
||||
* @brief Class only listed here to document inheritance of some KDChart classes.
|
||||
*
|
||||
* Please consult the respective Qt documentation for details:
|
||||
* <A HREF="http://doc.trolltech.com/">http://doc.trolltech.com/</A>
|
||||
*/
|
||||
/**
|
||||
* @class QObject "(do not include)"
|
||||
* @brief Class only listed here to document inheritance of some KDChart classes.
|
||||
*
|
||||
* Please consult the respective Qt documentation for details:
|
||||
* <A HREF="http://doc.trolltech.com/">http://doc.trolltech.com/</A>
|
||||
*/
|
||||
/**
|
||||
* @class QSortFilterProxyModel "(do not include)"
|
||||
* @brief Class only listed here to document inheritance of some KDChart classes.
|
||||
*
|
||||
* Please consult the respective Qt documentation for details:
|
||||
* <A HREF="http://doc.trolltech.com/">http://doc.trolltech.com/</A>
|
||||
*/
|
||||
/**
|
||||
* @class QWidget "(do not include)"
|
||||
* @brief Class only listed here to document inheritance of some KDChart classes.
|
||||
*
|
||||
* Please consult the respective Qt documentation for details:
|
||||
* <A HREF="http://doc.trolltech.com/">http://doc.trolltech.com/</A>
|
||||
*/
|
||||
/**
|
||||
* @class QTextDocument "(do not include)"
|
||||
* @brief Class only listed here to document inheritance of some KDChart classes.
|
||||
*
|
||||
* Please consult the respective Qt documentation for details:
|
||||
* <A HREF="http://doc.trolltech.com/">http://doc.trolltech.com/</A>
|
||||
*/
|
||||
/**
|
||||
* @class QLayoutItem "(do not include)"
|
||||
* @brief Class only listed here to document inheritance of some KDChart classes.
|
||||
*
|
||||
* Please consult the respective Qt documentation for details:
|
||||
* <A HREF="http://doc.trolltech.com/">http://doc.trolltech.com/</A>
|
||||
*/
|
||||
/**
|
||||
* @class QGraphicsPolygonItem "(do not include)"
|
||||
* @brief Class only listed here to document inheritance of some KDChart classes.
|
||||
*
|
||||
* Please consult the respective Qt documentation for details:
|
||||
* <A HREF="http://doc.trolltech.com/">http://doc.trolltech.com/</A>
|
||||
*/
|
||||
|
||||
|
||||
#endif
|
|
@ -0,0 +1 @@
|
|||
#include "KDChartDataValueAttributes.h"
|
|
@ -0,0 +1,327 @@
|
|||
/****************************************************************************
|
||||
** Copyright (C) 2001-2013 Klaralvdalens Datakonsult AB. All rights reserved.
|
||||
**
|
||||
** This file is part of the KD Chart library.
|
||||
**
|
||||
** Licensees holding valid commercial KD Chart licenses may use this file in
|
||||
** accordance with the KD Chart Commercial License Agreement provided with
|
||||
** the Software.
|
||||
**
|
||||
**
|
||||
** This file may be distributed and/or modified under the terms of the
|
||||
** GNU General Public License version 2 and version 3 as published by the
|
||||
** Free Software Foundation and appearing in the file LICENSE.GPL.txt included.
|
||||
**
|
||||
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
|
||||
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
||||
**
|
||||
** Contact info@kdab.com if any conditions of this licensing are not
|
||||
** clear to you.
|
||||
**
|
||||
**********************************************************************/
|
||||
|
||||
#ifndef KDCHARTDATAVALUEATTRIBUTES_H
|
||||
#define KDCHARTDATAVALUEATTRIBUTES_H
|
||||
|
||||
#include <Qt>
|
||||
#include <QMetaType>
|
||||
#include "KDChartGlobal.h"
|
||||
#include "KDChartEnums.h"
|
||||
#include "KDChartRelativePosition.h"
|
||||
|
||||
/** \file KDChartDataValueAttributes.h
|
||||
* \brief Declaring the class KDChart::DataValueAttributes.
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
namespace KDChart {
|
||||
|
||||
class TextAttributes;
|
||||
class BackgroundAttributes;
|
||||
class FrameAttributes;
|
||||
class MarkerAttributes;
|
||||
|
||||
/**
|
||||
* \class DataValueAttributes KDChartDataValueAttributes.h KDChartDataValueAttributes
|
||||
* \brief Diagram attributes dealing with data value labels.
|
||||
*
|
||||
* The DataValueAttributes group all properties that can be set
|
||||
* wrt data value labels and if and how they are displayed. This
|
||||
* includes things like the text attributes (font, color), what
|
||||
* markers are used, how many decimal digits are displayed, etc.
|
||||
*/
|
||||
class KDCHART_EXPORT DataValueAttributes
|
||||
{
|
||||
public:
|
||||
DataValueAttributes();
|
||||
DataValueAttributes( const DataValueAttributes& );
|
||||
DataValueAttributes &operator= ( const DataValueAttributes& );
|
||||
bool operator==( const DataValueAttributes& ) const;
|
||||
inline bool operator!=( const DataValueAttributes& other ) const { return !operator==(other); }
|
||||
|
||||
~DataValueAttributes();
|
||||
|
||||
static const DataValueAttributes& defaultAttributes();
|
||||
static const QVariant& defaultAttributesAsVariant();
|
||||
|
||||
/** Set whether data value labels should be displayed.
|
||||
* \param visible Whether data value labels should be displayed.
|
||||
*/
|
||||
void setVisible( bool visible );
|
||||
|
||||
/**
|
||||
* @return Whether data value labels should be displayed.
|
||||
*/
|
||||
bool isVisible() const;
|
||||
|
||||
/**
|
||||
* Set the text attributes to use for the data value labels.
|
||||
* \param a The text attributes to set.
|
||||
* \see TextAttributes
|
||||
*/
|
||||
void setTextAttributes( const TextAttributes &a );
|
||||
|
||||
/**
|
||||
* \return The text attributes used for painting data value labels.
|
||||
*/
|
||||
TextAttributes textAttributes() const;
|
||||
|
||||
/**
|
||||
* If true, rotation of negative value labels is negated, so that negative
|
||||
* values are rotated in opposite direction of textAttributes().rotation(),
|
||||
* and in this sense appear "mirrored" to positive value labels, though the
|
||||
* text itself is *not* mirrored, only its rotation.
|
||||
*/
|
||||
bool mirrorNegativeValueTextRotation() const;
|
||||
|
||||
/**
|
||||
* \see mirrorNegativeValueTextRotation()
|
||||
*/
|
||||
void setMirrorNegativeValueTextRotation( bool enable );
|
||||
|
||||
/**
|
||||
* Set the frame attributes to use for the data value labels area.
|
||||
* \param a The frame attributes to set.
|
||||
* \see FrameAttributes
|
||||
*/
|
||||
void setFrameAttributes( const FrameAttributes &a );
|
||||
|
||||
/**
|
||||
* \return The frame attributes used for painting the data
|
||||
* value labels area.
|
||||
* \see FrameAttributes
|
||||
*/
|
||||
FrameAttributes frameAttributes() const;
|
||||
|
||||
/**
|
||||
* Set the background attributes to use for the data value labels area.
|
||||
* \param a The background attributes to set.
|
||||
* \see BackgroundAttributes
|
||||
*/
|
||||
void setBackgroundAttributes( const BackgroundAttributes &a );
|
||||
|
||||
/**
|
||||
* \return The background attributes used for painting the data
|
||||
* value labels area.
|
||||
* \see BackgroundAttributes
|
||||
*/
|
||||
BackgroundAttributes backgroundAttributes() const;
|
||||
|
||||
/**
|
||||
* Set the marker attributes to use for the data values. This includes
|
||||
* the marker type.
|
||||
* \param a The marker attributes to set.
|
||||
* \see MarkerAttributes
|
||||
*/
|
||||
void setMarkerAttributes( const MarkerAttributes &a );
|
||||
|
||||
/**
|
||||
* \return The marker attributes used for decorating the data
|
||||
* values.
|
||||
* \see MarkerAttributes
|
||||
*/
|
||||
MarkerAttributes markerAttributes() const;
|
||||
|
||||
/**
|
||||
* Specify whether to use percentages instead of actual data point values when no
|
||||
* specific label is set. In a bar or cartesian diagram, this means that the value
|
||||
* will be shown in % in relation to the sum of all values in the same category, in
|
||||
* a polar diagram in relation to the sum of all values in a data set.
|
||||
*
|
||||
* When this is turned on, the value will \b not automatically have the '%' postfix.
|
||||
* \param enable Whether to enable percentage values
|
||||
*/
|
||||
void setUsePercentage( bool enable );
|
||||
|
||||
/**
|
||||
* \return Whether to use percentage values
|
||||
* \see setUsePercentage
|
||||
*/
|
||||
bool usePercentage() const;
|
||||
|
||||
/**
|
||||
* Set how many decimal digits to display when rendering the data value
|
||||
* labels. If there are no decimal digits it will not be displayed.
|
||||
* \param digits The number of decimal digits to use.
|
||||
*/
|
||||
void setDecimalDigits( int digits );
|
||||
|
||||
/**
|
||||
* \return The number of decimal digits displayed.
|
||||
*/
|
||||
int decimalDigits() const;
|
||||
|
||||
/**
|
||||
* \brief Prepend a prefix string to the data value label
|
||||
* \sa prefix
|
||||
*/
|
||||
void setPrefix( const QString prefix );
|
||||
|
||||
/**
|
||||
* \brief Returns the string used as a prefix to the data value text.
|
||||
* \sa setPrefix
|
||||
*/
|
||||
QString prefix() const;
|
||||
|
||||
/**
|
||||
* \brief Append a suffix string to the data value label
|
||||
* \sa suffix
|
||||
*/
|
||||
void setSuffix( const QString suffix );
|
||||
|
||||
/**
|
||||
* \brief Returns the string used as a suffix to the data value text.
|
||||
* \sa setSuffix
|
||||
*/
|
||||
QString suffix() const;
|
||||
|
||||
/**
|
||||
* \brief display a string label instead of the original data value label
|
||||
* Supports HTML code.
|
||||
* \sa dataLabel
|
||||
*/
|
||||
void setDataLabel( const QString label );
|
||||
|
||||
/**
|
||||
* \brief Returns the string displayed instead of the data value label
|
||||
* \sa setDataLabel
|
||||
*/
|
||||
QString dataLabel() const;
|
||||
|
||||
/**
|
||||
* \return Whether data values not different from their predecessors are drawn.
|
||||
*/
|
||||
bool showRepetitiveDataLabels() const;
|
||||
|
||||
/**
|
||||
*
|
||||
* Set whether data value labels not different from their predecessors should be drawn.
|
||||
* \param showRepetitiveDataLabels Whether data value not different from their predecessors are drawn.
|
||||
*/
|
||||
void setShowRepetitiveDataLabels( bool showRepetitiveDataLabels );
|
||||
|
||||
/**
|
||||
* \return Whether data value texts overlapping other data value texts of the same diagram are drawn.
|
||||
*/
|
||||
bool showOverlappingDataLabels() const;
|
||||
|
||||
/**
|
||||
*
|
||||
* Set whether data value texts overlapping other data value texts of the same diagram should be drawn.
|
||||
* \param showOverlappingDataLabels Whether data texts overlapping other data value texts of the same diagram are drawn.
|
||||
*/
|
||||
void setShowOverlappingDataLabels( bool showOverlappingDataLabels );
|
||||
|
||||
/**
|
||||
* \cond PLANNED_FOR_FUTURE
|
||||
*
|
||||
* These method are planned for future versions of KD Chart,
|
||||
* so they are not part of the documented API yet.
|
||||
*
|
||||
*/
|
||||
void setPowerOfTenDivisor( int powerOfTenDivisor );
|
||||
int powerOfTenDivisor() const;
|
||||
/**
|
||||
* \endcond
|
||||
*/
|
||||
|
||||
|
||||
/**
|
||||
* \cond PLANNED_FOR_FUTURE
|
||||
*
|
||||
* These method are planned for future versions of KD Chart,
|
||||
* so they are not part of the documented API yet.
|
||||
*/
|
||||
void setShowInfinite( bool infinite );
|
||||
bool showInfinite() const;
|
||||
/**
|
||||
* \endcond
|
||||
*/
|
||||
|
||||
/**
|
||||
* \brief Defines the relative positioning of the data value labels for negative values.
|
||||
*
|
||||
* The position is specified in relation to the respective data value point, or in
|
||||
* relation to the respective data representation area, that's one area segment in
|
||||
* a LineDiagram showing areas, or one bar in a BarDiagram, one pie slice ...
|
||||
*
|
||||
* See detailed description of \a KDChart::Position for an illustration of the
|
||||
* different possible reference positions.
|
||||
*
|
||||
* \sa negativePosition
|
||||
*/
|
||||
void setNegativePosition( const RelativePosition& relPosition );
|
||||
|
||||
/**
|
||||
* \brief Return the relative positioning of the data value labels
|
||||
* \sa setNegativePosition
|
||||
*/
|
||||
const RelativePosition negativePosition() const;
|
||||
|
||||
/**
|
||||
* \brief Defines the relative position of the data value labels for positive values.
|
||||
*
|
||||
* The position is specified in relation to the respective data value point, or in
|
||||
* relation to the respective data representation area, that's one area segment in
|
||||
* a LineDiagram showing areas, or one bar in a BarDiagram, one pie slice ...
|
||||
*
|
||||
* See detailed description of \a KDChart::Position for an illustration of the
|
||||
* different possible reference positions.
|
||||
*
|
||||
* \sa positivePosition
|
||||
*/
|
||||
void setPositivePosition( const RelativePosition& relPosition );
|
||||
|
||||
/**
|
||||
* \brief Return the relative positioning of the data value labels
|
||||
* \sa setPositivePosition
|
||||
*/
|
||||
const RelativePosition positivePosition() const;
|
||||
|
||||
const RelativePosition position( bool positive ) const
|
||||
{
|
||||
return positive ? positivePosition() : negativePosition();
|
||||
}
|
||||
|
||||
private:
|
||||
KDCHART_DECLARE_PRIVATE_BASE_VALUE( DataValueAttributes )
|
||||
|
||||
}; // End of class DataValueAttributes
|
||||
|
||||
}
|
||||
|
||||
#if !defined(QT_NO_DEBUG_STREAM)
|
||||
KDCHART_EXPORT QDebug operator<<(QDebug, const KDChart::DataValueAttributes& );
|
||||
#endif /* QT_NO_DEBUG_STREAM */
|
||||
|
||||
KDCHART_DECLARE_SWAP_SPECIALISATION( KDChart::DataValueAttributes )
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
Q_DECLARE_TYPEINFO( KDChart::DataValueAttributes, Q_MOVABLE_TYPE );
|
||||
QT_END_NAMESPACE
|
||||
|
||||
Q_DECLARE_METATYPE( KDChart::DataValueAttributes )
|
||||
|
||||
#endif // KDCHARTDATAVALUEATTRIBUTES_H
|
|
@ -0,0 +1 @@
|
|||
#include "KDChartDatasetProxyModel.h"
|
|
@ -0,0 +1,188 @@
|
|||
/****************************************************************************
|
||||
** Copyright (C) 2001-2013 Klaralvdalens Datakonsult AB. All rights reserved.
|
||||
**
|
||||
** This file is part of the KD Chart library.
|
||||
**
|
||||
** Licensees holding valid commercial KD Chart licenses may use this file in
|
||||
** accordance with the KD Chart Commercial License Agreement provided with
|
||||
** the Software.
|
||||
**
|
||||
**
|
||||
** This file may be distributed and/or modified under the terms of the
|
||||
** GNU General Public License version 2 and version 3 as published by the
|
||||
** Free Software Foundation and appearing in the file LICENSE.GPL.txt included.
|
||||
**
|
||||
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
|
||||
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
||||
**
|
||||
** Contact info@kdab.com if any conditions of this licensing are not
|
||||
** clear to you.
|
||||
**
|
||||
**********************************************************************/
|
||||
|
||||
#ifndef KDCHARTDATASETPROXYMODEL_H
|
||||
#define KDCHARTDATASETPROXYMODEL_H
|
||||
|
||||
#include <QVector>
|
||||
#include <QSortFilterProxyModel>
|
||||
|
||||
#include "kdchart_export.h"
|
||||
|
||||
namespace KDChart {
|
||||
|
||||
class IndexOutOfBoundsException;
|
||||
|
||||
typedef QVector<int> DatasetDescriptionVector;
|
||||
|
||||
/** DatasetProxyModel takes a KDChart dataset configuration and translates
|
||||
it into a filtering proxy model.
|
||||
|
||||
The resulting model will only contain the part of the model that is
|
||||
selected by the dataset, and the according row and column header
|
||||
data.
|
||||
|
||||
Currently, this model is implemented for table models only. The way it
|
||||
would work with models representing a tree is to be decided.
|
||||
|
||||
The column selection is configured by passing a dataset description
|
||||
vector to the model. This vector (of integers) is supposed to have one
|
||||
value for each column of the original model. If the value at position
|
||||
x is -1, column x of the original model is not included in the
|
||||
dataset. If it is between 0 and (columnCount() -1), it is the column
|
||||
the source column is mapped to in the resulting model. Any other value
|
||||
is an error.
|
||||
*/
|
||||
class KDCHART_EXPORT DatasetProxyModel : public QSortFilterProxyModel
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
/** Create a DatasetProxyModel.
|
||||
Without further configuration, this model is invalid.
|
||||
@see setDatasetDescriptionVector
|
||||
*/
|
||||
explicit DatasetProxyModel ( QObject* parent = 0 );
|
||||
|
||||
QModelIndex buddy( const QModelIndex& index ) const;
|
||||
|
||||
Qt::ItemFlags flags( const QModelIndex& index ) const;
|
||||
|
||||
QModelIndex index( int row, int column,
|
||||
const QModelIndex &parent = QModelIndex() ) const;
|
||||
QModelIndex parent(const QModelIndex &child ) const;
|
||||
|
||||
/** Implements the mapping from the source to the proxy indexes. */
|
||||
QModelIndex mapFromSource ( const QModelIndex & sourceIndex ) const;
|
||||
|
||||
/** Implements the mapping from the proxy to the source indexes. */
|
||||
QModelIndex mapToSource ( const QModelIndex& proxyIndex ) const;
|
||||
|
||||
/** Overloaded from base class. */
|
||||
QVariant data(const QModelIndex &index, int role) const;
|
||||
|
||||
/** Overloaded from base class. */
|
||||
bool setData( const QModelIndex& index, const QVariant& value, int role );
|
||||
|
||||
/** Overloaded from base class. */
|
||||
QVariant headerData ( int section, Qt::Orientation orientation, int role = Qt::DisplayRole ) const;
|
||||
|
||||
/** Overloaded from base class. */
|
||||
void setSourceModel(QAbstractItemModel *sourceModel);
|
||||
|
||||
/** Set the root index of the table in
|
||||
the source model */
|
||||
void setSourceRootIndex(const QModelIndex& rootIdx);
|
||||
|
||||
|
||||
public Q_SLOTS:
|
||||
/** Reset all dataset description.
|
||||
After that, the result of the proxying is an empty model (a new
|
||||
dataset description needs to be set to achieve a non-empty result).
|
||||
*/
|
||||
void resetDatasetDescriptions();
|
||||
|
||||
/** Configure the dataset selection for the columns.
|
||||
Every call to this method resets the previous dataset
|
||||
description.
|
||||
*/
|
||||
void setDatasetColumnDescriptionVector ( const DatasetDescriptionVector& columnConfig );
|
||||
|
||||
/** Configure the dataset selection for the rows.
|
||||
Every call to this method resets the previous dataset
|
||||
description.
|
||||
*/
|
||||
void setDatasetRowDescriptionVector ( const DatasetDescriptionVector& rowConfig );
|
||||
|
||||
/** Convenience method to configure rows and columns in one step. */
|
||||
void setDatasetDescriptionVectors (
|
||||
const DatasetDescriptionVector& rowConfig,
|
||||
const DatasetDescriptionVector& columnConfig );
|
||||
|
||||
// FIXME: add convenience methods to configure common dataset
|
||||
// selections (like rectangular areas etc)
|
||||
|
||||
protected:
|
||||
/** Decide whether the column is accepted. */
|
||||
bool filterAcceptsColumn ( int sourceColumn,
|
||||
const QModelIndex & ) const;
|
||||
|
||||
|
||||
/** Decide whether the row is accepted. */
|
||||
bool filterAcceptsRow ( int source_row, const QModelIndex & source_parent ) const;
|
||||
|
||||
private:
|
||||
|
||||
/** Map a proxy column to a source column. */
|
||||
int mapProxyColumnToSource ( const int& proxyColumn ) const;
|
||||
|
||||
/** Map a source column to a proxy column. */
|
||||
int mapSourceColumnToProxy ( const int& sourceColumn ) const;
|
||||
|
||||
/** Map a proxy row to a source row. */
|
||||
int mapProxyRowToSource ( const int& proxyRow ) const;
|
||||
|
||||
/** Map a source row to a proxy row. */
|
||||
int mapSourceRowToProxy ( const int& sourceRow ) const;
|
||||
|
||||
/** Initialize the transformation vectors from the dataset
|
||||
description.
|
||||
|
||||
The input parameter "Configuration" is a vector that specifies
|
||||
what srce column will be mapped to what proxy column. Example:
|
||||
|
||||
position: [0][1][2]
|
||||
value: [2][0][1]
|
||||
|
||||
This will map the source column 2 to proxy column 0, source 0 to
|
||||
proxy 1, and source 1 to proxy 2. Source needs to have at least 2
|
||||
column. The source-to-proxy mapping looks the same, except that it
|
||||
may contain values of -1, which means this column is not part of
|
||||
the resulting model. The values in the configuration vector must
|
||||
be unique (otherwise, a 1-to-1 mapping in both directions is
|
||||
impossible).
|
||||
|
||||
sourceCount is the number of columns in the source model. The proxy-to-source map has
|
||||
as many elements as the proxy has columns, the source-to-proxy map
|
||||
has as many elements as the source has columns. Same goes for rows
|
||||
(the mapping logic is the same).
|
||||
|
||||
*/
|
||||
void initializeDatasetDecriptors (
|
||||
const DatasetDescriptionVector& inConfiguration,
|
||||
int sourceCount,
|
||||
DatasetDescriptionVector& outSourceToProxyMap,
|
||||
DatasetDescriptionVector& outProxyToSourceMap );
|
||||
|
||||
DatasetDescriptionVector mColSrcToProxyMap;
|
||||
DatasetDescriptionVector mColProxyToSrcMap;
|
||||
DatasetDescriptionVector mRowSrcToProxyMap;
|
||||
DatasetDescriptionVector mRowProxyToSrcMap;
|
||||
|
||||
int mProxyRowCount;
|
||||
int mProxyColumnCount;
|
||||
QModelIndex mRootIndex;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
|
||||
#endif
|
|
@ -0,0 +1,87 @@
|
|||
/****************************************************************************
|
||||
** Copyright (C) 2001-2013 Klaralvdalens Datakonsult AB. All rights reserved.
|
||||
**
|
||||
** This file is part of the KD Chart library.
|
||||
**
|
||||
** Licensees holding valid commercial KD Chart licenses may use this file in
|
||||
** accordance with the KD Chart Commercial License Agreement provided with
|
||||
** the Software.
|
||||
**
|
||||
**
|
||||
** This file may be distributed and/or modified under the terms of the
|
||||
** GNU General Public License version 2 and version 3 as published by the
|
||||
** Free Software Foundation and appearing in the file LICENSE.GPL.txt included.
|
||||
**
|
||||
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
|
||||
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
||||
**
|
||||
** Contact info@kdab.com if any conditions of this licensing are not
|
||||
** clear to you.
|
||||
**
|
||||
**********************************************************************/
|
||||
|
||||
#ifndef KDCHARTDATASETSELECTOR_H
|
||||
#define KDCHARTDATASETSELECTOR_H
|
||||
|
||||
#include <QFrame>
|
||||
|
||||
#include "KDChartDatasetProxyModel.h"
|
||||
|
||||
|
||||
/**
|
||||
* \cond PRIVATE_API_DOCU
|
||||
*
|
||||
* ( This class is used internally by DatasetSelectorWidget. )
|
||||
*/
|
||||
QT_BEGIN_NAMESPACE
|
||||
namespace Ui {
|
||||
class DatasetSelector;
|
||||
}
|
||||
QT_END_NAMESPACE
|
||||
/**
|
||||
* \endcond
|
||||
*/
|
||||
|
||||
namespace KDChart {
|
||||
|
||||
class KDCHART_EXPORT DatasetSelectorWidget : public QFrame
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit DatasetSelectorWidget ( QWidget* parent = 0 );
|
||||
~DatasetSelectorWidget();
|
||||
|
||||
public Q_SLOTS:
|
||||
void setSourceRowCount ( const int& rowCount );
|
||||
void setSourceColumnCount ( const int& columnCount );
|
||||
|
||||
Q_SIGNALS:
|
||||
void configureDatasetProxyModel (
|
||||
const DatasetDescriptionVector& rowConfig,
|
||||
const DatasetDescriptionVector& columnConfig );
|
||||
|
||||
void mappingDisabled ();
|
||||
|
||||
private Q_SLOTS:
|
||||
void on_sbStartColumn_valueChanged ( int );
|
||||
void on_sbStartRow_valueChanged ( int );
|
||||
void on_sbColumnCount_valueChanged( int );
|
||||
void on_sbRowCount_valueChanged( int );
|
||||
void on_cbReverseRows_stateChanged ( int );
|
||||
void on_cbReverseColumns_stateChanged ( int );
|
||||
void on_groupBox_toggled ( bool );
|
||||
|
||||
|
||||
private:
|
||||
void resetDisplayValues ();
|
||||
void calculateMapping();
|
||||
|
||||
Ui::DatasetSelector* mUi;
|
||||
int mSourceRowCount;
|
||||
int mSourceColumnCount;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif
|
|
@ -0,0 +1 @@
|
|||
#include "KDChartDatasetSelector.h"
|
|
@ -0,0 +1 @@
|
|||
#include "KDChartDiagramObserver.h"
|
|
@ -0,0 +1,90 @@
|
|||
/****************************************************************************
|
||||
** Copyright (C) 2001-2013 Klaralvdalens Datakonsult AB. All rights reserved.
|
||||
**
|
||||
** This file is part of the KD Chart library.
|
||||
**
|
||||
** Licensees holding valid commercial KD Chart licenses may use this file in
|
||||
** accordance with the KD Chart Commercial License Agreement provided with
|
||||
** the Software.
|
||||
**
|
||||
**
|
||||
** This file may be distributed and/or modified under the terms of the
|
||||
** GNU General Public License version 2 and version 3 as published by the
|
||||
** Free Software Foundation and appearing in the file LICENSE.GPL.txt included.
|
||||
**
|
||||
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
|
||||
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
||||
**
|
||||
** Contact info@kdab.com if any conditions of this licensing are not
|
||||
** clear to you.
|
||||
**
|
||||
**********************************************************************/
|
||||
|
||||
#ifndef __KDCHARTDIAGRAMOBSERVER_H_
|
||||
#define __KDCHARTDIAGRAMOBSERVER_H_
|
||||
|
||||
#include "KDChartGlobal.h"
|
||||
|
||||
#include <QObject>
|
||||
#include <QPointer>
|
||||
#include <QModelIndex>
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
class QAbstractItemModel;
|
||||
QT_END_NAMESPACE
|
||||
|
||||
namespace KDChart {
|
||||
|
||||
class AbstractDiagram;
|
||||
|
||||
/**
|
||||
* \brief A DiagramObserver watches the associated diagram for
|
||||
* changes and deletion and emits corresponsing signals.
|
||||
*/
|
||||
class KDCHART_EXPORT DiagramObserver : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
/**
|
||||
* Constructs a new observer observing the given diagram.
|
||||
*/
|
||||
explicit DiagramObserver( AbstractDiagram * diagram, QObject* parent = 0 );
|
||||
~DiagramObserver();
|
||||
|
||||
const AbstractDiagram* diagram() const;
|
||||
AbstractDiagram* diagram();
|
||||
|
||||
Q_SIGNALS:
|
||||
/** This signal is emitted immediately before the diagram is
|
||||
* being destroyed. */
|
||||
void diagramDestroyed( AbstractDiagram* diagram );
|
||||
/** Emitted when a diagram is being destroyed, but before its data is invalidated **/
|
||||
void diagramAboutToBeDestroyed( AbstractDiagram* diagram );
|
||||
/** This signal is emitted whenever the data of the diagram changes. */
|
||||
void diagramDataChanged( AbstractDiagram* diagram );
|
||||
/** This signal is emitted whenever any of the data of the diagram was set (un)hidden. */
|
||||
void diagramDataHidden( AbstractDiagram* diagram );
|
||||
/** This signal is emitted whenever the attributes of the diagram change. */
|
||||
void diagramAttributesChanged( AbstractDiagram* diagram );
|
||||
|
||||
private Q_SLOTS:
|
||||
void slotDestroyed(QObject*);
|
||||
void slotAboutToBeDestroyed();
|
||||
void slotHeaderDataChanged(Qt::Orientation,int,int);
|
||||
void slotDataChanged(QModelIndex,QModelIndex);
|
||||
void slotDataChanged();
|
||||
void slotDataHidden();
|
||||
void slotAttributesChanged();
|
||||
void slotAttributesChanged(QModelIndex,QModelIndex);
|
||||
void slotModelsChanged();
|
||||
|
||||
private:
|
||||
void init();
|
||||
|
||||
AbstractDiagram* m_diagram;
|
||||
QPointer<QAbstractItemModel> m_model;
|
||||
QPointer<QAbstractItemModel> m_attributesmodel;
|
||||
};
|
||||
}
|
||||
|
||||
#endif // KDChartDiagramObserver_H
|
1
massif-visualizer/kdchart/include/KDChart/KDChartEnums
Normal file
1
massif-visualizer/kdchart/include/KDChart/KDChartEnums
Normal file
|
@ -0,0 +1 @@
|
|||
#include "KDChartEnums.h"
|
346
massif-visualizer/kdchart/include/KDChart/KDChartEnums.h
Normal file
346
massif-visualizer/kdchart/include/KDChart/KDChartEnums.h
Normal file
|
@ -0,0 +1,346 @@
|
|||
/****************************************************************************
|
||||
** Copyright (C) 2001-2013 Klaralvdalens Datakonsult AB. All rights reserved.
|
||||
**
|
||||
** This file is part of the KD Chart library.
|
||||
**
|
||||
** Licensees holding valid commercial KD Chart licenses may use this file in
|
||||
** accordance with the KD Chart Commercial License Agreement provided with
|
||||
** the Software.
|
||||
**
|
||||
**
|
||||
** This file may be distributed and/or modified under the terms of the
|
||||
** GNU General Public License version 2 and version 3 as published by the
|
||||
** Free Software Foundation and appearing in the file LICENSE.GPL.txt included.
|
||||
**
|
||||
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
|
||||
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
||||
**
|
||||
** Contact info@kdab.com if any conditions of this licensing are not
|
||||
** clear to you.
|
||||
**
|
||||
**********************************************************************/
|
||||
|
||||
#ifndef __KDCHARTENUMS_H__
|
||||
#define __KDCHARTENUMS_H__
|
||||
|
||||
#include "KDChartGlobal.h"
|
||||
|
||||
#include <QRectF>
|
||||
#include <QObject>
|
||||
#include <QVector>
|
||||
|
||||
/** \file KDChartEnums.h
|
||||
\brief Definition of global enums.
|
||||
*/
|
||||
|
||||
/**
|
||||
Project global class providing some enums needed both by KDChartParams
|
||||
and by KDChartCustomBox.
|
||||
*/
|
||||
class KDCHART_EXPORT KDChartEnums :public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
Q_ENUMS( TextLayoutPolicy )
|
||||
Q_ENUMS( AreaName )
|
||||
Q_ENUMS( PositionFlag )
|
||||
|
||||
public:
|
||||
/**
|
||||
GranularitySequence specifies the values, that may be applied,
|
||||
to determine a step width within a given data range.
|
||||
|
||||
\note Granularity with can be set for Linear axis calculation mode only,
|
||||
there is no way to specify a step width for Logarithmic axes.
|
||||
|
||||
Value occurring in the GranularitySequence names only are showing
|
||||
their respective relation ship. For real data they will most times not
|
||||
be used directly, but be multiplied by positive (or negative, resp.)
|
||||
powers of ten.
|
||||
|
||||
A granularity sequence is a sequence of values from the following set:
|
||||
1, 1.25, 2, 2.5, 5.
|
||||
|
||||
The reason for using one of the following three pre-defined granularity
|
||||
sequences (instead of just using the best matching step width) is to
|
||||
follow a simple rule: If scaling becomes finer (== smaller step width)
|
||||
no value, that has been on a grid line before, shall loose its line
|
||||
and be NOT on a grid line anymore!
|
||||
|
||||
This means: Smaller step width may not remove any grid lines, but it
|
||||
may add additional lines in between.
|
||||
|
||||
\li \c GranularitySequence_10_20 Step widths can be 1, or 2, but they never can be 2.5 nor 5, nor 1.25.
|
||||
\li \c GranularitySequence_10_50 Step widths can be 1, or 5, but they never can be 2, nor 2.5, nor 1.25.
|
||||
\li \c GranularitySequence_25_50 Step widths can be 2.5, or 5, but they never can be 1, nor 2, nor 1.25.
|
||||
\li \c GranularitySequence_125_25 Step widths can be 1.25 or 2.5 but they never can be 1, nor 2, nor 5.
|
||||
\li \c GranularitySequenceIrregular Step widths can be all of these values: 1, or 1.25, or 2, or 2.5, or 5.
|
||||
|
||||
\note When ever possible, try to avoid using GranularitySequenceIrregular!
|
||||
Allowing all possible step values, using this granularity sequence involves a
|
||||
serious risk: Your users might be irritated due to 'jumping' grid lines, when step size
|
||||
is changed from 2.5 to 2 (or vice versa, resp.).
|
||||
In case you still want to use GranularitySequenceIrregular just make sure to NOT draw
|
||||
any sub-grid lines, because in most cases you will get not-matching step widths for
|
||||
the sub-grid.
|
||||
In short: GranularitySequenceIrregular can safely be used if your data range is not
|
||||
changing at all AND (b) you will not allow the coordinate plane to be zoomed
|
||||
AND (c) you are not displaying any sub-grid lines.
|
||||
|
||||
Since you probably like having the value 1 as an allowed step width,
|
||||
the granularity sequence decision boils down to a boolean question:
|
||||
\li To get ten divided by five you use GranularitySequence_10_20, while
|
||||
\li for having it divided by two GranularitySequence_10_50 is your choice.
|
||||
|
||||
*/
|
||||
enum GranularitySequence {
|
||||
GranularitySequence_10_20,
|
||||
GranularitySequence_10_50,
|
||||
GranularitySequence_25_50,
|
||||
GranularitySequence_125_25,
|
||||
GranularitySequenceIrregular };
|
||||
|
||||
/**
|
||||
Converts the specified granularity sequence enum to a
|
||||
string representation.
|
||||
|
||||
\param sequence the granularity sequence enum to convert
|
||||
\return the string representation of the granularity sequence
|
||||
*/
|
||||
static QString granularitySequenceToString( GranularitySequence sequence ) {
|
||||
switch ( sequence ) {
|
||||
case GranularitySequence_10_20:
|
||||
return QString::fromLatin1("GranularitySequence_10_20");
|
||||
case GranularitySequence_10_50:
|
||||
return QString::fromLatin1("GranularitySequence_10_50");
|
||||
case GranularitySequence_25_50:
|
||||
return QString::fromLatin1("GranularitySequence_25_50");
|
||||
case GranularitySequence_125_25:
|
||||
return QString::fromLatin1("GranularitySequence_125_25");
|
||||
case GranularitySequenceIrregular:
|
||||
return QString::fromLatin1("GranularitySequenceIrregular");
|
||||
}
|
||||
Q_ASSERT( !"Unknown GranularitySequenceValue" );
|
||||
return QString::fromLatin1("GranularitySequence_10_20");
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Converts the specified string to a granularity sequence enum value.
|
||||
|
||||
\param string the string to convert
|
||||
\return the granularity sequence enum value
|
||||
*/
|
||||
static GranularitySequence stringToGranularitySequence( const QString& string ) {
|
||||
if ( string == QString::fromLatin1("GranularitySequence_10_20") )
|
||||
return GranularitySequence_10_20;
|
||||
if ( string == QString::fromLatin1("GranularitySequence_10_50") )
|
||||
return GranularitySequence_10_50;
|
||||
if ( string == QString::fromLatin1("GranularitySequence_25_50") )
|
||||
return GranularitySequence_25_50;
|
||||
if ( string == QString::fromLatin1("GranularitySequence_125") )
|
||||
return GranularitySequence_125_25;
|
||||
if ( string == QString::fromLatin1("GranularitySequenceIrregular") )
|
||||
return GranularitySequenceIrregular;
|
||||
// default, should not happen
|
||||
return GranularitySequence_10_20;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Text layout policy: what to do if text that is to be drawn would
|
||||
cover neighboring text or neighboring areas.
|
||||
|
||||
\li \c LayoutJustOverwrite Just ignore the layout collision and write the text nevertheless.
|
||||
\li \c LayoutPolicyRotate Try counter-clockwise rotation to make the text fit into the space.
|
||||
\li \c LayoutPolicyShiftVertically Shift the text baseline upwards (or downwards, resp.) and draw a connector line between the text and its anchor.
|
||||
\li \c LayoutPolicyShiftHorizontally Shift the text baseline to the left (or to the right, resp.) and draw a connector line between the text and its anchor.
|
||||
\li \c LayoutPolicyShrinkFontSize Reduce the text font size.
|
||||
|
||||
\sa KDChartParams::setPrintDataValues
|
||||
*/
|
||||
enum TextLayoutPolicy { LayoutJustOverwrite,
|
||||
LayoutPolicyRotate,
|
||||
LayoutPolicyShiftVertically,
|
||||
LayoutPolicyShiftHorizontally,
|
||||
LayoutPolicyShrinkFontSize };
|
||||
|
||||
/**
|
||||
Converts the specified text layout policy enum to a
|
||||
string representation.
|
||||
|
||||
\param type the text layout policy to convert
|
||||
\return the string representation of the text layout policy enum
|
||||
*/
|
||||
static QString layoutPolicyToString( TextLayoutPolicy type );
|
||||
|
||||
|
||||
/**
|
||||
Converts the specified string to a text layout policy enum value.
|
||||
|
||||
\param string the string to convert
|
||||
\return the text layout policy enum value
|
||||
*/
|
||||
static TextLayoutPolicy stringToLayoutPolicy( const QString& string );
|
||||
|
||||
|
||||
/**
|
||||
Numerical values of the static KDChart::Position instances,
|
||||
for using a Position::value() with a switch () statement.
|
||||
|
||||
\sa Position
|
||||
*/
|
||||
enum PositionValue {
|
||||
PositionUnknown = 0,
|
||||
PositionCenter = 1,
|
||||
PositionNorthWest = 2,
|
||||
PositionNorth = 3,
|
||||
PositionNorthEast = 4,
|
||||
PositionEast = 5,
|
||||
PositionSouthEast = 6,
|
||||
PositionSouth = 7,
|
||||
PositionSouthWest = 8,
|
||||
PositionWest = 9,
|
||||
PositionFloating =10
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
Measure calculation mode: the way how the absolute value of a KDChart::Measure is determined during KD Chart's internal geometry calculation time.
|
||||
|
||||
KDChart::Measure values either are relative (calculated in relation to a given AbstractArea), or they are absolute (used as fixed values).
|
||||
|
||||
Values stored in relative measure always are interpreted as per-mille of a reference area's height (or width, resp.) depending on the orientation set for the KDChart::Measure.
|
||||
|
||||
\li \c MeasureCalculationModeAbsolute Value set by setValue() is absolute, to be used unchanged.
|
||||
\li \c MeasureCalculationModeRelative Value is relative, the reference area is specified by setReferenceArea(), and orientation specified by setOrientation().
|
||||
\li \c MeasureCalculationModeAuto Value is relative, KD Chart will automatically determine which reference area to use, and it will determine the orientation too.
|
||||
\li \c MeasureCalculationModeAutoArea Value is relative, Orientation is specified by setOrientation(), and KD Chart will automatically determine which reference area to use.
|
||||
\li \c MeasureCalculationModeAutoOrientation Value is relative, Area is specified by setReferenceArea(), and KD Chart will automatically determine which orientation to use.
|
||||
|
||||
\sa KDChart::Measure::setCalculationMode
|
||||
*/
|
||||
enum MeasureCalculationMode { MeasureCalculationModeAbsolute,
|
||||
MeasureCalculationModeRelative,
|
||||
MeasureCalculationModeAuto,
|
||||
MeasureCalculationModeAutoArea,
|
||||
MeasureCalculationModeAutoOrientation };
|
||||
|
||||
/**
|
||||
Converts the specified measure calculation mode enum to a
|
||||
string representation.
|
||||
|
||||
\param mode the measure calculation mode to convert
|
||||
\return the string representation of the Measure calculation mode enum
|
||||
*/
|
||||
static QString measureCalculationModeToString( MeasureCalculationMode mode ) {
|
||||
switch ( mode ) {
|
||||
case MeasureCalculationModeAbsolute:
|
||||
return QString::fromLatin1("MeasureCalculationModeAbsolute");
|
||||
case MeasureCalculationModeAuto:
|
||||
return QString::fromLatin1("MeasureCalculationModeAuto");
|
||||
case MeasureCalculationModeAutoArea:
|
||||
return QString::fromLatin1("MeasureCalculationModeAutoArea");
|
||||
case MeasureCalculationModeAutoOrientation:
|
||||
return QString::fromLatin1("MeasureCalculationModeAutoOrientation");
|
||||
case MeasureCalculationModeRelative:
|
||||
return QString::fromLatin1("MeasureCalculationModeRelative");
|
||||
}
|
||||
Q_ASSERT( !"unhandled MeasureCalculationMode" );
|
||||
return QString::fromLatin1("MeasureCalculationModeAuto");
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Converts the specified string to a measure calculation mode enum value.
|
||||
|
||||
\param string the string to convert
|
||||
\return the measure calculation mode enum value
|
||||
*/
|
||||
static MeasureCalculationMode stringToMeasureCalculationMode( const QString& string ) {
|
||||
if ( string == QString::fromLatin1("MeasureCalculationModeAbsolute") )
|
||||
return MeasureCalculationModeAbsolute;
|
||||
if ( string == QString::fromLatin1("MeasureCalculationModeAuto") )
|
||||
return MeasureCalculationModeAuto;
|
||||
if ( string == QString::fromLatin1("MeasureCalculationModeAutoArea") )
|
||||
return MeasureCalculationModeAutoArea;
|
||||
if ( string == QString::fromLatin1("MeasureCalculationModeAutoOrientation") )
|
||||
return MeasureCalculationModeAutoOrientation;
|
||||
if ( string == QString::fromLatin1("MeasureCalculationModeRelative") )
|
||||
return MeasureCalculationModeRelative;
|
||||
// default, should not happen
|
||||
return MeasureCalculationModeAuto;
|
||||
}
|
||||
|
||||
/**
|
||||
Measure orientation mode: the way how the absolute value of a KDChart::Measure is determined during KD Chart's internal geometry calculation time.
|
||||
|
||||
KDChart::Measure values either are relative (calculated in relation to a given AbstractArea), or they are absolute (used as fixed values).
|
||||
|
||||
Values stored in relative measure take into account the width (and/or the height, resp.) of a so-called reference area,
|
||||
that is either specified by KDChart::Measure::setReferenceArea, or determined by KD Chart automatically, respectively.
|
||||
|
||||
\li \c MeasureOrientationAuto Value is calculated, based upon the width (or on the height, resp.) of the reference area: KD Chart will automatically determie an appropriate way.
|
||||
\li \c MeasureOrientationHorizontal Value is calculated, based upon the width of the reference area.
|
||||
\li \c MeasureOrientationVertical Value is calculated, based upon the height of the reference area.
|
||||
\li \c MeasureOrientationMinimum Value is calculated, based upon the width (or on the height, resp.) of the reference area - which ever is smaller.
|
||||
\li \c MeasureOrientationMaximum Value is calculated, based upon the width (or on the height, resp.) of the reference area - which ever is smaller.
|
||||
|
||||
\sa KDChart::Measure::setOrientationMode
|
||||
*/
|
||||
enum MeasureOrientation { MeasureOrientationAuto,
|
||||
MeasureOrientationHorizontal,
|
||||
MeasureOrientationVertical,
|
||||
MeasureOrientationMinimum,
|
||||
MeasureOrientationMaximum };
|
||||
|
||||
/**
|
||||
Converts the specified measure orientation enum to a
|
||||
string representation.
|
||||
|
||||
\param mode the measure orientation to convert
|
||||
\return the string representation of the measure orientation enum
|
||||
*/
|
||||
static QString measureOrientationToString( MeasureOrientation mode ) {
|
||||
switch ( mode ) {
|
||||
case MeasureOrientationAuto:
|
||||
return QString::fromLatin1("MeasureOrientationAuto");
|
||||
case MeasureOrientationHorizontal:
|
||||
return QString::fromLatin1("MeasureOrientationHorizontal");
|
||||
case MeasureOrientationVertical:
|
||||
return QString::fromLatin1("MeasureOrientationVertical");
|
||||
case MeasureOrientationMinimum:
|
||||
return QString::fromLatin1("MeasureOrientationMinimum");
|
||||
case MeasureOrientationMaximum:
|
||||
return QString::fromLatin1("MeasureOrientationMaximum");
|
||||
}
|
||||
Q_ASSERT( !"Unknown MeasureOrientation value" );
|
||||
return QString::fromLatin1("MeasureOrientationAuto");
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Converts the specified string to a measure orientation enum value.
|
||||
|
||||
\param string the string to convert
|
||||
\return the measure orientation enum value
|
||||
*/
|
||||
static MeasureOrientation stringToMeasureOrientation( const QString& string ) {
|
||||
if ( string == QString::fromLatin1("MeasureOrientationAuto") )
|
||||
return MeasureOrientationAuto;
|
||||
if ( string == QString::fromLatin1("MeasureOrientationHorizontal") )
|
||||
return MeasureOrientationHorizontal;
|
||||
if ( string == QString::fromLatin1("MeasureOrientationVertical") )
|
||||
return MeasureOrientationVertical;
|
||||
if ( string == QString::fromLatin1("MeasureOrientationMinimum") )
|
||||
return MeasureOrientationMinimum;
|
||||
if ( string == QString::fromLatin1("MeasureOrientationMaximum") )
|
||||
return MeasureOrientationMaximum;
|
||||
// default, should not happen
|
||||
return MeasureOrientationAuto;
|
||||
}
|
||||
|
||||
|
||||
};
|
||||
|
||||
|
||||
#endif
|
|
@ -0,0 +1 @@
|
|||
#include "KDChartFrameAttributes.h"
|
|
@ -0,0 +1,79 @@
|
|||
/****************************************************************************
|
||||
** Copyright (C) 2001-2013 Klaralvdalens Datakonsult AB. All rights reserved.
|
||||
**
|
||||
** This file is part of the KD Chart library.
|
||||
**
|
||||
** Licensees holding valid commercial KD Chart licenses may use this file in
|
||||
** accordance with the KD Chart Commercial License Agreement provided with
|
||||
** the Software.
|
||||
**
|
||||
**
|
||||
** This file may be distributed and/or modified under the terms of the
|
||||
** GNU General Public License version 2 and version 3 as published by the
|
||||
** Free Software Foundation and appearing in the file LICENSE.GPL.txt included.
|
||||
**
|
||||
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
|
||||
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
||||
**
|
||||
** Contact info@kdab.com if any conditions of this licensing are not
|
||||
** clear to you.
|
||||
**
|
||||
**********************************************************************/
|
||||
|
||||
#ifndef KDCHARTFRAMEATTRIBUTES_H
|
||||
#define KDCHARTFRAMEATTRIBUTES_H
|
||||
|
||||
#include <QDebug>
|
||||
#include <QMetaType>
|
||||
#include <QPen>
|
||||
#include "KDChartGlobal.h"
|
||||
|
||||
namespace KDChart {
|
||||
|
||||
/**
|
||||
* @brief A set of attributes for frames around items
|
||||
*/
|
||||
class KDCHART_EXPORT FrameAttributes
|
||||
{
|
||||
public:
|
||||
FrameAttributes();
|
||||
FrameAttributes( const FrameAttributes& );
|
||||
FrameAttributes &operator= ( const FrameAttributes& );
|
||||
|
||||
~FrameAttributes();
|
||||
|
||||
void setVisible( bool visible );
|
||||
bool isVisible() const;
|
||||
|
||||
void setPen( const QPen & pen );
|
||||
QPen pen() const;
|
||||
|
||||
void setCornerRadius( qreal radius );
|
||||
qreal cornerRadius() const;
|
||||
|
||||
void setPadding( int padding );
|
||||
int padding() const;
|
||||
|
||||
bool operator==( const FrameAttributes& ) const;
|
||||
inline bool operator!=( const FrameAttributes& other ) const { return !operator==(other); }
|
||||
|
||||
private:
|
||||
|
||||
KDCHART_DECLARE_PRIVATE_BASE_VALUE( FrameAttributes )
|
||||
}; // End of class FrameAttributes
|
||||
|
||||
}
|
||||
|
||||
#if !defined(QT_NO_DEBUG_STREAM)
|
||||
KDCHART_EXPORT QDebug operator<<(QDebug, const KDChart::FrameAttributes& );
|
||||
#endif /* QT_NO_DEBUG_STREAM */
|
||||
|
||||
KDCHART_DECLARE_SWAP_SPECIALISATION( KDChart::FrameAttributes )
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
Q_DECLARE_TYPEINFO( KDChart::FrameAttributes, Q_MOVABLE_TYPE );
|
||||
QT_END_NAMESPACE
|
||||
|
||||
Q_DECLARE_METATYPE( KDChart::FrameAttributes )
|
||||
|
||||
#endif // KDCHARTFRAMEATTRIBUTES_H
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Reference in a new issue