1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104
|
/*
$Id: layout_manager_generic.cpp,v 1.10 2002/01/16 19:06:54 sphair Exp $
ClanGUI, copyrights by various people. Have a look in the CREDITS file.
This sourcecode is distributed using the Library GNU Public Licence,
version 2 or (at your option) any later version. Please read LICENSE
for details.
*/
#include "precomp.h"
#include "layout_manager_generic.h"
#include "API/GUI/component.h"
#include "API/Core/System/error.h"
/////////////////////////////////////////////////////////////////////////////
// Construction:
CL_LayoutManager_Generic::CL_LayoutManager_Generic(CL_LayoutManager *self)
:
layoutmanager(self)
{
}
CL_LayoutManager_Generic::~CL_LayoutManager_Generic()
{
std::list<CL_LayoutManager_Item *>::iterator it;
for(it = items.begin(); it != items.end(); ++it)
delete *it;
}
/////////////////////////////////////////////////////////////////////////////
// Operations:
void CL_LayoutManager_Generic::add_resize_position(
CL_Component *destination, CL_LayoutManager::ELayoutPosition destination_position,
CL_Component *source, CL_LayoutManager::ELayoutPosition source_position)
{
CL_LayoutManager_Item *item = new CL_LayoutManager_Item;
item->dest = destination;
item->dest_position = destination_position;
item->source = source;
item->source_position = source_position;
item->slot_resize = source->sig_resize().connect(
this, &CL_LayoutManager_Generic::on_resize, item);
// item->slot_move = source->sig_move().connect(
// this, &CL_LayoutManager_Generic::on_move, item);
items.push_back(item);
}
void CL_LayoutManager_Generic::add_resize_bottomleft(
CL_Component *destination, CL_Component *source)
{
add_resize_position(destination, CL_LayoutManager::x2, source, CL_LayoutManager::x2);
add_resize_position(destination, CL_LayoutManager::y2, source, CL_LayoutManager::y2);
}
void CL_LayoutManager_Generic::add_resize_left(
CL_Component *destination, CL_Component *source)
{
add_resize_position(destination, CL_LayoutManager::x2, source, CL_LayoutManager::x2);
}
/////////////////////////////////////////////////////////////////////////////
// Callbacks:
void CL_LayoutManager_Generic::on_resize(int old_width, int old_height, CL_LayoutManager_Item *item)
{
int diff_width = item->source->get_width() - old_width;
int diff_height = item->source->get_height() - old_height;
CL_Rect rect = item->dest->get_position();
int diff=0;
if(item->source_position == CL_LayoutManager::y2)
diff = diff_height;
if(item->source_position == CL_LayoutManager::x2)
diff = diff_width;
if(item->source_position == CL_LayoutManager::y1)
diff = 0;
if(item->source_position == CL_LayoutManager::x1)
diff = 0;
if(item->dest_position == CL_LayoutManager::x1)
rect.x1 += diff;
if(item->dest_position == CL_LayoutManager::y1)
rect.y1 += diff;
if(item->dest_position == CL_LayoutManager::x2)
rect.x2 += diff;
if(item->dest_position == CL_LayoutManager::y2)
rect.y2 += diff;
item->dest->set_position(rect);
}
void CL_LayoutManager_Generic::on_move(int old_x, int old_y, CL_LayoutManager_Item *item)
{
throw CL_Error("CL_LayoutManager_Generic::on_move not implemented yet");
}
|