mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-08-05 06:56:01 +02:00
Qt: Fixed problems with context menus, TQtTextEdit is not TQtAbstractScrollArea anymore.
git-svn-id: trunk@16393 -
This commit is contained in:
parent
8d90d8e406
commit
5b4d18d1f6
@ -185,6 +185,8 @@ type
|
|||||||
procedure setAttribute(const Attr: QtWidgetAttribute; const TurnOn: Boolean = True);
|
procedure setAttribute(const Attr: QtWidgetAttribute; const TurnOn: Boolean = True);
|
||||||
procedure setBackgroundRole(const ARole: QPaletteColorRole);
|
procedure setBackgroundRole(const ARole: QPaletteColorRole);
|
||||||
procedure setColor(const Value: PQColor); virtual;
|
procedure setColor(const Value: PQColor); virtual;
|
||||||
|
function getContextMenuPolicy: QtContextMenuPolicy; virtual;
|
||||||
|
procedure setContextMenuPolicy(const AValue: QtContextMenuPolicy); virtual;
|
||||||
procedure setCursor(const ACursor: QCursorH); virtual;
|
procedure setCursor(const ACursor: QCursorH); virtual;
|
||||||
procedure setEnabled(p1: Boolean);
|
procedure setEnabled(p1: Boolean);
|
||||||
procedure setFocus;
|
procedure setFocus;
|
||||||
@ -568,8 +570,9 @@ type
|
|||||||
|
|
||||||
{ TQtTextEdit }
|
{ TQtTextEdit }
|
||||||
|
|
||||||
TQtTextEdit = class(TQtAbstractScrollArea, IQtEdit)
|
TQtTextEdit = class(TQtWidget, IQtEdit)
|
||||||
private
|
private
|
||||||
|
FViewportEventHook: QObject_hookH;
|
||||||
FTextChangedHook: QTextEdit_hookH;
|
FTextChangedHook: QTextEdit_hookH;
|
||||||
FUndoAvailableHook: QTextEdit_hookH;
|
FUndoAvailableHook: QTextEdit_hookH;
|
||||||
FUndoAvailable: Boolean;
|
FUndoAvailable: Boolean;
|
||||||
@ -598,8 +601,12 @@ type
|
|||||||
public
|
public
|
||||||
procedure AttachEvents; override;
|
procedure AttachEvents; override;
|
||||||
procedure DetachEvents; override;
|
procedure DetachEvents; override;
|
||||||
|
function viewportEventFilter(Sender: QObjectH; Event: QEventH): Boolean; cdecl;
|
||||||
|
function getContextMenuPolicy: QtContextMenuPolicy; override;
|
||||||
|
procedure setContextMenuPolicy(const AValue: QtContextMenuPolicy); override;
|
||||||
procedure SignalTextChanged; cdecl;
|
procedure SignalTextChanged; cdecl;
|
||||||
procedure SignalUndoAvailable(b: Boolean); cdecl;
|
procedure SignalUndoAvailable(b: Boolean); cdecl;
|
||||||
|
procedure setScrollStyle(AScrollStyle: TScrollStyle);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{ TQtTabWidget }
|
{ TQtTabWidget }
|
||||||
@ -1312,6 +1319,8 @@ begin
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TQtWidget.InitializeWidget;
|
procedure TQtWidget.InitializeWidget;
|
||||||
|
var
|
||||||
|
QtEdit: IQtEdit;
|
||||||
begin
|
begin
|
||||||
// Creates the widget
|
// Creates the widget
|
||||||
Widget := CreateWidget(FParams);
|
Widget := CreateWidget(FParams);
|
||||||
@ -1345,6 +1354,10 @@ begin
|
|||||||
setFocusPolicy(QtNoFocus);
|
setFocusPolicy(QtNoFocus);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
// Set context menus to custom so LCL can better handle our popup menus
|
||||||
|
if Supports(Self, IQtEdit, QtEdit) then
|
||||||
|
setContextMenuPolicy(QtCustomContextMenu);
|
||||||
|
|
||||||
// Set mouse move messages policy
|
// Set mouse move messages policy
|
||||||
QWidget_setMouseTracking(Widget, True);
|
QWidget_setMouseTracking(Widget, True);
|
||||||
end;
|
end;
|
||||||
@ -2428,13 +2441,33 @@ var
|
|||||||
Msg: TLMMouse;
|
Msg: TLMMouse;
|
||||||
Modifiers: QtKeyboardModifiers;
|
Modifiers: QtKeyboardModifiers;
|
||||||
MousePos: TQtPoint;
|
MousePos: TQtPoint;
|
||||||
|
QtEdit: IQtEdit;
|
||||||
begin
|
begin
|
||||||
{$note fix for #11796, only OI is a black sheep}
|
|
||||||
if Assigned(LCLObject.PopupMenu) then
|
if Supports(Self, IQtEdit, QtEdit) then
|
||||||
begin
|
begin
|
||||||
if (Self is TQtComboBox) and (TQtComboBox(Self).FLineEdit <> nil) then
|
if Assigned(LCLObject.PopupMenu) then
|
||||||
QWidget_setContextMenuPolicy(TQtComboBox(Self).FLineEdit.Widget, QtNoContextMenu);
|
begin
|
||||||
QWidget_setContextMenuPolicy(Widget, QtNoContextMenu);
|
if getContextMenuPolicy <> QtCustomContextMenu then
|
||||||
|
setContextMenuPolicy(QtCustomContextMenu);
|
||||||
|
end else
|
||||||
|
{we must ask parent because of OI, don't know yet how to solve this.
|
||||||
|
it's bit tricky when we have TPanel->TEdit and popup is assigned to
|
||||||
|
TPanel. TEdit will show TPanel's popup instead of it's default.}
|
||||||
|
if Assigned(LCLObject.Parent) and
|
||||||
|
Assigned(LCLObject.Parent.PopupMenu) and not
|
||||||
|
(Self is TQtTextEdit) then
|
||||||
|
begin
|
||||||
|
if getContextMenuPolicy <> QtCustomContextMenu then
|
||||||
|
setContextMenuPolicy(QtCustomContextMenu);
|
||||||
|
end else
|
||||||
|
begin
|
||||||
|
{revert to default if widget supports defaultcontextmenu }
|
||||||
|
if getContextMenuPolicy <> QtDefaultContextMenu then
|
||||||
|
setContextMenuPolicy(QtDefaultContextMenu);
|
||||||
|
if Self is TQtTextEdit then
|
||||||
|
exit;
|
||||||
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
FillChar(Msg, SizeOf(Msg), #0);
|
FillChar(Msg, SizeOf(Msg), #0);
|
||||||
@ -2515,6 +2548,16 @@ begin
|
|||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
function TQtWidget.getContextMenuPolicy: QtContextMenuPolicy;
|
||||||
|
begin
|
||||||
|
Result := QWidget_contextMenuPolicy(Widget);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TQtWidget.setContextMenuPolicy(const AValue: QtContextMenuPolicy);
|
||||||
|
begin
|
||||||
|
QWidget_setContextMenuPolicy(Widget, AValue);
|
||||||
|
end;
|
||||||
|
|
||||||
{------------------------------------------------------------------------------
|
{------------------------------------------------------------------------------
|
||||||
Function: TQtWidget.SetTextColor
|
Function: TQtWidget.SetTextColor
|
||||||
Params: QColorH
|
Params: QColorH
|
||||||
@ -5048,6 +5091,7 @@ begin
|
|||||||
{$endif}
|
{$endif}
|
||||||
|
|
||||||
Result := QTextEdit_create();
|
Result := QTextEdit_create();
|
||||||
|
QWidget_setAttribute(Result, QtWA_NoMousePropagation);
|
||||||
FKeysToEat := [];
|
FKeysToEat := [];
|
||||||
FUndoAvailable := False;
|
FUndoAvailable := False;
|
||||||
end;
|
end;
|
||||||
@ -5204,21 +5248,52 @@ begin
|
|||||||
|
|
||||||
FTextChangedHook := QTextEdit_hook_create(Widget);
|
FTextChangedHook := QTextEdit_hook_create(Widget);
|
||||||
FUndoAvailableHook := QTextEdit_hook_create(Widget);
|
FUndoAvailableHook := QTextEdit_hook_create(Widget);
|
||||||
{TODO: BUG CopyUnicodeToPWideString() segfaults while calling SetLength()
|
|
||||||
workaround: add try..except around SetLength() }
|
|
||||||
QTextEdit_textChanged_Event(Method) := @SignalTextChanged;
|
QTextEdit_textChanged_Event(Method) := @SignalTextChanged;
|
||||||
QTextEdit_hook_hook_textChanged(FTextChangedHook, Method);
|
QTextEdit_hook_hook_textChanged(FTextChangedHook, Method);
|
||||||
|
|
||||||
QTextEdit_undoAvailable_Event(Method) := @SignalUndoAvailable;
|
QTextEdit_undoAvailable_Event(Method) := @SignalUndoAvailable;
|
||||||
QTextEdit_hook_hook_undoAvailable(FUndoAvailableHook, Method);
|
QTextEdit_hook_hook_undoAvailable(FUndoAvailableHook, Method);
|
||||||
|
|
||||||
|
FViewportEventHook := QObject_hook_create(QAbstractScrollArea_viewport(QTextEditH(Widget)));
|
||||||
|
TEventFilterMethod(Method) := @viewportEventFilter;
|
||||||
|
QObject_hook_hook_events(FViewportEventHook, Method);
|
||||||
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TQtTextEdit.DetachEvents;
|
procedure TQtTextEdit.DetachEvents;
|
||||||
begin
|
begin
|
||||||
|
QObject_hook_destroy(FViewportEventHook);
|
||||||
inherited DetachEvents;
|
inherited DetachEvents;
|
||||||
QTextEdit_hook_destroy(FTextChangedHook);
|
QTextEdit_hook_destroy(FTextChangedHook);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
function TQtTextEdit.viewportEventFilter(Sender: QObjectH; Event: QEventH
|
||||||
|
): Boolean; cdecl;
|
||||||
|
begin
|
||||||
|
Result := False;
|
||||||
|
QEvent_accept(Event);
|
||||||
|
case QEvent_type(Event) of
|
||||||
|
QEventContextMenu: SlotContextMenu(Sender, Event);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TQtTextEdit.getContextMenuPolicy: QtContextMenuPolicy;
|
||||||
|
var
|
||||||
|
w: QWidgetH;
|
||||||
|
begin
|
||||||
|
w := QAbstractScrollArea_viewport(QAbstractScrollAreaH(Widget));
|
||||||
|
Result := QWidget_contextMenuPolicy(w)
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TQtTextEdit.setContextMenuPolicy(const AValue: QtContextMenuPolicy);
|
||||||
|
var
|
||||||
|
w: QWidgetH;
|
||||||
|
begin
|
||||||
|
w := QAbstractScrollArea_viewport(QAbstractScrollAreaH(Widget));
|
||||||
|
QWidget_setContextMenuPolicy(w, AValue);
|
||||||
|
end;
|
||||||
|
|
||||||
{------------------------------------------------------------------------------
|
{------------------------------------------------------------------------------
|
||||||
Function: TQtTextEdit.SignalTextChanged
|
Function: TQtTextEdit.SignalTextChanged
|
||||||
Params: none
|
Params: none
|
||||||
@ -5240,6 +5315,46 @@ begin
|
|||||||
FUndoAvailable := b;
|
FUndoAvailable := b;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TQtTextEdit.setScrollStyle(AScrollStyle: TScrollStyle);
|
||||||
|
begin
|
||||||
|
{$ifdef VerboseQt}
|
||||||
|
WriteLn('TQTextEdit.setScrollStyle');
|
||||||
|
{$endif}
|
||||||
|
case AScrollStyle of
|
||||||
|
ssNone:
|
||||||
|
begin
|
||||||
|
QAbstractScrollArea_setVerticalScrollBarPolicy(QAbstractScrollAreaH(Widget), QtScrollBarAlwaysOff);
|
||||||
|
QAbstractScrollArea_setHorizontalScrollBarPolicy(QAbstractScrollAreaH(Widget), QtScrollBarAlwaysOff);
|
||||||
|
end;
|
||||||
|
ssHorizontal:
|
||||||
|
begin
|
||||||
|
QAbstractScrollArea_setHorizontalScrollBarPolicy(QAbstractScrollAreaH(Widget), QtScrollBarAlwaysOn);
|
||||||
|
end;
|
||||||
|
ssVertical:
|
||||||
|
begin
|
||||||
|
QAbstractScrollArea_setVerticalScrollBarPolicy(QAbstractScrollAreaH(Widget), QtScrollBarAlwaysOn);
|
||||||
|
end;
|
||||||
|
ssBoth:
|
||||||
|
begin
|
||||||
|
QAbstractScrollArea_setVerticalScrollBarPolicy(QAbstractScrollAreaH(Widget), QtScrollBarAlwaysOn);
|
||||||
|
QAbstractScrollArea_setHorizontalScrollBarPolicy(QAbstractScrollAreaH(Widget), QtScrollBarAlwaysOn);
|
||||||
|
end;
|
||||||
|
ssAutoHorizontal:
|
||||||
|
begin
|
||||||
|
QAbstractScrollArea_setHorizontalScrollBarPolicy(QAbstractScrollAreaH(Widget), QtScrollBarAsNeeded);
|
||||||
|
end;
|
||||||
|
ssAutoVertical:
|
||||||
|
begin
|
||||||
|
QAbstractScrollArea_setVerticalScrollBarPolicy(QAbstractScrollAreaH(Widget), QtScrollBarAsNeeded);
|
||||||
|
end;
|
||||||
|
ssAutoBoth:
|
||||||
|
begin
|
||||||
|
QAbstractScrollArea_setHorizontalScrollBarPolicy(QAbstractScrollAreaH(Widget), QtScrollBarAsNeeded);
|
||||||
|
QAbstractScrollArea_setVerticalScrollBarPolicy(QAbstractScrollAreaH(Widget), QtScrollBarAsNeeded);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
{ TQtTabWidget }
|
{ TQtTabWidget }
|
||||||
|
|
||||||
function TQtTabWidget.getTabBar: QTabBarH;
|
function TQtTabWidget.getTabBar: QTabBarH;
|
||||||
@ -5545,6 +5660,7 @@ begin
|
|||||||
if FDropList = nil then
|
if FDropList = nil then
|
||||||
begin
|
begin
|
||||||
FDropList := TQtListWidget.CreateFrom(LCLObject, QComboBox_view(QComboBoxH(Widget)));
|
FDropList := TQtListWidget.CreateFrom(LCLObject, QComboBox_view(QComboBoxH(Widget)));
|
||||||
|
FDropList.setAttribute(QtWA_NoMousePropagation, False);
|
||||||
FDropList.OwnerDrawn := OwnerDrawn;
|
FDropList.OwnerDrawn := OwnerDrawn;
|
||||||
end;
|
end;
|
||||||
Result := FDropList;
|
Result := FDropList;
|
||||||
@ -6182,6 +6298,7 @@ function TQtListWidget.CreateWidget(const AParams: TCreateParams): QWidgetH;
|
|||||||
begin
|
begin
|
||||||
Result := QListWidget_create();
|
Result := QListWidget_create();
|
||||||
FDisableSelectionChange := False;
|
FDisableSelectionChange := False;
|
||||||
|
QWidget_setAttribute(Result, QtWA_NoMousePropagation);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TQtListWidget.AttachEvents;
|
procedure TQtListWidget.AttachEvents;
|
||||||
@ -6579,6 +6696,7 @@ begin
|
|||||||
{$endif}
|
{$endif}
|
||||||
Result := QTreeWidget_create();
|
Result := QTreeWidget_create();
|
||||||
FHeader := nil;
|
FHeader := nil;
|
||||||
|
QWidget_setAttribute(Result, QtWA_NoMousePropagation);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{------------------------------------------------------------------------------
|
{------------------------------------------------------------------------------
|
||||||
|
Loading…
Reference in New Issue
Block a user