e9b6af083e34e2397a8ddbe9781920733d09d151Ted Gould/** @file
e9b6af083e34e2397a8ddbe9781920733d09d151Ted Gould * @brief Undo History dialog
e9b6af083e34e2397a8ddbe9781920733d09d151Ted Gould */
e9b6af083e34e2397a8ddbe9781920733d09d151Ted Gould/* Author:
c57da20fee24a6e5b368730153d72eabe26425b2buliabyak * Gustav Broberg <broberg@kth.se>
45ce4acff5fd301d5bd7366156cd73dfcc7a639cJon A. Cruz * Jon A. Cruz <jon@joncruz.org>
c57da20fee24a6e5b368730153d72eabe26425b2buliabyak *
45ce4acff5fd301d5bd7366156cd73dfcc7a639cJon A. Cruz * Copyright (C) 2014 Authors
c57da20fee24a6e5b368730153d72eabe26425b2buliabyak * Released under GNU GPL. Read the file 'COPYING' for more information.
c57da20fee24a6e5b368730153d72eabe26425b2buliabyak */
c57da20fee24a6e5b368730153d72eabe26425b2buliabyak
c57da20fee24a6e5b368730153d72eabe26425b2buliabyak#ifndef INKSCAPE_UI_DIALOG_UNDO_HISTORY_H
c57da20fee24a6e5b368730153d72eabe26425b2buliabyak#define INKSCAPE_UI_DIALOG_UNDO_HISTORY_H
c57da20fee24a6e5b368730153d72eabe26425b2buliabyak
1b3a8414f17dc95fc921d999ea715c99d10dd4aaAlex Valavanis#include "ui/widget/panel.h"
c57da20fee24a6e5b368730153d72eabe26425b2buliabyak#include <gtkmm/cellrendererpixbuf.h>
c57da20fee24a6e5b368730153d72eabe26425b2buliabyak#include <gtkmm/scrolledwindow.h>
c57da20fee24a6e5b368730153d72eabe26425b2buliabyak#include <gtkmm/treemodel.h>
c57da20fee24a6e5b368730153d72eabe26425b2buliabyak#include <gtkmm/treeselection.h>
36fe57c03027fcd94aad7d16f751c7d1647dd4a1Alex Valavanis#include <glibmm/property.h>
c57da20fee24a6e5b368730153d72eabe26425b2buliabyak
c57da20fee24a6e5b368730153d72eabe26425b2buliabyak#include <functional>
c57da20fee24a6e5b368730153d72eabe26425b2buliabyak#include <sstream>
c57da20fee24a6e5b368730153d72eabe26425b2buliabyak
c57da20fee24a6e5b368730153d72eabe26425b2buliabyak#include "event-log.h"
c57da20fee24a6e5b368730153d72eabe26425b2buliabyak
c57da20fee24a6e5b368730153d72eabe26425b2buliabyak#include "widgets/icon.h"
a117bfa5a3bf6ead2edcd7254460fed9e19b067fJohn Smith#include "ui/dialog/desktop-tracker.h"
c57da20fee24a6e5b368730153d72eabe26425b2buliabyak
1b3a8414f17dc95fc921d999ea715c99d10dd4aaAlex Valavanisclass SPDesktop;
1b3a8414f17dc95fc921d999ea715c99d10dd4aaAlex Valavanis
c57da20fee24a6e5b368730153d72eabe26425b2buliabyaknamespace Inkscape {
c57da20fee24a6e5b368730153d72eabe26425b2buliabyaknamespace UI {
c57da20fee24a6e5b368730153d72eabe26425b2buliabyaknamespace Dialog {
c57da20fee24a6e5b368730153d72eabe26425b2buliabyak
c57da20fee24a6e5b368730153d72eabe26425b2buliabyak
c57da20fee24a6e5b368730153d72eabe26425b2buliabyak/* Custom cell renderers */
c57da20fee24a6e5b368730153d72eabe26425b2buliabyak
c57da20fee24a6e5b368730153d72eabe26425b2buliabyakclass CellRendererSPIcon : public Gtk::CellRendererPixbuf {
c57da20fee24a6e5b368730153d72eabe26425b2buliabyakpublic:
c57da20fee24a6e5b368730153d72eabe26425b2buliabyak
c57da20fee24a6e5b368730153d72eabe26425b2buliabyak CellRendererSPIcon() :
c57da20fee24a6e5b368730153d72eabe26425b2buliabyak Glib::ObjectBase(typeid(CellRendererPixbuf)),
c57da20fee24a6e5b368730153d72eabe26425b2buliabyak Gtk::CellRendererPixbuf(),
c57da20fee24a6e5b368730153d72eabe26425b2buliabyak _property_icon(*this, "icon", Glib::RefPtr<Gdk::Pixbuf>(0)),
c57da20fee24a6e5b368730153d72eabe26425b2buliabyak _property_event_type(*this, "event_type", 0)
c57da20fee24a6e5b368730153d72eabe26425b2buliabyak { }
c57da20fee24a6e5b368730153d72eabe26425b2buliabyak
c57da20fee24a6e5b368730153d72eabe26425b2buliabyak Glib::PropertyProxy<unsigned int>
c57da20fee24a6e5b368730153d72eabe26425b2buliabyak property_event_type() { return _property_event_type.get_proxy(); }
c57da20fee24a6e5b368730153d72eabe26425b2buliabyak
c57da20fee24a6e5b368730153d72eabe26425b2buliabyakprotected:
2a9c05345787988c8cd9e7ff91a450d28f43e830Alex Valavanis#if WITH_GTKMM_3_0
2a9c05345787988c8cd9e7ff91a450d28f43e830Alex Valavanis virtual void render_vfunc(const Cairo::RefPtr<Cairo::Context>& cr,
2a9c05345787988c8cd9e7ff91a450d28f43e830Alex Valavanis Gtk::Widget& widget,
2a9c05345787988c8cd9e7ff91a450d28f43e830Alex Valavanis const Gdk::Rectangle& background_area,
2a9c05345787988c8cd9e7ff91a450d28f43e830Alex Valavanis const Gdk::Rectangle& cell_area,
2a9c05345787988c8cd9e7ff91a450d28f43e830Alex Valavanis Gtk::CellRendererState flags);
2a9c05345787988c8cd9e7ff91a450d28f43e830Alex Valavanis#else
2a9c05345787988c8cd9e7ff91a450d28f43e830Alex Valavanis virtual void render_vfunc(const Glib::RefPtr<Gdk::Drawable>& window,
2a9c05345787988c8cd9e7ff91a450d28f43e830Alex Valavanis Gtk::Widget& widget,
2a9c05345787988c8cd9e7ff91a450d28f43e830Alex Valavanis const Gdk::Rectangle& background_area,
2a9c05345787988c8cd9e7ff91a450d28f43e830Alex Valavanis const Gdk::Rectangle& cell_area,
2a9c05345787988c8cd9e7ff91a450d28f43e830Alex Valavanis const Gdk::Rectangle& expose_area,
2a9c05345787988c8cd9e7ff91a450d28f43e830Alex Valavanis Gtk::CellRendererState flags);
2a9c05345787988c8cd9e7ff91a450d28f43e830Alex Valavanis#endif
c57da20fee24a6e5b368730153d72eabe26425b2buliabyakprivate:
c57da20fee24a6e5b368730153d72eabe26425b2buliabyak
c57da20fee24a6e5b368730153d72eabe26425b2buliabyak Glib::Property<Glib::RefPtr<Gdk::Pixbuf> > _property_icon;
c57da20fee24a6e5b368730153d72eabe26425b2buliabyak Glib::Property<unsigned int> _property_event_type;
c57da20fee24a6e5b368730153d72eabe26425b2buliabyak std::map<const unsigned int, Glib::RefPtr<Gdk::Pixbuf> > _icon_cache;
a117bfa5a3bf6ead2edcd7254460fed9e19b067fJohn Smith
c57da20fee24a6e5b368730153d72eabe26425b2buliabyak};
c57da20fee24a6e5b368730153d72eabe26425b2buliabyak
c57da20fee24a6e5b368730153d72eabe26425b2buliabyak
c57da20fee24a6e5b368730153d72eabe26425b2buliabyakclass CellRendererInt : public Gtk::CellRendererText {
c57da20fee24a6e5b368730153d72eabe26425b2buliabyakpublic:
c57da20fee24a6e5b368730153d72eabe26425b2buliabyak
c57da20fee24a6e5b368730153d72eabe26425b2buliabyak struct Filter : std::unary_function<int, bool> {
c57da20fee24a6e5b368730153d72eabe26425b2buliabyak virtual ~Filter() {}
c57da20fee24a6e5b368730153d72eabe26425b2buliabyak virtual bool operator() (const int&) const =0;
c57da20fee24a6e5b368730153d72eabe26425b2buliabyak };
c57da20fee24a6e5b368730153d72eabe26425b2buliabyak
c57da20fee24a6e5b368730153d72eabe26425b2buliabyak CellRendererInt(const Filter& filter=no_filter) :
c57da20fee24a6e5b368730153d72eabe26425b2buliabyak Glib::ObjectBase(typeid(CellRendererText)),
c57da20fee24a6e5b368730153d72eabe26425b2buliabyak Gtk::CellRendererText(),
c57da20fee24a6e5b368730153d72eabe26425b2buliabyak _property_number(*this, "number", 0),
c57da20fee24a6e5b368730153d72eabe26425b2buliabyak _filter (filter)
c57da20fee24a6e5b368730153d72eabe26425b2buliabyak { }
c57da20fee24a6e5b368730153d72eabe26425b2buliabyak
c57da20fee24a6e5b368730153d72eabe26425b2buliabyak
c57da20fee24a6e5b368730153d72eabe26425b2buliabyak Glib::PropertyProxy<int>
c57da20fee24a6e5b368730153d72eabe26425b2buliabyak property_number() { return _property_number.get_proxy(); }
c57da20fee24a6e5b368730153d72eabe26425b2buliabyak
c57da20fee24a6e5b368730153d72eabe26425b2buliabyak static const Filter& no_filter;
c57da20fee24a6e5b368730153d72eabe26425b2buliabyak
2a9c05345787988c8cd9e7ff91a450d28f43e830Alex Valavanisprotected:
2a9c05345787988c8cd9e7ff91a450d28f43e830Alex Valavanis#if WITH_GTKMM_3_0
2a9c05345787988c8cd9e7ff91a450d28f43e830Alex Valavanis virtual void render_vfunc(const Cairo::RefPtr<Cairo::Context>& cr,
2a9c05345787988c8cd9e7ff91a450d28f43e830Alex Valavanis Gtk::Widget& widget,
2a9c05345787988c8cd9e7ff91a450d28f43e830Alex Valavanis const Gdk::Rectangle& background_area,
2a9c05345787988c8cd9e7ff91a450d28f43e830Alex Valavanis const Gdk::Rectangle& cell_area,
2a9c05345787988c8cd9e7ff91a450d28f43e830Alex Valavanis Gtk::CellRendererState flags);
2a9c05345787988c8cd9e7ff91a450d28f43e830Alex Valavanis#else
2a9c05345787988c8cd9e7ff91a450d28f43e830Alex Valavanis virtual void render_vfunc(const Glib::RefPtr<Gdk::Drawable>& window,
2a9c05345787988c8cd9e7ff91a450d28f43e830Alex Valavanis Gtk::Widget& widget,
2a9c05345787988c8cd9e7ff91a450d28f43e830Alex Valavanis const Gdk::Rectangle& background_area,
2a9c05345787988c8cd9e7ff91a450d28f43e830Alex Valavanis const Gdk::Rectangle& cell_area,
2a9c05345787988c8cd9e7ff91a450d28f43e830Alex Valavanis const Gdk::Rectangle& expose_area,
2a9c05345787988c8cd9e7ff91a450d28f43e830Alex Valavanis Gtk::CellRendererState flags);
2a9c05345787988c8cd9e7ff91a450d28f43e830Alex Valavanis#endif
c57da20fee24a6e5b368730153d72eabe26425b2buliabyak
c57da20fee24a6e5b368730153d72eabe26425b2buliabyakprivate:
c57da20fee24a6e5b368730153d72eabe26425b2buliabyak
c57da20fee24a6e5b368730153d72eabe26425b2buliabyak Glib::Property<int> _property_number;
c57da20fee24a6e5b368730153d72eabe26425b2buliabyak const Filter& _filter;
c57da20fee24a6e5b368730153d72eabe26425b2buliabyak
e7333a0a54c8d33b7397406dd76938aa430836d5joncruz struct NoFilter : Filter { bool operator() (const int& /*x*/) const { return true; } };
c57da20fee24a6e5b368730153d72eabe26425b2buliabyak};
c57da20fee24a6e5b368730153d72eabe26425b2buliabyak
c57da20fee24a6e5b368730153d72eabe26425b2buliabyak/**
e9b6af083e34e2397a8ddbe9781920733d09d151Ted Gould * \brief Dialog for presenting document change history
e9b6af083e34e2397a8ddbe9781920733d09d151Ted Gould *
e9b6af083e34e2397a8ddbe9781920733d09d151Ted Gould * This dialog allows the user to undo and redo multiple events in a more convenient way
e9b6af083e34e2397a8ddbe9781920733d09d151Ted Gould * than repateaded ctrl-z, ctrl-shift-z.
c57da20fee24a6e5b368730153d72eabe26425b2buliabyak */
963f23115db07f460bdd862b957f8bd9dba88b9bgustav_bclass UndoHistory : public Widget::Panel {
c57da20fee24a6e5b368730153d72eabe26425b2buliabyakpublic:
c57da20fee24a6e5b368730153d72eabe26425b2buliabyak virtual ~UndoHistory();
c57da20fee24a6e5b368730153d72eabe26425b2buliabyak
963f23115db07f460bdd862b957f8bd9dba88b9bgustav_b static UndoHistory &getInstance();
068e269d6d0391bdf69963f651be776f3fcb4dd5gustav_b void setDesktop(SPDesktop* desktop);
068e269d6d0391bdf69963f651be776f3fcb4dd5gustav_b
068e269d6d0391bdf69963f651be776f3fcb4dd5gustav_b sigc::connection _document_replaced_connection;
c57da20fee24a6e5b368730153d72eabe26425b2buliabyak
c57da20fee24a6e5b368730153d72eabe26425b2buliabyakprotected:
c57da20fee24a6e5b368730153d72eabe26425b2buliabyak
45ce4acff5fd301d5bd7366156cd73dfcc7a639cJon A. Cruz SPDesktop *_desktop;
09ba3247163582bf2e30e17c4c154aa259ce038acilix SPDocument *_document;
c57da20fee24a6e5b368730153d72eabe26425b2buliabyak EventLog *_event_log;
c57da20fee24a6e5b368730153d72eabe26425b2buliabyak
a117bfa5a3bf6ead2edcd7254460fed9e19b067fJohn Smith
c57da20fee24a6e5b368730153d72eabe26425b2buliabyak const EventLog::EventModelColumns *_columns;
c57da20fee24a6e5b368730153d72eabe26425b2buliabyak
c57da20fee24a6e5b368730153d72eabe26425b2buliabyak Gtk::ScrolledWindow _scrolled_window;
c57da20fee24a6e5b368730153d72eabe26425b2buliabyak
c57da20fee24a6e5b368730153d72eabe26425b2buliabyak Glib::RefPtr<Gtk::TreeModel> _event_list_store;
c57da20fee24a6e5b368730153d72eabe26425b2buliabyak Gtk::TreeView _event_list_view;
c57da20fee24a6e5b368730153d72eabe26425b2buliabyak Glib::RefPtr<Gtk::TreeSelection> _event_list_selection;
c57da20fee24a6e5b368730153d72eabe26425b2buliabyak
a117bfa5a3bf6ead2edcd7254460fed9e19b067fJohn Smith DesktopTracker _deskTrack;
a117bfa5a3bf6ead2edcd7254460fed9e19b067fJohn Smith sigc::connection _desktopChangeConn;
a117bfa5a3bf6ead2edcd7254460fed9e19b067fJohn Smith
c57da20fee24a6e5b368730153d72eabe26425b2buliabyak EventLog::CallbackMap _callback_connections;
c57da20fee24a6e5b368730153d72eabe26425b2buliabyak
45ce4acff5fd301d5bd7366156cd73dfcc7a639cJon A. Cruz static void *_handleEventLogDestroyCB(void *data);
45ce4acff5fd301d5bd7366156cd73dfcc7a639cJon A. Cruz
45ce4acff5fd301d5bd7366156cd73dfcc7a639cJon A. Cruz void _connectDocument(SPDesktop* desktop, SPDocument *document);
45ce4acff5fd301d5bd7366156cd73dfcc7a639cJon A. Cruz void _connectEventLog();
45ce4acff5fd301d5bd7366156cd73dfcc7a639cJon A. Cruz void _handleDocumentReplaced(SPDesktop* desktop, SPDocument *document);
45ce4acff5fd301d5bd7366156cd73dfcc7a639cJon A. Cruz void *_handleEventLogDestroy();
c57da20fee24a6e5b368730153d72eabe26425b2buliabyak void _onListSelectionChange();
c57da20fee24a6e5b368730153d72eabe26425b2buliabyak void _onExpandEvent(const Gtk::TreeModel::iterator &iter, const Gtk::TreeModel::Path &path);
c57da20fee24a6e5b368730153d72eabe26425b2buliabyak void _onCollapseEvent(const Gtk::TreeModel::iterator &iter, const Gtk::TreeModel::Path &path);
c57da20fee24a6e5b368730153d72eabe26425b2buliabyak
c57da20fee24a6e5b368730153d72eabe26425b2buliabyakprivate:
963f23115db07f460bdd862b957f8bd9dba88b9bgustav_b UndoHistory();
c57da20fee24a6e5b368730153d72eabe26425b2buliabyak
c57da20fee24a6e5b368730153d72eabe26425b2buliabyak // no default constructor, noncopyable, nonassignable
c57da20fee24a6e5b368730153d72eabe26425b2buliabyak UndoHistory(UndoHistory const &d);
c57da20fee24a6e5b368730153d72eabe26425b2buliabyak UndoHistory operator=(UndoHistory const &d);
c57da20fee24a6e5b368730153d72eabe26425b2buliabyak
c57da20fee24a6e5b368730153d72eabe26425b2buliabyak struct GreaterThan : CellRendererInt::Filter {
c57da20fee24a6e5b368730153d72eabe26425b2buliabyak GreaterThan(int _i) : i (_i) {}
c57da20fee24a6e5b368730153d72eabe26425b2buliabyak bool operator() (const int& x) const { return x > i; }
c57da20fee24a6e5b368730153d72eabe26425b2buliabyak int i;
c57da20fee24a6e5b368730153d72eabe26425b2buliabyak };
c57da20fee24a6e5b368730153d72eabe26425b2buliabyak
c57da20fee24a6e5b368730153d72eabe26425b2buliabyak static const CellRendererInt::Filter& greater_than_1;
c57da20fee24a6e5b368730153d72eabe26425b2buliabyak};
c57da20fee24a6e5b368730153d72eabe26425b2buliabyak
c57da20fee24a6e5b368730153d72eabe26425b2buliabyak} // namespace Dialog
c57da20fee24a6e5b368730153d72eabe26425b2buliabyak} // namespace UI
c57da20fee24a6e5b368730153d72eabe26425b2buliabyak} // namespace Inkscape
c57da20fee24a6e5b368730153d72eabe26425b2buliabyak
c57da20fee24a6e5b368730153d72eabe26425b2buliabyak#endif //INKSCAPE_UI_DIALOG_UNDO_HISTORY_H
c57da20fee24a6e5b368730153d72eabe26425b2buliabyak
c57da20fee24a6e5b368730153d72eabe26425b2buliabyak/*
c57da20fee24a6e5b368730153d72eabe26425b2buliabyak Local Variables:
c57da20fee24a6e5b368730153d72eabe26425b2buliabyak mode:c++
c57da20fee24a6e5b368730153d72eabe26425b2buliabyak c-file-style:"stroustrup"
c57da20fee24a6e5b368730153d72eabe26425b2buliabyak c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
c57da20fee24a6e5b368730153d72eabe26425b2buliabyak indent-tabs-mode:nil
c57da20fee24a6e5b368730153d72eabe26425b2buliabyak fill-column:99
c57da20fee24a6e5b368730153d72eabe26425b2buliabyak End:
c57da20fee24a6e5b368730153d72eabe26425b2buliabyak*/
a4030d5ca449e7e384bc699cd249ee704faaeab0Chris Morgan// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :