174 lines
4.4 KiB
Julia
174 lines
4.4 KiB
Julia
|
|
# https://github.com/JuliaGraphics/Immerse.jl
|
|
|
|
function _initialize_backend(::ImmersePackage; kw...)
|
|
@eval begin
|
|
import Immerse, Gadfly, Compose, Gtk
|
|
export Immerse, Gadfly, Compose, Gtk
|
|
include(joinpath(Pkg.dir("Plots"), "src", "backends", "gadfly_shapes.jl"))
|
|
end
|
|
end
|
|
|
|
function createImmerseFigure(d::Dict)
|
|
w,h = d[:size]
|
|
figidx = Immerse.figure(; name = d[:windowtitle], width = w, height = h)
|
|
Immerse.Figure(figidx)
|
|
end
|
|
|
|
# ----------------------------------------------------------------
|
|
|
|
|
|
# create a blank Gadfly.Plot object
|
|
function _create_plot(pkg::ImmersePackage; kw...)
|
|
d = Dict(kw)
|
|
|
|
# create the underlying Gadfly.Plot object
|
|
gplt = createGadflyPlotObject(d)
|
|
|
|
# save both the Immerse.Figure and the Gadfly.Plot
|
|
Plot((nothing,gplt), pkg, 0, d, Dict[])
|
|
end
|
|
|
|
|
|
# plot one data series
|
|
function _add_series(::ImmersePackage, plt::Plot; kw...)
|
|
d = Dict(kw)
|
|
addGadflySeries!(plt, d)
|
|
push!(plt.seriesargs, d)
|
|
plt
|
|
end
|
|
|
|
|
|
function _update_plot(plt::Plot{ImmersePackage}, d::Dict)
|
|
updateGadflyGuides(plt, d)
|
|
updateGadflyPlotTheme(plt, d)
|
|
end
|
|
|
|
|
|
|
|
# ----------------------------------------------------------------
|
|
|
|
function _add_annotations{X,Y,V}(plt::Plot{ImmersePackage}, anns::AVec{@compat(Tuple{X,Y,V})})
|
|
for ann in anns
|
|
push!(getGadflyContext(plt).guides, createGadflyAnnotationObject(ann...))
|
|
end
|
|
end
|
|
|
|
# ----------------------------------------------------------------
|
|
|
|
# accessors for x/y data
|
|
|
|
function Base.getindex(plt::Plot{ImmersePackage}, i::Integer)
|
|
mapping = getGadflyMappings(plt, i)[1]
|
|
mapping[:x], mapping[:y]
|
|
end
|
|
|
|
function Base.setindex!(plt::Plot{ImmersePackage}, xy::Tuple, i::Integer)
|
|
for mapping in getGadflyMappings(plt, i)
|
|
mapping[:x], mapping[:y] = xy
|
|
end
|
|
plt
|
|
end
|
|
|
|
|
|
# ----------------------------------------------------------------
|
|
|
|
|
|
function _create_subplot(subplt::Subplot{ImmersePackage}, isbefore::Bool)
|
|
return false
|
|
# isbefore && return false
|
|
end
|
|
|
|
function showSubplotObject(subplt::Subplot{ImmersePackage})
|
|
# create the Gtk window with vertical box vsep
|
|
d = getplotargs(subplt,1)
|
|
w,h = d[:size]
|
|
vsep = Gtk.GtkBoxLeaf(:v)
|
|
win = Gtk.GtkWindowLeaf(vsep, d[:windowtitle], w, h)
|
|
|
|
figindices = []
|
|
row = Gtk.GtkBoxLeaf(:h)
|
|
push!(vsep, row)
|
|
for (i,(r,c)) in enumerate(subplt.layout)
|
|
plt = subplt.plts[i]
|
|
|
|
# get the components... box is the main plot GtkBox, and canvas is the GtkCanvas where it's plotted
|
|
box, toolbar, canvas = Immerse.createPlotGuiComponents()
|
|
|
|
# add the plot's box to the row
|
|
push!(row, box)
|
|
|
|
# create the figure and store the index returned for destruction later
|
|
figidx = Immerse.figure(canvas)
|
|
push!(figindices, figidx)
|
|
|
|
fig = Immerse.figure(figidx)
|
|
plt.o = (fig, plt.o[2])
|
|
|
|
# add the row
|
|
if c == ncols(subplt.layout, r)
|
|
row = Gtk.GtkBoxLeaf(:h)
|
|
push!(vsep, row)
|
|
end
|
|
|
|
end
|
|
|
|
# destructor... clean up plots
|
|
Gtk.on_signal_destroy((x...) -> ([Immerse.dropfig(Immerse._display,i) for i in figindices]; subplt.o = nothing), win)
|
|
|
|
subplt.o = win
|
|
true
|
|
end
|
|
|
|
|
|
function _remove_axis(plt::Plot{ImmersePackage}, isx::Bool)
|
|
gplt = getGadflyContext(plt)
|
|
addOrReplace(gplt.guides, isx ? Gadfly.Guide.xticks : Gadfly.Guide.yticks; label=false)
|
|
addOrReplace(gplt.guides, isx ? Gadfly.Guide.xlabel : Gadfly.Guide.ylabel, "")
|
|
end
|
|
|
|
function _expand_limits(lims, plt::Plot{ImmersePackage}, isx::Bool)
|
|
for l in getGadflyContext(plt).layers
|
|
_expand_limits(lims, l.mapping[isx ? :x : :y])
|
|
end
|
|
end
|
|
|
|
|
|
# ----------------------------------------------------------------
|
|
|
|
getGadflyContext(plt::Plot{ImmersePackage}) = plt.o[2]
|
|
getGadflyContext(subplt::Subplot{ImmersePackage}) = buildGadflySubplotContext(subplt)
|
|
|
|
|
|
function Base.display(::PlotsDisplay, plt::Plot{ImmersePackage})
|
|
|
|
fig, gplt = plt.o
|
|
if fig == nothing
|
|
fig = createImmerseFigure(plt.plotargs)
|
|
Gtk.on_signal_destroy((x...) -> (Immerse.dropfig(Immerse._display, fig.figno); plt.o = (nothing,gplt)), fig.canvas)
|
|
plt.o = (fig, gplt)
|
|
end
|
|
|
|
Immerse.figure(fig.figno; displayfig = false)
|
|
display(gplt)
|
|
end
|
|
|
|
|
|
function Base.display(::PlotsDisplay, subplt::Subplot{ImmersePackage})
|
|
|
|
# if we haven't created the window yet, do it
|
|
if subplt.o == nothing
|
|
showSubplotObject(subplt)
|
|
end
|
|
|
|
# display the plots by creating a fresh Immerse.Figure object from the GtkCanvas and Gadfly.Plot
|
|
for plt in subplt.plts
|
|
fig, gplt = plt.o
|
|
Immerse.figure(fig.figno; displayfig = false)
|
|
display(gplt)
|
|
end
|
|
|
|
# o is the window... show it
|
|
showall(subplt.o)
|
|
end
|