forked from Mirrors/openclonk
Qt Editor: Add viewport context menu
parent
7d43d364d0
commit
e7be7d6acd
|
@ -85,6 +85,8 @@ IDS_CNS_SCENARIOSAVED=Szenario gespeichert.
|
||||||
IDS_CNS_SCENARIOSETTINGS=Szenarieneinstellungen
|
IDS_CNS_SCENARIOSETTINGS=Szenarieneinstellungen
|
||||||
IDS_CNS_SCRIPT=Script
|
IDS_CNS_SCRIPT=Script
|
||||||
IDS_CNS_SCRIPTCREATEDOBJECTS=Das Script dieses Szenarios hat beim Start der Runde Objekte erschaffen.
|
IDS_CNS_SCRIPTCREATEDOBJECTS=Das Script dieses Szenarios hat beim Start der Runde Objekte erschaffen.
|
||||||
|
IDS_CNS_SELECTNEARBYOBJECTS=Objekt auswählen
|
||||||
|
IDS_CNS_SELECTCONTENTS=%s Inhalt...
|
||||||
IDS_CNS_TITLE=Titel
|
IDS_CNS_TITLE=Titel
|
||||||
IDS_CNS_TRUE=Ja
|
IDS_CNS_TRUE=Ja
|
||||||
IDS_CNS_TYPE=Typ: %s (%s)
|
IDS_CNS_TYPE=Typ: %s (%s)
|
||||||
|
|
|
@ -85,6 +85,8 @@ IDS_CNS_SCENARIOSAVED=Scenario saved.
|
||||||
IDS_CNS_SCENARIOSETTINGS=Scenario settings
|
IDS_CNS_SCENARIOSETTINGS=Scenario settings
|
||||||
IDS_CNS_SCRIPT=Script
|
IDS_CNS_SCRIPT=Script
|
||||||
IDS_CNS_SCRIPTCREATEDOBJECTS=This scenario's script has created objects on initialization.
|
IDS_CNS_SCRIPTCREATEDOBJECTS=This scenario's script has created objects on initialization.
|
||||||
|
IDS_CNS_SELECTNEARBYOBJECTS=Select object
|
||||||
|
IDS_CNS_SELECTCONTENTS=%s contents...
|
||||||
IDS_CNS_TITLE=Title
|
IDS_CNS_TITLE=Title
|
||||||
IDS_CNS_TRUE=Yes
|
IDS_CNS_TRUE=Yes
|
||||||
IDS_CNS_TYPE=Type: %s (%s)
|
IDS_CNS_TYPE=Type: %s (%s)
|
||||||
|
|
|
@ -975,6 +975,33 @@
|
||||||
<string>MAP_STATICFLAT_TIP</string>
|
<string>MAP_STATICFLAT_TIP</string>
|
||||||
</property>
|
</property>
|
||||||
</action>
|
</action>
|
||||||
|
<action name="actionDeleteObject">
|
||||||
|
<property name="text">
|
||||||
|
<string comment="res">IDS_MNU_DELETE</string>
|
||||||
|
</property>
|
||||||
|
<property name="toolTip">
|
||||||
|
<string comment="res">IDS_MNU_DELETE</string>
|
||||||
|
</property>
|
||||||
|
<property name="shortcut">
|
||||||
|
<string>Del</string>
|
||||||
|
</property>
|
||||||
|
</action>
|
||||||
|
<action name="actionDuplicateObject">
|
||||||
|
<property name="text">
|
||||||
|
<string comment="res">IDS_MNU_DUPLICATE</string>
|
||||||
|
</property>
|
||||||
|
<property name="toolTip">
|
||||||
|
<string comment="res">IDS_MNU_DUPLICATE</string>
|
||||||
|
</property>
|
||||||
|
</action>
|
||||||
|
<action name="actionEjectContents">
|
||||||
|
<property name="text">
|
||||||
|
<string comment="res">IDS_MNU_CONTENTS</string>
|
||||||
|
</property>
|
||||||
|
<property name="toolTip">
|
||||||
|
<string comment="res">IDS_MNU_CONTENTS</string>
|
||||||
|
</property>
|
||||||
|
</action>
|
||||||
</widget>
|
</widget>
|
||||||
<resources>
|
<resources>
|
||||||
<include location="resource.qrc"/>
|
<include location="resource.qrc"/>
|
||||||
|
@ -1540,6 +1567,54 @@
|
||||||
</hint>
|
</hint>
|
||||||
</hints>
|
</hints>
|
||||||
</connection>
|
</connection>
|
||||||
|
<connection>
|
||||||
|
<sender>actionDeleteObject</sender>
|
||||||
|
<signal>triggered(bool)</signal>
|
||||||
|
<receiver>MainWindow</receiver>
|
||||||
|
<slot>SelectionDelete()</slot>
|
||||||
|
<hints>
|
||||||
|
<hint type="sourcelabel">
|
||||||
|
<x>-1</x>
|
||||||
|
<y>-1</y>
|
||||||
|
</hint>
|
||||||
|
<hint type="destinationlabel">
|
||||||
|
<x>477</x>
|
||||||
|
<y>312</y>
|
||||||
|
</hint>
|
||||||
|
</hints>
|
||||||
|
</connection>
|
||||||
|
<connection>
|
||||||
|
<sender>actionDuplicateObject</sender>
|
||||||
|
<signal>triggered()</signal>
|
||||||
|
<receiver>MainWindow</receiver>
|
||||||
|
<slot>SelectionDuplicate()</slot>
|
||||||
|
<hints>
|
||||||
|
<hint type="sourcelabel">
|
||||||
|
<x>-1</x>
|
||||||
|
<y>-1</y>
|
||||||
|
</hint>
|
||||||
|
<hint type="destinationlabel">
|
||||||
|
<x>477</x>
|
||||||
|
<y>312</y>
|
||||||
|
</hint>
|
||||||
|
</hints>
|
||||||
|
</connection>
|
||||||
|
<connection>
|
||||||
|
<sender>actionEjectContents</sender>
|
||||||
|
<signal>triggered()</signal>
|
||||||
|
<receiver>MainWindow</receiver>
|
||||||
|
<slot>SelectionEjectContents()</slot>
|
||||||
|
<hints>
|
||||||
|
<hint type="sourcelabel">
|
||||||
|
<x>-1</x>
|
||||||
|
<y>-1</y>
|
||||||
|
</hint>
|
||||||
|
<hint type="destinationlabel">
|
||||||
|
<x>477</x>
|
||||||
|
<y>312</y>
|
||||||
|
</hint>
|
||||||
|
</hints>
|
||||||
|
</connection>
|
||||||
</connections>
|
</connections>
|
||||||
<slots>
|
<slots>
|
||||||
<slot>PlayPressed(bool)</slot>
|
<slot>PlayPressed(bool)</slot>
|
||||||
|
@ -1576,5 +1651,8 @@
|
||||||
<slot>AddArrayElement()</slot>
|
<slot>AddArrayElement()</slot>
|
||||||
<slot>RemoveArrayElement()</slot>
|
<slot>RemoveArrayElement()</slot>
|
||||||
<slot>StaticFlatLandscapePressed(bool)</slot>
|
<slot>StaticFlatLandscapePressed(bool)</slot>
|
||||||
|
<slot>SelectionDelete()</slot>
|
||||||
|
<slot>SelectionDuplicate()</slot>
|
||||||
|
<slot>SelectionEjectContents()</slot>
|
||||||
</slots>
|
</slots>
|
||||||
</ui>
|
</ui>
|
||||||
|
|
|
@ -420,6 +420,21 @@ void C4ConsoleQtMainWindow::WelcomeLinkActivated(const QString &link)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void C4ConsoleQtMainWindow::SelectionDelete()
|
||||||
|
{
|
||||||
|
::Console.EditCursor.Delete();
|
||||||
|
}
|
||||||
|
|
||||||
|
void C4ConsoleQtMainWindow::SelectionDuplicate()
|
||||||
|
{
|
||||||
|
::Console.EditCursor.Duplicate();
|
||||||
|
}
|
||||||
|
|
||||||
|
void C4ConsoleQtMainWindow::SelectionEjectContents()
|
||||||
|
{
|
||||||
|
::Console.EditCursor.GrabContents();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* Common C4ConsoleGUI interface */
|
/* Common C4ConsoleGUI interface */
|
||||||
|
|
|
@ -141,6 +141,10 @@ public slots:
|
||||||
void BackgroundMaterialChanged(const QString &new_selection);
|
void BackgroundMaterialChanged(const QString &new_selection);
|
||||||
// Links on welcome page
|
// Links on welcome page
|
||||||
void WelcomeLinkActivated(const QString &link);
|
void WelcomeLinkActivated(const QString &link);
|
||||||
|
// Object context menu
|
||||||
|
void SelectionDelete();
|
||||||
|
void SelectionDuplicate();
|
||||||
|
void SelectionEjectContents();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -23,10 +23,12 @@
|
||||||
#include "editor/C4Console.h"
|
#include "editor/C4Console.h"
|
||||||
#include "editor/C4ConsoleQtShapes.h"
|
#include "editor/C4ConsoleQtShapes.h"
|
||||||
#include "game/C4Viewport.h"
|
#include "game/C4Viewport.h"
|
||||||
|
#include "object/C4Object.h"
|
||||||
#include "editor/C4ViewportWindow.h"
|
#include "editor/C4ViewportWindow.h"
|
||||||
#include "editor/C4Console.h"
|
#include "editor/C4Console.h"
|
||||||
#include "gui/C4MouseControl.h"
|
#include "gui/C4MouseControl.h"
|
||||||
#include "landscape/C4Landscape.h"
|
#include "landscape/C4Landscape.h"
|
||||||
|
#include "object/C4GameObjects.h"
|
||||||
|
|
||||||
/* Console viewports */
|
/* Console viewports */
|
||||||
|
|
||||||
|
@ -36,9 +38,12 @@ C4ConsoleQtViewportView::C4ConsoleQtViewportView(class C4ConsoleQtViewportScroll
|
||||||
setAttribute(Qt::WA_ShowWithoutActivating, true);
|
setAttribute(Qt::WA_ShowWithoutActivating, true);
|
||||||
setFocusPolicy(Qt::WheelFocus);
|
setFocusPolicy(Qt::WheelFocus);
|
||||||
setMouseTracking(true);
|
setMouseTracking(true);
|
||||||
|
setContextMenuPolicy(Qt::CustomContextMenu);
|
||||||
// Register for viewport
|
// Register for viewport
|
||||||
C4ViewportWindow *window = dock->cvp;
|
C4ViewportWindow *window = dock->cvp;
|
||||||
window->glwidget = this;
|
window->glwidget = this;
|
||||||
|
// Enable context menu
|
||||||
|
connect(this, &QWidget::customContextMenuRequested, this, &C4ConsoleQtViewportView::ShowContextMenu);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool C4ConsoleQtViewportView::IsPlayViewport() const
|
bool C4ConsoleQtViewportView::IsPlayViewport() const
|
||||||
|
@ -61,6 +66,82 @@ qreal C4ConsoleQtViewportView::GetDevicePixelRatio()
|
||||||
return screen->devicePixelRatio();
|
return screen->devicePixelRatio();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void C4ConsoleQtViewportView::AddSelectObjectContextEntry(C4Object *obj, QMenu *menu)
|
||||||
|
{
|
||||||
|
// Add select object item for object and for all contents
|
||||||
|
if (!obj || !obj->Status) return;
|
||||||
|
int32_t object_number = obj->Number;
|
||||||
|
QAction *select_object_action = new QAction(QString("%1 #%2 (%3/%4)").arg(obj->GetName()).arg(object_number).arg(obj->GetX()).arg(obj->GetY()), menu);
|
||||||
|
connect(select_object_action, &QAction::triggered, menu, [object_number]() {
|
||||||
|
bool add = !!(QGuiApplication::keyboardModifiers() & Qt::ShiftModifier);
|
||||||
|
C4Object *obj = ::Objects.SafeObjectPointer(object_number);
|
||||||
|
if (obj) ::Console.EditCursor.DoContextObjsel(obj, !add);
|
||||||
|
});
|
||||||
|
menu->addAction(select_object_action);
|
||||||
|
if (obj->Contents.ObjectCount())
|
||||||
|
{
|
||||||
|
QMenu *submenu = menu->addMenu(FormatString(LoadResStr("IDS_CNS_SELECTCONTENTS"), obj->GetName()).getData());
|
||||||
|
for (C4Object *cobj : obj->Contents)
|
||||||
|
{
|
||||||
|
AddSelectObjectContextEntry(cobj, submenu);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void C4ConsoleQtViewportView::ShowContextMenu(const QPoint &pos)
|
||||||
|
{
|
||||||
|
// Coordinates are in viewport (not adjusted by parent scroll window)
|
||||||
|
if (!IsPlayViewport())
|
||||||
|
{
|
||||||
|
// Show context menu in editor viewport
|
||||||
|
QMenu *menu = new QMenu(this);
|
||||||
|
// Show current object(s) as unselectable item
|
||||||
|
auto &ui = dock->main_window->GetConsoleState()->ui;
|
||||||
|
menu->addSection(ui.selectionInfoLabel->text());
|
||||||
|
// Object actions. Always shown but grayed out if no object is selected.
|
||||||
|
bool has_object = false;
|
||||||
|
int32_t contents_count = 0;
|
||||||
|
for (const C4Value &sel : ::Console.EditCursor.GetSelection())
|
||||||
|
{
|
||||||
|
C4Object *obj = sel.getObj();
|
||||||
|
if (obj)
|
||||||
|
{
|
||||||
|
has_object = true;
|
||||||
|
contents_count += obj->Contents.ObjectCount();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (QAction *act : { ui.actionDeleteObject, ui.actionDuplicateObject, ui.actionEjectContents })
|
||||||
|
{
|
||||||
|
act->setEnabled(has_object);
|
||||||
|
menu->addAction(act);
|
||||||
|
}
|
||||||
|
if (!contents_count)
|
||||||
|
{
|
||||||
|
ui.actionEjectContents->setEnabled(false);
|
||||||
|
}
|
||||||
|
ui.actionEjectContents->setText(QString("%1 (%2)").arg(LoadResStr("IDS_MNU_CONTENTS")).arg((int)contents_count));
|
||||||
|
// Object selection section for overlapping objects
|
||||||
|
auto pr = GetDevicePixelRatio();
|
||||||
|
int32_t x = cvp->WindowToGameX(pr * pos.x()),
|
||||||
|
y = cvp->WindowToGameY(pr * pos.y());
|
||||||
|
auto pFOl = new C4FindObjectAtPoint(x, y); // freed by ~C4FindObjectAnd
|
||||||
|
auto pFOc = new C4FindObjectContainer(nullptr); // freed by ~C4FindObjectAnd
|
||||||
|
C4FindObject *pFO_conds[] = { pFOl , pFOc };
|
||||||
|
C4FindObjectAnd pFO(2, pFO_conds, false);
|
||||||
|
std::unique_ptr<C4ValueArray> atcursor(pFO.FindMany(::Objects, ::Objects.Sectors)); // needs freeing (single object ptr)
|
||||||
|
int itemcount = atcursor->GetSize();
|
||||||
|
if (itemcount)
|
||||||
|
{
|
||||||
|
menu->addSection(LoadResStr("IDS_CNS_SELECTNEARBYOBJECTS"));
|
||||||
|
for (int32_t i = 0; i < itemcount; ++i)
|
||||||
|
{
|
||||||
|
AddSelectObjectContextEntry(atcursor->GetItem(i).getObj(), menu);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
menu->popup(mapToGlobal(pos));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Get Shift state as Win32 wParam
|
// Get Shift state as Win32 wParam
|
||||||
uint32_t GetShiftWParam()
|
uint32_t GetShiftWParam()
|
||||||
{
|
{
|
||||||
|
|
|
@ -34,6 +34,8 @@ class C4ConsoleQtViewportView : public QOpenGLWidget
|
||||||
private:
|
private:
|
||||||
bool IsPlayViewport() const;
|
bool IsPlayViewport() const;
|
||||||
qreal GetDevicePixelRatio();
|
qreal GetDevicePixelRatio();
|
||||||
|
void ShowContextMenu(const QPoint &pos);
|
||||||
|
void AddSelectObjectContextEntry(C4Object *obj, QMenu *menu);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void focusInEvent(QFocusEvent * event) override;
|
void focusInEvent(QFocusEvent * event) override;
|
||||||
|
|
|
@ -615,11 +615,12 @@ bool SetMenuItemText(HMENU hMenu, WORD id, const char *szText)
|
||||||
bool C4EditCursor::RightButtonUp(DWORD dwKeyState)
|
bool C4EditCursor::RightButtonUp(DWORD dwKeyState)
|
||||||
{
|
{
|
||||||
Target=NULL;
|
Target=NULL;
|
||||||
|
#ifndef WITH_QT_EDITOR
|
||||||
DoContextMenu(dwKeyState);
|
DoContextMenu(dwKeyState);
|
||||||
|
#endif
|
||||||
// Update
|
// Update
|
||||||
UpdateStatusBar();
|
UpdateStatusBar();
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -130,8 +130,8 @@ protected:
|
||||||
void ToolFailure();
|
void ToolFailure();
|
||||||
void PutContents();
|
void PutContents();
|
||||||
void UpdateDropTarget(DWORD dwKeyState);
|
void UpdateDropTarget(DWORD dwKeyState);
|
||||||
void AppendMenuItem(int num, const StdStrBuf & label);
|
|
||||||
bool DoContextMenu(DWORD dwKeyState);
|
bool DoContextMenu(DWORD dwKeyState);
|
||||||
|
void AppendMenuItem(int num, const StdStrBuf & label);
|
||||||
void ApplyToolFill();
|
void ApplyToolFill();
|
||||||
void ApplyToolRect();
|
void ApplyToolRect();
|
||||||
void ApplyToolLine();
|
void ApplyToolLine();
|
||||||
|
@ -142,10 +142,13 @@ protected:
|
||||||
void FrameSelection();
|
void FrameSelection();
|
||||||
void MoveSelection(C4Real iXOff, C4Real iYOff);
|
void MoveSelection(C4Real iXOff, C4Real iYOff);
|
||||||
void EMMoveObject(enum C4ControlEMObjectAction eAction, C4Real tx, C4Real ty, C4Object *pTargetObj, const C4EditCursorSelection *pObjs = NULL, const char *szScript = NULL);
|
void EMMoveObject(enum C4ControlEMObjectAction eAction, C4Real tx, C4Real ty, C4Object *pTargetObj, const C4EditCursorSelection *pObjs = NULL, const char *szScript = NULL);
|
||||||
void DoContextObjsel(C4Object *, bool clear);
|
|
||||||
void DoContextObjCommand(C4Object *, const char *cmd);
|
void DoContextObjCommand(C4Object *, const char *cmd);
|
||||||
void ObjselectDelItems();
|
void ObjselectDelItems();
|
||||||
|
|
||||||
|
public:
|
||||||
|
void DoContextObjsel(C4Object *, bool clear);
|
||||||
|
|
||||||
|
protected:
|
||||||
#ifdef USE_GTK
|
#ifdef USE_GTK
|
||||||
static void OnDelete(GtkWidget* widget, gpointer data);
|
static void OnDelete(GtkWidget* widget, gpointer data);
|
||||||
static void OnDuplicate(GtkWidget* widget, gpointer data);
|
static void OnDuplicate(GtkWidget* widget, gpointer data);
|
||||||
|
|
Loading…
Reference in New Issue