mirror of
https://github.com/Ardour/ardour.git
synced 2025-12-21 22:26:29 +01:00
various changes to accomodate skip markers (which span the entire range of an ARDOUR::Location) and to add drag-to-create-skip
This commit is contained in:
parent
b6b8b892c2
commit
a95ec7ca5b
9 changed files with 68 additions and 33 deletions
|
|
@ -57,6 +57,7 @@ CANVAS_VARIABLE(canvasvar_LocationCDMarker, "location cd marker")
|
||||||
CANVAS_VARIABLE(canvasvar_LocationLoop, "location loop")
|
CANVAS_VARIABLE(canvasvar_LocationLoop, "location loop")
|
||||||
CANVAS_VARIABLE(canvasvar_LocationMarker, "location marker")
|
CANVAS_VARIABLE(canvasvar_LocationMarker, "location marker")
|
||||||
CANVAS_VARIABLE(canvasvar_LocationPunch, "location punch")
|
CANVAS_VARIABLE(canvasvar_LocationPunch, "location punch")
|
||||||
|
CANVAS_VARIABLE(canvasvar_LocationSkip, "location skip")
|
||||||
CANVAS_VARIABLE(canvasvar_LocationRange, "location range")
|
CANVAS_VARIABLE(canvasvar_LocationRange, "location range")
|
||||||
CANVAS_VARIABLE(canvasvar_MarkerBar, "marker bar")
|
CANVAS_VARIABLE(canvasvar_MarkerBar, "marker bar")
|
||||||
CANVAS_VARIABLE(canvasvar_MarkerBarSeparator, "marker bar separator")
|
CANVAS_VARIABLE(canvasvar_MarkerBarSeparator, "marker bar separator")
|
||||||
|
|
|
||||||
|
|
@ -50,6 +50,7 @@
|
||||||
<Option name="location loop" value="5DA557ff"/>
|
<Option name="location loop" value="5DA557ff"/>
|
||||||
<Option name="location marker" value="B700FFff"/>
|
<Option name="location marker" value="B700FFff"/>
|
||||||
<Option name="location punch" value="B700FFff"/>
|
<Option name="location punch" value="B700FFff"/>
|
||||||
|
<Option name="location skip" value="ff0000ff"/>
|
||||||
<Option name="location range" value="E0922Fff"/>
|
<Option name="location range" value="E0922Fff"/>
|
||||||
<Option name="marker bar" value="575757ff"/>
|
<Option name="marker bar" value="575757ff"/>
|
||||||
<Option name="marker bar separator" value="ffffff15"/>
|
<Option name="marker bar separator" value="ffffff15"/>
|
||||||
|
|
|
||||||
|
|
@ -584,6 +584,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
|
||||||
uint32_t location_loop_color;
|
uint32_t location_loop_color;
|
||||||
uint32_t location_punch_color;
|
uint32_t location_punch_color;
|
||||||
uint32_t location_cd_marker_color;
|
uint32_t location_cd_marker_color;
|
||||||
|
uint32_t location_skip_color;
|
||||||
|
|
||||||
struct LocationMarkers {
|
struct LocationMarkers {
|
||||||
Marker* start;
|
Marker* start;
|
||||||
|
|
@ -1755,6 +1756,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
|
||||||
|
|
||||||
ArdourCanvas::Rectangle* cd_marker_bar_drag_rect;
|
ArdourCanvas::Rectangle* cd_marker_bar_drag_rect;
|
||||||
ArdourCanvas::Rectangle* range_bar_drag_rect;
|
ArdourCanvas::Rectangle* range_bar_drag_rect;
|
||||||
|
ArdourCanvas::Rectangle* skip_drag_rect;
|
||||||
ArdourCanvas::Rectangle* transport_bar_drag_rect;
|
ArdourCanvas::Rectangle* transport_bar_drag_rect;
|
||||||
|
|
||||||
#ifdef GTKOSX
|
#ifdef GTKOSX
|
||||||
|
|
@ -1765,8 +1767,8 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
|
||||||
ArdourCanvas::Rectangle *transport_bar_postroll_rect;
|
ArdourCanvas::Rectangle *transport_bar_postroll_rect;
|
||||||
ArdourCanvas::Rectangle *transport_loop_range_rect;
|
ArdourCanvas::Rectangle *transport_loop_range_rect;
|
||||||
ArdourCanvas::Rectangle *transport_punch_range_rect;
|
ArdourCanvas::Rectangle *transport_punch_range_rect;
|
||||||
ArdourCanvas::Line *transport_punchin_line;
|
ArdourCanvas::Line *transport_punchin_line;
|
||||||
ArdourCanvas::Line *transport_punchout_line;
|
ArdourCanvas::Line *transport_punchout_line;
|
||||||
ArdourCanvas::Rectangle *transport_preroll_rect;
|
ArdourCanvas::Rectangle *transport_preroll_rect;
|
||||||
ArdourCanvas::Rectangle *transport_postroll_rect;
|
ArdourCanvas::Rectangle *transport_postroll_rect;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -200,6 +200,11 @@ Editor::initialize_canvas ()
|
||||||
cd_marker_bar_drag_rect->set_outline (false);
|
cd_marker_bar_drag_rect->set_outline (false);
|
||||||
cd_marker_bar_drag_rect->hide ();
|
cd_marker_bar_drag_rect->hide ();
|
||||||
|
|
||||||
|
skip_drag_rect = new ArdourCanvas::Rectangle (skip_group, ArdourCanvas::Rect (0.0, 0.0, 100, timebar_height));
|
||||||
|
CANVAS_DEBUG_NAME (skip_drag_rect, "skip drag");
|
||||||
|
skip_drag_rect->set_outline (false);
|
||||||
|
skip_drag_rect->hide ();
|
||||||
|
|
||||||
range_bar_drag_rect = new ArdourCanvas::Rectangle (range_marker_group, ArdourCanvas::Rect (0.0, 0.0, 100, timebar_height));
|
range_bar_drag_rect = new ArdourCanvas::Rectangle (range_marker_group, ArdourCanvas::Rect (0.0, 0.0, 100, timebar_height));
|
||||||
CANVAS_DEBUG_NAME (range_bar_drag_rect, "range drag");
|
CANVAS_DEBUG_NAME (range_bar_drag_rect, "range drag");
|
||||||
range_bar_drag_rect->set_outline (false);
|
range_bar_drag_rect->set_outline (false);
|
||||||
|
|
@ -935,6 +940,9 @@ Editor::color_handler()
|
||||||
range_bar_drag_rect->set_fill_color (ARDOUR_UI::config()->get_canvasvar_RangeDragBarRect());
|
range_bar_drag_rect->set_fill_color (ARDOUR_UI::config()->get_canvasvar_RangeDragBarRect());
|
||||||
range_bar_drag_rect->set_outline_color (ARDOUR_UI::config()->get_canvasvar_RangeDragBarRect());
|
range_bar_drag_rect->set_outline_color (ARDOUR_UI::config()->get_canvasvar_RangeDragBarRect());
|
||||||
|
|
||||||
|
skip_drag_rect->set_fill_color (ARDOUR_UI::config()->get_canvasvar_RangeDragBarRect());
|
||||||
|
skip_drag_rect->set_outline_color (ARDOUR_UI::config()->get_canvasvar_RangeDragBarRect());
|
||||||
|
|
||||||
transport_bar_drag_rect->set_fill_color (ARDOUR_UI::config()->get_canvasvar_TransportDragRect());
|
transport_bar_drag_rect->set_fill_color (ARDOUR_UI::config()->get_canvasvar_TransportDragRect());
|
||||||
transport_bar_drag_rect->set_outline_color (ARDOUR_UI::config()->get_canvasvar_TransportDragRect());
|
transport_bar_drag_rect->set_outline_color (ARDOUR_UI::config()->get_canvasvar_TransportDragRect());
|
||||||
|
|
||||||
|
|
@ -958,6 +966,7 @@ Editor::color_handler()
|
||||||
location_cd_marker_color = ARDOUR_UI::config()->get_canvasvar_LocationCDMarker();
|
location_cd_marker_color = ARDOUR_UI::config()->get_canvasvar_LocationCDMarker();
|
||||||
location_loop_color = ARDOUR_UI::config()->get_canvasvar_LocationLoop();
|
location_loop_color = ARDOUR_UI::config()->get_canvasvar_LocationLoop();
|
||||||
location_punch_color = ARDOUR_UI::config()->get_canvasvar_LocationPunch();
|
location_punch_color = ARDOUR_UI::config()->get_canvasvar_LocationPunch();
|
||||||
|
location_skip_color = ARDOUR_UI::config()->get_canvasvar_LocationSkip();
|
||||||
|
|
||||||
refresh_location_display ();
|
refresh_location_display ();
|
||||||
/*
|
/*
|
||||||
|
|
@ -1346,6 +1355,7 @@ Editor::choose_canvas_cursor_on_entry (GdkEventCrossing* /*event*/, ItemType typ
|
||||||
case MinsecRulerItem:
|
case MinsecRulerItem:
|
||||||
case BBTRulerItem:
|
case BBTRulerItem:
|
||||||
case SamplesRulerItem:
|
case SamplesRulerItem:
|
||||||
|
case SkipBarItem:
|
||||||
cursor = _cursors->timebar;
|
cursor = _cursors->timebar;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
@ -1360,7 +1370,6 @@ Editor::choose_canvas_cursor_on_entry (GdkEventCrossing* /*event*/, ItemType typ
|
||||||
case CdMarkerBarItem:
|
case CdMarkerBarItem:
|
||||||
case VideoBarItem:
|
case VideoBarItem:
|
||||||
case PunchLoopBarItem:
|
case PunchLoopBarItem:
|
||||||
case SkipBarItem:
|
|
||||||
case DropZoneItem:
|
case DropZoneItem:
|
||||||
cursor = which_grabber_cursor();
|
cursor = which_grabber_cursor();
|
||||||
break;
|
break;
|
||||||
|
|
|
||||||
|
|
@ -4473,7 +4473,7 @@ RangeMarkerBarDrag::motion (GdkEvent* event, bool first_move)
|
||||||
|
|
||||||
switch (_operation) {
|
switch (_operation) {
|
||||||
case CreateSkipMarker:
|
case CreateSkipMarker:
|
||||||
crect = _editor->range_bar_drag_rect;
|
crect = _editor->skip_drag_rect;
|
||||||
break;
|
break;
|
||||||
case CreateRangeMarker:
|
case CreateRangeMarker:
|
||||||
crect = _editor->range_bar_drag_rect;
|
crect = _editor->range_bar_drag_rect;
|
||||||
|
|
@ -4557,7 +4557,7 @@ RangeMarkerBarDrag::finished (GdkEvent* event, bool movement_occurred)
|
||||||
_editor->begin_reversible_command (_("new skip marker"));
|
_editor->begin_reversible_command (_("new skip marker"));
|
||||||
_editor->session()->locations()->next_available_name(rangename,_("skip"));
|
_editor->session()->locations()->next_available_name(rangename,_("skip"));
|
||||||
flags = Location::IsRangeMarker | Location::IsSkip;
|
flags = Location::IsRangeMarker | Location::IsSkip;
|
||||||
_editor->range_bar_drag_rect->hide();
|
_editor->skip_drag_rect->hide();
|
||||||
} else if (_operation == CreateCDMarker) {
|
} else if (_operation == CreateCDMarker) {
|
||||||
_editor->session()->locations()->next_available_name(rangename, _("CD"));
|
_editor->session()->locations()->next_available_name(rangename, _("CD"));
|
||||||
_editor->begin_reversible_command (_("new CD marker"));
|
_editor->begin_reversible_command (_("new CD marker"));
|
||||||
|
|
|
||||||
|
|
@ -99,6 +99,8 @@ Editor::add_new_location_internal (Location* location)
|
||||||
color = location_loop_color;
|
color = location_loop_color;
|
||||||
} else if (location->is_auto_punch()) {
|
} else if (location->is_auto_punch()) {
|
||||||
color = location_punch_color;
|
color = location_punch_color;
|
||||||
|
} else if (location->is_skip()) {
|
||||||
|
color = location_skip_color;
|
||||||
} else {
|
} else {
|
||||||
color = location_range_color;
|
color = location_range_color;
|
||||||
}
|
}
|
||||||
|
|
@ -139,6 +141,11 @@ Editor::add_new_location_internal (Location* location)
|
||||||
lam->start = new Marker (*this, *marker_group, color, _("start"), Marker::SessionStart, location->start());
|
lam->start = new Marker (*this, *marker_group, color, _("start"), Marker::SessionStart, location->start());
|
||||||
lam->end = new Marker (*this, *marker_group, color, _("end"), Marker::SessionEnd, location->end());
|
lam->end = new Marker (*this, *marker_group, color, _("end"), Marker::SessionEnd, location->end());
|
||||||
group = marker_group;
|
group = marker_group;
|
||||||
|
|
||||||
|
} else if (location->is_skip ()) {
|
||||||
|
/* skip: single marker that spans entire skip area */
|
||||||
|
lam->start = new Marker (*this, *skip_group, color, location->name(), Marker::Skip, location->start(), true, location->end());
|
||||||
|
lam->end = 0;
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
// range marker
|
// range marker
|
||||||
|
|
|
||||||
|
|
@ -681,10 +681,13 @@ Editor::button_press_handler_1 (ArdourCanvas::Item* item, GdkEvent* event, ItemT
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
||||||
|
case SkipBarItem:
|
||||||
|
_drags->set (new RangeMarkerBarDrag (this, item, RangeMarkerBarDrag::CreateSkipMarker), event);
|
||||||
|
return true;
|
||||||
|
break;
|
||||||
|
|
||||||
case RangeMarkerBarItem:
|
case RangeMarkerBarItem:
|
||||||
if (Keyboard::modifier_state_contains (event->button.state, Keyboard::TertiaryModifier)) {
|
if (Keyboard::modifier_state_equals (event->button.state, Keyboard::PrimaryModifier)) {
|
||||||
_drags->set (new RangeMarkerBarDrag (this, item, RangeMarkerBarDrag::CreateSkipMarker), event);
|
|
||||||
} else if (Keyboard::modifier_state_equals (event->button.state, Keyboard::PrimaryModifier)) {
|
|
||||||
_drags->set (new RangeMarkerBarDrag (this, item, RangeMarkerBarDrag::CreateRangeMarker), event);
|
_drags->set (new RangeMarkerBarDrag (this, item, RangeMarkerBarDrag::CreateRangeMarker), event);
|
||||||
} else {
|
} else {
|
||||||
_drags->set (new CursorDrag (this, *playhead_cursor, false), event);
|
_drags->set (new CursorDrag (this, *playhead_cursor, false), event);
|
||||||
|
|
@ -710,15 +713,6 @@ Editor::button_press_handler_1 (ArdourCanvas::Item* item, GdkEvent* event, ItemT
|
||||||
return true;
|
return true;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SkipBarItem:
|
|
||||||
if (!Keyboard::modifier_state_equals (event->button.state, Keyboard::PrimaryModifier)) {
|
|
||||||
_drags->set (new CursorDrag (this, *playhead_cursor, false), event);
|
|
||||||
} else {
|
|
||||||
// _drags->set (new RangeMarkerBarDrag (this, item, RangeMarkerBarDrag::CreateTransportMarker), event);
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
@ -1297,9 +1291,9 @@ Editor::button_press_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemTyp
|
||||||
case TempoBarItem:
|
case TempoBarItem:
|
||||||
case MeterBarItem:
|
case MeterBarItem:
|
||||||
case RangeMarkerBarItem:
|
case RangeMarkerBarItem:
|
||||||
|
case SkipBarItem:
|
||||||
case CdMarkerBarItem:
|
case CdMarkerBarItem:
|
||||||
case PunchLoopBarItem:
|
case PunchLoopBarItem:
|
||||||
case SkipBarItem:
|
|
||||||
case StreamItem:
|
case StreamItem:
|
||||||
case TimecodeRulerItem:
|
case TimecodeRulerItem:
|
||||||
case SamplesRulerItem:
|
case SamplesRulerItem:
|
||||||
|
|
|
||||||
|
|
@ -61,7 +61,7 @@ const char * Marker::default_new_marker_prefix = N_("MARKER");
|
||||||
static const double name_padding = 10.0;
|
static const double name_padding = 10.0;
|
||||||
|
|
||||||
Marker::Marker (PublicEditor& ed, ArdourCanvas::Container& parent, guint32 rgba, const string& annotation,
|
Marker::Marker (PublicEditor& ed, ArdourCanvas::Container& parent, guint32 rgba, const string& annotation,
|
||||||
Type type, framepos_t frame, bool handle_events)
|
Type type, framepos_t start_pos, bool handle_events, framepos_t end_pos)
|
||||||
|
|
||||||
: editor (ed)
|
: editor (ed)
|
||||||
, _parent (&parent)
|
, _parent (&parent)
|
||||||
|
|
@ -71,6 +71,8 @@ Marker::Marker (PublicEditor& ed, ArdourCanvas::Container& parent, guint32 rgba,
|
||||||
, _track_canvas_line (0)
|
, _track_canvas_line (0)
|
||||||
, _scene_change_rect (0)
|
, _scene_change_rect (0)
|
||||||
, _scene_change_text (0)
|
, _scene_change_text (0)
|
||||||
|
, frame_position (start_pos)
|
||||||
|
, end_frame (end_pos)
|
||||||
, _type (type)
|
, _type (type)
|
||||||
, _selected (false)
|
, _selected (false)
|
||||||
, _shown (false)
|
, _shown (false)
|
||||||
|
|
@ -81,8 +83,11 @@ Marker::Marker (PublicEditor& ed, ArdourCanvas::Container& parent, guint32 rgba,
|
||||||
, _label_offset (0)
|
, _label_offset (0)
|
||||||
, _have_scene_change (false)
|
, _have_scene_change (false)
|
||||||
{
|
{
|
||||||
frame_position = frame;
|
if (end_frame >= 0 && (end_frame < frame_position)) {
|
||||||
unit_position = editor.sample_to_pixel (frame);
|
swap (end_frame, frame_position);
|
||||||
|
}
|
||||||
|
|
||||||
|
unit_position = editor.sample_to_pixel (frame_position);
|
||||||
unit_position -= _shift;
|
unit_position -= _shift;
|
||||||
|
|
||||||
group = new ArdourCanvas::Container (&parent, ArdourCanvas::Duple (unit_position, 0));
|
group = new ArdourCanvas::Container (&parent, ArdourCanvas::Duple (unit_position, 0));
|
||||||
|
|
@ -100,7 +105,7 @@ Marker::Marker (PublicEditor& ed, ArdourCanvas::Container& parent, guint32 rgba,
|
||||||
|
|
||||||
set_color_rgba (rgba);
|
set_color_rgba (rgba);
|
||||||
|
|
||||||
if (type == Mark) {
|
if (type == Mark || type == Skip) {
|
||||||
_line_shown = true;
|
_line_shown = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -223,6 +228,10 @@ Marker::add_polygon (Type type)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
switch (type) {
|
switch (type) {
|
||||||
|
case Skip:
|
||||||
|
/*NOTREACHED*/
|
||||||
|
break;
|
||||||
|
|
||||||
case Mark:
|
case Mark:
|
||||||
points->push_back (ArdourCanvas::Duple (0.0, 0.0));
|
points->push_back (ArdourCanvas::Duple (0.0, 0.0));
|
||||||
points->push_back (ArdourCanvas::Duple (6.0, 0.0));
|
points->push_back (ArdourCanvas::Duple (6.0, 0.0));
|
||||||
|
|
@ -341,7 +350,8 @@ Marker::set_show_line (bool s)
|
||||||
void
|
void
|
||||||
Marker::setup_line ()
|
Marker::setup_line ()
|
||||||
{
|
{
|
||||||
if ((Profile->get_trx() && _type == Mark) || (_shown && ((!Profile->get_trx() && _selected) || _line_shown))) {
|
if ((Profile->get_trx() && (_type == Skip || _type == Mark)) ||
|
||||||
|
(_shown && ((!Profile->get_trx() && _selected) || _line_shown))) {
|
||||||
|
|
||||||
if (_track_canvas_line == 0) {
|
if (_track_canvas_line == 0) {
|
||||||
|
|
||||||
|
|
@ -482,19 +492,28 @@ Marker::setup_name_display ()
|
||||||
_name_item->clamp_width (name_width);
|
_name_item->clamp_width (name_width);
|
||||||
_name_item->set (_name);
|
_name_item->set (_name);
|
||||||
|
|
||||||
if (ARDOUR::Profile->get_trx()) {
|
|
||||||
|
if (_type == Skip) {
|
||||||
|
|
||||||
|
/* fully span the extent between frame_position + end_frame */
|
||||||
_name_background->set_x0 (_name_item->position().x - _label_offset);
|
_name_background->set_x0 (_name_item->position().x - _label_offset);
|
||||||
_name_background->set_x1 (_name_item->position().x - _label_offset + name_width + scene_change_width);
|
_name_background->set_x1 (_name_background->x0() + editor.sample_to_pixel (end_frame - frame_position));
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
if (label_on_left ()) {
|
if (ARDOUR::Profile->get_trx()) {
|
||||||
_name_background->set_x0 (_name_item->position().x - 2);
|
_name_background->set_x0 (_name_item->position().x - _label_offset);
|
||||||
_name_background->set_x1 (_name_item->position().x + name_width + _shift + scene_change_width);
|
_name_background->set_x1 (_name_item->position().x - _label_offset + name_width + scene_change_width);
|
||||||
} else {
|
} else {
|
||||||
_name_background->set_x0 (_name_item->position().x - _label_offset + 2);
|
if (label_on_left ()) {
|
||||||
_name_background->set_x1 (_name_item->position().x + name_width + scene_change_width);
|
_name_background->set_x0 (_name_item->position().x - 2);
|
||||||
|
_name_background->set_x1 (_name_item->position().x + name_width + _shift + scene_change_width);
|
||||||
|
} else {
|
||||||
|
_name_background->set_x0 (_name_item->position().x - _label_offset + 2);
|
||||||
|
_name_background->set_x1 (_name_item->position().x + name_width + scene_change_width);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
_name_background->set_y0 (0);
|
_name_background->set_y0 (0);
|
||||||
_name_background->set_y1 (_marker_height + 1.0);
|
_name_background->set_y1 (_marker_height + 1.0);
|
||||||
|
|
|
||||||
|
|
@ -52,12 +52,13 @@ class Marker : public sigc::trackable
|
||||||
LoopStart,
|
LoopStart,
|
||||||
LoopEnd,
|
LoopEnd,
|
||||||
PunchIn,
|
PunchIn,
|
||||||
PunchOut
|
PunchOut,
|
||||||
|
Skip,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
Marker (PublicEditor& editor, ArdourCanvas::Container &, guint32 rgba, const std::string& text, Type,
|
Marker (PublicEditor& editor, ArdourCanvas::Container &, guint32 rgba, const std::string& text, Type,
|
||||||
framepos_t frame = 0, bool handle_events = true);
|
framepos_t frame = 0, bool handle_events = true, framepos_t end_frame = -1);
|
||||||
|
|
||||||
virtual ~Marker ();
|
virtual ~Marker ();
|
||||||
|
|
||||||
|
|
@ -117,6 +118,7 @@ class Marker : public sigc::trackable
|
||||||
std::string _name;
|
std::string _name;
|
||||||
double unit_position;
|
double unit_position;
|
||||||
framepos_t frame_position;
|
framepos_t frame_position;
|
||||||
|
framepos_t end_frame;
|
||||||
double _shift;
|
double _shift;
|
||||||
Type _type;
|
Type _type;
|
||||||
int name_height;
|
int name_height;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue