purebasic.info

PureBasic forum
Текущее время: Чт апр 26, 2018 8:02 pm

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 7 ] 
Автор Сообщение
 Заголовок сообщения: редактируемый ListIcon
СообщениеДобавлено: Пт окт 14, 2016 9:03 pm 
Не в сети
док

Зарегистрирован: Ср янв 15, 2014 2:21 pm
Сообщений: 76
Благодарил (а): 2 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Добрый день всем!

Интегрировал в свою прогу вот этот пример:
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
; Module/File:     LIG_CellSelect&Edit_5.pb
; Function:        Cell edit with doubleclick,  half nativ - Linux gtk2/gtk3 invisible
; Author:          Oma
; Date:            Oct 03, 2014
; Version:         0.3
; Target Compiler: PureBasic 5.22/5.31/5.40
; Target OS:       Linux: (X/K/L)ubuntu, Mint, 32/64, Ascii/Uni
;--------------------------------------------------------------
;better use LIG_CellEditNative_1.pb
;
;todo / Problem
; Editfeld läßt sich nicht als Child des LIG definieren (Fehlermeldung bei gtk_widget_set_parent ())
; Scrollen des LIG noch möglich, bricht jedoch jetzt mit Übernahme ab.
; Sperren des Scrollens noch nicht gefunden
; Funktionen sollten noch in eine Hauptproutine - keine mehrfache Abfragen in Event-Schleife - keine Globalen Variablen mehr nötig
; LIG_Edit_Close(Window, Gadget, Edit, Type) - Case: Events noch ausmisten
;
 
EnableExplicit
 
ImportC ""
        ;gtk_tree_view_convert_tree_to_widget_coords(*tree_view.GtkTreeView, bx.I, by.I, *wx, *wy)
        ;gtk_tree_view_convert_tree_to_bin_window_coords(*tree_view.GtkTreeView, bx.I, by.I, *wx, *wy)
        ;gtk_tree_view_convert_widget_to_bin_window_coords(*tree_view.GtkTreeView, bx.I, by.I, *wx, *wy)
        ;gtk_tree_view_convert_bin_window_to_tree_coords(*tree_view.GtkTreeView, bx.I, by.I, *wx, *wy)
        gtk_tree_view_convert_bin_window_to_widget_coords(*tree_view.GtkTreeView, bx.I, by.I, *wx, *wy)
EndImport
 
Structure LIGCELLDATA
        Path.l;    Zeile
        Column.l;  Spalte
        xFrame.l;  Header-X-Offset
        yFrame.l;  Header-Y-Offset (Höhe)
EndStructure
Global LigCellData.LIGCELLDATA
 
#Win  = 0
#List = 0
#Text = 1
 
Global.i gEvent, gGadget, gEventType, gMenu
Global.i gTvEdit= -1
Global *gAdjustment.GtkAdjustment
 
Declare.b LIG_Edit_Close(Window, Gadget, Edit, Type)
 
