Blame synfig-studio/src/gui/docks/dockable.cpp

Carlos Lopez a09598
/* === S Y N F I G ========================================================= */
Carlos Lopez a09598
/*!	\file dockable.cpp
Carlos Lopez a09598
**	\brief Template File
Carlos Lopez a09598
**
Carlos Lopez a09598
**	$Id$
Carlos Lopez a09598
**
Carlos Lopez a09598
**	\legal
Carlos Lopez a09598
**	Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley
Carlos Lopez a09598
**
Carlos Lopez a09598
**	This package is free software; you can redistribute it and/or
Carlos Lopez a09598
**	modify it under the terms of the GNU General Public License as
Carlos Lopez a09598
**	published by the Free Software Foundation; either version 2 of
Carlos Lopez a09598
**	the License, or (at your option) any later version.
Carlos Lopez a09598
**
Carlos Lopez a09598
**	This package is distributed in the hope that it will be useful,
Carlos Lopez a09598
**	but WITHOUT ANY WARRANTY; without even the implied warranty of
Carlos Lopez a09598
**	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Carlos Lopez a09598
**	General Public License for more details.
Carlos Lopez a09598
**	\endlegal
Carlos Lopez a09598
*/
Carlos Lopez a09598
/* ========================================================================= */
Carlos Lopez a09598
Carlos Lopez a09598
/* === H E A D E R S ======================================================= */
Carlos Lopez a09598
Carlos Lopez a09598
#ifdef USING_PCH
Carlos Lopez a09598
#	include "pch.h"
Carlos Lopez a09598
#else
Carlos Lopez a09598
#ifdef HAVE_CONFIG_H
Carlos Lopez a09598
#	include <config.h></config.h>
Carlos Lopez a09598
#endif
Carlos Lopez a09598
bw 94d8a6
#include <synfig general.h=""></synfig>
bw 94d8a6
Carlos Lopez a09598
#include "app.h"
Carlos Lopez a09598
Nikita Kitaev 5fe12e
#include "docks/dockable.h"
Nikita Kitaev 5fe12e
#include "docks/dockmanager.h"
Nikita Kitaev 5fe12e
#include "docks/dockbook.h"
Nikita Kitaev 5fe12e
#include "docks/dockdialog.h"
Carlos Lopez a09598
abdbf2
#include <gui localization.h=""></gui>
Carlos Lopez a09598
Carlos Lopez a09598
#endif
Carlos Lopez a09598
Carlos Lopez a09598
/* === U S I N G =========================================================== */
Carlos Lopez a09598
Carlos Lopez a09598
using namespace std;
Carlos Lopez a09598
using namespace etl;
Carlos Lopez a09598
using namespace synfig;
Carlos Lopez a09598
using namespace studio;
Carlos Lopez a09598
Carlos Lopez a09598
/* === M A C R O S ========================================================= */
Carlos Lopez a09598
Carlos Lopez a09598
#ifndef IMAGE_EXT
Carlos Lopez a09598
#	define IMAGE_EXT	"png"
Carlos Lopez a09598
#endif
Carlos Lopez a09598
Carlos Lopez a09598
/* === G L O B A L S ======================================================= */
Carlos Lopez a09598
Carlos Lopez a09598
/* === P R O C E D U R E S ================================================= */
Carlos Lopez a09598
Carlos Lopez a09598
/* === M E T H O D S ======================================================= */
Carlos Lopez a09598
fda829
Dockable::Dockable(const synfig::String& name, const synfig::String& local_name, Gtk::StockID stock_id):
Carlos Lopez a09598
	name_(name),
Carlos Lopez a09598
	local_name_(local_name),
fda829
	stock_id_(stock_id),
28a5c6
	use_scrolled(true),
28a5c6
	container(),
28a5c6
	toolbar_container(),
fda829
	dnd_success_()
