321b7899fc164114bef8dc9cd11513f21b7f7def
2 /*
3 * A simple interface for previewing representations.
4 *
5 * Authors:
6 * Jon A. Cruz
7 *
8 * Copyright (C) 2005 Jon A. Cruz
9 *
10 * Released under GNU GPL, read the file 'COPYING' for more information
11 */
14 #include "previewholder.h"
16 #include <gtkmm/scrolledwindow.h>
19 namespace Inkscape {
20 namespace UI {
23 PreviewHolder::PreviewHolder() :
24 VBox(),
25 PreviewFillable(),
26 _scroller(0),
27 _anchor(Gtk::ANCHOR_CENTER),
28 _baseSize(Gtk::ICON_SIZE_MENU),
29 _view(VIEW_TYPE_LIST)
30 {
31 _scroller = manage(new Gtk::ScrolledWindow());
32 Gtk::Table* stuff = manage(new Gtk::Table( 1, 2 ));
33 stuff->set_col_spacings( 8 );
34 _insides = stuff;
35 _scroller->add(*stuff);
37 pack_start(*_scroller, Gtk::PACK_EXPAND_WIDGET);
38 }
40 PreviewHolder::~PreviewHolder()
41 {
42 }
46 void PreviewHolder::clear()
47 {
48 items.clear();
49 rebuildUI();
50 }
52 void PreviewHolder::addPreview( Previewable* preview )
53 {
54 items.push_back(preview);
56 int i = items.size() - 1;
57 if ( _view == VIEW_TYPE_LIST ) {
58 Gtk::Widget* label = manage(preview->getPreview(PREVIEW_STYLE_BLURB, VIEW_TYPE_LIST, _baseSize));
59 Gtk::Widget* thing = manage(preview->getPreview(PREVIEW_STYLE_PREVIEW, VIEW_TYPE_LIST, _baseSize));
61 _insides->attach( *thing, 0, 1, i, i+1, Gtk::FILL|Gtk::EXPAND, Gtk::FILL|Gtk::EXPAND );
62 _insides->attach( *label, 1, 2, i, i+1, Gtk::FILL|Gtk::EXPAND, Gtk::SHRINK );
63 } else {
64 Gtk::Widget* thing = manage(items[i]->getPreview(PREVIEW_STYLE_PREVIEW, VIEW_TYPE_GRID, _baseSize));
65 int width = _baseSize == Gtk::ICON_SIZE_MENU ? 16 : 8;
66 int col = i % width;
67 int row = i / width;
68 if ( col == 0 ) {
69 // we just started a new row
70 _insides->resize( row + 1, width );
71 }
72 _insides->attach( *thing, col, col+1, row, row+1, Gtk::FILL|Gtk::EXPAND, Gtk::FILL|Gtk::EXPAND );
73 }
75 _scroller->show_all_children();
76 _scroller->queue_draw();
77 }
79 void PreviewHolder::setStyle(Gtk::BuiltinIconSize size, ViewType view)
80 {
81 if ( size != _baseSize || view != _view ) {
82 _baseSize = size;
83 _view = view;
84 rebuildUI();
85 }
86 }
88 void PreviewHolder::setOrientation( Gtk::AnchorType how )
89 {
90 if ( _anchor != how )
91 {
92 switch ( _anchor )
93 {
94 case Gtk::ANCHOR_NORTH:
95 case Gtk::ANCHOR_SOUTH:
96 {
97 dynamic_cast<Gtk::ScrolledWindow*>(_scroller)->set_policy( Gtk::POLICY_AUTOMATIC, Gtk::POLICY_NEVER );
98 }
99 break;
101 case Gtk::ANCHOR_EAST:
102 case Gtk::ANCHOR_WEST:
103 {
104 dynamic_cast<Gtk::ScrolledWindow*>(_scroller)->set_policy( Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC );
105 }
106 break;
108 default:
109 {
110 dynamic_cast<Gtk::ScrolledWindow*>(_scroller)->set_policy( Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC );
111 }
112 }
113 }
114 }
116 void PreviewHolder::rebuildUI()
117 {
118 _scroller->remove();
120 if ( _view == VIEW_TYPE_LIST ) {
121 Gtk::Table* stuff = manage(new Gtk::Table( 1, 2 ));
122 _insides = stuff;
123 stuff->set_col_spacings( 8 );
125 for ( unsigned int i = 0; i < items.size(); i++ ) {
126 Gtk::Widget* label = manage(items[i]->getPreview(PREVIEW_STYLE_BLURB, _view, _baseSize));
127 //label->set_alignment(Gtk::ALIGN_LEFT, Gtk::ALIGN_CENTER);
129 Gtk::Widget* thing = manage(items[i]->getPreview(PREVIEW_STYLE_PREVIEW, _view, _baseSize));
131 stuff->attach( *thing, 0, 1, i, i+1, Gtk::FILL|Gtk::EXPAND, Gtk::FILL|Gtk::EXPAND );
132 stuff->attach( *label, 1, 2, i, i+1, Gtk::FILL|Gtk::EXPAND, Gtk::SHRINK );
133 }
134 _scroller->add(*stuff);
135 } else {
136 int width = _baseSize == Gtk::ICON_SIZE_MENU ? 16 : 8;
137 int height = (items.size() + (width - 1)) / width;
138 if ( height < 1 ) {
139 height = 1;
140 }
142 Gtk::Table* stuff = manage(new Gtk::Table( height, width ));
143 _insides = stuff;
144 int col = 0;
145 int row = 0;
147 for ( unsigned int i = 0; i < items.size(); i++ ) {
148 Gtk::Widget* thing = manage(items[i]->getPreview(PREVIEW_STYLE_PREVIEW, _view, _baseSize));
150 stuff->attach( *thing, col, col+1, row, row+1, Gtk::FILL|Gtk::EXPAND, Gtk::FILL|Gtk::EXPAND );
151 col++;
152 if ( col >= width ) {
153 col = 0;
154 row++;
155 }
156 }
157 _scroller->add(*stuff);
158 }
160 _scroller->show_all_children();
161 _scroller->queue_draw();
162 }
168 } //namespace UI
169 } //namespace Inkscape
172 /*
173 Local Variables:
174 mode:c++
175 c-file-style:"stroustrup"
176 c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
177 indent-tabs-mode:nil
178 fill-column:99
179 End:
180 */
181 // vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=99 :