;- Functions ...
ProcedureC TV_ScrollEvent(*adjustment.GtkAdjustment, user_data);          callback for scrolling on #List
        If user_data= #List
                LIG_Edit_Close(#Win, #List, gTvEdit, #PB_EventType_LeftClick)
        EndIf
EndProcedure
 
Procedure.b TV_CellEditable(Window, Gadget, Column);                      unblock columns for editing
        Protected.b Unblock= #False
        If Window= #Win
                If Gadget= #List
                        If Column> 1;                                                       editable an column-index > 1
                                Unblock= #True
                        EndIf
                EndIf
        EndIf
        ProcedureReturn Unblock
EndProcedure
 
Procedure LIG_Edit_Start(Window, Gadget, Text.s, *Rect.GdkRectangle)
        UseGadgetList(Window)
        AddKeyboardShortcut(Window, #PB_Shortcut_Return, #PB_Key_Return)
        AddKeyboardShortcut(Window, #PB_Shortcut_Escape, #PB_Key_Escape)
        AddKeyboardShortcut(Window, #PB_Shortcut_Up, #PB_Key_Up)
        AddKeyboardShortcut(Window, #PB_Shortcut_Down, #PB_Key_Down)
        AddKeyboardShortcut(Window, #PB_Shortcut_F2, #PB_Key_F2)
        gTvEdit= StringGadget(#PB_Any, *Rect\x, *Rect\y, *Rect\width, *Rect\height, "")
        SetGadgetText(gTvEdit, Text)
        SetActiveGadget(gTvEdit)
EndProcedure
 
Procedure.b LIG_Edit_Close(Window, Gadget, Edit, Type)
        Protected.b Close= #False, Valid= #True, NextRow= -1
        ;Debug "Type  : " + Str(Type)
        If Edit= -1 : ProcedureReturn : EndIf
        Select Type
                Case #PB_EventType_LostFocus
                        Close= #True
                Case #PB_EventType_LeftClick; clicked
                        Close= #True
                Case #PB_Key_Escape, #PB_Shortcut_Escape
                        Close= #True
                        Valid= #False
                Case #PB_Key_Return, #PB_EventType_ReturnKey
                        Close= #True
                Case #PB_Key_Scroll, #PB_EventType_KeyUp, #PB_EventType_KeyDown, #PB_EventType_Up, #PB_EventType_Down, #PB_Key_Up, #PB_Key_Down
                        Close= #True
                Case #PB_Shortcut_Return, #PB_Shortcut_Up, #PB_Shortcut_Down
                        Close= #True
        EndSelect
        If Close
                If IsGadget(Edit)
                        RemoveKeyboardShortcut(Window, #PB_Shortcut_Return)
                        RemoveKeyboardShortcut(Window, #PB_Shortcut_Escape)
                        RemoveKeyboardShortcut(Window, #PB_Shortcut_Up)
                        RemoveKeyboardShortcut(Window, #PB_Shortcut_Down)
                        If Valid
                                SetGadgetItemText(gadget, LigCellData\Path, GetGadgetText(Edit), LigCellData\Column)
                        EndIf
                        FreeGadget(Edit)
                        gTvEdit= -1
                EndIf
                If Type= #PB_Shortcut_Down Or Type= #PB_Key_Down
                        If LigCellData\Path< CountGadgetItems(Gadget)
                                SetGadgetState(Gadget, LigCellData\Path+ 1)
                        EndIf
                EndIf
        EndIf
EndProcedure
 
Procedure LIG_CellEdit(Window, Gadget)
        Protected.i xOffs, yOffs
        Protected.i ItemIndex= -1, ColumnIndex= -1
        Static *TreePath, *TreeColumn
        Protected *ColumnList.GList, Rect.GdkRectangle
       
        If GadgetType(Gadget)= #PB_GadgetType_Tree Or GadgetType(Gadget)= #PB_GadgetType_ListIcon
                gtk_tree_view_get_cursor_(GadgetID(Gadget), @*TreePath, @*TreeColumn);               Adresse der Pfade von item & column an Cursor (Maus) - Position holen
               
                ItemIndex= PeekL(gtk_tree_path_get_indices_(*TreePath));                             Index von Pfad (item)
               
                *ColumnList = gtk_tree_view_get_columns_(GadgetID(Gadget));                          Adresse der column-Liste
                ColumnIndex = g_list_index_(*ColumnList, *TreeColumn);                               Index von column (Spalte)
               
                If TV_CellEditable(Window, Gadget, ColumnIndex)
                        If ItemIndex> -1 And ColumnIndex> -1
                                gtk_tree_view_get_cell_area_ (GadgetID(Gadget), *TreePath, *TreeColumn, @Rect)
                                gtk_tree_view_convert_bin_window_to_widget_coords(GadgetID(Gadget), 0, 0, @xOffs, @yOffs);   rel. Cell-Y-Position
                                Rect\x + xOffs + GadgetX(Gadget)
                                Rect\y + yOffs + GadgetY(Gadget)
                                LIG_Edit_Start(Window, Gadget, GetGadgetItemText(Gadget, ItemIndex, ColumnIndex), Rect)
                               
                                With LigCellData
                                        \Path  = ItemIndex
                                        \Column= ColumnIndex
                                        \xFrame= xOffs
                                        \yFrame= yOffs
                                EndWith
                        EndIf
                        gtk_tree_path_free_(*TreePath)
                        g_list_free_(*ColumnList)
                EndIf
        EndIf
EndProcedure
 
Procedure CreateWin_Main()
        Protected.i I, J
        Protected.s pText
        If OpenWindow(#Win, 0, 0, 400, 300, "Cell Select & Edit", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
                TextGadget(#Text, 10, 260, 280, 30, "", #PB_Text_Border)
                ListIconGadget(#List, 10, 10, 380, 240, "Col 0", 60)
                For I = 1 To 6
                        AddGadgetColumn(#List, I, "Col " + Str(I), 60)
                Next I
               
                For I = 0 To 25
                        pText = ""
                        For J = 0 To 6
                                pText + Str(I) + "x" + Str(J) + Chr(10)
                        Next J
                        AddGadgetItem(#List, -1, pText)
                Next I
               
                ; / events an hor. scroll arrows, slider or mousewheel ... /
                *gAdjustment= gtk_tree_view_get_hadjustment_(GadgetID(#List))
                g_signal_connect_data_(*gAdjustment, "value-changed", @TV_ScrollEvent(), #List, #Null, #Null)
                ; / events an vert. scroll arrows, slider or mousewheel ... /
                *gAdjustment= gtk_tree_view_get_vadjustment_(GadgetID(#List))
                g_signal_connect_data_(*gAdjustment, "value-changed", @TV_ScrollEvent(), #List, #Null, #Null)
 
        EndIf
EndProcedure
 
; ============================================================
;- Example
; ============================================================
 
CreateWin_Main()
 
Repeat
        gEvent = WaitWindowEvent()
       
        If EventWindow()= #Win
                If gEvent= #PB_Event_Gadget
                        gGadget= EventGadget()
                        If gGadget= #List
                                gEventType= EventType()
                                Select gEventType
                                        Case #PB_EventType_LeftDoubleClick
                                                LIG_CellEdit(#Win, #List)
                                        Case #PB_EventType_LeftClick
                                                LIG_Edit_Close(#Win, #List, gTvEdit, gEventType)
                                EndSelect
                        EndIf
                        If gGadget= gTvEdit;             kommt kaum vor?
                                gEventType= EventType()
                                Select gEventType
                                        Case #PB_EventType_LostFocus
                                                LIG_Edit_Close(#Win, #List, gTvEdit, gEventType)
                                EndSelect
                        EndIf
                EndIf
                If gEvent= #PB_Event_Menu
                        gMenu= EventMenu()
                        Select gMenu
                                Case #PB_Key_Return, #PB_Key_Escape, #PB_Key_Up, #PB_Key_Down
                                        LIG_Edit_Close(#Win, #List, gTvEdit, gMenu)
;                                       Case #PB_Key_F2; not implemented
;                                       LIG_CellEdit(#Win, #List, #Edit)
                        EndSelect
                EndIf
        EndIf
       
Until gEvent= #PB_Event_CloseWindow



есть две проблемы:
1. ошибки в строках 172 и 175 (g_signal_connect_data_(*gAdjustment, "value-changed", @TV_ScrollEvent(), #List, #Null, #Null) я так понял вместо "value-changed" должна быть цифирка или адрес какой-то)
2. никак не могу сообразить, как можно здесь подправить/переделать/дописать чтобы можно было по ячейкам перемещаться с помощью кнопок со стрелками на клаве?


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: редактируемый ListIcon
СообщениеДобавлено: Пт окт 14, 2016 11:26 pm 
Не в сети
профессор

Зарегистрирован: Пт фев 20, 2009 12:57 pm
Сообщений: 1608
Откуда: Алматы
Благодарил (а): 13 раз.
Поблагодарили: 43 раз.
Пункты репутации: 5
боюсь как бы не пришлось тебе изобретать велосипед с этим листиконом... рисовать ячейки и все такое на канвасе и по ним уже прыгать стрелками.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: редактируемый ListIcon
СообщениеДобавлено: Сб окт 15, 2016 2:07 am 
Не в сети
док

Зарегистрирован: Ср янв 15, 2014 2:21 pm
Сообщений: 76
Благодарил (а): 2 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
нашел, как мне кажется, более подходящий для переделки/доделки вариант:
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
EnableExplicit
 
ImportC "-gtk"
        g_object_set(*object.GObject, property_name.p-utf8, *|/1/>data, v= 0)
        g_signal_connect(*instance, detailed_signal.p-ascii, *c_handler, *|/1/>data, destroy= 0, flags= 0) As "g_signal_connect_data"
        gtk_cell_layout_get_cells(*cell_layout)
        g_type_check_instance_is_a(*instance.GTypeInstance, *type.GTypeClass)
EndImport
 
;Object constants
#Win = 0
#LIG = 0
 
Global.i gEvent, gQuit
 
ProcedureC Callback_TV_CellEdited(*Renderer, path.s, NewCellTxt.s, Gadget); callback
  Debug "CellEdited"
  If GetGadgetData(Gadget)>- 1
                SetGadgetItemText(Gadget, Val(path), PeekS(@NewCellTxt, -1, #PB_UTF8), GetGadgetData(Gadget))
        EndIf
EndProcedure
 
ProcedureC Callback_TV_CellEditStart(*Renderer, edit.s, path.s, Gadget);  callback
        Protected *TreePath, *TreeColumn, *ColumnList.GList
        Protected.i Column= -1
  Debug "CellEditStart"
       
        gtk_tree_view_get_cursor_(GadgetID(Gadget), @*TreePath, @*TreeColumn);  pathes of cell just started to edit
        If *TreePath
                *ColumnList= gtk_tree_view_get_columns_(GadgetID(Gadget));            adress of column-List
                Column     = g_list_index_(*ColumnList, *TreeColumn);                 index of edited column
                gtk_tree_path_free_(*TreePath)
                g_list_free_(*ColumnList)
        EndIf
        SetGadgetData(Gadget, Column);                                          Save current edited column in LIG-Data till next editstart
EndProcedure
 
Procedure TV_ColumnEditConnect(Gadget, Column, Editable= #True);          connection for cell-edit, choose immediate editability
        Protected *TreePath  = gtk_tree_view_get_column_(GadgetID(Gadget), Column)
        Protected *|/1/>List.GList= gtk_cell_layout_get_cells(*TreePath)
        Protected *Renderer.GtkCellRenderer
        Protected.i I
  Debug "ColumnEditConnect"
       
        For I= 0 To g_list_length_(*|/1/>List) - 1;                                  search 'text'-renderer
                *Renderer= g_list_nth_data_(*|/1/>List, I)
                If g_type_check_instance_is_a(*Renderer, gtk_cell_renderer_text_get_type_())
                        Break
                EndIf
        Next I
       
        g_list_free_(*|/1/>List)
        SetGadgetData(Gadget, -1)
        g_signal_connect(*Renderer, "editing-started", @Callback_TV_CellEditStart(), Gadget)
        g_signal_connect(*Renderer, "edited", @Callback_TV_CellEdited(), Gadget)
        If Editable : g_object_set(*Renderer, "editable", 1) : EndIf            
EndProcedure
 
Procedure TV_ColumnEditableEnable(Gadget, Column, Editable);              set/unset editability
        Protected *TreePath  = gtk_tree_view_get_column_(GadgetID(Gadget), Column)
        Protected *|/1/>List.GList= gtk_cell_layout_get_cells(*TreePath)
        Protected *Renderer.GtkCellRenderer
        Protected.i I
  Debug "ColumnEditableEnable"
       
        For I= 0 To g_list_length_(*|/1/>List) - 1
                *Renderer= g_list_nth_data_(*|/1/>List, I)
                If g_type_check_instance_is_a(*Renderer, gtk_cell_renderer_text_get_type_())
                        Break
                EndIf
        Next I
       
        g_list_free_(*|/1/>List)
        g_object_set(*Renderer, "editable", Editable);                          #True editable, #False= locked
EndProcedure
 
 
Procedure CreateWin_Main()
        Protected.i I, J
        Protected.s pText
       
        OpenWindow(#Win, 100, 100, 400, 200, "ListIcon cell-editing", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
       
        ListIconGadget(#LIG, 5, 5, 390, 160, "Edit 0", 50, #PB_ListIcon_GridLines)
        For I = 0 To 6
        AddGadgetColumn(#LIG, I, "Edit " + Str(I), 50)
        TV_ColumnEditConnect(#LIG, I);                                    connect and set column editable
        Next I
        For I = 0 To 25
                pText = ""
                For J = 0 To 6
                        pText + Str(I) + "_" + Str(J) + Chr(10)
                Next J
                AddGadgetItem(#LIG, -1, pText)
        Next I
EndProcedure
 
CreateWin_Main()
 
Repeat
        gEvent= WaitWindowEvent()
       
        Select gEvent
                Case #PB_Event_CloseWindow
                        gQuit= #True
        EndSelect
Until gQuit


думаю надо теперь отслеживать нажатия стрелок и вызывать соответствующие колбэки


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: редактируемый ListIcon
СообщениеДобавлено: Сб окт 15, 2016 7:45 am 
Не в сети
док

Зарегистрирован: Ср янв 15, 2014 2:21 pm
Сообщений: 76
Благодарил (а): 2 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
1. в некоторых примерах встречается слово ProcedureC
чем эта функция/процедура отличается от Procedure?
2. допустим, имеется: g_signal_connect(*Renderer, "edited", @Callback_TV_CellEdited(), Gadget)
где можно взять список допустимых значений второго параметра (в данном случае он="edited")


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: редактируемый ListIcon
СообщениеДобавлено: Сб окт 15, 2016 11:47 am 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11108
Благодарил (а): 4 раз.
Поблагодарили: 395 раз.
amer писал(а):
в некоторых примерах встречается слово ProcedureC чем эта функция/процедура отличается от Procedure?
https://www.purebasic.com/documentation ... dures.html
Цитата:
For advanced programmers ProcedureC is available and will declare the procedure using 'CDecl' instead of 'StandardCall' calling convention.
Отличие stdcall от cdecl https://ru.wikipedia.org/wiki/%D1%EE%E3 ... 7%EE%E2%E5

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: редактируемый ListIcon
СообщениеДобавлено: Вс окт 16, 2016 7:46 pm 
Не в сети
док

Зарегистрирован: Ср янв 15, 2014 2:21 pm
Сообщений: 76
Благодарил (а): 2 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
что-то нифига не получается
как можно эмулировать клик мыши на листиконе по адресу: строка, колонка?
подскажите кодом плиз.

вернулся к первому варианту, пытаюсь сделать эмуляцию так:
Код:
1
2
3
4
5
6
7
8
9
Case #PB_Key_Down
        LIG_Edit_Close(frmCabinet, #lst_uzu, gTvEdit, gMenu); закончили с редактированием
        LigCellData\Path+1
        SetGadgetState(#lst_uzu, LigCellData\Path);              перешли на следущую строку
        If LigCellData\Column=1
                gtk_tree_view_set_cursor_(GadgetID(Gadget), LigCellData\Path, LigCellData\Column, 0); тут ошибка второй и третий параметр, что передавать не соображу, ссылки на что?
                LIG_CellEdit(frmCabinet, #lst_uzu)
        EndIf  
 



Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: редактируемый ListIcon
СообщениеДобавлено: Вс окт 16, 2016 11:53 pm 
Не в сети
док

Зарегистрирован: Ср янв 15, 2014 2:21 pm
Сообщений: 76
Благодарил (а): 2 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
справился с проблемой вот таким образом:
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
If gEvent= #PB_Event_Menu
        gMenu= EventMenu()
        Select gMenu
                Case #PB_Key_Return, #PB_Key_Escape
                        LIG_Edit_Close(frmCabinet, #lst_uzu, gTvEdit, gMenu)
                Case #PB_Key_Up, #PB_Key_Down, #PB_Key_Left, #PB_Key_Right
                      Protected Rect.GdkRectangle
                      LIG_Edit_Close(frmCabinet, #lst_uzu, gTvEdit, gMenu)
                      If gMenu=#PB_Key_Down
                          If LigCellData\Path<CountGadgetItems(#lst_uzu): LigCellData\Path+1: EndIf
                      ElseIf gMenu=#PB_Key_Up  
                          If LigCellData\Path>0: LigCellData\Path-1: EndIf
                      ElseIf gMenu=#PB_Key_Left
                          If LigCellData\Column=1: LigCellData\Column-1: EndIf
                      ElseIf gMenu=#PB_Key_Right
                          If LigCellData\Column=0: LigCellData\Column+1: EndIf
                      EndIf
                      SetGadgetState(#lst_uzu, LigCellData\Path)
                      Rect\x=162+(LigCellData\Column*100)
                      Rect\y=188+(LigCellData\Path*23)
                      If LigCellData\Column=1: Rect\width=46: Else: Rect\width=96: EndIf
                      Rect\height=19
                      LIG_Edit_Start(frmCabinet, #lst_uzu, GetGadgetItemText(#lst_uzu, LigCellData\Path, LigCellData\Column), @Rect)
 


нужно только что-то сделать с размерами ячеек, вдруг их поменяют...


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 7 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB