mirror of
https://github.com/brunoherbelin/vimix.git
synced 2025-12-11 10:19:59 +01:00
Hiding grips in geometry manipulation when operating.
This commit is contained in:
@@ -162,7 +162,6 @@ Handles::Handles(Type type) : Node(), type_(type)
|
|||||||
static Mesh *handle_restore = new Mesh("mesh/border_handles_menu.ply");
|
static Mesh *handle_restore = new Mesh("mesh/border_handles_menu.ply");
|
||||||
static Mesh *handle_shadow = new Mesh("mesh/border_handles_shadow.ply", "images/soft_shadow.dds");
|
static Mesh *handle_shadow = new Mesh("mesh/border_handles_shadow.ply", "images/soft_shadow.dds");
|
||||||
|
|
||||||
color = glm::vec4( 1.f, 1.f, 0.f, 1.f);
|
|
||||||
if ( type_ == Handles::ROTATE ) {
|
if ( type_ == Handles::ROTATE ) {
|
||||||
handle_ = handle_rotation;
|
handle_ = handle_rotation;
|
||||||
}
|
}
|
||||||
@@ -176,8 +175,8 @@ Handles::Handles(Type type) : Node(), type_(type)
|
|||||||
handle_ = handle_corner;
|
handle_ = handle_corner;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
color = glm::vec4( 1.f, 1.f, 1.f, 1.f);
|
||||||
corner_ = glm::vec2(0.f, 0.f);
|
corner_ = glm::vec2(0.f, 0.f);
|
||||||
|
|
||||||
shadow_ = handle_shadow;
|
shadow_ = handle_shadow;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -207,6 +206,7 @@ void Handles::draw(glm::mat4 modelview, glm::mat4 projection)
|
|||||||
|
|
||||||
// set color
|
// set color
|
||||||
handle_->shader()->color = color;
|
handle_->shader()->color = color;
|
||||||
|
handle_active->shader()->color = color;
|
||||||
|
|
||||||
// extract rotation from modelview
|
// extract rotation from modelview
|
||||||
glm::mat4 ctm;
|
glm::mat4 ctm;
|
||||||
|
|||||||
@@ -779,7 +779,7 @@ void MediaPlayer::update()
|
|||||||
fill_texture(read_index);
|
fill_texture(read_index);
|
||||||
|
|
||||||
// double update for pre-roll frame and dual PBO (ensure frame is displayed now)
|
// double update for pre-roll frame and dual PBO (ensure frame is displayed now)
|
||||||
if (frame_[read_index].status == PREROLL && pbo_size_ > 0)
|
if ( (frame_[read_index].status == PREROLL || seeking_ ) && pbo_size_ > 0)
|
||||||
fill_texture(read_index);
|
fill_texture(read_index);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -253,13 +253,13 @@ void Source::setMode(Source::Mode m)
|
|||||||
(*g).second->visible_ = true;
|
(*g).second->visible_ = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// choose frame if selected
|
// choose frame 0 if visible, 1 if selected
|
||||||
uint index_frame = m == Source::VISIBLE ? 0 : 1;
|
uint index_frame = m == Source::VISIBLE ? 0 : 1;
|
||||||
for (auto f = frames_.begin(); f != frames_.end(); f++)
|
for (auto f = frames_.begin(); f != frames_.end(); f++)
|
||||||
(*f).second->setActive(index_frame);
|
(*f).second->setActive(index_frame);
|
||||||
|
|
||||||
// show overlay if current
|
// show overlay if current
|
||||||
bool current = m == Source::CURRENT;
|
bool current = m >= Source::CURRENT;
|
||||||
for (auto o = overlays_.begin(); o != overlays_.end(); o++)
|
for (auto o = overlays_.begin(); o != overlays_.end(); o++)
|
||||||
(*o).second->visible_ = current;
|
(*o).second->visible_ = current;
|
||||||
|
|
||||||
|
|||||||
95
View.cpp
95
View.cpp
@@ -987,16 +987,14 @@ View::Cursor GeometryView::grab (Source *s, glm::vec2 from, glm::vec2 to, std::p
|
|||||||
// picking on the resizing handles in the corners
|
// picking on the resizing handles in the corners
|
||||||
if ( pick.first == s->handles_[mode_][Handles::RESIZE] ) {
|
if ( pick.first == s->handles_[mode_][Handles::RESIZE] ) {
|
||||||
|
|
||||||
|
// hide all other grips
|
||||||
|
s->handles_[mode_][Handles::SCALE]->visible_ = false;
|
||||||
|
s->handles_[mode_][Handles::RESIZE_H]->visible_ = false;
|
||||||
|
s->handles_[mode_][Handles::RESIZE_V]->visible_ = false;
|
||||||
|
s->handles_[mode_][Handles::ROTATE]->visible_ = false;
|
||||||
|
s->handles_[mode_][Handles::MENU]->visible_ = false;
|
||||||
// inform on which corner should be overlayed (opposite)
|
// inform on which corner should be overlayed (opposite)
|
||||||
s->handles_[mode_][Handles::RESIZE]->overlayActiveCorner(-corner);
|
s->handles_[mode_][Handles::RESIZE]->overlayActiveCorner(-corner);
|
||||||
|
|
||||||
// overlay_scaling_grid_->visible_ = false;
|
|
||||||
// glm::vec4 icon = corner_to_scene_transform * glm::vec4(0.f, 0.f, 0.f, 1.f);
|
|
||||||
// overlay_scaling_grid_->translation_.x = icon.x;
|
|
||||||
// overlay_scaling_grid_->translation_.y = icon.y;
|
|
||||||
// overlay_scaling_grid_->rotation_.z = s->stored_status_->rotation_.z;
|
|
||||||
// overlay_scaling_grid_->update(0);
|
|
||||||
|
|
||||||
// RESIZE CORNER
|
// RESIZE CORNER
|
||||||
// proportional SCALING with SHIFT
|
// proportional SCALING with SHIFT
|
||||||
if (UserInterface::manager().shiftModifier()) {
|
if (UserInterface::manager().shiftModifier()) {
|
||||||
@@ -1042,9 +1040,14 @@ View::Cursor GeometryView::grab (Source *s, glm::vec2 from, glm::vec2 to, std::p
|
|||||||
// picking on the BORDER RESIZING handles left or right
|
// picking on the BORDER RESIZING handles left or right
|
||||||
else if ( pick.first == s->handles_[mode_][Handles::RESIZE_H] ) {
|
else if ( pick.first == s->handles_[mode_][Handles::RESIZE_H] ) {
|
||||||
|
|
||||||
|
// hide all other grips
|
||||||
|
s->handles_[mode_][Handles::RESIZE]->visible_ = false;
|
||||||
|
s->handles_[mode_][Handles::SCALE]->visible_ = false;
|
||||||
|
s->handles_[mode_][Handles::RESIZE_V]->visible_ = false;
|
||||||
|
s->handles_[mode_][Handles::ROTATE]->visible_ = false;
|
||||||
|
s->handles_[mode_][Handles::MENU]->visible_ = false;
|
||||||
// inform on which corner should be overlayed (opposite)
|
// inform on which corner should be overlayed (opposite)
|
||||||
s->handles_[mode_][Handles::RESIZE_H]->overlayActiveCorner(-corner);
|
s->handles_[mode_][Handles::RESIZE_H]->overlayActiveCorner(-corner);
|
||||||
|
|
||||||
// SHIFT: HORIZONTAL SCALE to restore source aspect ratio
|
// SHIFT: HORIZONTAL SCALE to restore source aspect ratio
|
||||||
if (UserInterface::manager().shiftModifier()) {
|
if (UserInterface::manager().shiftModifier()) {
|
||||||
sourceNode->scale_.x = ABS(sourceNode->scale_.y) * SIGN(sourceNode->scale_.x);
|
sourceNode->scale_.x = ABS(sourceNode->scale_.y) * SIGN(sourceNode->scale_.x);
|
||||||
@@ -1077,9 +1080,14 @@ View::Cursor GeometryView::grab (Source *s, glm::vec2 from, glm::vec2 to, std::p
|
|||||||
// picking on the BORDER RESIZING handles top or bottom
|
// picking on the BORDER RESIZING handles top or bottom
|
||||||
else if ( pick.first == s->handles_[mode_][Handles::RESIZE_V] ) {
|
else if ( pick.first == s->handles_[mode_][Handles::RESIZE_V] ) {
|
||||||
|
|
||||||
|
// hide all other grips
|
||||||
|
s->handles_[mode_][Handles::RESIZE]->visible_ = false;
|
||||||
|
s->handles_[mode_][Handles::SCALE]->visible_ = false;
|
||||||
|
s->handles_[mode_][Handles::RESIZE_H]->visible_ = false;
|
||||||
|
s->handles_[mode_][Handles::ROTATE]->visible_ = false;
|
||||||
|
s->handles_[mode_][Handles::MENU]->visible_ = false;
|
||||||
// inform on which corner should be overlayed (opposite)
|
// inform on which corner should be overlayed (opposite)
|
||||||
s->handles_[mode_][Handles::RESIZE_V]->overlayActiveCorner(-corner);
|
s->handles_[mode_][Handles::RESIZE_V]->overlayActiveCorner(-corner);
|
||||||
|
|
||||||
// SHIFT: VERTICAL SCALE to restore source aspect ratio
|
// SHIFT: VERTICAL SCALE to restore source aspect ratio
|
||||||
if (UserInterface::manager().shiftModifier()) {
|
if (UserInterface::manager().shiftModifier()) {
|
||||||
sourceNode->scale_.y = ABS(sourceNode->scale_.x) * SIGN(sourceNode->scale_.y);
|
sourceNode->scale_.y = ABS(sourceNode->scale_.x) * SIGN(sourceNode->scale_.y);
|
||||||
@@ -1112,6 +1120,13 @@ View::Cursor GeometryView::grab (Source *s, glm::vec2 from, glm::vec2 to, std::p
|
|||||||
// picking on the CENTRER SCALING handle
|
// picking on the CENTRER SCALING handle
|
||||||
else if ( pick.first == s->handles_[mode_][Handles::SCALE] ) {
|
else if ( pick.first == s->handles_[mode_][Handles::SCALE] ) {
|
||||||
|
|
||||||
|
// hide all other grips
|
||||||
|
s->handles_[mode_][Handles::RESIZE]->visible_ = false;
|
||||||
|
s->handles_[mode_][Handles::RESIZE_H]->visible_ = false;
|
||||||
|
s->handles_[mode_][Handles::RESIZE_V]->visible_ = false;
|
||||||
|
s->handles_[mode_][Handles::ROTATE]->visible_ = false;
|
||||||
|
s->handles_[mode_][Handles::MENU]->visible_ = false;
|
||||||
|
// prepare overlay
|
||||||
overlay_scaling_cross_->visible_ = false;
|
overlay_scaling_cross_->visible_ = false;
|
||||||
overlay_scaling_grid_->visible_ = false;
|
overlay_scaling_grid_->visible_ = false;
|
||||||
overlay_scaling_->visible_ = true;
|
overlay_scaling_->visible_ = true;
|
||||||
@@ -1119,7 +1134,6 @@ View::Cursor GeometryView::grab (Source *s, glm::vec2 from, glm::vec2 to, std::p
|
|||||||
overlay_scaling_->translation_.y = s->stored_status_->translation_.y;
|
overlay_scaling_->translation_.y = s->stored_status_->translation_.y;
|
||||||
overlay_scaling_->rotation_.z = s->stored_status_->rotation_.z;
|
overlay_scaling_->rotation_.z = s->stored_status_->rotation_.z;
|
||||||
overlay_scaling_->update(0);
|
overlay_scaling_->update(0);
|
||||||
|
|
||||||
// PROPORTIONAL ONLY
|
// PROPORTIONAL ONLY
|
||||||
if (UserInterface::manager().shiftModifier()) {
|
if (UserInterface::manager().shiftModifier()) {
|
||||||
float factor = glm::length( glm::vec2( source_to ) ) / glm::length( glm::vec2( source_from ) );
|
float factor = glm::length( glm::vec2( source_to ) ) / glm::length( glm::vec2( source_from ) );
|
||||||
@@ -1145,6 +1159,13 @@ View::Cursor GeometryView::grab (Source *s, glm::vec2 from, glm::vec2 to, std::p
|
|||||||
// picking on the rotating handle
|
// picking on the rotating handle
|
||||||
else if ( pick.first == s->handles_[mode_][Handles::ROTATE] ) {
|
else if ( pick.first == s->handles_[mode_][Handles::ROTATE] ) {
|
||||||
|
|
||||||
|
// hide all other grips
|
||||||
|
s->handles_[mode_][Handles::RESIZE]->visible_ = false;
|
||||||
|
s->handles_[mode_][Handles::RESIZE_H]->visible_ = false;
|
||||||
|
s->handles_[mode_][Handles::RESIZE_V]->visible_ = false;
|
||||||
|
s->handles_[mode_][Handles::SCALE]->visible_ = false;
|
||||||
|
s->handles_[mode_][Handles::MENU]->visible_ = false;
|
||||||
|
|
||||||
// ROTATION on CENTER
|
// ROTATION on CENTER
|
||||||
overlay_rotation_->visible_ = true;
|
overlay_rotation_->visible_ = true;
|
||||||
overlay_rotation_->translation_.x = s->stored_status_->translation_.x;
|
overlay_rotation_->translation_.x = s->stored_status_->translation_.x;
|
||||||
@@ -1250,7 +1271,7 @@ void GeometryView::terminate()
|
|||||||
{
|
{
|
||||||
View::terminate();
|
View::terminate();
|
||||||
|
|
||||||
// hide all overlays
|
// hide all view overlays
|
||||||
overlay_position_->visible_ = false;
|
overlay_position_->visible_ = false;
|
||||||
overlay_position_cross_->visible_ = false;
|
overlay_position_cross_->visible_ = false;
|
||||||
overlay_rotation_clock_->visible_ = false;
|
overlay_rotation_clock_->visible_ = false;
|
||||||
@@ -1261,7 +1282,7 @@ void GeometryView::terminate()
|
|||||||
overlay_scaling_cross_->visible_ = false;
|
overlay_scaling_cross_->visible_ = false;
|
||||||
overlay_scaling_->visible_ = false;
|
overlay_scaling_->visible_ = false;
|
||||||
|
|
||||||
// cancel of all handles overlays
|
// restore of all handles overlays
|
||||||
glm::vec2 c(0.f, 0.f);
|
glm::vec2 c(0.f, 0.f);
|
||||||
for (auto sit = Mixer::manager().session()->begin();
|
for (auto sit = Mixer::manager().session()->begin();
|
||||||
sit != Mixer::manager().session()->end(); sit++){
|
sit != Mixer::manager().session()->end(); sit++){
|
||||||
@@ -1269,6 +1290,12 @@ void GeometryView::terminate()
|
|||||||
(*sit)->handles_[mode_][Handles::RESIZE]->overlayActiveCorner(c);
|
(*sit)->handles_[mode_][Handles::RESIZE]->overlayActiveCorner(c);
|
||||||
(*sit)->handles_[mode_][Handles::RESIZE_H]->overlayActiveCorner(c);
|
(*sit)->handles_[mode_][Handles::RESIZE_H]->overlayActiveCorner(c);
|
||||||
(*sit)->handles_[mode_][Handles::RESIZE_V]->overlayActiveCorner(c);
|
(*sit)->handles_[mode_][Handles::RESIZE_V]->overlayActiveCorner(c);
|
||||||
|
(*sit)->handles_[mode_][Handles::RESIZE]->visible_ = true;
|
||||||
|
(*sit)->handles_[mode_][Handles::RESIZE_H]->visible_ = true;
|
||||||
|
(*sit)->handles_[mode_][Handles::RESIZE_V]->visible_ = true;
|
||||||
|
(*sit)->handles_[mode_][Handles::SCALE]->visible_ = true;
|
||||||
|
(*sit)->handles_[mode_][Handles::ROTATE]->visible_ = true;
|
||||||
|
(*sit)->handles_[mode_][Handles::MENU]->visible_ = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -2149,7 +2176,6 @@ View::Cursor AppearanceView::grab (Source *s, glm::vec2 from, glm::vec2 to, std:
|
|||||||
glm::vec3 scene_to = Rendering::manager().unProject(to, scene.root()->transform_);
|
glm::vec3 scene_to = Rendering::manager().unProject(to, scene.root()->transform_);
|
||||||
glm::vec3 scene_translation = scene_to - scene_from;
|
glm::vec3 scene_translation = scene_to - scene_from;
|
||||||
|
|
||||||
|
|
||||||
// Not grabbing a source
|
// Not grabbing a source
|
||||||
if (!s) {
|
if (!s) {
|
||||||
// work on the edited source
|
// work on the edited source
|
||||||
@@ -2238,6 +2264,13 @@ View::Cursor AppearanceView::grab (Source *s, glm::vec2 from, glm::vec2 to, std:
|
|||||||
// picking on the resizing handles in the corners
|
// picking on the resizing handles in the corners
|
||||||
if ( pick.first == s->handles_[mode_][Handles::RESIZE] ) {
|
if ( pick.first == s->handles_[mode_][Handles::RESIZE] ) {
|
||||||
|
|
||||||
|
// hide all other grips
|
||||||
|
s->handles_[mode_][Handles::SCALE]->visible_ = false;
|
||||||
|
s->handles_[mode_][Handles::RESIZE_H]->visible_ = false;
|
||||||
|
s->handles_[mode_][Handles::RESIZE_V]->visible_ = false;
|
||||||
|
s->handles_[mode_][Handles::ROTATE]->visible_ = false;
|
||||||
|
s->handles_[mode_][Handles::MENU]->visible_ = false;
|
||||||
|
|
||||||
// inform on which corner should be overlayed (opposite)
|
// inform on which corner should be overlayed (opposite)
|
||||||
s->handles_[mode_][Handles::RESIZE]->overlayActiveCorner(-corner);
|
s->handles_[mode_][Handles::RESIZE]->overlayActiveCorner(-corner);
|
||||||
|
|
||||||
@@ -2286,6 +2319,13 @@ View::Cursor AppearanceView::grab (Source *s, glm::vec2 from, glm::vec2 to, std:
|
|||||||
// picking on the BORDER RESIZING handles left or right
|
// picking on the BORDER RESIZING handles left or right
|
||||||
else if ( pick.first == s->handles_[mode_][Handles::RESIZE_H] ) {
|
else if ( pick.first == s->handles_[mode_][Handles::RESIZE_H] ) {
|
||||||
|
|
||||||
|
// hide all other grips
|
||||||
|
s->handles_[mode_][Handles::RESIZE]->visible_ = false;
|
||||||
|
s->handles_[mode_][Handles::SCALE]->visible_ = false;
|
||||||
|
s->handles_[mode_][Handles::RESIZE_V]->visible_ = false;
|
||||||
|
s->handles_[mode_][Handles::ROTATE]->visible_ = false;
|
||||||
|
s->handles_[mode_][Handles::MENU]->visible_ = false;
|
||||||
|
|
||||||
// inform on which corner should be overlayed (opposite)
|
// inform on which corner should be overlayed (opposite)
|
||||||
s->handles_[mode_][Handles::RESIZE_H]->overlayActiveCorner(-corner);
|
s->handles_[mode_][Handles::RESIZE_H]->overlayActiveCorner(-corner);
|
||||||
|
|
||||||
@@ -2321,6 +2361,13 @@ View::Cursor AppearanceView::grab (Source *s, glm::vec2 from, glm::vec2 to, std:
|
|||||||
// picking on the BORDER RESIZING handles top or bottom
|
// picking on the BORDER RESIZING handles top or bottom
|
||||||
else if ( pick.first == s->handles_[mode_][Handles::RESIZE_V] ) {
|
else if ( pick.first == s->handles_[mode_][Handles::RESIZE_V] ) {
|
||||||
|
|
||||||
|
// hide all other grips
|
||||||
|
s->handles_[mode_][Handles::RESIZE]->visible_ = false;
|
||||||
|
s->handles_[mode_][Handles::SCALE]->visible_ = false;
|
||||||
|
s->handles_[mode_][Handles::RESIZE_H]->visible_ = false;
|
||||||
|
s->handles_[mode_][Handles::ROTATE]->visible_ = false;
|
||||||
|
s->handles_[mode_][Handles::MENU]->visible_ = false;
|
||||||
|
|
||||||
// inform on which corner should be overlayed (opposite)
|
// inform on which corner should be overlayed (opposite)
|
||||||
s->handles_[mode_][Handles::RESIZE_V]->overlayActiveCorner(-corner);
|
s->handles_[mode_][Handles::RESIZE_V]->overlayActiveCorner(-corner);
|
||||||
|
|
||||||
@@ -2356,6 +2403,14 @@ View::Cursor AppearanceView::grab (Source *s, glm::vec2 from, glm::vec2 to, std:
|
|||||||
// picking on the CENTRER SCALING handle
|
// picking on the CENTRER SCALING handle
|
||||||
else if ( pick.first == s->handles_[mode_][Handles::SCALE] ) {
|
else if ( pick.first == s->handles_[mode_][Handles::SCALE] ) {
|
||||||
|
|
||||||
|
// hide all other grips
|
||||||
|
s->handles_[mode_][Handles::RESIZE]->visible_ = false;
|
||||||
|
s->handles_[mode_][Handles::RESIZE_H]->visible_ = false;
|
||||||
|
s->handles_[mode_][Handles::RESIZE_V]->visible_ = false;
|
||||||
|
s->handles_[mode_][Handles::ROTATE]->visible_ = false;
|
||||||
|
s->handles_[mode_][Handles::MENU]->visible_ = false;
|
||||||
|
|
||||||
|
// prepare overlay
|
||||||
overlay_scaling_cross_->visible_ = false;
|
overlay_scaling_cross_->visible_ = false;
|
||||||
overlay_scaling_grid_->visible_ = false;
|
overlay_scaling_grid_->visible_ = false;
|
||||||
overlay_scaling_->visible_ = true;
|
overlay_scaling_->visible_ = true;
|
||||||
@@ -2389,6 +2444,12 @@ View::Cursor AppearanceView::grab (Source *s, glm::vec2 from, glm::vec2 to, std:
|
|||||||
// picking on the rotating handle
|
// picking on the rotating handle
|
||||||
else if ( pick.first == s->handles_[mode_][Handles::ROTATE] ) {
|
else if ( pick.first == s->handles_[mode_][Handles::ROTATE] ) {
|
||||||
|
|
||||||
|
// hide all other grips
|
||||||
|
s->handles_[mode_][Handles::RESIZE]->visible_ = false;
|
||||||
|
s->handles_[mode_][Handles::RESIZE_H]->visible_ = false;
|
||||||
|
s->handles_[mode_][Handles::RESIZE_V]->visible_ = false;
|
||||||
|
s->handles_[mode_][Handles::SCALE]->visible_ = false;
|
||||||
|
s->handles_[mode_][Handles::MENU]->visible_ = false;
|
||||||
// ROTATION on CENTER
|
// ROTATION on CENTER
|
||||||
overlay_rotation_->visible_ = true;
|
overlay_rotation_->visible_ = true;
|
||||||
overlay_rotation_->translation_.x = s->stored_status_->translation_.x;
|
overlay_rotation_->translation_.x = s->stored_status_->translation_.x;
|
||||||
@@ -2512,6 +2573,12 @@ void AppearanceView::terminate()
|
|||||||
(*sit)->handles_[mode_][Handles::RESIZE]->overlayActiveCorner(c);
|
(*sit)->handles_[mode_][Handles::RESIZE]->overlayActiveCorner(c);
|
||||||
(*sit)->handles_[mode_][Handles::RESIZE_H]->overlayActiveCorner(c);
|
(*sit)->handles_[mode_][Handles::RESIZE_H]->overlayActiveCorner(c);
|
||||||
(*sit)->handles_[mode_][Handles::RESIZE_V]->overlayActiveCorner(c);
|
(*sit)->handles_[mode_][Handles::RESIZE_V]->overlayActiveCorner(c);
|
||||||
|
(*sit)->handles_[mode_][Handles::RESIZE]->visible_ = true;
|
||||||
|
(*sit)->handles_[mode_][Handles::RESIZE_H]->visible_ = true;
|
||||||
|
(*sit)->handles_[mode_][Handles::RESIZE_V]->visible_ = true;
|
||||||
|
(*sit)->handles_[mode_][Handles::SCALE]->visible_ = true;
|
||||||
|
(*sit)->handles_[mode_][Handles::ROTATE]->visible_ = true;
|
||||||
|
(*sit)->handles_[mode_][Handles::MENU]->visible_ = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user