[gnome-boxes] libgd: Import GdMainIconView
- From: Zeeshan Ali Khattak <zeeshanak src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-boxes] libgd: Import GdMainIconView
- Date: Wed, 15 Aug 2012 14:23:10 +0000 (UTC)
commit e77e15ae3f242b8f5a9b94b4a6d00be0c3112e1a
Author: Zeeshan Ali (Khattak) <zeeshanak gnome org>
Date: Wed Aug 15 16:16:51 2012 +0300
libgd: Import GdMainIconView
Also import the required classes (GdMainViewGeneric,
GdTogglePixbufRenderer and GdTwoLinesRenderer) and theme icons it requires
for selection mode.
https://bugzilla.gnome.org/show_bug.cgi?id=681911
data/icons/Makefile.am | 2 +
data/icons/grid-selection-checked.svg | 237 ++++++++++++++
data/icons/grid-selection-unchecked.svg | 278 ++++++++++++++++
libgd/Makefile.am | 8 +
libgd/gd-main-icon-view.c | 203 ++++++++++++
libgd/gd-main-icon-view.h | 74 +++++
libgd/gd-main-view-generic.c | 154 +++++++++
libgd/gd-main-view-generic.h | 104 ++++++
libgd/gd-toggle-pixbuf-renderer.c | 198 ++++++++++++
libgd/gd-toggle-pixbuf-renderer.h | 75 +++++
libgd/gd-two-lines-renderer.c | 528 +++++++++++++++++++++++++++++++
libgd/gd-two-lines-renderer.h | 75 +++++
libgd/gd.h | 4 +
13 files changed, 1940 insertions(+), 0 deletions(-)
---
diff --git a/data/icons/Makefile.am b/data/icons/Makefile.am
index e834a65..56e5809 100644
--- a/data/icons/Makefile.am
+++ b/data/icons/Makefile.am
@@ -22,6 +22,8 @@ assets_DATA = \
boxes-arrow.svg \
boxes-dark.png \
boxes-gray.png \
+ grid-selection-checked.svg \
+ grid-selection-unchecked.svg \
$(NULL)
imagesdir = $(datadir)/gnome-boxes/pixmaps
diff --git a/data/icons/grid-selection-checked.svg b/data/icons/grid-selection-checked.svg
new file mode 100644
index 0000000..248ebc9
--- /dev/null
+++ b/data/icons/grid-selection-checked.svg
@@ -0,0 +1,237 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="40"
+ height="40"
+ id="svg5038"
+ version="1.1"
+ inkscape:version="0.48.2 r9819"
+ sodipodi:docname="grid-selection-checked.svg">
+ <defs
+ id="defs5040">
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5872"
+ id="linearGradient5891"
+ gradientUnits="userSpaceOnUse"
+ x1="205.84143"
+ y1="246.7094"
+ x2="206.74803"
+ y2="231.24142" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient5872">
+ <stop
+ style="stop-color:#13508e;stop-opacity:1;"
+ offset="0"
+ id="stop5874" />
+ <stop
+ style="stop-color:#1862af;stop-opacity:1"
+ offset="1"
+ id="stop5876" />
+ </linearGradient>
+ <inkscape:path-effect
+ effect="spiro"
+ id="path-effect5837"
+ is_visible="true" />
+ <inkscape:path-effect
+ effect="spiro"
+ id="path-effect5012"
+ is_visible="true" />
+ <inkscape:path-effect
+ effect="spiro"
+ id="path-effect5884"
+ is_visible="true" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient10354-2-9-1"
+ id="linearGradient15341-5"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-1609.9926,-78.958432)"
+ x1="1205.5752"
+ y1="-186.45331"
+ x2="1205.5752"
+ y2="-202.34555" />
+ <linearGradient
+ id="linearGradient10354-2-9-1"
+ inkscape:collect="always">
+ <stop
+ id="stop10356-2-8-2"
+ offset="0"
+ style="stop-color:#bcbfb8;stop-opacity:1" />
+ <stop
+ id="stop10358-2-6-2"
+ offset="1"
+ style="stop-color:#ffffff;stop-opacity:1" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient10332-5-3-3"
+ id="linearGradient15343-1"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.84941206,0,0,0.84794288,-623.98415,-483.16392)"
+ x1="260.92538"
+ y1="233.77748"
+ x2="260.92538"
+ y2="248.97633" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient10332-5-3-3">
+ <stop
+ style="stop-color:#d3d7cf;stop-opacity:1"
+ offset="0"
+ id="stop10334-5-3-1" />
+ <stop
+ style="stop-color:#8f9985;stop-opacity:1"
+ offset="1"
+ id="stop10336-29-3-4" />
+ </linearGradient>
+ <linearGradient
+ y2="1106.5294"
+ x2="808"
+ y1="1040.7369"
+ x1="806.39526"
+ gradientTransform="matrix(0.04728153,0,0,0.52063887,144.29163,-314.78125)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5726"
+ xlink:href="#linearGradient85841-7-0"
+ inkscape:collect="always" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient85841-7-0">
+ <stop
+ style="stop-color:#242424;stop-opacity:1"
+ offset="0"
+ id="stop85843-4-8" />
+ <stop
+ id="stop85845-0-5"
+ offset="0.63381755"
+ style="stop-color:#101010;stop-opacity:1;" />
+ <stop
+ style="stop-color:#262626;stop-opacity:1"
+ offset="1"
+ id="stop85847-7-3" />
+ </linearGradient>
+ <linearGradient
+ y2="1106.5294"
+ x2="808"
+ y1="1040.7369"
+ x1="806.39526"
+ gradientTransform="matrix(0.04849388,0,0,0.53398858,-4.8290974,-542.54487)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5036"
+ xlink:href="#linearGradient85841-7-0"
+ inkscape:collect="always" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="7"
+ inkscape:cx="-27.714286"
+ inkscape:cy="24"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ inkscape:grid-bbox="true"
+ inkscape:document-units="px"
+ inkscape:window-width="1920"
+ inkscape:window-height="1022"
+ inkscape:window-x="0"
+ inkscape:window-y="26"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata5043">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ id="layer1"
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ transform="translate(0,-8)">
+ <rect
+ ry="7.1794877"
+ rx="7.1794877"
+ style="opacity:0.75;color:#000000;fill:url(#linearGradient5036);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="rect85718-2-9"
+ width="40"
+ height="40"
+ x="0"
+ y="8"
+ inkscape:export-filename="/home/jimmac/SparkleShare/gnome-mockups/boxes/interactive/img/checkbox-on.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <g
+ style="display:inline;enable-background:new"
+ id="g15291-9"
+ transform="matrix(2.0481319,0,0,2.0481319,-949.79991,-333.53349)"
+ inkscape:export-filename="/home/jimmac/SparkleShare/gnome-mockups/boxes/interactive/img/checkbox-on.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90">
+ <g
+ style="enable-background:new"
+ id="g16853-4"
+ transform="translate(877.50354,-102.83507)">
+ <rect
+ ry="0.80653393"
+ rx="0.80653393"
+ y="-284.86218"
+ x="-409.50739"
+ height="11.023263"
+ width="11.042357"
+ id="rect6506-6"
+ style="color:#000000;fill:url(#linearGradient15341-5);fill-opacity:1;fill-rule:nonzero;stroke:url(#linearGradient15343-1);stroke-width:0.48824981;stroke-opacity:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ transform="scale(1,-1)" />
+ </g>
+ </g>
+ <g
+ style="display:inline;enable-background:new"
+ id="g5886"
+ transform="matrix(1.025641,0,0,1.025641,-189.74359,-219.69231)"
+ inkscape:export-filename="/home/jimmac/SparkleShare/gnome-mockups/boxes/interactive/img/checkbox-on.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90">
+ <path
+ inkscape:connector-curvature="0"
+ inkscape:original-d="m 198.5,240 5.25,5.25 13.875,-13.875"
+ inkscape:path-effect="#path-effect5837"
+ id="path5835"
+ d="m 198.5,240 5.25,5.25 13.875,-13.875"
+ style="fill:none;stroke:url(#linearGradient5891);stroke-width:5.8499999;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ style="fill:none;stroke:#4787c8;stroke-width:2.92499995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 198.5,240 5.25,5.25 13.875,-13.875"
+ id="path5880"
+ inkscape:path-effect="#path-effect5837"
+ inkscape:original-d="m 198.5,240 5.25,5.25 13.875,-13.875"
+ inkscape:connector-curvature="0" />
+ <path
+ sodipodi:nodetypes="csccc"
+ inkscape:connector-curvature="0"
+ inkscape:original-d="m 197.71875,240.4375 c 0.65604,-0.56057 1.41045,-1.32862 1.90625,-0.8125 l 3.8125,3.96875 13.25,-12.65625 c 0.6875,-0.6875 1.90625,0.21875 1.90625,0.21875"
+ inkscape:path-effect="#path-effect5884"
+ id="path5882"
+ d="m 197.71875,240.4375 c -0.113,-0.1009 -0.19813,-0.23267 -0.24374,-0.37713 -0.0456,-0.14446 -0.0515,-0.30115 -0.0175,-0.44876 0.034,-0.14762 0.10786,-0.28567 0.21068,-0.39693 0.10281,-0.11125 0.23413,-0.19547 0.37723,-0.24518 0.1431,-0.0497 0.29748,-0.065 0.44812,-0.0491 0.15065,0.0159 0.29731,0.0628 0.43264,0.13085 0.27066,0.13614 0.48894,0.35524 0.69883,0.57373 l 3.8125,3.96875 13.25,-12.65625 c 0.14959,-0.14288 0.30236,-0.28546 0.48132,-0.38923 0.17895,-0.10377 0.38437,-0.16706 0.59112,-0.16016 0.20674,0.007 0.41161,0.0857 0.56458,0.22493 0.15297,0.13925 0.25142,0.33712 0.26923,0.54321"
+ style="fill:none;stroke:#7ea7d3;stroke-width:0.97499996px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/data/icons/grid-selection-unchecked.svg b/data/icons/grid-selection-unchecked.svg
new file mode 100644
index 0000000..622752d
--- /dev/null
+++ b/data/icons/grid-selection-unchecked.svg
@@ -0,0 +1,278 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="40"
+ height="40"
+ id="svg5038"
+ version="1.1"
+ inkscape:version="0.48.2 r9819"
+ sodipodi:docname="grid-selection-unchecked.svg">
+ <defs
+ id="defs5040">
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5872"
+ id="linearGradient5891"
+ gradientUnits="userSpaceOnUse"
+ x1="205.84143"
+ y1="246.7094"
+ x2="206.74803"
+ y2="231.24142" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient5872">
+ <stop
+ style="stop-color:#13508e;stop-opacity:1;"
+ offset="0"
+ id="stop5874" />
+ <stop
+ style="stop-color:#1862af;stop-opacity:1"
+ offset="1"
+ id="stop5876" />
+ </linearGradient>
+ <inkscape:path-effect
+ effect="spiro"
+ id="path-effect5837"
+ is_visible="true" />
+ <inkscape:path-effect
+ effect="spiro"
+ id="path-effect5012"
+ is_visible="true" />
+ <inkscape:path-effect
+ effect="spiro"
+ id="path-effect5884"
+ is_visible="true" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient10354-2-9-1"
+ id="linearGradient15341-5"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-1609.9926,-78.958432)"
+ x1="1205.5752"
+ y1="-186.45331"
+ x2="1205.5752"
+ y2="-202.34555" />
+ <linearGradient
+ id="linearGradient10354-2-9-1"
+ inkscape:collect="always">
+ <stop
+ id="stop10356-2-8-2"
+ offset="0"
+ style="stop-color:#bcbfb8;stop-opacity:1" />
+ <stop
+ id="stop10358-2-6-2"
+ offset="1"
+ style="stop-color:#ffffff;stop-opacity:1" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient10332-5-3-3"
+ id="linearGradient15343-1"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.84941206,0,0,0.84794288,-623.98415,-483.16392)"
+ x1="260.92538"
+ y1="233.77748"
+ x2="260.92538"
+ y2="248.97633" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient10332-5-3-3">
+ <stop
+ style="stop-color:#d3d7cf;stop-opacity:1"
+ offset="0"
+ id="stop10334-5-3-1" />
+ <stop
+ style="stop-color:#8f9985;stop-opacity:1"
+ offset="1"
+ id="stop10336-29-3-4" />
+ </linearGradient>
+ <linearGradient
+ y2="1106.5294"
+ x2="808"
+ y1="1040.7369"
+ x1="806.39526"
+ gradientTransform="matrix(0.04728153,0,0,0.52063887,144.29163,-314.78125)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5726"
+ xlink:href="#linearGradient85841-7-0"
+ inkscape:collect="always" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient85841-7-0">
+ <stop
+ style="stop-color:#242424;stop-opacity:1"
+ offset="0"
+ id="stop85843-4-8" />
+ <stop
+ id="stop85845-0-5"
+ offset="0.63381755"
+ style="stop-color:#101010;stop-opacity:1;" />
+ <stop
+ style="stop-color:#262626;stop-opacity:1"
+ offset="1"
+ id="stop85847-7-3" />
+ </linearGradient>
+ <linearGradient
+ y2="1106.5294"
+ x2="808"
+ y1="1040.7369"
+ x1="806.39526"
+ gradientTransform="matrix(0.04849388,0,0,0.53398858,-4.8290974,-542.54487)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5036"
+ xlink:href="#linearGradient85841-7-0"
+ inkscape:collect="always" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient10354-2-9-1-7"
+ id="linearGradient15341-5-8"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.0481327,0,0,2.0481327,-2450.0351,382.43617)"
+ x1="1205.5752"
+ y1="-186.45331"
+ x2="1205.5752"
+ y2="-202.34555" />
+ <linearGradient
+ id="linearGradient10354-2-9-1-7"
+ inkscape:collect="always">
+ <stop
+ id="stop10356-2-8-2-9"
+ offset="0"
+ style="stop-color:#bcbfb8;stop-opacity:1" />
+ <stop
+ id="stop10358-2-6-2-3"
+ offset="1"
+ style="stop-color:#ffffff;stop-opacity:1" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient10332-5-3-3-8"
+ id="linearGradient15343-1-8"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.7397086,0,0,1.7366996,-430.55893,-445.43032)"
+ x1="260.92538"
+ y1="233.77748"
+ x2="260.92538"
+ y2="248.97633" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient10332-5-3-3-8">
+ <stop
+ style="stop-color:#d3d7cf;stop-opacity:1"
+ offset="0"
+ id="stop10334-5-3-1-4" />
+ <stop
+ style="stop-color:#8f9985;stop-opacity:1"
+ offset="1"
+ id="stop10336-29-3-4-0" />
+ </linearGradient>
+ <linearGradient
+ y2="1106.5294"
+ x2="808"
+ y1="1040.7369"
+ x1="806.39526"
+ gradientTransform="matrix(0.04728153,0,0,0.52063887,344.29163,-313.78125)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5772"
+ xlink:href="#linearGradient85841-7-0-9"
+ inkscape:collect="always" />
+ <linearGradient
+ id="linearGradient85841-7-0-9">
+ <stop
+ style="stop-color:#242424;stop-opacity:1"
+ offset="0"
+ id="stop85843-4-8-3" />
+ <stop
+ id="stop85845-0-5-1"
+ offset="0.63381755"
+ style="stop-color:#101010;stop-opacity:1;" />
+ <stop
+ style="stop-color:#262626;stop-opacity:1"
+ offset="1"
+ id="stop85847-7-3-3" />
+ </linearGradient>
+ <linearGradient
+ y2="1106.5294"
+ x2="808"
+ y1="1040.7369"
+ x1="806.39526"
+ gradientTransform="matrix(0.0484939,0,0,0.5339888,-4.8290988,-542.54512)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5153"
+ xlink:href="#linearGradient85841-7-0-9"
+ inkscape:collect="always" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="7"
+ inkscape:cx="-27.714286"
+ inkscape:cy="24"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ inkscape:grid-bbox="true"
+ inkscape:document-units="px"
+ inkscape:window-width="1920"
+ inkscape:window-height="1022"
+ inkscape:window-x="0"
+ inkscape:window-y="26"
+ inkscape:window-maximized="1"
+ showguides="true"
+ inkscape:guide-bbox="true" />
+ <metadata
+ id="metadata5043">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ id="layer1"
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ transform="translate(0,-8)">
+ <rect
+ ry="7.179491"
+ rx="7.179491"
+ style="opacity:0.75;color:#000000;fill:url(#linearGradient5153);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="rect85718-2-9-0"
+ width="40.000019"
+ height="40.000019"
+ x="0"
+ y="7.9999809"
+ inkscape:export-filename="/home/jimmac/SparkleShare/gnome-mockups/boxes/interactive/img/checkbox-off.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <rect
+ ry="1.6518886"
+ rx="1.6518886"
+ y="-39.282047"
+ x="8.7179489"
+ height="22.577105"
+ width="22.616215"
+ id="rect6506-6-8"
+ style="color:#000000;fill:url(#linearGradient15341-5-8);fill-opacity:1;fill-rule:nonzero;stroke:url(#linearGradient15343-1-8);stroke-width:1;stroke-opacity:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ transform="scale(1,-1)"
+ inkscape:export-filename="/home/jimmac/SparkleShare/gnome-mockups/boxes/interactive/img/checkbox-off.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ </g>
+</svg>
diff --git a/libgd/Makefile.am b/libgd/Makefile.am
index a5e8fda..d1fa701 100644
--- a/libgd/Makefile.am
+++ b/libgd/Makefile.am
@@ -15,6 +15,10 @@ gdprivate_source_h = \
gd-main-toolbar.h \
gd-margin-container.h \
gd-tagged-entry.h \
+ gd-toggle-pixbuf-renderer.h \
+ gd-two-lines-renderer.h \
+ gd-main-view-generic.h \
+ gd-main-icon-view.h \
$(NULL)
gdprivate_source_c = \
@@ -22,6 +26,10 @@ gdprivate_source_c = \
gd-main-toolbar.c \
gd-margin-container.c \
gd-tagged-entry.c \
+ gd-toggle-pixbuf-renderer.c \
+ gd-two-lines-renderer.c \
+ gd-main-view-generic.c \
+ gd-main-icon-view.c \
$(NULL)
pkglib_LTLIBRARIES = libgdprivate-1.0.la
diff --git a/libgd/gd-main-icon-view.c b/libgd/gd-main-icon-view.c
new file mode 100644
index 0000000..36df626
--- /dev/null
+++ b/libgd/gd-main-icon-view.c
@@ -0,0 +1,203 @@
+/*
+ * Copyright (c) 2011 Red Hat, Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Author: Cosimo Cecchi <cosimoc redhat com>
+ *
+ */
+
+#include "gd-main-icon-view.h"
+#include "gd-main-view-generic.h"
+#include "gd-toggle-pixbuf-renderer.h"
+#include "gd-two-lines-renderer.h"
+
+#include <math.h>
+#include <glib/gi18n.h>
+
+#define VIEW_ITEM_WIDTH 140
+#define VIEW_ITEM_WRAP_WIDTH 128
+#define VIEW_COLUMN_SPACING 20
+#define VIEW_MARGIN 16
+
+struct _GdMainIconViewPrivate {
+ GtkCellRenderer *pixbuf_cell;
+ gboolean selection_mode;
+};
+
+static void gd_main_view_generic_iface_init (GdMainViewGenericIface *iface);
+G_DEFINE_TYPE_WITH_CODE (GdMainIconView, gd_main_icon_view, GTK_TYPE_ICON_VIEW,
+ G_IMPLEMENT_INTERFACE (GD_TYPE_MAIN_VIEW_GENERIC,
+ gd_main_view_generic_iface_init))
+
+static GtkTreePath*
+get_source_row (GdkDragContext *context)
+{
+ GtkTreeRowReference *ref;
+
+ ref = g_object_get_data (G_OBJECT (context), "gtk-icon-view-source-row");
+
+ if (ref)
+ return gtk_tree_row_reference_get_path (ref);
+ else
+ return NULL;
+}
+
+static void
+gd_main_icon_view_drag_data_get (GtkWidget *widget,
+ GdkDragContext *drag_context,
+ GtkSelectionData *data,
+ guint info,
+ guint time)
+{
+ GdMainIconView *self = GD_MAIN_ICON_VIEW (widget);
+ GtkTreeModel *model = gtk_icon_view_get_model (GTK_ICON_VIEW (self));
+
+ if (info != 0)
+ return;
+
+ _gd_main_view_generic_dnd_common (model, self->priv->selection_mode,
+ get_source_row (drag_context), data);
+
+ GTK_WIDGET_CLASS (gd_main_icon_view_parent_class)->drag_data_get (widget, drag_context,
+ data, info, time);
+}
+
+static void
+gd_main_icon_view_constructed (GObject *obj)
+{
+ GdMainIconView *self = GD_MAIN_ICON_VIEW (obj);
+ GtkCellRenderer *cell;
+ const GtkTargetEntry targets[] = {
+ { "text/uri-list", GTK_TARGET_OTHER_APP, 0 }
+ };
+
+ G_OBJECT_CLASS (gd_main_icon_view_parent_class)->constructed (obj);
+
+ gtk_widget_set_hexpand (GTK_WIDGET (self), TRUE);
+ gtk_widget_set_vexpand (GTK_WIDGET (self), TRUE);
+ gtk_icon_view_set_selection_mode (GTK_ICON_VIEW (self), GTK_SELECTION_NONE);
+
+ g_object_set (self,
+ "column-spacing", VIEW_COLUMN_SPACING,
+ "margin", VIEW_MARGIN,
+ NULL);
+
+ self->priv->pixbuf_cell = cell = gd_toggle_pixbuf_renderer_new ();
+ g_object_set (cell,
+ "xalign", 0.5,
+ "yalign", 0.5,
+ NULL);
+
+ gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (self), cell, FALSE);
+ gtk_cell_layout_add_attribute (GTK_CELL_LAYOUT (self), cell,
+ "active", GD_MAIN_COLUMN_SELECTED);
+ gtk_cell_layout_add_attribute (GTK_CELL_LAYOUT (self), cell,
+ "pixbuf", GD_MAIN_COLUMN_ICON);
+
+ cell = gd_two_lines_renderer_new ();
+ g_object_set (cell,
+ "alignment", PANGO_ALIGN_CENTER,
+ "wrap-mode", PANGO_WRAP_WORD_CHAR,
+ "wrap-width", VIEW_ITEM_WRAP_WIDTH,
+ "text-lines", 3,
+ NULL);
+ gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (self), cell, FALSE);
+ gtk_cell_layout_add_attribute (GTK_CELL_LAYOUT (self), cell,
+ "text", GD_MAIN_COLUMN_TITLE);
+ gtk_cell_layout_add_attribute (GTK_CELL_LAYOUT (self), cell,
+ "line-two", GD_MAIN_COLUMN_AUTHOR);
+
+ gtk_icon_view_enable_model_drag_source (GTK_ICON_VIEW (self),
+ GDK_BUTTON1_MASK,
+ targets, 1,
+ GDK_ACTION_COPY);
+}
+
+static void
+gd_main_icon_view_class_init (GdMainIconViewClass *klass)
+{
+ GObjectClass *oclass = G_OBJECT_CLASS (klass);
+ GtkWidgetClass *wclass = GTK_WIDGET_CLASS (klass);
+
+ oclass->constructed = gd_main_icon_view_constructed;
+ wclass->drag_data_get = gd_main_icon_view_drag_data_get;
+
+ gtk_widget_class_install_style_property (wclass,
+ g_param_spec_int ("check-icon-size",
+ "Check icon size",
+ "Check icon size",
+ -1, G_MAXINT, 40,
+ G_PARAM_READWRITE));
+
+ g_type_class_add_private (klass, sizeof (GdMainIconViewPrivate));
+}
+
+static void
+gd_main_icon_view_init (GdMainIconView *self)
+{
+ self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, GD_TYPE_MAIN_ICON_VIEW, GdMainIconViewPrivate);
+}
+
+static GtkTreePath *
+gd_main_icon_view_get_path_at_pos (GdMainViewGeneric *mv,
+ gint x,
+ gint y)
+{
+ return gtk_icon_view_get_path_at_pos (GTK_ICON_VIEW (mv), x, y);
+}
+
+static void
+gd_main_icon_view_set_selection_mode (GdMainViewGeneric *mv,
+ gboolean selection_mode)
+{
+ GdMainIconView *self = GD_MAIN_ICON_VIEW (mv);
+
+ self->priv->selection_mode = selection_mode;
+
+ g_object_set (self->priv->pixbuf_cell,
+ "toggle-visible", selection_mode,
+ NULL);
+ gtk_widget_queue_draw (GTK_WIDGET (self));
+}
+
+static void
+gd_main_icon_view_scroll_to_path (GdMainViewGeneric *mv,
+ GtkTreePath *path)
+{
+ gtk_icon_view_scroll_to_path (GTK_ICON_VIEW (mv), path, TRUE, 0.5, 0.5);
+}
+
+static void
+gd_main_icon_view_set_model (GdMainViewGeneric *mv,
+ GtkTreeModel *model)
+{
+ gtk_icon_view_set_model (GTK_ICON_VIEW (mv), model);
+}
+
+static void
+gd_main_view_generic_iface_init (GdMainViewGenericIface *iface)
+{
+ iface->set_model = gd_main_icon_view_set_model;
+ iface->get_path_at_pos = gd_main_icon_view_get_path_at_pos;
+ iface->scroll_to_path = gd_main_icon_view_scroll_to_path;
+ iface->set_selection_mode = gd_main_icon_view_set_selection_mode;
+}
+
+GtkWidget *
+gd_main_icon_view_new (void)
+{
+ return g_object_new (GD_TYPE_MAIN_ICON_VIEW, NULL);
+}
diff --git a/libgd/gd-main-icon-view.h b/libgd/gd-main-icon-view.h
new file mode 100644
index 0000000..7370b2a
--- /dev/null
+++ b/libgd/gd-main-icon-view.h
@@ -0,0 +1,74 @@
+/*
+ * Copyright (c) 2011 Red Hat, Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Author: Cosimo Cecchi <cosimoc redhat com>
+ *
+ */
+
+#ifndef __GD_MAIN_ICON_VIEW_H__
+#define __GD_MAIN_ICON_VIEW_H__
+
+#include <glib-object.h>
+#include <gtk/gtk.h>
+
+G_BEGIN_DECLS
+
+#define GD_TYPE_MAIN_ICON_VIEW gd_main_icon_view_get_type()
+
+#define GD_MAIN_ICON_VIEW(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST ((obj), \
+ GD_TYPE_MAIN_ICON_VIEW, GdMainIconView))
+
+#define GD_MAIN_ICON_VIEW_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST ((klass), \
+ GD_TYPE_MAIN_ICON_VIEW, GdMainIconViewClass))
+
+#define GD_IS_MAIN_ICON_VIEW(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), \
+ GD_TYPE_MAIN_ICON_VIEW))
+
+#define GD_IS_MAIN_ICON_VIEW_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE ((klass), \
+ GD_TYPE_MAIN_ICON_VIEW))
+
+#define GD_MAIN_ICON_VIEW_GET_CLASS(obj) \
+ (G_TYPE_INSTANCE_GET_CLASS ((obj), \
+ GD_TYPE_MAIN_ICON_VIEW, GdMainIconViewClass))
+
+typedef struct _GdMainIconView GdMainIconView;
+typedef struct _GdMainIconViewClass GdMainIconViewClass;
+typedef struct _GdMainIconViewPrivate GdMainIconViewPrivate;
+
+struct _GdMainIconView
+{
+ GtkIconView parent;
+
+ GdMainIconViewPrivate *priv;
+};
+
+struct _GdMainIconViewClass
+{
+ GtkIconViewClass parent_class;
+};
+
+GType gd_main_icon_view_get_type (void) G_GNUC_CONST;
+
+GtkWidget * gd_main_icon_view_new (void);
+
+G_END_DECLS
+
+#endif /* __GD_MAIN_ICON_VIEW_H__ */
diff --git a/libgd/gd-main-view-generic.c b/libgd/gd-main-view-generic.c
new file mode 100644
index 0000000..44d1e0a
--- /dev/null
+++ b/libgd/gd-main-view-generic.c
@@ -0,0 +1,154 @@
+/*
+ * Copyright (c) 2011 Red Hat, Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Author: Cosimo Cecchi <cosimoc redhat com>
+ *
+ */
+
+#include "gd-main-view-generic.h"
+
+typedef GdMainViewGenericIface GdMainViewGenericInterface;
+G_DEFINE_INTERFACE (GdMainViewGeneric, gd_main_view_generic, GTK_TYPE_WIDGET)
+
+static void
+gd_main_view_generic_default_init (GdMainViewGenericInterface *iface)
+{
+ /* nothing */
+}
+
+/**
+ * gd_main_view_generic_set_model:
+ * @self:
+ * @model: (allow-none):
+ *
+ */
+void
+gd_main_view_generic_set_model (GdMainViewGeneric *self,
+ GtkTreeModel *model)
+{
+ GdMainViewGenericInterface *iface;
+
+ iface = GD_MAIN_VIEW_GENERIC_GET_IFACE (self);
+
+ (* iface->set_model) (self, model);
+}
+
+GtkTreePath *
+gd_main_view_generic_get_path_at_pos (GdMainViewGeneric *self,
+ gint x,
+ gint y)
+{
+ GdMainViewGenericInterface *iface;
+
+ iface = GD_MAIN_VIEW_GENERIC_GET_IFACE (self);
+
+ return (* iface->get_path_at_pos) (self, x, y);
+}
+
+void
+gd_main_view_generic_set_selection_mode (GdMainViewGeneric *self,
+ gboolean selection_mode)
+{
+ GdMainViewGenericInterface *iface;
+
+ iface = GD_MAIN_VIEW_GENERIC_GET_IFACE (self);
+
+ (* iface->set_selection_mode) (self, selection_mode);
+}
+
+void
+gd_main_view_generic_scroll_to_path (GdMainViewGeneric *self,
+ GtkTreePath *path)
+{
+ GdMainViewGenericInterface *iface;
+
+ iface = GD_MAIN_VIEW_GENERIC_GET_IFACE (self);
+
+ (* iface->scroll_to_path) (self, path);
+}
+
+static gboolean
+build_selection_uris_foreach (GtkTreeModel *model,
+ GtkTreePath *path,
+ GtkTreeIter *iter,
+ gpointer user_data)
+{
+ GPtrArray *ptr_array = user_data;
+ gchar *uri;
+ gboolean is_selected;
+
+ gtk_tree_model_get (model, iter,
+ GD_MAIN_COLUMN_URI, &uri,
+ GD_MAIN_COLUMN_SELECTED, &is_selected,
+ -1);
+
+ if (is_selected)
+ g_ptr_array_add (ptr_array, uri);
+ else
+ g_free (uri);
+
+ return FALSE;
+}
+
+static gchar **
+model_get_selection_uris (GtkTreeModel *model)
+{
+ GPtrArray *ptr_array = g_ptr_array_new ();
+
+ gtk_tree_model_foreach (model,
+ build_selection_uris_foreach,
+ ptr_array);
+
+ g_ptr_array_add (ptr_array, NULL);
+ return (gchar **) g_ptr_array_free (ptr_array, FALSE);
+}
+
+void
+_gd_main_view_generic_dnd_common (GtkTreeModel *model,
+ gboolean selection_mode,
+ GtkTreePath *path,
+ GtkSelectionData *data)
+{
+ gchar **uris;
+
+ if (selection_mode)
+ {
+ uris = model_get_selection_uris (model);
+ }
+ else
+ {
+ GtkTreeIter iter;
+ gboolean res;
+ gchar *uri = NULL;
+
+ if (path != NULL)
+ {
+ res = gtk_tree_model_get_iter (model, &iter, path);
+ if (res)
+ gtk_tree_model_get (model, &iter,
+ GD_MAIN_COLUMN_URI, &uri,
+ -1);
+ }
+
+ uris = g_new0 (gchar *, 2);
+ uris[0] = uri;
+ uris[1] = NULL;
+ }
+
+ gtk_selection_data_set_uris (data, uris);
+ g_strfreev (uris);
+}
diff --git a/libgd/gd-main-view-generic.h b/libgd/gd-main-view-generic.h
new file mode 100644
index 0000000..0761f04
--- /dev/null
+++ b/libgd/gd-main-view-generic.h
@@ -0,0 +1,104 @@
+/*
+ * Copyright (c) 2011 Red Hat, Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Author: Cosimo Cecchi <cosimoc redhat com>
+ *
+ */
+
+#ifndef __GD_MAIN_VIEW_GENERIC_H__
+#define __GD_MAIN_VIEW_GENERIC_H__
+
+#include <glib-object.h>
+
+#include <gtk/gtk.h>
+
+G_BEGIN_DECLS
+
+typedef enum {
+ GD_MAIN_COLUMN_ID,
+ GD_MAIN_COLUMN_URI,
+ GD_MAIN_COLUMN_TITLE,
+ GD_MAIN_COLUMN_AUTHOR,
+ GD_MAIN_COLUMN_ICON,
+ GD_MAIN_COLUMN_MTIME,
+ GD_MAIN_COLUMN_SELECTED
+} GdMainColumns;
+
+#define GD_TYPE_MAIN_VIEW_GENERIC gd_main_view_generic_get_type()
+
+#define GD_MAIN_VIEW_GENERIC(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST ((obj), \
+ GD_TYPE_MAIN_VIEW_GENERIC, GdMainViewGeneric))
+
+#define GD_MAIN_VIEW_GENERIC_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST ((klass), \
+ GD_TYPE_MAIN_VIEW_GENERIC, GdMainViewGenericIface))
+
+#define GD_IS_MAIN_VIEW_GENERIC(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), \
+ GD_TYPE_MAIN_VIEW_GENERIC))
+
+#define GD_IS_MAIN_VIEW_GENERIC_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE ((klass), \
+ GD_TYPE_MAIN_VIEW_GENERIC))
+
+#define GD_MAIN_VIEW_GENERIC_GET_IFACE(obj) \
+ (G_TYPE_INSTANCE_GET_INTERFACE ((obj), \
+ GD_TYPE_MAIN_VIEW_GENERIC, GdMainViewGenericIface))
+
+typedef struct _GdMainViewGeneric GdMainViewGeneric;
+typedef struct _GdMainViewGenericIface GdMainViewGenericIface;
+
+struct _GdMainViewGenericIface
+{
+ GTypeInterface base_iface;
+
+ /* vtable */
+ void (* set_model) (GdMainViewGeneric *self,
+ GtkTreeModel *model);
+
+ GtkTreePath * (* get_path_at_pos) (GdMainViewGeneric *self,
+ gint x,
+ gint y);
+ void (* scroll_to_path) (GdMainViewGeneric *self,
+ GtkTreePath *path);
+ void (* set_selection_mode) (GdMainViewGeneric *self,
+ gboolean selection_mode);
+};
+
+GType gd_main_view_generic_get_type (void) G_GNUC_CONST;
+
+void gd_main_view_generic_set_model (GdMainViewGeneric *self,
+ GtkTreeModel *model);
+
+void gd_main_view_generic_scroll_to_path (GdMainViewGeneric *self,
+ GtkTreePath *path);
+void gd_main_view_generic_set_selection_mode (GdMainViewGeneric *self,
+ gboolean selection_mode);
+GtkTreePath * gd_main_view_generic_get_path_at_pos (GdMainViewGeneric *self,
+ gint x,
+ gint y);
+
+/* private */
+void _gd_main_view_generic_dnd_common (GtkTreeModel *model,
+ gboolean selection_mode,
+ GtkTreePath *path,
+ GtkSelectionData *data);
+
+G_END_DECLS
+
+#endif /* __GD_MAIN_VIEW_GENERIC_H__ */
diff --git a/libgd/gd-toggle-pixbuf-renderer.c b/libgd/gd-toggle-pixbuf-renderer.c
new file mode 100644
index 0000000..3267938
--- /dev/null
+++ b/libgd/gd-toggle-pixbuf-renderer.c
@@ -0,0 +1,198 @@
+/*
+ * Copyright (c) 2011 Red Hat, Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Author: Cosimo Cecchi <cosimoc redhat com>
+ *
+ */
+
+#include "gd-toggle-pixbuf-renderer.h"
+
+G_DEFINE_TYPE (GdTogglePixbufRenderer, gd_toggle_pixbuf_renderer, GTK_TYPE_CELL_RENDERER_PIXBUF);
+
+enum {
+ PROP_ACTIVE = 1,
+ PROP_TOGGLE_VISIBLE,
+ NUM_PROPERTIES
+};
+
+static GParamSpec *properties[NUM_PROPERTIES] = { NULL, };
+
+struct _GdTogglePixbufRendererPrivate {
+ gboolean active;
+ gboolean toggle_visible;
+};
+
+static void
+gd_toggle_pixbuf_renderer_render (GtkCellRenderer *cell,
+ cairo_t *cr,
+ GtkWidget *widget,
+ const GdkRectangle *background_area,
+ const GdkRectangle *cell_area,
+ GtkCellRendererState flags)
+{
+ gint icon_size = -1;
+ gint check_x, check_y, x_offset, xpad, ypad;
+ GtkStyleContext *context;
+ GdTogglePixbufRenderer *self = GD_TOGGLE_PIXBUF_RENDERER (cell);
+ GtkTextDirection direction;
+
+ GTK_CELL_RENDERER_CLASS (gd_toggle_pixbuf_renderer_parent_class)->render
+ (cell, cr, widget,
+ background_area, cell_area, flags);
+
+ if (!self->priv->toggle_visible)
+ return;
+
+ gtk_cell_renderer_get_padding (cell, &xpad, &ypad);
+ direction = gtk_widget_get_direction (widget);
+ gtk_widget_style_get (widget,
+ "check-icon-size", &icon_size,
+ NULL);
+
+ if (icon_size == -1)
+ icon_size = 40;
+
+ if (direction == GTK_TEXT_DIR_RTL)
+ x_offset = xpad;
+ else
+ x_offset = cell_area->width - icon_size - xpad;
+
+ check_x = cell_area->x + x_offset;
+ check_y = cell_area->y + cell_area->height - icon_size - ypad;
+
+ context = gtk_widget_get_style_context (widget);
+ gtk_style_context_save (context);
+ gtk_style_context_add_class (context, GTK_STYLE_CLASS_CHECK);
+
+ if (self->priv->active)
+ gtk_style_context_set_state (context, GTK_STATE_FLAG_ACTIVE);
+
+ gtk_render_check (context, cr,
+ check_x, check_y,
+ icon_size, icon_size);
+
+ gtk_style_context_restore (context);
+}
+
+static void
+gd_toggle_pixbuf_renderer_get_size (GtkCellRenderer *cell,
+ GtkWidget *widget,
+ const GdkRectangle *cell_area,
+ gint *x_offset,
+ gint *y_offset,
+ gint *width,
+ gint *height)
+{
+ gint icon_size;
+
+ gtk_widget_style_get (widget,
+ "check-icon-size", &icon_size,
+ NULL);
+
+ GTK_CELL_RENDERER_CLASS (gd_toggle_pixbuf_renderer_parent_class)->get_size
+ (cell, widget, cell_area,
+ x_offset, y_offset, width, height);
+
+ *width += icon_size / 4;
+}
+
+static void
+gd_toggle_pixbuf_renderer_get_property (GObject *object,
+ guint property_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ GdTogglePixbufRenderer *self = GD_TOGGLE_PIXBUF_RENDERER (object);
+
+ switch (property_id)
+ {
+ case PROP_ACTIVE:
+ g_value_set_boolean (value, self->priv->active);
+ break;
+ case PROP_TOGGLE_VISIBLE:
+ g_value_set_boolean (value, self->priv->toggle_visible);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+ break;
+ }
+}
+
+static void
+gd_toggle_pixbuf_renderer_set_property (GObject *object,
+ guint property_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ GdTogglePixbufRenderer *self = GD_TOGGLE_PIXBUF_RENDERER (object);
+
+ switch (property_id)
+ {
+ case PROP_ACTIVE:
+ self->priv->active = g_value_get_boolean (value);
+ break;
+ case PROP_TOGGLE_VISIBLE:
+ self->priv->toggle_visible = g_value_get_boolean (value);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+ break;
+ }
+}
+
+static void
+gd_toggle_pixbuf_renderer_class_init (GdTogglePixbufRendererClass *klass)
+{
+ GObjectClass *oclass = G_OBJECT_CLASS (klass);
+ GtkCellRendererClass *crclass = GTK_CELL_RENDERER_CLASS (klass);
+
+ crclass->render = gd_toggle_pixbuf_renderer_render;
+ crclass->get_size = gd_toggle_pixbuf_renderer_get_size;
+ oclass->get_property = gd_toggle_pixbuf_renderer_get_property;
+ oclass->set_property = gd_toggle_pixbuf_renderer_set_property;
+
+ properties[PROP_ACTIVE] =
+ g_param_spec_boolean ("active",
+ "Active",
+ "Whether the cell renderer is active",
+ FALSE,
+ G_PARAM_READWRITE |
+ G_PARAM_STATIC_STRINGS);
+ properties[PROP_TOGGLE_VISIBLE] =
+ g_param_spec_boolean ("toggle-visible",
+ "Toggle visible",
+ "Whether to draw the toggle indicator",
+ FALSE,
+ G_PARAM_READWRITE |
+ G_PARAM_STATIC_STRINGS);
+
+ g_type_class_add_private (klass, sizeof (GdTogglePixbufRendererPrivate));
+ g_object_class_install_properties (oclass, NUM_PROPERTIES, properties);
+}
+
+static void
+gd_toggle_pixbuf_renderer_init (GdTogglePixbufRenderer *self)
+{
+ self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, GD_TYPE_TOGGLE_PIXBUF_RENDERER,
+ GdTogglePixbufRendererPrivate);
+}
+
+GtkCellRenderer *
+gd_toggle_pixbuf_renderer_new (void)
+{
+ return g_object_new (GD_TYPE_TOGGLE_PIXBUF_RENDERER, NULL);
+}
diff --git a/libgd/gd-toggle-pixbuf-renderer.h b/libgd/gd-toggle-pixbuf-renderer.h
new file mode 100644
index 0000000..fe54cf4
--- /dev/null
+++ b/libgd/gd-toggle-pixbuf-renderer.h
@@ -0,0 +1,75 @@
+/*
+ * Copyright (c) 2011 Red Hat, Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Author: Cosimo Cecchi <cosimoc redhat com>
+ *
+ */
+
+#ifndef _GD_TOGGLE_PIXBUF_RENDERER_H
+#define _GD_TOGGLE_PIXBUF_RENDERER_H
+
+#include <glib-object.h>
+
+#include <gtk/gtk.h>
+
+G_BEGIN_DECLS
+
+#define GD_TYPE_TOGGLE_PIXBUF_RENDERER gd_toggle_pixbuf_renderer_get_type()
+
+#define GD_TOGGLE_PIXBUF_RENDERER(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST ((obj), \
+ GD_TYPE_TOGGLE_PIXBUF_RENDERER, GdTogglePixbufRenderer))
+
+#define GD_TOGGLE_PIXBUF_RENDERER_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST ((klass), \
+ GD_TYPE_TOGGLE_PIXBUF_RENDERER, GdTogglePixbufRendererClass))
+
+#define GD_IS_TOGGLE_PIXBUF_RENDERER(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), \
+ GD_TYPE_TOGGLE_PIXBUF_RENDERER))
+
+#define GD_IS_TOGGLE_PIXBUF_RENDERER_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE ((klass), \
+ GD_TYPE_TOGGLE_PIXBUF_RENDERER))
+
+#define GD_TOGGLE_PIXBUF_RENDERER_GET_CLASS(obj) \
+ (G_TYPE_INSTANCE_GET_CLASS ((obj), \
+ GD_TYPE_TOGGLE_PIXBUF_RENDERER, GdTogglePixbufRendererClass))
+
+typedef struct _GdTogglePixbufRenderer GdTogglePixbufRenderer;
+typedef struct _GdTogglePixbufRendererClass GdTogglePixbufRendererClass;
+typedef struct _GdTogglePixbufRendererPrivate GdTogglePixbufRendererPrivate;
+
+struct _GdTogglePixbufRenderer
+{
+ GtkCellRendererPixbuf parent;
+
+ GdTogglePixbufRendererPrivate *priv;
+};
+
+struct _GdTogglePixbufRendererClass
+{
+ GtkCellRendererPixbufClass parent_class;
+};
+
+GType gd_toggle_pixbuf_renderer_get_type (void) G_GNUC_CONST;
+
+GtkCellRenderer *gd_toggle_pixbuf_renderer_new (void);
+
+G_END_DECLS
+
+#endif /* _GD_TOGGLE_PIXBUF_RENDERER_H */
diff --git a/libgd/gd-two-lines-renderer.c b/libgd/gd-two-lines-renderer.c
new file mode 100644
index 0000000..38d2c90
--- /dev/null
+++ b/libgd/gd-two-lines-renderer.c
@@ -0,0 +1,528 @@
+/*
+ * Copyright (c) 2011 Red Hat, Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Author: Cosimo Cecchi <cosimoc redhat com>
+ *
+ */
+
+#include "gd-two-lines-renderer.h"
+#include <string.h>
+
+G_DEFINE_TYPE (GdTwoLinesRenderer, gd_two_lines_renderer, GTK_TYPE_CELL_RENDERER_TEXT)
+
+struct _GdTwoLinesRendererPrivate {
+ gchar *line_two;
+ gint text_lines;
+};
+
+enum {
+ PROP_TEXT_LINES = 1,
+ PROP_LINE_TWO,
+ NUM_PROPERTIES
+};
+
+static GParamSpec *properties[NUM_PROPERTIES] = { NULL, };
+
+static PangoLayout *
+create_layout_with_attrs (GtkWidget *widget,
+ GdTwoLinesRenderer *self,
+ PangoEllipsizeMode ellipsize)
+{
+ PangoLayout *layout;
+ gint wrap_width;
+ PangoWrapMode wrap_mode;
+ PangoAlignment alignment;
+
+ g_object_get (self,
+ "wrap-width", &wrap_width,
+ "wrap-mode", &wrap_mode,
+ "alignment", &alignment,
+ NULL);
+
+ layout = pango_layout_new (gtk_widget_get_pango_context (widget));
+
+ pango_layout_set_ellipsize (layout, ellipsize);
+ pango_layout_set_wrap (layout, wrap_mode);
+ pango_layout_set_alignment (layout, alignment);
+
+ if (wrap_width != -1)
+ pango_layout_set_width (layout, wrap_width * PANGO_SCALE);
+
+ return layout;
+}
+
+static void
+gd_two_lines_renderer_prepare_layouts (GdTwoLinesRenderer *self,
+ GtkWidget *widget,
+ PangoLayout **layout_one,
+ PangoLayout **layout_two)
+{
+ PangoLayout *line_one;
+ PangoLayout *line_two = NULL;
+ gchar *text = NULL;
+
+ g_object_get (self,
+ "text", &text,
+ NULL);
+
+ line_one = create_layout_with_attrs (widget, self, PANGO_ELLIPSIZE_MIDDLE);
+
+ if (self->priv->line_two == NULL ||
+ g_strcmp0 (self->priv->line_two, "") == 0)
+ {
+ pango_layout_set_height (line_one, - (self->priv->text_lines));
+
+ if (text != NULL)
+ pango_layout_set_text (line_one, text, -1);
+ }
+ else
+ {
+ line_two = create_layout_with_attrs (widget, self, PANGO_ELLIPSIZE_END);
+
+ pango_layout_set_height (line_one, - (self->priv->text_lines - 1));
+ pango_layout_set_height (line_two, -1);
+ pango_layout_set_text (line_two, self->priv->line_two, -1);
+
+ if (text != NULL)
+ pango_layout_set_text (line_one, text, -1);
+ }
+
+ if (layout_one)
+ *layout_one = line_one;
+ if (layout_two)
+ *layout_two = line_two;
+
+ g_free (text);
+}
+
+static void
+gd_two_lines_renderer_get_size (GtkCellRenderer *cell,
+ GtkWidget *widget,
+ PangoLayout *layout_1,
+ PangoLayout *layout_2,
+ gint *width,
+ gint *height,
+ const GdkRectangle *cell_area,
+ gint *x_offset_1,
+ gint *x_offset_2,
+ gint *y_offset)
+{
+ GdTwoLinesRenderer *self = GD_TWO_LINES_RENDERER (cell);
+ gint xpad, ypad;
+ PangoLayout *layout_one, *layout_two;
+ GdkRectangle layout_one_rect, layout_two_rect, layout_union;
+
+ if (layout_1 == NULL)
+ {
+ gd_two_lines_renderer_prepare_layouts (self, widget, &layout_one, &layout_two);
+ }
+ else
+ {
+ layout_one = g_object_ref (layout_1);
+
+ if (layout_2 != NULL)
+ layout_two = g_object_ref (layout_2);
+ else
+ layout_two = NULL;
+ }
+
+ gtk_cell_renderer_get_padding (cell, &xpad, &ypad);
+ pango_layout_get_pixel_extents (layout_one, NULL, (PangoRectangle *) &layout_one_rect);
+
+ if (layout_two != NULL)
+ {
+ pango_layout_get_pixel_extents (layout_two, NULL, (PangoRectangle *) &layout_two_rect);
+
+ layout_union.width = MAX(layout_one_rect.width, layout_two_rect.width);
+ layout_union.height = layout_one_rect.height + layout_two_rect.height;
+ }
+ else
+ {
+ layout_union = layout_one_rect;
+ }
+
+ if (cell_area)
+ {
+ gfloat xalign, yalign;
+
+ gtk_cell_renderer_get_alignment (cell, &xalign, &yalign);
+
+ layout_union.width = MIN (layout_union.width, cell_area->width - 2 * xpad);
+ layout_union.height = MIN (layout_union.height, cell_area->height - 2 * ypad);
+
+ if (x_offset_1)
+ {
+ if (gtk_widget_get_direction (widget) == GTK_TEXT_DIR_RTL &&
+ pango_layout_get_alignment (layout_one) != PANGO_ALIGN_CENTER)
+ *x_offset_1 = (1.0 - xalign) * (cell_area->width - (layout_one_rect.width + (2 * xpad)));
+ else
+ *x_offset_1 = xalign * (cell_area->width - (layout_one_rect.width + (2 * xpad)));
+
+ *x_offset_1 = MAX (*x_offset_1, 0);
+ }
+ if (x_offset_2)
+ {
+ if (layout_two != NULL)
+ {
+ if (gtk_widget_get_direction (widget) == GTK_TEXT_DIR_RTL &&
+ pango_layout_get_alignment (layout_two) != PANGO_ALIGN_CENTER)
+ *x_offset_2 = (1.0 - xalign) * (cell_area->width - (layout_two_rect.width + (2 * xpad)));
+ else
+ *x_offset_2 = xalign * (cell_area->width - (layout_two_rect.width + (2 * xpad)));
+
+ *x_offset_2 = MAX (*x_offset_2, 0);
+ }
+ else
+ {
+ *x_offset_2 = 0;
+ }
+ }
+
+ if (y_offset)
+ {
+ *y_offset = yalign * (cell_area->height - (layout_union.height + (2 * ypad)));
+ *y_offset = MAX (*y_offset, 0);
+ }
+ }
+ else
+ {
+ if (x_offset_1) *x_offset_1 = 0;
+ if (x_offset_2) *x_offset_2 = 0;
+ if (y_offset) *y_offset = 0;
+ }
+
+ g_clear_object (&layout_one);
+ g_clear_object (&layout_two);
+
+ if (height)
+ *height = ypad * 2 + layout_union.height;
+
+ if (width)
+ *width = xpad * 2 + layout_union.width;
+}
+
+static void
+gd_two_lines_renderer_render (GtkCellRenderer *cell,
+ cairo_t *cr,
+ GtkWidget *widget,
+ const GdkRectangle *background_area,
+ const GdkRectangle *cell_area,
+ GtkCellRendererState flags)
+{
+ GdTwoLinesRenderer *self = GD_TWO_LINES_RENDERER (cell);
+ GtkStyleContext *context;
+ gint line_one_height;
+ GtkStateFlags state;
+ GdkRectangle render_area = *cell_area;
+ gint xpad, ypad, x_offset_1, x_offset_2, y_offset;
+ PangoLayout *layout_one, *layout_two;
+
+ context = gtk_widget_get_style_context (widget);
+ gd_two_lines_renderer_prepare_layouts (self, widget, &layout_one, &layout_two);
+ gd_two_lines_renderer_get_size (cell, widget,
+ layout_one, layout_two,
+ NULL, NULL,
+ cell_area,
+ &x_offset_1, &x_offset_2, &y_offset);
+
+ gtk_cell_renderer_get_padding (cell, &xpad, &ypad);
+
+ render_area.x += xpad + x_offset_1;
+ render_area.y += ypad;
+
+ pango_layout_set_width (layout_one,
+ (cell_area->width - x_offset_1 - 2 * xpad) * PANGO_SCALE);
+
+ gtk_render_layout (context, cr,
+ render_area.x,
+ render_area.y,
+ layout_one);
+
+ if (layout_two != NULL)
+ {
+ pango_layout_get_pixel_size (layout_one,
+ NULL, &line_one_height);
+
+ gtk_style_context_save (context);
+ gtk_style_context_add_class (context, "dim-label");
+
+ state = gtk_cell_renderer_get_state (cell, widget, flags);
+ gtk_style_context_set_state (context, state);
+
+ render_area.x += - x_offset_1 + x_offset_2;
+ render_area.y += line_one_height;
+ pango_layout_set_width (layout_two,
+ (cell_area->width - x_offset_2 - 2 * xpad) * PANGO_SCALE);
+
+ gtk_render_layout (context, cr,
+ render_area.x,
+ render_area.y,
+ layout_two);
+
+ gtk_style_context_restore (context);
+ }
+
+ g_clear_object (&layout_one);
+ g_clear_object (&layout_two);
+}
+
+static void
+gd_two_lines_renderer_get_preferred_width (GtkCellRenderer *cell,
+ GtkWidget *widget,
+ gint *minimum_size,
+ gint *natural_size)
+{
+ PangoContext *context;
+ PangoFontMetrics *metrics;
+ const PangoFontDescription *font_desc;
+ GtkStyleContext *style_context;
+ gint nat_width, min_width;
+ gint xpad, char_width, wrap_width, text_width;
+ gint width_chars, ellipsize_chars;
+
+ g_object_get (cell,
+ "xpad", &xpad,
+ "width-chars", &width_chars,
+ "wrap-width", &wrap_width,
+ NULL);
+ style_context = gtk_widget_get_style_context (widget);
+ gtk_cell_renderer_get_padding (cell, &xpad, NULL);
+
+ gd_two_lines_renderer_get_size (cell, widget,
+ NULL, NULL,
+ &text_width, NULL,
+ NULL,
+ NULL, NULL, NULL);
+
+ /* Fetch the average size of a charachter */
+ context = gtk_widget_get_pango_context (widget);
+ font_desc = gtk_style_context_get_font (style_context, 0);
+ metrics = pango_context_get_metrics (context, font_desc,
+ pango_context_get_language (context));
+
+ char_width = pango_font_metrics_get_approximate_char_width (metrics);
+
+ pango_font_metrics_unref (metrics);
+
+ /* enforce minimum width for ellipsized labels at ~3 chars */
+ ellipsize_chars = 3;
+
+ /* If no width-chars set, minimum for wrapping text will be the wrap-width */
+ if (wrap_width > -1)
+ min_width = xpad * 2 + MIN (text_width, wrap_width);
+ else
+ min_width = xpad * 2 +
+ MIN (text_width,
+ (PANGO_PIXELS (char_width) * MAX (width_chars, ellipsize_chars)));
+
+ if (width_chars > 0)
+ nat_width = xpad * 2 +
+ MAX ((PANGO_PIXELS (char_width) * width_chars), text_width);
+ else
+ nat_width = xpad * 2 + text_width;
+
+ nat_width = MAX (nat_width, min_width);
+
+ if (minimum_size)
+ *minimum_size = min_width;
+
+ if (natural_size)
+ *natural_size = nat_width;
+}
+
+static void
+gd_two_lines_renderer_get_preferred_height_for_width (GtkCellRenderer *cell,
+ GtkWidget *widget,
+ gint width,
+ gint *minimum_size,
+ gint *natural_size)
+{
+ gint text_height;
+ gint ypad;
+
+ gd_two_lines_renderer_get_size (cell, widget,
+ NULL, NULL,
+ NULL, &text_height,
+ NULL,
+ NULL, NULL, NULL);
+
+ gtk_cell_renderer_get_padding (cell, NULL, &ypad);
+ text_height += 2 * ypad;
+
+ if (minimum_size != NULL)
+ *minimum_size = text_height;
+
+ if (natural_size != NULL)
+ *natural_size = text_height;
+}
+
+static void
+gd_two_lines_renderer_get_preferred_height (GtkCellRenderer *cell,
+ GtkWidget *widget,
+ gint *minimum_size,
+ gint *natural_size)
+{
+ gint min_width;
+
+ gtk_cell_renderer_get_preferred_width (cell, widget, &min_width, NULL);
+ gd_two_lines_renderer_get_preferred_height_for_width (cell, widget, min_width,
+ minimum_size, natural_size);
+}
+
+static void
+gd_two_lines_renderer_get_aligned_area (GtkCellRenderer *cell,
+ GtkWidget *widget,
+ GtkCellRendererState flags,
+ const GdkRectangle *cell_area,
+ GdkRectangle *aligned_area)
+{
+ gint x_offset_1, x_offset_2, y_offset;
+
+ gd_two_lines_renderer_get_size (cell, widget,
+ NULL, NULL,
+ &aligned_area->width, &aligned_area->height,
+ cell_area,
+ &x_offset_1, &x_offset_2, &y_offset);
+
+ aligned_area->x = cell_area->x + MAX (x_offset_1, x_offset_2);
+ aligned_area->y = cell_area->y;
+}
+
+static void
+gd_two_lines_renderer_set_line_two (GdTwoLinesRenderer *self,
+ const gchar *line_two)
+{
+ if (g_strcmp0 (self->priv->line_two, line_two) == 0)
+ return;
+
+ g_free (self->priv->line_two);
+ self->priv->line_two = g_strdup (line_two);
+
+ g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_LINE_TWO]);
+}
+
+static void
+gd_two_lines_renderer_set_text_lines (GdTwoLinesRenderer *self,
+ gint text_lines)
+{
+ if (self->priv->text_lines == text_lines)
+ return;
+
+ self->priv->text_lines = text_lines;
+ g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_TEXT_LINES]);
+}
+
+static void
+gd_two_lines_renderer_set_property (GObject *object,
+ guint property_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ GdTwoLinesRenderer *self = GD_TWO_LINES_RENDERER (object);
+
+ switch (property_id)
+ {
+ case PROP_TEXT_LINES:
+ gd_two_lines_renderer_set_text_lines (self, g_value_get_int (value));
+ break;
+ case PROP_LINE_TWO:
+ gd_two_lines_renderer_set_line_two (self, g_value_get_string (value));
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+ break;
+ }
+}
+
+static void
+gd_two_lines_renderer_get_property (GObject *object,
+ guint property_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ GdTwoLinesRenderer *self = GD_TWO_LINES_RENDERER (object);
+
+ switch (property_id)
+ {
+ case PROP_TEXT_LINES:
+ g_value_set_int (value, self->priv->text_lines);
+ break;
+ case PROP_LINE_TWO:
+ g_value_set_string (value, self->priv->line_two);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+ break;
+ }
+}
+
+static void
+gd_two_lines_renderer_finalize (GObject *object)
+{
+ GdTwoLinesRenderer *self = GD_TWO_LINES_RENDERER (object);
+
+ g_free (self->priv->line_two);
+
+ G_OBJECT_CLASS (gd_two_lines_renderer_parent_class)->finalize (object);
+}
+
+static void
+gd_two_lines_renderer_class_init (GdTwoLinesRendererClass *klass)
+{
+ GtkCellRendererClass *cclass = GTK_CELL_RENDERER_CLASS (klass);
+ GObjectClass *oclass = G_OBJECT_CLASS (klass);
+
+ cclass->render = gd_two_lines_renderer_render;
+ cclass->get_preferred_width = gd_two_lines_renderer_get_preferred_width;
+ cclass->get_preferred_height = gd_two_lines_renderer_get_preferred_height;
+ cclass->get_preferred_height_for_width = gd_two_lines_renderer_get_preferred_height_for_width;
+ cclass->get_aligned_area = gd_two_lines_renderer_get_aligned_area;
+
+ oclass->set_property = gd_two_lines_renderer_set_property;
+ oclass->get_property = gd_two_lines_renderer_get_property;
+ oclass->finalize = gd_two_lines_renderer_finalize;
+
+ properties[PROP_TEXT_LINES] =
+ g_param_spec_int ("text-lines",
+ "Lines of text",
+ "The total number of lines to be displayed",
+ 2, G_MAXINT, 2,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
+
+ properties[PROP_LINE_TWO] =
+ g_param_spec_string ("line-two",
+ "Second line",
+ "Second line",
+ NULL,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
+
+ g_type_class_add_private (klass, sizeof (GdTwoLinesRendererPrivate));
+ g_object_class_install_properties (oclass, NUM_PROPERTIES, properties);
+}
+
+static void
+gd_two_lines_renderer_init (GdTwoLinesRenderer *self)
+{
+ self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, GD_TYPE_TWO_LINES_RENDERER,
+ GdTwoLinesRendererPrivate);
+}
+
+GtkCellRenderer *
+gd_two_lines_renderer_new (void)
+{
+ return g_object_new (GD_TYPE_TWO_LINES_RENDERER, NULL);
+}
diff --git a/libgd/gd-two-lines-renderer.h b/libgd/gd-two-lines-renderer.h
new file mode 100644
index 0000000..23bf70f
--- /dev/null
+++ b/libgd/gd-two-lines-renderer.h
@@ -0,0 +1,75 @@
+/*
+ * Copyright (c) 2011 Red Hat, Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Author: Cosimo Cecchi <cosimoc redhat com>
+ *
+ */
+
+#ifndef _GD_TWO_LINES_RENDERER_H
+#define _GD_TWO_LINES_RENDERER_H
+
+#include <glib-object.h>
+
+#include <gtk/gtk.h>
+
+G_BEGIN_DECLS
+
+#define GD_TYPE_TWO_LINES_RENDERER gd_two_lines_renderer_get_type()
+
+#define GD_TWO_LINES_RENDERER(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST ((obj), \
+ GD_TYPE_TWO_LINES_RENDERER, GdTwoLinesRenderer))
+
+#define GD_TWO_LINES_RENDERER_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST ((klass), \
+ GD_TYPE_TWO_LINES_RENDERER, GdTwoLinesRendererClass))
+
+#define GD_IS_TWO_LINES_RENDERER(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), \
+ GD_TYPE_TWO_LINES_RENDERER))
+
+#define GD_IS_TWO_LINES_RENDERER_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE ((klass), \
+ GD_TYPE_TWO_LINES_RENDERER))
+
+#define GD_TWO_LINES_RENDERER_GET_CLASS(obj) \
+ (G_TYPE_INSTANCE_GET_CLASS ((obj), \
+ GD_TYPE_TWO_LINES_RENDERER, GdTwoLinesRendererClass))
+
+typedef struct _GdTwoLinesRenderer GdTwoLinesRenderer;
+typedef struct _GdTwoLinesRendererClass GdTwoLinesRendererClass;
+typedef struct _GdTwoLinesRendererPrivate GdTwoLinesRendererPrivate;
+
+struct _GdTwoLinesRenderer
+{
+ GtkCellRendererText parent;
+
+ GdTwoLinesRendererPrivate *priv;
+};
+
+struct _GdTwoLinesRendererClass
+{
+ GtkCellRendererTextClass parent_class;
+};
+
+GType gd_two_lines_renderer_get_type (void) G_GNUC_CONST;
+
+GtkCellRenderer *gd_two_lines_renderer_new (void);
+
+G_END_DECLS
+
+#endif /* _GD_TWO_LINES_RENDERER_H */
diff --git a/libgd/gd.h b/libgd/gd.h
index 84e5c36..fcefde4 100644
--- a/libgd/gd.h
+++ b/libgd/gd.h
@@ -30,6 +30,10 @@ G_BEGIN_DECLS
#include <libgd/gd-main-toolbar.h>
#include <libgd/gd-margin-container.h>
#include <libgd/gd-tagged-entry.h>
+#include <libgd/gd-toggle-pixbuf-renderer.h>
+#include <libgd/gd-two-lines-renderer.h>
+#include <libgd/gd-main-view-generic.h>
+#include <libgd/gd-main-icon-view.h>
G_END_DECLS
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]