ede/eiconman/IconProperties.cpp
Sanel Zukan 530a815246 eiconman:
Implemented dialog for icon properties.
EDEBUG, EWARNING, EASSERT replaced with E_DEBUG, E_WARNING, E_ASSERT

ehelp:
Imported ehelp. It is meant for displaying ede help or some of
documented programs in the browser, no matter where help is installed.

Remanining thing is to be added in configure script so it can set correct
paths, when configure be written.

Documented ehelp.
2008-08-07 14:22:05 +00:00

197 lines
5.1 KiB
C++

/*
* $Id$
*
* Eiconman, desktop and icon manager
* Part of Equinox Desktop Environment (EDE).
* Copyright (c) 2008 EDE Authors.
*
* This program is licensed under terms of the
* GNU General Public License version 2 or newer.
* See COPYING for details.
*/
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <time.h>
#include <stdio.h>
#include <FL/Fl.h>
#include <FL/Fl_Tabs.h>
#include <FL/Fl_Group.h>
#include <FL/Fl_Button.h>
#include <FL/Fl_Input.h>
#include <FL/Fl_Output.h>
#include <FL/Fl_Shared_Image.h>
#include <edelib/Nls.h>
#include <edelib/Window.h>
#include <edelib/IconTheme.h>
#include <edelib/MimeType.h>
#include <edelib/IconChooser.h>
#include "IconProperties.h"
#include "DesktopIcon.h"
struct DesktopIconData {
Fl_Image* image;
const char* label;
const char* location;
edelib::String time_access;
edelib::String time_mod;
edelib::String type;
edelib::String size;
};
static void close_cb(Fl_Widget*, void* w) {
Fl_Window* win = (Fl_Window*)w;
win->hide();
}
static void ok_cb(Fl_Widget*, void* w) {
close_cb(0, w);
}
static void icon_change_cb(Fl_Button* b, void* d) {
DesktopIconData* data = (DesktopIconData*)d;
edelib::String ret = edelib::icon_chooser(edelib::ICON_SIZE_HUGE);
if(ret.empty())
return;
Fl_Image* img = Fl_Shared_Image::get(ret.c_str());
if(!img)
return;
b->image(img);
b->redraw();
}
static void study_and_fill(DesktopIcon* dicon, DesktopIconData* data) {
// get image and scale it if needed
if(dicon->image()) {
int iw = dicon->w();
int ih = dicon->h();
if(iw > 64 || ih > 64) {
data->image = dicon->image()->copy((iw > 64) ? 64 : iw,
(ih > 64) ? 64 : ih);
} else {
data->image = dicon->image();
}
}
data->label = dicon->label();
const char* prog_path = dicon->path().c_str();
edelib::MimeType mt;
if(mt.set(prog_path))
data->type = mt.comment();
else
data->type = "(unknown)";
data->location = prog_path;
// now get size, access and modification times
struct stat st;
if(stat(prog_path, &st) == -1) {
data->size = "(unknown)";
data->time_access = "(unknown)";
data->time_mod = "(unknown)";
} else {
char buff[128];
snprintf(buff, sizeof(buff), "%lu Bytes", st.st_size);
data->size = buff;
strftime(buff, sizeof(buff), "%F %H:%S", localtime(&st.st_atime));
data->time_access = buff;
strftime(buff, sizeof(buff), "%F %H:%S", localtime(&st.st_mtime));
data->time_mod = buff;
}
}
void show_icon_properties_dialog(DesktopIcon* dicon) {
// fetch usefull data
DesktopIconData data;
study_and_fill(dicon, &data);
// now construct dialog and fill it
edelib::Window* win = new edelib::Window(315, 395, _("Icon properties"));
win->begin();
Fl_Tabs* tabs = new Fl_Tabs(10, 10, 295, 340);
tabs->begin();
Fl_Group* g1 = new Fl_Group(15, 35, 285, 310, _("General"));
g1->begin();
Fl_Button* icon_button = new Fl_Button(20, 50, 75, 75);
icon_button->image(data.image);
icon_button->callback((Fl_Callback*)icon_change_cb, &data);
icon_button->tooltip(_("Click to change icon"));
Fl_Input* prog_name = new Fl_Input(100, 75, 195, 25);
prog_name->value(data.label);
Fl_Output* prog_mime = new Fl_Output(100, 150, 195, 25, _("Type:"));
prog_mime->box(FL_FLAT_BOX);
prog_mime->color(FL_BACKGROUND_COLOR);
prog_mime->value(data.type.c_str());
Fl_Output* prog_location = new Fl_Output(100, 180, 195, 25, _("Location:"));
prog_location->box(FL_FLAT_BOX);
prog_location->color(FL_BACKGROUND_COLOR);
prog_location->value(data.location);
Fl_Output* prog_size = new Fl_Output(100, 210, 195, 25, _("Size:"));
prog_size->box(FL_FLAT_BOX);
prog_size->color(FL_BACKGROUND_COLOR);
prog_size->value(data.size.c_str());
Fl_Output* prog_date_mod = new Fl_Output(100, 240, 195, 25, _("Modified:"));
prog_date_mod->box(FL_FLAT_BOX);
prog_date_mod->color(FL_BACKGROUND_COLOR);
prog_date_mod->value(data.time_mod.c_str());
Fl_Output* prog_date_acessed = new Fl_Output(100, 270, 195, 25, "Accessed:");
prog_date_acessed->box(FL_FLAT_BOX);
prog_date_acessed->color(FL_BACKGROUND_COLOR);
prog_date_acessed->value(data.time_access.c_str());
g1->end();
Fl_Group* g2 = new Fl_Group(15, 35, 285, 310, _("URL"));
g2->hide();
g2->begin();
Fl_Input* prog_url = new Fl_Input(20, 65, 245, 25, _("URL:"));
prog_url->align(FL_ALIGN_TOP_LEFT);
Fl_Button* prog_browse = new Fl_Button(270, 65, 25, 25);
prog_browse->tooltip(_("Browse location"));
// find icon for browse button
edelib::String ii = edelib::IconTheme::get("document-open", edelib::ICON_SIZE_TINY);
if(ii.empty())
prog_browse->label("...");
else {
Fl_Image* ii_img = Fl_Shared_Image::get(ii.c_str());
if(ii_img)
prog_browse->image(ii_img);
else
prog_browse->label("...");
}
g2->end();
tabs->end();
Fl_Button* ok_button = new Fl_Button(120, 360, 90, 25, _("&OK"));
ok_button->callback(ok_cb, win);
Fl_Button* cancel_button = new Fl_Button(215, 360, 90, 25, _("&Cancel"));
cancel_button->callback(close_cb, win);
win->end();
win->init(edelib::WIN_INIT_ALL);
win->show();
while(win->shown())
Fl::wait();
}