mirror of
https://github.com/NohamR/Reclass.git
synced 2026-05-10 19:59:21 +00:00
190 lines
4.6 KiB
C++
190 lines
4.6 KiB
C++
// The implementation of various Qt version independent classes used by the
|
|
// rest of the port.
|
|
//
|
|
// Copyright (c) 2023 Riverbank Computing Limited <info@riverbankcomputing.com>
|
|
//
|
|
// This file is part of QScintilla.
|
|
//
|
|
// This file may be used under the terms of the GNU General Public License
|
|
// version 3.0 as published by the Free Software Foundation and appearing in
|
|
// the file LICENSE included in the packaging of this file. Please review the
|
|
// following information to ensure the GNU General Public License version 3.0
|
|
// requirements will be met: http://www.gnu.org/copyleft/gpl.html.
|
|
//
|
|
// If you do not wish to use this file under the terms of the GPL version 3.0
|
|
// then you may purchase a commercial license. For more information contact
|
|
// info@riverbankcomputing.com.
|
|
//
|
|
// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
|
|
// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
|
|
|
|
|
#include "SciClasses.h"
|
|
|
|
#include <QCoreApplication>
|
|
#include <QKeyEvent>
|
|
#include <QListWidgetItem>
|
|
#include <QMouseEvent>
|
|
#include <QPainter>
|
|
#include <QPaintEvent>
|
|
|
|
#include "ScintillaQt.h"
|
|
#include "ListBoxQt.h"
|
|
|
|
|
|
// Create a call tip.
|
|
QsciSciCallTip::QsciSciCallTip(QWidget *parent, QsciScintillaQt *sci_)
|
|
: QWidget(parent, Qt::WindowFlags(Qt::Popup|Qt::FramelessWindowHint|Qt::WA_StaticContents)),
|
|
sci(sci_)
|
|
{
|
|
// Ensure that the main window keeps the focus (and the caret flashing)
|
|
// when this is displayed.
|
|
setFocusProxy(parent);
|
|
}
|
|
|
|
|
|
// Destroy a call tip.
|
|
QsciSciCallTip::~QsciSciCallTip()
|
|
{
|
|
// Ensure that the main window doesn't receive a focus out event when
|
|
// this is destroyed.
|
|
setFocusProxy(0);
|
|
}
|
|
|
|
|
|
// Paint a call tip.
|
|
void QsciSciCallTip::paintEvent(QPaintEvent *)
|
|
{
|
|
Scintilla::Surface *surfaceWindow = Scintilla::Surface::Allocate(
|
|
SC_TECHNOLOGY_DEFAULT);
|
|
|
|
if (!surfaceWindow)
|
|
return;
|
|
|
|
QPainter p(this);
|
|
|
|
surfaceWindow->Init(&p);
|
|
surfaceWindow->SetUnicodeMode(sci->CodePage() == SC_CP_UTF8);
|
|
sci->ct.PaintCT(surfaceWindow);
|
|
|
|
delete surfaceWindow;
|
|
}
|
|
|
|
|
|
// Handle a mouse press in a call tip.
|
|
void QsciSciCallTip::mousePressEvent(QMouseEvent *e)
|
|
{
|
|
Scintilla::Point pt;
|
|
|
|
pt.x = e->x();
|
|
pt.y = e->y();
|
|
|
|
sci->ct.MouseClick(pt);
|
|
sci->CallTipClick();
|
|
|
|
update();
|
|
}
|
|
|
|
|
|
// Create the popup instance.
|
|
QsciSciPopup::QsciSciPopup()
|
|
{
|
|
// Set up the mapper.
|
|
connect(&mapper, SIGNAL(mapped(int)), this, SLOT(on_triggered(int)));
|
|
}
|
|
|
|
|
|
// Add an item and associated command to the popup and enable it if required.
|
|
void QsciSciPopup::addItem(const QString &label, int cmd, bool enabled,
|
|
QsciScintillaQt *sci_)
|
|
{
|
|
QAction *act = addAction(label, &mapper, SLOT(map()));
|
|
mapper.setMapping(act, cmd);
|
|
act->setEnabled(enabled);
|
|
sci = sci_;
|
|
}
|
|
|
|
|
|
// A slot to handle a menu action being triggered.
|
|
void QsciSciPopup::on_triggered(int cmd)
|
|
{
|
|
sci->Command(cmd);
|
|
}
|
|
|
|
|
|
QsciSciListBox::QsciSciListBox(QWidget *parent, QsciListBoxQt *lbx_)
|
|
: QListWidget(parent), lbx(lbx_)
|
|
{
|
|
setAttribute(Qt::WA_StaticContents);
|
|
|
|
#if defined(Q_OS_WIN)
|
|
setWindowFlags(Qt::Tool|Qt::FramelessWindowHint);
|
|
|
|
// This stops the main widget losing focus when the user clicks on this one
|
|
// (which prevents this one being destroyed).
|
|
setFocusPolicy(Qt::NoFocus);
|
|
#else
|
|
// This is the root of the focus problems under Gnome's window manager. We
|
|
// have tried many flag combinations in the past. The consensus now seems
|
|
// to be that the following works. However it might now work because of a
|
|
// change in Qt so we only enable it for recent versions in order to
|
|
// reduce the risk of breaking something that works with earlier versions.
|
|
setWindowFlags(Qt::ToolTip|Qt::WindowStaysOnTopHint);
|
|
|
|
// This may not be needed.
|
|
setFocusProxy(parent);
|
|
#endif
|
|
|
|
setFrameShape(StyledPanel);
|
|
setFrameShadow(Plain);
|
|
}
|
|
|
|
|
|
QsciSciListBox::~QsciSciListBox()
|
|
{
|
|
// Ensure that the main widget doesn't get a focus out event when this is
|
|
// destroyed.
|
|
setFocusProxy(0);
|
|
}
|
|
|
|
|
|
void QsciSciListBox::addItemPixmap(const QPixmap &pm, const QString &txt)
|
|
{
|
|
new QListWidgetItem(pm, txt, this);
|
|
}
|
|
|
|
|
|
int QsciSciListBox::find(const QString &prefix)
|
|
{
|
|
QList<QListWidgetItem *> itms = findItems(prefix,
|
|
Qt::MatchStartsWith|Qt::MatchCaseSensitive);
|
|
|
|
if (itms.size() == 0)
|
|
return -1;
|
|
|
|
return row(itms[0]);
|
|
}
|
|
|
|
|
|
QString QsciSciListBox::text(int n)
|
|
{
|
|
QListWidgetItem *itm = item(n);
|
|
|
|
if (!itm)
|
|
return QString();
|
|
|
|
return itm->text();
|
|
}
|
|
|
|
|
|
void QsciSciListBox::mouseDoubleClickEvent(QMouseEvent *)
|
|
{
|
|
lbx->handleDoubleClick();
|
|
}
|
|
|
|
|
|
void QsciSciListBox::mouseReleaseEvent(QMouseEvent *)
|
|
{
|
|
lbx->handleRelease();
|
|
}
|