2 Copyright (C) 2000-2007 Paul Davis
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 2 of the License, or
7 (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21 #include <ardour/route.h>
22 #include <ardour/automation_control.h>
23 #include <pbd/memento_command.h>
24 #include <gtkmm2ext/barcontroller.h>
26 #include "ardour_ui.h"
27 #include "automation_time_axis.h"
28 #include "automation_line.h"
29 #include "public_editor.h"
30 #include "simplerect.h"
31 #include "selection.h"
32 #include "ghostregion.h"
33 #include "rgb_macros.h"
34 #include "automation_selectable.h"
35 #include "point_selection.h"
36 #include "canvas_impl.h"
41 using namespace ARDOUR;
44 using namespace Gtkmm2ext;
45 using namespace Editing;
47 Pango::FontDescription AutomationTimeAxisView::name_font;
48 bool AutomationTimeAxisView::have_name_font = false;
50 AutomationTimeAxisView::AutomationTimeAxisView (Session& s, boost::shared_ptr<Route> r,
51 boost::shared_ptr<Automatable> a, boost::shared_ptr<AutomationControl> c,
52 PublicEditor& e, TimeAxisView& rent,
53 ArdourCanvas::Canvas& canvas, const string & nom,
54 const string & state_name, const string & nomparent)
57 TimeAxisView (s, e, &rent, canvas),
61 _controller(AutomationController::create(s, c->list(), c)),
65 _state_name (state_name),
66 height_button (_("h")),
67 clear_button (_("clear")),
68 auto_button (X_("")) /* force addition of a label */
70 if (!have_name_font) {
71 name_font = get_font_for_style (X_("AutomationTrackName"));
72 have_name_font = true;
76 in_destructor = false;
81 ignore_state_request = false;
82 first_call_to_set_height = true;
84 _base_rect = new SimpleRect(*canvas_display);
85 _base_rect->property_x1() = 0.0;
86 _base_rect->property_y1() = 0.0;
87 _base_rect->property_x2() = editor.frame_to_pixel (max_frames);
88 _base_rect->property_outline_color_rgba() = ARDOUR_UI::config()->canvasvar_AutomationTrackOutline.get();
90 /* outline ends and bottom */
91 _base_rect->property_outline_what() = (guint32) (0x1|0x2|0x8);
92 _base_rect->property_fill_color_rgba() = ARDOUR_UI::config()->canvasvar_AutomationTrackFill.get();
94 _base_rect->set_data ("trackview", this);
96 _base_rect->signal_event().connect (bind (mem_fun (editor, &PublicEditor::canvas_automation_track_event),
99 hide_button.add (*(manage (new Gtk::Image (::get_icon("hide")))));
101 height_button.set_name ("TrackSizeButton");
102 auto_button.set_name ("TrackVisualButton");
103 clear_button.set_name ("TrackVisualButton");
104 hide_button.set_name ("TrackRemoveButton");
106 controls_table.set_no_show_all();
108 ARDOUR_UI::instance()->tooltips().set_tip(height_button, _("track height"));
109 ARDOUR_UI::instance()->tooltips().set_tip(auto_button, _("automation state"));
110 ARDOUR_UI::instance()->tooltips().set_tip(clear_button, _("clear track"));
111 ARDOUR_UI::instance()->tooltips().set_tip(hide_button, _("hide track"));
113 /* rearrange the name display */
115 /* we never show these for automation tracks, so make
116 life easier and remove them.
121 /* move the name label over a bit */
123 string shortpname = _name;
124 bool shortened = false;
127 shortpname = fit_to_pixels (_name, 60, name_font, ignore_width, true);
129 if (shortpname != _name ){
133 name_label.set_text (shortpname);
134 name_label.set_alignment (Gtk::ALIGN_CENTER, Gtk::ALIGN_CENTER);
136 if (nomparent.length()) {
138 /* limit the plug name string */
140 string pname = fit_to_pixels (nomparent, 60, name_font, ignore_width, true);
141 if (pname != nomparent) {
145 plugname = new Label (pname);
146 plugname->set_name (X_("TrackPlugName"));
148 name_label.set_name (X_("TrackParameterName"));
149 controls_table.remove (name_hbox);
150 controls_table.attach (*plugname, 1, 5, 0, 1, Gtk::FILL|Gtk::EXPAND, Gtk::FILL|Gtk::EXPAND);
151 plugname_packed = true;
152 controls_table.attach (name_hbox, 1, 5, 1, 2, Gtk::FILL|Gtk::EXPAND, Gtk::FILL|Gtk::EXPAND);
155 plugname_packed = false;
159 string tipname = nomparent;
160 if (!tipname.empty()) {
164 ARDOUR_UI::instance()->tooltips().set_tip(controls_ebox, tipname);
167 /* add the buttons */
168 controls_table.attach (hide_button, 0, 1, 0, 1, Gtk::FILL|Gtk::EXPAND, Gtk::FILL|Gtk::EXPAND);
169 controls_table.attach (height_button, 0, 1, 1, 2, Gtk::FILL|Gtk::EXPAND, Gtk::FILL|Gtk::EXPAND);
171 controls_table.attach (auto_button, 5, 8, 0, 1, Gtk::FILL|Gtk::EXPAND, Gtk::FILL|Gtk::EXPAND);
172 controls_table.attach (clear_button, 5, 8, 1, 2, Gtk::FILL|Gtk::EXPAND, Gtk::FILL|Gtk::EXPAND);
174 controls_table.show_all ();
176 height_button.signal_clicked().connect (mem_fun(*this, &AutomationTimeAxisView::height_clicked));
177 clear_button.signal_clicked().connect (mem_fun(*this, &AutomationTimeAxisView::clear_clicked));
178 hide_button.signal_clicked().connect (mem_fun(*this, &AutomationTimeAxisView::hide_clicked));
179 auto_button.signal_clicked().connect (mem_fun(*this, &AutomationTimeAxisView::auto_clicked));
181 controls_base_selected_name = X_("AutomationTrackControlsBaseSelected");
182 controls_base_unselected_name = X_("AutomationTrackControlsBase");
183 controls_ebox.set_name (controls_base_unselected_name);
185 controls_frame.set_shadow_type (Gtk::SHADOW_ETCHED_OUT);
187 XMLNode* xml_node = get_parent_with_state()->get_child_xml_node (_state_name);
190 set_state (*xml_node);
193 boost::shared_ptr<AutomationLine> line(new AutomationLine (
194 _control->list()->param_id().to_string(),
199 line->set_line_color (ARDOUR_UI::config()->canvasvar_ProcessorAutomationLine.get());
200 line->queue_reset ();
203 /* make sure labels etc. are correct */
205 automation_state_changed ();
206 ColorsChanged.connect (mem_fun (*this, &AutomationTimeAxisView::color_handler));
209 AutomationTimeAxisView::~AutomationTimeAxisView ()
211 in_destructor = true;
213 for (list<GhostRegion*>::iterator i = ghosts.begin(); i != ghosts.end(); ++i) {
219 AutomationTimeAxisView::auto_clicked ()
221 using namespace Menu_Helpers;
223 if (automation_menu == 0) {
224 automation_menu = manage (new Menu);
225 automation_menu->set_name ("ArdourContextMenu");
226 MenuList& items (automation_menu->items());
228 items.push_back (MenuElem (_("Manual"),
229 bind (mem_fun(*this, &AutomationTimeAxisView::set_automation_state), (AutoState) Off)));
230 items.push_back (MenuElem (_("Play"),
231 bind (mem_fun(*this, &AutomationTimeAxisView::set_automation_state), (AutoState) Play)));
232 items.push_back (MenuElem (_("Write"),
233 bind (mem_fun(*this, &AutomationTimeAxisView::set_automation_state), (AutoState) Write)));
234 items.push_back (MenuElem (_("Touch"),
235 bind (mem_fun(*this, &AutomationTimeAxisView::set_automation_state), (AutoState) Touch)));
238 automation_menu->popup (1, gtk_get_current_event_time());
242 AutomationTimeAxisView::set_automation_state (AutoState state)
244 if (!ignore_state_request) {
245 if (_route == _automatable) { // FIXME: ew
246 _route->set_parameter_automation_state (
247 _control->list()->param_id(),
251 _control->list()->set_automation_state(state);
257 AutomationTimeAxisView::automation_state_changed ()
261 /* update button label */
266 state = _control->list()->automation_state ();
269 switch (state & (Off|Play|Touch|Write)) {
271 auto_button.set_label (_("Manual"));
273 ignore_state_request = true;
274 auto_off_item->set_active (true);
275 auto_play_item->set_active (false);
276 auto_touch_item->set_active (false);
277 auto_write_item->set_active (false);
278 ignore_state_request = false;
282 auto_button.set_label (_("Play"));
283 if (auto_play_item) {
284 ignore_state_request = true;
285 auto_play_item->set_active (true);
286 auto_off_item->set_active (false);
287 auto_touch_item->set_active (false);
288 auto_write_item->set_active (false);
289 ignore_state_request = false;
293 auto_button.set_label (_("Write"));
294 if (auto_write_item) {
295 ignore_state_request = true;
296 auto_write_item->set_active (true);
297 auto_off_item->set_active (false);
298 auto_play_item->set_active (false);
299 auto_touch_item->set_active (false);
300 ignore_state_request = false;
304 auto_button.set_label (_("Touch"));
305 if (auto_touch_item) {
306 ignore_state_request = true;
307 auto_touch_item->set_active (true);
308 auto_off_item->set_active (false);
309 auto_play_item->set_active (false);
310 auto_write_item->set_active (false);
311 ignore_state_request = false;
315 auto_button.set_label (_("???"));
321 AutomationTimeAxisView::height_clicked ()
327 AutomationTimeAxisView::clear_clicked ()
329 _session.begin_reversible_command (_("clear automation"));
331 _session.commit_reversible_command ();
335 AutomationTimeAxisView::set_height (TrackHeight ht)
337 uint32_t h = height_to_pixels (ht);
338 bool changed = (height != (uint32_t) h);
340 //bool changed_between_small_and_normal = ( (ht == Small || ht == Smaller) ^ (height_style == Small || height_style == Smaller) );
342 TimeAxisView* state_parent = get_parent_with_state ();
343 XMLNode* xml_node = state_parent->get_child_xml_node (_state_name);
345 TimeAxisView::set_height (ht);
346 _base_rect->property_y2() = h;
349 _line->set_y_position_and_height (0, h);
351 for (list<GhostRegion*>::iterator i = ghosts.begin(); i != ghosts.end(); ++i) {
358 xml_node->add_property ("track_height", "largest");
362 xml_node->add_property ("track_height", "large");
366 xml_node->add_property ("track_height", "larger");
370 xml_node->add_property ("track_height", "normal");
374 xml_node->add_property ("track_height", "smaller");
378 xml_node->add_property ("track_height", "small");
382 //if (changed_between_small_and_normal || first_call_to_set_height) {
383 first_call_to_set_height = false;
389 _controller->show ();
390 controls_table.attach (*_controller.get(), 0, 8, 2, 3, Gtk::FILL|Gtk::EXPAND, Gtk::FILL|Gtk::EXPAND);
394 controls_table.remove (name_hbox);
397 if (plugname_packed) {
398 controls_table.remove (*plugname);
399 plugname_packed = false;
401 controls_table.attach (*plugname, 1, 5, 0, 1, Gtk::FILL|Gtk::EXPAND, Gtk::FILL|Gtk::EXPAND);
402 plugname_packed = true;
403 controls_table.attach (name_hbox, 1, 5, 1, 2, Gtk::FILL|Gtk::EXPAND, Gtk::FILL|Gtk::EXPAND);
405 controls_table.attach (name_hbox, 1, 5, 0, 1, Gtk::FILL|Gtk::EXPAND, Gtk::FILL|Gtk::EXPAND);
409 name_hbox.show_all ();
412 height_button.show();
414 hide_button.show_all();
420 controls_table.remove (name_hbox);
422 if (plugname_packed) {
423 controls_table.remove (*plugname);
424 plugname_packed = false;
427 controls_table.attach (name_hbox, 1, 5, 0, 1, Gtk::FILL|Gtk::EXPAND, Gtk::FILL|Gtk::EXPAND);
428 controls_table.hide_all ();
431 name_hbox.show_all ();
434 height_button.hide();
442 /* only emit the signal if the height really changed */
443 _route->gui_changed ("track_height", (void *) 0); /* EMIT_SIGNAL */
448 AutomationTimeAxisView::set_samples_per_unit (double spu)
450 TimeAxisView::set_samples_per_unit (editor.get_current_zoom());
456 AutomationTimeAxisView::hide_clicked ()
458 // LAME fix for refreshing the hide button
459 hide_button.set_sensitive(false);
461 set_marked_for_display (false);
464 hide_button.set_sensitive(true);
468 AutomationTimeAxisView::build_display_menu ()
470 using namespace Menu_Helpers;
472 /* get the size menu ready */
478 TimeAxisView::build_display_menu ();
480 /* now fill it with our stuff */
482 MenuList& items = display_menu->items();
484 items.push_back (MenuElem (_("Height"), *size_menu));
485 items.push_back (SeparatorElem());
486 items.push_back (MenuElem (_("Hide"), mem_fun(*this, &AutomationTimeAxisView::hide_clicked)));
487 items.push_back (SeparatorElem());
488 items.push_back (MenuElem (_("Clear"), mem_fun(*this, &AutomationTimeAxisView::clear_clicked)));
489 items.push_back (SeparatorElem());
491 Menu* auto_state_menu = manage (new Menu);
492 auto_state_menu->set_name ("ArdourContextMenu");
493 MenuList& as_items = auto_state_menu->items();
495 as_items.push_back (CheckMenuElem (_("Manual"),
496 bind (mem_fun(*this, &AutomationTimeAxisView::set_automation_state), (AutoState) Off)));
497 auto_off_item = dynamic_cast<CheckMenuItem*>(&as_items.back());
499 as_items.push_back (CheckMenuElem (_("Play"),
500 bind (mem_fun(*this, &AutomationTimeAxisView::set_automation_state), (AutoState) Play)));
501 auto_play_item = dynamic_cast<CheckMenuItem*>(&as_items.back());
503 as_items.push_back (CheckMenuElem (_("Write"),
504 bind (mem_fun(*this, &AutomationTimeAxisView::set_automation_state), (AutoState) Write)));
505 auto_write_item = dynamic_cast<CheckMenuItem*>(&as_items.back());
507 as_items.push_back (CheckMenuElem (_("Touch"),
508 bind (mem_fun(*this, &AutomationTimeAxisView::set_automation_state), (AutoState) Touch)));
509 auto_touch_item = dynamic_cast<CheckMenuItem*>(&as_items.back());
511 items.push_back (MenuElem (_("State"), *auto_state_menu));
513 /* make sure the automation menu state is correct */
515 automation_state_changed ();
519 AutomationTimeAxisView::add_automation_event (ArdourCanvas::Item* item, GdkEvent* event, nframes_t when, double y)
523 canvas_display->w2i (x, y);
525 /* compute vertical fractional position */
527 y = 1.0 - (y / height);
531 _line->view_to_model_y (y);
533 _session.begin_reversible_command (_("add automation event"));
534 XMLNode& before = _control->list()->get_state();
536 _control->list()->add (when, y);
538 XMLNode& after = _control->list()->get_state();
539 _session.commit_reversible_command (new MementoCommand<ARDOUR::AutomationList>(*_control->list().get(), &before, &after));
541 _session.set_dirty ();
546 AutomationTimeAxisView::cut_copy_clear (Selection& selection, CutCopyOp op)
548 return cut_copy_clear_one (*_line, selection, op);
552 AutomationTimeAxisView::cut_copy_clear_one (AutomationLine& line, Selection& selection, CutCopyOp op)
554 AutomationList* what_we_got = 0;
555 boost::shared_ptr<AutomationList> alist (line.the_list());
558 XMLNode &before = alist->get_state();
562 if ((what_we_got = alist->cut (selection.time.front().start, selection.time.front().end)) != 0) {
563 editor.get_cut_buffer().add (what_we_got);
564 _session.add_command(new MementoCommand<AutomationList>(*alist.get(), &before, &alist->get_state()));
569 if ((what_we_got = alist->copy (selection.time.front().start, selection.time.front().end)) != 0) {
570 editor.get_cut_buffer().add (what_we_got);
575 if ((what_we_got = alist->cut (selection.time.front().start, selection.time.front().end)) != 0) {
576 _session.add_command(new MementoCommand<AutomationList>(*alist.get(), &before, &alist->get_state()));
585 for (AutomationList::iterator x = what_we_got->begin(); x != what_we_got->end(); ++x) {
586 double foo = (*x)->value;
587 line.model_to_view_y (foo);
596 AutomationTimeAxisView::reset_objects (PointSelection& selection)
598 reset_objects_one (*_line, selection);
602 AutomationTimeAxisView::reset_objects_one (AutomationLine& line, PointSelection& selection)
604 boost::shared_ptr<AutomationList> alist(line.the_list());
606 _session.add_command (new MementoCommand<AutomationList>(*alist.get(), &alist->get_state(), 0));
608 for (PointSelection::iterator i = selection.begin(); i != selection.end(); ++i) {
610 if (&(*i).track != this) {
614 alist->reset_range ((*i).start, (*i).end);
619 AutomationTimeAxisView::cut_copy_clear_objects (PointSelection& selection, CutCopyOp op)
621 return cut_copy_clear_objects_one (*_line, selection, op);
625 AutomationTimeAxisView::cut_copy_clear_objects_one (AutomationLine& line, PointSelection& selection, CutCopyOp op)
627 AutomationList* what_we_got = 0;
628 boost::shared_ptr<AutomationList> alist(line.the_list());
631 XMLNode &before = alist->get_state();
633 for (PointSelection::iterator i = selection.begin(); i != selection.end(); ++i) {
635 if (&(*i).track != this) {
641 if ((what_we_got = alist->cut ((*i).start, (*i).end)) != 0) {
642 editor.get_cut_buffer().add (what_we_got);
643 _session.add_command (new MementoCommand<AutomationList>(*alist.get(), new XMLNode (before), &alist->get_state()));
648 if ((what_we_got = alist->copy ((*i).start, (*i).end)) != 0) {
649 editor.get_cut_buffer().add (what_we_got);
654 if ((what_we_got = alist->cut ((*i).start, (*i).end)) != 0) {
655 _session.add_command (new MementoCommand<AutomationList>(*alist.get(), new XMLNode (before), &alist->get_state()));
667 for (AutomationList::iterator x = what_we_got->begin(); x != what_we_got->end(); ++x) {
668 double foo = (*x)->value;
669 line.model_to_view_y (foo);
678 AutomationTimeAxisView::paste (nframes_t pos, float times, Selection& selection, size_t nth)
680 return paste_one (*_line, pos, times, selection, nth);
684 AutomationTimeAxisView::paste_one (AutomationLine& line, nframes_t pos, float times, Selection& selection, size_t nth)
686 AutomationSelection::iterator p;
687 boost::shared_ptr<AutomationList> alist(line.the_list());
689 for (p = selection.lines.begin(); p != selection.lines.end() && nth; ++p, --nth);
691 if (p == selection.lines.end()) {
695 /* Make a copy of the list because we have to scale the
696 values from view coordinates to model coordinates, and we're
697 not supposed to modify the points in the selection.
700 AutomationList copy (**p);
702 for (AutomationList::iterator x = copy.begin(); x != copy.end(); ++x) {
703 double foo = (*x)->value;
704 line.view_to_model_y (foo);
708 XMLNode &before = alist->get_state();
709 alist->paste (copy, pos, times);
710 _session.add_command (new MementoCommand<AutomationList>(*alist.get(), &before, &alist->get_state()));
716 AutomationTimeAxisView::add_ghost (GhostRegion* gr)
718 ghosts.push_back (gr);
719 gr->GoingAway.connect (mem_fun(*this, &AutomationTimeAxisView::remove_ghost));
723 AutomationTimeAxisView::remove_ghost (GhostRegion* gr)
729 list<GhostRegion*>::iterator i;
731 for (i = ghosts.begin(); i != ghosts.end(); ++i) {
740 AutomationTimeAxisView::get_selectables (nframes_t start, nframes_t end, double top, double bot, list<Selectable*>& results)
742 if (_line && touched (top, bot)) {
746 /* remember: this is X Window - coordinate space starts in upper left and moves down.
747 y_position is the "origin" or "top" of the track.
750 double mybot = y_position + height;
752 if (y_position >= top && mybot <= bot) {
754 /* y_position is below top, mybot is above bot, so we're fully
763 /* top and bot are within y_position .. mybot */
765 topfrac = 1.0 - ((top - y_position) / height);
766 botfrac = 1.0 - ((bot - y_position) / height);
769 _line->get_selectables (start, end, botfrac, topfrac, results);
774 AutomationTimeAxisView::get_inverted_selectables (Selection& sel, list<Selectable*>& result)
776 _line->get_inverted_selectables (sel, result);
780 AutomationTimeAxisView::set_selected_points (PointSelection& points)
782 _line->set_selected_points (points);
786 AutomationTimeAxisView::clear_lines ()
789 automation_connection.disconnect ();
793 AutomationTimeAxisView::add_line (boost::shared_ptr<AutomationLine> line)
797 assert(line->the_list() == _control->list());
799 automation_connection = _control->list()->automation_state_changed.connect
800 (mem_fun(*this, &AutomationTimeAxisView::automation_state_changed));
803 //_controller = AutomationController::create(_session, line->the_list(), _control);
805 line->set_y_position_and_height (0, height);
807 /* pick up the current state */
808 automation_state_changed ();
814 AutomationTimeAxisView::show_all_control_points ()
816 _line->show_all_control_points ();
820 AutomationTimeAxisView::hide_all_but_selected_control_points ()
822 _line->hide_all_but_selected_control_points ();
826 AutomationTimeAxisView::entered()
828 show_all_control_points ();
832 AutomationTimeAxisView::exited ()
834 hide_all_but_selected_control_points ();
838 AutomationTimeAxisView::set_colors ()
840 for (list<GhostRegion*>::iterator i=ghosts.begin(); i != ghosts.end(); i++ ) {
848 AutomationTimeAxisView::color_handler ()
854 AutomationTimeAxisView::set_state (const XMLNode& node)
856 TimeAxisView::set_state (node);
859 XMLNodeConstIterator iter;
861 kids = node.children ();
863 //snprintf (buf, sizeof(buf), "Port_%" PRIu32, param.id());
865 for (iter = kids.begin(); iter != kids.end(); ++iter) {
866 if ((*iter)->name() == _control->list()->param_id().to_string()) {
868 XMLProperty *shown = (*iter)->property("shown_editor");
870 if (shown && shown->value() == "yes") {
871 set_marked_for_display(true);
872 canvas_display->show(); /* FIXME: necessary? show_at? */
878 if (!_marked_for_display)
881 // FIXME: _xml_node = &node?
885 AutomationTimeAxisView::get_state_node ()
887 TimeAxisView* state_parent = get_parent_with_state ();
890 return state_parent->get_child_xml_node (_state_name);
897 AutomationTimeAxisView::ensure_xml_node ()
899 if ((_automatable != _route) && _xml_node == 0) {
900 if ((_xml_node = _automatable->extra_xml ("GUI")) == 0) {
901 _xml_node = new XMLNode ("GUI");
902 _automatable->add_extra_xml (*_xml_node);
908 AutomationTimeAxisView::update_extra_xml_shown (bool editor_shown)
910 if (_automatable == _route)
917 XMLNodeList nlist = _xml_node->children ();
918 XMLNodeConstIterator i;
919 XMLNode * port_node = 0;
921 /* FIXME: these parsed XML node names need to go */
922 //snprintf (buf, sizeof(buf), "Port_%" PRIu32, _param.id());
924 for (i = nlist.begin(); i != nlist.end(); ++i) {
925 /* FIXME: legacy session loading */
926 if ((*i)->name() == _control->list()->param_id().to_string()) {
933 port_node = new XMLNode(buf);
934 _xml_node->add_child_nocopy(*port_node);
937 port_node->add_property ("shown_editor", editor_shown ? "yes": "no");
941 AutomationTimeAxisView::show_at (double y, int& nth, Gtk::VBox *parent)
943 update_extra_xml_shown (true);
945 return TimeAxisView::show_at (y, nth, parent);
949 AutomationTimeAxisView::hide ()
951 update_extra_xml_shown (false);
953 TimeAxisView::hide ();