forked from Mirrors/openclonk
Add an option to select an arbitrary object under the cursor via context menu to gtk console mode
parent
01d71376ec
commit
b4dba5b255
|
@ -428,7 +428,7 @@ void C4EditCursor::Draw(C4TargetFacet &cgo)
|
|||
|
||||
if(cobj->pMeshInstance)
|
||||
cobj->pMeshInstance->SetFaceOrderingForClrModulation(cobj->ColorMod);
|
||||
|
||||
|
||||
cobj->ColorMod = dwOldMod;
|
||||
cobj->BlitMode = dwOldBlitMode;
|
||||
}
|
||||
|
@ -516,6 +516,9 @@ void C4EditCursor::Clear()
|
|||
{
|
||||
#ifdef _WIN32
|
||||
if (hMenu) DestroyMenu(hMenu); hMenu=NULL;
|
||||
#endif
|
||||
#ifdef WITH_DEBUG_MODE
|
||||
ObjselectDelItems();
|
||||
#endif
|
||||
Selection.Clear();
|
||||
}
|
||||
|
@ -643,6 +646,32 @@ bool C4EditCursor::DoContextMenu()
|
|||
gtk_widget_set_sensitive(itemDuplicate, fObjectSelected && Console.Editing);
|
||||
gtk_widget_set_sensitive(itemGrabContents, fObjectSelected && Selection.GetObject()->Contents.ObjectCount() && Console.Editing);
|
||||
|
||||
ObjselectDelItems();
|
||||
C4FindObjectAtPoint pFO(X,Y);
|
||||
C4ValueArray * atcursor; atcursor = pFO.FindMany(::Objects, ::Objects.Sectors); // needs freeing
|
||||
int itemcount = atcursor->GetSize();
|
||||
if(itemcount > 0)
|
||||
{
|
||||
itemsObjselect.resize(itemcount+1); // +1 for a separator, and +1 for a stop codon
|
||||
itemsObjselect[0].MenuItem = gtk_separator_menu_item_new();
|
||||
itemsObjselect[0].EditCursor = this;
|
||||
gtk_menu_shell_append(GTK_MENU_SHELL(menuContext), itemsObjselect[0].MenuItem);
|
||||
int i = 0;
|
||||
for(std::vector<ObjselItemDt>::iterator it = itemsObjselect.begin() + 1; it != itemsObjselect.end(); ++it, ++i) {
|
||||
it->EditCursor = this;
|
||||
C4Object * obj = (*atcursor)[i].getObj();
|
||||
if(!obj) continue;
|
||||
it->Object = obj;
|
||||
GtkWidget * wdg = gtk_menu_item_new_with_label(FormatString("%s #%i (%i/%i)", obj->GetName(), obj->Number, obj->GetX(), obj->GetY()).getData());
|
||||
it->MenuItem = wdg;
|
||||
gtk_menu_shell_append(GTK_MENU_SHELL(menuContext), wdg);
|
||||
static_assert(sizeof(std::vector<ObjselItemDt>::iterator) == sizeof(gpointer), "My vector hack is hack.");
|
||||
g_signal_connect(G_OBJECT(wdg), "activate", G_CALLBACK(OnObjselect), &*it);
|
||||
}
|
||||
}
|
||||
delete atcursor;
|
||||
gtk_widget_show_all(menuContext);
|
||||
|
||||
gtk_menu_popup(GTK_MENU(menuContext), NULL, NULL, NULL, NULL, 3, 0);
|
||||
#endif
|
||||
#endif
|
||||
|
@ -790,6 +819,22 @@ void C4EditCursor::OnGrabContents(GtkWidget* widget, gpointer data)
|
|||
static_cast<C4EditCursor*>(data)->GrabContents();
|
||||
}
|
||||
|
||||
void C4EditCursor::OnObjselect(GtkWidget* widget, gpointer data)
|
||||
{
|
||||
static_cast<ObjselItemDt*>(data)->EditCursor->DoContextObjsel(static_cast<ObjselItemDt*>(data)->Object);
|
||||
static_cast<ObjselItemDt*>(data)->EditCursor->ObjselectDelItems();
|
||||
}
|
||||
|
||||
void C4EditCursor::ObjselectDelItems() {
|
||||
if(!itemsObjselect.size()) return;
|
||||
std::vector<ObjselItemDt>::iterator it = itemsObjselect.begin();
|
||||
while(it != itemsObjselect.end()) {
|
||||
gtk_widget_destroy(it->MenuItem);
|
||||
++it;
|
||||
}
|
||||
itemsObjselect.resize(0);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
bool C4EditCursor::AltDown()
|
||||
|
@ -812,3 +857,11 @@ bool C4EditCursor::AltUp()
|
|||
// key not processed - allow further usages of Alt
|
||||
return false;
|
||||
}
|
||||
|
||||
void C4EditCursor::DoContextObjsel(C4Object * obj)
|
||||
{
|
||||
if(!Application.IsControlDown())
|
||||
Selection.Clear();
|
||||
Selection.Add(obj, C4ObjectList::stNone);
|
||||
OnSelectionChanged();
|
||||
}
|
||||
|
|
|
@ -27,6 +27,7 @@
|
|||
#include "C4ObjectList.h"
|
||||
#include "C4Control.h"
|
||||
#include "C4Rect.h"
|
||||
#include <vector>
|
||||
|
||||
#ifdef WITH_DEVELOPER_MODE
|
||||
#include <gtk/gtk.h>
|
||||
|
@ -53,6 +54,12 @@ protected:
|
|||
GtkWidget* itemDuplicate;
|
||||
GtkWidget* itemGrabContents;
|
||||
GtkWidget* itemProperties;
|
||||
struct ObjselItemDt {
|
||||
C4EditCursor* EditCursor;
|
||||
C4Object* Object;
|
||||
GtkWidget* MenuItem;
|
||||
};
|
||||
std::vector<ObjselItemDt> itemsObjselect;
|
||||
#endif
|
||||
#endif // _WIN32
|
||||
C4ObjectList Selection;
|
||||
|
@ -99,11 +106,14 @@ protected:
|
|||
void MoveSelection(C4Real iXOff, C4Real iYOff);
|
||||
void EMMoveObject(enum C4ControlEMObjectAction eAction, C4Real tx, C4Real ty, C4Object *pTargetObj, const C4ObjectList *pObjs = NULL, const char *szScript = NULL);
|
||||
void EMControl(enum C4PacketType eCtrlType, class C4ControlPacket *pCtrl);
|
||||
void DoContextObjsel(C4Object *);
|
||||
|
||||
#ifdef WITH_DEVELOPER_MODE
|
||||
static void OnDelete(GtkWidget* widget, gpointer data);
|
||||
static void OnDuplicate(GtkWidget* widget, gpointer data);
|
||||
static void OnGrabContents(GtkWidget* widget, gpointer data);
|
||||
static void OnObjselect(GtkWidget* widget, gpointer data);
|
||||
void ObjselectDelItems();
|
||||
#endif
|
||||
};
|
||||
|
||||
|
|
|
@ -207,6 +207,7 @@ C4Object *C4FindObject::Find(const C4ObjectList &Objs)
|
|||
return pBestResult;
|
||||
}
|
||||
|
||||
// return is to be freed by the caller
|
||||
C4ValueArray *C4FindObject::FindMany(const C4ObjectList &Objs)
|
||||
{
|
||||
// Trivial case
|
||||
|
@ -323,6 +324,7 @@ C4Object *C4FindObject::Find(const C4ObjectList &Objs, const C4LSectors &Sct)
|
|||
return pBestResult;
|
||||
}
|
||||
|
||||
// return is to be freed by the caller
|
||||
C4ValueArray *C4FindObject::FindMany(const C4ObjectList &Objs, const C4LSectors &Sct)
|
||||
{
|
||||
// Trivial case
|
||||
|
|
Loading…
Reference in New Issue