kategoria: ANSI C
[#1] Scroller, jak zapisać/odczytać wartość?
Witam
Próbuję odczytać/zapisać wartość scrollera, ale albo nic się nie dzieje, albo mam error.
Pod amigaos nigdy nie programowałem. Oto co udało mi się sklecić:


#include <stdio.h>
#include <string.h>

#include <proto/intuition.h>
/* Gadtools is needed for GetIMsg and ReplyIMsg */ 
#include <proto/gadtools.h>
/* Exec is needed for Wait function */
#include <proto/exec.h>
#include <proto/dos.h>
#include <intuition/intuition.h>
#include <dos/dostags.h>

struct Window *myWindow;
struct Gadget *myGadgets[5], *glist=NULL, *gad1;

APTR visual;

struct TextAttr topaz8 = {(STRPTR)"topaz.font", 8, 0, 1};

/* Data for gadget structures */
struct NewGadget Gadgetdata[] = {
	{25, 40, 60, 16, (UBYTE *)"1", &topaz8, 1, PLACETEXT_IN, NULL, NULL},
	{95, 40, 60, 16, (UBYTE *)"2", &topaz8, 2, PLACETEXT_IN, NULL, NULL},
	{165, 40, 60, 16, (UBYTE *)"3", &topaz8, 3, PLACETEXT_IN, NULL, NULL},
	{235, 40, 60, 16, (UBYTE *)"4", &topaz8, 4, PLACETEXT_IN, NULL, NULL},
	{25, 18, 270, 16, (UBYTE *)" ", &topaz8, 5, PLACETEXT_IN, NULL, NULL}
};

int main(int argc, char *argv[]){
	struct Screen *pubScreen;
	int i;
	struct IntuiMessage *msg;
	ULONG msgClass;

	/* Lock screen and get visual info for gadtools */
	if(!(pubScreen = LockPubScreen(NULL))){
		printf("Failed to lock screen.\n");
		return(5);
	}
	if(!(visual = GetVisualInfo(pubScreen, TAG_END))){
		printf("Failed to get visual info.\n");
		return(5);
	}

	/* Create the gadget list */
	if(!(gad1 = CreateContext(&glist))){
		printf("Failed to create gadtools context.\n");
		return(5);
	}

	/* Create gadgets specify gadget kind, a Gadget, NewGadget data and extra tag info */
	for(i=0; i<5; i++) Gadgetdata[i].ng_VisualInfo = visual;
	myGadgets[0] = gad1 = CreateGadget(BUTTON_KIND, gad1, &Gadgetdata[0], TAG_END);
	myGadgets[1] = gad1 = CreateGadget(BUTTON_KIND, gad1, &Gadgetdata[1], TAG_END);
	myGadgets[2] = gad1 = CreateGadget(BUTTON_KIND, gad1, &Gadgetdata[2], TAG_END);
	myGadgets[3] = gad1 = CreateGadget(BUTTON_KIND, gad1, &Gadgetdata[3], TAG_END);
	myGadgets[4] = gad1 = CreateGadget(SCROLLER_KIND, gad1, &Gadgetdata[4], GTSC_Total, 255, GTSC_Top, 0, GA_RelVerify, 1, TAG_END);

	myWindow = OpenWindowTags(NULL,
		WA_Title, argv[1],
		WA_Gadgets, glist,
		WA_Left, 20, WA_Top, 20,
		WA_Width, 320, WA_Height, 64,
		WA_IDCMP, IDCMP_CLOSEWINDOW | IDCMP_GADGETUP,
		WA_Flags, WFLG_DRAGBAR | WFLG_DEPTHGADGET | WFLG_CLOSEGADGET | WFLG_ACTIVATE,
		WA_PubScreen, pubScreen,
		TAG_END);

	GT_RefreshWindow(myWindow, NULL); /* Update window */


	//=====================================================


	while(1){						/* Run program until window is closed */
		Wait(1L << myWindow->UserPort->mp_SigBit);	/* Wait for an event! */
		msg = GT_GetIMsg(myWindow->UserPort);		/* Get message data */
		msgClass = msg->Class;				/* What has been clicked? */
		GT_ReplyIMsg(msg);				/* Close message */
		if(msgClass == IDCMP_CLOSEWINDOW){		/* Check here if Close Window selected */
			break;
		}
		if(msgClass == GADGETUP){
			struct Gadget *gadAddr;
			UWORD gadgetid;

			gadAddr = (struct Gadget *)msg->IAddress;
			gadgetid = gadAddr->GadgetID;

			if(gadgetid==1 || gadgetid==2 || gadgetid==3 || gadgetid==4){
				printf("gadgetid=%i\n", gadgetid);

				ULONG position = 30;
				SetGadgetAttrs(myGadgets[4], myWindow, NULL, GTSC_Top, position, TAG_END);
			}
			if(gadgetid==5){
				ULONG position = 30;
				//GetAttrs(myGadgets[4], GTSC_Top, &position, TAG_END);
				//GetGadgetAttrs(myGadgets[4], myWindow, NULL, GTSC_Top, &position, TAG_END);
				GetAttr(GTSC_Top, myGadgets[4], &position);
				printf("position=%i\n", position);
			}
		}
	}

	CloseWindow(myWindow);			/* Close window */
	UnlockPubScreen(NULL, pubScreen);

	return 0;
}
[#2] Re: Scroller, jak zapisać/odczytać wartość?

@piotr_go, post #1

Należy użyć funkcji biblioteki gadtools: GT_GetGadgetAttrsA() lub GT_GetGadgetAttrs, a nie intuition!
[#3] Re: Scroller, jak zapisać/odczytać wartość?

@Hexmage960, post #2

DZIĘKI !
Działa, parę godzin nad tym kląłem a wystarczyło dodać "GT_" :)

Jeszcze jedno zapytam.
Jak najprościej zrobić przewijaną listę tekstową.
Lista wczytywana z pliku, powiedzmy kilkaset (w najgorszym przypadku) elementów, 8 wyświetlanych.
[#4] Re: Scroller, jak zapisać/odczytać wartość?

@piotr_go, post #3

Najprościej to użyć gadtools i typu ListView (LISTVIEW_KIND).

Albo (trudniejsze) zrobić własną klasę BOOPSI. To w przypadku gdy ListView Ci nie wystarczy.
[#5] Re: Scroller, jak zapisać/odczytać wartość?

@Hexmage960, post #4

Ok, dzięki, posiedzę nad tym i zobaczę co wymyślę.
[#6] Re: Scroller, jak zapisać/odczytać wartość?

@piotr_go, post #1

Jako zatwardzialy gadtoolsowiec moge sie przyczepic tylko do jednej rzeczy. Sposobu w jaki odbierasz komunikaty od gadzetow. Nie musiz kozystac z GT_GetGadgetAttr() zeby odczytac ich stan.

W Twoim przypadku moze to wygladac nastepujaco:

#define GAD_SCROLLER_ID 10
// wartosc tej stalej wpisujesz w definicji gadzetu
// np: {25, 18, 270, 16, (UBYTE *)" ", &topaz8, GAD_SCROLLER_ID, PLACETEXT_IN, NULL, NULL}
......
switch(msg->Class)
{
    case IDCMP_CLOSEWINDOW:
           QUIT = TRUE; // to zmienna ktora mowi czy chcesz wyjsc z petli glownej odczytu zdarzen
           break;

    case IDCMP_MOUSEMOVE:
           switch(((struct Gadget *) msg->IAddress)->GadgetID)
           {
                    case GAD_SCROLLER_ID:
                    printf("pozycja skrolera %d\n", msg->Code);
                    break;
           }
}


Musisz jeszcze dodac w tagach IDCMP zdefiniowanego okna stala SCROLLERIDCMP


Ostatnia aktualizacja: 18.11.2017 00:35:27 przez Phibrizzo
[#7] Re: Scroller, jak zapisać/odczytać wartość?

@Phibrizzo, post #6

Tak, to dobra praktyka - szczególnie pola GadgetID ustawiaj na stałe symboliczne, a nie liczby. Jak będziesz miał więcej gadżetów w okienku okaże się to zbawienne.

Co do GT_GetGadgetAttrsA() to się często przydaje - nie wszystko dostajesz w polu Code. Ale tu rzeczywiście też tak można zrobić.

Ostatnia aktualizacja: 18.11.2017 03:54:38 przez Hexmage960
[#8] Re: Scroller, jak zapisać/odczytać wartość?

@Phibrizzo, post #6

@Phibrizzo
Niestety ten kod reaguje na wciśnięcie klawisza, ja potrzebuję reakcji na puszczenie, tak że GT_GetGadgetAttrs na razie zostaje.

Zrobiłem LISTVIEW_KIND ale mam z nią problem.
Wyświetla się OK, można ją przewijać paskiem, ale nie strzałkami, nic nie mogę zaznaczyć.
GT_GetGadgetAttrs(myGadgets[5], myWindow, NULL, GTLV_Selected, &position, TAG_END);

zwraca 0xFFFF

GT_SetGadgetAttrs(myGadgets[5], myWindow, NULL, GTLV_Selected, number, TAG_END);

Też nic nie robi.


myGadgets[5] = gad1 = CreateGadget(LISTVIEW_KIND, gad1, &Gadgetdata[5], GA_Disabled, 0, GTLV_Top, 2, GTLV_MakeVisible, 4, GTLV_Labels, (ULONG)&file_list, GTLV_Selected, 1, TAG_END);

Kombinowałem różne wartości, widoczne ma być 7 elementów z dłuższej listy.
[#9] Re: Scroller, jak zapisać/odczytać wartość?

@piotr_go, post #8

OK, jestem coraz bliżej.
Strzałki działają. Element na liście się zaznacza jak przytrzymam LMB, jak puszczę to się odznacza :(
[#10] Re: Scroller, jak zapisać/odczytać wartość?

@piotr_go, post #9

Zrobione :)

[#11] Re: Scroller, jak zapisać/odczytać wartość?

@piotr_go, post #10

Z tego co pamiętam gadżety gadżety gadtools muszą mieć pozycję określoną względem widzialnej części okienka. Absolutne wartości nie uwzględniają grubości ramek i wysokości górnej belki.
Efekt jest taki, że na inaczej skonfigurowanym systemie wszystko się rozjeżdża. Warto też użyć czcionki ekranowej i sprawdzić czy napisy zmieszczą się w przyciskach.
[#12] Re: Scroller, jak zapisać/odczytać wartość?

@piotr_go, post #10

A co tam za dekoder szykujesz?? ;) Rozumie że ponad dekodowanie mp3 nie oferuje nic więcej?

Edit: Bardziej intuicyjne przełączenie pomiędzy dwoma kawałkami jest dwuklikiem, czyli:

1) Pierwszy LMB - pozycja zaznacz
2) Drugi LMB - pozycja odpal

Napisz coś więcej o HW i powodzenia z projektem! OK

Ostatnia aktualizacja: 19.11.2017 00:00:39 przez Lokaty
[#13] Re: Scroller, jak zapisać/odczytać wartość?

@Lokaty, post #12

Coś więcej dekoduje.
Poczytaj opis do filmu na YT
Jest też link do zdjęcia urządzenia



Ostatnia aktualizacja: 19.11.2017 00:07:03 przez Norbert
[#14] Re: Scroller, jak zapisać/odczytać wartość?

@Lokaty, post #12

FOTO
Dekodowanie MP3, AAC, OGG, MIDI, WMA, FLAC, WAV, bufor 128KB.
Można by próbować nagrywać do OGG (wejście jest) o ile Amiga się wyrobi z odbiorem.

Ostatnia aktualizacja: 19.11.2017 00:07:22 przez piotr_go
[#15] Re: Scroller, jak zapisać/odczytać wartość?

@piotr_go, post #14

Gratuluję kolejnego udanego projektu- brawo OK
[#16] Re: Scroller, jak zapisać/odczytać wartość?

@piotr_go, post #14

Ja mam prisme ale bo chciałem na Zorro ale do A1200 tez by siadło coś takiego na port zegara, brawo wyglada i działa świetnie :)
[#17] Re: Scroller, jak zapisać/odczytać wartość?

@QUAD, post #16

Jest driver do AHI?
[#18] Re: Scroller, jak zapisać/odczytać wartość?

@QUAD, post #16

Dzięki.

Jest driver do AHI?

Były 2, jeden do amig w czarnej, drugi w standardowej obudowie.
Napisane w czasie snu. Niestety jak się obudziłem to zniknęły. :(
Jak już pisałem, pod amigaos nie programowałem więc raczej jakiegokolwiek drivera szybko nie napiszę.
Pewnie w międzyczasie powstanie 10 innych projektów :)
Na stronie www.PPA.pl, podobnie jak na wielu innych stronach internetowych, wykorzystywane są tzw. cookies (ciasteczka). Służą ona m.in. do tego, aby zalogować się na swoje konto, czy brać udział w ankietach. Ze względu na nowe regulacje prawne jesteśmy zobowiązani do poinformowania Cię o tym w wyraźniejszy niż dotychczas sposób. Dalsze korzystanie z naszej strony bez zmiany ustawień przeglądarki internetowej będzie oznaczać, że zgadzasz się na ich wykorzystywanie.
OK, rozumiem