* implemented MoveTransformersCommand (so Transformers can be
drag sorted now) * implemented RemoveTransformersCommand * implemented StyleListView (I promise, this is the last list view :-) * implemented adding new styles via the Style menu * implemented selecting the Style of the currently selected Shape git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@18072 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -111,6 +111,7 @@ Application Icon-O-Matic :
|
|||||||
IconObjectListView.cpp
|
IconObjectListView.cpp
|
||||||
PathListView.cpp
|
PathListView.cpp
|
||||||
ShapeListView.cpp
|
ShapeListView.cpp
|
||||||
|
StyleListView.cpp
|
||||||
SwatchGroup.cpp
|
SwatchGroup.cpp
|
||||||
TransformerListView.cpp
|
TransformerListView.cpp
|
||||||
# shape
|
# shape
|
||||||
@@ -124,9 +125,11 @@ Application Icon-O-Matic :
|
|||||||
ChangePointCommand.cpp
|
ChangePointCommand.cpp
|
||||||
InsertPointCommand.cpp
|
InsertPointCommand.cpp
|
||||||
MoveShapesCommand.cpp
|
MoveShapesCommand.cpp
|
||||||
|
MoveTransformersCommand.cpp
|
||||||
PathCommand.cpp
|
PathCommand.cpp
|
||||||
RemovePointsCommand.cpp
|
RemovePointsCommand.cpp
|
||||||
RemoveShapesCommand.cpp
|
RemoveShapesCommand.cpp
|
||||||
|
RemoveTransformersCommand.cpp
|
||||||
# style
|
# style
|
||||||
Gradient.cpp
|
Gradient.cpp
|
||||||
Style.cpp
|
Style.cpp
|
||||||
|
|||||||
@@ -25,6 +25,7 @@
|
|||||||
#include "PathListView.h"
|
#include "PathListView.h"
|
||||||
#include "ScrollView.h"
|
#include "ScrollView.h"
|
||||||
#include "ShapeListView.h"
|
#include "ShapeListView.h"
|
||||||
|
#include "StyleListView.h"
|
||||||
#include "SwatchGroup.h"
|
#include "SwatchGroup.h"
|
||||||
#include "TransformerFactory.h"
|
#include "TransformerFactory.h"
|
||||||
#include "TransformerListView.h"
|
#include "TransformerListView.h"
|
||||||
@@ -49,6 +50,9 @@ enum {
|
|||||||
|
|
||||||
MSG_NEW_PATH = 'nwvp',
|
MSG_NEW_PATH = 'nwvp',
|
||||||
MSG_PATH_SELECTED = 'vpsl',
|
MSG_PATH_SELECTED = 'vpsl',
|
||||||
|
MSG_NEW_STYLE = 'nwst',
|
||||||
|
MSG_STYLE_SELECTED = 'stsl',
|
||||||
|
MSG_NEW_SHAPE = 'nwsp',
|
||||||
MSG_SHAPE_SELECTED = 'spsl',
|
MSG_SHAPE_SELECTED = 'spsl',
|
||||||
|
|
||||||
MSG_ADD_TRANSFORMER = 'adtr',
|
MSG_ADD_TRANSFORMER = 'adtr',
|
||||||
@@ -56,7 +60,7 @@ enum {
|
|||||||
|
|
||||||
// constructor
|
// constructor
|
||||||
MainWindow::MainWindow(IconEditorApp* app, Document* document)
|
MainWindow::MainWindow(IconEditorApp* app, Document* document)
|
||||||
: BWindow(BRect(50, 50, 891, 781), "Icon-O-Matic",
|
: BWindow(BRect(20, 50, 1010, 781), "Icon-O-Matic",
|
||||||
B_TITLED_WINDOW_LOOK, B_NORMAL_WINDOW_FEEL,
|
B_TITLED_WINDOW_LOOK, B_NORMAL_WINDOW_FEEL,
|
||||||
B_ASYNCHRONOUS_CONTROLS),
|
B_ASYNCHRONOUS_CONTROLS),
|
||||||
fApp(app),
|
fApp(app),
|
||||||
@@ -107,11 +111,28 @@ case MSG_PATH_SELECTED: {
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
// TODO: use an AddStyleCommand
|
||||||
|
case MSG_NEW_STYLE: {
|
||||||
|
Style* style = new Style();
|
||||||
|
style->SetColor((rgb_color){ rand() % 255,
|
||||||
|
rand() % 255,
|
||||||
|
rand() % 255,
|
||||||
|
255 });
|
||||||
|
StyleManager::Default()->AddStyle(style);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
// TODO: use an AddShapeCommand
|
||||||
|
case MSG_NEW_SHAPE: {
|
||||||
|
Shape* shape = new Shape(StyleManager::Default()->StyleAt(0));
|
||||||
|
fDocument->Icon()->Shapes()->AddShape(shape);
|
||||||
|
break;
|
||||||
|
}
|
||||||
case MSG_SHAPE_SELECTED: {
|
case MSG_SHAPE_SELECTED: {
|
||||||
Shape* shape;
|
Shape* shape;
|
||||||
if (message->FindPointer("shape", (void**)&shape) < B_OK)
|
if (message->FindPointer("shape", (void**)&shape) < B_OK)
|
||||||
shape = NULL;
|
shape = NULL;
|
||||||
fPathListView->SetCurrentShape(shape);
|
fPathListView->SetCurrentShape(shape);
|
||||||
|
fStyleListView->SetCurrentShape(shape);
|
||||||
fTransformerListView->SetShape(shape);
|
fTransformerListView->SetShape(shape);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -200,13 +221,20 @@ MainWindow::_Init()
|
|||||||
fCanvasView->SetIcon(fDocument->Icon());
|
fCanvasView->SetIcon(fDocument->Icon());
|
||||||
|
|
||||||
fPathListView->SetPathContainer(fDocument->Icon()->Paths());
|
fPathListView->SetPathContainer(fDocument->Icon()->Paths());
|
||||||
|
fPathListView->SetShapeContainer(fDocument->Icon()->Shapes());
|
||||||
// fPathListView->SetCommandStack(fDocument->CommandStack());
|
// fPathListView->SetCommandStack(fDocument->CommandStack());
|
||||||
fPathListView->SetSelection(fDocument->Selection());
|
fPathListView->SetSelection(fDocument->Selection());
|
||||||
|
|
||||||
|
fStyleListView->SetStyleManager(StyleManager::Default());
|
||||||
|
fStyleListView->SetShapeContainer(fDocument->Icon()->Shapes());
|
||||||
|
// fStyleListView->SetCommandStack(fDocument->CommandStack());
|
||||||
|
fStyleListView->SetSelection(fDocument->Selection());
|
||||||
|
|
||||||
fShapeListView->SetShapeContainer(fDocument->Icon()->Shapes());
|
fShapeListView->SetShapeContainer(fDocument->Icon()->Shapes());
|
||||||
fShapeListView->SetCommandStack(fDocument->CommandStack());
|
fShapeListView->SetCommandStack(fDocument->CommandStack());
|
||||||
fShapeListView->SetSelection(fDocument->Selection());
|
fShapeListView->SetSelection(fDocument->Selection());
|
||||||
|
|
||||||
|
fTransformerListView->SetCommandStack(fDocument->CommandStack());
|
||||||
fTransformerListView->SetSelection(fDocument->Selection());
|
fTransformerListView->SetSelection(fDocument->Selection());
|
||||||
|
|
||||||
fPropertyListView->SetCommandStack(fDocument->CommandStack());
|
fPropertyListView->SetCommandStack(fDocument->CommandStack());
|
||||||
@@ -329,6 +357,11 @@ MainWindow::_CreateGUI(BRect bounds)
|
|||||||
fPathListView = new PathListView(bounds, "path list view",
|
fPathListView = new PathListView(bounds, "path list view",
|
||||||
new BMessage(MSG_PATH_SELECTED), this);
|
new BMessage(MSG_PATH_SELECTED), this);
|
||||||
|
|
||||||
|
// style list view
|
||||||
|
bounds.OffsetBy(bounds.Width() + 6 + B_V_SCROLL_BAR_WIDTH, 0);
|
||||||
|
fStyleListView = new StyleListView(bounds, "style list view",
|
||||||
|
new BMessage(MSG_STYLE_SELECTED), this);
|
||||||
|
|
||||||
// shape list view
|
// shape list view
|
||||||
bounds.OffsetBy(bounds.Width() + 6 + B_V_SCROLL_BAR_WIDTH, 0);
|
bounds.OffsetBy(bounds.Width() + 6 + B_V_SCROLL_BAR_WIDTH, 0);
|
||||||
fShapeListView = new ShapeListView(bounds, "shape list view",
|
fShapeListView = new ShapeListView(bounds, "shape list view",
|
||||||
@@ -354,6 +387,11 @@ MainWindow::_CreateGUI(BRect bounds)
|
|||||||
B_FOLLOW_LEFT | B_FOLLOW_TOP,
|
B_FOLLOW_LEFT | B_FOLLOW_TOP,
|
||||||
0, false, true,
|
0, false, true,
|
||||||
B_NO_BORDER));
|
B_NO_BORDER));
|
||||||
|
bg->AddChild(new BScrollView("style list scroll view",
|
||||||
|
fStyleListView,
|
||||||
|
B_FOLLOW_LEFT | B_FOLLOW_TOP,
|
||||||
|
0, false, true,
|
||||||
|
B_NO_BORDER));
|
||||||
bg->AddChild(new BScrollView("shape list scroll view",
|
bg->AddChild(new BScrollView("shape list scroll view",
|
||||||
fShapeListView,
|
fShapeListView,
|
||||||
B_FOLLOW_LEFT | B_FOLLOW_TOP,
|
B_FOLLOW_LEFT | B_FOLLOW_TOP,
|
||||||
@@ -367,6 +405,7 @@ MainWindow::_CreateGUI(BRect bounds)
|
|||||||
|
|
||||||
// scroll view around property list view
|
// scroll view around property list view
|
||||||
bounds.OffsetBy(bounds.Width() + 6 + B_V_SCROLL_BAR_WIDTH, 0);
|
bounds.OffsetBy(bounds.Width() + 6 + B_V_SCROLL_BAR_WIDTH, 0);
|
||||||
|
bounds.right = bg->Bounds().right - 5;
|
||||||
bg->AddChild(new ScrollView(fPropertyListView,
|
bg->AddChild(new ScrollView(fPropertyListView,
|
||||||
SCROLL_VERTICAL | SCROLL_NO_FRAME,
|
SCROLL_VERTICAL | SCROLL_NO_FRAME,
|
||||||
bounds, "property scroll view",
|
bounds, "property scroll view",
|
||||||
@@ -414,6 +453,11 @@ MainWindow::_CreateMenuBar(BRect frame)
|
|||||||
// Path
|
// Path
|
||||||
pathMenu->AddItem(new BMenuItem("New", new BMessage(MSG_NEW_PATH)));
|
pathMenu->AddItem(new BMenuItem("New", new BMessage(MSG_NEW_PATH)));
|
||||||
|
|
||||||
|
// Style
|
||||||
|
styleMenu->AddItem(new BMenuItem("New", new BMessage(MSG_NEW_STYLE)));
|
||||||
|
|
||||||
|
// Shape
|
||||||
|
shapeMenu->AddItem(new BMenuItem("New", new BMessage(MSG_NEW_SHAPE)));
|
||||||
|
|
||||||
// Transformer
|
// Transformer
|
||||||
int32 cookie = 0;
|
int32 cookie = 0;
|
||||||
|
|||||||
@@ -22,6 +22,7 @@ class IconEditorApp;
|
|||||||
class IconView;
|
class IconView;
|
||||||
class PathListView;
|
class PathListView;
|
||||||
class ShapeListView;
|
class ShapeListView;
|
||||||
|
class StyleListView;
|
||||||
class SwatchGroup;
|
class SwatchGroup;
|
||||||
class TransformerListView;
|
class TransformerListView;
|
||||||
|
|
||||||
@@ -61,6 +62,8 @@ class MainWindow : public BWindow,
|
|||||||
IconView* fIconPreview64;
|
IconView* fIconPreview64;
|
||||||
|
|
||||||
PathListView* fPathListView;
|
PathListView* fPathListView;
|
||||||
|
StyleListView* fStyleListView;
|
||||||
|
|
||||||
ShapeListView* fShapeListView;
|
ShapeListView* fShapeListView;
|
||||||
TransformerListView* fTransformerListView;
|
TransformerListView* fTransformerListView;
|
||||||
IconObjectListView* fPropertyListView;
|
IconObjectListView* fPropertyListView;
|
||||||
|
|||||||
@@ -173,6 +173,7 @@ class ShapePathListener : public PathContainerListener,
|
|||||||
SetShape(NULL);
|
SetShape(NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// PathContainerListener interface
|
||||||
virtual void PathAdded(VectorPath* path)
|
virtual void PathAdded(VectorPath* path)
|
||||||
{
|
{
|
||||||
fListView->_SetPathMarked(path, true);
|
fListView->_SetPathMarked(path, true);
|
||||||
@@ -182,12 +183,14 @@ class ShapePathListener : public PathContainerListener,
|
|||||||
fListView->_SetPathMarked(path, false);
|
fListView->_SetPathMarked(path, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ShapeContainerListener interface
|
||||||
virtual void ShapeAdded(Shape* shape, int32 index) {}
|
virtual void ShapeAdded(Shape* shape, int32 index) {}
|
||||||
virtual void ShapeRemoved(Shape* shape)
|
virtual void ShapeRemoved(Shape* shape)
|
||||||
{
|
{
|
||||||
fListView->SetCurrentShape(NULL);
|
fListView->SetCurrentShape(NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ShapePathListener
|
||||||
void SetShape(Shape* shape)
|
void SetShape(Shape* shape)
|
||||||
{
|
{
|
||||||
if (fShape == shape)
|
if (fShape == shape)
|
||||||
|
|||||||
@@ -0,0 +1,548 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2006, Haiku.
|
||||||
|
* Distributed under the terms of the MIT License.
|
||||||
|
*
|
||||||
|
* Authors:
|
||||||
|
* Stephan Aßmus <[email protected]>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "StyleListView.h"
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#include <Application.h>
|
||||||
|
#include <ListItem.h>
|
||||||
|
#include <Message.h>
|
||||||
|
#include <Mime.h>
|
||||||
|
#include <Window.h>
|
||||||
|
|
||||||
|
#include "Style.h"
|
||||||
|
#include "Observer.h"
|
||||||
|
#include "Shape.h"
|
||||||
|
#include "ShapeContainer.h"
|
||||||
|
#include "Selection.h"
|
||||||
|
|
||||||
|
static const float kMarkWidth = 14.0;
|
||||||
|
static const float kBorderOffset = 3.0;
|
||||||
|
static const float kTextOffset = 4.0;
|
||||||
|
|
||||||
|
class StyleListItem : public SimpleItem,
|
||||||
|
public Observer {
|
||||||
|
public:
|
||||||
|
StyleListItem(Style* s,
|
||||||
|
StyleListView* listView,
|
||||||
|
bool markEnabled)
|
||||||
|
: SimpleItem(""),
|
||||||
|
style(NULL),
|
||||||
|
fListView(listView),
|
||||||
|
fMarkEnabled(markEnabled),
|
||||||
|
fMarked(false)
|
||||||
|
{
|
||||||
|
SetStyle(s);
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual ~StyleListItem()
|
||||||
|
{
|
||||||
|
SetStyle(NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
// SimpleItem interface
|
||||||
|
virtual void Draw(BView* owner, BRect itemFrame, uint32 flags)
|
||||||
|
{
|
||||||
|
SimpleItem::DrawBackground(owner, itemFrame, flags);
|
||||||
|
|
||||||
|
// text
|
||||||
|
owner->SetHighColor(0, 0, 0, 255);
|
||||||
|
font_height fh;
|
||||||
|
owner->GetFontHeight(&fh);
|
||||||
|
BString truncatedString(Text());
|
||||||
|
owner->TruncateString(&truncatedString, B_TRUNCATE_MIDDLE,
|
||||||
|
itemFrame.Width()
|
||||||
|
- kBorderOffset
|
||||||
|
- kMarkWidth
|
||||||
|
- kTextOffset
|
||||||
|
- kBorderOffset);
|
||||||
|
float height = itemFrame.Height();
|
||||||
|
float textHeight = fh.ascent + fh.descent;
|
||||||
|
BPoint pos;
|
||||||
|
pos.x = itemFrame.left
|
||||||
|
+ kBorderOffset + kMarkWidth + kTextOffset;
|
||||||
|
pos.y = itemFrame.top
|
||||||
|
+ ceilf((height - textHeight) / 2.0 + fh.ascent);
|
||||||
|
owner->DrawString(truncatedString.String(), pos);
|
||||||
|
|
||||||
|
if (!fMarkEnabled)
|
||||||
|
return;
|
||||||
|
|
||||||
|
// mark
|
||||||
|
BRect markRect = itemFrame;
|
||||||
|
markRect.left += kBorderOffset;
|
||||||
|
markRect.right = markRect.left + kMarkWidth;
|
||||||
|
markRect.top = (markRect.top + markRect.bottom - kMarkWidth) / 2.0;
|
||||||
|
markRect.bottom = markRect.top + kMarkWidth;
|
||||||
|
owner->SetHighColor(tint_color(owner->LowColor(), B_DARKEN_1_TINT));
|
||||||
|
owner->StrokeRect(markRect);
|
||||||
|
markRect.InsetBy(1, 1);
|
||||||
|
owner->SetHighColor(tint_color(owner->LowColor(), 1.04));
|
||||||
|
owner->FillRect(markRect);
|
||||||
|
if (fMarked) {
|
||||||
|
markRect.InsetBy(2, 2);
|
||||||
|
owner->SetHighColor(tint_color(owner->LowColor(),
|
||||||
|
B_DARKEN_4_TINT));
|
||||||
|
owner->SetPenSize(2);
|
||||||
|
owner->StrokeLine(markRect.LeftTop(), markRect.RightBottom());
|
||||||
|
owner->StrokeLine(markRect.LeftBottom(), markRect.RightTop());
|
||||||
|
owner->SetPenSize(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Observer interface
|
||||||
|
virtual void ObjectChanged(const Observable* object)
|
||||||
|
{
|
||||||
|
UpdateText();
|
||||||
|
}
|
||||||
|
|
||||||
|
// StyleListItem
|
||||||
|
void SetStyle(Style* s)
|
||||||
|
{
|
||||||
|
if (s == style)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (style) {
|
||||||
|
style->RemoveObserver(this);
|
||||||
|
style->Release();
|
||||||
|
}
|
||||||
|
|
||||||
|
style = s;
|
||||||
|
|
||||||
|
if (style) {
|
||||||
|
style->Acquire();
|
||||||
|
style->AddObserver(this);
|
||||||
|
UpdateText();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void UpdateText()
|
||||||
|
{
|
||||||
|
SetText(style->Name());
|
||||||
|
Invalidate();
|
||||||
|
}
|
||||||
|
|
||||||
|
void SetMarkEnabled(bool enabled)
|
||||||
|
{
|
||||||
|
if (fMarkEnabled == enabled)
|
||||||
|
return;
|
||||||
|
fMarkEnabled = enabled;
|
||||||
|
Invalidate();
|
||||||
|
}
|
||||||
|
void SetMarked(bool marked)
|
||||||
|
{
|
||||||
|
if (fMarked == marked)
|
||||||
|
return;
|
||||||
|
fMarked = marked;
|
||||||
|
Invalidate();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Invalidate()
|
||||||
|
{
|
||||||
|
// :-/
|
||||||
|
if (fListView->LockLooper()) {
|
||||||
|
fListView->InvalidateItem(
|
||||||
|
fListView->IndexOf(this));
|
||||||
|
fListView->UnlockLooper();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Style* style;
|
||||||
|
private:
|
||||||
|
StyleListView* fListView;
|
||||||
|
bool fMarkEnabled;
|
||||||
|
bool fMarked;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
class ShapeStyleListener : public ShapeListener,
|
||||||
|
public ShapeContainerListener {
|
||||||
|
public:
|
||||||
|
ShapeStyleListener(StyleListView* listView)
|
||||||
|
: fListView(listView),
|
||||||
|
fShape(NULL)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
virtual ~ShapeStyleListener()
|
||||||
|
{
|
||||||
|
SetShape(NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
// ShapeListener interface
|
||||||
|
virtual void TransformerAdded(Transformer* t, int32 index) {}
|
||||||
|
virtual void TransformerRemoved(Transformer* t) {}
|
||||||
|
|
||||||
|
virtual void StyleChanged(Style* oldStyle, Style* newStyle)
|
||||||
|
{
|
||||||
|
fListView->_SetStyleMarked(oldStyle, false);
|
||||||
|
fListView->_SetStyleMarked(newStyle, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
// ShapeContainerListener interface
|
||||||
|
virtual void ShapeAdded(Shape* shape, int32 index) {}
|
||||||
|
virtual void ShapeRemoved(Shape* shape)
|
||||||
|
{
|
||||||
|
fListView->SetCurrentShape(NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
// ShapeStyleListener
|
||||||
|
void SetShape(Shape* shape)
|
||||||
|
{
|
||||||
|
if (fShape == shape)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (fShape)
|
||||||
|
fShape->RemoveListener(this);
|
||||||
|
|
||||||
|
fShape = shape;
|
||||||
|
|
||||||
|
if (fShape)
|
||||||
|
fShape->AddListener(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
Shape* CurrentShape() const
|
||||||
|
{
|
||||||
|
return fShape;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
StyleListView* fListView;
|
||||||
|
Shape* fShape;
|
||||||
|
};
|
||||||
|
|
||||||
|
// #pragma mark -
|
||||||
|
|
||||||
|
// constructor
|
||||||
|
StyleListView::StyleListView(BRect frame,
|
||||||
|
const char* name,
|
||||||
|
BMessage* message, BHandler* target)
|
||||||
|
: SimpleListView(frame, name,
|
||||||
|
NULL, B_SINGLE_SELECTION_LIST),
|
||||||
|
fMessage(message),
|
||||||
|
fStyleContainer(NULL),
|
||||||
|
fShapeContainer(NULL),
|
||||||
|
fSelection(NULL),
|
||||||
|
fCommandStack(NULL),
|
||||||
|
|
||||||
|
fCurrentShape(NULL),
|
||||||
|
fShapeListener(new ShapeStyleListener(this))
|
||||||
|
{
|
||||||
|
SetTarget(target);
|
||||||
|
}
|
||||||
|
|
||||||
|
// destructor
|
||||||
|
StyleListView::~StyleListView()
|
||||||
|
{
|
||||||
|
_MakeEmpty();
|
||||||
|
delete fMessage;
|
||||||
|
|
||||||
|
if (fStyleContainer)
|
||||||
|
fStyleContainer->RemoveListener(this);
|
||||||
|
|
||||||
|
if (fShapeContainer)
|
||||||
|
fShapeContainer->RemoveListener(fShapeListener);
|
||||||
|
|
||||||
|
delete fShapeListener;
|
||||||
|
}
|
||||||
|
|
||||||
|
// SelectionChanged
|
||||||
|
void
|
||||||
|
StyleListView::SelectionChanged()
|
||||||
|
{
|
||||||
|
// NOTE: single selection list
|
||||||
|
|
||||||
|
StyleListItem* item
|
||||||
|
= dynamic_cast<StyleListItem*>(ItemAt(CurrentSelection(0)));
|
||||||
|
if (item && fMessage) {
|
||||||
|
BMessage message(*fMessage);
|
||||||
|
message.AddPointer("style", (void*)item->style);
|
||||||
|
Invoke(&message);
|
||||||
|
}
|
||||||
|
|
||||||
|
// modify global Selection
|
||||||
|
if (!fSelection)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (item)
|
||||||
|
fSelection->Select(item->style);
|
||||||
|
else
|
||||||
|
fSelection->DeselectAll();
|
||||||
|
}
|
||||||
|
|
||||||
|
// MouseDown
|
||||||
|
void
|
||||||
|
StyleListView::MouseDown(BPoint where)
|
||||||
|
{
|
||||||
|
if (!fCurrentShape) {
|
||||||
|
SimpleListView::MouseDown(where);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool handled = false;
|
||||||
|
int32 index = IndexOf(where);
|
||||||
|
StyleListItem* item = dynamic_cast<StyleListItem*>(ItemAt(index));
|
||||||
|
if (item) {
|
||||||
|
BRect itemFrame(ItemFrame(index));
|
||||||
|
itemFrame.right = itemFrame.left
|
||||||
|
+ kBorderOffset + kMarkWidth
|
||||||
|
+ kTextOffset / 2.0;
|
||||||
|
Style* style = item->style;
|
||||||
|
if (itemFrame.Contains(where)) {
|
||||||
|
// set the style on the shape
|
||||||
|
// TODO: code this command...
|
||||||
|
// Command* command = new SetStyleToShapeCommand(
|
||||||
|
// fCurrentShape, style);
|
||||||
|
// fCommandStack->Perform(command);
|
||||||
|
fCurrentShape->SetStyle(style);
|
||||||
|
handled = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!handled)
|
||||||
|
SimpleListView::MouseDown(where);
|
||||||
|
}
|
||||||
|
|
||||||
|
// MessageReceived
|
||||||
|
void
|
||||||
|
StyleListView::MessageReceived(BMessage* message)
|
||||||
|
{
|
||||||
|
SimpleListView::MessageReceived(message);
|
||||||
|
}
|
||||||
|
|
||||||
|
// MakeDragMessage
|
||||||
|
void
|
||||||
|
StyleListView::MakeDragMessage(BMessage* message) const
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
// AcceptDragMessage
|
||||||
|
bool
|
||||||
|
StyleListView::AcceptDragMessage(const BMessage* message) const
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// SetDropTargetRect
|
||||||
|
void
|
||||||
|
StyleListView::SetDropTargetRect(const BMessage* message, BPoint where)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
// MoveItems
|
||||||
|
void
|
||||||
|
StyleListView::MoveItems(BList& items, int32 toIndex)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
// CopyItems
|
||||||
|
void
|
||||||
|
StyleListView::CopyItems(BList& items, int32 toIndex)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
// RemoveItemList
|
||||||
|
void
|
||||||
|
StyleListView::RemoveItemList(BList& indices)
|
||||||
|
{
|
||||||
|
// TODO: allow removing items
|
||||||
|
}
|
||||||
|
|
||||||
|
// CloneItem
|
||||||
|
BListItem*
|
||||||
|
StyleListView::CloneItem(int32 index) const
|
||||||
|
{
|
||||||
|
if (StyleListItem* item = dynamic_cast<StyleListItem*>(ItemAt(index))) {
|
||||||
|
return new StyleListItem(item->style,
|
||||||
|
const_cast<StyleListView*>(this),
|
||||||
|
fCurrentShape != NULL);
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
// #pragma mark -
|
||||||
|
|
||||||
|
// StyleAdded
|
||||||
|
void
|
||||||
|
StyleListView::StyleAdded(Style* style)
|
||||||
|
{
|
||||||
|
// NOTE: we are in the thread that messed with the
|
||||||
|
// StyleManager, so no need to lock the
|
||||||
|
// container, when this is changed to asynchronous
|
||||||
|
// notifications, then it would need to be read-locked!
|
||||||
|
if (!LockLooper())
|
||||||
|
return;
|
||||||
|
|
||||||
|
// NOTE: shapes are always added at the end
|
||||||
|
// of the list, so the sorting is synced...
|
||||||
|
if (_AddStyle(style))
|
||||||
|
Select(CountItems() - 1);
|
||||||
|
|
||||||
|
UnlockLooper();
|
||||||
|
}
|
||||||
|
|
||||||
|
// StyleRemoved
|
||||||
|
void
|
||||||
|
StyleListView::StyleRemoved(Style* style)
|
||||||
|
{
|
||||||
|
// NOTE: we are in the thread that messed with the
|
||||||
|
// StyleManager, so no need to lock the
|
||||||
|
// container, when this is changed to asynchronous
|
||||||
|
// notifications, then it would need to be read-locked!
|
||||||
|
if (!LockLooper())
|
||||||
|
return;
|
||||||
|
|
||||||
|
// NOTE: we're only interested in Style objects
|
||||||
|
_RemoveStyle(style);
|
||||||
|
|
||||||
|
UnlockLooper();
|
||||||
|
}
|
||||||
|
|
||||||
|
// #pragma mark -
|
||||||
|
|
||||||
|
// SetStyleManager
|
||||||
|
void
|
||||||
|
StyleListView::SetStyleManager(StyleManager* container)
|
||||||
|
{
|
||||||
|
if (fStyleContainer == container)
|
||||||
|
return;
|
||||||
|
|
||||||
|
// detach from old container
|
||||||
|
if (fStyleContainer)
|
||||||
|
fStyleContainer->RemoveListener(this);
|
||||||
|
|
||||||
|
_MakeEmpty();
|
||||||
|
|
||||||
|
fStyleContainer = container;
|
||||||
|
|
||||||
|
if (!fStyleContainer)
|
||||||
|
return;
|
||||||
|
|
||||||
|
fStyleContainer->AddListener(this);
|
||||||
|
|
||||||
|
// sync
|
||||||
|
// if (!fStyleContainer->ReadLock())
|
||||||
|
// return;
|
||||||
|
|
||||||
|
int32 count = fStyleContainer->CountStyles();
|
||||||
|
for (int32 i = 0; i < count; i++)
|
||||||
|
_AddStyle(fStyleContainer->StyleAtFast(i));
|
||||||
|
|
||||||
|
// fStyleContainer->ReadUnlock();
|
||||||
|
}
|
||||||
|
|
||||||
|
// SetShapeContainer
|
||||||
|
void
|
||||||
|
StyleListView::SetShapeContainer(ShapeContainer* container)
|
||||||
|
{
|
||||||
|
if (fShapeContainer == container)
|
||||||
|
return;
|
||||||
|
|
||||||
|
// detach from old container
|
||||||
|
if (fShapeContainer)
|
||||||
|
fShapeContainer->RemoveListener(fShapeListener);
|
||||||
|
|
||||||
|
fShapeContainer = container;
|
||||||
|
|
||||||
|
if (fShapeContainer)
|
||||||
|
fShapeContainer->AddListener(fShapeListener);
|
||||||
|
}
|
||||||
|
|
||||||
|
// SetSelection
|
||||||
|
void
|
||||||
|
StyleListView::SetSelection(Selection* selection)
|
||||||
|
{
|
||||||
|
fSelection = selection;
|
||||||
|
}
|
||||||
|
|
||||||
|
// SetCurrentShape
|
||||||
|
void
|
||||||
|
StyleListView::SetCurrentShape(Shape* shape)
|
||||||
|
{
|
||||||
|
if (fCurrentShape == shape)
|
||||||
|
return;
|
||||||
|
|
||||||
|
fCurrentShape = shape;
|
||||||
|
fShapeListener->SetShape(shape);
|
||||||
|
|
||||||
|
_UpdateMarks();
|
||||||
|
}
|
||||||
|
|
||||||
|
// #pragma mark -
|
||||||
|
|
||||||
|
// _AddStyle
|
||||||
|
bool
|
||||||
|
StyleListView::_AddStyle(Style* style)
|
||||||
|
{
|
||||||
|
if (style)
|
||||||
|
return AddItem(new StyleListItem(style, this, fCurrentShape != NULL));
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// _RemoveStyle
|
||||||
|
bool
|
||||||
|
StyleListView::_RemoveStyle(Style* style)
|
||||||
|
{
|
||||||
|
StyleListItem* item = _ItemForStyle(style);
|
||||||
|
if (item && RemoveItem(item)) {
|
||||||
|
delete item;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// _ItemForStyle
|
||||||
|
StyleListItem*
|
||||||
|
StyleListView::_ItemForStyle(Style* style) const
|
||||||
|
{
|
||||||
|
for (int32 i = 0;
|
||||||
|
StyleListItem* item = dynamic_cast<StyleListItem*>(ItemAt(i));
|
||||||
|
i++) {
|
||||||
|
if (item->style == style)
|
||||||
|
return item;
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
// #pragma mark -
|
||||||
|
|
||||||
|
// _UpdateMarks
|
||||||
|
void
|
||||||
|
StyleListView::_UpdateMarks()
|
||||||
|
{
|
||||||
|
int32 count = CountItems();
|
||||||
|
if (fCurrentShape) {
|
||||||
|
// enable display of marks and mark items whoes
|
||||||
|
// style is contained in fCurrentShape
|
||||||
|
for (int32 i = 0; i < count; i++) {
|
||||||
|
StyleListItem* item = dynamic_cast<StyleListItem*>(ItemAt(i));
|
||||||
|
if (!item)
|
||||||
|
continue;
|
||||||
|
item->SetMarkEnabled(true);
|
||||||
|
item->SetMarked(fCurrentShape->Style() == item->style);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// disable display of marks
|
||||||
|
for (int32 i = 0; i < count; i++) {
|
||||||
|
StyleListItem* item = dynamic_cast<StyleListItem*>(ItemAt(i));
|
||||||
|
if (!item)
|
||||||
|
continue;
|
||||||
|
item->SetMarkEnabled(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Invalidate();
|
||||||
|
}
|
||||||
|
|
||||||
|
// _SetStyleMarked
|
||||||
|
void
|
||||||
|
StyleListView::_SetStyleMarked(Style* style, bool marked)
|
||||||
|
{
|
||||||
|
if (StyleListItem* item = _ItemForStyle(style)) {
|
||||||
|
item->SetMarked(marked);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,87 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2006, Haiku.
|
||||||
|
* Distributed under the terms of the MIT License.
|
||||||
|
*
|
||||||
|
* Authors:
|
||||||
|
* Stephan Aßmus <[email protected]>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef STYLE_LIST_VIEW_H
|
||||||
|
#define STYLE_LIST_VIEW_H
|
||||||
|
|
||||||
|
#include "ListViews.h"
|
||||||
|
#include "StyleManager.h"
|
||||||
|
|
||||||
|
class CommandStack;
|
||||||
|
class Selection;
|
||||||
|
class Shape;
|
||||||
|
class ShapeContainer;
|
||||||
|
class ShapeListener;
|
||||||
|
class Style;
|
||||||
|
class StyleListItem;
|
||||||
|
|
||||||
|
class StyleListView : public SimpleListView,
|
||||||
|
public StyleManagerListener {
|
||||||
|
public:
|
||||||
|
StyleListView(BRect frame,
|
||||||
|
const char* name,
|
||||||
|
BMessage* selectionMessage = NULL,
|
||||||
|
BHandler* target = NULL);
|
||||||
|
virtual ~StyleListView();
|
||||||
|
|
||||||
|
// SimpleListView interface
|
||||||
|
virtual void SelectionChanged();
|
||||||
|
|
||||||
|
virtual void MouseDown(BPoint where);
|
||||||
|
virtual void MessageReceived(BMessage* message);
|
||||||
|
|
||||||
|
virtual void MakeDragMessage(BMessage* message) const;
|
||||||
|
|
||||||
|
virtual bool AcceptDragMessage(const BMessage* message) const;
|
||||||
|
virtual void SetDropTargetRect(const BMessage* message,
|
||||||
|
BPoint where);
|
||||||
|
|
||||||
|
virtual void MoveItems(BList& items, int32 toIndex);
|
||||||
|
virtual void CopyItems(BList& items, int32 toIndex);
|
||||||
|
virtual void RemoveItemList(BList& indices);
|
||||||
|
|
||||||
|
virtual BListItem* CloneItem(int32 atIndex) const;
|
||||||
|
|
||||||
|
// StyleManagerListener interface
|
||||||
|
virtual void StyleAdded(Style* style);
|
||||||
|
virtual void StyleRemoved(Style* style);
|
||||||
|
|
||||||
|
// StyleListView
|
||||||
|
void SetStyleManager(StyleManager* container);
|
||||||
|
void SetShapeContainer(ShapeContainer* container);
|
||||||
|
void SetSelection(Selection* selection);
|
||||||
|
|
||||||
|
void SetCurrentShape(Shape* shape);
|
||||||
|
Shape* CurrentShape() const
|
||||||
|
{ return fCurrentShape; }
|
||||||
|
|
||||||
|
private:
|
||||||
|
bool _AddStyle(Style* style);
|
||||||
|
bool _RemoveStyle(Style* style);
|
||||||
|
|
||||||
|
StyleListItem* _ItemForStyle(Style* style) const;
|
||||||
|
|
||||||
|
friend class ShapeStyleListener;
|
||||||
|
void _UpdateMarks();
|
||||||
|
void _SetStyleMarked(Style* style, bool marked);
|
||||||
|
|
||||||
|
BMessage* fMessage;
|
||||||
|
|
||||||
|
StyleManager* fStyleContainer;
|
||||||
|
ShapeContainer* fShapeContainer;
|
||||||
|
Selection* fSelection;
|
||||||
|
CommandStack* fCommandStack;
|
||||||
|
|
||||||
|
Shape* fCurrentShape;
|
||||||
|
// the style item will be marked that
|
||||||
|
// is referenced by this shape
|
||||||
|
|
||||||
|
ShapeStyleListener* fShapeListener;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // STYLE_LIST_VIEW_H
|
||||||
@@ -18,8 +18,8 @@
|
|||||||
#include <Window.h>
|
#include <Window.h>
|
||||||
|
|
||||||
#include "CommandStack.h"
|
#include "CommandStack.h"
|
||||||
//#include "MoveTransformersCommand.h"
|
#include "MoveTransformersCommand.h"
|
||||||
//#include "RemoveTransformersCommand.h"
|
#include "RemoveTransformersCommand.h"
|
||||||
#include "Transformer.h"
|
#include "Transformer.h"
|
||||||
#include "Observer.h"
|
#include "Observer.h"
|
||||||
#include "Selection.h"
|
#include "Selection.h"
|
||||||
@@ -160,29 +160,29 @@ TransformerListView::MakeDragMessage(BMessage* message) const
|
|||||||
void
|
void
|
||||||
TransformerListView::MoveItems(BList& items, int32 toIndex)
|
TransformerListView::MoveItems(BList& items, int32 toIndex)
|
||||||
{
|
{
|
||||||
// if (!fCommandStack || !fShape)
|
if (!fCommandStack || !fShape)
|
||||||
// return;
|
return;
|
||||||
//
|
|
||||||
// int32 count = items.CountItems();
|
int32 count = items.CountItems();
|
||||||
// Transformer** transformers = new (nothrow) Transformer*[count];
|
Transformer** transformers = new (nothrow) Transformer*[count];
|
||||||
// if (!shapes)
|
if (!transformers)
|
||||||
// return;
|
return;
|
||||||
//
|
|
||||||
// for (int32 i = 0; i < count; i++) {
|
for (int32 i = 0; i < count; i++) {
|
||||||
// TransformerItem* item
|
TransformerItem* item
|
||||||
// = dynamic_cast<TransformerItem*>((BListItem*)items.ItemAtFast(i));
|
= dynamic_cast<TransformerItem*>((BListItem*)items.ItemAtFast(i));
|
||||||
// transformers[i] = item ? item->transformer : NULL;
|
transformers[i] = item ? item->transformer : NULL;
|
||||||
// }
|
}
|
||||||
//
|
|
||||||
// MoveTransformersCommand* command
|
MoveTransformersCommand* command
|
||||||
// = new (nothrow) MoveTransformersCommand(fShape,
|
= new (nothrow) MoveTransformersCommand(fShape,
|
||||||
// transformers, count, toIndex);
|
transformers, count, toIndex);
|
||||||
// if (!command) {
|
if (!command) {
|
||||||
// delete[] transformers;
|
delete[] transformers;
|
||||||
// return;
|
return;
|
||||||
// }
|
}
|
||||||
//
|
|
||||||
// fCommandStack->Perform(command);
|
fCommandStack->Perform(command);
|
||||||
}
|
}
|
||||||
|
|
||||||
// CopyItems
|
// CopyItems
|
||||||
@@ -197,16 +197,16 @@ TransformerListView::CopyItems(BList& items, int32 toIndex)
|
|||||||
void
|
void
|
||||||
TransformerListView::RemoveItemList(BList& indexList)
|
TransformerListView::RemoveItemList(BList& indexList)
|
||||||
{
|
{
|
||||||
// if (!fCommandStack || !fShape)
|
if (!fCommandStack || !fShape)
|
||||||
// return;
|
return;
|
||||||
//
|
|
||||||
// int32 count = indexList.CountItems();
|
int32 count = indexList.CountItems();
|
||||||
// const int32* indices = (int32*)indexList.Items();
|
const int32* indices = (int32*)indexList.Items();
|
||||||
//
|
|
||||||
// RemoveTransformersCommand* command
|
RemoveTransformersCommand* command
|
||||||
// = new (nothrow) RemoveTransformersCommand(fShape,
|
= new (nothrow) RemoveTransformersCommand(fShape,
|
||||||
// indices, count);
|
indices, count);
|
||||||
// fCommandStack->Perform(command);
|
fCommandStack->Perform(command);
|
||||||
}
|
}
|
||||||
|
|
||||||
// CloneItem
|
// CloneItem
|
||||||
@@ -254,6 +254,13 @@ TransformerListView::TransformerRemoved(Transformer* transformer)
|
|||||||
UnlockLooper();
|
UnlockLooper();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// StyleChanged
|
||||||
|
void
|
||||||
|
TransformerListView::StyleChanged(Style* oldStyle, Style* newStyle)
|
||||||
|
{
|
||||||
|
// we don't care
|
||||||
|
}
|
||||||
|
|
||||||
// #pragma mark -
|
// #pragma mark -
|
||||||
|
|
||||||
// SetShape
|
// SetShape
|
||||||
|
|||||||
@@ -42,16 +42,21 @@ class TransformerListView : public SimpleListView,
|
|||||||
int32 index);
|
int32 index);
|
||||||
virtual void TransformerRemoved(Transformer* transformer);
|
virtual void TransformerRemoved(Transformer* transformer);
|
||||||
|
|
||||||
|
virtual void StyleChanged(Style* oldStyle, Style* newStyle);
|
||||||
|
|
||||||
// TransformerListView
|
// TransformerListView
|
||||||
void SetShape(Shape* shape);
|
void SetShape(Shape* shape);
|
||||||
void SetSelection(Selection* selection);
|
void SetSelection(Selection* selection);
|
||||||
void SetCommandStack(CommandStack* stack);
|
void SetCommandStack(CommandStack* stack);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
bool _AddTransformer(Transformer* transformer, int32 index);
|
bool _AddTransformer(
|
||||||
bool _RemoveTransformer(Transformer* transformer);
|
Transformer* transformer, int32 index);
|
||||||
|
bool _RemoveTransformer(
|
||||||
|
Transformer* transformer);
|
||||||
|
|
||||||
TransformerItem* _ItemForTransformer(Transformer* transformer) const;
|
TransformerItem* _ItemForTransformer(
|
||||||
|
Transformer* transformer) const;
|
||||||
|
|
||||||
BMessage* fMessage;
|
BMessage* fMessage;
|
||||||
|
|
||||||
|
|||||||
@@ -177,6 +177,8 @@ Shape::InitCheck() const
|
|||||||
return fPaths ? B_OK : B_NO_MEMORY;
|
return fPaths ? B_OK : B_NO_MEMORY;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// #pragma mark -
|
||||||
|
|
||||||
// SetStyle
|
// SetStyle
|
||||||
void
|
void
|
||||||
Shape::SetStyle(::Style* style)
|
Shape::SetStyle(::Style* style)
|
||||||
@@ -189,6 +191,7 @@ Shape::SetStyle(::Style* style)
|
|||||||
fStyle->Release();
|
fStyle->Release();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
::Style* oldStyle = fStyle;
|
||||||
fStyle = style;
|
fStyle = style;
|
||||||
|
|
||||||
if (fStyle) {
|
if (fStyle) {
|
||||||
@@ -196,7 +199,7 @@ Shape::SetStyle(::Style* style)
|
|||||||
fStyle->AddObserver(this);
|
fStyle->AddObserver(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
_NotifyRerender();
|
_NotifyStyleChanged(oldStyle, fStyle);
|
||||||
}
|
}
|
||||||
|
|
||||||
// #pragma mark -
|
// #pragma mark -
|
||||||
@@ -373,6 +376,21 @@ Shape::_NotifyTransformerRemoved(Transformer* transformer) const
|
|||||||
_NotifyRerender();
|
_NotifyRerender();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// _NotifyStyleChanged
|
||||||
|
void
|
||||||
|
Shape::_NotifyStyleChanged(::Style* oldStyle, ::Style* newStyle) const
|
||||||
|
{
|
||||||
|
BList listeners(fListeners);
|
||||||
|
int32 count = listeners.CountItems();
|
||||||
|
for (int32 i = 0; i < count; i++) {
|
||||||
|
ShapeListener* listener
|
||||||
|
= (ShapeListener*)listeners.ItemAtFast(i);
|
||||||
|
listener->StyleChanged(oldStyle, newStyle);
|
||||||
|
}
|
||||||
|
// TODO: merge Observable and ShapeListener interface
|
||||||
|
_NotifyRerender();
|
||||||
|
}
|
||||||
|
|
||||||
// _NotifyRerender
|
// _NotifyRerender
|
||||||
void
|
void
|
||||||
Shape::_NotifyRerender() const
|
Shape::_NotifyRerender() const
|
||||||
|
|||||||
@@ -13,6 +13,7 @@
|
|||||||
class Style;
|
class Style;
|
||||||
|
|
||||||
// TODO: merge Observer and ShapeListener interface
|
// TODO: merge Observer and ShapeListener interface
|
||||||
|
// ie add "AppearanceChanged(Shape* shape)"
|
||||||
class ShapeListener {
|
class ShapeListener {
|
||||||
public:
|
public:
|
||||||
ShapeListener();
|
ShapeListener();
|
||||||
@@ -21,6 +22,9 @@ class ShapeListener {
|
|||||||
virtual void TransformerAdded(Transformer* t,
|
virtual void TransformerAdded(Transformer* t,
|
||||||
int32 index) = 0;
|
int32 index) = 0;
|
||||||
virtual void TransformerRemoved(Transformer* t) = 0;
|
virtual void TransformerRemoved(Transformer* t) = 0;
|
||||||
|
|
||||||
|
virtual void StyleChanged(::Style* oldStyle,
|
||||||
|
::Style* newStyle) = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
class Shape : public IconObject,
|
class Shape : public IconObject,
|
||||||
@@ -84,6 +88,9 @@ class Shape : public IconObject,
|
|||||||
int32 index) const;
|
int32 index) const;
|
||||||
void _NotifyTransformerRemoved(Transformer* t) const;
|
void _NotifyTransformerRemoved(Transformer* t) const;
|
||||||
|
|
||||||
|
void _NotifyStyleChanged(::Style* oldStyle,
|
||||||
|
::Style* newStyle) const;
|
||||||
|
|
||||||
void _NotifyRerender() const;
|
void _NotifyRerender() const;
|
||||||
|
|
||||||
PathContainer* fPaths;
|
PathContainer* fPaths;
|
||||||
|
|||||||
@@ -11,6 +11,8 @@
|
|||||||
|
|
||||||
#include "Command.h"
|
#include "Command.h"
|
||||||
|
|
||||||
|
// TODO: make a templated "move items" command?
|
||||||
|
|
||||||
class Shape;
|
class Shape;
|
||||||
class ShapeContainer;
|
class ShapeContainer;
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,161 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2006, Haiku.
|
||||||
|
* Distributed under the terms of the MIT License.
|
||||||
|
*
|
||||||
|
* Authors:
|
||||||
|
* Stephan Aßmus <superstippi@gmx.de>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "MoveTransformersCommand.h"
|
||||||
|
|
||||||
|
#include <new>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#include "Shape.h"
|
||||||
|
#include "Transformer.h"
|
||||||
|
|
||||||
|
using std::nothrow;
|
||||||
|
|
||||||
|
// constructor
|
||||||
|
MoveTransformersCommand::MoveTransformersCommand(Shape* container,
|
||||||
|
Transformer** transformers,
|
||||||
|
int32 count,
|
||||||
|
int32 toIndex)
|
||||||
|
: Command(),
|
||||||
|
fContainer(container),
|
||||||
|
fTransformers(transformers),
|
||||||
|
fIndices(count > 0 ? new (nothrow) int32[count] : NULL),
|
||||||
|
fToIndex(toIndex),
|
||||||
|
fCount(count)
|
||||||
|
{
|
||||||
|
if (!fContainer || !fTransformers || !fIndices)
|
||||||
|
return;
|
||||||
|
|
||||||
|
// init original shape indices and
|
||||||
|
// adjust toIndex compensating for items that
|
||||||
|
// are removed before that index
|
||||||
|
int32 itemsBeforeIndex = 0;
|
||||||
|
for (int32 i = 0; i < fCount; i++) {
|
||||||
|
fIndices[i] = fContainer->IndexOf(fTransformers[i]);
|
||||||
|
if (fIndices[i] >= 0 && fIndices[i] < fToIndex)
|
||||||
|
itemsBeforeIndex++;
|
||||||
|
}
|
||||||
|
fToIndex -= itemsBeforeIndex;
|
||||||
|
}
|
||||||
|
|
||||||
|
// destructor
|
||||||
|
MoveTransformersCommand::~MoveTransformersCommand()
|
||||||
|
{
|
||||||
|
delete[] fTransformers;
|
||||||
|
delete[] fIndices;
|
||||||
|
}
|
||||||
|
|
||||||
|
// InitCheck
|
||||||
|
status_t
|
||||||
|
MoveTransformersCommand::InitCheck()
|
||||||
|
{
|
||||||
|
if (!fContainer || !fTransformers || !fIndices)
|
||||||
|
return B_NO_INIT;
|
||||||
|
|
||||||
|
// analyse the move, don't return B_OK in case
|
||||||
|
// the container state does not change...
|
||||||
|
|
||||||
|
int32 index = fIndices[0];
|
||||||
|
// NOTE: fIndices == NULL if fCount < 1
|
||||||
|
|
||||||
|
if (index != fToIndex) {
|
||||||
|
// a change is guaranteed
|
||||||
|
return B_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
// the insertion index is the same as the index of the first
|
||||||
|
// moved item, a change only occures if the indices of the
|
||||||
|
// moved items is not contiguous
|
||||||
|
bool isContiguous = true;
|
||||||
|
for (int32 i = 1; i < fCount; i++) {
|
||||||
|
if (fIndices[i] != index + 1) {
|
||||||
|
isContiguous = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
index = fIndices[i];
|
||||||
|
}
|
||||||
|
if (isContiguous) {
|
||||||
|
// the container state will not change because of the move
|
||||||
|
return B_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
return B_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Perform
|
||||||
|
status_t
|
||||||
|
MoveTransformersCommand::Perform()
|
||||||
|
{
|
||||||
|
status_t ret = B_OK;
|
||||||
|
|
||||||
|
// remove shapes from container
|
||||||
|
for (int32 i = 0; i < fCount; i++) {
|
||||||
|
if (fTransformers[i]
|
||||||
|
&& !fContainer->RemoveTransformer(fTransformers[i])) {
|
||||||
|
ret = B_ERROR;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (ret < B_OK)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
// add shapes to container at the insertion index
|
||||||
|
int32 index = fToIndex;
|
||||||
|
for (int32 i = 0; i < fCount; i++) {
|
||||||
|
if (fTransformers[i]
|
||||||
|
&& !fContainer->AddTransformer(fTransformers[i], index++)) {
|
||||||
|
ret = B_ERROR;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Undo
|
||||||
|
status_t
|
||||||
|
MoveTransformersCommand::Undo()
|
||||||
|
{
|
||||||
|
status_t ret = B_OK;
|
||||||
|
|
||||||
|
// remove shapes from container
|
||||||
|
for (int32 i = 0; i < fCount; i++) {
|
||||||
|
if (fTransformers[i]
|
||||||
|
&& !fContainer->RemoveTransformer(fTransformers[i])) {
|
||||||
|
ret = B_ERROR;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (ret < B_OK)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
// add shapes to container at remembered indices
|
||||||
|
for (int32 i = 0; i < fCount; i++) {
|
||||||
|
if (fTransformers[i]
|
||||||
|
&& !fContainer->AddTransformer(fTransformers[i], fIndices[i])) {
|
||||||
|
ret = B_ERROR;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetName
|
||||||
|
void
|
||||||
|
MoveTransformersCommand::GetName(BString& name)
|
||||||
|
{
|
||||||
|
// if (fCount > 1)
|
||||||
|
// name << _GetString(MOVE_TRANSFORMERS, "Move Transformers");
|
||||||
|
// else
|
||||||
|
// name << _GetString(MOVE_TRANSFORMER, "Move Transformer");
|
||||||
|
if (fCount > 1)
|
||||||
|
name << "Move Transformers";
|
||||||
|
else
|
||||||
|
name << "Move Transformer";
|
||||||
|
}
|
||||||
@@ -0,0 +1,43 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2006, Haiku.
|
||||||
|
* Distributed under the terms of the MIT License.
|
||||||
|
*
|
||||||
|
* Authors:
|
||||||
|
* Stephan Aßmus <superstippi@gmx.de>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef MOVE_TRANSFORMERS_COMMAND_H
|
||||||
|
#define MOVE_TRANSFORMERS_COMMAND_H
|
||||||
|
|
||||||
|
#include "Command.h"
|
||||||
|
|
||||||
|
// TODO: make a templated "move items" command?
|
||||||
|
|
||||||
|
class Shape;
|
||||||
|
class Transformer;
|
||||||
|
|
||||||
|
class MoveTransformersCommand : public Command {
|
||||||
|
public:
|
||||||
|
MoveTransformersCommand(
|
||||||
|
Shape* shape,
|
||||||
|
Transformer** transformers,
|
||||||
|
int32 count,
|
||||||
|
int32 toIndex);
|
||||||
|
virtual ~MoveTransformersCommand();
|
||||||
|
|
||||||
|
virtual status_t InitCheck();
|
||||||
|
|
||||||
|
virtual status_t Perform();
|
||||||
|
virtual status_t Undo();
|
||||||
|
|
||||||
|
virtual void GetName(BString& name);
|
||||||
|
|
||||||
|
private:
|
||||||
|
Shape* fContainer;
|
||||||
|
Transformer** fTransformers;
|
||||||
|
int32* fIndices;
|
||||||
|
int32 fToIndex;
|
||||||
|
int32 fCount;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // MOVE_TRANSFORMERS_COMMAND_H
|
||||||
@@ -0,0 +1,107 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2006, Haiku.
|
||||||
|
* Distributed under the terms of the MIT License.
|
||||||
|
*
|
||||||
|
* Authors:
|
||||||
|
* Stephan Aßmus <superstippi@gmx.de>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "RemoveTransformersCommand.h"
|
||||||
|
|
||||||
|
#include <new>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "ShapeContainer.h"
|
||||||
|
#include "Shape.h"
|
||||||
|
|
||||||
|
using std::nothrow;
|
||||||
|
|
||||||
|
// constructor
|
||||||
|
RemoveTransformersCommand::RemoveTransformersCommand(Shape* container,
|
||||||
|
const int32* indices,
|
||||||
|
int32 count)
|
||||||
|
: Command(),
|
||||||
|
fContainer(container),
|
||||||
|
fTransformers(count > 0 ? new (nothrow) Transformer*[count] : NULL),
|
||||||
|
fIndices(count > 0 ? new (nothrow) int32[count] : NULL),
|
||||||
|
fCount(count),
|
||||||
|
fTransformersRemoved(false)
|
||||||
|
{
|
||||||
|
if (!fContainer || !fTransformers || !fIndices)
|
||||||
|
return;
|
||||||
|
|
||||||
|
memcpy(fIndices, indices, sizeof(int32) * fCount);
|
||||||
|
for (int32 i = 0; i < fCount; i++)
|
||||||
|
fTransformers[i] = fContainer->TransformerAt(fIndices[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// destructor
|
||||||
|
RemoveTransformersCommand::~RemoveTransformersCommand()
|
||||||
|
{
|
||||||
|
if (fTransformersRemoved && fTransformers) {
|
||||||
|
for (int32 i = 0; i < fCount; i++)
|
||||||
|
delete fTransformers[i];
|
||||||
|
}
|
||||||
|
delete[] fTransformers;
|
||||||
|
delete[] fIndices;
|
||||||
|
}
|
||||||
|
|
||||||
|
// InitCheck
|
||||||
|
status_t
|
||||||
|
RemoveTransformersCommand::InitCheck()
|
||||||
|
{
|
||||||
|
return fContainer && fTransformers && fIndices ? B_OK : B_NO_INIT;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Perform
|
||||||
|
status_t
|
||||||
|
RemoveTransformersCommand::Perform()
|
||||||
|
{
|
||||||
|
status_t ret = B_OK;
|
||||||
|
|
||||||
|
// remove shapes from container
|
||||||
|
for (int32 i = 0; i < fCount; i++) {
|
||||||
|
if (fTransformers[i]
|
||||||
|
&& !fContainer->RemoveTransformer(fTransformers[i])) {
|
||||||
|
ret = B_ERROR;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fTransformersRemoved = true;
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Undo
|
||||||
|
status_t
|
||||||
|
RemoveTransformersCommand::Undo()
|
||||||
|
{
|
||||||
|
status_t ret = B_OK;
|
||||||
|
|
||||||
|
// add shapes to container at remembered indices
|
||||||
|
for (int32 i = 0; i < fCount; i++) {
|
||||||
|
if (fTransformers[i]
|
||||||
|
&& !fContainer->AddTransformer(fTransformers[i], fIndices[i])) {
|
||||||
|
ret = B_ERROR;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fTransformersRemoved = false;
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetName
|
||||||
|
void
|
||||||
|
RemoveTransformersCommand::GetName(BString& name)
|
||||||
|
{
|
||||||
|
// if (fCount > 1)
|
||||||
|
// name << _GetString(MOVE_TRANSFORMERS, "Move Transformers");
|
||||||
|
// else
|
||||||
|
// name << _GetString(MOVE_TRANSFORMER, "Move Transformer");
|
||||||
|
if (fCount > 1)
|
||||||
|
name << "Remove Transformers";
|
||||||
|
else
|
||||||
|
name << "Remove Transformer";
|
||||||
|
}
|
||||||
@@ -0,0 +1,42 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2006, Haiku.
|
||||||
|
* Distributed under the terms of the MIT License.
|
||||||
|
*
|
||||||
|
* Authors:
|
||||||
|
* Stephan Aßmus <superstippi@gmx.de>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef REMOVE_TRANSFORMERS_COMMAND_H
|
||||||
|
#define REMOVE_TRANSFORMERS_COMMAND_H
|
||||||
|
|
||||||
|
#include "Command.h"
|
||||||
|
|
||||||
|
class Shape;
|
||||||
|
class Transformer;
|
||||||
|
|
||||||
|
// TODO: make a templated "remove items" command?
|
||||||
|
|
||||||
|
class RemoveTransformersCommand : public Command {
|
||||||
|
public:
|
||||||
|
RemoveTransformersCommand(
|
||||||
|
Shape* container,
|
||||||
|
const int32* indices,
|
||||||
|
int32 count);
|
||||||
|
virtual ~RemoveTransformersCommand();
|
||||||
|
|
||||||
|
virtual status_t InitCheck();
|
||||||
|
|
||||||
|
virtual status_t Perform();
|
||||||
|
virtual status_t Undo();
|
||||||
|
|
||||||
|
virtual void GetName(BString& name);
|
||||||
|
|
||||||
|
private:
|
||||||
|
Shape* fContainer;
|
||||||
|
Transformer** fTransformers;
|
||||||
|
int32* fIndices;
|
||||||
|
int32 fCount;
|
||||||
|
bool fTransformersRemoved;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // REMOVE_TRANSFORMERS_COMMAND_H
|
||||||
Reference in New Issue
Block a user