|
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 |
}
|