mirror of
https://git.lyx.org/repos/lyx.git
synced 2024-11-27 03:36:39 +00:00
next one
git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@20762 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
parent
1a5acd927f
commit
d1d0501625
@ -1,56 +0,0 @@
|
|||||||
/**
|
|
||||||
* \file ControlListings.cpp
|
|
||||||
* This file is part of LyX, the document processor.
|
|
||||||
* Licence details can be found in the file COPYING.
|
|
||||||
*
|
|
||||||
* \author Bo Peng
|
|
||||||
*
|
|
||||||
* Full author contact details are available in file CREDITS.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <config.h>
|
|
||||||
|
|
||||||
#include "ControlListings.h"
|
|
||||||
#include "FuncRequest.h"
|
|
||||||
#include "insets/InsetListings.h"
|
|
||||||
|
|
||||||
#include "debug.h"
|
|
||||||
|
|
||||||
using std::string;
|
|
||||||
|
|
||||||
namespace lyx {
|
|
||||||
namespace frontend {
|
|
||||||
|
|
||||||
ControlListings::ControlListings(Dialog & parent)
|
|
||||||
: Controller(parent), params_()
|
|
||||||
{}
|
|
||||||
|
|
||||||
|
|
||||||
bool ControlListings::initialiseParams(string const & data)
|
|
||||||
{
|
|
||||||
InsetListingsMailer::string2params(data, params_);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void ControlListings::clearParams()
|
|
||||||
{
|
|
||||||
params_.clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void ControlListings::dispatchParams()
|
|
||||||
{
|
|
||||||
string const lfun = InsetListingsMailer::params2string(params());
|
|
||||||
dispatch(FuncRequest(getLfun(), lfun));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void ControlListings::setParams(InsetListingsParams const & params)
|
|
||||||
{
|
|
||||||
params_ = params;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
} // namespace frontend
|
|
||||||
} // namespace lyx
|
|
@ -1,50 +0,0 @@
|
|||||||
// -*- C++ -*-
|
|
||||||
/**
|
|
||||||
* \file ControlListings.h
|
|
||||||
* This file is part of LyX, the document processor.
|
|
||||||
* Licence details can be found in the file COPYING.
|
|
||||||
*
|
|
||||||
* \author Bo Peng
|
|
||||||
*
|
|
||||||
* Full author contact details are available in file CREDITS.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef CONTROLLISTINGS_H
|
|
||||||
#define CONTROLLISTINGS_H
|
|
||||||
|
|
||||||
#include "Dialog.h"
|
|
||||||
#include "insets/InsetListingsParams.h"
|
|
||||||
|
|
||||||
namespace lyx {
|
|
||||||
|
|
||||||
class InsetListingsParams;
|
|
||||||
|
|
||||||
namespace frontend {
|
|
||||||
|
|
||||||
class ControlListings : public Controller {
|
|
||||||
public:
|
|
||||||
///
|
|
||||||
ControlListings(Dialog &);
|
|
||||||
///
|
|
||||||
virtual bool initialiseParams(std::string const & data);
|
|
||||||
/// clean-up on hide.
|
|
||||||
virtual void clearParams();
|
|
||||||
/// clean-up on hide.
|
|
||||||
virtual void dispatchParams();
|
|
||||||
///
|
|
||||||
virtual bool isBufferDependent() const { return true; }
|
|
||||||
///
|
|
||||||
InsetListingsParams & params() { return params_; }
|
|
||||||
///
|
|
||||||
InsetListingsParams const & params() const { return params_; }
|
|
||||||
///
|
|
||||||
void setParams(InsetListingsParams const &);
|
|
||||||
private:
|
|
||||||
///
|
|
||||||
InsetListingsParams params_;
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace frontend
|
|
||||||
} // namespace lyx
|
|
||||||
|
|
||||||
#endif
|
|
@ -24,7 +24,6 @@ SOURCEFILES = \
|
|||||||
ControlFloat.cpp \
|
ControlFloat.cpp \
|
||||||
ControlGraphics.cpp \
|
ControlGraphics.cpp \
|
||||||
ControlInclude.cpp \
|
ControlInclude.cpp \
|
||||||
ControlListings.cpp \
|
|
||||||
ControlLog.cpp \
|
ControlLog.cpp \
|
||||||
ControlViewSource.cpp \
|
ControlViewSource.cpp \
|
||||||
ControlMath.cpp \
|
ControlMath.cpp \
|
||||||
@ -59,7 +58,6 @@ HEADERFILES = \
|
|||||||
ControlExternal.h \
|
ControlExternal.h \
|
||||||
ControlFloat.h \
|
ControlFloat.h \
|
||||||
ControlGraphics.h \
|
ControlGraphics.h \
|
||||||
ControlListings.h \
|
|
||||||
ControlInclude.h \
|
ControlInclude.h \
|
||||||
ControlLog.h \
|
ControlLog.h \
|
||||||
ControlViewSource.h \
|
ControlViewSource.h \
|
||||||
|
@ -35,7 +35,6 @@
|
|||||||
#include "GuiIndex.h"
|
#include "GuiIndex.h"
|
||||||
#include "GuiMathMatrix.h"
|
#include "GuiMathMatrix.h"
|
||||||
#include "GuiNomencl.h"
|
#include "GuiNomencl.h"
|
||||||
#include "GuiListings.h"
|
|
||||||
#include "GuiLog.h"
|
#include "GuiLog.h"
|
||||||
#include "GuiParagraph.h"
|
#include "GuiParagraph.h"
|
||||||
#include "GuiPrefs.h"
|
#include "GuiPrefs.h"
|
||||||
@ -259,7 +258,7 @@ Dialog * Dialogs::build(string const & name)
|
|||||||
} else if (name == "wrap") {
|
} else if (name == "wrap") {
|
||||||
dialog = createGuiWrap(lyxview_);
|
dialog = createGuiWrap(lyxview_);
|
||||||
} else if (name == "listings") {
|
} else if (name == "listings") {
|
||||||
dialog = new GuiListingsDialog(lyxview_);
|
dialog = createGuiListings(lyxview_);
|
||||||
}
|
}
|
||||||
|
|
||||||
return dialog;
|
return dialog;
|
||||||
|
@ -13,8 +13,9 @@
|
|||||||
|
|
||||||
#include "GuiListings.h"
|
#include "GuiListings.h"
|
||||||
|
|
||||||
#include "ControlListings.h"
|
|
||||||
#include "qt_helpers.h"
|
#include "qt_helpers.h"
|
||||||
|
#include "FuncRequest.h"
|
||||||
|
#include "insets/InsetListings.h"
|
||||||
#include "insets/InsetListingsParams.h"
|
#include "insets/InsetListingsParams.h"
|
||||||
#include "debug.h"
|
#include "debug.h"
|
||||||
|
|
||||||
@ -36,12 +37,14 @@ using lyx::support::prefixIs;
|
|||||||
using lyx::support::suffixIs;
|
using lyx::support::suffixIs;
|
||||||
using lyx::support::contains;
|
using lyx::support::contains;
|
||||||
|
|
||||||
|
|
||||||
namespace lyx {
|
namespace lyx {
|
||||||
namespace frontend {
|
namespace frontend {
|
||||||
|
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////
|
||||||
//
|
//
|
||||||
// GuiListingsDialog
|
// GuiListings
|
||||||
//
|
//
|
||||||
/////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
@ -162,12 +165,12 @@ char const * font_styles_gui[] =
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
GuiListingsDialog::GuiListingsDialog(LyXView & lv)
|
GuiListings::GuiListings(LyXView & lv)
|
||||||
: GuiDialog(lv, "listings")
|
: GuiDialog(lv, "listings"), Controller(this)
|
||||||
{
|
{
|
||||||
setupUi(this);
|
setupUi(this);
|
||||||
setViewTitle(_("Program Listing Settings"));
|
setViewTitle(_("Program Listing Settings"));
|
||||||
setController(new ControlListings(*this));
|
setController(this, false);
|
||||||
|
|
||||||
connect(okPB, SIGNAL(clicked()), this, SLOT(slotOK()));
|
connect(okPB, SIGNAL(clicked()), this, SLOT(slotOK()));
|
||||||
connect(applyPB, SIGNAL(clicked()), this, SLOT(slotApply()));
|
connect(applyPB, SIGNAL(clicked()), this, SLOT(slotApply()));
|
||||||
@ -181,17 +184,17 @@ GuiListingsDialog::GuiListingsDialog(LyXView & lv)
|
|||||||
this, SLOT(change_adaptor()));
|
this, SLOT(change_adaptor()));
|
||||||
connect(floatCB, SIGNAL(clicked()),
|
connect(floatCB, SIGNAL(clicked()),
|
||||||
this, SLOT(change_adaptor()));
|
this, SLOT(change_adaptor()));
|
||||||
connect(placementLE, SIGNAL(textChanged(const QString&)),
|
connect(placementLE, SIGNAL(textChanged(QString)),
|
||||||
this, SLOT(change_adaptor()));
|
this, SLOT(change_adaptor()));
|
||||||
connect(numberSideCO, SIGNAL(currentIndexChanged(int)),
|
connect(numberSideCO, SIGNAL(currentIndexChanged(int)),
|
||||||
this, SLOT(change_adaptor()));
|
this, SLOT(change_adaptor()));
|
||||||
connect(numberStepLE, SIGNAL(textChanged(const QString&)),
|
connect(numberStepLE, SIGNAL(textChanged(QString)),
|
||||||
this, SLOT(change_adaptor()));
|
this, SLOT(change_adaptor()));
|
||||||
connect(numberFontSizeCO, SIGNAL(currentIndexChanged(int)),
|
connect(numberFontSizeCO, SIGNAL(currentIndexChanged(int)),
|
||||||
this, SLOT(change_adaptor()));
|
this, SLOT(change_adaptor()));
|
||||||
connect(firstlineLE, SIGNAL(textChanged(const QString&)),
|
connect(firstlineLE, SIGNAL(textChanged(QString)),
|
||||||
this, SLOT(change_adaptor()));
|
this, SLOT(change_adaptor()));
|
||||||
connect(lastlineLE, SIGNAL(textChanged(const QString&)),
|
connect(lastlineLE, SIGNAL(textChanged(QString)),
|
||||||
this, SLOT(change_adaptor()));
|
this, SLOT(change_adaptor()));
|
||||||
connect(fontsizeCO, SIGNAL(currentIndexChanged(int)),
|
connect(fontsizeCO, SIGNAL(currentIndexChanged(int)),
|
||||||
this, SLOT(change_adaptor()));
|
this, SLOT(change_adaptor()));
|
||||||
@ -244,32 +247,26 @@ GuiListingsDialog::GuiListingsDialog(LyXView & lv)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
ControlListings & GuiListingsDialog::controller()
|
void GuiListings::closeEvent(QCloseEvent * e)
|
||||||
{
|
|
||||||
return static_cast<ControlListings &>(GuiDialog::controller());
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void GuiListingsDialog::closeEvent(QCloseEvent * e)
|
|
||||||
{
|
{
|
||||||
slotClose();
|
slotClose();
|
||||||
e->accept();
|
e->accept();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void GuiListingsDialog::change_adaptor()
|
void GuiListings::change_adaptor()
|
||||||
{
|
{
|
||||||
changed();
|
changed();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
string GuiListingsDialog::construct_params()
|
string GuiListings::construct_params()
|
||||||
{
|
{
|
||||||
string language = languages[languageCO->currentIndex()];
|
string language = languages[languageCO->currentIndex()];
|
||||||
string dialect;
|
string dialect;
|
||||||
string const dialect_gui = fromqstr(dialectCO->currentText());
|
string const dialect_gui = fromqstr(dialectCO->currentText());
|
||||||
if (dialectCO->currentIndex() > 0) {
|
if (dialectCO->currentIndex() > 0) {
|
||||||
for (size_t i = 0; i < nr_dialects; ++i) {
|
for (size_t i = 0; i != nr_dialects; ++i) {
|
||||||
if (dialect_gui == dialects[i].gui
|
if (dialect_gui == dialects[i].gui
|
||||||
&& dialects[i].language == language
|
&& dialects[i].language == language
|
||||||
&& !dialects[i].is_default) {
|
&& !dialects[i].is_default) {
|
||||||
@ -355,12 +352,12 @@ string GuiListingsDialog::construct_params()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
docstring GuiListingsDialog::validate_listings_params()
|
docstring GuiListings::validate_listings_params()
|
||||||
{
|
{
|
||||||
// use a cache here to avoid repeated validation
|
// use a cache here to avoid repeated validation
|
||||||
// of the same parameters
|
// of the same parameters
|
||||||
static string param_cache = string();
|
static string param_cache;
|
||||||
static docstring msg_cache = docstring();
|
static docstring msg_cache;
|
||||||
|
|
||||||
if (bypassCB->isChecked())
|
if (bypassCB->isChecked())
|
||||||
return docstring();
|
return docstring();
|
||||||
@ -374,7 +371,7 @@ docstring GuiListingsDialog::validate_listings_params()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void GuiListingsDialog::set_listings_msg()
|
void GuiListings::set_listings_msg()
|
||||||
{
|
{
|
||||||
static bool isOK = true;
|
static bool isOK = true;
|
||||||
docstring msg = validate_listings_params();
|
docstring msg = validate_listings_params();
|
||||||
@ -391,7 +388,7 @@ void GuiListingsDialog::set_listings_msg()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void GuiListingsDialog::on_floatCB_stateChanged(int state)
|
void GuiListings::on_floatCB_stateChanged(int state)
|
||||||
{
|
{
|
||||||
if (state == Qt::Checked) {
|
if (state == Qt::Checked) {
|
||||||
inlineCB->setChecked(false);
|
inlineCB->setChecked(false);
|
||||||
@ -401,7 +398,7 @@ void GuiListingsDialog::on_floatCB_stateChanged(int state)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void GuiListingsDialog::on_inlineCB_stateChanged(int state)
|
void GuiListings::on_inlineCB_stateChanged(int state)
|
||||||
{
|
{
|
||||||
if (state == Qt::Checked) {
|
if (state == Qt::Checked) {
|
||||||
floatCB->setChecked(false);
|
floatCB->setChecked(false);
|
||||||
@ -410,14 +407,14 @@ void GuiListingsDialog::on_inlineCB_stateChanged(int state)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void GuiListingsDialog::on_numberSideCO_currentIndexChanged(int index)
|
void GuiListings::on_numberSideCO_currentIndexChanged(int index)
|
||||||
{
|
{
|
||||||
numberStepLE->setEnabled(index > 0);
|
numberStepLE->setEnabled(index > 0);
|
||||||
numberFontSizeCO->setEnabled(index > 0);
|
numberFontSizeCO->setEnabled(index > 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void GuiListingsDialog::on_languageCO_currentIndexChanged(int index)
|
void GuiListings::on_languageCO_currentIndexChanged(int index)
|
||||||
{
|
{
|
||||||
dialectCO->clear();
|
dialectCO->clear();
|
||||||
// 0 is "no dialect"
|
// 0 is "no dialect"
|
||||||
@ -425,7 +422,7 @@ void GuiListingsDialog::on_languageCO_currentIndexChanged(int index)
|
|||||||
dialectCO->addItem(qt_("No dialect"));
|
dialectCO->addItem(qt_("No dialect"));
|
||||||
string const language = languages[index];
|
string const language = languages[index];
|
||||||
|
|
||||||
for (size_t i = 0; i < nr_dialects; ++i) {
|
for (size_t i = 0; i != nr_dialects; ++i) {
|
||||||
if (language == dialects[i].language) {
|
if (language == dialects[i].language) {
|
||||||
dialectCO->addItem(qt_(dialects[i].gui));
|
dialectCO->addItem(qt_(dialects[i].gui));
|
||||||
if (dialects[i].is_default)
|
if (dialects[i].is_default)
|
||||||
@ -438,12 +435,10 @@ void GuiListingsDialog::on_languageCO_currentIndexChanged(int index)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void GuiListingsDialog::applyView()
|
void GuiListings::applyView()
|
||||||
{
|
{
|
||||||
InsetListingsParams & params = controller().params();
|
params_.setInline(inlineCB->isChecked());
|
||||||
params.setInline(inlineCB->isChecked());
|
params_.setParams(construct_params());
|
||||||
params.setParams(construct_params());
|
|
||||||
controller().setParams(params);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -456,7 +451,7 @@ static string plainParam(std::string const & par)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void GuiListingsDialog::updateContents()
|
void GuiListings::updateContents()
|
||||||
{
|
{
|
||||||
// set default values
|
// set default values
|
||||||
listingsTB->setPlainText(
|
listingsTB->setPlainText(
|
||||||
@ -478,14 +473,13 @@ void GuiListingsDialog::updateContents()
|
|||||||
extendedcharsCB->setChecked(false);
|
extendedcharsCB->setChecked(false);
|
||||||
|
|
||||||
// set values from param string
|
// set values from param string
|
||||||
InsetListingsParams & params = controller().params();
|
inlineCB->setChecked(params_.isInline());
|
||||||
inlineCB->setChecked(params.isInline());
|
if (params_.isInline()) {
|
||||||
if (params.isInline()) {
|
|
||||||
floatCB->setChecked(false);
|
floatCB->setChecked(false);
|
||||||
placementLE->setEnabled(false);
|
placementLE->setEnabled(false);
|
||||||
}
|
}
|
||||||
// break other parameters and set values
|
// break other parameters and set values
|
||||||
vector<string> pars = getVectorFromString(params.separatedParams(), "\n");
|
vector<string> pars = getVectorFromString(params_.separatedParams(), "\n");
|
||||||
// process each of them
|
// process each of them
|
||||||
for (vector<string>::iterator it = pars.begin();
|
for (vector<string>::iterator it = pars.begin();
|
||||||
it != pars.end(); ++it) {
|
it != pars.end(); ++it) {
|
||||||
@ -509,7 +503,7 @@ void GuiListingsDialog::updateContents()
|
|||||||
// on_languageCO_currentIndexChanged should have set dialects
|
// on_languageCO_currentIndexChanged should have set dialects
|
||||||
if (!dialect.empty()) {
|
if (!dialect.empty()) {
|
||||||
string dialect_gui;
|
string dialect_gui;
|
||||||
for (size_t i = 0; i < nr_dialects; ++i) {
|
for (size_t i = 0; i != nr_dialects; ++i) {
|
||||||
if (dialect == dialects[i].dialect
|
if (dialect == dialects[i].dialect
|
||||||
&& dialects[i].language == language) {
|
&& dialects[i].language == language) {
|
||||||
dialect_gui = dialects[i].gui;
|
dialect_gui = dialects[i].gui;
|
||||||
@ -617,12 +611,41 @@ void GuiListingsDialog::updateContents()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool GuiListingsDialog::isValid()
|
bool GuiListings::isValid()
|
||||||
{
|
{
|
||||||
return validate_listings_params().empty();
|
return validate_listings_params().empty();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool GuiListings::initialiseParams(string const & data)
|
||||||
|
{
|
||||||
|
InsetListingsMailer::string2params(data, params_);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void GuiListings::clearParams()
|
||||||
|
{
|
||||||
|
params_.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void GuiListings::dispatchParams()
|
||||||
|
{
|
||||||
|
string const lfun = InsetListingsMailer::params2string(params_);
|
||||||
|
dispatch(FuncRequest(getLfun(), lfun));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void GuiListings::setParams(InsetListingsParams const & params)
|
||||||
|
{
|
||||||
|
params_ = params;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Dialog * createGuiListings(LyXView & lv) { return new GuiListings(lv); }
|
||||||
|
|
||||||
|
|
||||||
} // namespace frontend
|
} // namespace frontend
|
||||||
} // namespace lyx
|
} // namespace lyx
|
||||||
|
|
||||||
|
@ -13,17 +13,17 @@
|
|||||||
#define GUILISTINGS_H
|
#define GUILISTINGS_H
|
||||||
|
|
||||||
#include "GuiDialog.h"
|
#include "GuiDialog.h"
|
||||||
#include "ControlListings.h"
|
|
||||||
#include "ui_ListingsUi.h"
|
#include "ui_ListingsUi.h"
|
||||||
|
#include "insets/InsetListingsParams.h"
|
||||||
|
|
||||||
namespace lyx {
|
namespace lyx {
|
||||||
namespace frontend {
|
namespace frontend {
|
||||||
|
|
||||||
class GuiListingsDialog : public GuiDialog, public Ui::ListingsUi
|
class GuiListings : public GuiDialog, public Ui::ListingsUi, public Controller
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
public:
|
public:
|
||||||
GuiListingsDialog(LyXView & lv);
|
GuiListings(LyXView & lv);
|
||||||
/// get values from all the widgets and form a string
|
/// get values from all the widgets and form a string
|
||||||
std::string construct_params();
|
std::string construct_params();
|
||||||
/// validate listings parameters and return an error message, if any
|
/// validate listings parameters and return an error message, if any
|
||||||
@ -46,13 +46,26 @@ private Q_SLOTS:
|
|||||||
private:
|
private:
|
||||||
void closeEvent(QCloseEvent * e);
|
void closeEvent(QCloseEvent * e);
|
||||||
/// parent controller
|
/// parent controller
|
||||||
ControlListings & controller();
|
Controller & controller() { return *this; }
|
||||||
/// return false if validate_listings_params returns error
|
/// return false if validate_listings_params returns error
|
||||||
bool isValid();
|
bool isValid();
|
||||||
/// Apply changes
|
/// Apply changes
|
||||||
void applyView();
|
void applyView();
|
||||||
/// update
|
/// update
|
||||||
void updateContents();
|
void updateContents();
|
||||||
|
///
|
||||||
|
bool initialiseParams(std::string const & data);
|
||||||
|
/// clean-up on hide.
|
||||||
|
void clearParams();
|
||||||
|
/// clean-up on hide.
|
||||||
|
void dispatchParams();
|
||||||
|
///
|
||||||
|
bool isBufferDependent() const { return true; }
|
||||||
|
///
|
||||||
|
void setParams(InsetListingsParams const &);
|
||||||
|
|
||||||
|
///
|
||||||
|
InsetListingsParams params_;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace frontend
|
} // namespace frontend
|
||||||
|
Loading…
Reference in New Issue
Block a user