Generalize mouse event passing in FMenuItem

This commit is contained in:
Markus Gans 2018-02-22 01:15:57 +01:00
parent 8bc40459e0
commit 1435d9d362
5 changed files with 70 additions and 142 deletions

View File

@ -1,3 +1,6 @@
2017-02-22 Markus Gans <guru.mail@muenster.de>
* Generalize mouse event passing in FMenuItem
2017-02-19 Markus Gans <guru.mail@muenster.de> 2017-02-19 Markus Gans <guru.mail@muenster.de>
* Refactoring FTerm::init_termcaps * Refactoring FTerm::init_termcaps
* Refactoring FTerm::init_encoding * Refactoring FTerm::init_encoding

View File

@ -9,4 +9,4 @@ ACLOCAL_AMFLAGS = -I m4
SUBDIRS = src fonts doc examples SUBDIRS = src fonts doc examples
docdir = ${datadir}/doc/${PACKAGE} docdir = ${datadir}/doc/${PACKAGE}
doc_DATA = AUTHORS COPYING ChangeLog doc_DATA = AUTHORS COPYING COPYING.LESSER ChangeLog

View File

@ -85,8 +85,9 @@ host_triplet = @host@
subdir = . subdir = .
DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
$(top_srcdir)/configure $(am__configure_deps) \ $(top_srcdir)/configure $(am__configure_deps) \
$(srcdir)/config.h.in AUTHORS COPYING ChangeLog compile \ $(srcdir)/config.h.in AUTHORS COPYING COPYING.LESSER ChangeLog \
config.guess config.sub depcomp install-sh missing ltmain.sh compile config.guess config.sub depcomp install-sh missing \
ltmain.sh
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
am__aclocal_m4_deps = $(top_srcdir)/m4/ax_prefix_config_h.m4 \ am__aclocal_m4_deps = $(top_srcdir)/m4/ax_prefix_config_h.m4 \
$(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
@ -354,7 +355,7 @@ top_srcdir = @top_srcdir@
AUTOMAKE_OPTIONS = foreign AUTOMAKE_OPTIONS = foreign
ACLOCAL_AMFLAGS = -I m4 ACLOCAL_AMFLAGS = -I m4
SUBDIRS = src fonts doc examples SUBDIRS = src fonts doc examples
doc_DATA = AUTHORS COPYING ChangeLog doc_DATA = AUTHORS COPYING COPYING.LESSER ChangeLog
all: config.h all: config.h
$(MAKE) $(AM_MAKEFLAGS) all-recursive $(MAKE) $(AM_MAKEFLAGS) all-recursive

View File

@ -3,7 +3,7 @@
* * * *
* This file is part of the Final Cut widget toolkit * * This file is part of the Final Cut widget toolkit *
* * * *
* Copyright 2015-2017 Markus Gans * * Copyright 2015-2018 Markus Gans *
* * * *
* The Final Cut is free software; you can redistribute it and/or * * The Final Cut is free software; you can redistribute it and/or *
* modify it under the terms of the GNU Lesser General Public License * * modify it under the terms of the GNU Lesser General Public License *
@ -169,6 +169,8 @@ class FMenuItem : public FWidget
void processActivate(); void processActivate();
void processDeactivate(); void processDeactivate();
void createDialogList (FMenu*); void createDialogList (FMenu*);
template<class T>
void passMouseEvent (T, FMouseEvent*, fc::events);
// Callback methods // Callback methods
void cb_switchToDialog (FWidget*, data_ptr); void cb_switchToDialog (FWidget*, data_ptr);

View File

@ -3,7 +3,7 @@
* * * *
* This file is part of the Final Cut widget toolkit * * This file is part of the Final Cut widget toolkit *
* * * *
* Copyright 2015-2017 Markus Gans * * Copyright 2015-2018 Markus Gans *
* * * *
* The Final Cut is free software; you can redistribute it and/or * * The Final Cut is free software; you can redistribute it and/or *
* modify it under the terms of the GNU Lesser General Public License * * modify it under the terms of the GNU Lesser General Public License *
@ -341,72 +341,22 @@ void FMenuItem::onMouseDoubleClick (FMouseEvent* ev)
if ( ! super_menu ) if ( ! super_menu )
return; return;
const FPoint& t = ev->getTermPos();
int b = ev->getButton();
if ( isMenu(super_menu) ) if ( isMenu(super_menu) )
{ {
FMenu* smenu = static_cast<FMenu*>(super_menu); FMenu* smenu = static_cast<FMenu*>(super_menu);
const FPoint& p2 = smenu->termToWidgetPos(t); passMouseEvent (smenu, ev, fc::MouseDoubleClick_Event);
try
{
FMouseEvent* _ev = new FMouseEvent ( fc::MouseDoubleClick_Event
, p2, t, b );
smenu->onMouseDoubleClick(_ev);
delete _ev;
}
catch (const std::bad_alloc& ex)
{
std::cerr << "not enough memory to alloc "
<< ex.what() << std::endl;
}
} }
if ( isMenuBar(super_menu) ) if ( isMenuBar(super_menu) )
{ {
FMenuBar* mbar = static_cast<FMenuBar*>(super_menu); FMenuBar* mbar = static_cast<FMenuBar*>(super_menu);
passMouseEvent (mbar, ev, fc::MouseDoubleClick_Event);
if ( mbar )
{
const FPoint& p2 = mbar->termToWidgetPos(t);
try
{
FMouseEvent* _ev = new FMouseEvent ( fc::MouseDoubleClick_Event
, p2, t, b );
mbar->onMouseDoubleClick(_ev);
delete _ev;
}
catch (const std::bad_alloc& ex)
{
std::cerr << "not enough memory to alloc "
<< ex.what() << std::endl;
}
}
} }
if ( isWindowsMenu(super_menu) ) if ( isWindowsMenu(super_menu) )
{ {
FDialog* dgl = static_cast<FDialog*>(super_menu); FDialog* dgl = static_cast<FDialog*>(super_menu);
passMouseEvent (dgl, ev, fc::MouseDoubleClick_Event);
if ( dgl )
{
const FPoint& p2 = dgl->termToWidgetPos(t);
try
{
FMouseEvent* _ev = new FMouseEvent ( fc::MouseDoubleClick_Event
, p2, t, b );
dgl->onMouseDoubleClick(_ev);
delete _ev;
}
catch (const std::bad_alloc& ex)
{
std::cerr << "not enough memory to alloc "
<< ex.what() << std::endl;
}
}
} }
} }
@ -416,72 +366,22 @@ void FMenuItem::onMouseDown (FMouseEvent* ev)
if ( ! super_menu ) if ( ! super_menu )
return; return;
const FPoint& t = ev->getTermPos();
int b = ev->getButton();
if ( isMenu(super_menu) ) if ( isMenu(super_menu) )
{ {
FMenu* smenu = static_cast<FMenu*>(super_menu); FMenu* smenu = static_cast<FMenu*>(super_menu);
const FPoint& p2 = smenu->termToWidgetPos(t); passMouseEvent (smenu, ev, fc::MouseDown_Event);
try
{
FMouseEvent* _ev = new FMouseEvent ( fc::MouseDown_Event
, p2, t, b );
smenu->onMouseDown(_ev);
delete _ev;
}
catch (const std::bad_alloc& ex)
{
std::cerr << "not enough memory to alloc "
<< ex.what() << std::endl;
}
} }
if ( isMenuBar(super_menu) ) if ( isMenuBar(super_menu) )
{ {
FMenuBar* mbar = static_cast<FMenuBar*>(super_menu); FMenuBar* mbar = static_cast<FMenuBar*>(super_menu);
passMouseEvent (mbar, ev, fc::MouseDown_Event);
if ( mbar )
{
const FPoint& p2 = mbar->termToWidgetPos(t);
try
{
FMouseEvent* _ev = new FMouseEvent ( fc::MouseDown_Event
, p2, t, b );
mbar->onMouseDown(_ev);
delete _ev;
}
catch (const std::bad_alloc& ex)
{
std::cerr << "not enough memory to alloc "
<< ex.what() << std::endl;
}
}
} }
if ( isWindowsMenu(super_menu) ) if ( isWindowsMenu(super_menu) )
{ {
FDialog* dgl = static_cast<FDialog*>(super_menu); FDialog* dgl = static_cast<FDialog*>(super_menu);
passMouseEvent (dgl, ev, fc::MouseDown_Event);
if ( dgl )
{
const FPoint& p2 = dgl->termToWidgetPos(t);
try
{
FMouseEvent* _ev = new FMouseEvent ( fc::MouseDown_Event
, p2, t, b );
dgl->onMouseDown(_ev);
delete _ev;
}
catch (const std::bad_alloc& ex)
{
std::cerr << "not enough memory to alloc "
<< ex.what() << std::endl;
}
}
} }
} }
@ -491,34 +391,22 @@ void FMenuItem::onMouseUp (FMouseEvent* ev)
if ( ! super_menu ) if ( ! super_menu )
return; return;
const FPoint& t = ev->getTermPos();
int b = ev->getButton();
if ( isMenu(super_menu) ) if ( isMenu(super_menu) )
{ {
FMenu* smenu = static_cast<FMenu*>(super_menu); FMenu* smenu = static_cast<FMenu*>(super_menu);
const FPoint& p2 = smenu->termToWidgetPos(t); passMouseEvent (smenu, ev, fc::MouseUp_Event);
FMouseEvent* _ev = new FMouseEvent (fc::MouseUp_Event, p2, t, b);
smenu->onMouseUp(_ev);
delete _ev;
} }
if ( isMenuBar(super_menu) ) if ( isMenuBar(super_menu) )
{ {
FMenuBar* mbar = static_cast<FMenuBar*>(super_menu); FMenuBar* mbar = static_cast<FMenuBar*>(super_menu);
const FPoint& p2 = mbar->termToWidgetPos(t); passMouseEvent (mbar, ev, fc::MouseUp_Event);
FMouseEvent* _ev = new FMouseEvent (fc::MouseUp_Event, p2, t, b);
mbar->onMouseUp(_ev);
delete _ev;
} }
if ( isWindowsMenu(super_menu) ) if ( isWindowsMenu(super_menu) )
{ {
FDialog* dgl = static_cast<FDialog*>(super_menu); FDialog* dgl = static_cast<FDialog*>(super_menu);
const FPoint& p2 = dgl->termToWidgetPos(t); passMouseEvent (dgl, ev, fc::MouseUp_Event);
FMouseEvent* _ev = new FMouseEvent (fc::MouseUp_Event, p2, t, b);
dgl->onMouseUp(_ev);
delete _ev;
} }
} }
@ -528,34 +416,22 @@ void FMenuItem::onMouseMove (FMouseEvent* ev)
if ( ! super_menu ) if ( ! super_menu )
return; return;
const FPoint& t = ev->getTermPos();
int b = ev->getButton();
if ( isMenu(super_menu) ) if ( isMenu(super_menu) )
{ {
FMenu* smenu = static_cast<FMenu*>(super_menu); FMenu* smenu = static_cast<FMenu*>(super_menu);
const FPoint& p2 = smenu->termToWidgetPos(t); passMouseEvent (smenu, ev, fc::MouseMove_Event);
FMouseEvent* _ev = new FMouseEvent (fc::MouseMove_Event, p2, t, b);
smenu->onMouseMove(_ev);
delete _ev;
} }
if ( isMenuBar(super_menu) ) if ( isMenuBar(super_menu) )
{ {
FMenuBar* mbar = static_cast<FMenuBar*>(super_menu); FMenuBar* mbar = static_cast<FMenuBar*>(super_menu);
const FPoint& p2 = mbar->termToWidgetPos(t); passMouseEvent (mbar, ev, fc::MouseMove_Event);
FMouseEvent* _ev = new FMouseEvent (fc::MouseMove_Event, p2, t, b);
mbar->onMouseMove(_ev);
delete _ev;
} }
if ( isWindowsMenu(super_menu) ) if ( isWindowsMenu(super_menu) )
{ {
FDialog* dgl = static_cast<FDialog*>(super_menu); FDialog* dgl = static_cast<FDialog*>(super_menu);
const FPoint& p2 = dgl->termToWidgetPos(t); passMouseEvent (dgl, ev, fc::MouseMove_Event);
FMouseEvent* _ev = new FMouseEvent (fc::MouseMove_Event, p2, t, b);
dgl->onMouseMove(_ev);
delete _ev;
} }
} }
@ -817,6 +693,52 @@ void FMenuItem::createDialogList (FMenu* winmenu)
winmenu->calculateDimensions(); winmenu->calculateDimensions();
} }
//----------------------------------------------------------------------
template<class T>
void FMenuItem::passMouseEvent ( T widget, FMouseEvent* ev
, fc::events ev_type )
{
if ( ! widget )
return;
FMouseEvent* _ev;
const FPoint& t = ev->getTermPos();
const FPoint& p2 = widget->termToWidgetPos(t);
int b = ev->getButton();
try
{
_ev = new FMouseEvent (ev_type, p2, t, b);
}
catch (const std::bad_alloc& ex)
{
std::cerr << "not enough memory to alloc "
<< ex.what() << std::endl;
return;
}
switch ( int(ev_type) )
{
case fc::MouseDoubleClick_Event:
widget->onMouseDoubleClick(_ev);
break;
case fc::MouseDown_Event:
widget->onMouseDown(_ev);
break;
case fc::MouseUp_Event:
widget->onMouseUp(_ev);
break;
case fc::MouseMove_Event:
widget->onMouseMove(_ev);
break;
}
delete _ev;
}
//---------------------------------------------------------------------- //----------------------------------------------------------------------
void FMenuItem::cb_switchToDialog (FWidget*, data_ptr data) void FMenuItem::cb_switchToDialog (FWidget*, data_ptr data)
{ {