Subversion Repositories Filer-Free

Rev

Rev 29 | Rev 31 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 29 Rev 30
Line 116... Line 116...
116
                for (int yc=ycmin;yc<ycmax;++yc)
116
                for (int yc=ycmin;yc<ycmax;++yc)
117
                {
117
                {
118
                        for (int xc=xcmin;xc<xcmax;++xc)
118
                        for (int xc=xcmin;xc<xcmax;++xc)
119
                        {
119
                        {
120
                                // Determine whether cell is occupied.
120
                                // Determine whether cell is occupied.
121
                                int i=xc+yc*_xccount;
121
                                unsigned int i=xc+yc*_xccount;
122
                                if (i<static_cast<int>(_directory.size()))
122
                                if (i<_directory.size())
123
                                {
123
                                {
124
                                        // Redraw cell.
124
                                        // Redraw cell.
125
                                        os_box box;
125
                                        os_box box;
126
                                        box.x0=xc*(_xcsize+xgap)+xgap;
126
                                        box.x0=xc*(_xcsize+xgap)+xgap;
127
                                        box.y0=-yc*(_ycsize+ygap)-_ycsize-ygap;
127
                                        box.y0=-yc*(_ycsize+ygap)-_ycsize-ygap;
Line 160... Line 160...
160
        }
160
        }
161
 
161
 
162
        delete this;
162
        delete this;
163
}
163
}
164
 
164
 
-
 
165
void filer_window::handle_mouse_click(wimp_pointer& block)
-
 
166
{
-
 
167
        // Fetch layout.
-
 
168
        layout_method& layout=options().layout();
-
 
169
 
-
 
170
        // Find cell under pointer.
-
 
171
        unsigned int index=find_cell(block.pos);
-
 
172
 
-
 
173
        if (block.buttons&(wimp_SINGLE_SELECT|wimp_SINGLE_ADJUST))
-
 
174
        {
-
 
175
                // If single select click then first de-select everything.
-
 
176
                if (block.buttons&wimp_SINGLE_SELECT) select_all(0);
-
 
177
 
-
 
178
                // If click within a cell then select that cell.
-
 
179
                if (index!=directory::npos)
-
 
180
                {
-
 
181
                        _directory[index].selected(!_directory[index].selected());
-
 
182
                        force_redraw_cell(index);
-
 
183
                }
-
 
184
        }
-
 
185
}
-
 
186
 
165
void filer_window::reload()
187
void filer_window::reload()
166
{
188
{
167
        static int buffer[256];
189
        static int buffer[256];
168
        _directory.load(_pathname,buffer,sizeof(buffer));
190
        _directory.load(_pathname,buffer,sizeof(buffer));
169
}
191
}
Line 226... Line 248...
226
        extent.x1=extent_xsize;
248
        extent.x1=extent_xsize;
227
        extent.y1=0;
249
        extent.y1=0;
228
        set_extent(extent);
250
        set_extent(extent);
229
}
251
}
230
 
252
 
-
 
253
unsigned int filer_window::find_cell(const os_coord& p)
-
 
254
{
-
 
255
        layout_method& layout=options().layout();
-
 
256
        int xgap=layout.xgap();
-
 
257
        int ygap=layout.ygap();
-
 
258
 
-
 
259
        wimp_window_state state;
-
 
260
        get_window_state(state);
-
 
261
        int x=p.x-state.visible.x0+state.xscroll-xgap;
-
 
262
        int y=p.y-state.visible.y1+state.yscroll+ygap;
-
 
263
 
-
 
264
        int xc=x/(_xcsize+xgap);
-
 
265
        int yc=(-y)/(_ycsize+ygap);
-
 
266
        unsigned int index=xc+yc*_xccount;
-
 
267
 
-
 
268
        x-=xc*(_xcsize+xgap);
-
 
269
        y+=yc*(_ycsize+ygap);
-
 
270
 
-
 
271
        int found=(x>=0)&&(y>=-_ycsize)&&(x<_xcsize)&&(y<0)&&
-
 
272
                (xc>=0)&&(yc>=0)&&(xc<_xccount)&&(yc<_yccount)&&
-
 
273
                (index<_directory.size());
-
 
274
 
-
 
275
        return (found)?index:directory::npos;
-
 
276
}
-
 
277
 
-
 
278
void filer_window::force_redraw_cell(unsigned int index)
-
 
279
{
-
 
280
        layout_method& layout=options().layout();
-
 
281
        int xgap=layout.xgap();
-
 
282
        int ygap=layout.ygap();
-
 
283
 
-
 
284
        int xc=index%_xccount;
-
 
285
        int yc=index/_xccount;
-
 
286
 
-
 
287
        os_box box;
-
 
288
        box.x0=xgap+xc*(_xcsize+xgap);
-
 
289
        box.y0=-(yc+1)*(_ycsize+ygap);
-
 
290
        box.x1=box.x0+_xcsize;
-
 
291
        box.y1=box.y0+_ycsize;
-
 
292
        force_redraw(box);
-
 
293
}
-
 
294
 
-
 
295
void filer_window::select_all(int selected)
-
 
296
{
-
 
297
        layout_method& layout=options().layout();
-
 
298
        int xgap=layout.xgap();
-
 
299
        int ygap=layout.ygap();
-
 
300
 
-
 
301
        int xc_min=_xccount;
-
 
302
        int yc_min=_yccount;
-
 
303
        int xc_max=0;
-
 
304
        int yc_max=0;
-
 
305
 
-
 
306
        for (unsigned int i=0;i!=_directory.size();++i)
-
 
307
        {
-
 
308
                if (_directory[i].selected()!=selected)
-
 
309
                {
-
 
310
                        _directory[i].selected(selected);
-
 
311
 
-
 
312
                        int xc=i%_xccount;
-
 
313
                        int yc=i/_xccount;
-
 
314
                        if (xc<xc_min) xc_min=xc;
-
 
315
                        if (yc<yc_min) yc_min=yc;
-
 
316
                        if (xc+1>xc_max) xc_max=xc+1;
-
 
317
                        if (yc+1>yc_max) yc_max=yc+1;
-
 
318
                }
-
 
319
        }
-
 
320
 
-
 
321
        if ((xc_max>xc_min)&&(yc_max>yc_min))
-
 
322
        {
-
 
323
                os_box box;
-
 
324
                box.x0=xgap+xc_min*(_xcsize+xgap);
-
 
325
                box.y0=-yc_max*(_ycsize+ygap);
-
 
326
                box.x1=xc_max*(_xcsize+xgap);
-
 
327
                box.y1=-ygap-yc_min*(_ycsize+ygap);
-
 
328
                force_redraw(box);
-
 
329
        }
-
 
330
}
-
 
331
 
231
void filer_window::open_parent(const os_coord& offset) const
332
void filer_window::open_parent(const os_coord& offset) const
232
{
333
{
233
        // Determine whether there is a parent directory.
334
        // Determine whether there is a parent directory.
234
        char* lastdot=strrchr(_pathname,'.');
335
        char* lastdot=strrchr(_pathname,'.');
235
        if (lastdot&&strcmp(lastdot+1,"$"))
336
        if (lastdot&&strcmp(lastdot+1,"$"))