first composite widget - a simple notepad widget - loads (and saves) to a

given filename. done for you. just tell it the file.



SVN revision: 36925
This commit is contained in:
Carsten Haitzler 2008-10-21 12:01:00 +00:00
parent f7e4b7b5c8
commit cfaf33567d
12 changed files with 410 additions and 20 deletions

View File

@ -327,6 +327,8 @@ collections {
signal: "load";
source: "";
script {
set_state(PART:"sb_hbar_clip", "hidden", 0.0);
set_state(PART:"sb_vbar_clip", "hidden", 0.0);
set_int(sbvis_h, 0);
set_int(sbvis_v, 0);
set_int(sbvis_timer, 0);
@ -468,6 +470,15 @@ collections {
aspect_preference: VERTICAL;
rel2.offset: 4 -5;
}
description { state: "icononly" 0.0;
inherit: "default" 0.0;
visible: 1;
align: 0.5 0.5;
aspect: 1.0 1.0;
rel2.offset: -5 -5;
rel2.relative: 1.0 1.0;
aspect_preference: VERTICAL;
}
}
part {
name: "elm.text";
@ -522,14 +533,14 @@ collections {
program {
name: "button_click";
signal: "mouse,down,1";
source: "button_image";
source: "over2";
action: STATE_SET "clicked" 0.0;
target: "button_image";
}
program {
name: "button_unclick";
signal: "mouse,up,1";
source: "button_image";
source: "over2";
action: STATE_SET "default" 0.0;
target: "button_image";
}
@ -542,20 +553,39 @@ collections {
program { name: "text_show";
signal: "elm,state,text,visible";
source: "elm";
action: STATE_SET "visible" 0.0;
target: "elm.text";
script {
new st[31];
new Float:vl;
get_state(PART:"elm.swallow.content", st, 30, vl);
if (!strcmp(st, "icononly"))
set_state(PART:"elm.swallow.content", "visible", 0.0);
set_state(PART:"elm.text", "visible", 0.0);
}
}
program { name: "text_hide";
signal: "elm,state,text,hidden";
source: "elm";
action: STATE_SET "default" 0.0;
target: "elm.text";
script {
new st[31];
new Float:vl;
get_state(PART:"elm.swallow.content", st, 30, vl);
if (!strcmp(st, "visible"))
set_state(PART:"elm.swallow.content", "icononly", 0.0);
set_state(PART:"elm.text", "default", 0.0);
}
}
program { name: "icon_show";
signal: "elm,state,icon,visible";
source: "elm";
action: STATE_SET "visible" 0.0;
target: "elm.swallow.content";
script {
new st[31];
new Float:vl;
get_state(PART:"elm.text", st, 30, vl);
if (!strcmp(st, "visible"))
set_state(PART:"elm.swallow.content", "visible", 0.0);
else
set_state(PART:"elm.swallow.content", "icononly", 0.0);
}
}
program { name: "icon_hide";
signal: "elm,state,icon,hidden";
@ -2881,10 +2911,34 @@ collections {
}
}
///////////////////////////////////////////////////////////////////////////////
group { name: "elm/icon/base/default"; min: 10 10;
images.image: "bt_base1.png" COMP; parts { part { name: "base";
group { name: "elm/icon/home/default"; min: 32 32;
images.image: "icon_home.png" COMP; parts { part { name: "base";
description { state: "default" 0.0; aspect: 1.0 1.0;
image.normal: "bt_base1.png"; } } } }
image.normal: "icon_home.png"; } } } }
group { name: "elm/icon/close/default"; min: 32 32;
images.image: "icon_close.png" COMP; parts { part { name: "base";
description { state: "default" 0.0; aspect: 1.0 1.0;
image.normal: "icon_close.png"; } } } }
group { name: "elm/icon/apps/default"; min: 32 32;
images.image: "icon_apps.png" COMP; parts { part { name: "base";
description { state: "default" 0.0; aspect: 1.0 1.0;
image.normal: "icon_apps.png"; } } } }
group { name: "elm/icon/arrow_up/default"; min: 32 32;
images.image: "icon_arrow_up.png" COMP; parts { part { name: "base";
description { state: "default" 0.0; aspect: 1.0 1.0;
image.normal: "icon_arrow_up.png"; } } } }
group { name: "elm/icon/arrow_down/default"; min: 32 32;
images.image: "icon_arrow_down.png" COMP; parts { part { name: "base";
description { state: "default" 0.0; aspect: 1.0 1.0;
image.normal: "icon_arrow_down.png"; } } } }
group { name: "elm/icon/arrow_left/default"; min: 32 32;
images.image: "icon_arrow_left.png" COMP; parts { part { name: "base";
description { state: "default" 0.0; aspect: 1.0 1.0;
image.normal: "icon_arrow_left.png"; } } } }
group { name: "elm/icon/arrow_right/default"; min: 32 32;
images.image: "icon_arrow_right.png" COMP; parts { part { name: "base";
description { state: "default" 0.0; aspect: 1.0 1.0;
image.normal: "icon_arrow_right.png"; } } } }
///////////////////////////////////////////////////////////////////////////////
group { name: "elm/contact/base/default";

Binary file not shown.

After

Width:  |  Height:  |  Size: 872 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 866 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 893 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 942 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 776 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@ -763,8 +763,6 @@ my_bt_14(void *data, Evas_Object *obj, void *event_info)
elm_box_pack_end(bx, sc);
en = elm_entry_add(win);
// FIXME: HACK! not exposed!
evas_object_propagate_events_set(en, 0);
elm_entry_entry_set(en,
"This is an entry widget in this window that<br>"
"uses markup <b>like this</> for styling and<br>"
@ -828,6 +826,104 @@ my_bt_14(void *data, Evas_Object *obj, void *event_info)
evas_object_show(win);
}
static void
my_notepad_bt_1(void *data, Evas_Object *obj, void *event_info)
{
Evas_Object *en = data;
}
static void
my_notepad_bt_2(void *data, Evas_Object *obj, void *event_info)
{
Evas_Object *en = data;
}
static void
my_notepad_bt_3(void *data, Evas_Object *obj, void *event_info)
{
Evas_Object *en = data;
}
static void
my_bt_15(void *data, Evas_Object *obj, void *event_info)
{
Evas_Object *win, *bg, *bx, *bx2, *bt, *ic, *np;
char buf[PATH_MAX];
win = elm_win_add(NULL, "notepad", ELM_WIN_BASIC);
elm_win_title_set(win, "Notepad");
elm_win_autodel_set(win, 1);
bg = elm_bg_add(win);
elm_win_resize_object_add(win, bg);
evas_object_size_hint_weight_set(bg, 1.0, 1.0);
evas_object_show(bg);
bx = elm_box_add(win);
evas_object_size_hint_weight_set(bx, 1.0, 1.0);
elm_win_resize_object_add(win, bx);
evas_object_show(bx);
np = elm_notepad_add(win);
elm_notepad_file_set(np, "note.txt", ELM_TEXT_FORMAT_MARKUP_UTF8);
evas_object_size_hint_weight_set(np, 1.0, 1.0);
evas_object_size_hint_align_set(np, -1.0, -1.0);
elm_box_pack_end(bx, np);
evas_object_show(np);
bx2 = elm_box_add(win);
elm_box_horizontal_set(bx2, 1);
elm_box_homogenous_set(bx2, 1);
evas_object_size_hint_weight_set(bx2, 1.0, 0.0);
evas_object_size_hint_align_set(bx2, -1.0, -1.0);
bt = elm_button_add(win);
ic = elm_icon_add(win);
elm_icon_standard_set(ic, "arrow_left");
elm_icon_scale_set(ic, 1, 0);
elm_button_icon_set(bt, ic);
evas_object_show(ic);
evas_object_smart_callback_add(bt, "clicked", my_notepad_bt_1, np);
evas_object_size_hint_align_set(bt, -1.0, -1.0);
evas_object_size_hint_weight_set(bt, 1.0, 0.0);
elm_box_pack_end(bx2, bt);
evas_object_show(bt);
bt = elm_button_add(win);
ic = elm_icon_add(win);
elm_icon_standard_set(ic, "close");
elm_icon_scale_set(ic, 1, 0);
elm_button_icon_set(bt, ic);
evas_object_show(ic);
evas_object_smart_callback_add(bt, "clicked", my_notepad_bt_2, np);
evas_object_size_hint_align_set(bt, -1.0, -1.0);
evas_object_size_hint_weight_set(bt, 1.0, 0.0);
elm_box_pack_end(bx2, bt);
evas_object_show(bt);
bt = elm_button_add(win);
ic = elm_icon_add(win);
elm_icon_standard_set(ic, "arrow_right");
elm_icon_scale_set(ic, 1, 0);
elm_button_icon_set(bt, ic);
evas_object_show(ic);
evas_object_smart_callback_add(bt, "clicked", my_notepad_bt_3, np);
evas_object_size_hint_align_set(bt, -1.0, -1.0);
evas_object_size_hint_weight_set(bt, 1.0, 0.0);
elm_box_pack_end(bx2, bt);
evas_object_show(bt);
elm_box_pack_end(bx, bx2);
evas_object_show(bx2);
// FIXME: HACK! not exposed! (should expose some later?)
elm_widget_focus_set(np, 1);
evas_object_resize(win, 320, 300);
evas_object_show(win);
}
static void
my_win_main(void)
{
@ -1018,6 +1114,13 @@ my_win_main(void)
evas_object_size_hint_align_set(bt, -1.0, 0.0);
elm_box_pack_end(bx, bt);
evas_object_show(bt);
bt = elm_button_add(win);
elm_button_label_set(bt, "Notepad");
evas_object_smart_callback_add(bt, "clicked", my_bt_15, NULL);
evas_object_size_hint_align_set(bt, -1.0, 0.0);
elm_box_pack_end(bx, bt);
evas_object_show(bt);
/* set an initial window size */
evas_object_resize(win, 320, 520);

View File

@ -99,6 +99,7 @@ extern "C" {
EAPI Evas_Object *elm_icon_add(Evas_Object *parent);
EAPI void elm_icon_file_set(Evas_Object *obj, const char *file, const char *group);
EAPI void elm_icon_standard_set(Evas_Object *obj, const char *name);
EAPI void elm_icon_smooth_set(Evas_Object *obj, Evas_Bool smooth);
EAPI void elm_icon_no_scale_set(Evas_Object *obj, Evas_Bool no_scale);
EAPI void elm_icon_scale_set(Evas_Object *obj, Evas_Bool scale_up, Evas_Bool scale_down);
@ -198,6 +199,20 @@ extern "C" {
* "cursor,changed" - the cursor changed position
* "anchor,X,clicked,N" - achor called 'X' was clicked with button 'N'
*/
/* composite widgets - these basically put together basic widgets above
* in convenient packages that do more than basic stuff */
typedef enum _Elm_Text_Format
{
ELM_TEXT_FORMAT_PLAIN_UTF8,
ELM_TEXT_FORMAT_MARKUP_UTF8
} Elm_Text_Format;
EAPI Evas_Object *elm_notepad_add(Evas_Object *parent);
EAPI void elm_notepad_file_set(Evas_Object *obj, const char *file, Elm_Text_Format format);
/* smart callbacks called:
*/
// FIXME: fixes to do
// * current sizing tree inefficient
@ -207,12 +222,6 @@ extern "C" {
// * frame needs to be able to use custom frame style
// * button needs to be able to use custom frame style
// * toggle needs to be able to use custom frame style
//
// FIXME: immediate hitlist for widgets:
// ENTRY: 1 or more line text entry
//
// POPSEL: a button that when pressed uses a hover to display a h/v box or
// a table of options surrounding the button with scroll butons at
// the end and the ability to drag and scroll
#endif

View File

@ -36,6 +36,8 @@ elm_entry.c \
elm_contact.c \
elm_contactlist.c \
\
elc_notepad.c \
\
els_pan.c \
els_pan.h \
els_scroller.c \

View File

@ -0,0 +1,222 @@
#include <Elementary.h>
#include "elm_priv.h"
typedef struct _Widget_Data Widget_Data;
struct _Widget_Data
{
Evas_Object *scroller, *entry;
const char *file;
Elm_Text_Format format;
Ecore_Timer *delay_write;
Evas_Bool can_write : 1;
Evas_Bool auto_write : 1;
};
static void _del_hook(Evas_Object *obj);
static void _sizing_eval(Evas_Object *obj);
static void _on_focus_hook(void *data, Evas_Object *obj);
static void _load(Evas_Object *obj);
static void _save(Evas_Object *obj);
static void
_del_hook(Evas_Object *obj)
{
Widget_Data *wd = elm_widget_data_get(obj);
if (wd->file) evas_stringshare_del(wd->file);
if (wd->delay_write)
{
ecore_timer_del(wd->delay_write);
_save(obj);
}
free(wd);
}
static void
_sizing_eval(Evas_Object *obj)
{
Widget_Data *wd = elm_widget_data_get(obj);
Evas_Coord minw = -1, minh = -1, maxw = -1, maxh = -1;
evas_object_size_hint_min_set(obj, minw, minh);
evas_object_size_hint_max_set(obj, maxw, maxh);
}
static void
_on_focus_hook(void *data, Evas_Object *obj)
{
Widget_Data *wd = elm_widget_data_get(obj);
elm_widget_focus_set(wd->entry, 1);
}
static char *
_load_markup_utf8(const char *file)
{
FILE *f;
long size;
char *text = NULL;
f = fopen(file, "r");
if (!f) return NULL;
fseek(f, 0, SEEK_END);
size = ftell(f);
if (size > 0)
{
rewind(f);
text = malloc(size + 1);
if (text)
{
if (fread(text, size, 1, f))
{
text[size] = 0;
}
else
{
free(text);
text = NULL;
}
}
}
fclose(f);
return text;
}
static void
_load(Evas_Object *obj)
{
Widget_Data *wd = elm_widget_data_get(obj);
char *text;
if (!wd->file)
{
elm_entry_entry_set(wd->entry, "");
return;
}
switch (wd->format)
{
case ELM_TEXT_FORMAT_PLAIN_UTF8:
break;
case ELM_TEXT_FORMAT_MARKUP_UTF8:
text = _load_markup_utf8(wd->file);
break;
default:
elm_entry_entry_set(wd->entry, "Unknown Text Format");
break;
}
if (text)
{
elm_entry_entry_set(wd->entry, text);
free(text);
}
else
elm_entry_entry_set(wd->entry, "");
}
static void
_save_markup_utf8(const char *file, const char *text)
{
FILE *f;
if ((!text) || (text[0] == 0))
{
ecore_file_unlink(file);
return;
}
f = fopen(file, "w");
if (!f)
{
// FIXME: report a write error
return;
}
fputs(text, f); // FIXME: catch error
fputs("\n", f); // FIXME: catch error
fclose(f);
}
static void
_save(Evas_Object *obj)
{
Widget_Data *wd = elm_widget_data_get(obj);
if (!wd->file) return;
switch (wd->format)
{
case ELM_TEXT_FORMAT_PLAIN_UTF8:
break;
case ELM_TEXT_FORMAT_MARKUP_UTF8:
_save_markup_utf8(wd->file, elm_entry_entry_get(wd->entry));
break;
default:
break;
}
}
static int
_delay_write(void *data)
{
Widget_Data *wd = elm_widget_data_get(data);
_save(data);
wd->delay_write = NULL;
return 0;
}
static void
_entry_changed(void *data, Evas_Object *obj, void *event_info)
{
Widget_Data *wd = elm_widget_data_get(data);
if (wd->delay_write)
{
ecore_timer_del(wd->delay_write);
wd->delay_write = NULL;
}
if (!wd->auto_write) return;
wd->delay_write = ecore_timer_add(2.0, _delay_write, data);
}
EAPI Evas_Object *
elm_notepad_add(Evas_Object *parent)
{
Evas_Object *obj;
Evas *e;
Widget_Data *wd;
wd = ELM_NEW(Widget_Data);
e = evas_object_evas_get(parent);
obj = elm_widget_add(e);
elm_widget_on_focus_hook_set(obj, _on_focus_hook, NULL);
elm_widget_data_set(obj, wd);
elm_widget_del_hook_set(obj, _del_hook);
elm_widget_can_focus_set(obj, 0);
wd->scroller = elm_scroller_add(parent);
elm_widget_resize_object_set(obj, wd->scroller);
wd->entry = elm_entry_add(parent);
evas_object_size_hint_weight_set(wd->entry, 1.0, 0.0);
evas_object_size_hint_align_set(wd->entry, -1.0, -1.0);
elm_scroller_content_set(wd->scroller, wd->entry);
evas_object_show(wd->entry);
elm_entry_entry_set(wd->entry, "");
evas_object_smart_callback_add(wd->entry, "changed", _entry_changed, obj);
wd->auto_write = 1;
_sizing_eval(obj);
return obj;
}
EAPI void
elm_notepad_file_set(Evas_Object *obj, const char *file, Elm_Text_Format format)
{
Widget_Data *wd = elm_widget_data_get(obj);
if (wd->delay_write)
{
ecore_timer_del(wd->delay_write);
wd->delay_write = NULL;
}
_save(obj);
if (wd->file) evas_stringshare_del(wd->file);
wd->file = NULL;
if (file) wd->file = evas_stringshare_add(file);
wd->format = format;
_load(obj);
}