Carlos Lopez a09598
{
28a5c6
	clear();
fda829
	set_size_request(175, 120);
fda829
	show();
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
Dockable::~Dockable()
fda829
{ }
fda829
fda829
bool
fda829
Dockable::get_use_scrolled() const
28a5c6
	{ return use_scrolled; }
Carlos Lopez a09598
Carlos Lopez a09598
void
fda829
Dockable::set_use_scrolled(bool x) {
28a5c6
	use_scrolled = x;
28a5c6
	if (!container) return;
28a5c6
	Gtk::PolicyType policy = use_scrolled ? Gtk::POLICY_AUTOMATIC : Gtk::POLICY_NEVER;
28a5c6
	container->set_policy(policy, policy);
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
void
Carlos Lopez a09598
Dockable::on_drag_data_received(const Glib::RefPtr<gdk::dragcontext>& context, int, int, const Gtk::SelectionData& selection_data, guint, guint time)</gdk::dragcontext>
Carlos Lopez a09598
{
d9f3a6
	if (selection_data.get_length() >= 0
d9f3a6
	 && selection_data.get_format() == 8
c9f070
	 && selection_data.get_data_type() == "SYNFIG_DOCK")
Carlos Lopez a09598
	{
Carlos Lopez a09598
		Dockable& dockable(**reinterpret_cast<dockable**>(const_cast<guint8*>(selection_data.get_data())));</guint8*></dockable**>
839371
		DockBook *parent = dynamic_cast<dockbook*>(get_parent());</dockbook*>
839371
		DockBook *dockable_parent = dynamic_cast<dockbook*>(dockable.get_parent());</dockbook*>
fda829
		if (parent) {
839371
			if (dockable_parent != parent)
fda829
				parent->add(dockable, parent->page_num(*this));
839371
			else
fda829
				parent->reorder_child(dockable, parent->page_num(*this));
839371
			dockable.present();
839371
			context->drag_finish(true, false, time);
c4fb64
			App::dock_manager->update_window_titles();
839371
			return;
839371
		}
Carlos Lopez a09598
	}
Carlos Lopez a09598
	context->drag_finish(false, false, time);
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
void
Carlos Lopez a09598
Dockable::on_drag_end(const Glib::RefPtr<gdk::dragcontext>&/*context*/)</gdk::dragcontext>
Carlos Lopez a09598
{
fda829
	if (!dnd_success_) {
464569
		DockManager::remove_widget_recursive(*this);
Carlos Lopez a09598
		present();
Carlos Lopez a09598
	}
Rodolfo Ribeiro Gomes 10cedc
	App::dock_manager->set_dock_area_visibility(false, nullptr);
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
void
Carlos Lopez a09598
Dockable::on_drag_begin(const Glib::RefPtr<gdk::dragcontext>&/*context*/)</gdk::dragcontext>
Carlos Lopez a09598
{
fda829
	dnd_success_ = false;
Rodolfo Ribeiro Gomes 10cedc
	App::dock_manager->set_dock_area_visibility(true, dynamic_cast<dockbook*>(get_parent()));</dockbook*>
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
void
Carlos Lopez a09598
Dockable::on_drag_data_get(const Glib::RefPtr<gdk::dragcontext>&, Gtk::SelectionData& selection_data, guint /*info*/, guint /*time*/)</gdk::dragcontext>
Carlos Lopez a09598
{
Carlos Lopez a09598
	Dockable* tmp(this);
fda829
	dnd_success_ = true;
Carlos Lopez d1eca7
	selection_data.set(8, reinterpret_cast<const guchar*="">(&tmp), sizeof(Dockable**));</const>
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
void
Carlos Lopez a09598
Dockable::set_local_name(const synfig::String& local_name)
Carlos Lopez a09598
{
22eda5
	local_name_ = local_name;
c4fb64
	signal_stock_id_changed()();
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
void
fda829
Dockable::attach_dnd_to(Gtk::Widget& widget)
Carlos Lopez a09598
{
fda829
	std::vector<gtk::targetentry> listTargets;</gtk::targetentry>
fda829
	listTargets.push_back( Gtk::TargetEntry("SYNFIG_DOCK") );
fda829
	Gtk::StockItem stock_item;
Carlos Lopez a09598
fda829
	widget.drag_source_set(listTargets);
fda829
	if (Gtk::Stock::lookup(get_stock_id(), stock_item))
fda829
		widget.drag_source_set_icon(get_stock_id());
fda829
	widget.drag_dest_set(listTargets);
fda829
	widget.signal_drag_data_get().connect( sigc::mem_fun(*this, &Dockable::on_drag_data_get ));
fda829
	widget.signal_drag_end().connect( sigc::mem_fun(*this, &Dockable::on_drag_end ));
fda829
	widget.signal_drag_begin().connect( sigc::mem_fun(*this, &Dockable::on_drag_begin ));
fda829
	widget.signal_drag_data_received().connect( sigc::mem_fun(*this, &Dockable::on_drag_data_received ));
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
void
fda829
Dockable::add(Gtk::Widget& x)
Carlos Lopez a09598
{
28a5c6
	reset_container();
fda829
	x.set_hexpand();
fda829
	x.set_vexpand();
fda829
	x.show();
28a5c6
	container->add(x);
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
void
fda829
Dockable::set_toolbar(Gtk::Toolbar& toolbar)
Carlos Lopez a09598
{
28a5c6
	reset_toolbar();
fda829
	toolbar.set_icon_size(Gtk::IconSize(1) /*GTK::ICON_SIZE_MENU*/);
fda829
	toolbar.set_toolbar_style(Gtk::TOOLBAR_ICONS);
fda829
	toolbar.set_hexpand(true);
fda829
	toolbar.set_vexpand(false);
fda829
	toolbar.show();
28a5c6
	toolbar_container->add(toolbar);
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
Gtk::ToolButton*
Carlos Lopez a09598
Dockable::add_button(const Gtk::StockID& stock_id, const synfig::String& tooltip)
Carlos Lopez a09598
{
28a5c6
	if (!toolbar_container) reset_toolbar();
28a5c6
	Gtk::Toolbar *toolbar = dynamic_cast<gtk::toolbar*>(toolbar_container->get_child());</gtk::toolbar*>
fda829
	if (!toolbar) {
fda829
		toolbar = manage(new Gtk::Toolbar());
fda829
		set_toolbar(*toolbar);
fda829
	}
Carlos Lopez a09598
Carlos Lopez a09598
	Gtk::ToolButton* ret(manage(new Gtk::ToolButton(stock_id)));
Carlos Lopez 7ada2a
	ret->set_tooltip_text(tooltip);
Carlos Lopez a09598
	ret->show();
fda829
	toolbar->set_has_tooltip();
fda829
	toolbar->append(*ret);
Carlos Lopez a09598
	return ret;
Carlos Lopez a09598
}
Carlos Lopez a09598
fda829
void
28a5c6
Dockable::reset_container()
28a5c6
{
28a5c6
	if (container) delete container;
28a5c6
	container = manage(new Gtk::ScrolledWindow);
28a5c6
	container->set_shadow_type(Gtk::SHADOW_NONE);
28a5c6
	container->set_hexpand();
28a5c6
	container->set_vexpand();
28a5c6
	container->show();
28a5c6
	set_use_scrolled(use_scrolled);
28a5c6
	attach(*container, 0, 0, 1, 1);
4f7f11
	
4f7f11
	// to avoid GTK warning:
4f7f11
	//   Allocating size to widget without calling gtk_widget_get_preferred_width/height().
4f7f11
	//   How does the code know the size to allocate?
4f7f11
	// related with combination of Grid, ScrolledWindow and TreeView
478b0d
	//App::process_all_events();
478b0d
	// Update:
478b0d
	// Seems bug in other place, process_all_events() here produces
478b0d
	// a concurrent event processing and collissions
28a5c6
}
28a5c6
28a5c6
void
28a5c6
Dockable::reset_toolbar()
28a5c6
{
28a5c6
	if (toolbar_container) delete toolbar_container;
28a5c6
	toolbar_container = manage(new Gtk::EventBox);
28a5c6
	toolbar_container->set_hexpand();
28a5c6
	toolbar_container->show();
28a5c6
	attach(*toolbar_container, 0, 1, 1, 1);
28a5c6
}
28a5c6
28a5c6
void
fda829
Dockable::clear()
fda829
{
28a5c6
	reset_container();
28a5c6
	reset_toolbar();
fda829
}
Carlos Lopez a09598
Carlos Lopez a09598
void
Carlos Lopez a09598
Dockable::present()
Carlos Lopez a09598
{
839371
	DockBook *parent = dynamic_cast<dockbook*>(get_parent());</dockbook*>
fda829
	if (parent) {
839371
		parent->set_current_page(parent->page_num(*this));
839371
		parent->present();
fda829
	} else {
464569
		show();
fda829
464569
		DockBook* book = manage(new DockBook());
464569
		book->add(*this);
fda829
		book->show();
fda829
		
Carlos Lopez a09598
		DockDialog* dock_dialog(new DockDialog());
464569
		dock_dialog->add(*book);
Carlos Lopez a09598
		dock_dialog->present();
Carlos Lopez a09598
	}
c4fb64
	App::dock_manager->update_window_titles();
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
Gtk::Widget*
Carlos Lopez a09598
Dockable::create_tab_label()
Carlos Lopez a09598
{
fda829
	Gtk::EventBox *event_box = manage(new Gtk::EventBox());
Carlos Lopez a09598
	attach_dnd_to(*event_box);
Carlos Lopez a09598
fda829
	// Check to make sure the icon is valid
fda829
	Gtk::StockItem stock_item;
fda829
	if (Gtk::Stock::lookup(get_stock_id(), stock_item)) {
fda829
		// add icon
fda829
		Gtk::IconSize iconsize = Gtk::IconSize::from_name("synfig-small_icon_16x16");
fda829
		Gtk::Image* icon(manage(new Gtk::Image(get_stock_id(), iconsize)));
fda829
		icon->show();
fda829
		event_box->set_tooltip_text(get_local_name());
fda829
		event_box->add(*icon);
fda829
	} else {
fda829
		// bad icon, add label
fda829
		Gtk::Label* label = manage(new Gtk::Label(get_local_name()));
fda829
		label->show();
fda829
		event_box->add(*label);
Carlos Lopez a09598
	}
Carlos Lopez a09598
Carlos Lopez a09598
	return event_box;
Carlos Lopez a09598
}
Rodolfo Ribeiro Gomes 9277d9
Rodolfo Ribeiro Gomes 9277d9
void Dockable::write_layout_string(std::string& /*params*/) const
Rodolfo Ribeiro Gomes 9277d9
{
Rodolfo Ribeiro Gomes 9277d9
}
Rodolfo Ribeiro Gomes 9277d9
Rodolfo Ribeiro Gomes 9277d9
void Dockable::read_layout_string(const std::string& /*params*/) const
Rodolfo Ribeiro Gomes 9277d9
{
Rodolfo Ribeiro Gomes 9277d9
}