zoomedit: Use toolbox for polygon adder.

This commit is contained in:
neoraider 2007-12-05 18:34:01 +00:00
parent d389dce3ef
commit 19690f0304
12 changed files with 193 additions and 80 deletions

View file

@ -41,23 +41,30 @@ EditManager::EditManager(Window *window) {
}
void EditManager::addRoom() {
newRoom = Room(idManager.generate("room"));
mode = ADD;
if(mode == VIEW) {
newRoom = Room(idManager.generate("room"));
mode = ADD;
activeRoom = &newRoom;
activeRoom = &newRoom;
window->update();
window->update();
}
}
void EditManager::finishRoom() {
mode = VIEW;
if(mode == ADD) {
mode = VIEW;
if(newRoom.size() > 2 && polygonOk(newRoom)) {
window->getLevel().push_back(newRoom);
activeRoom = &window->getLevel().back();
if(newRoom.size() > 2 && polygonOk(newRoom)) {
window->getLevel().push_back(newRoom);
activeRoom = &window->getLevel().back();
}
else {
activeRoom = NULL;
}
window->update();
}
window->update();
}
void EditManager::addVertex(const Vertex &v) {

View file

@ -4,6 +4,6 @@ zoomedit_SOURCES = zoomedit.cpp UIManager.cpp Renderer.cpp Vertex.cpp \
IdManager.cpp WindowManager.cpp SidebarManager.cpp \
Window.cpp SidebarView.cpp SidebarAdd.cpp Drawer.cpp \
EditManager.cpp FileManager.cpp SidebarToolbox.cpp \
ToolAddPolygon.cpp
ToolSelector.cpp ToolAddPolygon.cpp
zoomedit_CPPFLAGS = @GTK_CFLAGS@ @GTKGLEXT_CFLAGS@ @libxml2_CFLAGS@
zoomedit_LDADD = @GTK_LIBS@ @GTKGLEXT_LIBS@ @libxml2_LIBS@

View file

@ -59,6 +59,7 @@ am_zoomedit_OBJECTS = zoomedit-zoomedit.$(OBJEXT) \
zoomedit-Drawer.$(OBJEXT) zoomedit-EditManager.$(OBJEXT) \
zoomedit-FileManager.$(OBJEXT) \
zoomedit-SidebarToolbox.$(OBJEXT) \
zoomedit-ToolSelector.$(OBJEXT) \
zoomedit-ToolAddPolygon.$(OBJEXT)
zoomedit_OBJECTS = $(am_zoomedit_OBJECTS)
zoomedit_DEPENDENCIES =
@ -186,7 +187,7 @@ zoomedit_SOURCES = zoomedit.cpp UIManager.cpp Renderer.cpp Vertex.cpp \
IdManager.cpp WindowManager.cpp SidebarManager.cpp \
Window.cpp SidebarView.cpp SidebarAdd.cpp Drawer.cpp \
EditManager.cpp FileManager.cpp SidebarToolbox.cpp \
ToolAddPolygon.cpp
ToolSelector.cpp ToolAddPolygon.cpp
zoomedit_CPPFLAGS = @GTK_CFLAGS@ @GTKGLEXT_CFLAGS@ @libxml2_CFLAGS@
zoomedit_LDADD = @GTK_LIBS@ @GTKGLEXT_LIBS@ @libxml2_LIBS@
@ -292,6 +293,7 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zoomedit-SidebarToolbox.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zoomedit-SidebarView.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zoomedit-ToolAddPolygon.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zoomedit-ToolSelector.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zoomedit-Triangle.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zoomedit-UIManager.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zoomedit-Vertex.Po@am__quote@
@ -579,6 +581,20 @@ zoomedit-SidebarToolbox.obj: SidebarToolbox.cpp
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(zoomedit_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o zoomedit-SidebarToolbox.obj `if test -f 'SidebarToolbox.cpp'; then $(CYGPATH_W) 'SidebarToolbox.cpp'; else $(CYGPATH_W) '$(srcdir)/SidebarToolbox.cpp'; fi`
zoomedit-ToolSelector.o: ToolSelector.cpp
@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(zoomedit_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT zoomedit-ToolSelector.o -MD -MP -MF $(DEPDIR)/zoomedit-ToolSelector.Tpo -c -o zoomedit-ToolSelector.o `test -f 'ToolSelector.cpp' || echo '$(srcdir)/'`ToolSelector.cpp
@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/zoomedit-ToolSelector.Tpo $(DEPDIR)/zoomedit-ToolSelector.Po
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='ToolSelector.cpp' object='zoomedit-ToolSelector.o' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(zoomedit_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o zoomedit-ToolSelector.o `test -f 'ToolSelector.cpp' || echo '$(srcdir)/'`ToolSelector.cpp
zoomedit-ToolSelector.obj: ToolSelector.cpp
@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(zoomedit_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT zoomedit-ToolSelector.obj -MD -MP -MF $(DEPDIR)/zoomedit-ToolSelector.Tpo -c -o zoomedit-ToolSelector.obj `if test -f 'ToolSelector.cpp'; then $(CYGPATH_W) 'ToolSelector.cpp'; else $(CYGPATH_W) '$(srcdir)/ToolSelector.cpp'; fi`
@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/zoomedit-ToolSelector.Tpo $(DEPDIR)/zoomedit-ToolSelector.Po
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='ToolSelector.cpp' object='zoomedit-ToolSelector.obj' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(zoomedit_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o zoomedit-ToolSelector.obj `if test -f 'ToolSelector.cpp'; then $(CYGPATH_W) 'ToolSelector.cpp'; else $(CYGPATH_W) '$(srcdir)/ToolSelector.cpp'; fi`
zoomedit-ToolAddPolygon.o: ToolAddPolygon.cpp
@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(zoomedit_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT zoomedit-ToolAddPolygon.o -MD -MP -MF $(DEPDIR)/zoomedit-ToolAddPolygon.Tpo -c -o zoomedit-ToolAddPolygon.o `test -f 'ToolAddPolygon.cpp' || echo '$(srcdir)/'`ToolAddPolygon.cpp
@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/zoomedit-ToolAddPolygon.Tpo $(DEPDIR)/zoomedit-ToolAddPolygon.Po

View file

@ -2,7 +2,7 @@
SidebarManager::SidebarManager(EditManager *editor)
: sidebarView(editor), sidebarAdd(editor), tool(editor)
: sidebarToolbox(editor), sidebarView(editor), sidebarAdd(editor), toolAddPolygon(editor)
{
this->editor = editor;
activeSidebar = NULL;
@ -21,7 +21,7 @@ SidebarManager::SidebarManager(EditManager *editor)
gtk_container_add(GTK_CONTAINER(scrolledWindow), viewport);
gtk_viewport_set_shadow_type(GTK_VIEWPORT(viewport), GTK_SHADOW_NONE);
sidebarToolbox.addTool(&tool);
sidebarToolbox.addTool(&toolAddPolygon);
gtk_widget_show(sidebar);
}

View file

@ -7,6 +7,7 @@
#include "SidebarView.h"
#include "SidebarAdd.h"
#include "EditManager.h"
#include "ToolSelector.h"
#include "ToolAddPolygon.h"
@ -23,7 +24,7 @@ class SidebarManager {
EditManager *editor;
ToolAddPolygon tool;
ToolAddPolygon toolAddPolygon;
// prevent shallow copy
SidebarManager(const SidebarManager &w);

View file

@ -1,73 +1,27 @@
#include "SidebarToolbox.h"
void SidebarToolbox::toolAction(GtkWidget *button, Tool *tool) {
tool->action();
void SidebarToolbox::buttonToggled(GtkWidget *button, SidebarToolbox *toolbox) {
if(!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button)))
return;
toolbox->activateTool(toolbox->buttonsRev[button]);
}
void SidebarToolbox::sizeAllocate(GtkWidget *widget, GtkAllocation *allocation, SidebarToolbox *toolbox) {
toolbox->updateRows(false);
}
SidebarToolbox::SidebarToolbox() {
cols = 1; rows = 0;
widget = gtk_table_new(1, 1, TRUE);
g_object_ref_sink(G_OBJECT(widget));
g_signal_connect(G_OBJECT(widget), "size-allocate", G_CALLBACK(sizeAllocate), this);
gtk_widget_show(widget);
}
SidebarToolbox::~SidebarToolbox() {
for(std::map<Tool*, GtkWidget*>::iterator button = buttons.begin(); button != buttons.end(); button++) {
g_object_unref(G_OBJECT(button->second));
}
g_object_unref(G_OBJECT(widget));
}
void SidebarToolbox::addTool(Tool *tool) {
tools.push_back(tool);
GtkWidget *button = gtk_button_new();
g_object_ref_sink(G_OBJECT(button));
gtk_button_set_image(GTK_BUTTON(button), tool->getImage());
gtk_widget_show(button);
g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(toolAction), tool);
buttons.insert(std::pair<Tool*, GtkWidget*>(tool, button));
updateRows(true);
update();
}
void SidebarToolbox::removeTool(Tool *tool) {
tools.remove(tool);
g_object_unref(G_OBJECT(buttons[tool]));
buttons.erase(tool);
updateRows(true);
}
void SidebarToolbox::updateRows(bool changed) {
int cols, rows;
GtkRequisition requisition = {0, 0};
GtkRequisition requisition;
if(tools.empty()) {
cols = 1; rows = 0;
}
else {
gtk_widget_size_request(buttons[tools.front()], &requisition);
gtk_widget_size_request(buttons[tools.front()], &requisition);
cols = MAX(1, widget->allocation.width/requisition.width);
rows = (tools.size()+cols-1)/cols;
}
int cols = MAX(1, widget->allocation.width/requisition.width);
int rows = (tools.size()+cols-1)/cols;
if(this->cols != cols || this->rows != rows || changed) {
if(changed || this->cols != cols || this->rows != rows) {
this->cols = cols;
this->rows = rows;
@ -93,6 +47,74 @@ void SidebarToolbox::updateRows(bool changed) {
}
}
void SidebarToolbox::activateTool(Tool *tool) {
if(activeTool == tool)
return;
if(activeTool)
activeTool->deactivate();
activeTool = tool;
tool->activate();
}
SidebarToolbox::SidebarToolbox(EditManager *editManager) : toolSelector(editManager) {
widget = gtk_table_new(1, 1, TRUE);
g_object_ref_sink(G_OBJECT(widget));
g_signal_connect(G_OBJECT(widget), "size-allocate", G_CALLBACK(sizeAllocate), this);
addTool(&toolSelector);
activeTool = NULL;
activateTool(&toolSelector);
gtk_widget_show(widget);
}
SidebarToolbox::~SidebarToolbox() {
for(std::map<Tool*, GtkWidget*>::iterator button = buttons.begin(); button != buttons.end(); button++) {
g_object_unref(G_OBJECT(button->second));
}
g_object_unref(G_OBJECT(widget));
}
void SidebarToolbox::addTool(Tool *tool) {
GtkWidget *button;
if(tools.empty())
button = gtk_radio_button_new(NULL);
else
button = gtk_radio_button_new_from_widget(GTK_RADIO_BUTTON(buttons[tools.front()]));
g_object_ref_sink(G_OBJECT(button));
gtk_toggle_button_set_mode(GTK_TOGGLE_BUTTON(button), FALSE);
gtk_button_set_relief(GTK_BUTTON(button), GTK_RELIEF_NONE);
gtk_button_set_image(GTK_BUTTON(button), tool->getImage());
gtk_widget_show(button);
g_signal_connect(G_OBJECT(button), "toggled", G_CALLBACK(buttonToggled), this);
tools.push_back(tool);
buttons.insert(std::pair<Tool*, GtkWidget*>(tool, button));
buttonsRev.insert(std::pair<GtkWidget*, Tool*>(button, tool));
updateRows(true);
update();
}
void SidebarToolbox::removeTool(Tool *tool) {
if(tool == activeTool) {
activateTool(&toolSelector);
}
tools.remove(tool);
buttonsRev.erase(buttons[tool]);
g_object_unref(G_OBJECT(buttons[tool]));
buttons.erase(tool);
updateRows(true);
}
void SidebarToolbox::update() {
for(std::list<Tool*>::iterator tool = tools.begin(); tool != tools.end(); tool++) {
gtk_widget_set_tooltip_text(buttons[*tool], (*tool)->getName());

View file

@ -7,6 +7,7 @@
#include "EditManager.h"
#include "Sidebar.h"
#include "Tool.h"
#include "ToolSelector.h"
class SidebarToolbox : Sidebar {
private:
@ -14,20 +15,26 @@ class SidebarToolbox : Sidebar {
std::list<Tool*> tools;
std::map<Tool*, GtkWidget*> buttons;
std::map<GtkWidget*, Tool*> buttonsRev;
Tool *activeTool;
ToolSelector toolSelector;
int cols, rows;
void updateRows(bool changed);
void activateTool(Tool *tool);
// prevent shallow copy
SidebarToolbox(const SidebarToolbox &w);
const SidebarToolbox& operator=(const SidebarToolbox &w);
static void toolAction(GtkWidget *button, Tool *tool);
static void buttonToggled(GtkWidget *button, SidebarToolbox *toolbox);
static void sizeAllocate(GtkWidget *widget, GtkAllocation *allocation, SidebarToolbox *toolbox);
public:
SidebarToolbox();
SidebarToolbox(EditManager *editManager);
virtual ~SidebarToolbox();
GtkWidget* getWidget() {

3
Tool.h
View file

@ -8,7 +8,8 @@ class Tool {
public:
virtual ~Tool() {}
virtual void action() = 0;
virtual void activate() {};
virtual void deactivate() {};
virtual const gchar *getName() = 0;
virtual GtkWidget *getImage() = 0;

View file

@ -15,10 +15,14 @@ ToolAddPolygon::~ToolAddPolygon() {
g_object_unref(G_OBJECT(image));
}
void ToolAddPolygon::action() {
void ToolAddPolygon::activate() {
editManager->addRoom();
}
void ToolAddPolygon::deactivate() {
editManager->finishRoom();
}
GtkWidget *ToolAddPolygon::getImage() {
return image;
}

View file

@ -20,14 +20,15 @@ class ToolAddPolygon : public Tool {
ToolAddPolygon(EditManager *editManager);
virtual ~ToolAddPolygon();
virtual void action();
virtual void activate();
virtual void deactivate();
virtual const gchar *getName() {
return name;
}
bool isSensitive() {
return (editManager->getMode() != EditManager::ADD);
return TRUE;
}
virtual GtkWidget *getImage();

20
ToolSelector.cpp Normal file
View file

@ -0,0 +1,20 @@
#include "ToolSelector.h"
const gchar *ToolSelector::name = (const gchar*)"Select";
ToolSelector::ToolSelector(EditManager *editManager) {
this->editManager = editManager;
image = gtk_image_new_from_stock(GTK_STOCK_MISSING_IMAGE, GTK_ICON_SIZE_BUTTON);
g_object_ref_sink(G_OBJECT(image));
}
ToolSelector::~ToolSelector() {
g_object_unref(G_OBJECT(image));
}
GtkWidget *ToolSelector::getImage() {
return image;
}

34
ToolSelector.h Normal file
View file

@ -0,0 +1,34 @@
#ifndef TOOLSELECTOR_H_
#define TOOLSELECTOR_H_
#include "Tool.h"
#include "EditManager.h"
class ToolSelector : public Tool {
private:
GtkWidget *image;
EditManager *editManager;
static const gchar* name;
// prevent shallow copy
ToolSelector(const ToolSelector &t);
const ToolSelector& operator=(const ToolSelector &t);
public:
ToolSelector(EditManager *editManager);
virtual ~ToolSelector();
virtual const gchar *getName() {
return name;
}
bool isSensitive() {
return TRUE;
}
virtual GtkWidget *getImage();
};
#endif /*TOOLSELECTOR_H_*/