27 #ifndef TOOLBOXPANEL_H
28 #define TOOLBOXPANEL_H
55 ELEMENT_BOX_BUTTON_COUNT = 9,
56 TOOLBOX_MAX_CONTROLLERS = 20,
57 TOOLBOX_MAX_SLIDERS = 8,
58 TOOLBOX_MAX_CHECKBOXES = 8,
59 TOOLBOX_MAX_NEIGHBORHOODS = 8,
60 ELEMENT_RENDER_SIZE = 32,
61 ELEMENT_BIG_RENDER_SIZE = 48,
62 ELEMENT_BOX_SIZE = 77,
64 R = CC::PARAM_CONFIG::EVENT_WINDOW_RADIUS,
70 inline u32 GetElementRenderSize()
72 return m_bigText ? ELEMENT_BIG_RENDER_SIZE : ELEMENT_RENDER_SIZE;
75 inline FontAsset GetElementRenderFont()
77 return m_bigText ? FONT_ASSET_ELEMENT_BIG : FONT_ASSET_ELEMENT;
87 EditingTool* m_toolboxTool;
110 void SetToolPointer(EditingTool* toolboxTool)
112 m_toolboxTool = toolboxTool;
115 void SetEditingTool(EditingTool tool)
120 EditingTool GetEditingTool()
142 void SetToolIcon(SDL_Surface* icon)
145 this->Panel::SetDimensions(icon->w, icon->h);
156 void SetActivated(
bool activated)
176 virtual void OnClick(u8 button)
178 *m_toolboxTool = m_tool;
179 m_parent->ActivateButton(
this);
218 virtual void PaintComponentNonClick(
Drawing& d)
220 const u32 SIZE = m_parent->GetElementRenderSize();
225 d.
SetFont(AssetManager::Get(m_parent->GetElementRenderFont()));
244 virtual void OnClick(u8 button)
248 case SDL_BUTTON_LEFT:
249 m_parent->SetPrimaryElement(m_element);
251 case SDL_BUTTON_RIGHT:
252 m_parent->SetSecondaryElement(m_element);
254 case SDL_BUTTON_MIDDLE:
260 m_parent->RebuildControllers();
263 virtual bool OnScroll(u8 button)
274 EditingTool* m_toolPtr;
276 ToolButton* m_activatedButton;
278 ToolButton m_toolButtons[ELEMENT_BOX_BUTTON_COUNT];
286 ElementButton m_elementButtons[ELEMENT_BOX_SIZE];
288 u32 m_heldElementCount;
291 u32 m_controllerCount;
293 OurSlider m_sliders[TOOLBOX_MAX_SLIDERS];
300 u32 m_neighborhoodCount;
306 ELEMENTS_PER_ROW = 11,
307 ELEMENT_ROWS = (ELEMENT_BOX_SIZE + ELEMENTS_PER_ROW - 1) / ELEMENTS_PER_ROW,
308 NON_ELEMENT_ROWS = 3,
309 TOTAL_ROWS = ELEMENT_ROWS + NON_ELEMENT_ROWS,
315 MFM_API_ASSERT_NONNULL(spc);
317 if (m_controllerCount >= TOOLBOX_MAX_CONTROLLERS)
319 FAIL(OUT_OF_RESOURCES);
322 u32 j = m_controllerCount++;
324 m_controllers[j] = spc;
325 m_controllers[j]->SetBigText(m_bigText);
326 LOG.
Debug(
"Inniting %s controllers", m_bigText ?
"big" :
"normal");
332 MFM_API_ASSERT_NONNULL(sp);
334 if (m_sliderCount >= TOOLBOX_MAX_SLIDERS)
336 FAIL(OUT_OF_RESOURCES);
339 u32 j = m_sliderCount++;
350 MFM_API_ASSERT_NONNULL(bp);
352 if (m_checkboxCount >= TOOLBOX_MAX_CHECKBOXES)
354 FAIL(OUT_OF_RESOURCES);
357 u32 j = m_checkboxCount++;
367 MFM_API_ASSERT_NONNULL(np);
369 if (m_neighborhoodCount >= TOOLBOX_MAX_NEIGHBORHOODS)
371 FAIL(OUT_OF_RESOURCES);
374 u32 j = m_neighborhoodCount++;
389 m_activatedButton(m_toolButtons),
392 m_heldElementCount(0),
393 m_controllerCount(0),
398 for(u32 i = 0; i < ELEMENT_BOX_BUTTON_COUNT; i++)
400 m_toolButtons[i].SetToolPointer(m_toolPtr);
401 m_toolButtons[i].SetEditingTool((EditingTool)i);
404 for(u32 i = 0; i < ELEMENT_BOX_SIZE; i++)
406 m_heldElements[i] = NULL;
422 for(u32 i = 0; i < TOOLBOX_MAX_CONTROLLERS; i++)
426 m_controllers[i]->SetBigText(value);
431 void RebuildControllers()
434 for(u32 i = 0; i < m_controllerCount; i++)
436 Panel::Remove(m_controllers[i]);
438 m_controllerCount = 0;
441 ElementParameters<CC> & parms = m_primaryElement->GetElementParameters();
442 u32 totalParms = parms.GetParameterCount();
446 m_neighborhoodCount = 0;
447 for(u32 i = 0; i < totalParms; i++)
449 ElementParameter<CC> * parm = parms.GetParameter(i);
450 switch (parm->GetType())
453 AddSliderController(parm);
456 AddCheckboxController(parm);
460 ElementParameterNeighborhood<CC,SITES>* epn =
461 dynamic_cast<ElementParameterNeighborhood<CC,SITES>*
>(parm);
464 AddNeighborhoodController(epn);
475 SPoint rpt(16, 6 + GetElementRenderSize() * TOTAL_ROWS);
476 for(u32 i = 0; i < m_controllerCount; i++)
478 ParameterController<CC> * c = m_controllers[i];
480 c->SetRenderPoint(rpt);
481 c->SetBigText(m_bigText);
482 Panel::Insert(c, NULL);
483 UPoint desired = c->GetDesiredSize();
484 rpt.
SetY(rpt.GetY() + desired.GetY());
487 Panel::SetDimensions(6 + GetElementRenderSize() * ELEMENTS_PER_ROW + BORDER_PADDING,
488 rpt.GetY() + BORDER_PADDING);
489 Panel::SetDesiredSize(6 + GetElementRenderSize() * ELEMENTS_PER_ROW + BORDER_PADDING,
490 rpt.GetY() + BORDER_PADDING);
501 Asset assets[ELEMENT_BOX_BUTTON_COUNT];
504 assets[0] = ASSET_SELECTOR_ICON_BIG;
505 assets[1] = ASSET_ATOM_SELECTOR_ICON_BIG;
506 assets[2] = ASSET_PENCIL_ICON_BIG;
507 assets[3] = ASSET_BUCKET_ICON_BIG;
508 assets[4] = ASSET_ERASER_ICON_BIG;
509 assets[5] = ASSET_BRUSH_ICON_BIG;
510 assets[6] = ASSET_XRAY_ICON_BIG;
511 assets[7] = ASSET_CLONE_ICON_BIG;
512 assets[8] = ASSET_AIRBRUSH_ICON_BIG;
516 assets[0] = ASSET_SELECTOR_ICON;
517 assets[1] = ASSET_ATOM_SELECTOR_ICON;
518 assets[2] = ASSET_PENCIL_ICON;
519 assets[3] = ASSET_BUCKET_ICON;
520 assets[4] = ASSET_ERASER_ICON;
521 assets[5] = ASSET_BRUSH_ICON;
522 assets[6] = ASSET_XRAY_ICON;
523 assets[7] = ASSET_CLONE_ICON;
524 assets[8] = ASSET_AIRBRUSH_ICON;
527 for(u32 i = 0; i < ELEMENT_BOX_BUTTON_COUNT; i++)
529 m_toolButtons[i].SetParent(
this);
530 m_toolButtons[i].Panel::SetRenderPoint(SPoint(16 + i * GetElementRenderSize(), 3));
531 m_toolButtons[i].SetToolIcon(AssetManager::Get(assets[i]));
532 Panel::Insert(m_toolButtons + i, NULL);
535 for(u32 i = 0; i < ELEMENT_BOX_SIZE; i++)
539 x = 3 + GetElementRenderSize() * (i % ELEMENTS_PER_ROW);
540 y = 3 + GetElementRenderSize() * (3 + (i / ELEMENTS_PER_ROW));
544 m_elementButtons[i].SetElement(m_heldElements[i]);
545 m_elementButtons[i].SetParent(
this);
546 m_elementButtons[i].Panel::SetDimensions(GetElementRenderSize(),
547 GetElementRenderSize());
548 m_elementButtons[i].Panel::SetRenderPoint(SPoint(x, y));
550 Panel::Insert(m_elementButtons + i, NULL);
553 m_primaryElement = m_heldElements[0];
554 m_secondaryElement = m_heldElements[1];
556 Panel::SetDimensions(6 + GetElementRenderSize() * ELEMENTS_PER_ROW,
557 6 + GetElementRenderSize() * TOTAL_ROWS);
558 Panel::SetDesiredSize(6 + GetElementRenderSize() * ELEMENTS_PER_ROW,
559 6 + GetElementRenderSize() * TOTAL_ROWS);
562 m_toolButtons[2].OnClick(SDL_BUTTON_LEFT);
565 void SetPrimaryElement(Element<CC>* element)
566 { m_primaryElement = element; }
568 Element<CC>* GetPrimaryElement()
569 {
return m_primaryElement; }
571 void SetSecondaryElement(Element<CC>* element)
572 { m_secondaryElement = element; }
576 if(!Panel::IsVisible())
581 switch(m_activatedButton->GetEditingTool())
584 case TOOL_ATOM_SELECTOR:
600 Element<CC>* GetSecondaryElement()
601 {
return m_secondaryElement; }
603 void RegisterElement(Element<CC>* element)
605 if(m_heldElementCount >= ELEMENT_BOX_SIZE)
609 m_heldElements[m_heldElementCount++] = element;
612 void ActivateButton(ToolButton* button)
614 if(m_activatedButton)
616 m_activatedButton->SetActivated(
false);
618 m_activatedButton = button;
619 button->SetActivated(
true);
622 EditingTool GetSelectedTool()
627 bool IsBrushableSelected()
629 return GetSelectedTool() == TOOL_BRUSH ||
630 GetSelectedTool() == TOOL_ERASER ||
631 GetSelectedTool() == TOOL_XRAY ||
632 GetSelectedTool() == TOOL_CLONE ||
633 GetSelectedTool() == TOOL_AIRBRUSH;
636 virtual bool PostDragHandle(MouseButtonEvent& mbe)
638 SDL_MouseButtonEvent &
event = mbe.m_event.button;
641 if(event.type != SDL_MOUSEBUTTONDOWN)
646 if(IsBrushableSelected())
650 case SDL_BUTTON_WHEELUP:
653 case SDL_BUTTON_WHEELDOWN:
667 virtual bool PostDragHandle(MouseMotionEvent& mme)
675 const u32 ELEMENT_START_X = 64;
676 const u32 ELEMENT_START_Y = m_bigText ? 64 : 40;
677 const u32 ELEMENT_TOOL_SIZE = GetElementRenderSize() + 8;
680 d.
FillRect(0, 0, this->Panel::GetWidth(), this->Panel::GetHeight());
682 d.
SetFont(AssetManager::Get(GetElementRenderFont()));
684 if (m_primaryElement)
687 d.
FillCircle(ELEMENT_START_X, ELEMENT_START_Y, ELEMENT_TOOL_SIZE,
688 ELEMENT_TOOL_SIZE, ELEMENT_TOOL_SIZE / 2);
693 UPoint(ELEMENT_START_X, ELEMENT_START_Y),
694 UPoint(ELEMENT_TOOL_SIZE, ELEMENT_TOOL_SIZE));
696 if (m_secondaryElement)
698 const u32 SECONDARY_X_START = ELEMENT_START_X + ELEMENT_TOOL_SIZE;
700 d.
FillCircle(SECONDARY_X_START, ELEMENT_START_Y, ELEMENT_TOOL_SIZE,
701 ELEMENT_TOOL_SIZE, ELEMENT_TOOL_SIZE / 2);
706 UPoint(SECONDARY_X_START, ELEMENT_START_Y),
707 UPoint(ELEMENT_TOOL_SIZE, ELEMENT_TOOL_SIZE));
710 if(IsBrushableSelected())
715 char brushSizeArray[64];
717 snprintf(brushSizeArray, 64,
"%d", m_brushSize);
719 const SPoint brushPos = m_toolButtons[TOOL_AIRBRUSH].Panel::GetRenderPoint();
720 UPoint pos(brushPos.
GetX() + GetElementRenderSize(), brushPos.
GetY());
u32 GetBackground() const
Definition: Panel.h:212
void FillCircle(int x, int y, int w, int h, int radius) const
Definition: Drawing.cpp:135
void BlitBackedTextCentered(const char *message, UPoint loc, UPoint size)
Definition: Drawing.cpp:220
Definition: Element_Empty.h:41
u32 SetBorder(const u32 color)
Definition: Panel.h:238
Definition: Parameter.h:43
u32 SetForeground(const u32 color)
Definition: Drawing.h:188
Definition: ParameterControllerBool.h:42
void ToggleLowlightPhysicsColor()
Definition: Element.h:458
Definition: Parameter.h:628
u32 SetForeground(const u32 color)
Definition: Panel.h:256
virtual void HandleResize(const UPoint &parentSize)
Definition: Panel.cpp:265
Definition: MovablePanel.h:34
const char * GetZString()
Definition: OverflowableCharBufferByteSink.h:143
T GetY() const
Definition: Point.tcc:40
Definition: ParameterController.h:40
Definition: Parameter.h:593
void BlitBackedText(const char *message, UPoint loc, UPoint size)
Definition: Drawing.cpp:233
u32 SetBackground(const u32 color)
Definition: Drawing.h:170
u32 GetForeground() const
Definition: Panel.h:248
void Debug(const char *format,...)
Definition: Logger.h:301
void SetY(T y)
Definition: Point.tcc:170
const char * GetAtomicSymbol() const
Definition: Element.h:305
void FillRect(int x, int y, int w, int h) const
Definition: Drawing.cpp:115
#define EVENT_WINDOW_SITES(radius)
Definition: MDist.h:46
const char * GetName() const
Definition: Parameter.h:352
TTF_Font * SetFont(TTF_Font *newFont)
Definition: Drawing.h:209
Definition: NeighborSelectPanel.h:37
u32 SetBackground(const u32 color)
Definition: Panel.h:220
T GetX() const
Definition: Point.tcc:34