Commit b15d6567 authored by twanvl's avatar twanvl

Added toolbar and menu for switching between graph layouts

parent 0790ec8b
...@@ -61,6 +61,13 @@ menu: ...@@ -61,6 +61,13 @@ menu:
reminder text: &Reminder Text Ctrl+R reminder text: &Reminder Text Ctrl+R
insert symbol: I&nsert Symbol insert symbol: I&nsert Symbol
graph: &Graph
pie: &Pie 1
bar: &Bar 2
stack: &Stacked Bars 3
scatter: S&catter Plot 4
scatter pie: Sc&atter-Pie 5
window: &Window window: &Window
new window: &New Window new window: &New Window
cards tab: &Cards F5 cards tab: &Cards F5
...@@ -161,6 +168,13 @@ help: ...@@ -161,6 +168,13 @@ help:
symbols: Draws the selected text with symbols symbols: Draws the selected text with symbols
reminder text: Show reminder text for the selected keyword reminder text: Show reminder text for the selected keyword
graph:
pie: A pie graph, the radius of the slice indicates the number of cards
bar: A bar graph, the height of the bar indicates the number of cards
stack: A bar graph with stacked bars
scatter: A scatter plot, the size indicates the number of cards
scatter pie: A scatter plot where each item is a small pie graph
window: window:
new window: Creates another window to edit the same set new window: Creates another window to edit the same set
cards tab: Edit the cards in the set cards tab: Edit the cards in the set
...@@ -327,6 +341,12 @@ tooltip: ...@@ -327,6 +341,12 @@ tooltip:
symbols: Symbols symbols: Symbols
reminder text: Reminder Text reminder text: Reminder Text
pie: Pie Graph
bar: Bar Graph
stack: Stacked Bar Graph
scatter: Scatter Plot
scatter pie: Scatter-Pie plot
cards tab: cards tab:
set info tab: Set Information set info tab: Set Information
style tab: Card Style style tab: Card Style
......
...@@ -15,12 +15,22 @@ ...@@ -15,12 +15,22 @@
/// Types of graphs /// Types of graphs
enum GraphType enum GraphType
{ GRAPH_TYPE_BAR { GRAPH_TYPE_PIE
, GRAPH_TYPE_PIE , GRAPH_TYPE_BAR
, GRAPH_TYPE_STACK , GRAPH_TYPE_STACK
, GRAPH_TYPE_SCATTER , GRAPH_TYPE_SCATTER
, GRAPH_TYPE_SCATTER_PIE , GRAPH_TYPE_SCATTER_PIE
}; };
/// Dimensions for each graph type
inline size_t dimensionality(GraphType type) {
if (type == GRAPH_TYPE_PIE) return 1;
if (type == GRAPH_TYPE_BAR) return 1;
if (type == GRAPH_TYPE_STACK) return 2;
if (type == GRAPH_TYPE_SCATTER) return 2;
if (type == GRAPH_TYPE_SCATTER_PIE) return 3;
else return 0;
}
// ----------------------------------------------------------------------------- : EOF // ----------------------------------------------------------------------------- : EOF
#endif #endif
...@@ -802,8 +802,8 @@ GraphControl::GraphControl(Window* parent, int id) ...@@ -802,8 +802,8 @@ GraphControl::GraphControl(Window* parent, int id)
: wxControl(parent, id, wxDefaultPosition, wxDefaultSize, wxWANTS_CHARS) : wxControl(parent, id, wxDefaultPosition, wxDefaultSize, wxWANTS_CHARS)
{} {}
void GraphControl::setLayout(GraphType type) { void GraphControl::setLayout(GraphType type, bool force) {
if (graph && type == layout) return; if (!force && graph && type == layout) return;
GraphDataP data = graph ? graph->getData() : GraphDataP(); GraphDataP data = graph ? graph->getData() : GraphDataP();
switch (type) { switch (type) {
case GRAPH_TYPE_BAR: { case GRAPH_TYPE_BAR: {
...@@ -815,7 +815,8 @@ void GraphControl::setLayout(GraphType type) { ...@@ -815,7 +815,8 @@ void GraphControl::setLayout(GraphType type) {
break; break;
} case GRAPH_TYPE_PIE: { } case GRAPH_TYPE_PIE: {
intrusive_ptr<GraphContainer> combined(new GraphContainer()); intrusive_ptr<GraphContainer> combined(new GraphContainer());
combined->add(new_intrusive1<PieGraph>(0)); combined->add(new_intrusive5<GraphWithMargins>(new_intrusive1<PieGraph>(0), 0,0,120,0));
combined->add(new_intrusive3<GraphLegend>(0, ALIGN_TOP_RIGHT, true));
graph = new_intrusive5<GraphWithMargins>(combined, 20,20,20,20); graph = new_intrusive5<GraphWithMargins>(combined, 20,20,20,20);
break; break;
} case GRAPH_TYPE_STACK: { } case GRAPH_TYPE_STACK: {
...@@ -847,6 +848,10 @@ void GraphControl::setLayout(GraphType type) { ...@@ -847,6 +848,10 @@ void GraphControl::setLayout(GraphType type) {
layout = type; layout = type;
} }
GraphType GraphControl::getLayout() const {
return layout;
}
void GraphControl::setData(const GraphDataPre& data) { void GraphControl::setData(const GraphDataPre& data) {
setData(new_intrusive1<GraphData>(data)); setData(new_intrusive1<GraphData>(data));
} }
...@@ -858,6 +863,11 @@ void GraphControl::setData(const GraphDataP& data) { ...@@ -858,6 +863,11 @@ void GraphControl::setData(const GraphDataP& data) {
Refresh(false); Refresh(false);
} }
size_t GraphControl::getDimensionality() const {
if (graph) return graph->getData()->axes.size();
else return 0;
}
void GraphControl::onPaint(wxPaintEvent&) { void GraphControl::onPaint(wxPaintEvent&) {
wxBufferedPaintDC dc(this); wxBufferedPaintDC dc(this);
wxSize cs = GetClientSize(); wxSize cs = GetClientSize();
......
...@@ -305,7 +305,7 @@ class GraphControl : public wxControl { ...@@ -305,7 +305,7 @@ class GraphControl : public wxControl {
GraphControl(Window* parent, int id); GraphControl(Window* parent, int id);
/// Set the type of graph used, from a number of predefined choices /// Set the type of graph used, from a number of predefined choices
void setLayout(GraphType type); void setLayout(GraphType type, bool force_refresh = false);
/// Update the data in the graph /// Update the data in the graph
void setData(const GraphDataPre& data); void setData(const GraphDataPre& data);
/// Update the data in the graph /// Update the data in the graph
...@@ -316,6 +316,11 @@ class GraphControl : public wxControl { ...@@ -316,6 +316,11 @@ class GraphControl : public wxControl {
/// Get the current item along the given axis /// Get the current item along the given axis
String getSelection(size_t axis) const; String getSelection(size_t axis) const;
/// Get the current layout
GraphType getLayout() const;
/// Get the current dimensionality
size_t getDimensionality() const;
private: private:
/// Graph object /// Graph object
GraphP graph; GraphP graph;
......
...@@ -11,6 +11,8 @@ ...@@ -11,6 +11,8 @@
#include <gui/control/graph.hpp> #include <gui/control/graph.hpp>
#include <gui/control/gallery_list.hpp> #include <gui/control/gallery_list.hpp>
#include <gui/control/filtered_card_list.hpp> #include <gui/control/filtered_card_list.hpp>
#include <gui/icon_menu.hpp>
#include <gui/util.hpp>
#include <data/game.hpp> #include <data/game.hpp>
#include <data/statistics.hpp> #include <data/statistics.hpp>
#include <util/window_id.hpp> #include <util/window_id.hpp>
...@@ -26,7 +28,7 @@ typedef pair<StatsDimensionP,String> pair_StatsDimensionP_String; ...@@ -26,7 +28,7 @@ typedef pair<StatsDimensionP,String> pair_StatsDimensionP_String;
DECLARE_TYPEOF_COLLECTION(pair_StatsDimensionP_String); DECLARE_TYPEOF_COLLECTION(pair_StatsDimensionP_String);
// Pick the style here: // Pick the style here:
#define USE_DIMENSION_LISTS 0 #define USE_DIMENSION_LISTS 1
// ----------------------------------------------------------------------------- : StatCategoryList // ----------------------------------------------------------------------------- : StatCategoryList
...@@ -218,6 +220,18 @@ StatsPanel::StatsPanel(Window* parent, int id) ...@@ -218,6 +220,18 @@ StatsPanel::StatsPanel(Window* parent, int id)
s->Add(splitter, 1, wxEXPAND); s->Add(splitter, 1, wxEXPAND);
s->SetSizeHints(this); s->SetSizeHints(this);
SetSizer(s); SetSizer(s);
// init menu
menuGraph = new IconMenu();
menuGraph->Append(ID_GRAPH_PIE, _("graph_pie"), _MENU_("pie"), _HELP_("pie"), wxITEM_CHECK);
menuGraph->Append(ID_GRAPH_BAR, _("graph_bar"), _MENU_("bar"), _HELP_("bar"), wxITEM_CHECK);
menuGraph->Append(ID_GRAPH_STACK, _("graph_stack"), _MENU_("stack"), _HELP_("stack"), wxITEM_CHECK);
menuGraph->Append(ID_GRAPH_SCATTER, _("graph_scatter"), _MENU_("scatter"), _HELP_("scatter"), wxITEM_CHECK);
menuGraph->Append(ID_GRAPH_SCATTER_PIE, _("graph_scatter_pie"), _MENU_("scatter pie"), _HELP_("scatter pie"), wxITEM_CHECK);
}
StatsPanel::~StatsPanel() {
delete menuGraph;
} }
void StatsPanel::onChangeSet() { void StatsPanel::onChangeSet() {
...@@ -234,12 +248,44 @@ void StatsPanel::onAction(const Action&, bool undone) { ...@@ -234,12 +248,44 @@ void StatsPanel::onAction(const Action&, bool undone) {
onChange(); onChange();
} }
void StatsPanel::initUI (wxToolBar*, wxMenuBar*) { void StatsPanel::initUI (wxToolBar* tb, wxMenuBar* mb) {
active = true; active = true;
if (!up_to_date) showCategory(); if (!up_to_date) showCategory();
// Toolbar
#if USE_DIMENSION_LISTS
tb->AddTool(ID_GRAPH_PIE, _(""), load_resource_tool_image(_("graph_pie")), wxNullBitmap, wxITEM_CHECK, _TOOLTIP_("pie"), _HELP_("pie"));
tb->AddTool(ID_GRAPH_BAR, _(""), load_resource_tool_image(_("graph_bar")), wxNullBitmap, wxITEM_CHECK, _TOOLTIP_("bar"), _HELP_("bar"));
tb->AddTool(ID_GRAPH_STACK, _(""), load_resource_tool_image(_("graph_stack")), wxNullBitmap, wxITEM_CHECK, _TOOLTIP_("stack"), _HELP_("stack"));
tb->AddTool(ID_GRAPH_SCATTER, _(""), load_resource_tool_image(_("graph_scatter")), wxNullBitmap, wxITEM_CHECK, _TOOLTIP_("scatter"), _HELP_("scatter"));
tb->AddTool(ID_GRAPH_SCATTER_PIE, _(""), load_resource_tool_image(_("graph_scatter_pie")), wxNullBitmap, wxITEM_CHECK, _TOOLTIP_("scatter pie"), _HELP_("scatter pie"));
tb->Realize();
// Menu
mb->Insert(2, menuGraph, _MENU_("graph"));
#endif
} }
void StatsPanel::destroyUI(wxToolBar*, wxMenuBar*) { void StatsPanel::destroyUI(wxToolBar* tb, wxMenuBar* mb) {
active = false; active = false;
#if USE_DIMENSION_LISTS
// Toolbar
tb->DeleteTool(ID_GRAPH_PIE);
tb->DeleteTool(ID_GRAPH_BAR);
tb->DeleteTool(ID_GRAPH_STACK);
tb->DeleteTool(ID_GRAPH_SCATTER);
tb->DeleteTool(ID_GRAPH_SCATTER_PIE);
// Menus
mb->Remove(2);
#endif
}
void StatsPanel::onUpdateUI(wxUpdateUIEvent& ev) {
switch (ev.GetId()) {
case ID_GRAPH_PIE: case ID_GRAPH_BAR: case ID_GRAPH_STACK: case ID_GRAPH_SCATTER: case ID_GRAPH_SCATTER_PIE: {
GraphType type = (GraphType)(ev.GetId() - ID_GRAPH_PIE);
ev.Check(graph->getLayout() == type);
ev.Enable(graph->getDimensionality() == dimensionality(type));
break;
}
}
} }
void StatsPanel::onCommand(int id) { void StatsPanel::onCommand(int id) {
...@@ -248,6 +294,12 @@ void StatsPanel::onCommand(int id) { ...@@ -248,6 +294,12 @@ void StatsPanel::onCommand(int id) {
onChange(); onChange();
break; break;
} }
case ID_GRAPH_PIE: case ID_GRAPH_BAR: case ID_GRAPH_STACK: case ID_GRAPH_SCATTER: case ID_GRAPH_SCATTER_PIE: {
GraphType type = (GraphType)(id - ID_GRAPH_PIE);
graph->setLayout(type);
graph->Refresh(false);
break;
}
} }
} }
...@@ -330,9 +382,14 @@ void StatsPanel::showCategory() { ...@@ -330,9 +382,14 @@ void StatsPanel::showCategory() {
if (dim->split_list) d.splitList(dim_id); if (dim->split_list) d.splitList(dim_id);
++dim_id; ++dim_id;
} }
graph->setLayout(dims.size() == 1 ? GRAPH_TYPE_BAR GraphType layout = graph->getLayout();
:dims.size() == 2 ? GRAPH_TYPE_STACK if (dimensionality(layout) != dims.size()) {
: GRAPH_TYPE_SCATTER_PIE); // we must switch to another layout
layout = dims.size() == 1 ? GRAPH_TYPE_BAR
: dims.size() == 2 ? GRAPH_TYPE_STACK
: GRAPH_TYPE_SCATTER_PIE;
}
graph->setLayout(layout, true);
graph->setData(d); graph->setData(d);
filterCards(); filterCards();
#else #else
...@@ -376,7 +433,7 @@ void StatsPanel::showCategory() { ...@@ -376,7 +433,7 @@ void StatsPanel::showCategory() {
++dim_id; ++dim_id;
} }
graph->setLayout(cat.type); graph->setLayout(cat.type);
graph->setData(d); graph->setData(d, true);
filterCards(); filterCards();
} }
#endif #endif
......
...@@ -16,6 +16,7 @@ class StatCategoryList; ...@@ -16,6 +16,7 @@ class StatCategoryList;
class StatDimensionList; class StatDimensionList;
class GraphControl; class GraphControl;
class FilteredCardList; class FilteredCardList;
class IconMenu;
// ----------------------------------------------------------------------------- : StatsPanel // ----------------------------------------------------------------------------- : StatsPanel
...@@ -23,6 +24,7 @@ class FilteredCardList; ...@@ -23,6 +24,7 @@ class FilteredCardList;
class StatsPanel : public SetWindowPanel { class StatsPanel : public SetWindowPanel {
public: public:
StatsPanel(Window* parent, int id); StatsPanel(Window* parent, int id);
~StatsPanel();
// --------------------------------------------------- : UI // --------------------------------------------------- : UI
...@@ -31,6 +33,7 @@ class StatsPanel : public SetWindowPanel { ...@@ -31,6 +33,7 @@ class StatsPanel : public SetWindowPanel {
virtual void initUI (wxToolBar*, wxMenuBar*); virtual void initUI (wxToolBar*, wxMenuBar*);
virtual void destroyUI(wxToolBar*, wxMenuBar*); virtual void destroyUI(wxToolBar*, wxMenuBar*);
virtual void onUpdateUI(wxUpdateUIEvent&);
virtual void onCommand(int id); virtual void onCommand(int id);
// --------------------------------------------------- : Selection // --------------------------------------------------- : Selection
...@@ -45,6 +48,7 @@ class StatsPanel : public SetWindowPanel { ...@@ -45,6 +48,7 @@ class StatsPanel : public SetWindowPanel {
StatDimensionList* dimensions[3]; StatDimensionList* dimensions[3];
GraphControl* graph; GraphControl* graph;
FilteredCardList* card_list; FilteredCardList* card_list;
IconMenu* menuGraph;
bool up_to_date; ///< Are the graph and card list up to date? bool up_to_date; ///< Are the graph and card list up to date?
bool active; ///< Is this panel selected? bool active; ///< Is this panel selected?
......
# This file contains the keys expected to be in MSE locales # This file contains the keys expected to be in MSE locales
# It was automatically generated by tools/locale/locale.pl # It was automatically generated by tools/locale/locale.pl
# Generated on Sat May 31 19:21:25 2008 # Generated on Sat May 31 21:42:09 2008
action: action:
add control point: 0 add control point: 0
...@@ -135,6 +135,7 @@ help: ...@@ -135,6 +135,7 @@ help:
add symmetry: 0 add symmetry: 0
app language: 0 app language: 0
auto replace: 0 auto replace: 0
bar: 0
basic shapes: 0 basic shapes: 0
bold: 0 bold: 0
border: 0 border: 0
...@@ -199,6 +200,7 @@ help: ...@@ -199,6 +200,7 @@ help:
paste: 0 paste: 0
paste card: 0 paste card: 0
paste keyword: 0 paste keyword: 0
pie: 0
points: 0 points: 0
polygon: 0 polygon: 0
preferences: 0 preferences: 0
...@@ -226,12 +228,15 @@ help: ...@@ -226,12 +228,15 @@ help:
save set as: 0 save set as: 0
save symbol: 0 save symbol: 0
save symbol as: 0 save symbol as: 0
scatter: 0
scatter pie: 0
select: 0 select: 0
set code: 0 set code: 0
set info tab: 0 set info tab: 0
sides: 0 sides: 0
smooth point: 0 smooth point: 0
snap: 0 snap: 0
stack: 0
star: 0 star: 0
stats tab: 0 stats tab: 0
store symbol: 0 store symbol: 0
...@@ -306,6 +311,7 @@ menu: ...@@ -306,6 +311,7 @@ menu:
add cards: 0 add cards: 0
add keyword: 0 add keyword: 0
auto replace: 0 auto replace: 0
bar: 0
basic shapes: 0 basic shapes: 0
bold: 0 bold: 0
card list columns: 0 card list columns: 0
...@@ -329,6 +335,7 @@ menu: ...@@ -329,6 +335,7 @@ menu:
find: 0 find: 0
find next: 0 find next: 0
format: 0 format: 0
graph: 0
group: 0 group: 0
help: 0 help: 0
index: 0 index: 0
...@@ -346,6 +353,7 @@ menu: ...@@ -346,6 +353,7 @@ menu:
orientation: 0 orientation: 0
paint: 0 paint: 0
paste: 0 paste: 0
pie: 0
points: 0 points: 0
preferences: 0 preferences: 0
previous card: 0 previous card: 0
...@@ -367,8 +375,11 @@ menu: ...@@ -367,8 +375,11 @@ menu:
save set as: 0 save set as: 0
save symbol: 0 save symbol: 0
save symbol as: 0 save symbol as: 0
scatter: 0
scatter pie: 0
select: 0 select: 0
set info tab: 0 set info tab: 0
stack: 0
stats tab: 0 stats tab: 0
store symbol: 0 store symbol: 0
style tab: 0 style tab: 0
...@@ -453,6 +464,7 @@ tooltip: ...@@ -453,6 +464,7 @@ tooltip:
add card: 0 add card: 0
add keyword: 0 add keyword: 0
add symmetry: 0 add symmetry: 0
bar: 0
basic shapes: 0 basic shapes: 0
bold: 0 bold: 0
border: 0 border: 0
...@@ -476,6 +488,7 @@ tooltip: ...@@ -476,6 +488,7 @@ tooltip:
overlap: 0 overlap: 0
paint: optional, 0 paint: optional, 0
paste: 0 paste: 0
pie: 0
points: 0 points: 0
polygon: 0 polygon: 0
rectangle: 0 rectangle: 0
...@@ -489,10 +502,13 @@ tooltip: ...@@ -489,10 +502,13 @@ tooltip:
rotate card: 0 rotate card: 0
rotation: 0 rotation: 0
save set: 0 save set: 0
scatter: 0
scatter pie: 0
select: 0 select: 0
set info tab: 0 set info tab: 0
smooth point: 0 smooth point: 0
snap: 0 snap: 0
stack: 0
star: 0 star: 0
stats tab: 0 stats tab: 0
store symbol: 0 store symbol: 0
......
...@@ -54,6 +54,12 @@ tool/card_rotate_270 IMAGE "tool/card_rotate_270.png" ...@@ -54,6 +54,12 @@ tool/card_rotate_270 IMAGE "tool/card_rotate_270.png"
tool/keyword_add IMAGE "tool/keyword_add.png" tool/keyword_add IMAGE "tool/keyword_add.png"
tool/keyword_del IMAGE "tool/keyword_del.png" tool/keyword_del IMAGE "tool/keyword_del.png"
tool/graph_pie IMAGE "tool/graph_pie.png"
tool/graph_bar IMAGE "tool/graph_bar.png"
tool/graph_stack IMAGE "tool/graph_stack.png"
tool/graph_scatter IMAGE "tool/graph_scatter.png"
tool/graph_scatter_pie IMAGE "tool/graph_scatter_pie.png"
tool/window_cards IMAGE "tool/window_cards.png" tool/window_cards IMAGE "tool/window_cards.png"
tool/window_set_info IMAGE "tool/window_set_info.png" tool/window_set_info IMAGE "tool/window_set_info.png"
tool/window_style IMAGE "tool/window_style.png" tool/window_style IMAGE "tool/window_style.png"
......
...@@ -119,6 +119,13 @@ enum ChildMenuID { ...@@ -119,6 +119,13 @@ enum ChildMenuID {
, ID_FORMAT_REMINDER , ID_FORMAT_REMINDER
, ID_INSERT_SYMBOL , ID_INSERT_SYMBOL
// Graph menu
, ID_GRAPH_PIE = 1301 // corresponds to GraphType
, ID_GRAPH_BAR
, ID_GRAPH_STACK
, ID_GRAPH_SCATTER
, ID_GRAPH_SCATTER_PIE
// SymbolSelectEditor toolbar/menu // SymbolSelectEditor toolbar/menu
, ID_SYMBOL_COMBINE = 2001 , ID_SYMBOL_COMBINE = 2001
, ID_SYMBOL_COMBINE_MERGE = ID_SYMBOL_COMBINE + 0 //SYMBOL_COMBINE_MERGE , ID_SYMBOL_COMBINE_MERGE = ID_SYMBOL_COMBINE + 0 //SYMBOL_COMBINE_MERGE
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment