openclonk/src/editor/C4EditCursor.cpp

1015 lines
27 KiB
C++
Raw Normal View History

2009-05-08 13:28:41 +00:00
/*
* OpenClonk, http://www.openclonk.org
*
* Copyright (c) 1998-2000, Matthes Bender
* Copyright (c) 2001-2009, RedWolf Design GmbH, http://www.clonk.de/
* Copyright (c) 2009-2013, The OpenClonk Team and contributors
2009-05-08 13:28:41 +00:00
*
* Distributed under the terms of the ISC license; see accompanying file
* "COPYING" for details.
2009-05-08 13:28:41 +00:00
*
* "Clonk" is a registered trademark of Matthes Bender, used with permission.
* See accompanying file "TRADEMARK" for details.
2009-05-08 13:28:41 +00:00
*
* To redistribute this file separately, substitute the full license texts
* for the above references.
2009-05-08 13:28:41 +00:00
*/
/* Handles viewport editing in console mode */
#include <C4Include.h>
#include <C4EditCursor.h>
#include <C4Console.h>
#include <C4Object.h>
#include <C4Application.h>
#include <C4Random.h>
#include <C4MouseControl.h>
#include <C4Landscape.h>
#include <C4Texture.h>
#include <C4GraphicsResource.h>
#include <C4Game.h>
#include <C4GameObjects.h>
2009-06-15 22:06:37 +00:00
#include <C4GameControl.h>
2009-05-08 13:28:41 +00:00
#ifdef _WIN32
#include "resource.h"
2009-05-08 13:28:41 +00:00
#endif
#ifdef WITH_DEVELOPER_MODE
# include <C4Language.h>
2010-09-22 15:11:19 +00:00
# include <gtk/gtk.h>
2009-05-08 13:28:41 +00:00
#endif
C4EditCursor::C4EditCursor()
2010-03-28 18:58:01 +00:00
{
2009-05-08 13:28:41 +00:00
Default();
2010-03-28 18:58:01 +00:00
}
2009-05-08 13:28:41 +00:00
C4EditCursor::~C4EditCursor()
2010-03-28 18:58:01 +00:00
{
2009-05-08 13:28:41 +00:00
Clear();
2010-03-28 18:58:01 +00:00
}
2009-05-08 13:28:41 +00:00
void C4EditCursor::Execute()
2010-03-28 18:58:01 +00:00
{
// drawing
2009-05-08 13:28:41 +00:00
switch (Mode)
2010-03-28 18:58:01 +00:00
{
2009-05-08 13:28:41 +00:00
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
2010-03-28 18:58:01 +00:00
case C4CNS_ModeEdit:
// Hold selection
if (Hold)
EMMoveObject(EMMO_Move, Fix0, Fix0, NULL, &Selection);
2010-03-28 18:58:01 +00:00
break;
2009-05-08 13:28:41 +00:00
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
2010-03-28 18:58:01 +00:00
case C4CNS_ModeDraw:
switch (Console.ToolsDlg.Tool)
{
case C4TLS_Fill:
if (Hold) if (!Game.HaltCount) if (Console.Editing) ApplyToolFill();
2009-05-08 13:28:41 +00:00
break;
}
2010-03-28 18:58:01 +00:00
break;
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
}
if (!::Game.iTick35)
Console.PropertyDlgUpdate(Selection);
2010-03-28 18:58:01 +00:00
}
2009-05-08 13:28:41 +00:00
bool C4EditCursor::Init()
2010-03-28 18:58:01 +00:00
{
2009-05-08 13:28:41 +00:00
#ifdef USE_WIN32_WINDOWS
2009-05-08 13:28:41 +00:00
if (!(hMenu = LoadMenu(Application.GetInstance(),MAKEINTRESOURCE(IDR_CONTEXTMENUS))))
return false;
2009-05-08 13:28:41 +00:00
#else // _WIN32
#ifdef WITH_DEVELOPER_MODE
menuContext = gtk_menu_new();
itemDelete = gtk_menu_item_new_with_label(LoadResStr("IDS_MNU_DELETE"));
itemDuplicate = gtk_menu_item_new_with_label(LoadResStr("IDS_MNU_DUPLICATE"));
itemGrabContents = gtk_menu_item_new_with_label(LoadResStr("IDS_MNU_CONTENTS"));
2009-05-08 13:28:41 +00:00
gtk_menu_shell_append(GTK_MENU_SHELL(menuContext), itemDelete);
gtk_menu_shell_append(GTK_MENU_SHELL(menuContext), itemDuplicate);
gtk_menu_shell_append(GTK_MENU_SHELL(menuContext), itemGrabContents);
g_signal_connect(G_OBJECT(itemDelete), "activate", G_CALLBACK(OnDelete), this);
g_signal_connect(G_OBJECT(itemDuplicate), "activate", G_CALLBACK(OnDuplicate), this);
g_signal_connect(G_OBJECT(itemGrabContents), "activate", G_CALLBACK(OnGrabContents), this);
gtk_widget_show_all(menuContext);
#endif // WITH_DEVELOPER_MODe
#endif // _WIN32
Console.UpdateModeCtrls(Mode);
return true;
2010-03-28 18:58:01 +00:00
}
2009-05-08 13:28:41 +00:00
void C4EditCursor::ClearPointers(C4Object *pObj)
2010-03-28 18:58:01 +00:00
{
2009-05-08 13:28:41 +00:00
if (Target==pObj) Target=NULL;
if (Selection.ClearPointers(pObj))
2010-03-28 18:58:01 +00:00
OnSelectionChanged();
}
2009-05-08 13:28:41 +00:00
bool C4EditCursor::Move(float iX, float iY, DWORD dwKeyState)
2010-03-28 18:58:01 +00:00
{
// alt check
bool fAltIsDown = (dwKeyState & MK_ALT) != 0;
if (fAltIsDown != fAltWasDown)
{
if ((fAltWasDown = fAltIsDown))
AltDown();
else
AltUp();
}
// shift check
bool fShiftIsDown = (dwKeyState & MK_SHIFT) != 0;
if(fShiftIsDown != fShiftWasDown)
fShiftWasDown = fShiftIsDown;
2009-05-08 13:28:41 +00:00
// Offset movement
float xoff = iX-X; float yoff = iY-Y;
X=iX; Y=iY;
2009-05-08 13:28:41 +00:00
switch (Mode)
2010-03-28 18:58:01 +00:00
{
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
case C4CNS_ModeEdit:
// Hold
if (!DragFrame && Hold)
2009-05-08 13:28:41 +00:00
{
MoveSelection(ftofix(xoff),ftofix(yoff));
UpdateDropTarget(dwKeyState);
2010-03-28 18:58:01 +00:00
}
// Update target
// Shift always indicates a target outside the current selection
else
{
Target = ((dwKeyState & MK_SHIFT) && Selection.Last) ? Selection.Last->Obj : NULL;
2010-03-28 18:58:01 +00:00
do
{
Target = Game.FindObject(C4ID::None,X,Y,0,0,OCF_NotContained, Target);
2010-03-28 18:58:01 +00:00
}
while ((dwKeyState & MK_SHIFT) && Target && Selection.GetLink(Target));
2010-03-28 18:58:01 +00:00
}
break;
2009-05-08 13:28:41 +00:00
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
2010-03-28 18:58:01 +00:00
case C4CNS_ModeDraw:
switch (Console.ToolsDlg.Tool)
{
case C4TLS_Brush:
if (Hold) ApplyToolBrush();
2009-05-08 13:28:41 +00:00
break;
2010-03-28 18:58:01 +00:00
case C4TLS_Line: case C4TLS_Rect:
2009-05-08 13:28:41 +00:00
break;
}
2010-03-28 18:58:01 +00:00
break;
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
}
2009-05-08 13:28:41 +00:00
// Update
UpdateStatusBar();
return true;
2010-03-28 18:58:01 +00:00
}
2009-05-08 13:28:41 +00:00
void C4EditCursor::UpdateStatusBar()
2010-03-28 18:58:01 +00:00
{
int32_t X=this->X, Y=this->Y;
2009-05-11 13:09:53 +00:00
StdStrBuf str;
2009-05-08 13:28:41 +00:00
switch (Mode)
2010-03-28 18:58:01 +00:00
{
2009-05-08 13:28:41 +00:00
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
2010-03-28 18:58:01 +00:00
case C4CNS_ModePlay:
if (::MouseControl.GetCaption()) str.CopyUntil(::MouseControl.GetCaption(),'|');
break;
2009-05-08 13:28:41 +00:00
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
2010-03-28 18:58:01 +00:00
case C4CNS_ModeEdit:
str.Format("%i/%i (%s)",X,Y,Target ? (Target->GetName()) : LoadResStr("IDS_CNS_NOTHING") );
break;
2009-05-08 13:28:41 +00:00
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
2010-03-28 18:58:01 +00:00
case C4CNS_ModeDraw:
str.Format("%i/%i (%s)",X,Y,MatValid(GBackMat(X,Y)) ? ::MaterialMap.Map[GBackMat(X,Y)].Name : LoadResStr("IDS_CNS_NOTHING") );
break;
2009-05-08 13:28:41 +00:00
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
}
Console.DisplayInfoText(C4ConsoleGUI::CONSOLE_Cursor, str);
2010-03-28 18:58:01 +00:00
}
2009-05-08 13:28:41 +00:00
void C4EditCursor::OnSelectionChanged()
2010-03-28 18:58:01 +00:00
{
Console.PropertyDlgUpdate(Selection);
Console.ObjectListDlg.Update(Selection);
2010-03-28 18:58:01 +00:00
}
2009-05-08 13:28:41 +00:00
void C4EditCursor::AddToSelection(C4Object *add_obj)
{
if (!add_obj || !add_obj->Status) return;
// add object to selection and do script callback
Selection.Add(add_obj, C4ObjectList::stNone);
::Control.DoInput(CID_EMMoveObj, new C4ControlEMMoveObject(EMMO_Select, Fix0, Fix0, add_obj), CDT_Decide);
}
bool C4EditCursor::RemoveFromSelection(C4Object *remove_obj)
{
if (!remove_obj || !remove_obj->Status) return false;
// remove object from selection and do script callback
if (!Selection.Remove(remove_obj)) return false;
::Control.DoInput(CID_EMMoveObj, new C4ControlEMMoveObject(EMMO_Deselect, Fix0, Fix0, remove_obj), CDT_Decide);
return true;
}
void C4EditCursor::ClearSelection()
{
// remove all objects from selection and do script callbacks
// iterate safely because callback might delete selected objects!
C4Object *obj;
while (obj = Selection.GetObject(0))
{
Selection.Remove(obj);
if (obj->Status)
::Control.DoInput(CID_EMMoveObj, new C4ControlEMMoveObject(EMMO_Deselect, Fix0, Fix0, obj), CDT_Decide);
}
Selection.Clear();
}
bool C4EditCursor::LeftButtonDown(DWORD dwKeyState)
2010-03-28 18:58:01 +00:00
{
2009-05-08 13:28:41 +00:00
// Hold
Hold=true;
2009-05-08 13:28:41 +00:00
switch (Mode)
2010-03-28 18:58:01 +00:00
{
2009-05-08 13:28:41 +00:00
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
2010-03-28 18:58:01 +00:00
case C4CNS_ModeEdit:
if (dwKeyState & MK_CONTROL)
2010-03-28 18:58:01 +00:00
{
// Toggle target
if (Target)
if (!RemoveFromSelection(Target))
AddToSelection(Target);
2010-03-28 18:58:01 +00:00
}
else
{
// Click on unselected: select single
if (Target)
{
C4ObjectLink * it;
for(it = Selection.First; it; it = it->Next){
if(it->Obj->At(X, Y))
break;
}
if(!it) // means loop didn't break
{ ClearSelection(); AddToSelection(Target); }
}
2010-03-28 18:58:01 +00:00
// Click on nothing: drag frame
if (!Target)
{ ClearSelection(); DragFrame=true; X2=X; Y2=Y; }
2010-03-28 18:58:01 +00:00
}
break;
2009-05-08 13:28:41 +00:00
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
2010-03-28 18:58:01 +00:00
case C4CNS_ModeDraw:
switch (Console.ToolsDlg.Tool)
{
case C4TLS_Brush: ApplyToolBrush(); break;
case C4TLS_Line: DragLine=true; X2=X; Y2=Y; break;
case C4TLS_Rect: DragFrame=true; X2=X; Y2=Y; break;
case C4TLS_Fill:
if (Game.HaltCount)
{ Hold=false; Console.Message(LoadResStr("IDS_CNS_FILLNOHALT")); return false; }
2009-05-08 13:28:41 +00:00
break;
2010-03-28 18:58:01 +00:00
case C4TLS_Picker: ApplyToolPicker(); break;
2009-05-08 13:28:41 +00:00
}
2010-03-28 18:58:01 +00:00
break;
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
}
2009-05-08 13:28:41 +00:00
DropTarget=NULL;
OnSelectionChanged();
return true;
2010-03-28 18:58:01 +00:00
}
2009-05-08 13:28:41 +00:00
bool C4EditCursor::RightButtonDown(DWORD dwKeyState)
2010-03-28 18:58:01 +00:00
{
2009-05-08 13:28:41 +00:00
switch (Mode)
2010-03-28 18:58:01 +00:00
{
2009-05-08 13:28:41 +00:00
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
2010-03-28 18:58:01 +00:00
case C4CNS_ModeEdit:
if ( (dwKeyState & MK_CONTROL) == 0)
2010-03-28 18:58:01 +00:00
{
// Check whether cursor is on anything in the selection
bool fCursorIsOnSelection = false;
for (C4ObjectLink *pLnk = Selection.First; pLnk; pLnk = pLnk->Next)
if (pLnk->Obj->At(X,Y))
2009-05-08 13:28:41 +00:00
{
2010-03-28 18:58:01 +00:00
fCursorIsOnSelection = true;
break;
2009-05-08 13:28:41 +00:00
}
2010-03-28 18:58:01 +00:00
if (!fCursorIsOnSelection)
{
// Click on unselected
if (Target && !Selection.GetLink(Target))
{
ClearSelection(); AddToSelection(Target);
2010-03-28 18:58:01 +00:00
}
// Click on nothing
if (!Target) ClearSelection();
2010-03-28 18:58:01 +00:00
}
2009-05-08 13:28:41 +00:00
}
2010-03-28 18:58:01 +00:00
break;
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
}
2009-05-08 13:28:41 +00:00
OnSelectionChanged();
return true;
2010-03-28 18:58:01 +00:00
}
2009-05-08 13:28:41 +00:00
bool C4EditCursor::LeftButtonUp(DWORD dwKeyState)
2010-03-28 18:58:01 +00:00
{
2009-05-08 13:28:41 +00:00
// Finish edit/tool
switch (Mode)
2010-03-28 18:58:01 +00:00
{
2009-05-08 13:28:41 +00:00
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
2010-03-28 18:58:01 +00:00
case C4CNS_ModeEdit:
if (DragFrame) FrameSelection();
if (DropTarget) PutContents();
break;
2009-05-08 13:28:41 +00:00
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
2010-03-28 18:58:01 +00:00
case C4CNS_ModeDraw:
switch (Console.ToolsDlg.Tool)
{
case C4TLS_Line:
if (DragLine) ApplyToolLine();
break;
case C4TLS_Rect:
if (DragFrame) ApplyToolRect();
2009-05-08 13:28:41 +00:00
break;
}
2010-03-28 18:58:01 +00:00
break;
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
}
2009-05-08 13:28:41 +00:00
// Release
Hold=false;
DragFrame=false;
DragLine=false;
2009-05-08 13:28:41 +00:00
DropTarget=NULL;
// Update
UpdateStatusBar();
return true;
2010-03-28 18:58:01 +00:00
}
2009-05-08 13:28:41 +00:00
bool C4EditCursor::KeyDown(C4KeyCode KeyCode, DWORD dwKeyState)
{
// alt check
bool fAltIsDown = (dwKeyState & MK_ALT) != 0;
fAltIsDown = fAltIsDown || KeyCode == K_ALT_L || KeyCode == K_ALT_R;
if (fAltIsDown != fAltWasDown)
{
if ((fAltWasDown = fAltIsDown))
AltDown();
else
AltUp();
}
// shift check
bool fShiftIsDown = (dwKeyState & MK_SHIFT) != 0;
fShiftIsDown = fShiftIsDown || KeyCode == K_SHIFT_L || KeyCode == K_SHIFT_R;
if(fShiftIsDown != fShiftWasDown)
fShiftWasDown = fShiftIsDown;
2012-04-23 19:45:01 +00:00
return true;
}
bool C4EditCursor::KeyUp(C4KeyCode KeyCode, DWORD dwKeyState)
{
// alt check
bool fAltIsDown = (dwKeyState & MK_ALT) != 0;
fAltIsDown = fAltIsDown && !( KeyCode == K_ALT_L || KeyCode == K_ALT_R);
if (fAltIsDown != fAltWasDown)
{
if ((fAltWasDown = fAltIsDown))
AltDown();
else
AltUp();
}
// shift check
bool fShiftIsDown = (dwKeyState & MK_SHIFT) != 0;
fShiftIsDown = fShiftIsDown && !(KeyCode == K_SHIFT_L || KeyCode == K_SHIFT_R);
if(fShiftIsDown != fShiftWasDown)
fShiftWasDown = fShiftIsDown;
2012-04-23 19:45:01 +00:00
return true;
}
#ifdef USE_WIN32_WINDOWS
bool SetMenuItemEnable(HMENU hMenu, WORD id, bool fEnable)
2010-03-28 18:58:01 +00:00
{
2009-10-13 18:41:57 +00:00
return !!EnableMenuItem(hMenu,id,MF_BYCOMMAND | MF_ENABLED | ( fEnable ? 0 : MF_GRAYED));
2010-03-28 18:58:01 +00:00
}
2009-05-08 13:28:41 +00:00
bool SetMenuItemText(HMENU hMenu, WORD id, const char *szText)
2010-03-28 18:58:01 +00:00
{
MENUITEMINFOW minfo;
2009-05-08 13:28:41 +00:00
ZeroMem(&minfo,sizeof(minfo));
minfo.cbSize = sizeof(minfo);
minfo.fMask = MIIM_ID | MIIM_TYPE | MIIM_DATA;
minfo.fType = MFT_STRING;
minfo.wID = id;
StdBuf td = GetWideCharBuf(szText);
minfo.dwTypeData = getMBufPtr<wchar_t>(td);
minfo.cch = wcslen(minfo.dwTypeData);
return !!SetMenuItemInfoW(hMenu,id,false,&minfo);
2010-03-28 18:58:01 +00:00
}
2009-05-08 13:28:41 +00:00
#endif
bool C4EditCursor::RightButtonUp(DWORD dwKeyState)
2010-03-28 18:58:01 +00:00
{
2009-05-08 13:28:41 +00:00
Target=NULL;
DoContextMenu(dwKeyState);
2009-05-08 13:28:41 +00:00
// Update
UpdateStatusBar();
return true;
2010-03-28 18:58:01 +00:00
}
2009-05-08 13:28:41 +00:00
bool C4EditCursor::Delete()
2010-03-28 18:58:01 +00:00
{
if (!EditingOK()) return false;
EMMoveObject(EMMO_Remove, Fix0, Fix0, NULL, &Selection);
2010-03-28 18:58:01 +00:00
if (::Control.isCtrlHost())
{
2009-05-08 13:28:41 +00:00
OnSelectionChanged();
}
2010-03-28 18:58:01 +00:00
return true;
}
2009-05-08 13:28:41 +00:00
bool C4EditCursor::OpenPropTools()
2010-03-28 18:58:01 +00:00
{
2009-05-08 13:28:41 +00:00
switch (Mode)
2010-03-28 18:58:01 +00:00
{
case C4CNS_ModeEdit: case C4CNS_ModePlay:
Console.PropertyDlgOpen();
Console.PropertyDlgUpdate(Selection);
2010-03-28 18:58:01 +00:00
break;
case C4CNS_ModeDraw:
Console.ToolsDlg.Open();
break;
2009-05-08 13:28:41 +00:00
}
2010-03-28 18:58:01 +00:00
return true;
}
2009-05-08 13:28:41 +00:00
bool C4EditCursor::Duplicate()
2010-03-28 18:58:01 +00:00
{
EMMoveObject(EMMO_Duplicate, Fix0, Fix0, NULL, &Selection);
return true;
2010-03-28 18:58:01 +00:00
}
2009-05-08 13:28:41 +00:00
void C4EditCursor::Draw(C4TargetFacet &cgo)
2010-03-28 18:58:01 +00:00
{
ZoomDataStackItem zdsi(cgo.X, cgo.Y, cgo.Zoom);
2009-05-08 13:28:41 +00:00
// Draw selection marks
C4Object *cobj; C4ObjectLink *clnk;
for (clnk=Selection.First; clnk && (cobj=clnk->Obj); clnk=clnk->Next)
2010-03-28 18:58:01 +00:00
{
2009-05-08 13:28:41 +00:00
// target pos (parallax)
float offX, offY, newzoom;
cobj->GetDrawPosition(cgo, offX, offY, newzoom);
ZoomDataStackItem zdsi(cgo.X, cgo.Y, newzoom);
2010-03-28 18:58:01 +00:00
FLOAT_RECT frame =
{
offX+cobj->Shape.x,
offX+cobj->Shape.x + cobj->Shape.Wdt,
offY+cobj->Shape.y,
offY+cobj->Shape.y + cobj->Shape.Hgt
2010-03-28 18:58:01 +00:00
};
2009-05-08 13:28:41 +00:00
DrawSelectMark(cgo, frame);
// highlight selection if shift is pressed
if (fShiftWasDown)
2010-03-28 18:58:01 +00:00
{
2009-05-08 13:28:41 +00:00
uint32_t dwOldMod = cobj->ColorMod;
uint32_t dwOldBlitMode = cobj->BlitMode;
cobj->ColorMod = 0xffffffff;
2009-05-08 13:28:41 +00:00
cobj->BlitMode = C4GFXBLIT_CLRSFC_MOD2 | C4GFXBLIT_ADDITIVE;
StdMeshInstance::FaceOrdering old_fo = StdSubMeshInstance::FO_Fixed;
if(cobj->pMeshInstance)
cobj->pMeshInstance->SetFaceOrdering(StdSubMeshInstance::FO_NearestToFarthest);
2009-05-08 13:28:41 +00:00
cobj->Draw(cgo,-1);
cobj->DrawTopFace(cgo, -1);
if(cobj->pMeshInstance)
cobj->pMeshInstance->SetFaceOrderingForClrModulation(cobj->ColorMod);
2009-05-08 13:28:41 +00:00
cobj->ColorMod = dwOldMod;
cobj->BlitMode = dwOldBlitMode;
}
2010-03-28 18:58:01 +00:00
}
2009-05-08 13:28:41 +00:00
// Draw drag frame
if (DragFrame)
2011-10-03 14:30:18 +00:00
pDraw->DrawFrameDw(cgo.Surface,
Min(X, X2) + cgo.X - cgo.TargetX, Min(Y, Y2) + cgo.Y - cgo.TargetY,
Max(X, X2) + cgo.X - cgo.TargetX, Max(Y, Y2) + cgo.Y - cgo.TargetY, 0xffffffff);
2009-05-08 13:28:41 +00:00
// Draw drag line
if (DragLine)
2011-10-03 14:30:18 +00:00
pDraw->DrawLineDw(cgo.Surface,
X + cgo.X - cgo.TargetX, Y + cgo.Y - cgo.TargetY,
X2 + cgo.X - cgo.TargetX, Y2 + cgo.Y - cgo.TargetY, 0xffffffff);
2009-05-08 13:28:41 +00:00
// Draw drop target
if (DropTarget)
::GraphicsResource.fctDropTarget.Draw(cgo.Surface,
DropTarget->GetX() + cgo.X - cgo.TargetX - ::GraphicsResource.fctDropTarget.Wdt / 2,
DropTarget->GetY() + DropTarget->Shape.y + cgo.Y - cgo.TargetY - ::GraphicsResource.fctDropTarget.Hgt);
2010-03-28 18:58:01 +00:00
}
2009-05-08 13:28:41 +00:00
void C4EditCursor::DrawSelectMark(C4Facet &cgo, FLOAT_RECT frame)
2010-03-28 18:58:01 +00:00
{
2009-05-08 13:28:41 +00:00
if ((cgo.Wdt<1) || (cgo.Hgt<1)) return;
if (!cgo.Surface) return;
2011-10-03 14:30:18 +00:00
pDraw->DrawPix(cgo.Surface,frame.left,frame.top,0xFFFFFFFF);
pDraw->DrawPix(cgo.Surface,frame.left+1,frame.top,0xFFFFFFFF);
pDraw->DrawPix(cgo.Surface,frame.left,frame.top+1,0xFFFFFFFF);
2009-05-08 13:28:41 +00:00
2011-10-03 14:30:18 +00:00
pDraw->DrawPix(cgo.Surface,frame.left,frame.bottom-1,0xFFFFFFFF);
pDraw->DrawPix(cgo.Surface,frame.left+1,frame.bottom-1,0xFFFFFFFF);
pDraw->DrawPix(cgo.Surface,frame.left,frame.bottom-2,0xFFFFFFFF);
2009-05-08 13:28:41 +00:00
2011-10-03 14:30:18 +00:00
pDraw->DrawPix(cgo.Surface,frame.right-1,frame.top,0xFFFFFFFF);
pDraw->DrawPix(cgo.Surface,frame.right-2,frame.top,0xFFFFFFFF);
pDraw->DrawPix(cgo.Surface,frame.right-1,frame.top+1,0xFFFFFFFF);
2009-05-08 13:28:41 +00:00
2011-10-03 14:30:18 +00:00
pDraw->DrawPix(cgo.Surface,frame.right-1,frame.bottom-1,0xFFFFFFFF);
pDraw->DrawPix(cgo.Surface,frame.right-2,frame.bottom-1,0xFFFFFFFF);
pDraw->DrawPix(cgo.Surface,frame.right-1,frame.bottom-2,0xFFFFFFFF);
2010-03-28 18:58:01 +00:00
}
2009-05-08 13:28:41 +00:00
void C4EditCursor::MoveSelection(C4Real XOff, C4Real YOff)
2010-03-28 18:58:01 +00:00
{
EMMoveObject(EMMO_Move, XOff, YOff, NULL, &Selection);
2010-03-28 18:58:01 +00:00
}
2009-05-08 13:28:41 +00:00
void C4EditCursor::FrameSelection()
2010-03-28 18:58:01 +00:00
{
ClearSelection();
C4Object *cobj; C4ObjectLink *clnk;
for (clnk=::Objects.First; clnk && (cobj=clnk->Obj); clnk=clnk->Next)
2009-05-08 13:28:41 +00:00
if (cobj->Status) if (cobj->OCF & OCF_NotContained)
{
2010-03-28 18:58:01 +00:00
if (Inside(cobj->GetX(),Min(X,X2),Max(X,X2)) && Inside(cobj->GetY(),Min(Y,Y2),Max(Y,Y2)))
AddToSelection(cobj);
2009-05-08 13:28:41 +00:00
}
OnSelectionChanged();
2010-03-28 18:58:01 +00:00
}
2009-05-08 13:28:41 +00:00
bool C4EditCursor::In(const char *szText)
2010-03-28 18:58:01 +00:00
{
EMMoveObject(EMMO_Script, Fix0, Fix0, NULL, &Selection, szText);
return true;
2010-03-28 18:58:01 +00:00
}
2009-05-08 13:28:41 +00:00
void C4EditCursor::Default()
2010-03-28 18:58:01 +00:00
{
fAltWasDown=false;
fShiftWasDown=false;
2009-05-08 13:28:41 +00:00
Mode=C4CNS_ModePlay;
X=Y=X2=Y2=0;
Target=DropTarget=NULL;
#ifdef USE_WIN32_WINDOWS
2009-05-08 13:28:41 +00:00
hMenu=NULL;
#endif
Hold=DragFrame=DragLine=false;
2009-05-08 13:28:41 +00:00
Selection.Default();
2010-03-28 18:58:01 +00:00
}
2009-05-08 13:28:41 +00:00
void C4EditCursor::Clear()
2010-03-28 18:58:01 +00:00
{
#ifdef USE_WIN32_WINDOWS
2009-05-08 13:28:41 +00:00
if (hMenu) DestroyMenu(hMenu); hMenu=NULL;
#endif
#ifdef WITH_DEBUG_MODE
ObjselectDelItems();
2009-05-08 13:28:41 +00:00
#endif
Selection.Clear();
2010-03-28 18:58:01 +00:00
}
2009-05-08 13:28:41 +00:00
bool C4EditCursor::SetMode(int32_t iMode)
2010-03-28 18:58:01 +00:00
{
2009-05-08 13:28:41 +00:00
// Store focus
#ifdef USE_WIN32_WINDOWS
2009-05-08 13:28:41 +00:00
HWND hFocus=GetFocus();
#endif
// Update console buttons (always)
Console.UpdateModeCtrls(iMode);
// No change
if (iMode==Mode) return true;
2009-05-08 13:28:41 +00:00
// Set mode
Mode = iMode;
// Update prop tools by mode
switch (Mode)
2010-03-28 18:58:01 +00:00
{
case C4CNS_ModeEdit: case C4CNS_ModePlay:
Console.ToolsDlgClose();
2010-03-28 18:58:01 +00:00
break;
case C4CNS_ModeDraw:
Console.PropertyDlgClose();
2010-03-28 18:58:01 +00:00
break;
}
if (Mode == C4CNS_ModePlay)
{
::MouseControl.ShowCursor();
}
else
{
OpenPropTools();
::MouseControl.HideCursor();
}
2009-05-08 13:28:41 +00:00
// Restore focus
#ifdef USE_WIN32_WINDOWS
2009-05-08 13:28:41 +00:00
SetFocus(hFocus);
#endif
// Done
return true;
2010-03-28 18:58:01 +00:00
}
2009-05-08 13:28:41 +00:00
bool C4EditCursor::ToggleMode()
2010-03-28 18:58:01 +00:00
{
2009-05-08 13:28:41 +00:00
2010-03-28 18:58:01 +00:00
if (!EditingOK()) return false;
2009-05-08 13:28:41 +00:00
// Step through modes
int32_t iNewMode;
switch (Mode)
2010-03-28 18:58:01 +00:00
{
case C4CNS_ModePlay: iNewMode=C4CNS_ModeEdit; break;
case C4CNS_ModeEdit: iNewMode=C4CNS_ModeDraw; break;
case C4CNS_ModeDraw: iNewMode=C4CNS_ModePlay; break;
default: iNewMode=C4CNS_ModePlay; break;
}
2009-05-08 13:28:41 +00:00
// Set new mode
SetMode(iNewMode);
return true;
2010-03-28 18:58:01 +00:00
}
2009-05-08 13:28:41 +00:00
void C4EditCursor::ApplyToolBrush()
2010-03-28 18:58:01 +00:00
{
2009-05-08 13:28:41 +00:00
if (!EditingOK()) return;
C4ToolsDlg *pTools=&Console.ToolsDlg;
// execute/send control
2009-06-05 15:20:41 +00:00
EMControl(CID_EMDrawTool, new C4ControlEMDrawTool(EMDT_Brush, ::Landscape.Mode, X,Y,0,0, pTools->Grade, !!pTools->ModeIFT, pTools->Material,pTools->Texture));
2010-03-28 18:58:01 +00:00
}
2009-05-08 13:28:41 +00:00
void C4EditCursor::ApplyToolLine()
2010-03-28 18:58:01 +00:00
{
2009-05-08 13:28:41 +00:00
if (!EditingOK()) return;
C4ToolsDlg *pTools=&Console.ToolsDlg;
// execute/send control
2009-06-05 15:20:41 +00:00
EMControl(CID_EMDrawTool, new C4ControlEMDrawTool(EMDT_Line, ::Landscape.Mode, X,Y,X2,Y2, pTools->Grade, !!pTools->ModeIFT, pTools->Material,pTools->Texture));
2010-03-28 18:58:01 +00:00
}
2009-05-08 13:28:41 +00:00
void C4EditCursor::ApplyToolRect()
2010-03-28 18:58:01 +00:00
{
2009-05-08 13:28:41 +00:00
if (!EditingOK()) return;
C4ToolsDlg *pTools=&Console.ToolsDlg;
// execute/send control
2009-06-05 15:20:41 +00:00
EMControl(CID_EMDrawTool, new C4ControlEMDrawTool(EMDT_Rect, ::Landscape.Mode, X,Y,X2,Y2, pTools->Grade, !!pTools->ModeIFT, pTools->Material,pTools->Texture));
2010-03-28 18:58:01 +00:00
}
2009-05-08 13:28:41 +00:00
void C4EditCursor::ApplyToolFill()
2010-03-28 18:58:01 +00:00
{
2009-05-08 13:28:41 +00:00
if (!EditingOK()) return;
C4ToolsDlg *pTools=&Console.ToolsDlg;
// execute/send control
2009-06-05 15:20:41 +00:00
EMControl(CID_EMDrawTool, new C4ControlEMDrawTool(EMDT_Fill, ::Landscape.Mode, X,Y,0,Y2, pTools->Grade, false, pTools->Material));
2010-03-28 18:58:01 +00:00
}
2009-05-08 13:28:41 +00:00
bool C4EditCursor::DoContextMenu(DWORD dwKeyState)
2010-03-28 18:58:01 +00:00
{
bool fObjectSelected = !!Selection.ObjectCount();
#ifdef USE_WIN32_WINDOWS
2009-05-08 13:28:41 +00:00
POINT point; GetCursorPos(&point);
HMENU hContext = GetSubMenu(hMenu,0);
SetMenuItemEnable( hContext, IDM_VIEWPORT_DELETE, fObjectSelected && Console.Editing);
SetMenuItemEnable( hContext, IDM_VIEWPORT_DUPLICATE, fObjectSelected && Console.Editing);
SetMenuItemEnable( hContext, IDM_VIEWPORT_CONTENTS, fObjectSelected && Selection.GetObject()->Contents.ObjectCount() && Console.Editing);
SetMenuItemText(hContext,IDM_VIEWPORT_DELETE,LoadResStr("IDS_MNU_DELETE"));
SetMenuItemText(hContext,IDM_VIEWPORT_DUPLICATE,LoadResStr("IDS_MNU_DUPLICATE"));
SetMenuItemText(hContext,IDM_VIEWPORT_CONTENTS,LoadResStr("IDS_MNU_CONTENTS"));
ObjselectDelItems();
C4FindObjectAtPoint pFO(X,Y);
C4ValueArray * atcursor; atcursor = pFO.FindMany(::Objects, ::Objects.Sectors); // needs freeing (single object ptr)
int itemcount = atcursor->GetSize();
if(itemcount > 0)
{
const int maxitems = 25; // Maximum displayed objects. if you raise it, also change note with IDM_VPORTDYN_FIRST in resource.h
if(itemcount > maxitems) itemcount = maxitems+1;
itemsObjselect.resize(itemcount+1); // +1 for a separator
itemsObjselect[0].ItemId = IDM_VPORTDYN_FIRST;
itemsObjselect[0].Object = NULL;
AppendMenu(hContext, MF_SEPARATOR, IDM_VPORTDYN_FIRST, NULL);
int i = 1;
for(std::vector<ObjselItemDt>::iterator it = itemsObjselect.begin() + 1; it != itemsObjselect.end(); ++it, ++i)
{
C4Object * obj = (*atcursor)[i-1].getObj();
assert(obj);
it->ItemId = IDM_VPORTDYN_FIRST+i;
it->Object = obj;
AppendMenu(hContext, MF_STRING, it->ItemId, FormatString("%s #%i (%i/%i)", obj->GetName(), obj->Number, obj->GetX(), obj->GetY()).GetWideChar());
}
if(atcursor->GetSize() > maxitems)
{
AppendMenu(hContext, MF_GRAYED, IDM_VPORTDYN_FIRST+maxitems+1, L"...");
itemsObjselect[maxitems+1].ItemId = IDM_VPORTDYN_FIRST+maxitems+1;
itemsObjselect[maxitems+1].Object = NULL;
}
}
delete atcursor;
2009-05-08 13:28:41 +00:00
int32_t iItem = TrackPopupMenu(
2010-03-28 18:58:01 +00:00
hContext,
TPM_LEFTALIGN | TPM_TOPALIGN | TPM_RETURNCMD | TPM_LEFTBUTTON | TPM_NONOTIFY,
point.x,point.y, 0,
Console.hWindow,
NULL);
2009-05-08 13:28:41 +00:00
switch (iItem)
2010-03-28 18:58:01 +00:00
{
case IDM_VIEWPORT_DELETE: Delete(); break;
case IDM_VIEWPORT_DUPLICATE: Duplicate(); break;
case IDM_VIEWPORT_CONTENTS: GrabContents(); break;
case 0: break;
default:
for(std::vector<ObjselItemDt>::iterator it = itemsObjselect.begin() + 1; it != itemsObjselect.end(); ++it)
if(it->ItemId == iItem)
{
DoContextObjsel(it->Object, (dwKeyState & MK_SHIFT) == 0);
break;
}
break;
2010-03-28 18:58:01 +00:00
}
ObjselectDelItems();
2009-05-08 13:28:41 +00:00
#else
#ifdef WITH_DEVELOPER_MODE
gtk_widget_set_sensitive(itemDelete, fObjectSelected && Console.Editing);
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
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();
assert(obj);
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);
g_signal_connect(G_OBJECT(wdg), "activate", G_CALLBACK(OnObjselect), &*it);
}
}
delete atcursor;
gtk_widget_show_all(menuContext);
2009-05-08 13:28:41 +00:00
gtk_menu_popup(GTK_MENU(menuContext), NULL, NULL, NULL, NULL, 3, 0);
#endif
#endif
return true;
2010-03-28 18:58:01 +00:00
}
2009-05-08 13:28:41 +00:00
void C4EditCursor::GrabContents()
2010-03-28 18:58:01 +00:00
{
2009-05-08 13:28:41 +00:00
// Set selection
C4Object *pFrom;
if (!( pFrom = Selection.GetObject() )) return;
Selection.Copy(pFrom->Contents);
OnSelectionChanged();
Hold=true;
2009-05-08 13:28:41 +00:00
// Exit all objects
EMMoveObject(EMMO_Exit, Fix0, Fix0, NULL, &Selection);
2010-03-28 18:58:01 +00:00
}
2009-05-08 13:28:41 +00:00
void C4EditCursor::UpdateDropTarget(DWORD dwKeyState)
2010-03-28 18:58:01 +00:00
{
C4Object *cobj; C4ObjectLink *clnk;
2009-05-08 13:28:41 +00:00
DropTarget=NULL;
if (dwKeyState & MK_CONTROL)
2009-05-08 13:28:41 +00:00
if (Selection.GetObject())
for (clnk=::Objects.First; clnk && (cobj=clnk->Obj); clnk=clnk->Next)
2009-05-08 13:28:41 +00:00
if (cobj->Status)
if (!cobj->Contained)
if (Inside<int32_t>(X-(cobj->GetX()+cobj->Shape.x),0,cobj->Shape.Wdt-1))
if (Inside<int32_t>(Y-(cobj->GetY()+cobj->Shape.y),0,cobj->Shape.Hgt-1))
if (!Selection.GetLink(cobj))
{ DropTarget=cobj; break; }
2010-03-28 18:58:01 +00:00
}
2009-05-08 13:28:41 +00:00
void C4EditCursor::PutContents()
2010-03-28 18:58:01 +00:00
{
2009-05-08 13:28:41 +00:00
if (!DropTarget) return;
EMMoveObject(EMMO_Enter, Fix0, Fix0, DropTarget, &Selection);
2010-03-28 18:58:01 +00:00
}
2009-05-08 13:28:41 +00:00
C4Object *C4EditCursor::GetTarget()
2010-03-28 18:58:01 +00:00
{
2009-05-08 13:28:41 +00:00
return Target;
2010-03-28 18:58:01 +00:00
}
2009-05-08 13:28:41 +00:00
bool C4EditCursor::EditingOK()
2010-03-28 18:58:01 +00:00
{
2009-05-08 13:28:41 +00:00
if (!Console.Editing)
2010-03-28 18:58:01 +00:00
{
Hold=false;
2009-05-08 13:28:41 +00:00
Console.Message(LoadResStr("IDS_CNS_NONETEDIT"));
return false;
2009-05-08 13:28:41 +00:00
}
2010-03-28 18:58:01 +00:00
return true;
}
2009-05-08 13:28:41 +00:00
int32_t C4EditCursor::GetMode()
2010-03-28 18:58:01 +00:00
{
2009-05-08 13:28:41 +00:00
return Mode;
2010-03-28 18:58:01 +00:00
}
2009-05-08 13:28:41 +00:00
void C4EditCursor::ToolFailure()
2010-03-28 18:58:01 +00:00
{
2009-05-08 13:28:41 +00:00
C4ToolsDlg *pTools=&Console.ToolsDlg;
Hold=false;
2009-05-11 13:09:53 +00:00
Console.Message(FormatString(LoadResStr("IDS_CNS_NOMATDEF"),pTools->Material,pTools->Texture).getData());
2010-03-28 18:58:01 +00:00
}
2009-05-08 13:28:41 +00:00
void C4EditCursor::ApplyToolPicker()
2010-03-28 18:58:01 +00:00
{
2009-05-08 13:28:41 +00:00
int32_t iMaterial;
BYTE byIndex;
2009-06-05 15:20:41 +00:00
switch (::Landscape.Mode)
2010-03-28 18:58:01 +00:00
{
case C4LSC_Static:
2009-05-08 13:28:41 +00:00
{
bool material_set = false;
// Material-texture from map
if ((byIndex=::Landscape.GetMapIndex(X/::Landscape.MapZoom,Y/::Landscape.MapZoom)))
2010-03-28 18:58:01 +00:00
{
const C4TexMapEntry *pTex = ::TextureMap.GetEntry(byIndex & (IFT-1));
if (pTex && pTex->GetMaterialName() && *pTex->GetMaterialName())
{
Console.ToolsDlg.SelectMaterial(pTex->GetMaterialName());
Console.ToolsDlg.SelectTexture(pTex->GetTextureName());
Console.ToolsDlg.SetIFT(!!(byIndex & ~(IFT-1)));
material_set = true;
}
2010-03-28 18:58:01 +00:00
}
// default to sky, because invalid materials are always rendered as sky
if (!material_set) Console.ToolsDlg.SelectMaterial(C4TLS_MatSky);
break;
2009-05-08 13:28:41 +00:00
}
2010-03-28 18:58:01 +00:00
case C4LSC_Exact:
// Material only from landscape
if (MatValid(iMaterial=GBackMat(X,Y)))
{
Console.ToolsDlg.SelectMaterial(::MaterialMap.Map[iMaterial].Name);
Console.ToolsDlg.SetIFT(!!GBackIFT(X,Y));
}
else
Console.ToolsDlg.SelectMaterial(C4TLS_MatSky);
break;
2009-05-08 13:28:41 +00:00
}
2010-03-28 18:58:01 +00:00
Hold=false;
}
2009-05-08 13:28:41 +00:00
void C4EditCursor::EMMoveObject(C4ControlEMObjectAction eAction, C4Real tx, C4Real ty, C4Object *pTargetObj, const C4ObjectList *pObjs, const char *szScript)
2010-03-28 18:58:01 +00:00
{
// construct object list
int32_t iObjCnt = 0; int32_t *pObjIDs = NULL;
2010-03-28 18:58:01 +00:00
if (pObjs && (iObjCnt = pObjs->ObjectCount()))
{
pObjIDs = new int32_t [iObjCnt];
// fill
int32_t i = 0;
2010-03-28 18:58:01 +00:00
for (C4ObjectLink *pLnk = pObjs->First; pLnk; pLnk = pLnk->Next, i++)
if (pLnk->Obj && pLnk->Obj->Status)
pObjIDs[i] = pLnk->Obj->Number;
2010-03-28 18:58:01 +00:00
}
// execute control
EMControl(CID_EMMoveObj, new C4ControlEMMoveObject(eAction, tx, ty, pTargetObj, iObjCnt, pObjIDs, szScript));
2010-03-28 18:58:01 +00:00
}
2009-05-08 13:28:41 +00:00
void C4EditCursor::EMControl(C4PacketType eCtrlType, C4ControlPacket *pCtrl)
2010-03-28 18:58:01 +00:00
{
::Control.DoInput(eCtrlType, pCtrl, CDT_Decide);
2010-03-28 18:58:01 +00:00
}
2009-05-08 13:28:41 +00:00
#ifdef WITH_DEVELOPER_MODE
// GTK+ callbacks
void C4EditCursor::OnDelete(GtkWidget* widget, gpointer data)
{
static_cast<C4EditCursor*>(data)->Delete();
2009-05-08 13:28:41 +00:00
}
void C4EditCursor::OnDuplicate(GtkWidget* widget, gpointer data)
{
static_cast<C4EditCursor*>(data)->Duplicate();
2009-05-08 13:28:41 +00:00
}
void C4EditCursor::OnGrabContents(GtkWidget* widget, gpointer data)
{
static_cast<C4EditCursor*>(data)->GrabContents();
2009-05-08 13:28:41 +00:00
}
void C4EditCursor::OnObjselect(GtkWidget* widget, gpointer data)
{
bool IsShiftDown = false;
GdkEvent* event = gtk_get_current_event();
if(event)
{
if(event->type == GDK_BUTTON_PRESS)
IsShiftDown = ( ((GdkEventButton*)event)->state & MK_SHIFT) != 0;
else if(event->type == GDK_KEY_PRESS)
IsShiftDown = ( ((GdkEventKey*)event)->state & MK_SHIFT) != 0;
gdk_event_free(event);
}
static_cast<ObjselItemDt*>(data)->EditCursor->DoContextObjsel(static_cast<ObjselItemDt*>(data)->Object, !IsShiftDown);
static_cast<ObjselItemDt*>(data)->EditCursor->ObjselectDelItems();
}
#endif
void C4EditCursor::ObjselectDelItems() {
if(!itemsObjselect.size()) return;
std::vector<ObjselItemDt>::iterator it = itemsObjselect.begin();
while(it != itemsObjselect.end()) {
#if defined(WITH_DEVELOPER_MODE)
gtk_widget_destroy(it->MenuItem);
#elif defined(USE_WIN32_WINDOWS)
if(!it->ItemId) { ++it; continue; }
HMENU hContext = GetSubMenu(hMenu,0);
DeleteMenu(hContext, it->ItemId, MF_BYCOMMAND);
#endif
++it;
}
itemsObjselect.resize(0);
}
2009-05-08 13:28:41 +00:00
bool C4EditCursor::AltDown()
2010-03-28 18:58:01 +00:00
{
// alt only has an effect in draw mode (picker)
if (Mode == C4CNS_ModeDraw)
2010-03-28 18:58:01 +00:00
{
Console.ToolsDlg.SetAlternateTool();
2010-03-28 18:58:01 +00:00
}
// key not processed - allow further usages of Alt
return false;
2010-03-28 18:58:01 +00:00
}
2009-05-08 13:28:41 +00:00
bool C4EditCursor::AltUp()
2010-03-28 18:58:01 +00:00
{
if (Mode == C4CNS_ModeDraw)
2010-03-28 18:58:01 +00:00
{
Console.ToolsDlg.ResetAlternateTool();
2010-03-28 18:58:01 +00:00
}
// key not processed - allow further usages of Alt
return false;
2010-03-28 18:58:01 +00:00
}
void C4EditCursor::DoContextObjsel(C4Object * obj, bool clear)
{
if(clear)
Selection.Clear();
Selection.Add(obj, C4ObjectList::stNone);
OnSelectionChanged();
}