Refactoring of some functions
This commit is contained in:
parent
1435d9d362
commit
e0f4872d6e
|
@ -25,7 +25,8 @@
|
|||
|
||||
// function prototypes
|
||||
void cb_quit (FWidget*, FWidget::data_ptr);
|
||||
|
||||
void populateChoice (std::vector<FRadioButton*>&, FButtonGroup*);
|
||||
void preset (std::vector<FRadioButton*>&);
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
// callback functions
|
||||
|
@ -36,6 +37,52 @@ void cb_quit (FWidget*, FWidget::data_ptr data)
|
|||
dlg->close();
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
void populateChoice (std::vector<FRadioButton*>& os, FButtonGroup* group)
|
||||
{
|
||||
os[0] = new FRadioButton("AIX", group);
|
||||
os[1] = new FRadioButton("Cygwin", group);
|
||||
os[2] = new FRadioButton("FreeBSD", group);
|
||||
os[3] = new FRadioButton("HP-UX", group);
|
||||
os[4] = new FRadioButton("Linux", group);
|
||||
os[5] = new FRadioButton("Mac OS X", group);
|
||||
os[6] = new FRadioButton("NetBSD", group);
|
||||
os[7] = new FRadioButton("OpenBSD", group);
|
||||
os[8] = new FRadioButton("Solaris", group);
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
void preset (std::vector<FRadioButton*>& os)
|
||||
{
|
||||
#if defined(_AIX)
|
||||
os[0]->setChecked();
|
||||
os[0]->setFocus();
|
||||
#elif defined(__CYGWIN__)
|
||||
os[1]->setChecked();
|
||||
os[1]->setFocus();
|
||||
#elif defined(__FreeBSD__)
|
||||
os[2]->setChecked();
|
||||
os[2]->setFocus();
|
||||
#elif defined(__hpux)
|
||||
os[3]->setChecked();
|
||||
os[3]->setFocus();
|
||||
#elif defined(__linux__)
|
||||
os[4]->setChecked();
|
||||
os[4]->setFocus();
|
||||
#elif defined(__APPLE__) && defined(__MACH__)
|
||||
os[5]->setChecked();
|
||||
os[5]->setFocus();
|
||||
#elif defined(__NetBSD__)
|
||||
os[6]->setChecked();
|
||||
os[6]->setFocus();
|
||||
#elif defined(__OpenBSD__)
|
||||
os[7]->setChecked();
|
||||
os[7]->setFocus();
|
||||
#elif defined(__sun) && defined(__SVR4)
|
||||
os[8]->setChecked();
|
||||
os[8]->setFocus();
|
||||
#endif
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
// main part
|
||||
|
@ -63,57 +110,16 @@ int main (int argc, char* argv[])
|
|||
checkButtonGroup->setGeometry (2, 1, 16, 7);
|
||||
|
||||
// Create radio buttons
|
||||
FRadioButton* os1 = new FRadioButton("AIX", checkButtonGroup);
|
||||
FRadioButton* os2 = new FRadioButton("Cygwin", checkButtonGroup);
|
||||
FRadioButton* os3 = new FRadioButton("FreeBSD", checkButtonGroup);
|
||||
FRadioButton* os4 = new FRadioButton("HP-UX", checkButtonGroup);
|
||||
FRadioButton* os5 = new FRadioButton("Linux", checkButtonGroup);
|
||||
FRadioButton* os6 = new FRadioButton("Mac OS X", checkButtonGroup);
|
||||
FRadioButton* os7 = new FRadioButton("NetBSD", checkButtonGroup);
|
||||
FRadioButton* os8 = new FRadioButton("OpenBSD", checkButtonGroup);
|
||||
FRadioButton* os9 = new FRadioButton("Solaris", checkButtonGroup);
|
||||
std::vector<FRadioButton*> os (9);
|
||||
populateChoice (os, checkButtonGroup);
|
||||
|
||||
// Set the radio button geometry
|
||||
// => checkButtonGroup->setScrollSize(...) is not required
|
||||
// because a FButtonGroup is self-adjusting
|
||||
os1->setGeometry(1, 1, 12, 1);
|
||||
os2->setGeometry(1, 2, 12, 1);
|
||||
os3->setGeometry(1, 3, 12, 1);
|
||||
os4->setGeometry(1, 4, 12, 1);
|
||||
os5->setGeometry(1, 5, 12, 1);
|
||||
os6->setGeometry(1, 6, 12, 1);
|
||||
os7->setGeometry(1, 7, 12, 1);
|
||||
os8->setGeometry(1, 8, 12, 1);
|
||||
os9->setGeometry(1, 9, 12, 1);
|
||||
for (uInt i = 0; i < os.size(); i++)
|
||||
os[i]->setGeometry(1, int(1 + i), 12, 1);
|
||||
|
||||
#if defined(_AIX)
|
||||
os1->setChecked();
|
||||
os1->setFocus();
|
||||
#elif defined(__CYGWIN__)
|
||||
os2->setChecked();
|
||||
os2->setFocus();
|
||||
#elif defined(__FreeBSD__)
|
||||
os3->setChecked();
|
||||
os3->setFocus();
|
||||
#elif defined(__hpux)
|
||||
os4->setChecked();
|
||||
os4->setFocus();
|
||||
#elif defined(__linux__)
|
||||
os5->setChecked();
|
||||
os5->setFocus();
|
||||
#elif defined(__APPLE__) && defined(__MACH__)
|
||||
os6->setChecked();
|
||||
os6->setFocus();
|
||||
#elif defined(__NetBSD__)
|
||||
os7->setChecked();
|
||||
os7->setFocus();
|
||||
#elif defined(__OpenBSD__)
|
||||
os8->setChecked();
|
||||
os8->setFocus();
|
||||
#elif defined(__sun) && defined(__SVR4)
|
||||
os9->setChecked();
|
||||
os9->setFocus();
|
||||
#endif
|
||||
preset(os);
|
||||
|
||||
// Scroll to the focused child element
|
||||
FFocusEvent cfi (fc::ChildFocusIn_Event);
|
||||
|
|
|
@ -274,6 +274,10 @@ class MyDialog : public FDialog
|
|||
// Method
|
||||
void initMenu();
|
||||
void initMenuCallbacks();
|
||||
void initFileMenuCallbacks();
|
||||
void initEditMenuCallbacks();
|
||||
void initViewMenuCallbacks();
|
||||
void initHelpMenuCallback();
|
||||
void initStatusBar();
|
||||
void initStatusBarCallbacks();
|
||||
void initWidgets();
|
||||
|
@ -443,7 +447,16 @@ void MyDialog::initMenu()
|
|||
void MyDialog::initMenuCallbacks()
|
||||
{
|
||||
// Menu function callbacks
|
||||
initFileMenuCallbacks();
|
||||
initEditMenuCallbacks();
|
||||
initViewMenuCallbacks();
|
||||
initHelpMenuCallback();
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
void MyDialog::initFileMenuCallbacks()
|
||||
{
|
||||
// File menu
|
||||
Open->addCallback
|
||||
(
|
||||
"clicked",
|
||||
|
@ -456,6 +469,33 @@ void MyDialog::initMenuCallbacks()
|
|||
F_METHOD_CALLBACK (this, &FApplication::cb_exitApp)
|
||||
);
|
||||
|
||||
// System files submenu
|
||||
File1->addCallback
|
||||
(
|
||||
"clicked",
|
||||
F_METHOD_CALLBACK (this, &MyDialog::cb_view),
|
||||
static_cast<FWidget::data_ptr>(File1)
|
||||
);
|
||||
|
||||
File2->addCallback
|
||||
(
|
||||
"clicked",
|
||||
F_METHOD_CALLBACK (this, &MyDialog::cb_view),
|
||||
static_cast<FWidget::data_ptr>(File2)
|
||||
);
|
||||
|
||||
File3->addCallback
|
||||
(
|
||||
"clicked",
|
||||
F_METHOD_CALLBACK (this, &MyDialog::cb_view),
|
||||
static_cast<FWidget::data_ptr>(File3)
|
||||
);
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
void MyDialog::initEditMenuCallbacks()
|
||||
{
|
||||
// Edit menu
|
||||
Cut->addCallback
|
||||
(
|
||||
"clicked",
|
||||
|
@ -479,7 +519,12 @@ void MyDialog::initMenuCallbacks()
|
|||
"clicked",
|
||||
F_METHOD_CALLBACK (this, &MyDialog::cb_clearInput)
|
||||
);
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
void MyDialog::initViewMenuCallbacks()
|
||||
{
|
||||
// View menu
|
||||
Env->addCallback
|
||||
(
|
||||
"clicked",
|
||||
|
@ -491,33 +536,16 @@ void MyDialog::initMenuCallbacks()
|
|||
"clicked",
|
||||
F_METHOD_CALLBACK (this, &MyDialog::cb_drives)
|
||||
);
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
void MyDialog::initHelpMenuCallback()
|
||||
{
|
||||
Help->addCallback
|
||||
(
|
||||
"clicked",
|
||||
F_METHOD_CALLBACK (this, &MyDialog::cb_about)
|
||||
);
|
||||
|
||||
File1->addCallback
|
||||
(
|
||||
"clicked",
|
||||
F_METHOD_CALLBACK (this, &MyDialog::cb_view),
|
||||
static_cast<FWidget::data_ptr>(File1)
|
||||
);
|
||||
|
||||
File2->addCallback
|
||||
(
|
||||
"clicked",
|
||||
F_METHOD_CALLBACK (this, &MyDialog::cb_view),
|
||||
static_cast<FWidget::data_ptr>(File2)
|
||||
);
|
||||
|
||||
File3->addCallback
|
||||
(
|
||||
"clicked",
|
||||
F_METHOD_CALLBACK (this, &MyDialog::cb_view),
|
||||
static_cast<FWidget::data_ptr>(File3)
|
||||
);
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
|
|
|
@ -178,13 +178,17 @@ class FMenu : public FWindow, public FMenuList
|
|||
void hideSubMenus();
|
||||
void hideSuperMenus();
|
||||
bool mouseDownOverList (FPoint);
|
||||
void mouseDownSubmenu (FMenuItem*);
|
||||
void mouseDownSelection (FMenuItem*, bool&);
|
||||
bool mouseUpOverList (FPoint);
|
||||
bool mouseMoveOverList (FPoint, mouseStates&);
|
||||
void mouseMoveOverList (FPoint, mouseStates&);
|
||||
void mouseMoveSelection (FMenuItem*, mouseStates&);
|
||||
void mouseMoveDeselection (FMenuItem*, mouseStates&);
|
||||
void mouseUpOverBorder();
|
||||
void mouseMoveOverBorder (mouseStates&);
|
||||
void passEventToSubMenu (FMouseEvent*& ev);
|
||||
void passEventToSuperMenu (FMouseEvent*& ev);
|
||||
void passEventToMenuBar (FMouseEvent*& ev);
|
||||
void passEventToSubMenu (FMouseEvent*&);
|
||||
void passEventToSuperMenu (FMouseEvent*&);
|
||||
void passEventToMenuBar (FMouseEvent*&);
|
||||
bool containsMenuStructure (const FPoint&);
|
||||
bool containsMenuStructure (int, int);
|
||||
FMenu* superMenuAt (const FPoint&);
|
||||
|
|
267
src/fmenu.cpp
267
src/fmenu.cpp
|
@ -667,26 +667,26 @@ void FMenu::hideSuperMenus()
|
|||
// hide all menus to the top
|
||||
FWidget* super = getSuperMenu();
|
||||
|
||||
if ( super )
|
||||
{
|
||||
if ( isMenuBar(super) )
|
||||
{
|
||||
FMenuBar* mbar = static_cast<FMenuBar*>(super);
|
||||
if ( ! super )
|
||||
return;
|
||||
|
||||
if ( mbar->hasSelectedItem() )
|
||||
mbar->leaveMenuBar();
|
||||
}
|
||||
else if ( isMenu(super) )
|
||||
{
|
||||
FMenu* m = static_cast<FMenu*>(super);
|
||||
m->hide();
|
||||
m->hideSuperMenus();
|
||||
}
|
||||
else if ( isWindowsMenu(super) )
|
||||
{
|
||||
FDialog* dgl = static_cast<FDialog*>(super);
|
||||
dgl->leaveMenu();
|
||||
}
|
||||
if ( isMenuBar(super) )
|
||||
{
|
||||
FMenuBar* mbar = static_cast<FMenuBar*>(super);
|
||||
|
||||
if ( mbar->hasSelectedItem() )
|
||||
mbar->leaveMenuBar();
|
||||
}
|
||||
else if ( isMenu(super) )
|
||||
{
|
||||
FMenu* m = static_cast<FMenu*>(super);
|
||||
m->hide();
|
||||
m->hideSuperMenus();
|
||||
}
|
||||
else if ( isWindowsMenu(super) )
|
||||
{
|
||||
FDialog* dgl = static_cast<FDialog*>(super);
|
||||
dgl->leaveMenu();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -712,58 +712,8 @@ bool FMenu::mouseDownOverList (FPoint mouse_pos)
|
|||
&& mouse_y == y )
|
||||
{
|
||||
// Mouse pointer over item
|
||||
if ( hasSelectedItem() )
|
||||
{
|
||||
FMenuItem* sel_item = getSelectedItem();
|
||||
|
||||
if ( sel_item
|
||||
&& sel_item->hasMenu()
|
||||
&& sel_item->getMenu() == opened_sub_menu )
|
||||
{
|
||||
if ( sel_item != *iter )
|
||||
hideSubMenus();
|
||||
else
|
||||
{
|
||||
// unselect sub menu items
|
||||
opened_sub_menu->unselectItem();
|
||||
raiseWindow (opened_sub_menu);
|
||||
opened_sub_menu->redraw();
|
||||
sel_item->setFocus();
|
||||
|
||||
if ( getStatusBar() )
|
||||
getStatusBar()->drawMessage();
|
||||
|
||||
updateTerminal();
|
||||
flush_out();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ( ! (*iter)->isSelected() )
|
||||
{
|
||||
unselectItem();
|
||||
FWidget* focused_widget = getFocusWidget();
|
||||
FFocusEvent out (fc::FocusOut_Event);
|
||||
FApplication::queueEvent(focused_widget, &out);
|
||||
(*iter)->setSelected();
|
||||
setSelectedItem(*iter);
|
||||
(*iter)->setFocus();
|
||||
|
||||
if ( focused_widget )
|
||||
focused_widget->redraw();
|
||||
|
||||
if ( getStatusBar() )
|
||||
getStatusBar()->drawMessage();
|
||||
|
||||
if ( (*iter)->hasMenu() )
|
||||
{
|
||||
FMenu* sub_menu = (*iter)->getMenu();
|
||||
if ( ! sub_menu->isVisible() )
|
||||
shown_sub_menu = sub_menu;
|
||||
}
|
||||
|
||||
focus_changed = true;
|
||||
}
|
||||
mouseDownSubmenu (*iter);
|
||||
mouseDownSelection (*iter, focus_changed);
|
||||
}
|
||||
|
||||
++iter;
|
||||
|
@ -772,6 +722,66 @@ bool FMenu::mouseDownOverList (FPoint mouse_pos)
|
|||
return focus_changed;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
void FMenu::mouseDownSubmenu (FMenuItem* m_item)
|
||||
{
|
||||
if ( ! hasSelectedItem() )
|
||||
return;
|
||||
|
||||
FMenuItem* sel_item = getSelectedItem();
|
||||
|
||||
if ( ! sel_item
|
||||
|| ! sel_item->hasMenu()
|
||||
|| sel_item->getMenu() != opened_sub_menu )
|
||||
return;
|
||||
|
||||
if ( sel_item != m_item )
|
||||
hideSubMenus();
|
||||
else
|
||||
{
|
||||
// unselect sub menu items
|
||||
opened_sub_menu->unselectItem();
|
||||
raiseWindow (opened_sub_menu);
|
||||
opened_sub_menu->redraw();
|
||||
sel_item->setFocus();
|
||||
|
||||
if ( getStatusBar() )
|
||||
getStatusBar()->drawMessage();
|
||||
|
||||
updateTerminal();
|
||||
flush_out();
|
||||
}
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
void FMenu::mouseDownSelection (FMenuItem* m_item, bool& focus_changed)
|
||||
{
|
||||
if ( m_item->isSelected() )
|
||||
return;
|
||||
|
||||
unselectItem();
|
||||
FWidget* focused_widget = getFocusWidget();
|
||||
FFocusEvent out (fc::FocusOut_Event);
|
||||
FApplication::queueEvent(focused_widget, &out);
|
||||
m_item->setSelected();
|
||||
setSelectedItem(m_item);
|
||||
m_item->setFocus();
|
||||
focus_changed = true;
|
||||
|
||||
if ( focused_widget )
|
||||
focused_widget->redraw();
|
||||
|
||||
if ( getStatusBar() )
|
||||
getStatusBar()->drawMessage();
|
||||
|
||||
if ( m_item->hasMenu() )
|
||||
{
|
||||
FMenu* sub_menu = m_item->getMenu();
|
||||
if ( ! sub_menu->isVisible() )
|
||||
shown_sub_menu = sub_menu;
|
||||
}
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
bool FMenu::mouseUpOverList (FPoint mouse_pos)
|
||||
{
|
||||
|
@ -833,10 +843,9 @@ bool FMenu::mouseUpOverList (FPoint mouse_pos)
|
|||
}
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
bool FMenu::mouseMoveOverList (FPoint mouse_pos, mouseStates& ms)
|
||||
void FMenu::mouseMoveOverList (FPoint mouse_pos, mouseStates& ms)
|
||||
{
|
||||
std::vector<FMenuItem*>::const_iterator iter, last;
|
||||
bool isOverList = false;
|
||||
iter = item_list.begin();
|
||||
last = item_list.end();
|
||||
mouse_pos -= FPoint(getRightPadding(), getTopPadding());
|
||||
|
@ -849,67 +858,67 @@ bool FMenu::mouseMoveOverList (FPoint mouse_pos, mouseStates& ms)
|
|||
, mouse_x = mouse_pos.getX()
|
||||
, mouse_y = mouse_pos.getY();
|
||||
|
||||
if ( mouse_x >= x1
|
||||
&& mouse_x < x2
|
||||
&& mouse_y == y )
|
||||
{
|
||||
if ( (*iter)->isEnabled()
|
||||
&& ! (*iter)->isSelected()
|
||||
&& ! (*iter)->isSeparator() )
|
||||
{
|
||||
// Mouse pointer over item
|
||||
FWidget* focused_widget = getFocusWidget();
|
||||
FFocusEvent out (fc::FocusOut_Event);
|
||||
FApplication::queueEvent(focused_widget, &out);
|
||||
(*iter)->setSelected();
|
||||
setSelectedItem(*iter);
|
||||
(*iter)->setFocus();
|
||||
|
||||
if ( focused_widget )
|
||||
focused_widget->redraw();
|
||||
|
||||
if ( getStatusBar() )
|
||||
getStatusBar()->drawMessage();
|
||||
|
||||
// Sub menu handling
|
||||
if ( (*iter)->hasMenu() )
|
||||
{
|
||||
FMenu* sub_menu = (*iter)->getMenu();
|
||||
|
||||
if ( ! sub_menu->isVisible() )
|
||||
shown_sub_menu = sub_menu;
|
||||
}
|
||||
else if ( opened_sub_menu )
|
||||
ms.hide_sub_menu = true;
|
||||
|
||||
ms.focus_changed = true;
|
||||
}
|
||||
|
||||
if ( ! (*iter)->isSeparator() )
|
||||
isOverList = true;
|
||||
}
|
||||
if ( mouse_x >= x1 && mouse_x < x2 && mouse_y == y )
|
||||
mouseMoveSelection (*iter, ms);
|
||||
else
|
||||
{
|
||||
if ( ms.mouse_over_menu
|
||||
&& (*iter)->isEnabled()
|
||||
&& (*iter)->isSelected()
|
||||
&& ! ms.mouse_over_submenu )
|
||||
{
|
||||
// Unselect selected item without mouse focus
|
||||
(*iter)->unsetSelected();
|
||||
(*iter)->unsetFocus();
|
||||
|
||||
if ( getSelectedItem() == *iter )
|
||||
setSelectedItem(0);
|
||||
|
||||
ms.focus_changed = true;
|
||||
}
|
||||
}
|
||||
mouseMoveDeselection (*iter, ms);
|
||||
|
||||
++iter;
|
||||
}
|
||||
}
|
||||
|
||||
return isOverList;
|
||||
//----------------------------------------------------------------------
|
||||
void FMenu::mouseMoveSelection (FMenuItem* m_item, mouseStates& ms)
|
||||
{
|
||||
if ( ! m_item->isEnabled()
|
||||
|| m_item->isSelected()
|
||||
|| m_item->isSeparator() )
|
||||
return;
|
||||
|
||||
// Mouse pointer over item
|
||||
FWidget* focused_widget = getFocusWidget();
|
||||
FFocusEvent out (fc::FocusOut_Event);
|
||||
FApplication::queueEvent(focused_widget, &out);
|
||||
m_item->setSelected();
|
||||
setSelectedItem(m_item);
|
||||
m_item->setFocus();
|
||||
ms.focus_changed = true;
|
||||
|
||||
if ( focused_widget )
|
||||
focused_widget->redraw();
|
||||
|
||||
if ( getStatusBar() )
|
||||
getStatusBar()->drawMessage();
|
||||
|
||||
// Sub menu handling
|
||||
if ( m_item->hasMenu() )
|
||||
{
|
||||
FMenu* sub_menu = m_item->getMenu();
|
||||
|
||||
if ( ! sub_menu->isVisible() )
|
||||
shown_sub_menu = sub_menu;
|
||||
}
|
||||
else if ( opened_sub_menu )
|
||||
ms.hide_sub_menu = true;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
void FMenu::mouseMoveDeselection (FMenuItem* m_item, mouseStates& ms)
|
||||
{
|
||||
if ( ! ms.mouse_over_menu
|
||||
|| ! m_item->isEnabled()
|
||||
|| ! m_item->isSelected()
|
||||
|| ms.mouse_over_submenu )
|
||||
return;
|
||||
|
||||
// Unselect selected item without mouse focus
|
||||
m_item->unsetSelected();
|
||||
m_item->unsetFocus();
|
||||
|
||||
if ( getSelectedItem() == m_item )
|
||||
setSelectedItem(0);
|
||||
|
||||
ms.focus_changed = true;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
|
|
|
@ -117,7 +117,9 @@ FObject* FObject::getChild (int index) const
|
|||
//----------------------------------------------------------------------
|
||||
bool FObject::isChild (FObject* obj) const
|
||||
{
|
||||
while ( FObject* p_obj = obj->getParent() )
|
||||
FObject* p_obj = 0;
|
||||
|
||||
while ( obj && (p_obj = obj->getParent()) )
|
||||
{
|
||||
obj = p_obj;
|
||||
|
||||
|
|
|
@ -295,10 +295,10 @@ void FTextView::insert (const FString& str, int pos)
|
|||
vbar->setPageSize (int(getRows()), getTextHeight());
|
||||
vbar->calculateSliderValues();
|
||||
|
||||
if ( ! vbar->isVisible() && int(getRows()) >= getTextHeight() + 1 )
|
||||
if ( ! vbar->isVisible() && int(getRows()) > getTextHeight() )
|
||||
vbar->setVisible();
|
||||
|
||||
if ( vbar->isVisible() && int(getRows()) < getTextHeight() + 1 )
|
||||
if ( vbar->isVisible() && int(getRows()) <= getTextHeight() )
|
||||
vbar->hide();
|
||||
|
||||
processChanged();
|
||||
|
|
Loading…
Reference in New Issue