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