summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: 9dbf817)
raw | patch | inline | side by side (parent: 9dbf817)
author | joncruz <joncruz@users.sourceforge.net> | |
Sat, 8 Dec 2007 07:03:33 +0000 (07:03 +0000) | ||
committer | joncruz <joncruz@users.sourceforge.net> | |
Sat, 8 Dec 2007 07:03:33 +0000 (07:03 +0000) |
src/ui/dialog/panel-dialog.h | patch | blob | history |
index 4efc8862280cbbd35c3a72486f590854021218c0..3eeea6d95c27ad37cf22b2cf6de77bc35c6ec469 100644 (file)
namespace UI {
namespace Dialog {
-/* local desktop event handlers */
-static void handle_activate_desktop(Inkscape::Application *, SPDesktop *, void *);
-static void handle_deactivate_desktop(Inkscape::Application *, SPDesktop *, void *);
+class PanelDialogBase {
+public:
+ PanelDialogBase(Panel &panel, char const */*prefs_path*/, int const /*verb_num*/,
+ Glib::ustring const &/*apply_label*/) :
+ _panel (panel) { }
-struct PanelDialogBase {
- virtual void present() =0;
- virtual Panel &getPanel() =0;
+ virtual void present() = 0;
virtual ~PanelDialogBase() {}
-private:
- virtual void _propagateDocumentReplaced(SPDesktop* desktop, SPDocument *document) =0;
- virtual void _propagateDesktopActivated(Inkscape::Application *, SPDesktop *) =0;
- virtual void _propagateDesktopDeactivated(Inkscape::Application *, SPDesktop *) =0;
+ virtual Panel &getPanel() { return _panel; }
+
+protected:
+ static void handle_deactivate_desktop(Inkscape::Application *application, SPDesktop *desktop, void *data) {
+ g_return_if_fail(data != NULL);
+ static_cast<PanelDialogBase *>(data)->_propagateDesktopDeactivated(application, desktop);
+ }
+
+ static void _handle_activate_desktop(Inkscape::Application *application, SPDesktop *desktop, void *data) {
+ g_return_if_fail(data != NULL);
+ static_cast<PanelDialogBase *>(data)->_propagateDesktopActivated(application, desktop);
+ }
+
+ inline virtual void _propagateDocumentReplaced(SPDesktop* desktop, SPDocument *document);
+ inline virtual void _propagateDesktopActivated(Inkscape::Application *, SPDesktop *);
+ inline virtual void _propagateDesktopDeactivated(Inkscape::Application *, SPDesktop *);
- friend void handle_activate_desktop(Inkscape::Application *, SPDesktop *, void *);
- friend void handle_deactivate_desktop(Inkscape::Application *, SPDesktop *, void *);
+ Panel &_panel;
+ sigc::connection _document_replaced_connection;
};
template <typename Behavior>
class PanelDialog : public PanelDialogBase, public Inkscape::UI::Dialog::Dialog {
public:
- PanelDialog(Panel &contents, char const *prefs_path, int const verb_num,
+ PanelDialog(Panel &contents, char const *prefs_path, int const verb_num,
Glib::ustring const &apply_label);
virtual ~PanelDialog() {}
template <typename T>
static PanelDialog<Behavior> *create();
- virtual void present();
-
- Panel &getPanel() { return _panel; }
+ virtual void present() { Dialog::present(); }
private:
- void _propagateDocumentReplaced(SPDesktop* desktop, SPDocument *document);
- void _propagateDesktopActivated(Inkscape::Application *, SPDesktop *);
- void _propagateDesktopDeactivated(Inkscape::Application *, SPDesktop *);
-
- Panel &_panel;
- sigc::connection _document_replaced_connection;
-
PanelDialog(); // no constructor without params
PanelDialog(PanelDialog<Behavior> const &d); // no copy
PanelDialog<Behavior>& operator=(PanelDialog<Behavior> const &d); // no assign
+};
+
+
+template <>
+class PanelDialog<Behavior::FloatingBehavior> :
+ public PanelDialogBase, public Inkscape::UI::Dialog::Dialog {
+public:
+ inline PanelDialog(Panel &contents, char const *prefs_path, int const verb_num,
+ Glib::ustring const &apply_label);
+
+ virtual ~PanelDialog() {}
+
+ template <typename T>
+ static PanelDialog<Behavior::FloatingBehavior> *create();
+
+ virtual void present() { Dialog::present(); }
+
+private:
+ PanelDialog(); // no constructor without params
+ PanelDialog(PanelDialog<Behavior::FloatingBehavior> const &d); // no copy
+ PanelDialog<Behavior::FloatingBehavior>&
+ operator=(PanelDialog<Behavior::FloatingBehavior> const &d); // no assign
};
+
+
+void
+PanelDialogBase::_propagateDocumentReplaced(SPDesktop *desktop, SPDocument *document)
+{
+ _panel.signalDocumentReplaced().emit(desktop, document);
+}
+
+void
+PanelDialogBase::_propagateDesktopActivated(Inkscape::Application *application, SPDesktop *desktop)
+{
+ _document_replaced_connection =
+ desktop->connectDocumentReplaced(sigc::mem_fun(*this, &PanelDialogBase::_propagateDocumentReplaced));
+ _panel.signalActivateDesktop().emit(application, desktop);
+}
+
+void
+PanelDialogBase::_propagateDesktopDeactivated(Inkscape::Application *application, SPDesktop *desktop)
+{
+ _document_replaced_connection.disconnect();
+ _panel.signalDeactiveDesktop().emit(application, desktop);
+}
+
+
template <typename B>
-PanelDialog<B>::PanelDialog(Panel &panel, char const *prefs_path, int const verb_num, Glib::ustring const &apply_label) :
- Dialog(&B::create, prefs_path, verb_num, apply_label),
- _panel (panel)
+PanelDialog<B>::PanelDialog(Panel &panel, char const *prefs_path, int const verb_num,
+ Glib::ustring const &apply_label) :
+ PanelDialogBase(panel, prefs_path, verb_num, apply_label),
+ Dialog(&B::create, prefs_path, verb_num, apply_label)
{
Gtk::VBox *vbox = get_vbox();
_panel.signalResponse().connect(sigc::mem_fun(*this, &PanelDialog::_handleResponse));
_propagateDesktopActivated(INKSCAPE, desktop);
- _document_replaced_connection =
+ _document_replaced_connection =
desktop->connectDocumentReplaced(sigc::mem_fun(*this, &PanelDialog::_propagateDocumentReplaced));
if (prefs_get_int_attribute ("dialogs", "showclose", 0) || !apply_label.empty()) {
return new PanelDialog<B>(panel, panel.getPrefsPath(), panel.getVerb(), panel.getApplyLabel());
}
-/**
+
+PanelDialog<Behavior::FloatingBehavior>::PanelDialog(Panel &panel, char const *prefs_path,
+ int const verb_num, Glib::ustring const &apply_label) :
+ PanelDialogBase(panel, prefs_path, verb_num, apply_label),
+ Dialog(&Behavior::FloatingBehavior::create, prefs_path, verb_num, apply_label)
+{
+ Gtk::VBox *vbox = get_vbox();
+ _panel.signalResponse().connect(sigc::mem_fun(*this, &PanelDialog::_handleResponse));
+ _panel.signalPresent().connect(sigc::mem_fun(*this, &PanelDialog::present));
+
+ vbox->pack_start(_panel, true, true, 0);
+
+ SPDesktop *desktop = SP_ACTIVE_DESKTOP;
+
+ _propagateDesktopActivated(INKSCAPE, desktop);
+
+ _document_replaced_connection =
+ desktop->connectDocumentReplaced(sigc::mem_fun(*this, &PanelDialog::_propagateDocumentReplaced));
+
+ if (prefs_get_int_attribute ("dialogs", "showclose", 0) || !apply_label.empty()) {
+ // TODO: make the order of buttons obey the global preference
+ if (!apply_label.empty()) {
+ panel.addResponseButton(apply_label, Gtk::RESPONSE_APPLY);
+ panel.setDefaultResponse(Gtk::RESPONSE_APPLY);
+ }
+ panel.addResponseButton(Gtk::Stock::CLOSE, Gtk::RESPONSE_CLOSE);
+ }
+
+ show_all_children();
+}
+
+/**
* Specialize factory method for panel dialogs with floating behavior in order to make them work as
* singletons, i.e. allow them track the current active desktop.
*/
-template <> template <typename P>
+template <typename P>
PanelDialog<Behavior::FloatingBehavior> *
PanelDialog<Behavior::FloatingBehavior>::create()
{
Panel &panel = P::getInstance();
- PanelDialog<Behavior::FloatingBehavior> *instance =
- new PanelDialog<Behavior::FloatingBehavior>(panel, panel.getPrefsPath(),
+ PanelDialog<Behavior::FloatingBehavior> *instance =
+ new PanelDialog<Behavior::FloatingBehavior>(panel, panel.getPrefsPath(),
panel.getVerb(), panel.getApplyLabel());
- g_signal_connect(G_OBJECT(INKSCAPE), "activate_desktop", G_CALLBACK(handle_activate_desktop), instance);
+ g_signal_connect(G_OBJECT(INKSCAPE), "activate_desktop", G_CALLBACK(_handle_activate_desktop), instance);
g_signal_connect(G_OBJECT(INKSCAPE), "deactivate_desktop", G_CALLBACK(handle_deactivate_desktop), instance);
return instance;
}
-template <typename B>
-void
-PanelDialog<B>::present()
-{
- Dialog::present();
-}
-
-template <typename B>
-void
-PanelDialog<B>::_propagateDocumentReplaced(SPDesktop *desktop, SPDocument *document)
-{
- _panel.signalDocumentReplaced().emit(desktop, document);
-}
-
-template <typename B>
-void
-PanelDialog<B>::_propagateDesktopActivated(Inkscape::Application *application, SPDesktop *desktop)
-{
- _document_replaced_connection =
- desktop->connectDocumentReplaced(sigc::mem_fun(*this, &PanelDialog::_propagateDocumentReplaced));
- _panel.signalActivateDesktop().emit(application, desktop);
-}
-
-template <typename B>
-void
-PanelDialog<B>::_propagateDesktopDeactivated(Inkscape::Application *application, SPDesktop *desktop)
-{
- _document_replaced_connection.disconnect();
- _panel.signalDeactiveDesktop().emit(application, desktop);
-}
-
-
-static void
-handle_activate_desktop(Inkscape::Application *application, SPDesktop *desktop, void *data)
-{
- g_return_if_fail(data != NULL);
- static_cast<PanelDialogBase *>(data)->_propagateDesktopActivated(application, desktop);
-}
-
-static void
-handle_deactivate_desktop(Inkscape::Application *application, SPDesktop *desktop, void *data)
-{
- g_return_if_fail(data != NULL);
- static_cast<PanelDialogBase *>(data)->_propagateDesktopDeactivated(application, desktop);
-}
-
} // namespace Dialog
} // namespace UI
} // namespace Inkscape