Based on the original LGPL 2.1 QtCurve code from Craig Drummond <craig.p.drummond@gmail.com> available at https://github.com/KDE/qtcurve Signed-off-by: TCH <tch@protonmail.com> Signed-off-by: Michele Calgaro <michele.calgaro@yahoo.it>pull/4/head
parent
82fe64d550
commit
f77e5f19e6
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,188 @@
|
||||
/*
|
||||
QtCurve (C) Craig Drummond, 2007 - 2010 craig.p.drummond@gmail.com
|
||||
|
||||
----
|
||||
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public
|
||||
License version 2 as published by the Free Software Foundation.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; see the file COPYING. If not, write to
|
||||
the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
||||
Boston, MA 02110-1301, USA.
|
||||
*/
|
||||
|
||||
#include "shortcuthandler.h"
|
||||
#include <tqpopupmenu.h>
|
||||
#include <tqapplication.h>
|
||||
#include <tqobjectlist.h>
|
||||
#include <tqmainwindow.h>
|
||||
#include <tqdialog.h>
|
||||
#include <tqstyle.h>
|
||||
|
||||
ShortcutHandler::ShortcutHandler(TQObject *parent)
|
||||
: TQObject(parent)
|
||||
, itsAltDown(false)
|
||||
{
|
||||
}
|
||||
|
||||
ShortcutHandler::~ShortcutHandler()
|
||||
{
|
||||
}
|
||||
|
||||
bool ShortcutHandler::hasSeenAlt(const TQWidget *widget) const
|
||||
{
|
||||
if(widget && !widget->isEnabled())
|
||||
return false;
|
||||
|
||||
if(::tqqt_cast<const TQPopupMenu *>(widget))
|
||||
return itsOpenMenus.count() && itsOpenMenus.last()==widget;
|
||||
else
|
||||
return itsOpenMenus.isEmpty() && itsSeenAlt.contains((TQWidget *)(widget->topLevelWidget()));
|
||||
/* return false;
|
||||
{
|
||||
const TQWidget *w=widget;
|
||||
|
||||
while(w)
|
||||
{
|
||||
if(itsSeenAlt.contains((TQWidget *)w))
|
||||
return true;
|
||||
w=w->parentWidget();
|
||||
}
|
||||
}
|
||||
if(itsHandlePopupsOnly)
|
||||
return false;
|
||||
widget = widget->topLevelWidget();
|
||||
return itsSeenAlt.contains((TQWidget *)widget);*/
|
||||
}
|
||||
|
||||
bool ShortcutHandler::showShortcut(const TQWidget *widget) const
|
||||
{
|
||||
return itsAltDown && hasSeenAlt(widget);
|
||||
}
|
||||
|
||||
void ShortcutHandler::widgetDestroyed(TQObject *o)
|
||||
{
|
||||
itsUpdated.remove(static_cast<TQWidget *>(o));
|
||||
itsOpenMenus.remove(static_cast<TQWidget *>(o));
|
||||
}
|
||||
|
||||
void ShortcutHandler::updateWidget(TQWidget *w)
|
||||
{
|
||||
if(!itsUpdated.contains(w))
|
||||
{
|
||||
connect(w, SIGNAL(destroyed(TQObject *)), this, SLOT(widgetDestroyed(TQObject *)));
|
||||
itsUpdated.append(w);
|
||||
w->repaint(TRUE);
|
||||
}
|
||||
}
|
||||
|
||||
void ShortcutHandler::setSeenAlt(TQWidget *w)
|
||||
{
|
||||
if(!itsSeenAlt.contains(w))
|
||||
itsSeenAlt.append(w);
|
||||
}
|
||||
|
||||
bool ShortcutHandler::eventFilter(TQObject *o, TQEvent *e)
|
||||
{
|
||||
if (!o->isWidgetType())
|
||||
return TQObject::eventFilter(o, e);
|
||||
|
||||
TQWidget *widget = ::tqqt_cast<TQWidget*>(o);
|
||||
switch(e->type())
|
||||
{
|
||||
case TQEvent::KeyPress:
|
||||
if (Key_Alt==((TQKeyEvent*)e)->key())
|
||||
{
|
||||
itsAltDown = true;
|
||||
|
||||
if(::tqqt_cast<TQPopupMenu *>(widget))
|
||||
{
|
||||
setSeenAlt(widget);
|
||||
updateWidget(widget);
|
||||
if(widget->parentWidget() && widget->parentWidget()->topLevelWidget())
|
||||
itsSeenAlt.append(widget->parentWidget()->topLevelWidget());
|
||||
}
|
||||
else
|
||||
{
|
||||
widget = widget->topLevelWidget();
|
||||
setSeenAlt(widget);
|
||||
|
||||
// Alt has been pressed - find all widgets that care
|
||||
TQObjectList *l = widget->queryList("TQWidget");
|
||||
TQObjectListIt it( *l );
|
||||
TQWidget *w;
|
||||
while ((w = (TQWidget *)it.current()) != 0)
|
||||
{
|
||||
++it;
|
||||
if (!(w->isTopLevel() || !w->isVisible())) // || w->style().styleHint(QStyle::SH_UnderlineAccelerator, w)))
|
||||
updateWidget(w);
|
||||
}
|
||||
delete l;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case TQEvent::WindowDeactivate:
|
||||
case TQEvent::KeyRelease:
|
||||
if (TQEvent::WindowDeactivate==e->type() || Key_Alt==static_cast<TQKeyEvent*>(e)->key())
|
||||
{
|
||||
itsAltDown = false;
|
||||
TQValueList<TQWidget *>::const_iterator it(itsUpdated.begin()),
|
||||
end(itsUpdated.end());
|
||||
|
||||
for (; it!=end; ++it)
|
||||
(*it)->repaint(TRUE);
|
||||
if(!itsUpdated.contains(widget))
|
||||
widget->repaint(TRUE);
|
||||
itsSeenAlt.clear();
|
||||
itsUpdated.clear();
|
||||
}
|
||||
break;
|
||||
case TQEvent::Show:
|
||||
if(::tqqt_cast<TQPopupMenu *>(widget))
|
||||
{
|
||||
TQWidget *prev=itsOpenMenus.count() ? itsOpenMenus.last() : 0L;
|
||||
itsOpenMenus.append(widget);
|
||||
if(itsAltDown && prev)
|
||||
prev->repaint(TRUE);
|
||||
connect(widget, SIGNAL(destroyed(TQObject *)), this, SLOT(widgetDestroyed(TQObject *)));
|
||||
}
|
||||
break;
|
||||
case TQEvent::Hide:
|
||||
if(::tqqt_cast<TQPopupMenu *>(widget))
|
||||
{
|
||||
itsSeenAlt.remove(widget);
|
||||
itsUpdated.remove(widget);
|
||||
itsOpenMenus.remove(widget);
|
||||
if(itsAltDown)
|
||||
{
|
||||
if(itsOpenMenus.count())
|
||||
itsOpenMenus.last()->repaint(TRUE);
|
||||
else if(widget->parentWidget() && widget->parentWidget()->topLevelWidget())
|
||||
widget->parentWidget()->topLevelWidget()->repaint(TRUE);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case TQEvent::Close:
|
||||
// Reset widget when closing
|
||||
itsSeenAlt.remove(widget);
|
||||
itsUpdated.remove(widget);
|
||||
itsSeenAlt.remove(widget->topLevelWidget());
|
||||
itsOpenMenus.remove(widget);
|
||||
if(itsAltDown && itsOpenMenus.count())
|
||||
itsOpenMenus.last()->repaint(TRUE);
|
||||
break;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return TQObject::eventFilter(o, e);
|
||||
}
|
||||
|
||||
#include "shortcuthandler.moc"
|
@ -0,0 +1,62 @@
|
||||
#ifndef __SHORTCUT_HANDLER_H__
|
||||
#define __SHORTCUT_HANDLER_H__
|
||||
|
||||
/*
|
||||
QtCurve (C) Craig Drummond, 2007 - 2010 craig.p.drummond@gmail.com
|
||||
|
||||
----
|
||||
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public
|
||||
License version 2 as published by the Free Software Foundation.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; see the file COPYING. If not, write to
|
||||
the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
||||
Boston, MA 02110-1301, USA.
|
||||
*/
|
||||
|
||||
#include <tqobject.h>
|
||||
#include <tqvaluelist.h>
|
||||
#include <tqevent.h>
|
||||
|
||||
class TQWidget;
|
||||
|
||||
class ShortcutHandler : public TQObject
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
|
||||
explicit ShortcutHandler(TQObject *parent = 0);
|
||||
virtual ~ShortcutHandler();
|
||||
|
||||
bool hasSeenAlt(const TQWidget *widget) const;
|
||||
bool isAltDown() const { return itsAltDown; }
|
||||
bool showShortcut(const TQWidget *widget) const;
|
||||
|
||||
private slots:
|
||||
|
||||
void widgetDestroyed(TQObject *o);
|
||||
|
||||
protected:
|
||||
|
||||
void updateWidget(TQWidget *w);
|
||||
void setSeenAlt(TQWidget *w);
|
||||
bool eventFilter(TQObject *watched, TQEvent *event);
|
||||
|
||||
private:
|
||||
|
||||
bool itsAltDown;
|
||||
TQValueList<TQWidget *> itsSeenAlt,
|
||||
itsUpdated,
|
||||
itsOpenMenus;
|
||||
|
||||
};
|
||||
|
||||
#endif
|
Loading…
Reference in new issue